Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- integer CHANNEL_RELAY = -1812221819;
- vector forward;
- vector left;
- vector up;
- vector gCamFocus;
- vector gCamPos;
- float movModifier = 20; //the higher this number, the slower the camera will move
- float maxAngleVerticalAxis = 10; //in degrees, it will go this ammount above and below, so the final FOV will be double the number set here, also, it can't be set higher than 90 (it will be considered 90)
- float maxAngleHorizontalAxis = 10; //in degrees, it will go this ammount above and below, so the final FOV will be double the number set here, also, it can't be set higher than 90 (it will be considered 90)
- key gSitter;
- string NCName = "CamSettings";
- key NCID = NULL_KEY;
- integer NCLine = 0;
- key NCQuery = NULL_KEY;
- float dotProduct(vector v1, vector v2)
- {
- return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
- }
- vector vecProduct(vector v1, vector v2)
- {
- float x = v1.y*v2.z - v1.z*v2.y;
- float y = -1 * (v1.x*v2.z - v1.z*v2.x);
- float z = v1.x*v2.y - v1.y*v2.x;
- return <x, y, z>;
- }
- float angleBetween(vector v1, vector v2)
- {
- return llAcos( dotProduct(v1, v2) / (llVecMag(v1) * llVecMag(v2) ) );
- }
- vector vectorProy(vector v, vector u1, vector u2)
- {
- u1 = llVecNorm(u1);
- u2 = llVecNorm(u2);
- return (dotProduct(v, u1)*u1 + dotProduct(v,u2)*u2 );
- }
- default
- {
- state_entry()
- {
- maxAngleVerticalAxis = maxAngleVerticalAxis * DEG_TO_RAD;//in radians
- maxAngleHorizontalAxis = maxAngleHorizontalAxis * DEG_TO_RAD;//in radians
- key id = llGetInventoryKey(NCName) ;
- if(id!= NULL_KEY)
- {
- NCID = id;
- NCQuery = llGetNotecardLine(NCName, NCLine);
- }
- }
- changed(integer change){
- if(change & CHANGED_LINK){
- key av = llAvatarOnSitTarget();
- if(av != NULL_KEY){
- gSitter = av;
- llSetTimerEvent(3);
- }else{
- llRegionSayTo(gSitter, CHANNEL_RELAY, "releasingCam,"+(string)gSitter+",@camunlock=y");
- gSitter = NULL_KEY;
- }
- }
- if(change & CHANGED_INVENTORY)
- {
- key id = llGetInventoryKey(NCName);
- if(id != NCID)
- {
- NCID = id;
- NCLine = 0;
- NCQuery = llGetNotecardLine(NCName, NCLine);
- }
- }
- }
- dataserver(key queryId, string data)
- {
- if(queryId == NCQuery)
- {
- if(data != EOF)
- {
- list info = llParseString2List(data, [":"], []);
- string mod = llList2String(info, 0);
- float amount = llList2Float(info,1);
- if(mod == "Vertical"){
- maxAngleVerticalAxis = amount * DEG_TO_RAD;
- }else if(mod == "Horizontal"){
- maxAngleHorizontalAxis = amount * DEG_TO_RAD;
- }else if(mod == "Speed"){
- movModifier = amount;
- }
- llOwnerSay("NC read\nVertical = " +(string) (maxAngleVerticalAxis * RAD_TO_DEG) + "\nHorizontal = " + (string) (maxAngleHorizontalAxis * RAD_TO_DEG) + "\nSpeed = " + (string) movModifier);
- if(llAvatarOnSitTarget()) llSetTimerEvent(1);
- }
- }
- }
- run_time_permissions(integer perm){
- if(PERMISSION_TAKE_CONTROLS & perm){
- llTakeControls( CONTROL_FWD |
- CONTROL_BACK |
- CONTROL_ROT_LEFT |
- CONTROL_ROT_RIGHT , TRUE, FALSE);
- }
- if(perm & PERMISSION_CONTROL_CAMERA){
- llSetCameraParams([CAMERA_ACTIVE, 1,
- CAMERA_FOCUS, gCamFocus, // region relative position
- CAMERA_FOCUS_LOCKED, TRUE,
- CAMERA_POSITION, gCamPos, // region relative position
- CAMERA_POSITION_LOCKED, TRUE,
- CAMERA_FOCUS_LAG, 0.5]);
- llSay(CHANNEL_RELAY, "lockingCam,"+(string)gSitter+",@camunlock=n|@camdistmin:0.1=n");
- }
- }
- control(key id, integer change, integer held)
- {
- vector visionVector = gCamFocus-gCamPos;
- if (~change & held & CONTROL_FWD){
- //The w or upper arrow key [↑] was released
- }
- if (change & ~held & CONTROL_FWD){
- //The w or upper arrow key [↑] was pressed and held
- float angle = PI/2-angleBetween(vectorProy(visionVector, up, forward), up);
- //llOwnerSay((string)(angle * RAD_TO_DEG));
- if(angle < maxAngleVerticalAxis)
- {
- gCamFocus = gCamFocus + (up/movModifier);
- }
- }
- if (~change & held & CONTROL_BACK){
- //The s or lower arrow key [↓] was released
- }
- if (change & ~held & CONTROL_BACK){
- //The s or lower arrow key [↓] was pressed and held
- //llOwnerSay((string)(angleBetween(visionVector, up)*RAD_TO_DEG));
- float angle = PI/2-angleBetween(vectorProy(visionVector, up, forward), up);
- //llOwnerSay((string)(angle*RAD_TO_DEG));
- if(angle > -maxAngleVerticalAxis)
- {
- gCamFocus = gCamFocus - (up/movModifier);
- }
- }
- if (~change & held & CONTROL_ROT_LEFT){
- //The a or left arrow key [←] was released
- }
- if (change & ~held & CONTROL_ROT_LEFT){
- //The a or left arrow key [←] was pressed and held
- float angle = PI/2-angleBetween(vectorProy(visionVector, left, forward), left);
- if(angle < maxAngleHorizontalAxis){
- gCamFocus = gCamFocus + (left/movModifier);
- }
- }
- if (~change & held & CONTROL_ROT_RIGHT){
- //The a or left arrow key [←] was released
- }
- if (change & ~held & CONTROL_ROT_RIGHT){
- //The a or left arrow key [←] was pressed and held
- float angle = PI/2-angleBetween(vectorProy(visionVector, left, forward), left);
- if(angle > -maxAngleHorizontalAxis)
- {
- gCamFocus = gCamFocus - (left/movModifier);
- }
- }
- llSetCameraParams([CAMERA_ACTIVE, 1,
- CAMERA_FOCUS, gCamFocus, // region relative position
- CAMERA_FOCUS_LOCKED, TRUE,
- CAMERA_POSITION, gCamPos, // region relative position
- CAMERA_POSITION_LOCKED, TRUE,
- CAMERA_FOCUS_LAG, 0.5]);
- }
- timer()
- {
- vector size = llGetAgentSize(gSitter);
- gCamPos = llList2Vector(llGetObjectDetails(gSitter, [OBJECT_POS]), 0) + <0, 0, size.z/2>;
- forward = llRot2Fwd(llList2Rot(llGetObjectDetails(gSitter, [OBJECT_ROT]), 0));
- left = llRot2Left(llList2Rot(llGetObjectDetails(gSitter, [OBJECT_ROT]), 0));
- up = llRot2Up(llList2Rot(llGetObjectDetails(gSitter, [OBJECT_ROT]), 0));
- llRequestPermissions(gSitter, PERMISSION_CONTROL_CAMERA|PERMISSION_TAKE_CONTROLS);
- gCamFocus = gCamPos + forward*3;
- llSetTimerEvent(0.0);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement