Difference between revisions of "Object To XML"

From Second Life Wiki
Jump to navigation Jump to search
(New page: These three scripts show how to build a linked set of prims that documents itself with a psuedo-XML output. The PIN setter script is placed in all child prims. The remaining two are plac...)
 
(Page repair: <lsl></lsl> replaced with <syntaxhighlight lang="lsl2"></syntaxhighlight>)
 
Line 7: Line 7:
Choose any legal integer as a PIN before loading the scripts into the prims.
Choose any legal integer as a PIN before loading the scripts into the prims.
The face details function on the child describer doesn't work right now due to script size limitations.
The face details function on the child describer doesn't work right now due to script size limitations.
<lsl>//Child Prim PIN setter
<syntaxhighlight lang="lsl2">//Child Prim PIN setter
integer PIN=1341134;
integer PIN=1341134;


Line 16: Line 16:


     }
     }
}</lsl>
}</syntaxhighlight>


<lsl>//Root Prim Describer
<syntaxhighlight lang="lsl2">//Root Prim Describer
//************
//************
//
//
Line 82: Line 82:
     llListenRemove(channel);
     llListenRemove(channel);
     }
     }
}</lsl>
}</syntaxhighlight>


<lsl>//Child Prim Describer
<syntaxhighlight lang="lsl2">//Child Prim Describer
//(Face Detail functions commented out for now due to script size limits)
//(Face Detail functions commented out for now due to script size limits)


Line 479: Line 479:
         }       
         }       
     }
     }
}</lsl>
}</syntaxhighlight>

Latest revision as of 04:54, 19 April 2016

These three scripts show how to build a linked set of prims that documents itself with a psuedo-XML output. The PIN setter script is placed in all child prims. The remaining two are placed in the root prim. When the set is touched, a dialog is presented. If the description button is clicked the root prim will try to insert the child prim describer script in every other linked prim in a running state. If the insertion is a success, the child prim describes itself to the owner through llOwnerSay and then deletes itself from the child prim.

Choose any legal integer as a PIN before loading the scripts into the prims. The face details function on the child describer doesn't work right now due to script size limitations.

//Child Prim PIN setter
integer PIN=1341134;

default {
	state_entry() {
        llOwnerSay(llGetObjectName()+" : "+(string)llGetKey()+" is ready to accept a describer script using the agreed upon PIN.");
        llSetRemoteScriptAccessPin(PIN);

    }
}
//Root Prim Describer
//************
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
// written by Alfred Differ
// date ~June 2008
// copyright 2008
//
//************

integer channel;
integer PIN = 1341134;

linkSetCommand()
{
	integer linkcount=llGetNumberOfPrims();
    llMessageLinked(1, 1, "describe", ""); 
    integer loop=1;
    integer startparam=0;
    while (loop<=linkcount)
    {
    	if(loop>1) {llRemoteLoadScriptPin(llGetLinkKey(loop), "PrimChildDescriber", PIN, TRUE, startparam);}
        llMessageLinked(loop, loop, "describe", ""); 
        loop++;    
    }
}

default {
    state_entry() 
    {
        llOwnerSay(llGetObjectName()+" : "+(string)llGetKey()+" is ready to push a describer script to all linked prims using the agreed upon PIN.");
    }

	listen(integer chan, string name, key id, string mes)
    {
        if(id == llGetOwnerKey(id))//won't listen to objects unless they aren't in the region.
        	if (llSubStringIndex(mes, "Descriptions") >= 0 )
            {
            	llSay(0, "Starting Description Work");
            	linkSetCommand();
            }
    }

    touch_start(integer total_number)
    {    
    	// Create random channel within range [-1000000000,-2000000000]
		channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);
 		llListen(channel,"", "","");
    	llDialog(llDetectedKey(0), "Please choose the function to run.",
                 ["Test Idea", "Descriptions"], channel);
    	llListenRemove(channel);
    }
}
//Child Prim Describer
//(Face Detail functions commented out for now due to script size limits)

// Original created by Anylyn Hax in the hot summer of 2007.
// Alteration for psuedo-xml output by Alfred Differ July 2008.
// This derivativee version of the code is copyright 2008.
// 
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
// The primary difference for this new version is to switch from ouput 
// appropriate for the llSetPrimitiveParams() function to psuedo-XML for
// use in documentation of large builds.

string header_str;
string footer_str	=	"</prim>";
string pos_str;
string rot_str;
string size_str;
string type_str;
//string face_str;
string mat_str;
string phyz_str;
string phan_str;
string temp_str;
string flex_str;
string point_str;

list booleans = ([
        "FALSE",                    // 0
        "TRUE"                      // 1
        ]);
 
list texgens = ([
        "DEFAULT",      // 0
        "PLANAR"        // 1
        ]);
 
list holeshape = ([
        "DEFAULT",        //   0  default (matches the prim type: square for box, circle for cylinder, etc.)
        "","","","","","","","","","","","","","","",
        "CIRCLE",         //   16  circle
        "","","","","","","","","","","","","","","",
        "SQUARE",         //   32  square
        "","","","","","","","","","","","","","","", 
        "TRIANGLE"        //   48  triangle
        ]);
 
list sculpttype = ([
        "SPHERE",  //   1  sphere (Converge top & bottom, stitch left side to right)  
        "TORUS",   //   2  torus (Stitch top to bottom, stitch left side to right)  
        "PLANE",   //   3  plane (No stitching or converging)  
        "CYLINDER" //   4  cylinder (Stitch left side to right, leave top and bottom open) 
        ]);
 
list bumpmapping = ([
        "NONE",           //   0  none: no bump map  
        "BRIGHT",         //   1  brightness: generate bump map from highlights  
        "DARK",           //   2  darkness: generate bump map from lowlights  
        "WOOD",           //   3  woodgrain  
        "BARK",           //   4  bark  
        "BRICKS",         //   5  bricks  
        "CHECKER",        //   6  checker  
        "CONCRETE",       //   7  concrete  
        "TILE",           //   8  crustytile  
        "TONE",          //   9  cutstone: blocks  
        "DISKS",          //   10  discs: packed circles  
        "GRAVEL",         //   11  gravel  
        "SIDING",         //   13  siding  
        "LARGETILE",      //   14  stonetile  
        "STUCCO",         //   15  stucco  
        "SUCTION",        //   16  suction: rings  
        "WEAVE"           //   17  weave  
        ]);
 
list shinys = ([
        "PRIM_SHINY_NONE",          //   0  none  
        "PRIM_SHINY_LOW",           //   1  low  
        "PRIM_SHINY_MEDIUM",        //   2  medium 
        "PRIM_SHINY_HIGH"           //   3  high  
        ]);
 
list materials =([
        "STONE",      //  0  stone  
        "METAL",      //  1  metal  
        "GLASS",      //  2  glass  
        "WOOD",       //  3  wood  
        "FLESH",      //  4  flesh  
        "PLASTIC",    //  5  plastic  
        "RUBBER",     //  6  rubber  
        "LIGHT"       //  7  light 
        ]);

string fillHeader(integer number)
{
	return "\n<prim\n    name="+llGetObjectName()+"\n\tkey="+(string)llGetKey()+",\n\tlinkNumber="+(string)number+">\n<description>"+llGetObjectDesc()+"</description>\n";
}

string fillPos(list pos)
{
    return "<position value="+(string)llList2Vector(pos, 0)+" />\n";
}

string fillRot(list rot)
{
    return "<rotation value="+(string)llList2Vector(rot, 0)+" />\n";
}

string fillSize(list size)
{
    return "<size value="+(string)llList2Vector(size, 0)+" />\n";
}

string fillTypeDetails(list prim_type)
{
	string output;
	if(llList2Integer(prim_type,0)==0){output = fillTypeBox(prim_type);}
    if(llList2Integer(prim_type,0)==1){output = fillTypeCylinder(prim_type);}
	if(llList2Integer(prim_type,0)==2){output = fillTypePrism(prim_type);}
	if(llList2Integer(prim_type,0)==3){output = fillTypeSphere(prim_type);}
	if(llList2Integer(prim_type,0)==4){output = fillTypeTorus(prim_type);}
	if(llList2Integer(prim_type,0)==5){output = fillTypeTube(prim_type);}
	if(llList2Integer(prim_type,0)==6){output = fillTypeRing(prim_type);}
	if(llList2Integer(prim_type,0)==7){output = fillTypeSculpt(prim_type);}
	return output;
}

string fillTypeBox(list prim_type)
{
	string output = "<type value=box>\n";
    output += "\t<holeshape value="+(string)llList2String(holeshape ,llList2Integer(prim_type,1))+" />\n";
    output += "\t<cut value="+(string)llList2Vector(prim_type,2)+" />\n";
    output += "\t<hollow value="+(string)llList2Float(prim_type,3)+" />\n";
    output += "\t<twist value="+(string)llList2Vector(prim_type,4)+" />\n";
    output += "\t<topsize value="+(string)llList2Vector(prim_type,5)+" />\n";
    output += "\t<topshear value="+(string)llList2Vector(prim_type,6)+" />\n";
    output += "</type>\n";
    return output;
}

string fillTypeCylinder(list prim_type)
{
	string output = "<type value=cylinder>\n";
	output += "\t<holeshape value="+(string)llList2String(holeshape ,llList2Integer(prim_type,1))+" />\n";
	output += "\t<cut value="+(string)llList2Vector(prim_type,2)+" />\n";
	output += "\t<hollow value="+(string)llList2Float(prim_type,3)+" />\n";
	output += "\t<twist value="+(string)llList2Vector(prim_type,4)+" />\n";
	output += "\t<topsize value="+(string)llList2Vector(prim_type,5)+" />\n";
	output += "\t<topshear value="+(string)llList2Vector(prim_type,6)+" />\n";
	output += "</type>\n";
	return output;
}

string fillTypePrism(list prim_type)
{
	string output = "<type value=Prism>\n";
	output += "\t<holeshape value="+(string)llList2String(holeshape ,llList2Integer(prim_type,1))+" />\n";
	output += "\t<cut value="+(string)llList2Vector(prim_type,2)+" />\n";
	output += "\t<hollow value="+(string)llList2Float(prim_type,3)+" />\n";
	output += "\t<twist value="+(string)llList2Vector(prim_type,4)+" />\n";
	output += "\t<topsize value="+(string)llList2Vector(prim_type,5)+" />\n";
	output += "\t<topshear value="+(string)llList2Vector(prim_type,6)+" />\n";
	output += "</type>\n";
	return output;
}

string fillTypeSphere(list prim_type)
{
	string output = "<type value=Sphere>\n";
	output += "\t<holeshape value="+(string)llList2String(holeshape ,llList2Integer(prim_type,1))+" />\n";
	output += "\t<cut value="+(string)llList2Vector(prim_type,2)+" />\n";
	output += "\t<hollow value="+(string)llList2Float(prim_type,3)+" />\n";
	output += "\t<twist value="+(string)llList2Vector(prim_type,4)+" />\n";
	output += "\t<dimple value="+(string)llList2Vector(prim_type,5)+" />\n";
	output += "</type>\n";
	return output;
}

string fillTypeTorus(list prim_type)
{
	string output = "<type value=Torus>\n";
	output += "\t<holeshape value="+(string)llList2String(holeshape ,llList2Integer(prim_type,1))+" />\n";
	output += "\t<cut value="+(string)llList2Vector(prim_type,2)+" />\n";
	output += "\t<hollow value="+(string)llList2Float(prim_type,3)+" />\n";
	output += "\t<twist value="+(string)llList2Vector(prim_type,4)+" />\n";
	output += "\t<holesize value="+(string)llList2Vector(prim_type,5)+" />\n";
	output += "\t<topshear value="+(string)llList2Vector(prim_type,6)+" />\n";
	output += "\t<advancedcut value="+(string)llList2Vector(prim_type,7)+" />\n";
	output += "\t<taper value="+(string)llList2Vector(prim_type,8)+" />\n";
	output += "\t<revs value="+(string)llList2Float(prim_type,9)+" />\n";
	output += "\t<radoffset value="+(string)llList2Float(prim_type,10)+" />\n";
	output += "\t<skew value="+(string)llList2Float(prim_type,11)+"</element>\n";
	output += "</type>\n";
	return output;
}

string fillTypeTube(list prim_type)
{
	string output = "<type value=Tube>\n";
	output += "\t<holeshape value="+(string)llList2String(holeshape ,llList2Integer(prim_type,1))+" />\n";
	output += "\t<cut value="+(string)llList2Vector(prim_type,2)+" />\n";
	output += "\t<hollow value="+(string)llList2Float(prim_type,3)+" />\n";
	output += "\t<twist value="+(string)llList2Vector(prim_type,4)+" />\n";
	output += "\t<holesize value="+(string)llList2Vector(prim_type,5)+" />\n";
	output += "\t<topshear value="+(string)llList2Vector(prim_type,6)+" />\n";
	output += "\t<advancedcut value="+(string)llList2Vector(prim_type,7)+" />\n";
	output += "\t<taper value="+(string)llList2Vector(prim_type,8)+" />\n";
	output += "\t<revs value="+(string)llList2Float(prim_type,9)+" />\n";
	output += "\t<radoffset value="+(string)llList2Float(prim_type,10)+" />\n";
	output += "\t<skew value="+(string)llList2Float(prim_type,11)+" />\n";
	output += "</type>\n";
	return output;
}

string fillTypeRing(list prim_type)
{
	string output = "<type value=Ring>\n";
	output += "\t<\t<holeshape value="+(string)llList2String(holeshape ,llList2Integer(prim_type,1))+" />\n";
	output += "\t<cut value="+(string)llList2Vector(prim_type,2)+" />\n";
	output += "\t<hollow value="+(string)llList2Float(prim_type,3)+" />\n";
	output += "\t<twist value="+(string)llList2Vector(prim_type,4)+" />\n";
	output += "\t<holesize value="+(string)llList2Vector(prim_type,5)+" />\n";
	output += "\t<topshear value="+(string)llList2Vector(prim_type,6)+" />\n";
	output += "\t<advancedcut value="+(string)llList2Vector(prim_type,7)+" />\n";
	output += "\t<taper value="+(string)llList2Vector(prim_type,8)+" />\n";
	output += "\t<revs value="+(string)llList2Float(prim_type,9)+" />\n";
	output += "\t<radoffset value="+(string)llList2Float(prim_type,10)+" />\n";
	output += "\t<skew value="+(string)llList2Float(prim_type,11)+" />\n";
	output += "</type>\n";
	return output;
}

string fillTypeSculpt(list prim_type)
{
	string output = "<type value=Sculpt>\n";
	output += "\t<map value="+(string)llList2String(prim_type,1)+" />\n";
	output += "\t<type value="+(string)llList2Integer(prim_type,2)+" />\n";
	output += "</type>\n";
	return output;
}

string fillFaceDetail(integer sides)
{
	integer i=0;
	list bump_shiny;
	list color;
	list bright;
	list texgen;
	list texture;
	string output="\n<property name=face>\n";

	while(i <= sides) 
    {
    	bump_shiny=llGetPrimitiveParams([PRIM_BUMP_SHINY,i]);
		color=llGetPrimitiveParams([PRIM_COLOR,i]);
		bright=llGetPrimitiveParams([PRIM_FULLBRIGHT,i]);
		texgen=llGetPrimitiveParams([PRIM_TEXGEN ,i]);
		texture=llGetPrimitiveParams([PRIM_TEXTURE,i]);
		
    	output += "\t<facenumber value="+(string)i+" />\n";
        	
		if (bump_shiny != []) 
		{
			output += "\t<element name=bumpshiny>\n";
			output += "\t\t<shine value="+llList2String(shinys,llList2Integer(bump_shiny,0))+" />\n";
			output += "\t\t<bump value="+llList2String(bumpmapping ,llList2Integer(bump_shiny,1))+" />\n";
			output += "\t</element>\n";
			bump_shiny = [];
		}
		if (color != []) 
		{
			output += "\t<element name=color>\n";
			output += "\t\t<color value=>"+(string)llList2Vector(color,0)+" />\n";
			output += "\t\t<alpha value=>"+(string)llList2Float(color,1)+" />\n";
			output += "\t</element>\n";
			color = [];
		}
		if (bright != []) 
		{
			output += "\t<element name=fullbright>\n";
			output += "\t\t<light value=>"+(string)llList2String(booleans ,llList2Integer(bright,0))+" />\n";
			output += "\t</element>\n";
			bright = []; 
		} 
		if (texgen != []) 
		{
			output += "\t<element name=textgen>\n";
			output += "\t\t<mode value="+llList2String(texgens,llList2Integer(texgen,0))+" />\n";
			output += "\t</element>\n";
			texgen = [];
		}
		if (texture != []) 
		{
			output += "\t<element name=texture>\n";
            output += "\t\t<key value="+(string)llList2String(texture,0)+" />\n";
			output += "\t\t<repeats value="+(string)llList2Vector(texture,1)+" />\n";
            output += "\t\t<offsets value="+(string)llList2Vector(texture,2)+" />\n";
			output += "\t\t<rotation value="+(string)llList2Float(texture,3)+" />\n";
            output += "\t</element>\n";
			texture = [];
		}
    	i++;
    }
	output = "\n</property>\n";
	return output;
}

