User:Xen Lisle/Texture Slide

From Second Life Wiki

Second Life Wiki > Xen Lisle/Texture Slide
Jump to: navigation, search

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

//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));                                
            }
        }
    }
}
Personal tools