Difference between revisions of "Open Prim Animator/Touch Ping Pong"

From Second Life Wiki
Jump to navigation Jump to search
(Committing changes made to OPA made over the past year at work)
 
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
<lsl>
<source lang="lsl2">
//!  @brief This is a utility script for OPA for cases when animation frames are meant to be viewed sequentially in both forward and "reverse".
/**
*    @author SignpostMarv Martin
*/
 
//!  The number of animation frames
integer count;
integer count;
//!  if TRUE then the "ping pong" is in effect and should not be interupted.
integer running=FALSE;
integer running=FALSE;
//!  interval between animation frames
float interval = 1.0;
float interval = 1.0;
//! 
integer at=1;
integer at=1;
integer mod=1;
integer mod=1;
default{
default{
     state_entry() {
     state_entry() {
         llMessageLinked(LINK_ROOT, -1, "XDrecordedSnapshots", NULL_KEY);
         llMessageLinked(LINK_ROOT, -1, "XDrecordedSnapshots", NULL_KEY); // get the number of animation frames from the core OPA script.
     }
     }


     link_message(integer s, integer n, string m, key i){
     link_message(integer s, integer n, string m, key i){
         if(m == "XDrecordedSnapshots" && n >= 0){
         if(m == "XDrecordedSnapshots" && n >= 0){
             count = n;
             count = n; // update the number of animation frames
         }
         }
     }
     }


     touch_start(integer t){
     touch_start(integer t){
         if(!running){
         if(!running){ // if we're not doing the "ping-pong",
             running = TRUE;
             running = TRUE; // set the flag to TRUE
             llSetTimerEvent(interval);
             llSetTimerEvent(interval); // then set the timer event away.
         }
         }
     }
     }
Line 25: Line 37:
     timer(){
     timer(){
         if(count <= 0){
         if(count <= 0){
             llSetTimerEvent(0);
             llSetTimerEvent(0); // stop the timer
         }else{
         }else{
             at += mod;
             at += mod; // add the modifier (which may be a negative integer)
             if(at >= count){
             if(at >= count){ // if we're at the end of the "ping-pong",
                 mod = -1;
                 mod = -1; // change the mod to negative 1 in preparation of reversing the animation
                 llSetTimerEvent(0);
                 llSetTimerEvent(0); // turn off the timer
                 running = FALSE;
                 running = FALSE; // set the running flag to FALSE so a user can touch the script.
             }else if(at <= 1){
             }else if(at <= 1){ // if we're at the end of the "pong-ping",
                 mod = 1;
                 mod = 1; // change them od to positive one in preparation of running the animation
                 llSetTimerEvent(0);
                 llSetTimerEvent(0); // turn off the timer.
                 running = FALSE;
                 running = FALSE; // set the running flag to FALSE so a user can touch the script.
             }
             }
             llMessageLinked(LINK_ROOT, at, "XDshow", NULL_KEY);
             llMessageLinked(LINK_ROOT, at, "XDshow", NULL_KEY); // instruct the core OPA script to change the displayed animation frame.
         }
         }
     }
     }
}
}
</lsl>
</source>
[[Category:Open Prim Animator|Ping Pong]]
[[Category:Open Prim Animator|Ping Pong]]

Latest revision as of 14:59, 26 February 2015

//!  @brief This is a utility script for OPA for cases when animation frames are meant to be viewed sequentially in both forward and "reverse".
/**
*    @author SignpostMarv Martin
*/

//!  The number of animation frames
integer count;

//!  if TRUE then the "ping pong" is in effect and should not be interupted.
integer running=FALSE;

//!  interval between animation frames
float interval = 1.0;

//!  
integer at=1;
integer mod=1;
default{
    state_entry() {
        llMessageLinked(LINK_ROOT, -1, "XDrecordedSnapshots", NULL_KEY); // get the number of animation frames from the core OPA script.
    }

    link_message(integer s, integer n, string m, key i){
        if(m == "XDrecordedSnapshots" && n >= 0){
            count = n; // update the number of animation frames
        }
    }

    touch_start(integer t){
        if(!running){ // if we're not doing the "ping-pong",
            running = TRUE; // set the flag to TRUE
            llSetTimerEvent(interval); // then set the timer event away.
        }
    }

    timer(){
        if(count <= 0){
            llSetTimerEvent(0); // stop the timer
        }else{
            at += mod; // add the modifier (which may be a negative integer)
            if(at >= count){ // if we're at the end of the "ping-pong", 
                mod = -1; // change the mod to negative 1 in preparation of reversing the animation
                llSetTimerEvent(0); // turn off the timer
                running = FALSE; // set the running flag to FALSE so a user can touch the script.
            }else if(at <= 1){ // if we're at the end of the "pong-ping",
                mod = 1; // change them od to positive one in preparation of running the animation
                llSetTimerEvent(0); // turn off the timer.
                running = FALSE; // set the running flag to FALSE so a user can touch the script.
            }
            llMessageLinked(LINK_ROOT, at, "XDshow", NULL_KEY); // instruct the core OPA script to change the displayed animation frame.
        }
    }
}