User:Xen Lisle/Texture Slide

From Second Life Wiki
< User:Xen Lisle
Revision as of 05:46, 5 July 2013 by Kireji Haiku (talk | contribs) (added a few line-breaks to Xenny's script for better readability of page on narrower screens (i.e. mobile))
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.

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

// prim face you want the script to work on integer gFace = 0;

// the UV repeats of the texture. values smaller than one will show only part of the texture vector UV_TEXTURE_REPEATS = <1.0, 1.0, 0.0>;

// your menu texture string MENU_TEXTURE = "69737f61-1fdd-6033-7ea3-a52e61a40137";

// strided list to define button labels and values // - vector one is top left button corner // - vector two is bottom right button corner // - next two elements hold data for the buttons // elements in this example: LABEL, DATA // assigning a label helps to filter different button actions // not very helpful in our example but included anyway list BUTTONS_STRIDED_LIST = [

   <0.0, 1.0, 0.0>,    <0.2, 0.8, 0.0>,    "Button",   "A-0",
   <0.2, 1.0, 0.0>,    <0.4, 0.8, 0.0>,    "Button",   "A-1",
   <0.4, 1.0, 0.0>,    <0.6, 0.8, 0.0>,    "Button",   "A-2",
   <0.6, 1.0, 0.0>,    <0.8, 0.8, 0.0>,    "Button",   "A-3",
   <0.8, 1.0, 0.0>,    <1.0, 0.8, 0.0>,    "Button",   "A-4",
   <0.0, 0.8, 0.0>,    <0.2, 0.6, 0.0>,    "Button",   "B-0",
   <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) {

   vector cordA;
   vector cordB;
   integer lines = llGetListLength(lst) / 4;
   //  roll values between 0 and 1
   v -= <llFloor(v.x), llFloor(v.y), 0.0>;
   integer i;
   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 (MENU_TEXTURE == "")
       {
           MENU_TEXTURE = "69737f61-1fdd-6033-7ea3-a52e61a40137";
       }
       llSetLinkPrimitiveParamsFast(0, [
           PRIM_TEXTURE, gFace, MENU_TEXTURE, UV_TEXTURE_REPEATS, ZERO_VECTOR, 0.0]);
   }
   touch_start(integer num_detected)
   {
       integer face = llDetectedTouchFace(0);
       if (face == gFace)
       {
           gOffsetUV = llGetTextureOffset(gFace);
           gStartST = llDetectedTouchST(0);
           //  scale the touch vector to match our texture scale
           gStartST = <gStartST.x*UV_TEXTURE_REPEATS.x, gStartST.y*UV_TEXTURE_REPEATS.y, 0.0>;
       }
   }
   touch(integer num_detected)
   {
       integer face = llDetectedTouchFace(0);
       if (face == gFace)
       {
           gEndST = llDetectedTouchST(0);
           //  scale the touch vector to match our texture scale
           gEndST = <gEndST.x*UV_TEXTURE_REPEATS.x, gEndST.y*UV_TEXTURE_REPEATS.y, 0.0>;
           if (llVecDist(gStartST,gEndST) > 0.0)
           {
                vector newUV = gOffsetUV + (gStartST - gEndST);
                //  roll values between 0 and 1
                newUV -= <llFloor(newUV.x), llFloor(newUV.y), 0.0>;
               //  apply new texture offset
                llSetLinkPrimitiveParamsFast(0, [
                   PRIM_TEXTURE, gFace, MENU_TEXTURE, UV_TEXTURE_REPEATS, newUV, 0.0]);
           }
       }
   }
   touch_end(integer num_detected)
   {
       integer face = llDetectedTouchFace(0);
       if (face == gFace)
       {
           if (llVecDist(gStartST, gEndST) > 0.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), BUTTONS_STRIDED_LIST);
               //This next line is where we compare button labels
               if (llList2String(list_data, 0) == "Button")
               {
                   llSay(PUBLIC_CHANNEL, llList2String(list_data, 1));
               }
           }
       }
   }

} </lsl>