ClickAndDrag
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
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>