User:Xen Lisle/Texture Slide
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Texture Slide
General information:
This is a proof of concept to show how to slide a texture across a prim face with mouse movement.
The script will display a grid texture of 25 squares. Clicking on a grid square will return that squares value.
Clicking and holding while moving the mouse, the texture will slide in the direction of the mouse movement.
Script
<lsl> //Touch and drag a texture across a prim face //Useful for interfaces and such //Example script gives you 25 buttons to click on //By Xen Lisle //Free to use /////////User Variables///////// integer gFace = 0; //prim face you want the script to work on vector gRepeats = <1.0,1.0,0.0>; //the UV repeats of the texture. values smaller than one will show only part of the texture string gTexture = "69737f61-1fdd-6033-7ea3-a52e61a40137"; //your menu texture list gList = [<0.0,1.0,0.0>,<0.2,0.8,0.0>,"Button","A-0", //strided list to define button labels and values
<0.2,1.0,0.0>,<0.4,0.8,0.0>,"Button","A-1", //vector one is top left button corner <0.4,1.0,0.0>,<0.6,0.8,0.0>,"Button","A-2", //vector two is bottom right button corner <0.6,1.0,0.0>,<0.8,0.8,0.0>,"Button","A-3", //next two elements hold data for the buttons <0.8,1.0,0.0>,<1.0,0.8,0.0>,"Button","A-4", //example LABEL,DATA //assigning a label helps to filter different button actions <0.0,0.8,0.0>,<0.2,0.6,0.0>,"Button","B-0", //not very helpful in our example but included anyway <0.2,0.8,0.0>,<0.4,0.6,0.0>,"Button","B-1", <0.4,0.8,0.0>,<0.6,0.6,0.0>,"Button","B-2", <0.6,0.8,0.0>,<0.8,0.6,0.0>,"Button","B-3", <0.8,0.8,0.0>,<1.0,0.6,0.0>,"Button","B-4", <0.0,0.6,0.0>,<0.2,0.4,0.0>,"Button","C-0", <0.2,0.6,0.0>,<0.4,0.4,0.0>,"Button","C-1", <0.4,0.6,0.0>,<0.6,0.4,0.0>,"Button","C-2", <0.6,0.6,0.0>,<0.8,0.4,0.0>,"Button","C-3", <0.8,0.6,0.0>,<1.0,0.4,0.0>,"Button","C-4", <0.0,0.4,0.0>,<0.2,0.2,0.0>,"Button","D-0", <0.2,0.4,0.0>,<0.4,0.2,0.0>,"Button","D-1", <0.4,0.4,0.0>,<0.6,0.2,0.0>,"Button","D-2", <0.6,0.4,0.0>,<0.8,0.2,0.0>,"Button","D-3", <0.8,0.4,0.0>,<1.0,0.2,0.0>,"Button","D-4", <0.0,0.2,0.0>,<0.2,0.0,0.0>,"Button","E-0", <0.2,0.2,0.0>,<0.4,0.0,0.0>,"Button","E-1", <0.4,0.2,0.0>,<0.6,0.0,0.0>,"Button","E-2", <0.6,0.2,0.0>,<0.8,0.0,0.0>,"Button","E-3", <0.8,0.2,0.0>,<1.0,0.0,0.0>,"Button","E-4" ];
////////////////////////////////
vector gStartST; vector gEndST; vector gOffsetUV;
list FindUV(vector v, list lst) {
integer i; vector cordA; vector cordB; integer lines = llGetListLength(lst) / 4;
v -= <llFloor(v.x),llFloor(v.y),0.0>; //roll values between 0 and 1 for (i=0;i<lines;i++) { cordA = llList2Vector(lst,i * 4); cordB = llList2Vector(lst, i * 4 + 1); if (v.x > cordA.x && v.x < cordB.x && v.y < cordA.y && v.y > cordB.y) { return llList2List(lst,i * 4 + 2,i * 4 + 3); } } return [];
}
default {
state_entry() { if (gTexture =="") gTexture ="69737f61-1fdd-6033-7ea3-a52e61a40137"; llSetLinkPrimitiveParamsFast(0,[PRIM_TEXTURE,gFace,gTexture,gRepeats, ZERO_VECTOR, 0.]); }
touch_start(integer total_number) { if (llDetectedTouchFace(0) == gFace) { gOffsetUV = llGetTextureOffset(gFace); gStartST = llDetectedTouchST(0); gStartST = <gStartST.x*gRepeats.x,gStartST.y*gRepeats.y,0.0>; //scale the touch vector to match our texture scale } } touch(integer total_number) { if (llDetectedTouchFace(0) == gFace) {
gEndST = llDetectedTouchST(0); gEndST = <gEndST.x*gRepeats.x,gEndST.y*gRepeats.y,0.0>;//scale the touch vector to match our texture scale if (llVecDist(gStartST,gEndST) > 0.) { vector newUV = gOffsetUV + (gStartST - gEndST); newUV -= <llFloor(newUV.x),llFloor(newUV.y),0.0>; //roll values between 0 and 1 llSetLinkPrimitiveParamsFast(0,[PRIM_TEXTURE,gFace,gTexture,gRepeats, newUV, 0.]);//apply new texture offset } } } touch_end(integer total_number) { if (llDetectedTouchFace(0) == gFace) { if (llVecDist(gStartST,gEndST) > 0.); //compare mouse movement to see if texture was moved. maybe useful to do something here else //did not slide the texture. was a button press { list list_data = FindUV(llDetectedTouchUV(0),gList); //This next line is where we compare button labels if (llList2String(list_data,0) == "Button") llSay(0,llList2String(list_data,1)); } } }
} </lsl>