Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- list agents = [];
- float closingStartAngle;
- float angle;
- vector hinge;
- vector ref_pos;
- float distance_from_hinge(vector aPos)
- {
- return llVecDist(<hinge.x, hinge.y, 0>, <aPos.x, aPos.y, 0>);
- }
- //https://stackoverflow.com/questions/1211212/how-to-calculate-an-angle-from-three-points
- float getAngle(float centreX, float centreY, float pointX, float pointY)
- {
- float x = pointX - centreX;
- float y = pointY - centreY;
- float magnitude = llSqrt(x * x + y * y);
- float angle;
- if (magnitude > 0)
- angle = llAcos(x / magnitude);
- angle = angle * 180 / PI;
- if (y < 0)
- angle = 360 - angle;
- return angle;
- }
- vector get_hinge()
- {
- vector scale = llGetScale();
- return <ref_pos.x - (scale.x/2), ref_pos.y + (scale.y/2), ref_pos.z>;
- }
- vector rotate_around_axis(vector axis, vector position, rotation r)
- {
- // Calculate position's offset from axis.
- vector offset = position - axis;
- // Rotate the offset
- vector rotOffset = offset * r;
- return axis + rotOffset;
- }
- float sine_easeInOut2(float time, float begin, float cend, float duration)
- {
- cend = cend - begin;
- return -cend/2 * (llCos(PI * time / duration) - 1) + begin;
- }
- default
- {
- state_entry()
- {
- ref_pos = llGetPos();
- hinge = get_hinge();
- state idle;
- }
- }
- state idle
- {
- state_entry()
- {
- agents = [];
- llVolumeDetect(TRUE);
- llSetText("Idle", <1,1,1>, 0.5);
- angle = 90;
- }
- collision_start(integer num_detected)
- {
- integer i;
- for (i = 0; i < num_detected; i++)
- {
- if (llDetectedType(i) & AGENT)
- {
- agents += [llDetectedKey(i)];
- }
- }
- if (llGetListLength(agents) > 0)
- {
- state open;
- }
- }
- }
- state open
- {
- state_entry()
- {
- llSetTimerEvent(2 / llGetRegionFPS());
- llSensorRepeat("", NULL_KEY, AGENT_BY_LEGACY_NAME, 2.5, PI, 0.1);
- }
- no_sensor()
- {
- llSetTimerEvent(FALSE);
- state closing;
- }
- timer()
- {
- integer i;
- integer numAgents = llGetListLength(agents);
- integer agentsInRange = 0;
- for (i = 0; i < numAgents; i++)
- {
- key agent = llList2Key(agents, i);
- vector agentPos = llList2Vector(llGetObjectDetails(agent, [OBJECT_POS]), 0);
- if (distance_from_hinge(agentPos) < 1.25)
- {
- agentsInRange++;
- float thisAngle = getAngle(hinge.x, hinge.y, agentPos.x, agentPos.y) + 15;
- if (thisAngle > 90 && thisAngle < 180)
- {
- if(numAgents == 1 || thisAngle > angle) angle = thisAngle;
- }
- }
- }
- if (agentsInRange > 0)
- {
- llSetText("Open " + (string) angle, <1,1,1>, 0.5);
- rotation r = llAxisAngle2Rot(<0,0,1>, angle * DEG_TO_RAD);
- vector p = rotate_around_axis(hinge, ref_pos, r);
- llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_ROTATION, r, PRIM_POSITION, p]);
- } else {
- state closing;
- }
- }
- }
- state closing
- {
- state_entry()
- {
- agents = [];
- closingStartAngle = angle;
- llSetTimerEvent(1 / llGetRegionFPS());
- llResetTime();
- llSetText("Closing", <1,1,1>, 0.5);
- }
- collision_start(integer num_detected)
- {
- integer i;
- for (i = 0; i < num_detected; i++)
- {
- if (llDetectedType(i) & AGENT)
- {
- agents += [llDetectedKey(i)];
- }
- }
- if (llGetListLength(agents) > 0)
- {
- state open;
- }
- }
- timer()
- {
- float elapsed_time = llGetTime();
- // float sine_easeInOut(float time, float begin, float cend, float duration)
- // {
- // return -cend/2 * (llCos(PI * time / duration) - 1) + begin;
- // }
- if (elapsed_time > 3.0)
- {
- llSetTimerEvent(FALSE);
- angle = 90;
- rotation r = llAxisAngle2Rot(<0,0,1>, angle * DEG_TO_RAD);
- vector p = rotate_around_axis(hinge, ref_pos, r);
- llSetLinkPrimitiveParams(LINK_THIS, [PRIM_ROTATION, r, PRIM_POSITION, p]);
- state idle;
- }
- if (elapsed_time < 3.0)
- {
- angle = sine_easeInOut2(elapsed_time, closingStartAngle, 90, 3.0);
- llSetText("Closing " + (string) angle, <1,1,1>, 0.5);
- rotation r = llAxisAngle2Rot(<0,0,1>, angle * DEG_TO_RAD);
- vector p = rotate_around_axis(hinge, ref_pos, r);
- llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_ROTATION, r, PRIM_POSITION, p]);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement