User:Tyken Hightower/TouchColoring

From Second Life Wiki
Jump to navigation Jump to search

<lsl> float hue = 0.0; float luminosity = 1.0; float saturation = 1.0; float red = 1.0; float green = 1.0; float blue = 1.0;

update_color(vector touched) {

   hue = touched.x;
   luminosity = touched.y;
   
   recolor();

}

update_saturation(vector touched) {

   saturation = touched.x;
   
   recolor();

}

recolor() {

   float q = 0.0;
   
   if (luminosity < 0.5)
       q = luminosity * (1.0 + saturation);
   else
       q = luminosity + saturation - (luminosity * saturation);
   
   float p = 2.0 * luminosity - q;
   
   red = hue + (1.0 / 3.0);
   green = hue;
   blue = hue - (1.0 / 3.0);
   
   if (red < 0.0)
       ++red;
   else if (red > 1.0)
       --red;
   if (green < 0.0)
       ++green;
   else if (green > 1.0)
       --green;
   if (blue < 0.0)
       ++blue;
   else if (blue > 1.0)
       --blue;
       
   if (red < (1.0 / 6.0))
       red = p + ((q - p) * 6.0 * red);
   else if (red < 0.5)
       red = q;
   else if (red < (2.0 / 3.0))
       red = p + ((q - p) * 6.0 * ((2.0 / 3.0) - red));
   else
       red = p;
       
   if (green < (1.0 / 6.0))
       green = p + ((q - p) * 6.0 * green);
   else if (green < 0.5)
       green = q;
   else if (green < (2.0 / 3.0))
       green = p + ((q - p) * 6.0 * ((2.0 / 3.0) - green));
   else
       green = p;
       
   if (blue < (1.0 / 6.0))
       blue = p + ((q - p) * 6.0 * blue);
   else if (blue < 0.5)
       blue = q;
   else if (blue < (2.0 / 3.0))
       blue = p + ((q - p) * 6.0 * ((2.0 / 3.0) - blue));
   else
       blue = p;
   
   llSetLinkColor(3, <red, green, blue>, 0);

}

default {

   touch(integer number)
   {
       // Only accept touch-enabled clients or touches on face 0.
       if (llDetectedTouchFace(0))
           return;
       
       string link = llGetLinkName(llDetectedLinkNumber(0));
       vector touched = llDetectedTouchST(0);
       
       //llOwnerSay((string)touched);
       
       if (link == "draw")
           draw(touched);
       else if (link == "color")
           update_color(touched);
       else if (link == "saturation")
           update_saturation(touched);
   }

} </lsl>