string fillMatDetail(list mat)
{
   	return "<material value="+(string)llList2String(materials ,llList2Integer(mat,0))+" />\n";
}

string fillPhyzDetail(list physics)
{
	string output = "<physics value="+(string)llList2String(booleans ,llList2Integer(physics ,0))+" />\n";
	if (llSubStringIndex(output, "FALSE") >= 0 ) {output="";}
	return output;
}

string fillPhanDetail(list phantom)
{
    string output = "<phantom value="+(string)llList2String(booleans ,llList2Integer(phantom ,0))+" />\n";
    if (llSubStringIndex(output, "FALSE") >= 0 ) {output="";}
    return output;
}

string fillTempDetail(list temprez)
{
	string output = "<temprez value="+(string)llList2String(booleans ,llList2Integer(temprez ,0))+" />\n";
	if (llSubStringIndex(output, "FALSE") >= 0 ) {output="";}
	return output;
}

string fillLightDetail(list light)
{
	string output = "<pointlight>\n";
	output += "\t<enabled value="+(string)llList2String(booleans ,llList2Integer(light,0))+" />\n";
	output += "\t<color value="+(string)llList2Vector(light,1)+" />\n";
	output += "\t<intensity value="+(string)llList2Float(light,2)+" />\n";
	output += "\t<radius value="+(string)llList2Float(light,3)+" />\n";
	output += "\t<falloff value="+(string)llList2Float(light,4)+" />\n";
    output += "</pointlight>\n";
    if (llSubStringIndex(output, "FALSE") >= 0 ) {output="";}
	return output;
}

string fillFlexDetail(list flex)
{
	string output = "<flex>\n";
	output += "\t<enabled value="+(string)llList2String(booleans ,llList2Integer(flex,0))+" />\n";
	output += "\t<softness value="+(string)llList2Integer(flex,1)+" />\n";
	output += "\t<gravity value="+(string)llList2Float(flex,2)+" />\n";
	output += "\t<friction value="+(string)llList2Float(flex,3)+" />\n";
	output += "\t<wind value="+(string)llList2Float(flex,4)+" />\n";
	output += "\t<tension value="+(string)llList2Float(flex,5)+" />\n";
	output += "\t<force value="+(string)llList2Vector(flex,6)+" />\n";
	output += "</flex>\n";
	if (llSubStringIndex(output, "FALSE") >= 0 ) {output="";}
	return output;
}

default
{
    link_message(integer sender_number, integer number, string message, key id)
    {
	header_str 	= fillHeader(number); 
        pos_str 	= fillPos(llGetPrimitiveParams([PRIM_POSITION]));
	rot_str 	= fillRot(llGetPrimitiveParams([PRIM_ROTATION]));
	size_str 	= fillSize(llGetPrimitiveParams([PRIM_SIZE]));
        type_str 	= fillTypeDetails(llGetPrimitiveParams([PRIM_TYPE]));
        //face_str 	= fillFaceDetail(llGetNumberOfSides());
        mat_str		= fillMatDetail(llGetPrimitiveParams([PRIM_MATERIAL]));
	phyz_str	= fillPhyzDetail(llGetPrimitiveParams([PRIM_PHYSICS]));
	phan_str	= fillPhanDetail(llGetPrimitiveParams([PRIM_PHANTOM]));
	temp_str	= fillTempDetail(llGetPrimitiveParams([PRIM_TEMP_ON_REZ]));
	point_str	= fillLightDetail(llGetPrimitiveParams([PRIM_POINT_LIGHT]));
	flex_str	= fillFlexDetail(llGetPrimitiveParams([PRIM_FLEXIBLE]));

		llOwnerSay(header_str+pos_str+rot_str+size_str+type_str+point_str+mat_str+phyz_str+phan_str+temp_str+flex_str+footer_str);
        llOwnerSay((string)llGetFreeMemory() + " Bytes");   
        if (number != 1) 
        {
        	llRemoveInventory(llGetScriptName());
        }      
    }
}