ClickAndDrag

From Second Life Wiki
Revision as of 19:48, 20 September 2008 by Nexii Malthus (talk | contribs) (Awesome new script :o)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Setup: Rez prim (A), apply script, Rez another prim (B) and put it slightly below it, link it up so B is a child and A is the root.

This is exactly the same code on my aRTS project that the landscape uses for handling interface touches, such as clicking on a point or dragging a rectangle which the HUD can in return use for sending out commands to units and/or unit selection.

This is quite a cool and unique script which can be used to draw rectangles dynamically dragged by a user on an interface. For example one could use this on a sculpted miniature simulator map and designate an area for some specific purpose. This gives dynamic feedback invaluable to such interfaces.

<lsl> // ClickAndDrag made by Nexii Malthus // If you use this work in anyway please give credit :P // Available under the Creative Commons Attribution-ShareAlike 2.5 license // http://creativecommons.org/licenses/by-sa/3.0/

// Protocol:

   //    Types   Data
   //      Click,  Player Key | Type | World Coords | Normal | Bi-Normal
   //      Drag,   Player Key | Type | WC-A | N-A | BN-A | WC-B | N-B | BN-B

// Type - 0 = Click, 1 = Drag

integer ch = 1; // Channel to send commands on

key kTextureClick = "5d431ade-24f3-2390-f1ba-ca404cad2864"; key kTextureDrag = "efc411bc-2005-10ff-da0c-3dda972f6e70";

list tData1; list tData2; vector ST1;

default{

   state_entry(){
       llMinEventDelay( 0.21 );
   }
   
   touch_start( integer d ){
       if( llDetectedTouchFace( 0 ) == -1 ) return;
       tData1 = [ llDetectedTouchPos(0), llDetectedTouchNormal(0), llDetectedTouchBinormal(0) ];
       ST1 = llDetectedTouchST( 0 );
   }
   
   touch( integer dn ){
       vector ST2 = llDetectedTouchST( 0 );
       
       if( ST1 == <-1,-1,0> || ST2 == <-1,-1,0> ) return;
       
       if( llVecDist( ST1, ST2 ) > 0.01 ){
           llSetColor( < 0.0, 0.0, 1.0 >, 0 ); llSetAlpha( 0.2, 0 );
           float relSize = 0.08;//0.084;
           vector selCentre = <1,1,0> - ((ST2+ST1)/2);
           vector selSize = (ST1-ST2); selSize = <llFabs(selSize.x),llFabs(selSize.y),0>;
           
           vector Scale = <relSize/selSize.x,relSize/selSize.y,0>;//selSize;//< selSize.x/relSize.x, selSize.y/relSize.y, 0>;
           vector Offset = (selCentre-<0.5,0.5,0>);Offset = <Offset.x*Scale.x,Offset.y*Scale.y,0>;
           llSetPrimitiveParams([ PRIM_TEXTURE, 0, kTextureDrag, Scale, Offset, 0 ]);
       }
   }
   
   touch_end( integer d ){
       key nKey = llDetectedKey( 0 );
       vector tPos = llDetectedTouchPos( 0 );
       tData2 = [ tPos, llDetectedTouchNormal( 0 ), llDetectedTouchBinormal( 0 ) ];
       vector ST2 = llDetectedTouchST( 0 );
       
       if( ST1 == <-1,-1,0> || ST2 == <-1,-1,0> ){
           if( llVecDist( ST1, ST2 ) > 0.01 )
               llSetAlpha( 0.0, 0 );
           return;
       }
       
       if( llVecDist( ST1, ST2 ) < 0.01 ){
           llSetColor( < 0.0, 1.0, 0.0 >, 0 ); llSetAlpha( 1.0, 0 );
           vector Scale = < 1.0, 1.0, 0>;
           vector Offset = < 1.0, 1.0, 0 > - ST1;
           llSetPrimitiveParams([ PRIM_TEXTURE, 0, kTextureClick, Scale, Offset, 0 ]);
           llSetAlpha( 0.0, 0 );
           llSay( ch, llDumpList2String( [nKey,0] + tData1, "|" ) );
       } else {
           llSetColor( < 0.0, 0.0, 1.0 >, 0 ); llSetAlpha( 0.2, 0 );
           float relSize = 0.08;
           vector selCentre = <1,1,0> - ((ST2+ST1)/2);
           vector selSize = (ST1-ST2); selSize = <llFabs(selSize.x),llFabs(selSize.y),0>;
           
           vector Scale = <relSize/selSize.x,relSize/selSize.y,0>;//selSize;//< selSize.x/relSize.x, selSize.y/relSize.y, 0>;
           vector Offset = (selCentre-<0.5,0.5,0>);Offset = <Offset.x*Scale.x,Offset.y*Scale.y,0>;
           llSetPrimitiveParams([ PRIM_TEXTURE, 0, kTextureDrag, Scale, Offset, 0 ]);
           llSay( ch, llDumpList2String( [nKey,1] + tData1 + tData2, "|" ) );
           llSetAlpha( 0.0, 0 );
       }
   }

} </lsl>