// Commands: (without '') // '/22 depth x' -> set the depth for the next triangles as float value // '/22 freeze' -> removes all objects and scripts from the vertices // '/22 clean' -> removes the vertices integer chan = 22; vector a; vector b; vector c; vector origin; float scale = 1; float depth = 0.01; float delta = 0.01; rotation rot; integer comm_channel = -61347732; integer rez_counter; integer handle; rez_triangle(vector a, vector b, vector c) { a = origin + scale * a; b = origin + scale * b; c = origin + scale * c; if(llVecDist(a,b) < delta || llVecDist(b,c) < delta || llVecDist(c,a) < delta) { return; } float cosA = (b - a) * (c - a); float cosB = (c - b) * (a - b); float cosC = (a - c) * (b - c); if(cosA < 0.0) { triangle(a, b, c, TRUE); } else if(cosB < 0.0) { triangle(b, c, a, TRUE); } else if(cosC < 0.0) { triangle(c, a, b, TRUE); } else { float error1 = triangle(a,b,c,FALSE); float error2 = triangle(b,c,a,FALSE); float error3 = triangle(c,a,b,FALSE); if(error1 < error2) { if(error1 < error3) { triangle(a,b,c,TRUE); } else { triangle(c,a,b,TRUE); } } else { if(error2 < error3) { triangle(b,c,a,TRUE); } else { triangle(c,a,b,TRUE); } } } } float triangle(vector a, vector b, vector c, integer rez) { 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 y_shear = 0.5 - ((b-a) * left) / width; if(rez) { vector center = 0.5 * ( (b+c) + (height * up) ); vector scale = ; rotation rot = llAxes2Rot(fwd, left, up); llMessageLinked(LINK_THIS, comm_channel + rez_counter, (string)scale + "|" + (string)y_shear, NULL_KEY); while(llVecDist(llGetPos(), center) > 9.5) { llSetPos(center); } llRezObject("Triangle", center, ZERO_VECTOR, rot, comm_channel + rez_counter); rez_counter += 1; return -1.0; } else { y_shear = (float)llRound(y_shear * 100.0) / 100.0; return llVecDist(a, 0.5 * (b + c) + height * up + y_shear * width * left); } } reset() { a = ZERO_VECTOR; b = ZERO_VECTOR; c = ZERO_VECTOR; llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1, 1, 1>, 1]); } default { on_rez(integer num) { reset(); } state_entry() { if (handle != 0) { llListenRemove(handle); handle = 0; } handle = llListen(chan,"","",""); llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1, 1, 1>, 1]); } touch_start(integer num_detected) { if(llDetectedKey(0) == llGetOwner()) { if(llGetPos() == a || llGetPos() == b || llGetPos() == c) { llShout(chan, "reset"); reset(); } else if(a == ZERO_VECTOR) { a = llGetPos(); llShout(chan,"vectora "+(string)a); llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1, 0, 0>, 1]); } else if(b == ZERO_VECTOR) { b = llGetPos(); llShout(chan,"vectorb "+(string)b); llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1, 0, 0>, 1]); } else if(c == ZERO_VECTOR) { c = llGetPos(); llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1, 0, 0>, 1]); rez_triangle(a,b,c); llShout(chan, "reset"); reset(); } } } listen(integer chan, string name, key id, string msg) { if(llGetOwnerKey(id) == llGetOwner()) { list cmdLine = llParseString2List(msg, [" "], [""]); string cmd = llList2String(cmdLine, 0); cmd = llToLower(cmd); if(msg == "reset") { reset(); } else if (cmd == "depth") { depth = llList2Float(cmdLine, 1); } else if (cmd == "freeze") { llListenRemove(handle); llShout(chan, "freeze"); llRemoveInventory("Triangle"); llRemoveInventory("Triangle Detailer"); llRemoveInventory(llGetScriptName()); } else if (cmd == "clean") { llListenRemove(handle); llShout(chan, "clean"); llDie(); } else if(cmd == "vectora") { a = (vector)llGetSubString(msg, llSubStringIndex(msg, "<"),llStringLength(msg)); } else if(cmd == "vectorb") { b = (vector)llGetSubString(msg, llSubStringIndex(msg, "<"),llStringLength(msg)); } else if(cmd == "vectorc") { c = (vector)llGetSubString(msg, llSubStringIndex(msg, "<"),llStringLength(msg)); } } } }