JJValero Writer Posted January 9, 2013 Posted January 9, 2013 Platonic Generator is a tool to tessellatethe five platonic objects; Tetrahedron, Hexahedron, Octahedron, Icosahedron and Dodecahedron. This is a new version able of create bigger structures due the new limit of 64 m and other minor changes. The first step is to create two primitives and link in one object and drop inside this script.// This script create the object "Platonic Generator 0.4.7" and autodelete. // Put this in the inventory of a linset with 2 prims. default { state_entry() { if (llGetNumberOfPrims() != 2) { llOwnerSay("ERROR: The linkset must be of 2 prims"); return; } // if llSetLinkPrimitiveParamsFast( LINK_THIS, [ PRIM_NAME, "Platonic Generator 0.4.7", PRIM_TYPE, PRIM_TYPE_SCULPT, "71eeddee-a441-eace-6b2d-e3180dbb082a", PRIM_SCULPT_TYPE_PLANE, PRIM_SIZE, <0.9, 0.9, 0.9>, PRIM_MATERIAL, PRIM_MATERIAL_METAL, PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1.0, 1.0, 0.0>, ZERO_VECTOR, PI_BY_TWO, PRIM_COLOR, ALL_SIDES, <0.6, 0.6, 0.6>, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, PRIM_SHINY_MEDIUM, PRIM_BUMP_NONE ]); llSetLinkPrimitiveParamsFast( LINK_ALL_CHILDREN, [ PRIM_TYPE, PRIM_TYPE_SPHERE, PRIM_HOLE_DEFAULT, <0.0, 1.0, 0.0>, 0.0, ZERO_VECTOR, <0.0, 1.0, 0.0>, PRIM_SIZE, <1.1, 1.1, 1.1>, PRIM_POS_LOCAL, ZERO_VECTOR, PRIM_ROT_LOCAL, llEuler2Rot(<0.0, 90.0, 0.0> * DEG_TO_RAD), PRIM_MATERIAL, PRIM_MATERIAL_GLASS, PRIM_TEXTURE, ALL_SIDES, "990d1249-0b61-13bc-9a0c-cbad5f120aed", <1.0, 1.0, 0.0>, ZERO_VECTOR, -PI_BY_TWO, PRIM_COLOR, ALL_SIDES, <1.0, 1.0, 1.0>, 0.6, PRIM_FULLBRIGHT, ALL_SIDES, TRUE, PRIM_GLOW, ALL_SIDES, 0.05]); llSetLinkTextureAnim(LINK_ALL_CHILDREN, ANIM_ON | SMOOTH | LOOP, ALL_SIDES, 1, 1, 1.0, 1, 0.02); llRemoveInventory(llGetScriptName()); } // state_entry changed(integer change) { if ((change & CHANGED_LINK) == CHANGED_LINK) { llResetScript(); } // if } // changed } // default Now you have a nice object but useless. Second step. Now, create other object and drop this other script inside.string MSG_DELETE = "delete"; string MSG_PURGE = "purge"; string MSG_OK = "OK"; string MSG_NEXT = "NEXT"; string MSG_NODE_SIZE = "node_size"; string MSG_EDGE_THICKNESS = "edge_thickness"; string MSG_TRIANGLE_THICK = "triangle_thickness"; vector AXIS_UP = <0,0,1>; // Constants for piece types. string PRIM_TYPE_NODE = "NODE"; string PRIM_TYPE_EDGE = "EDGE"; string PRIM_TYPE_TRIANGLE = "TRIANGLE"; string PRIM_TYPE_RECTANGLE = "RECTANGLE"; string TRIANGLE_TEXTURE = "1f93926c-966d-9cb3-126c-1341b71a457d"; string CLEAR_TEXTURE = "f54a0c32-3cd1-d49a-5b4f-7b792bebc204"; float TIMEOUT = 3.0; integer g_iListenDesc; integer g_iChannel; string g_sPieceType; key g_kRezzerKey; // // Protocol Anti-Fail // // 1 Rezzer -------------- rez ---------------> Object // 2 Rezzer <---------- whisper "OK" ---------- Object // 3 Rezzer ------- whisper parameters -------> Object // 4 Rezzer <-------- shout "NEXT" ----------- Object // // If object no receive parameters in TIMEOUT seconds, say again "OK" // If object no receive NEXT in TIMEOUT seconds, check object position, // it is in the same position, whisper again parameters, else, rez the // next object. executeMessage(string message) { vector start_pos = llGetPos(); list lTok = llParseString2List(message, ["|"], []); g_sPieceType = llList2String(lTok, 0); if (g_sPieceType == PRIM_TYPE_NODE) { vector target_pos = (vector) llList2String(lTok, 1); float fSize = (float) llList2String(lTok, 2); integer iNumNode = (integer) llList2String(lTok, 3); llSetRegionPos(target_pos); llSetLinkPrimitiveParamsFast(LINK_THIS, [ PRIM_POSITION, target_pos, PRIM_SIZE, <fSize, fSize, fSize>, PRIM_TYPE, PRIM_TYPE_SPHERE, PRIM_HOLE_DEFAULT, <0.0, 1.0, 0.0>, 0.0, ZERO_VECTOR, <0.0, 1.0, 0.0>, PRIM_NAME, g_sPieceType ]); if (iNumNode >= 0) { llSetText((string) iNumNode, <1.0, 1.0, 1.0>, 1.0); } // if } else if (g_sPieceType == PRIM_TYPE_EDGE) { vector v1 = (vector) llList2String(lTok, 1); vector v2 = (vector) llList2String(lTok, 2); float thickness = (float) llList2String(lTok, 3); vector target_pos = (v2 + v1) / 2; llSetRegionPos(target_pos); llSetLinkPrimitiveParamsFast(LINK_THIS, [ PRIM_POSITION, target_pos, PRIM_ROTATION, llGetRot() * llRotBetween(AXIS_UP * llGetRot(), v2 - v1), PRIM_SIZE, <thickness, thickness, llVecDist(v2, v1)>, PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_DEFAULT, <0.0, 1.0, 0.0>, 0.0, ZERO_VECTOR, <1.0, 1.0, 0.0>, ZERO_VECTOR, PRIM_NAME, g_sPieceType ]); } else if (g_sPieceType == PRIM_TYPE_TRIANGLE) { vector scale = (vector) llList2String(lTok, 1); float y_shear = (float) llList2String(lTok, 2); vector target_pos = (vector) llList2String(lTok, 3); rotation rRot = (rotation) llList2String(lTok, 4); llSetRegionPos(target_pos); llSetLinkPrimitiveParamsFast(LINK_THIS, [ PRIM_POSITION, target_pos, PRIM_TYPE, PRIM_TYPE_BOX, 0, <0.0, 1.0, 0.0>, 0.0, <0.0, 0.0, 0.0>, <1.0, 0.0, 0.0>, <0.0, y_shear, 0.0>, PRIM_SIZE, scale, PRIM_ROTATION, rRot, PRIM_NAME, g_sPieceType, PRIM_COLOR, ALL_SIDES, <1.0, 1.0, 1.0>, 0.5, PRIM_TEXTURE, 0, CLEAR_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, PRIM_TEXTURE, 1, CLEAR_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, PRIM_TEXTURE, 2, TRIANGLE_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, PRIM_TEXTURE, 3, CLEAR_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, PRIM_TEXTURE, 4, TRIANGLE_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, PRIM_TEXTURE, 5, CLEAR_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0 ]); } else if (g_sPieceType == PRIM_TYPE_RECTANGLE) { vector scale = (vector) llList2String(lTok, 1); float y_tape = 1.0 - (float) llList2String(lTok, 2); float y_shear = (float) llList2String(lTok, 3); vector target_pos = (vector) llList2String(lTok, 4); rotation rRot = (rotation) llList2String(lTok, 5); llSetRegionPos(target_pos); llSetLinkPrimitiveParamsFast(LINK_THIS, [ PRIM_POSITION, target_pos, PRIM_TYPE, PRIM_TYPE_BOX, 0, <0.0, 1.0, 0.0>, 0.0, <0.0, 0.0, 0.0>, <1.0, y_tape, 0.0>, <0.0, y_shear, 0.0>, PRIM_SIZE, scale, PRIM_ROTATION, rRot, PRIM_NAME, g_sPieceType, PRIM_COLOR, ALL_SIDES, <1.0, 1.0, 1.0>, 0.5, PRIM_TEXTURE, 0, CLEAR_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, PRIM_TEXTURE, 1, CLEAR_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, PRIM_TEXTURE, 2, TRIANGLE_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, PRIM_TEXTURE, 3, CLEAR_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, PRIM_TEXTURE, 4, TRIANGLE_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, PRIM_TEXTURE, 5, CLEAR_TEXTURE, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0 ]); } // if } // executeMessage default { state_entry() { llSetText("", ZERO_VECTOR, 0.0); llSetLinkPrimitiveParamsFast(LINK_THIS, [ PRIM_TYPE, PRIM_TYPE_BOX, PRIM_HOLE_DEFAULT, <0.0, 1.0, 0.0>, 0.0, ZERO_VECTOR, <1.0, 1.0, 0.0>, ZERO_VECTOR, PRIM_SIZE, <0.5, 0.5, 0.5>, PRIM_ROTATION, ZERO_ROTATION, PRIM_NAME, "Object", PRIM_COLOR, ALL_SIDES, <1.0, 1.0, 1.0>, 1.0, PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0 ]); } // state_entry state_exit() { llSetTimerEvent(0.0); llListenRemove(g_iListenDesc); } // state_exit on_rez(integer start_param) { g_iChannel = start_param; g_iListenDesc = llListen(g_iChannel, "", NULL_KEY, ""); if (g_iChannel != 0) { llSetTimerEvent(TIMEOUT); llWhisper(g_iChannel, MSG_OK); } // if } // on_rez listen(integer channel, string name, key id, string message) { if (llGetOwnerKey(id) != llGetOwner()) { return; } // if if ((id == llGetKey()) || (channel == 0)) { return; } // if llSetTimerEvent(0.0); g_kRezzerKey = id; llWhisper(channel, MSG_NEXT); executeMessage(message); state InPos; } // listen timer() { llWhisper(g_iChannel, MSG_OK); } // timer } // default state InPos { state_entry() { llListen(g_iChannel, "", g_kRezzerKey, ""); } // state_entry listen(integer channel, string name, key id, string message) { if (llGetOwnerKey(id) != llGetOwner()) { return; } // if if ((id == llGetKey()) || (channel == 0)) { return; } // if list lTok = llParseString2List(message, ["|"], []); string sMsg = llList2String(lTok, 0); if (sMsg == MSG_DELETE) { llDie(); } else if (sMsg == MSG_PURGE) { llRemoveInventory(llGetScriptName()); } else if ((sMsg == MSG_NODE_SIZE) && (g_sPieceType == PRIM_TYPE_NODE)) { float fSize = (float) llList2String(lTok, 1); llSetLinkPrimitiveParamsFast(LINK_THIS, [ PRIM_SIZE, <fSize, fSize, fSize>]); } else if ((sMsg == MSG_EDGE_THICKNESS) && (g_sPieceType == PRIM_TYPE_EDGE)) { vector vSize = llGetScale(); float fSize = (float) llList2String(lTok, 1); llSetLinkPrimitiveParamsFast(LINK_THIS, [ PRIM_SIZE, <fSize, fSize, vSize.z>]); } else if ((sMsg == MSG_TRIANGLE_THICK) && (g_sPieceType == PRIM_TYPE_TRIANGLE)) { vector vSize = llGetScale(); float fSize = (float) llList2String(lTok, 1); llSetLinkPrimitiveParamsFast(LINK_THIS, [ PRIM_SIZE, <fSize, vSize.y, vSize.z>]); } else if ((sMsg == MSG_TRIANGLE_THICK) && (g_sPieceType == PRIM_TYPE_RECTANGLE)) { vector vSize = llGetScale(); float fSize = (float) llList2String(lTok, 1); llSetLinkPrimitiveParamsFast(LINK_THIS, [ PRIM_SIZE, <fSize, vSize.y, vSize.z>]); } // if } // listen } // InPosNow you have an object with name "Object". Please, do not change the name. Third step. Take the object with name "Object" and put in the inventory of the first object with name "Platonic Generator 0.4.7". Fourth step. Drop in the Platonic Generator this script://_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ //_/_/ _/_/ //_/_/ PLATONIC GENERATOR _/_/ //_/_/ By: JJValero Writer _/_/ //_/_/ _/_/ //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ //_/_/ //_/_/ CONSTANTS float GOLDEN = 1.618; // NO CHANGE THIS VALUE. http://www.mathopenref.com/rectanglegolden.html float EDGE_SIDE = 3.0; // Default length of edge. (min = 1, max = 10) float MAX_EDGE_SIDE = 35.0; float MIN_EDGE_SIDE = 1.0; float EDGE_THICKNESS = 0.3; // default thickness of edge 0 = OFF float MAX_EDGE_THICK = 3.0; float MIN_EDGE_THICK = 0.0; float NODE_SIZE = 0.4; // default size of node. float MAX_NODE_SIZE = 3.0; float MIN_NODE_SIZE = 0.0; float TRIANGLE_THICKNESS = 0.03; // default thickness of triangle 0 = OFF float MAX_TRIANGLE_THICK = 1.0; float MIN_TRIANGLE_THICK = 0.0; string OBJECT_TO_REZ = "Object"; integer CHANNEL = -884726; // channel for comunicate position to edges. integer USER_CHANNEL = 5; // user channel. integer DEVELOP_MODE = FALSE; // If TRUE, spheres shows the node number in floating text. //----------------------------------- // Structures supported. string STRUCT_TETRAHEDRON = "Tetrahedron"; string STRUCT_HEXAHEDRON = "Hexahedron"; string STRUCT_OCTAHEDRON = "Octahedron"; string STRUCT_ICOSAHEDRON = "Icosahedron"; string STRUCT_DODECAHEDRON = "Dodecahedron"; string TETRAHEDRON_SCULPT = "1646063c-baf9-fb2e-fc2b-c74b992f178e"; string HEXAHEDRON_SCULPT = "3496f3c6-3b09-c052-fe00-59235dc57ddf"; string OCTAHEDRON_SCULPT = "5cce4c13-ba04-deba-aa93-e7b197e35670"; string ICOSAHEDRON_SCULPT = "71eeddee-a441-eace-6b2d-e3180dbb082a"; string DODECAHEDRON_SCULPT = "8bbe9747-8d89-a339-671d-09df4f664065"; // If you change one of those constants, check scripts of node and edge objects. // ............................................................................... // chat commands string MSG_DELETE = "delete"; string MSG_PURGE = "purge"; string MSG_REZ = "rez"; string MSG_HELP = "help"; string MSG_MENU = "menu"; string MSG_OK = "OK"; // The object says OK when it is rezzed. string MSG_NEXT = "NEXT"; // The object says NEXT when received parameters. string MSG_NODE_SIZE = "node_size"; // Says to nodes their new size. string MSG_EDGE_THICKNESS = "edge_thickness"; // Says to edges their new thickness. string MSG_TRIANGLE_THICK = "triangle_thickness"; // Says to triangles their new thickness. // ............................................................................... string PRIM_TYPE_NODE = "NODE"; string PRIM_TYPE_EDGE = "EDGE"; string PRIM_TYPE_TRIANGLE = "TRIANGLE"; string PRIM_TYPE_RECTANGLE = "RECTANGLE"; // ............................................................................... // Main Menu options string OPC_DELETE = "Delete"; string OPC_PURGE = "Purge"; string OPC_REZ = "Rez"; string OPC_STRUCT = "Struct"; string OPC_SIZE = "Size"; string OPC_EDGE_THICK = "Edge Thick"; string OPC_NODE_SIZE = "Node Size"; string OPC_TRIANGLE_THICK = "Tr. Thick"; string OPC_RETURN = "Return"; string OPC_DONE = "Done"; string OPC_VERBOSE = "Verbose"; string OPC_QUIET = "Quiet"; // Size options string OPC_SIZEP1 = "+1"; string OPC_SIZEL1 = "-1"; string OPC_SIZEP05 = "+0.5"; string OPC_SIZEL05 = "-0.5"; string OPC_SIZEP01 = "+0.1"; string OPC_SIZEL01 = "-0.1"; string OPC_SIZEP005 = "+0.05"; string OPC_SIZEL005 = "-0.05"; string OPC_SIZEP001 = "+0.01"; string OPC_SIZEL001 = "-0.01"; string OPC_MAX = "Max"; string OPC_MIN = "Min"; string OPC_OFF = "Off"; // Triangle Stuff //float DELTA = 0.01; // Minimal distance between 2 vertices. float TIMEOUT = 6.0; //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ //_/_/ //_/_/ GLOBALS list g_lRelPos; // Position of all nodes list g_lConnectList; // pair of node numbers, every pair is one edge. list g_lTriangleList; // List os triangle nodes list g_lRectangleList; // List of rectangles integer g_iListenDesc; // listen descriptor of user channel. integer g_iUserListenDesc; // listen descriptor of build channel. integer g_iCounter; integer g_iMax; vector g_vSavedPos; integer g_bVerbose; string g_sActualMenu; string g_sActualStruct; // structure to rez float g_fEdgeLength; // Length of the edge. (Max is 10 m) float g_fEdgeThick; // Thickness of edge. float g_fNodeSize; // Size of the node. float g_fTriangleDepth; // thickness of triangles rezzed string g_sObjectParams; // Parameters to send to object. //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ //_/_/ //_/_/ FUNCTIONS // List of coordinates taken from http://en.wikipedia.org/wiki/Icosahedron list getNodeList(float fSize) { float A = fSize / 2; float B = (fSize * GOLDEN) / 2; float C = (fSize * (1.0 / GOLDEN)) / 2; list lRelPos = []; if (g_sActualStruct == STRUCT_ICOSAHEDRON) { lRelPos = [ <0, A, B>, <0, A, -B>, <0, -A, B>, <0, -A, -B>, <A, B, 0>, <A, -B, 0>, <-A, B, 0>, <-A, -B, 0>, <B, 0, A>, <-B, 0, A>, <B, 0, -A>, <-B, 0, -A> ]; } else if (g_sActualStruct == STRUCT_DODECAHEDRON) { lRelPos = [ <-A, -A, -A>, <-A, -A, A>, <-A, A, -A>, <-A, A, A>, < A, -A, -A>, < A, -A, A>, < A, A, -A>, < A, A, A>, < 0, C, B>, < 0, C, -B>, < 0, -C, B>, < 0, -C, -B>, < C, B, 0>, < C, -B, 0>, <-C, B, 0>, <-C, -B, 0>, < B, 0, C>, < B, 0, -C>, <-B, 0, C>, <-B, 0, -C> ]; } else if (g_sActualStruct == STRUCT_TETRAHEDRON) { lRelPos = [<A, A, A>, <-A, -A, A>, <-A, A, -A>, <A, -A, -A>]; } else if (g_sActualStruct == STRUCT_HEXAHEDRON) { lRelPos = [ <A, A, A>, <A, A, -A>, <A, -A, A>, <A, -A, -A>, <-A, A, A>, <-A, A, -A>, <-A, -A, A>, <-A, -A, -A> ]; } else if (g_sActualStruct == STRUCT_OCTAHEDRON) { lRelPos = [<A, 0, 0>, <-A, 0, 0>, <0, A, 0>, <0, -A, 0>, <0, 0, A>, <0, 0, -A>]; } // if return lRelPos; } // getNodeList //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ list getConnectList() { list lConnectList = []; if (g_sActualStruct == STRUCT_ICOSAHEDRON) { lConnectList = [ 0, 2, 0, 9, 0, 6, 0, 4, 0, 8, 1, 6, 1, 11, 1, 3, 1, 10, 1, 4, 6, 4, 6, 9, 6, 11, 4, 8, 4, 10, 10, 3, 3, 11, 11, 9, 9, 2, 2, 8, 8, 10, 5, 3, 5, 10, 5, 8, 5, 2, 5, 7, 7, 2, 7, 9, 7, 11, 7, 3 ]; } else if (g_sActualStruct == STRUCT_DODECAHEDRON) { lConnectList = [ 0, 19, 0, 15, 0, 11, 2, 19, 2, 9, 2, 14, 9, 11, 9, 6, 19, 18, 18, 3, 3, 14, 6, 12, 12, 14, 6, 17, 17, 4, 4, 11, 4, 13, 13, 15, 18, 1, 1, 15, 13, 5, 5, 16, 16, 17, 1, 10, 10, 5, 10, 8, 8, 3, 8, 7, 7, 16, 7, 12 ]; } else if (g_sActualStruct == STRUCT_TETRAHEDRON) { lConnectList = [ 0, 1, 0, 2, 0, 3, 1, 2, 1, 3, 2, 3 ]; } else if (g_sActualStruct == STRUCT_HEXAHEDRON) { lConnectList = [ 0, 1, 1, 3, 3, 2, 2, 0, 4, 5, 5, 7, 7, 6, 6, 4, 0, 4, 2, 6, 1, 5, 3, 7 ]; } else if (g_sActualStruct == STRUCT_OCTAHEDRON) { lConnectList = [ 4, 0, 4, 1, 4, 2, 4, 3, 5, 0, 5, 1, 5, 2, 5, 3, 0, 2, 2, 1, 1, 3, 3, 0 ]; } // if return lConnectList; } // getConnectList //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ list getTriangleList() { list lConnectList = []; if (g_sActualStruct == STRUCT_ICOSAHEDRON) { lConnectList = [ 0, 4, 6, 0, 6, 9, 0, 8, 4, 0, 8, 2, 0, 2, 9, 3, 7, 5, 3, 5, 10, 3, 10, 1, 3, 1, 11, 3, 11, 7, 1, 6, 11, 6, 11, 9, 11, 9, 7, 9, 7, 2, 7, 2, 5, 2, 5, 8, 5, 8, 10, 8, 10, 4, 10, 4, 1, 4, 1, 6 ]; } else if (g_sActualStruct == STRUCT_DODECAHEDRON) { lConnectList = [ 17, 4, 6, 19, 0, 2, 9, 6, 2, 11, 0, 4, 4, 13, 17, 6, 17, 12, 0, 19, 15, 14, 2, 19, 18, 1, 3, 8, 10, 7, 10, 1, 5, 8, 7, 3 ]; } else if (g_sActualStruct == STRUCT_TETRAHEDRON) { lConnectList = [ 0, 1, 2, 0, 2, 3, 0, 1, 3, 1, 3, 2 ]; } else if (g_sActualStruct == STRUCT_OCTAHEDRON) { lConnectList = [ 4, 0, 2, 4, 2, 1, 4, 1, 3, 4, 3, 0, 5, 0, 2, 5, 2, 1, 5, 1, 3, 5, 3, 0 ]; } // if return lConnectList; } // getTriangleList //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ list getRectangleList() { list lConnectList = []; if (g_sActualStruct == STRUCT_DODECAHEDRON) { lConnectList = [ 4, 6, 11, 9, 2, 0, 9, 11, 6, 2, 12, 14, 0, 4, 15, 13, 14, 19, 3, 18, 19, 15, 18, 1, 13, 17, 5, 16, 17, 12, 16, 7, 7, 3, 12, 14, 1, 5, 15, 13, 10, 7, 5, 16, 3, 1, 8, 10 ]; } else if (g_sActualStruct == STRUCT_HEXAHEDRON) { lConnectList = [ 1, 3, 0, 2, 3, 7, 2, 6, 7, 5, 6, 4, 5, 1, 4, 0, 5, 1, 7, 3, 4, 0, 6, 2 ]; } // if return lConnectList; } // getRectangleList //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ string decimalTrunc(float fIn) { float fIn = (float)((string) fIn); integer iIn = (integer) (fIn * 100); integer iIntPart = iIn / 100; integer iDecimal = iIn % 100; string sDecimal; if (iDecimal < 10) { sDecimal = "0" + (string) iDecimal; } else { sDecimal = (string) iDecimal; } // if string sOut = (string) iIntPart + "." + sDecimal; if (sOut == "0.00") { sOut = "Off"; } // if return sOut; } // decimalTrunc //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ showConfig() { string sMsg = "Selected: " + g_sActualStruct + "\n"; sMsg += "Size: " + decimalTrunc(g_fEdgeLength) + "\n"; sMsg += "Edge thickness: " + decimalTrunc(g_fEdgeThick) + "\n"; sMsg += "Node Size: " + decimalTrunc(g_fNodeSize) + "\n"; sMsg += "Triangle thickness: " + decimalTrunc(g_fTriangleDepth) + "\n"; llSetText(sMsg, <1.0, 1.0, 1.0>, 1.0); } // showConfig //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ // safe_posJum, do not work in various regions. // Changed by a combination of llSetRegionPos and llSetLinkPrimitiveParamsFast. safe_posJump(vector target_pos) { llSetRegionPos(target_pos); llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POSITION, target_pos]); } // safe_posJump //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ showHelp() { string sChan = "\t/" + (string) USER_CHANNEL + " "; string sMsg = "\n"; sMsg += sChan + MSG_HELP + "\tshows this message.\n"; sMsg += sChan + MSG_REZ + "\tfor rez " + g_sActualStruct + ".\n"; sMsg += sChan + MSG_DELETE + "\tfor delete " + g_sActualStruct + ".\n"; sMsg += sChan + MSG_PURGE + "\tfor remove scripts.\n"; sMsg += sChan + MSG_MENU + "\tshows main menu."; llOwnerSay(sMsg); } // showHelp //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ mainMenu(key kUser) { list lOptions = [ OPC_DONE, "." ]; if (g_bVerbose) { lOptions += [ OPC_QUIET ]; } else { lOptions += [ OPC_VERBOSE ]; } // if lOptions += [ OPC_DELETE, OPC_PURGE, OPC_REZ, OPC_EDGE_THICK, OPC_NODE_SIZE, OPC_TRIANGLE_THICK, OPC_STRUCT, OPC_SIZE, "." ]; g_sActualMenu = ""; string sMsg = "Options\n"; sMsg += " " + OPC_DONE + ":\t Close this dialog box.\n"; if (g_bVerbose) { sMsg += " " + OPC_QUIET + ":\t Quiet mode.\n"; } else { sMsg += " " + OPC_VERBOSE + ": Verbose mode.\n"; } // if sMsg += " " + OPC_DELETE + ":\tDelete the structure.\n"; sMsg += " " + OPC_PURGE + ":\t Remove scripts from objects.\n"; sMsg += " " + OPC_REZ + ":\t\t Rez the structure.\n"; sMsg += " " + OPC_STRUCT + ":\tSelect structure.\n"; sMsg += " " + OPC_SIZE + ":\t\tChanges size.\n"; sMsg += " " + OPC_EDGE_THICK + ":\tChanges thickness of edge.\n"; sMsg += " " + OPC_NODE_SIZE + ":\tChanges node size.\n"; sMsg += " " + OPC_TRIANGLE_THICK + ":\tChanges thickness of triangle.\n"; llDialog(kUser,sMsg, lOptions, USER_CHANNEL); } // mainMenu //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ structMenu(key kUser) { list lOptions = [ OPC_RETURN, ".", OPC_DONE, STRUCT_ICOSAHEDRON, STRUCT_DODECAHEDRON, STRUCT_TETRAHEDRON, STRUCT_HEXAHEDRON, STRUCT_OCTAHEDRON ]; string sMsg = "Options\n"; sMsg += "Structure selected: " + g_sActualStruct + "\n\n"; sMsg += " Select one of the listed structures."; llDialog(kUser,sMsg, lOptions, USER_CHANNEL); } // structMenu //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ sizeMenu(key kUser) { g_sActualMenu = OPC_SIZE; list lOptions = [ OPC_RETURN, ".", OPC_DONE, OPC_SIZEL1, OPC_SIZEL05, OPC_SIZEL01, OPC_SIZEP1, OPC_SIZEP05, OPC_SIZEP01, OPC_MAX, OPC_MIN ]; string sMsg = "Options\n"; sMsg += "Actual size is : " + decimalTrunc(g_fEdgeLength) + "\n\n"; llDialog(kUser,sMsg, lOptions, USER_CHANNEL); } // sizeMenu //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ edgeMenu(key kUser) { g_sActualMenu = OPC_EDGE_THICK; list lOptions = [ OPC_RETURN, ".", OPC_DONE, OPC_SIZEL01, OPC_SIZEL005, OPC_SIZEL001, OPC_SIZEP01, OPC_SIZEP005, OPC_SIZEP001, OPC_MAX, OPC_MIN, OPC_OFF ]; string sMsg = "Options\n"; sMsg += "Actual edge thickness is : " + decimalTrunc(g_fEdgeThick) + "\n\n"; llDialog(kUser,sMsg, lOptions, USER_CHANNEL); } // edgeMenu //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ nodeMenu(key kUser) { g_sActualMenu = OPC_NODE_SIZE; list lOptions = [ OPC_RETURN, ".", OPC_DONE, OPC_SIZEL01, OPC_SIZEL005, OPC_SIZEL001, OPC_SIZEP01, OPC_SIZEP005, OPC_SIZEP001, OPC_MAX, OPC_MIN, OPC_OFF ]; string sMsg = "Options\n"; sMsg += "Actual node size is : " + decimalTrunc(g_fNodeSize) + "\n\n"; llDialog(kUser,sMsg, lOptions, USER_CHANNEL); } // nodeMenu //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ triangleMenu(key kUser) { g_sActualMenu = OPC_TRIANGLE_THICK; list lOptions = [ OPC_RETURN, ".", OPC_DONE, OPC_SIZEL01, OPC_SIZEL005, OPC_SIZEL001, OPC_SIZEP01, OPC_SIZEP005, OPC_SIZEP001, OPC_MAX, OPC_MIN, OPC_OFF ]; string sMsg = "Options\n"; sMsg += "Actual triangle thickness is : " + decimalTrunc(g_fTriangleDepth) + "\n\n"; llDialog(kUser,sMsg, lOptions, USER_CHANNEL); } // triangleMenu //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ rez_triangle(vector a, vector b, vector c) { vector origin = llGetPos(); a = origin + a; b = origin + b; c = origin + c; float fSideAB = llVecDist(a, b); float fSideBC = llVecDist(b, c); float fSideCA = llVecDist(c, a); if ((fSideAB >= fSideBC) && (fSideAB >= fSideCA)) { triangle(c, a, b); } else if ((fSideBC >= fSideAB) && (fSideBC >= fSideCA)) { triangle(a, b, c); } else if ((fSideCA >= fSideAB) && (fSideCA >= fSideBC)) { triangle(b, c, a); } // if } // rez_triangle triangle(vector a, vector b, vector c) { float width = llVecDist(b, c); vector left = llVecNorm(b - c); vector fwd = llVecNorm(left % (a - c)); vector up = fwd % left; float height = (a - c) * up; float fShear = 0.5 - ((b-a) * left) / width; vector vPos = 0.5 * ((b+c) + (height * up)); vector vScale = <g_fTriangleDepth, width, height>; rotation rRot = llAxes2Rot(fwd, left, up); g_sObjectParams = PRIM_TYPE_TRIANGLE + "|" + (string) vScale + "|" + (string) fShear + "|" + (string) vPos + "|" + (string) rRot; llRezObject(OBJECT_TO_REZ, llGetPos(), ZERO_VECTOR, ZERO_ROTATION, CHANNEL); } // triangle //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ // "rez_triangle()" and "triangle()" functions are based in a freebie of "seifer surface" rez_rectangle(vector a, vector b, vector c, vector d) { vector origin = llGetPos(); a = origin + a; b = origin + b; c = origin + c; d = origin + d; if (llVecDist(a, b) >= llVecDist(c, d)) { rectangle(a, b, c, d); } else { rectangle(c, d, a, b); } // if } // rez_rectangle rectangle(vector a, vector b, vector c, vector d) { float width = llVecDist(a, b); vector left = llVecNorm(a - b); vector fwd = llVecNorm(left % (a - c)); vector up = fwd % left; float height = (a - c) * up; float fShear = 0.0; vector vPos = (a + b + c+ d) / 4; //0.5 * ((b+c) + (height * up)); vector vScale = <g_fTriangleDepth, width, height>; rotation rRot = llAxes2Rot(fwd, left, up); float fTape = (llVecDist(c, d) / llVecDist(a, b)) - 1.0; //float fTape = -0.35; //1.0; g_sObjectParams = PRIM_TYPE_RECTANGLE + "|" + (string) vScale + "|" + (string) fTape + "|" + (string) fShear + "|" + (string) vPos + "|" + (string) rRot; llRezObject(OBJECT_TO_REZ, llGetPos(), ZERO_VECTOR, ZERO_ROTATION, CHANNEL); } // rectangle //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ rez_node(vector a) { vector vNodePos = llGetPos() + a; integer iNumNode = -1; if (DEVELOP_MODE) { iNumNode = g_iCounter; } // if g_sObjectParams = PRIM_TYPE_NODE + "|"+ (string) vNodePos + "|" + (string) g_fNodeSize + "|" + (string) iNumNode; llRezObject(OBJECT_TO_REZ, llGetPos(), ZERO_VECTOR, ZERO_ROTATION, CHANNEL); } // rez_node //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ rez_edge(vector a, vector b) { vector origin = llGetPos(); a = origin + a; b = origin + b; g_sObjectParams = PRIM_TYPE_EDGE + "|" + (string) a + "|" + (string) b + "|" + (string) g_fEdgeThick; llRezObject(OBJECT_TO_REZ, llGetPos(), ZERO_VECTOR, ZERO_ROTATION, CHANNEL); } // rez_edge //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ //_/_/ //_/_/ STATES default { state_entry() { // Default settings. g_sActualStruct = STRUCT_ICOSAHEDRON; g_fEdgeLength = EDGE_SIDE; g_fEdgeThick = EDGE_THICKNESS; g_fNodeSize = NODE_SIZE; g_fTriangleDepth = TRIANGLE_THICKNESS; g_bVerbose = FALSE; g_sActualMenu = ""; llSetLinkPrimitiveParamsFast( LINK_THIS, [ PRIM_TYPE, PRIM_TYPE_SCULPT, ICOSAHEDRON_SCULPT, PRIM_SCULPT_TYPE_PLANE, PRIM_SIZE, <0.9, 0.9, 0.9> ]); llSetLinkTextureAnim(LINK_ALL_CHILDREN, ANIM_ON | SMOOTH | LOOP, ALL_SIDES, 1, 1, 1.0, 1, 0.02); llOwnerSay("Listening in channel " + (string) USER_CHANNEL + "\n"); llOwnerSay("Say /" + (string) USER_CHANNEL + " " + MSG_HELP + " for help or touch me to dialog menu."); state UserInterface; } // state_entry } // default state UserInterface { state_entry() { g_iUserListenDesc = llListen(USER_CHANNEL, "", NULL_KEY, ""); showConfig(); } // state_entry state_exit() { llListenRemove(g_iUserListenDesc); } // state_exit on_rez(integer start_param) { llResetScript(); } // on_rez touch_start(integer num_detected) { if (llDetectedKey(0) != llGetOwner()) { return; } // if mainMenu(llDetectedKey(0)); } // touch_start listen(integer channel, string name, key id, string message) { if (llGetOwnerKey(id) != llGetOwner()) { return; } // if string sMsg = llToLower(message); if ((sMsg == MSG_DELETE) || (sMsg == MSG_PURGE)) { llRegionSay(CHANNEL, sMsg); if (message != sMsg) { mainMenu(id); } // if } else if (sMsg == MSG_HELP) { showHelp(); } else if (sMsg == llToLower(OPC_VERBOSE)) { g_bVerbose = TRUE; llOwnerSay("Verbose mode activated."); mainMenu(id); } else if (sMsg == llToLower(OPC_QUIET)) { g_bVerbose = FALSE; mainMenu(id); } else if ((sMsg == MSG_MENU) || (sMsg == llToLower(OPC_RETURN))) { mainMenu(id); } else if (sMsg == llToLower(OPC_STRUCT)) { structMenu(id); } else if (sMsg == llToLower(OPC_SIZE)) { sizeMenu(id); } else if (sMsg == llToLower(OPC_EDGE_THICK)) { edgeMenu(id); } else if (sMsg == llToLower(OPC_NODE_SIZE)) { nodeMenu(id); } else if (sMsg == llToLower(OPC_TRIANGLE_THICK)) { triangleMenu(id); } else if (sMsg == llToLower(STRUCT_ICOSAHEDRON)) { llSetLinkPrimitiveParamsFast( LINK_THIS, [ PRIM_TYPE, PRIM_TYPE_SCULPT, ICOSAHEDRON_SCULPT, PRIM_SCULPT_TYPE_PLANE, PRIM_SIZE, <0.9, 0.9, 0.9> ]); g_sActualStruct = STRUCT_ICOSAHEDRON; if (g_bVerbose == TRUE) { llOwnerSay("Selected : " + g_sActualStruct); } // if showConfig(); mainMenu(id); } else if (sMsg == llToLower(STRUCT_DODECAHEDRON)) { llSetLinkPrimitiveParamsFast( LINK_THIS, [ PRIM_TYPE, PRIM_TYPE_SCULPT, DODECAHEDRON_SCULPT, PRIM_SCULPT_TYPE_PLANE, PRIM_SIZE, <0.9, 0.9, 0.9> ]); g_sActualStruct = STRUCT_DODECAHEDRON; if (g_bVerbose == TRUE) { llOwnerSay("Selected : " + g_sActualStruct); } // if showConfig(); mainMenu(id); } else if (sMsg == llToLower(STRUCT_TETRAHEDRON)) { llSetLinkPrimitiveParamsFast( LINK_THIS, [ PRIM_TYPE, PRIM_TYPE_SCULPT, TETRAHEDRON_SCULPT, PRIM_SCULPT_TYPE_PLANE, PRIM_SIZE, <0.8, 0.8, 0.8> ]); g_sActualStruct = STRUCT_TETRAHEDRON; if (g_bVerbose == TRUE) { llOwnerSay("Selected : " + g_sActualStruct); } // if showConfig(); mainMenu(id); } else if (sMsg == llToLower(STRUCT_HEXAHEDRON)) { llSetLinkPrimitiveParamsFast( LINK_THIS, [ PRIM_TYPE, PRIM_TYPE_SCULPT, HEXAHEDRON_SCULPT, PRIM_SCULPT_TYPE_PLANE, PRIM_SIZE, <0.6, 0.6, 0.6> ]); g_sActualStruct = STRUCT_HEXAHEDRON; if (g_bVerbose == TRUE) { llOwnerSay("Selected : " + g_sActualStruct); } // if showConfig(); mainMenu(id); } else if (sMsg == llToLower(STRUCT_OCTAHEDRON)) { llSetLinkPrimitiveParamsFast( LINK_THIS, [ PRIM_TYPE, PRIM_TYPE_SCULPT, OCTAHEDRON_SCULPT, PRIM_SCULPT_TYPE_PLANE, PRIM_SIZE, <1.0, 1.0, 1.0> ]); g_sActualStruct = STRUCT_OCTAHEDRON; if (g_bVerbose == TRUE) { llOwnerSay("Selected : " + g_sActualStruct); } // if showConfig(); mainMenu(id); } else if ((sMsg == OPC_SIZEP1) || (sMsg == OPC_SIZEL1) || (sMsg == OPC_SIZEP05) || (sMsg == OPC_SIZEL05) || (sMsg == OPC_SIZEP01) || (sMsg == OPC_SIZEL01) || (sMsg == OPC_SIZEL005) || (sMsg == OPC_SIZEL001) || (sMsg == OPC_SIZEP005) || (sMsg == OPC_SIZEP001) ) { float fIncr = (float) sMsg; float fNew = 0.0; if (g_sActualMenu == OPC_SIZE) { fNew = (float)((string)(g_fEdgeLength + fIncr)); if ((fNew <= MAX_EDGE_SIDE) && (fNew >= MIN_EDGE_SIDE)) { g_fEdgeLength = fNew; if (g_bVerbose == TRUE) { llOwnerSay("Size changed to: " + (string) g_fEdgeLength); } // if showConfig(); } // if sizeMenu(id); } else if (g_sActualMenu == OPC_EDGE_THICK) { fNew = (float)((string)(g_fEdgeThick + fIncr)); if ((fNew <= MAX_EDGE_THICK) && (fNew >= MIN_EDGE_THICK)) { g_fEdgeThick = fNew; if (g_bVerbose == TRUE) { llOwnerSay("Edge thickness changed to: " + (string) g_fEdgeThick); } // if llRegionSay(CHANNEL, MSG_EDGE_THICKNESS + "|" + (string) g_fEdgeThick); showConfig(); } // if edgeMenu(id); } else if (g_sActualMenu == OPC_NODE_SIZE) { fNew = (float)((string)(g_fNodeSize + fIncr)); if ((fNew <= MAX_NODE_SIZE) && (fNew >= MIN_NODE_SIZE)) { g_fNodeSize = fNew; if (g_bVerbose == TRUE) { llOwnerSay("Node size changed to: " + (string) g_fNodeSize); } // if llRegionSay(CHANNEL, MSG_NODE_SIZE + "|" + (string) g_fNodeSize); showConfig(); } // if nodeMenu(id); } else if (g_sActualMenu == OPC_TRIANGLE_THICK) { fNew = (float)((string)(g_fTriangleDepth + fIncr)); if ((fNew <= MAX_TRIANGLE_THICK) && (fNew >= MIN_TRIANGLE_THICK)) { g_fTriangleDepth = fNew; if (g_bVerbose == TRUE) { llOwnerSay("Triangle thickness changed to: " + (string) g_fTriangleDepth); } // if llRegionSay(CHANNEL, MSG_TRIANGLE_THICK + "|" + (string) g_fTriangleDepth); showConfig(); } // if triangleMenu(id); } // if } else if (sMsg == llToLower(OPC_MAX)) { if (g_sActualMenu == OPC_SIZE) { g_fEdgeLength = MAX_EDGE_SIDE; if (g_bVerbose == TRUE) { llOwnerSay("Size changed to: " + (string) g_fEdgeLength); } // if showConfig(); sizeMenu(id); } else if (g_sActualMenu == OPC_EDGE_THICK) { g_fEdgeThick = MAX_EDGE_THICK; if (g_bVerbose == TRUE) { llOwnerSay("Edge thickness changed to: " + (string) g_fEdgeThick); } // if llRegionSay(CHANNEL, MSG_EDGE_THICKNESS + "|" + (string) g_fEdgeThick); showConfig(); edgeMenu(id); } else if (g_sActualMenu == OPC_NODE_SIZE) { g_fNodeSize = MAX_NODE_SIZE; if (g_bVerbose == TRUE) { llOwnerSay("Node size changed to: " + (string) g_fNodeSize); } // if llRegionSay(CHANNEL, MSG_NODE_SIZE + "|" + (string) g_fNodeSize); showConfig(); nodeMenu(id); } else if (g_sActualMenu == OPC_TRIANGLE_THICK) { g_fTriangleDepth = MAX_TRIANGLE_THICK; if (g_bVerbose == TRUE) { llOwnerSay("Triangle thickness changed to: " + (string) g_fTriangleDepth); } // if llRegionSay(CHANNEL, MSG_TRIANGLE_THICK + "|" + (string) g_fTriangleDepth); showConfig(); triangleMenu(id); } // if } else if (sMsg == llToLower(OPC_MIN)) { if (g_sActualMenu == OPC_SIZE) { g_fEdgeLength = MIN_EDGE_SIDE; if (g_bVerbose == TRUE) { llOwnerSay("Size changed to: " + (string) g_fEdgeLength); } // if showConfig(); sizeMenu(id); } else if (g_sActualMenu == OPC_EDGE_THICK) { g_fEdgeThick = (float)((string)(MIN_EDGE_THICK + 0.01)); if (g_bVerbose == TRUE) { llOwnerSay("Edge thickness changed to: " + (string) g_fEdgeThick); } // if llRegionSay(CHANNEL, MSG_EDGE_THICKNESS + "|" + (string) g_fEdgeThick); showConfig(); edgeMenu(id); } else if (g_sActualMenu == OPC_NODE_SIZE) { g_fNodeSize = (float)((string)(MIN_NODE_SIZE + 0.01)); if (g_bVerbose == TRUE) { llOwnerSay("Node size changed to: " + (string) g_fNodeSize); } // if llRegionSay(CHANNEL, MSG_NODE_SIZE + "|" + (string) g_fNodeSize); showConfig(); nodeMenu(id); } else if (g_sActualMenu == OPC_TRIANGLE_THICK) { g_fTriangleDepth = (float)((string)(MIN_TRIANGLE_THICK + 0.01)); if (g_bVerbose == TRUE) { llOwnerSay("Triangle thickness changed to: " + (string) g_fTriangleDepth); } // if llRegionSay(CHANNEL, MSG_TRIANGLE_THICK + "|" + (string) g_fTriangleDepth); showConfig(); triangleMenu(id); } // if } else if (sMsg == llToLower(OPC_OFF)) { if (g_sActualMenu == OPC_EDGE_THICK) { g_fEdgeThick = MIN_EDGE_THICK; if (g_bVerbose == TRUE) { llOwnerSay("Disabled rez edges."); } // if llRegionSay(CHANNEL, MSG_EDGE_THICKNESS + "|" + (string) g_fEdgeThick); showConfig(); edgeMenu(id); } else if (g_sActualMenu == OPC_NODE_SIZE) { g_fNodeSize = MIN_NODE_SIZE; if (g_bVerbose == TRUE) { llOwnerSay("Disabled rez nodes."); } // if llRegionSay(CHANNEL, MSG_NODE_SIZE + "|" + (string) g_fNodeSize); showConfig(); nodeMenu(id); } else if (g_sActualMenu == OPC_TRIANGLE_THICK) { g_fTriangleDepth = MIN_TRIANGLE_THICK; if (g_bVerbose == TRUE) { llOwnerSay("Disabled rez triangles."); } // if llRegionSay(CHANNEL, MSG_TRIANGLE_THICK + "|" + (string) g_fTriangleDepth); showConfig(); triangleMenu(id); } // if } else if (sMsg == MSG_REZ) { g_vSavedPos = llGetPos(); float fTrueSize = g_fEdgeLength; if (g_sActualStruct == STRUCT_DODECAHEDRON) { fTrueSize *= GOLDEN; } else if (g_sActualStruct == STRUCT_TETRAHEDRON) { fTrueSize /= llSqrt(2); } else if (g_sActualStruct == STRUCT_OCTAHEDRON) { fTrueSize *= llSqrt(2); } // if safe_posJump(g_vSavedPos + <0.0, 0.0, fTrueSize>); g_lRelPos = getNodeList(fTrueSize); g_lConnectList = getConnectList(); g_lTriangleList = getTriangleList(); g_lRectangleList = getRectangleList(); state rezzNodes; } // if } // listen } // UserInterface state rezzNodes { state_entry() { if (g_fNodeSize > MIN_NODE_SIZE) { g_iMax = llGetListLength(g_lRelPos); g_iCounter = 0; if (g_iMax > 0) { if (g_bVerbose == TRUE) { llOwnerSay("Rezzing Nodes."); } // if g_iListenDesc = llListen(CHANNEL, OBJECT_TO_REZ, NULL_KEY, ""); vector v1 = llList2Vector(g_lRelPos, g_iCounter); rez_node(v1); } else { state rezzEdges; } // if } else { state rezzEdges; } // if } // state_entry state_exit() { llListenRemove(g_iListenDesc); } // state_exit on_rez(integer start_param) { llResetScript(); } // on_rez listen(integer channel, string name, key id, string message) { if ((llGetOwnerKey(id) != llGetOwner()) || (id == llGetKey())) { return; } // if if (message == MSG_OK) { llWhisper(CHANNEL, g_sObjectParams); } else if (message == MSG_NEXT) { g_iCounter ++; if (g_iCounter < g_iMax) { vector v1 = llList2Vector(g_lRelPos, g_iCounter); rez_node(v1); } else { state rezzEdges; } // if } // if } // listen } // rezzNodes state rezzEdges { state_entry() { if (g_fEdgeThick > MIN_EDGE_THICK) { g_iMax = llGetListLength(g_lConnectList); g_iCounter = 0; if (g_iMax >= 2) { if (g_bVerbose == TRUE) { llOwnerSay("Rezzing Edges."); } // if g_iListenDesc = llListen(CHANNEL, OBJECT_TO_REZ, NULL_KEY, ""); vector v1 = llList2Vector(g_lRelPos, llList2Integer(g_lConnectList, g_iCounter)); vector v2 = llList2Vector(g_lRelPos, llList2Integer(g_lConnectList, g_iCounter + 1)); rez_edge(v1, v2); } else { state rezTriangles; } // if } else { state rezTriangles; } // if } // state_entry state_exit() { llListenRemove(g_iListenDesc); } // state_exit on_rez(integer start_param) { llResetScript(); } // on_rez listen(integer channel, string name, key id, string message) { if ((llGetOwnerKey(id) != llGetOwner()) || (id == llGetKey())) { return; } // if if (message == MSG_OK) { llWhisper(CHANNEL, g_sObjectParams); } else if (message == MSG_NEXT) { g_iCounter += 2; if (g_iCounter < g_iMax) { vector v1 = llList2Vector(g_lRelPos, llList2Integer(g_lConnectList, g_iCounter)); vector v2 = llList2Vector(g_lRelPos, llList2Integer(g_lConnectList, g_iCounter + 1)); rez_edge(v1, v2); } else { state rezTriangles; } // if } // if } // listen } // rezzEdges state rezTriangles { state_entry() { if (g_fTriangleDepth > MIN_TRIANGLE_THICK) { g_iMax = llGetListLength(g_lTriangleList); g_iCounter = 0; if (g_iMax >= 3) { if (g_bVerbose == TRUE) { llOwnerSay("Rezzing Triangles."); } // if g_iListenDesc = llListen(CHANNEL, OBJECT_TO_REZ, NULL_KEY, ""); vector v1 = (vector) llList2String(g_lRelPos, llList2Integer(g_lTriangleList, g_iCounter)); vector v2 = (vector) llList2String(g_lRelPos, llList2Integer(g_lTriangleList, g_iCounter + 1)); vector v3 = (vector) llList2String(g_lRelPos, llList2Integer(g_lTriangleList, g_iCounter + 2)); rez_triangle(v1, v2, v3); } else { state rezRectangles; } // if } else { state rezRectangles; } // if } // state_entry state_exit() { llListenRemove(g_iListenDesc); } // state_exit on_rez(integer start_param) { llResetScript(); } // on_rez listen(integer channel, string name, key id, string message) { if ((llGetOwnerKey(id) != llGetOwner()) || (id == llGetKey())) { return; } // if if (message == MSG_OK) { llWhisper(CHANNEL, g_sObjectParams); } else if (message == MSG_NEXT) { g_iCounter += 3; if (g_iCounter < g_iMax) { vector v1 = (vector) llList2String(g_lRelPos, llList2Integer(g_lTriangleList, g_iCounter)); vector v2 = (vector) llList2String(g_lRelPos, llList2Integer(g_lTriangleList, g_iCounter + 1)); vector v3 = (vector) llList2String(g_lRelPos, llList2Integer(g_lTriangleList, g_iCounter + 2)); rez_triangle(v1, v2, v3); } else { state rezRectangles; } // if } // if } // listen } // rezTriangles state rezRectangles { state_entry() { if (g_fTriangleDepth > MIN_TRIANGLE_THICK) { g_iMax = llGetListLength(g_lRectangleList); g_iCounter = 0; if (g_iMax >= 4) { if (g_bVerbose == TRUE) { llOwnerSay("Rezzing Rectangles."); } // if g_iListenDesc = llListen(CHANNEL, OBJECT_TO_REZ, NULL_KEY, ""); vector v1 = (vector) llList2String(g_lRelPos, llList2Integer(g_lRectangleList, g_iCounter)); vector v2 = (vector) llList2String(g_lRelPos, llList2Integer(g_lRectangleList, g_iCounter + 1)); vector v3 = (vector) llList2String(g_lRelPos, llList2Integer(g_lRectangleList, g_iCounter + 2)); vector v4 = (vector) llList2String(g_lRelPos, llList2Integer(g_lRectangleList, g_iCounter + 3)); rez_rectangle(v1, v2, v3, v4); } else { state UserInterface; } // if } else { state UserInterface; } // if } // state_entry state_exit() { llListenRemove(g_iListenDesc); safe_posJump(g_vSavedPos); llOwnerSay("Done!"); } // state_exit on_rez(integer start_param) { llResetScript(); } // on_rez listen(integer channel, string name, key id, string message) { if ((llGetOwnerKey(id) != llGetOwner()) || (id == llGetKey())) { return; } // if if (message == MSG_OK) { llWhisper(CHANNEL, g_sObjectParams); } else if (message == MSG_NEXT) { g_iCounter += 4; if (g_iCounter < g_iMax) { vector v1 = (vector) llList2String(g_lRelPos, llList2Integer(g_lRectangleList, g_iCounter)); vector v2 = (vector) llList2String(g_lRelPos, llList2Integer(g_lRectangleList, g_iCounter + 1)); vector v3 = (vector) llList2String(g_lRelPos, llList2Integer(g_lRectangleList, g_iCounter + 2)); vector v4 = (vector) llList2String(g_lRelPos, llList2Integer(g_lRectangleList, g_iCounter + 3)); rez_rectangle(v1, v2, v3, v4); } else { state UserInterface; } // if } // if } // listen } // rezRectangles That's all. Now take your object to your inventory. 1
Emma Krokus Posted January 10, 2013 Posted January 10, 2013 Yay! Works great and makes pretty things Thank you ! Emma
Ly Jie Posted July 19, 2013 Posted July 19, 2013 In the third script, if you comment out the line: float fIn = (float)((string) fIn); which doesn't do anything, it will also work on opensim.
JJValero Writer Posted July 19, 2013 Author Posted July 19, 2013 I no remember why i put this line, but probably is a bug or error. On the other hand, I do not have the habits to redefine input parameters, It is almost certain that it is a mistake. In OpenSim, the UUID of the sculpties and textures are not correct, but you can find the sculties on my freebie site. Greetings
Recommended Posts
Please take a moment to consider if this thread is worth bumping.
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now