Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // https://i.gyazo.com/9d0168650a2a83607996148573c18561.mp4
- integer rotations_saved = FALSE;
- float rad_per_second;
- rotation root_start_rotation;
- list car_linknumbers;
- list car_rotations;
- default
- {
- state_entry()
- {
- // Initialize radians per second parameter at script start.
- float deg_per_second = 20;
- rad_per_second = deg_per_second * DEG_TO_RAD;
- state idle;
- }
- }
- state idle
- {
- state_entry()
- {
- if (rotations_saved)
- {
- // Restore start rotations.
- list params = [PRIM_LINK_TARGET, LINK_ROOT, PRIM_ROTATION, root_start_rotation];
- integer i;
- integer length = llGetListLength(car_linknumbers);
- while (i < length)
- {
- integer car_link = llList2Integer(car_linknumbers, i);
- rotation car_rotation = llList2Rot(car_rotations, i);
- params += [PRIM_LINK_TARGET, car_link, PRIM_ROT_LOCAL, car_rotation];
- ++i;
- }
- llSetLinkPrimitiveParamsFast(FALSE, params);
- }
- }
- touch_start(integer num_detected)
- {
- // 1. Save the car rotations/link numbers for later.
- integer primCount = llGetNumberOfPrims();
- integer i = 2; // 1 is the root prim which we're not interested in.
- while (i <= primCount)
- {
- car_linknumbers += [i];
- rotation car_rotation = llList2Rot(llGetLinkPrimitiveParams(i, [PRIM_ROT_LOCAL]), 0);
- car_rotations += [car_rotation];
- ++i;
- }
- root_start_rotation = llGetRot();
- rotations_saved = TRUE; // Tell the script we can restore from these values later.
- // 2. Now start spinning by entering the spinning state.
- state spinning;
- }
- }
- state spinning
- {
- state_entry()
- {
- llSetTimerEvent(1.0 / llGetRegionFPS());
- llResetTime();
- }
- timer()
- {
- // 1. Update timer
- llSetTimerEvent(1.0 / llGetRegionFPS()); // Also continually adjust with moving simulator framerate.
- // 2. Get elapsed time
- float elapsed_time = llGetTime(); // Get the elapsed time in seconds.
- llResetTime(); // So that the next llGetTime() is relative to this timer event.
- // 3. Calculate the rotation.
- float rad_change = rad_per_second * elapsed_time;
- rotation change = llAxisAngle2Rot(<1,0,0>, rad_change);
- rotation newRot = llGetRot() * change;
- // 4. Setup Primitive Params.
- list params;
- // First. The root param.
- params += [PRIM_LINK_TARGET, LINK_ROOT, PRIM_ROTATION, newRot];
- // Then, the car params.
- integer i = 0;
- integer length = llGetListLength(car_linknumbers);
- rotation difference_to_start_rot = llGetRot() / root_start_rotation;
- while (i < length)
- {
- integer link_number = llList2Integer(car_linknumbers, i);
- rotation link_rotation = llList2Rot(car_rotations, i);
- params += [PRIM_LINK_TARGET, link_number, PRIM_ROT_LOCAL, link_rotation / difference_to_start_rot];
- ++i;
- }
- llSetLinkPrimitiveParamsFast(FALSE, params);
- }
- touch_start(integer num_detected)
- {
- llSetTimerEvent(FALSE);
- state idle;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement