Files
LSL-Scripts/flamingo/Bird Flight/root prim/Prim_Animation_Compiler_1984.lsl
2015-08-09 16:54:31 -05:00

214 lines
7.4 KiB
Plaintext

// :CATEGORY:Bird
// :NAME:flamingo
// :AUTHOR:Ferd Frederix
// :CREATED:2013-09-06
// :EDITED:2013-09-18 15:38:53
// :ID:314
// :NUM:420
// :REV:1
// :WORLD:Second Life
// :DESCRIPTION:
// Compiler for prim animation
// :CODE:
// This script produces optimized LSL code that can be triggered by link messages.
// fred@mitsi.com
// 3-7-2012
// Rev B, added a missing } at the end of multiple recordings.
// Author: Ferd Frederix
// Based on an excellent script by Allen Firethorn
// This is free software, it is not for sale at any price
// Tunable stuff:
integer OpenSim = FALSE; // Set to FALSE for Second Life to save memory
string fast="Fast"; // Set this to an empty string if you don't want to use the fast animation
integer debug = FALSE; // set to TRUE to see stuff inside as it runs
list animations; // holds a list of all animation names
list receivedData; // the data from the main program
integer STRIDE = 5; // size of the data packets in receivedData
integer currentLine; // the line we are processing
// Link messages
integer CLEAR = -234756;
integer DATA = -234757;
integer COMPILE = -234758;
integer DIE = -234759;
DEBUG(string msg)
{
if (debug) llOwnerSay("// " + msg);
}
// speak without the name of the prim in the way
SayCode (string story){
llOwnerSay (story);
llSleep(0.1);
}
default {
link_message(integer sender_num,integer num, string msg, key id) {
if (num == DIE && msg =="die") // clear
{
llOwnerSay("Compiler has been removed");
if (! debug) {
llRemoveInventory(llGetScriptName());
}
}
if (num == CLEAR) // clear
{
animations = [];
receivedData = [];
currentLine = 0;
llOwnerSay("Compiler Ready");
}
else if (num == DATA) // data
{
// data formatted like this:
// name|primnum|vector Pos|rotation rot|vector size
// test1|2|<0.026306,-0.150208,0.191069>|<-0.000008,0.956309,-0.292356,0.000000>|<0.074010,0.074010,0.074010>
list primList = llParseString2List(msg,["|"],[]);
string name = llList2String(primList,0);
receivedData += name;
receivedData += (float) llList2String(primList,1); // prim Number or ms to sleep
receivedData += (vector) llList2String(primList,2); // pos
receivedData += (rotation) llList2String(primList,3); // rot
receivedData += (vector) llList2String(primList,4); // size
// Store the name of the animation if it is not already stored
integer i = llListFindList(animations, [name]);
if( i < 0 ){
DEBUG("Adding Animation named " + name);
animations += name;
}
currentLine++;
}
else if (num == COMPILE) // finish, compile it
{
//DEBUG("Animations:" + llDumpList2String(animations,":"));
//DEBUG("Length:" + ((string) llGetListLength(animations)));
//DEBUG("history:" + llDumpList2String(receivedData,":"));
//DEBUG("Length:" + ((string) llGetListLength(receivedData)));
string code;
integer i;
llOwnerSay("Compiler processing " + (string)currentLine + " prim movements and " + (string) llGetListLength(animations) + " animations");
llOwnerSay("Copy everything below this line and paste it into a new script\n");
string oldname = llGetObjectName ();
llSetObjectName ("Compiler");
vector scale = llGetScale();
SayCode("// Prim animation compiler //\n"
+ "// Ferd Frederix - http://www.outworldz.com\n"
+ "integer playbackchannel = 1; // The default llMessageLinked number\n"
+ "rotation calcChildRot(rotation rdeltaRot){\n"
+ "\tif (llGetAttached())\n"
+ "\t\treturn rdeltaRot/llGetLocalRot();\n"
+ "\telse\n"
+ "\t\treturn rdeltaRot/llGetRootRotation();\n"
+ "}\n"
+ "vector originalScale = "
+ (string) scale
+ ";"
);
// Go through each animation and create a function for each one
for(i = 0; i < llGetListLength(animations); i++){
integer j;
string animationName = llList2String(animations, i);
//DEBUG("Processing " + animationName);
SayCode(animationName
+ "(){\n"
+ "\tvector currentSize = llGetScale();\n"
+ "\tfloat scaleby = currentSize.x/originalScale.x;\n"
);
//Read through the list and print out the instructions for this animation
integer count = llGetListLength(receivedData);
for(j=0; j < count; j += STRIDE)
{
string name = llList2String(receivedData,j);
float primNum = (float) llList2String(receivedData,j+1);
//DEBUG("name: " + name + " Prim Num: " + primNum);
if( name == animationName){
if(primNum > 1){ // not a root prim or sleep
SayCode( "\tllSetLinkPrimitiveParams"
+ fast
+ "("
+ (string) ((integer)primNum)
+ ", [PRIM_POSITION, "
+ (string) llList2Vector(receivedData,j+2)
+ "*scaleby, "
+ "PRIM_ROTATION,calcChildRot("
+ (string) llList2Rot(receivedData,j+3)
+ "), "
+ "PRIM_SIZE, "
+ (string) llList2Vector(receivedData,j+4)
+ "*scaleby]);"
);
} else {
SayCode("\tllSleep("
+(string)(primNum*-1) // negative numbers are sleep times
+");"
);
}
} // if name
} // for j
SayCode ("\n}");
} // for animations
SayCode (
"\n\n"
+ "default{\n"
);
if (!OpenSim)
SayCode("\tstate_entry(){\n"
+"\t\tllSetMemoryLimit(llGetUsedMemory() + 512);\n"
+ "\t\t}");
code = "\n\tlink_message(integer sender_num, integer num, string message, key id){\n"+
"\t\tif(num == playbackchannel){\n";
for(i=0; i<llGetListLength(animations);i++){
code+="\t\t\tif(message == \""+llList2String(animations,i)+"\"){\n"+
"\t\t\t\t"+llList2String(animations,i)+"();\n"+
"\t\t\t}\n";
}
code += "\t\t}\n"+
"\t}\n}";
SayCode(code);
SayCode("// Done! Copy everything above to a new script, and Search/Replace the time stamp and Compiler: on the left to be blank");
llSetObjectName (oldname);
}
}
}