Difference between revisions of "Key Frame Animator"

From Second Life Wiki
Jump to navigation Jump to search
m (cleanup)
(Undo revision 1180450. If you don't understand, don't fiddle. If you think you do, TEST! Don't just corrupt and walk away.)
Line 5: Line 5:


<lsl>
<lsl>
// MODE:
integer  channel;
//      0 = NonInit
list    keys=[];
//      1 = Init
vector  last_pos;
//      2 = Run
rotation last_rot;
 
vector  start_pos;
integer  MODE;
list    keys;
 
rotation start_rot;
rotation start_rot;
vector  start_pos;
rotation last_rot;
vector  last_pos;
integer dialogChannel;
integer dialogHandle;
init()
{
    say("Welcome to the KeyFrame Setter v1.0 by Jasper Flossberg");
    say("Touch to get started!");
}
update_start()
{
    start_pos = llGetPos();
    start_rot = llGetRot();
}
update_last()
{
    last_pos = llGetPos();
    last_rot = llGetRot();
}
open_menu(key id, string dialogString, list dialogButtons)
{
    close_menu();// make sure it's closed before (re-)opening
    dialogChannel = (integer)llFrand(4000000);
    dialogHandle  = llListen(dialogChannel, "", id, "");
    llDialog(id, dialogString, dialogButtons, dialogChannel);
    llSetTimerEvent(30.0);
}
close_menu()
{
    // disable timer by setting 0.0
    llSetTimerEvent((float)FALSE);
    llListenRemove(dialogHandle);
}
say(string message)
{
    llSay(PUBLIC_CHANNEL, message);
}


default
default
{
{
     on_rez(integer start_param)
     state_entry()
     {
     {
         llResetScript();
         llSay(0, "Welcome to the KeyFrame Setter v2.0 by Jasper Flossberg and others\nTouch to start");
        llListen(0, "", llGetOwner(), "");      // Listen on channel 0 for 'set' commands from owner only
        channel = (integer) llFrand(4000000);
        llListen(channel, "", llGetOwner(), "");
 
        // Must use 'prim equivalency' for KFM
        llSetPrimitiveParams([PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]); 
        llSetKeyframedMotion([],[]);
        last_pos = start_pos = llGetPos();
        last_rot = start_rot = llGetRot();
     }
     }
 
     on_rez(integer p)
     state_entry()
     {
     {
         init();
         llResetScript();
     }
     }
 
     touch_start(integer total_number)
     touch_start(integer num_detected)
     {
     {
         key id = llDetectedKey(0);
         if (llDetectedKey(0) != llGetOwner() )
         open_menu(id, "Please choose option", ["Init", "Run", "Export"]);
            return;
         llDialog(llDetectedKey(0), "Please choose option",["Init","Run","Export"],channel);
     }
     }
     listen(integer channel, string name, key id, string message)
     listen(integer channel, string name, key id, string message)
     {
     {
        //  ignore spam
         if(message == "Init")
         if (channel != dialogChannel)
         {
         {
             return;
             llSay(0, "Re-Intializing KeyFrame Setter");
            llSleep(1);
            llResetScript();
         }
         }
 
         if(llToLower(llGetSubString(message,0,2) ) == "set")
         //  all info we could need is in the event params, so close early
        close_menu();
 
        if (message == "Init")
         {
         {
             MODE = 1;
             string time = llList2String(llParseString2List(message, [" "], []), 1);
 
             llSay(0, "Setting new KeyFrame with " + time);
            say("Intializing KeyFrame Setter");
             keys += [llGetPos() - last_pos, llGetRot() / last_rot, (integer) time];
 
            last_pos = llGetPos();
            llSetKeyframedMotion([], []);
             last_rot = llGetRot();
 
            keys = [];
 
            update_last();
            update_start();
        }
        if (llGetSubString(message, 0, 2) == "set" && MODE == 1)
        {
            list  params = llParseString2List(message,[" "], []);
            string time  = llList2String(params, 1);
 
             say("Setting new KeyFrame with "+time);
 
             keys += [llGetPos()-last_pos,llGetRot()/last_rot,(integer)time];
 
             update_last();
         }
         }
         if (message == "Run")
         if(message == "Run")
         {
         {
             MODE = 2;
             llSetPrimitiveParams([PRIM_POSITION, start_pos, PRIM_ROTATION, start_rot]);
 
             llSetKeyframedMotion(keys,[KFM_MODE,KFM_LOOP]);
            llSetLinkPrimitiveParamsFast(LINK_THIS, [
                PRIM_POSITION, start_pos,
                PRIM_ROTATION, start_rot]);
 
             llSetKeyframedMotion(keys, [
                KFM_MODE, KFM_LOOP]);
         }
         }
         if (message == "Export")
         if(message == "Export")
         {
         {
             say((string)keys);
             llSay(0, llList2CSV(keys) );
         }
         }
    }
    timer()
    {
        close_menu();
     }
     }
}
}
</lsl>
</lsl>

Revision as of 08:25, 20 March 2014

This is a KeyFrame Animator Script to simplify construction of keyframed animations. To get the much better PRO version with after frame editing features and more, contact --Jasper Flossberg

<lsl> integer channel; list keys=[]; vector last_pos; rotation last_rot; vector start_pos; rotation start_rot;

default {

   state_entry()
   {
       llSay(0, "Welcome to the KeyFrame Setter v2.0 by Jasper Flossberg and others\nTouch to start");
       llListen(0, "", llGetOwner(), "");      // Listen on channel 0 for 'set' commands from owner only
       channel = (integer) llFrand(4000000);
       llListen(channel, "", llGetOwner(), "");
       // Must use 'prim equivalency' for KFM
       llSetPrimitiveParams([PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]);  
       llSetKeyframedMotion([],[]);
       last_pos = start_pos = llGetPos();
       last_rot = start_rot = llGetRot();
   }
   on_rez(integer p)
   {
       llResetScript();
   }
   touch_start(integer total_number)
   {
       if (llDetectedKey(0)  != llGetOwner() )
           return;
       llDialog(llDetectedKey(0), "Please choose option",["Init","Run","Export"],channel);
   }
   listen(integer channel, string name, key id, string message)
   {
       if(message == "Init")
       {
           llSay(0, "Re-Intializing KeyFrame Setter");
           llSleep(1);
           llResetScript();
       }
       if(llToLower(llGetSubString(message,0,2) ) == "set")
       {
           string time = llList2String(llParseString2List(message, [" "], []), 1);
           llSay(0, "Setting new KeyFrame with " + time);
           keys += [llGetPos() - last_pos, llGetRot() / last_rot, (integer) time];
           last_pos = llGetPos();
           last_rot = llGetRot();
       }
       if(message == "Run")
       {
           llSetPrimitiveParams([PRIM_POSITION, start_pos, PRIM_ROTATION, start_rot]);
           llSetKeyframedMotion(keys,[KFM_MODE,KFM_LOOP]);
       }
       if(message == "Export")
       {
           llSay(0, llList2CSV(keys) );
       }
   }

} </lsl>