CODE
rotation start_rot;
rotation stop_rot;
float lag = 0.2;
vector rot_axis;
float time_start;
float rate;
integer axis;
integer X = 1;
integer Y = 2;
integer Z = 3;
integer run = 1;
StartRotation(integer laxis, float lrate)
{
llResetTime();
start_rot = llGetLocalRot();
axis = laxis;
rate = lrate;
rate = (rate * DEG_TO_RAD);
if (axis == X) rot_axis = llVecNorm(llRot2Fwd (start_rot));
if (axis == Y) rot_axis = llVecNorm(llRot2Left (start_rot));
if (axis == Z) rot_axis = llVecNorm(llRot2Up (start_rot));
llSleep(0.3); //added to stop jitter on startup. odd?
time_start = llGetTime();
llTargetOmega(rot_axis, rate , 1.0);
}
StopRotation()
{
float angle = (rate * (llGetTime() - time_start)) + (rate * lag);
if (axis == X) stop_rot = llEuler2Rot(<angle, 0, 0>) * start_rot;
if (axis == Y) stop_rot = llEuler2Rot(<0, angle, 0>) * start_rot;
if (axis == Z) stop_rot = llEuler2Rot(<0, 0, angle>) * start_rot;
llSetLocalRot(stop_rot);
llTargetOmega(<1,0,0>, 0, 1);
}
default
{
state_entry()
{
stop_rot = llGetLocalRot();
}
touch_start(integer total_number)
{
if (run == 1)
{
StartRotation(X, 45.0);
run = 2;
}
else
{
StopRotation();
run = 1;
}
}
}
EDIT: had wrong values for Y ans Z