Advertisement
Guest User

Ferris Wheel

a guest
Apr 3rd, 2020
666
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // https://i.gyazo.com/9d0168650a2a83607996148573c18561.mp4
  2. integer rotations_saved = FALSE;
  3. float rad_per_second;
  4. rotation root_start_rotation;
  5. list car_linknumbers;
  6. list car_rotations;
  7.  
  8. default
  9. {
  10.     state_entry()
  11.     {
  12.         // Initialize radians per second parameter at script start.
  13.         float deg_per_second = 20;
  14.         rad_per_second = deg_per_second * DEG_TO_RAD;
  15.         state idle;
  16.     }
  17. }
  18.  
  19. state idle
  20. {
  21.  
  22.     state_entry()
  23.     {
  24.         if (rotations_saved)
  25.         {
  26.             // Restore start rotations.
  27.             list params = [PRIM_LINK_TARGET, LINK_ROOT, PRIM_ROTATION, root_start_rotation];
  28.             integer i;
  29.             integer length = llGetListLength(car_linknumbers);
  30.             while (i < length)
  31.             {
  32.                 integer  car_link         = llList2Integer(car_linknumbers, i);
  33.                 rotation car_rotation   = llList2Rot(car_rotations, i);
  34.                 params += [PRIM_LINK_TARGET, car_link, PRIM_ROT_LOCAL, car_rotation];
  35.                 ++i;
  36.             }
  37.             llSetLinkPrimitiveParamsFast(FALSE, params);
  38.         }
  39.     }
  40.  
  41.     touch_start(integer num_detected)
  42.     {
  43.         // 1.  Save the car rotations/link numbers for later.
  44.         integer primCount = llGetNumberOfPrims();
  45.         integer i = 2; // 1 is the root prim which we're not interested in.
  46.         while (i <= primCount)
  47.         {
  48.             car_linknumbers += [i];
  49.             rotation car_rotation = llList2Rot(llGetLinkPrimitiveParams(i, [PRIM_ROT_LOCAL]), 0);
  50.             car_rotations += [car_rotation];
  51.             ++i;
  52.         }
  53.         root_start_rotation = llGetRot();
  54.         rotations_saved = TRUE; // Tell the script we can restore from these values later.
  55.         // 2. Now start spinning by entering the spinning state.
  56.         state spinning;
  57.     }
  58. }
  59.  
  60. state spinning
  61. {
  62.     state_entry()
  63.     {
  64.         llSetTimerEvent(1.0 / llGetRegionFPS());
  65.         llResetTime();
  66.     }
  67.  
  68.     timer()
  69.     {
  70.         // 1. Update timer
  71.         llSetTimerEvent(1.0 / llGetRegionFPS()); // Also continually adjust with moving simulator framerate.
  72.  
  73.         // 2. Get elapsed time
  74.         float elapsed_time = llGetTime(); // Get the elapsed time in seconds.
  75.         llResetTime(); // So that the next llGetTime() is relative to this timer event.
  76.  
  77.         // 3. Calculate the rotation.
  78.         float      rad_change = rad_per_second * elapsed_time;
  79.         rotation change     = llAxisAngle2Rot(<1,0,0>, rad_change);
  80.        
  81.         rotation newRot        = llGetRot() * change;
  82.         // 4. Setup Primitive Params.
  83.         list params;
  84.         // First. The root param.
  85.         params += [PRIM_LINK_TARGET, LINK_ROOT, PRIM_ROTATION, newRot];
  86.         // Then, the car params.
  87.         integer i = 0;
  88.         integer length = llGetListLength(car_linknumbers);
  89.         rotation difference_to_start_rot = llGetRot() / root_start_rotation;
  90.         while (i < length)
  91.         {
  92.             integer link_number     = llList2Integer(car_linknumbers, i);
  93.             rotation link_rotation    = llList2Rot(car_rotations, i);
  94.             params += [PRIM_LINK_TARGET, link_number, PRIM_ROT_LOCAL, link_rotation / difference_to_start_rot];
  95.             ++i;
  96.         }
  97.         llSetLinkPrimitiveParamsFast(FALSE, params);
  98.  
  99.     }
  100.  
  101.     touch_start(integer num_detected)
  102.     {
  103.         llSetTimerEvent(FALSE);
  104.         state idle;
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement