Difference between revisions of "User:Opensource Obscure/Chromutate"

From Second Life Wiki
Jump to navigation Jump to search
m
m (<lsl> tag to <source>)
 
(9 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{User:Opensource_Obscure/Backlink}}
== Overview ==
== Overview ==
''Chromutate'' is an '''interactive building/installation''' I'm working on - an excuse to play around with both [https://wiki.secondlife.com/wiki/User:Dizzy_Banjo#DynaFleur Reflexive Architecture]  
''Chromutate'' is a series of '''interactive installations''' I have built in Second Life - an excuse to play around with SL Physics, scripting, ''Reflexive Architecture'' (see below) and HTTP-in LSL features.<BR>
and the new [https://wiki.secondlife.com/wiki/Category:LSL_HTTP/Server HTTP-in LSL features]. '''Feel free to visit it''' (from the web or in-world): '''change the colors of the building, rez stuff, send messages...'''. Take a copy of the scripted objects if you're inclined so, and please warn me if something doesn't work!
 
* [http://open.myartsonline.com/http-in ''Chromutate''] - webpage and public control panel
As of 2012, January, a scaled down instance of Chromutate is rezzed and working in my land at the LOL sim.
* [http://slurl.com/secondlife/Purple%20Forest/117/40/21 SLURL]
 
'''See Chromutate 1.0 at original size in the [http://www.youtube.com/view_play_list?p=8BCB25BFB316610D Chromutate playlist on YouTube].'''
 
Feel free to [http://slurl.com/secondlife/LOL/12/34/56 '''visit and play with it!''']
<BR>Change the colors of the buildings, rez stuff and send in-world messages from the web page, or walk over it in-world and discover how the installation reacts to your presence (hint: touch orange objects!). Take a copy of the scripted objects if you're inclined so (almost all objects and contents are supposed to be '''full-perms''') and please warn me if something doesn't work.
* '''Web public control panel''': http://alisl.org/chromutate
* '''SLURL''': [http://slurl.com/secondlife/LOL/12/34/56 LOL(12,34,56)]


[[File:Rossoverde.jpg]]<br />
[[File:Rossoverde.jpg]]<br />


== Ideas that could get into Chromutate ==
== Ideas ==
* http://code.google.com/intl/it-IT/apis/chart/faq.html
* ''Reflexive Architecture'' (see below)
* http://open.myartsonline.com/stream.html
* [https://wiki.secondlife.com/wiki/Category:LSL_HTTP/Server|LSL HTTP-in]
* as soon as we have full web support: move the web page to a prim face
* SL Physics
* http://code.google.com/intl/it-IT/apis/chart/faq.html - ''not implemented yet''
* http://open.myartsonline.com/stream.html - ''not implemented yet''
* as soon as we have full web support: move the web page to a prim face - ''not implemented yet''


== Tech ==
== Tech / code ==


I use [http://gridurl.appspot.com/ Gridurl] to maintain persistent URLs for my LSL scripts. See the code below. <br />
I use [http://gridurl.appspot.com/ Gridurl] to maintain persistent URLs for my LSL scripts. See the code below. <br />
Disclaimer: I'm not a real programmer and [https://wiki.secondlife.com/wiki/User_talk:Opensource_Obscure your comments and suggestions are welcome].
Disclaimer: I'm not a real programmer and [https://wiki.secondlife.com/wiki/User_talk:Opensource_Obscure your comments and suggestions are welcome].


For the HTML, look the [http://open.myartsonline.com/http-in web page source]. Here are the LSL scripts. <br />
For the HTML, look the [http://alisl.org/chromutate web page source]. Here are the LSL scripts. <br />
The main script below receives data from [http://open.myartsonline.com/http-in the web page], where you can choose colors and something else through a form. The script then parses those data and does some things with them - it rezzes an object (or not) and it relays the parsed data via chat channels to other objects.
The main script below receives data from [http://alisl.org/chromutate the web page], where you can choose colors and something else through a form. The script then parses those data and does some things with them - it rezzes an object (or not) and it relays the parsed data via chat channels to other objects.
 
=== Reflexive Architecture ===
 
''Virtual architecture, and the context it lives in, differs from physical architecture. It becomes less like a static artifact, and more like a liquid. An architecture truly responsive to its fluid context must be able to shift shape along with it.'' ([[http://archsl.wordpress.com/2007/07/18/we-shape-our-virtual-buildings-and-afterwards-we-keep-shaping-them/ Jon Brouchoud]])
 
For more information about Reflexive Architecture, see [[User:Dizzy_Banjo#DynaFleur]] and read archsl.wordpress.com [[http://archsl.wordpress.com/2007/08/30/open-source-scripts-reflexive-virtual-architecture starting from this page]].<BR/>
Direct links to both video and more free scripts:
* [http://archsl.wordpress.com/reflexive-architecture-script-1-change-size-and-color-per-avatar-distance/ Change Size and Color per Avatar Distance]
* [http://archsl.wordpress.com/reflexive-architecture-script-2-change-opacity-per-avatar-distance Change Opacity per Avatar Distance]
* [http://archsl.wordpress.com/reflexive-architecture-script-3-prim-moves-x-meters-from-avatar-returns-home-x-seconds-after-avatar-leaves Prim Moves X-Meters from Avatar, Returns Home X-Seconds after Avatar Leaves]
 
=== Controller script ===
 
This manages HTTP calls, talks to Gridurl, receives data from HTML form and sends commands to installation components.


=== first script - it manages HTTP calls and talks to Gridurl ===
<source lang="lsl2">


<lsl>
string name1 = "LOL_color_controller";
string name2 = "Someone at http://alisl.org/chromutate just wrote: ";


key mykey = "eb42408b-5888-42b7-80d6-b00ca2eb9781"; // SL UUID
string risposta = "Thanks! Please use the button in your browser to go back.";
key mykey = "eb42408b-5888-42b7-80d6-b00ca2eb9781"; // my SL UUID - change this!


string gridurl_key="7d183313-a033-4b21-b5d7-1280d0461ee0";
string gridurl_key="4ab936c7-36dc-4444-82f9-62e4bf3a5475"; // change this!
string gridurl_indirizzo = "http://gridurl.appspot.com/go/4ab936c7-36dc-4444-82f9-62e4bf3a5475"; // change this!
string baseurl = "http://gridurl.appspot.com/reg?service=";
string baseurl = "http://gridurl.appspot.com/reg?service=";


integer chan1 = -20241;
integer chan1 = -20241; // you may want to change this as well
integer chan2 = -20242;
integer chan2 = -20242; // you may want to change this as well
integer chan3 = -20243;
integer chan3 = -20243; // you may want to change this as well
integer channel_avvertore = -20247; // you may want to change this as well
 
 
string strReplace(string str, string search, string replace)
{
    return llDumpList2String(llParseStringKeepNulls((str = "") + str, [search], []), replace);
}


list lstHTML = [
        "aliceblue",            0xf0f8ff, "antiquewhite",    0xfaebd7, "aqua",            0x00ffff,
        "aquamarine",          0x7fffd4, "azure",          0xf0ffff, "beige",          0xf5f5dc,
        "bisque",              0xffe4c4, "black",          0x000000, "blanchedalmond",  0xffebcd,
        "blue",                0x0000ff, "blueviolet",      0x8a2be2, "brown",          0xa52a2a,
        "burlywood",            0xdeb887, "cadetblue",      0x5f9ea0, "chartreuse",      0x7fff00,
        "chocolate",            0xd2691e, "coral",          0xff7f50, "cornflowerblue",  0x6495ed,
        "cornsilk",            0xfff8dc, "crimson",        0xdc143c, "cyan",            0x00ffff,
        "darkblue",            0x00008b, "darkcyan",        0x008b8b, "darkgoldenrod",  0xb8860b,
        "darkgray",            0xa9a9a9, "darkgreen",      0x006400, "darkkhaki",      0xbdb76b,
        "darkmagenta",          0x8b008b, "darkolivegreen",  0x556b2f, "darkorange",      0xff8c00,
        "darkorchid",          0x9932cc, "darkred",        0x8b0000, "darksalmon",      0xe9967a,
        "darkseagreen",        0x8fbc8f, "darkslateblue",  0x483d8b, "darkslategray",  0x2f4f4f,
        "darkturquoise",        0x00ced1, "darkviolet",      0x9400d3, "deeppink",        0xff1493,
        "deepskyblue",          0x00bfff, "dimgray",        0x696969, "dodgerblue",      0x1e90ff,
        "firebrick",            0xb22222, "floralwhite",    0xfffaf0, "forestgreen",    0x228b22,
        "fuchsia",              0xff00ff, "gainsboro",      0xdcdcdc, "ghostwhite",      0xf8f8ff,
        "gold",                0xffd700, "goldenrod",      0xdaa520, "gray",            0x808080,
        "green",                0x008000, "greenyellow",    0xadff2f, "honeydew",        0xf0fff0,
        "hotpink",              0xff69b4, "indianred",      0xcd5c5c, "indigo",          0x4b0082,
        "ivory",                0xfffff0, "khaki",          0xf0e68c, "lavender",        0xe6e6fa,
        "lavenderblush",        0xfff0f5, "lawngreen",      0x7cfc00, "lemonchiffon",    0xfffacd,
        "lightblue",            0xadd8e6, "lightcoral",      0xf08080, "lightcyan",      0xe0ffff,
        "lightgoldenrodyellow", 0xfafad2, "lightgrey",      0xd3d3d3, "lightgreen",      0x90ee90,
        "lightpink",            0xffb6c1, "lightsalmon",    0xffa07a, "lightseagreen",  0x20b2aa,
        "lightskyblue",        0x87cefa, "lightslategray",  0x778899, "lightsteelblue",  0xb0c4de,
        "lightyellow",          0xffffe0, "lime",            0x00ff00, "limegreen",      0x32cd32,
        "linen",                0xfaf0e6, "magenta",        0xff00ff, "maroon",          0x800000,
        "mediumaquamarine",    0x66cdaa, "mediumblue",      0x0000cd, "mediumorchid",    0xba55d3,
        "mediumpurple",        0x9370d8, "mediumseagreen",  0x3cb371, "mediumslateblue", 0x7b68ee,
        "mediumspringgreen",    0x00fa9a, "mediumturquoise", 0x48d1cc, "mediumvioletred", 0xc71585,
        "midnightblue",        0x191970, "mintcream",      0xf5fffa, "mistyrose",      0xffe4e1,
        "moccasin",            0xffe4b5, "navajowhite",    0xffdead, "navy",            0x000080,
        "oldlace",              0xfdf5e6, "olive",          0x808000, "olivedrab",      0x6b8e23,
        "orange",              0xffa500, "orangered",      0xff4500, "orchid",          0xda70d6,
        "palegoldenrod",        0xeee8aa, "palegreen",      0x98fb98, "paleturquoise",  0xafeeee,
        "palevioletred",        0xd87093, "papayawhip",      0xffefd5, "peachpuff",      0xffdab9,
        "peru",                0xcd853f, "pink",            0xffc0cb, "plum",            0xdda0dd,
        "powderblue",          0xb0e0e6, "purple",          0x800080, "red",            0xff0000,
        "rosybrown",            0xbc8f8f, "royalblue",      0x4169e1, "saddlebrown",    0x8b4513,
        "salmon",              0xfa8072, "sandybrown",      0xf4a460, "seagreen",        0x2e8b57,
        "seashell",            0xfff5ee, "sienna",          0xa0522d, "silver",          0xc0c0c0,
        "skyblue",              0x87ceeb, "slateblue",      0x6a5acd, "slategray",      0x708090,
        "snow",                0xfffafa, "springgreen",    0x00ff7f, "steelblue",      0x4682b4,
        "tan",                  0xd2b48c, "teal",            0x008080, "thistle",        0xd8bfd8,
        "tomato",              0xff6347, "turquoise",      0x40e0d0, "violet",          0xee82ee,
        "wheat",                0xf5deb3, "white",          0xffffff, "whitesmoke",      0xf5f5f5,
        "yellow",              0xffff00, "yellowgreen",    0x9acd32
    ];
vector  sbColorConvert(string strData) {
vector  sbColorConvert(string strData) {
     integer mode = llListFindList(lstHTML, [llToLower(strData)]);
     integer mode = -1; // llListFindList(lstHTML, [llToLower(strData)]);
     integer intColor = 0;
     integer intColor = 0;
   
   
     if (~mode) {
     {
        intColor = llList2Integer(lstHTML, mode | 1);
 
        mode = 8;
    }
    else {
         string strStart = llGetSubString(strData, 0, 1);
         string strStart = llGetSubString(strData, 0, 1);
         if (strStart != "0x") {
         if (strStart != "0x") {
Line 110: Line 92:
     if (mode == 8) {//RRGGBB
     if (mode == 8) {//RRGGBB
         return <(intColor >> 16) & 0xFF, (intColor >> 8) & 0xFF, (intColor & 0xFF)> / 0xFF;
         return <(intColor >> 16) & 0xFF, (intColor >> 8) & 0xFF, (intColor & 0xFF)> / 0xFF;
    }
    else if (mode == 5) {//RGB (an HTML color format)
        return <(intColor >> 8) & 0xF, (intColor >> 4) & 0xF, (intColor & 0xF)> / 0xF;
     }
     }
     return ZERO_VECTOR;//black
     return ZERO_VECTOR;//black
}
}




Line 130: Line 106:
vector pos_orig;
vector pos_orig;


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////


Line 144: Line 119:
send_response(key id, string body)
send_response(key id, string body)
{
{
     llHTTPResponse(id, 200, body);
     llHTTPResponse(id, 200, risposta);
}
}




Line 163: Line 135:
fa(key id, string asd)
fa(key id, string asd)
{
{
    llSay(0, asd);
     string a = llUnescapeURL(asd);
     string a = llUnescapeURL(asd);
     send_response(id, a);     
     send_response(id, a);     
     list variabili = llParseString2List(asd, ["color1=", "&color2=","&color3=", "&rez=", "&a="], [""]);
     list variabili = llParseString2List(asd, ["rez=", "&color1=", "&color2=","&color3=", "&a="], [""]);
     string color1 = llUnescapeURL(llList2String(variabili, 0));
     integer rez_choice = (integer)llList2String(variabili, 0);
     string color2 = llUnescapeURL(llList2String(variabili, 1));  
     string color1 = llUnescapeURL(llList2String(variabili, 1));
     string color3 = llUnescapeURL(llList2String(variabili, 2));      
     string color2 = llUnescapeURL(llList2String(variabili, 2));  
     integer rez = (integer)llUnescapeURL(llList2String(variabili, 3));
     string color3 = llUnescapeURL(llList2String(variabili, 3));  
     string messaggio = llUnescapeURL(llList2String(variabili, 4));
     string messaggio = llUnescapeURL(llList2String(variabili, 4));      
     llSay(chan1, (string)sbColorConvert(color1));
     llRegionSay(chan1, (string)sbColorConvert(color1));
     llSay(chan2, (string)sbColorConvert(color2));     
     llRegionSay(chan2, (string)sbColorConvert(color2));     
     llSay(chan3, (string)sbColorConvert(color3));      
     llRegionSay(chan3, (string)sbColorConvert(color3));        
     llSetPrimitiveParams([
     //    llOwnerSay("> " + llList2String(variabili, 0));
    PRIM_COLOR, ALL_SIDES, (vector)color1, 1.0
     if(rez_choice == 1)
     ]);
     {
     altro(rez);
        altro();
    }
     if(messaggio)
     if(messaggio)
     {
     {
         llSay(0, messaggio);
         messaggio = strReplace(messaggio, "+", " ");
     }
        llSetObjectName(name2);
        llShout(0, messaggio);
        llSetObjectName(name1);
     }                
    llInstantMessage(mykey, messaggio);               
}
}




altro(integer value)
altro()
{
{
    if(value)
         string obj = llGetInventoryName(INVENTORY_OBJECT,0);
    {
         // llOwnerSay("Da web mi fanno rezzare");
         string a = llGetInventoryName(INVENTORY_OBJECT,0);
         llRezObject(obj, pos_orig + <0,0,2>, <0,0,0>, <0,0,0,0>, 1);
         llSay(0, "rezzo " + a);
        llRegionSay(channel_avvertore,"spara");           
         llRezObject(a, pos_orig + <0,0,1>, <0,0,0>, <0,0,0,0>, 1);
    }
}
}




Line 229: Line 200:
         if (method == URL_REQUEST_GRANTED)
         if (method == URL_REQUEST_GRANTED)
         {
         {
             llSay(0, " nuovo url = " + body);                   
             url = body;
            llOwnerSay(" nuovo url = " + url);                   
             update_gridurl(body);             
             update_gridurl(body);             
         }
         }
Line 242: Line 214:
         {
         {
                 string asd = llGetHTTPHeader(id, "x-query-string");  
                 string asd = llGetHTTPHeader(id, "x-query-string");  
                 llSay(0, " query = " + asd);         
                 //llOwnerSay(" query = " + asd);         
                 fa(id,asd);
                 fa(id,asd);
         }
         }
Line 256: Line 228:
     {
     {
             llInstantMessage(mykey, "Il mio indirizzo attualmente e' "  
             llInstantMessage(mykey, "Il mio indirizzo attualmente e' "  
             + url + "  - il link permanente per utilizzarmi e' " + nome);  
             + url + "  - il link permanente per utilizzarmi e' " + gridurl_indirizzo);  
     }     
     }     




// se tutto va bene, l'indirizzo breve ora punta correttamente
   
// al nuovo indirizzo lungo dello script.
}
     http_response(key request_id, integer status, list metadata, string body)
 
 
</source>
 
=== Color change scripts ===
 
This listens to the first script and it changes accordingly its color. ''Chromutate'' currently uses 3 colors - just reuse the following script and change chat channel to -20242 and -20243.
 
<source lang="lsl2">
default
{
    state_entry()
    {
        llListen(-20241, "", "", "");  // you may need to change this, if you changed it in the first script
     }
    listen(integer chan, string name, key id, string msg)
     {
     {
         integer i;
         llSetLinkColor(-1, (vector)msg, ALL_SIDES);
        if (request_id == requestid)
     }
        {
            llInstantMessage(mykey, "body: " + body); // debug           
        }
        else
        {
            llInstantMessage(mykey, (string)status+" error");
        }
     }      
}
}
</source>
=== Reflexive Architecture scripts ===
This listens to the first script and changes accordingly its base color. When an avatar approaches, it changes the object size and color - resuming to original parameters when avatars go away.


<source lang="lsl2">
// Reflexive Architecture Script 1: Change Size and Color per Avatar Distance
// For Keystone Bouchard. http://www.archsl.wordpress.com for an installation on Architecture Island, September 2007. Scripted by Fumon Kubo


</lsl>
//Shared under Creative Commons Attribution-Share Alike 3.0 License


=== second script - it listens to the first script and it changes the prim color ===
integer channel = -20243;
string mittente = "LOL_color_controller";


vector NEAR_COL = <1.0, 1.0, 0.0>;
vector FAR_COL; // = <1.0, 4.5, 0.0>;
vector NEAR_SIZE = <.6, 10, .6>;
vector FAR_SIZE = <4, 4, 4>;
float NEAR = 3.0;
float FAR = 9.0;


<lsl>
default
default
{
{
     state_entry()
     state_entry()
     {
     {
         llListen(-20241, "", "", "");  
         llListen(channel, mittente, "", "");         
        llSensorRepeat("", NULL_KEY, AGENT, FAR, PI, 0.2);
        llSetScale(FAR_SIZE);
     }
     }
     listen(integer chan, string name, key id, string msg)   
     listen(integer chan, string name, key id, string msg)   
     {
     {
         llSetLinkColor(-1, (vector)msg, ALL_SIDES);
        FAR_COL = (vector)msg;
         llSetLinkColor(-1, FAR_COL, ALL_SIDES);
    }
   
    sensor(integer total_number)
    {
        float distance = llVecMag(llDetectedPos(0) - llGetPos());
        float scale = (distance - NEAR) / (FAR - NEAR);
        if (scale < 0.0) scale = 0.0;
        llSetScale(NEAR_SIZE + ((FAR_SIZE - NEAR_SIZE) * scale));
        llSetColor(NEAR_COL + ((FAR_COL - NEAR_COL) * scale), ALL_SIDES);
     }
     }
}
}
</lsl>


third and fourth script - see second script and change chat channel to 20242 and 20243
</source>

Latest revision as of 16:41, 24 January 2015

Go back to Opensource Obscure's userpage



Overview

Chromutate is a series of interactive installations I have built in Second Life - an excuse to play around with SL Physics, scripting, Reflexive Architecture (see below) and HTTP-in LSL features.

As of 2012, January, a scaled down instance of Chromutate is rezzed and working in my land at the LOL sim.

See Chromutate 1.0 at original size in the Chromutate playlist on YouTube.

Feel free to visit and play with it!
Change the colors of the buildings, rez stuff and send in-world messages from the web page, or walk over it in-world and discover how the installation reacts to your presence (hint: touch orange objects!). Take a copy of the scripted objects if you're inclined so (almost all objects and contents are supposed to be full-perms) and please warn me if something doesn't work.

Rossoverde.jpg

Ideas

Tech / code

I use Gridurl to maintain persistent URLs for my LSL scripts. See the code below.
Disclaimer: I'm not a real programmer and your comments and suggestions are welcome.

For the HTML, look the web page source. Here are the LSL scripts.
The main script below receives data from the web page, where you can choose colors and something else through a form. The script then parses those data and does some things with them - it rezzes an object (or not) and it relays the parsed data via chat channels to other objects.

Reflexive Architecture

Virtual architecture, and the context it lives in, differs from physical architecture. It becomes less like a static artifact, and more like a liquid. An architecture truly responsive to its fluid context must be able to shift shape along with it. ([Jon Brouchoud])

For more information about Reflexive Architecture, see User:Dizzy_Banjo#DynaFleur and read archsl.wordpress.com [starting from this page].
Direct links to both video and more free scripts:

Controller script

This manages HTTP calls, talks to Gridurl, receives data from HTML form and sends commands to installation components.

string name1 = "LOL_color_controller";
string name2 = "Someone at http://alisl.org/chromutate just wrote: ";

string risposta = "Thanks! Please use the button in your browser to go back.";
key mykey = "eb42408b-5888-42b7-80d6-b00ca2eb9781"; // my SL UUID - change this!

string gridurl_key="4ab936c7-36dc-4444-82f9-62e4bf3a5475"; // change this!
string gridurl_indirizzo = "http://gridurl.appspot.com/go/4ab936c7-36dc-4444-82f9-62e4bf3a5475"; // change this!
string baseurl = "http://gridurl.appspot.com/reg?service=";

integer chan1 = -20241; // you may want to change this as well
integer chan2 = -20242; // you may want to change this as well
integer chan3 = -20243; // you may want to change this as well
integer channel_avvertore = -20247; // you may want to change this as well


string strReplace(string str, string search, string replace) 
{
    return llDumpList2String(llParseStringKeepNulls((str = "") + str, [search], []), replace);
}

vector  sbColorConvert(string strData) {
    integer mode = -1; // llListFindList(lstHTML, [llToLower(strData)]);
    integer intColor = 0;
 
    {

        string strStart = llGetSubString(strData, 0, 1);
        if (strStart != "0x") {
            if (llGetSubString(strStart, 0, 0) == "#") {
                strData = "0x" + llDeleteSubString(strData, 0, 0);
            }
            else {
                vector vecColor = (vector)("<"+strData+">");
                if (vecColor) {
                    return (vector)("<"+strData+">") / 255;
                }
                strData = "0x" + strData;
            }
        }
        intColor = (integer)strData;
        mode = llStringLength(strData);
    }
    if (mode == 8) {//RRGGBB
        return <(intColor >> 16) & 0xFF, (intColor >> 8) & 0xFF, (intColor & 0xFF)> / 0xFF;
    }
    return ZERO_VECTOR;//black
}


string url;
string query;
string nome;
string t1 = "il mio indirizzo e' ";
key requestid;
integer status = FALSE;
list requests;
vector pos_orig;

////////////////////////////////////////////////////////////////////////////////

// richiedo un nuovo URL per lo script 
setup()
{
    url = "";
    llRequestURL();
}


// risponde via HTTP
send_response(key id, string body)
{
    llHTTPResponse(id, 200, risposta);
}


// http://gridurl.appspot.com/
update_gridurl(string testo)
{
    query = gridurl_key + "&url=" + llEscapeURL(testo) + "/";
    requestid = llHTTPRequest(baseurl + query,[HTTP_METHOD,"GET", HTTP_MIMETYPE,"application/x-www-form-urlencoded"], "");    
}



// fa qualcosa
fa(key id, string asd)
{
    string a = llUnescapeURL(asd);
    send_response(id, a);    
    list variabili = llParseString2List(asd, ["rez=", "&color1=", "&color2=","&color3=", "&a="], [""]);
    integer rez_choice = (integer)llList2String(variabili, 0);
    string color1 = llUnescapeURL(llList2String(variabili, 1));
    string color2 = llUnescapeURL(llList2String(variabili, 2));    
    string color3 = llUnescapeURL(llList2String(variabili, 3));   
    string messaggio = llUnescapeURL(llList2String(variabili, 4));        
    llRegionSay(chan1, (string)sbColorConvert(color1));
    llRegionSay(chan2, (string)sbColorConvert(color2));    
    llRegionSay(chan3, (string)sbColorConvert(color3));          
    //    llOwnerSay("> " + llList2String(variabili, 0));
    if(rez_choice == 1)
    {
        altro();
    }
    if(messaggio)
    {
        messaggio = strReplace(messaggio, "+", " ");
        llSetObjectName(name2);
        llShout(0, messaggio);
        llSetObjectName(name1);
    }                  
    llInstantMessage(mykey, messaggio);                
}


altro()
{
        string obj = llGetInventoryName(INVENTORY_OBJECT,0);
        // llOwnerSay("Da web mi fanno rezzare");
        llRezObject(obj, pos_orig + <0,0,2>, <0,0,0>, <0,0,0,0>, 1);
        llRegionSay(channel_avvertore,"spara");             
}



default
{
    state_entry()
    {
        setup();
        pos_orig = llGetPos();
    }
    
    on_rez(integer n) 
    {
        setup(); 
    }

    changed(integer c)
    {
        if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )
        {
            setup();
        }
    }


// scatta in risposta a setup() cioe' alla richiesta di un nuovo URL  
    http_request(key id, string method, string body)
    {
        // ci e' stato correttamente assegnato un nuovo URL
        if (method == URL_REQUEST_GRANTED)
        {
            url = body;
            llOwnerSay(" nuovo url = " + url);                   
            update_gridurl(body);            
        }
        
        else if (method == URL_REQUEST_DENIED)
        {
            llInstantMessage(mykey, "Something went wrong, no url. " + body);
        }
        // lo script e' stato richiamato (da un browser, cliccando su un link...)
        // fa qualcosa
        else if (method == "GET")
        {
                string asd = llGetHTTPHeader(id, "x-query-string"); 
                //llOwnerSay(" query = " + asd);         
                fa(id,asd);
        }
        else
        {
            llHTTPResponse(id,405,"Unsupported method.");
        }
    }


// comunico gli URL dello script
    touch_start(integer total_number)
    {
            llInstantMessage(mykey, "Il mio indirizzo attualmente e' " 
            + url + "  - il link permanente per utilizzarmi e' " + gridurl_indirizzo); 
    }    


     
}

Color change scripts

This listens to the first script and it changes accordingly its color. Chromutate currently uses 3 colors - just reuse the following script and change chat channel to -20242 and -20243.

default
{
    state_entry()
    {
        llListen(-20241, "", "", "");  // you may need to change this, if you changed it in the first script
    }
    listen(integer chan, string name, key id, string msg)  
    {
        llSetLinkColor(-1, (vector)msg, ALL_SIDES);
    }
}

Reflexive Architecture scripts

This listens to the first script and changes accordingly its base color. When an avatar approaches, it changes the object size and color - resuming to original parameters when avatars go away.

// Reflexive Architecture Script 1: Change Size and Color per Avatar Distance
// For Keystone Bouchard. http://www.archsl.wordpress.com for an installation on Architecture Island, September 2007. Scripted by Fumon Kubo

//Shared under Creative Commons Attribution-Share Alike 3.0 License

integer channel = -20243;
string mittente = "LOL_color_controller";

vector NEAR_COL = <1.0, 1.0, 0.0>;
vector FAR_COL; // = <1.0, 4.5, 0.0>;

vector NEAR_SIZE = <.6, 10, .6>;
vector FAR_SIZE = <4, 4, 4>;


float NEAR = 3.0;
float FAR = 9.0;

default
{
    state_entry()
    {
        llListen(channel, mittente, "", "");           
        llSensorRepeat("", NULL_KEY, AGENT, FAR, PI, 0.2);
        llSetScale(FAR_SIZE);
    }

    listen(integer chan, string name, key id, string msg)  
    {
        FAR_COL = (vector)msg;
        llSetLinkColor(-1, FAR_COL, ALL_SIDES);
    }
    
    sensor(integer total_number)
    {
        float distance = llVecMag(llDetectedPos(0) - llGetPos());
        float scale = (distance - NEAR) / (FAR - NEAR);
        if (scale < 0.0) scale = 0.0;
        llSetScale(NEAR_SIZE + ((FAR_SIZE - NEAR_SIZE) * scale));
        llSetColor(NEAR_COL + ((FAR_COL - NEAR_COL) * scale), ALL_SIDES);
    }
}