Difference between revisions of "Key Frame Animator"

From Second Life Wiki
Jump to navigation Jump to search
m (cleanup)
m (<lsl> tag to <source>)
 
(One intermediate revision by one other user not shown)
Line 4: Line 4:
--[[User:Jasper Flossberg|Jasper Flossberg]]
--[[User:Jasper Flossberg|Jasper Flossberg]]


<lsl>
<source lang="lsl2">
// 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;
        }
 
        //  all info we could need is in the event params, so close early
        close_menu();
 
         if (message == "Init")
         {
         {
             MODE = 1;
             llSay(0, "Re-Intializing KeyFrame Setter");
 
             llSleep(1);
            say("Intializing KeyFrame Setter");
             llResetScript();
 
             llSetKeyframedMotion([], []);
 
            keys = [];
 
            update_last();
             update_start();
         }
         }
         if (llGetSubString(message, 0, 2) == "set" && MODE == 1)
         if(llToLower(llGetSubString(message,0,2) ) == "set")
         {
         {
             list  params = llParseString2List(message,[" "], []);
             string time = llList2String(llParseString2List(message, [" "], []), 1);
            string time  = llList2String(params, 1);
             llSay(0, "Setting new KeyFrame with " + time);
 
             keys += [llGetPos() - last_pos, llGetRot() / last_rot, (integer) time];
             say("Setting new KeyFrame with "+time);
            last_pos = llGetPos();
 
             last_rot = llGetRot();
             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>
</source>

Latest revision as of 23:17, 24 January 2015

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

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) );
        }
    }
}