Advertisement
Guest User

Untitled

a guest
Dec 1st, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. integer CHANNEL_RELAY = -1812221819;
  2.  
  3. vector forward;
  4. vector left;
  5. vector up;
  6. vector gCamFocus;
  7. vector gCamPos;
  8.  
  9. float movModifier = 20; //the higher this number, the slower the camera will move
  10. 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)
  11. 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)
  12.  
  13. key gSitter;
  14.  
  15. string NCName = "CamSettings";
  16. key NCID = NULL_KEY;
  17. integer NCLine = 0;
  18. key NCQuery = NULL_KEY;
  19.  
  20.  
  21. float dotProduct(vector v1, vector v2)
  22. {
  23.     return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;  
  24. }
  25.  
  26. vector vecProduct(vector v1, vector v2)
  27. {
  28.     float x = v1.y*v2.z - v1.z*v2.y;
  29.     float y = -1 * (v1.x*v2.z - v1.z*v2.x);
  30.     float z = v1.x*v2.y - v1.y*v2.x;
  31.     return <x, y, z>;
  32. }
  33.  
  34. float angleBetween(vector v1, vector v2)
  35. {
  36.     return llAcos( dotProduct(v1, v2) / (llVecMag(v1) * llVecMag(v2) ) );
  37. }
  38.  
  39. vector vectorProy(vector v, vector u1, vector u2)
  40. {
  41.     u1 = llVecNorm(u1);
  42.     u2 = llVecNorm(u2);
  43.    
  44.     return (dotProduct(v, u1)*u1 + dotProduct(v,u2)*u2 );
  45.    
  46. }
  47. default
  48. {
  49.     state_entry()
  50.     {
  51.         maxAngleVerticalAxis = maxAngleVerticalAxis * DEG_TO_RAD;//in radians
  52.         maxAngleHorizontalAxis = maxAngleHorizontalAxis * DEG_TO_RAD;//in radians
  53.         key id = llGetInventoryKey(NCName) ;
  54.         if(id!= NULL_KEY)
  55.         {
  56.             NCID = id;
  57.             NCQuery = llGetNotecardLine(NCName, NCLine);    
  58.         }        
  59.     }
  60.    
  61.     changed(integer change){
  62.         if(change & CHANGED_LINK){
  63.             key av = llAvatarOnSitTarget();
  64.             if(av != NULL_KEY){
  65.                 gSitter = av;
  66.                 llSetTimerEvent(3);
  67.             }else{
  68.                 llRegionSayTo(gSitter, CHANNEL_RELAY, "releasingCam,"+(string)gSitter+",@camunlock=y");
  69.                 gSitter = NULL_KEY;
  70.             }
  71.         }
  72.        
  73.         if(change & CHANGED_INVENTORY)
  74.         {
  75.             key id = llGetInventoryKey(NCName);
  76.             if(id != NCID)
  77.             {
  78.                 NCID = id;
  79.                 NCLine = 0;
  80.                 NCQuery = llGetNotecardLine(NCName, NCLine);
  81.             }
  82.         }
  83.     }
  84.    
  85.     dataserver(key queryId, string data)
  86.     {
  87.         if(queryId == NCQuery)
  88.         {
  89.             if(data != EOF)
  90.             {
  91.                 list info = llParseString2List(data, [":"], []);
  92.                 string mod = llList2String(info, 0);
  93.                 float amount = llList2Float(info,1);
  94.                 if(mod == "Vertical"){
  95.                     maxAngleVerticalAxis = amount * DEG_TO_RAD;
  96.                 }else if(mod == "Horizontal"){
  97.                     maxAngleHorizontalAxis = amount * DEG_TO_RAD;
  98.                 }else if(mod == "Speed"){
  99.                     movModifier = amount;
  100.                 }
  101.                 llOwnerSay("NC read\nVertical = " +(string) (maxAngleVerticalAxis * RAD_TO_DEG) + "\nHorizontal = " + (string) (maxAngleHorizontalAxis * RAD_TO_DEG) + "\nSpeed = " + (string) movModifier);
  102.                 if(llAvatarOnSitTarget()) llSetTimerEvent(1);
  103.                    
  104.             }
  105.         }
  106.     }
  107.    
  108.     run_time_permissions(integer perm){
  109.         if(PERMISSION_TAKE_CONTROLS & perm){
  110.             llTakeControls( CONTROL_FWD |
  111.                             CONTROL_BACK |
  112.                             CONTROL_ROT_LEFT |
  113.                             CONTROL_ROT_RIGHT , TRUE, FALSE);
  114.         }
  115.         if(perm & PERMISSION_CONTROL_CAMERA){
  116.             llSetCameraParams([CAMERA_ACTIVE, 1,
  117.                                 CAMERA_FOCUS, gCamFocus, // region relative position
  118.                                 CAMERA_FOCUS_LOCKED, TRUE,
  119.                                 CAMERA_POSITION, gCamPos, // region relative position
  120.                                 CAMERA_POSITION_LOCKED, TRUE,
  121.                                 CAMERA_FOCUS_LAG, 0.5]);
  122.             llSay(CHANNEL_RELAY, "lockingCam,"+(string)gSitter+",@camunlock=n|@camdistmin:0.1=n");  
  123.         }
  124.     }
  125.    
  126.     control(key id, integer change, integer held)
  127.     {
  128.         vector visionVector = gCamFocus-gCamPos;
  129.        
  130.         if (~change & held & CONTROL_FWD){
  131.             //The w or upper arrow key [↑] was released
  132.         }
  133.         if (change & ~held & CONTROL_FWD){
  134.             //The w or upper arrow key [↑] was pressed and held
  135.            
  136.             float angle = PI/2-angleBetween(vectorProy(visionVector, up, forward), up);  
  137.            
  138.             //llOwnerSay((string)(angle * RAD_TO_DEG));    
  139.             if(angle < maxAngleVerticalAxis)
  140.             {
  141.                gCamFocus = gCamFocus + (up/movModifier);
  142.             }
  143.         }
  144.        
  145.          if (~change & held & CONTROL_BACK){
  146.             //The s or lower arrow key [↓] was released
  147.         }
  148.        
  149.         if (change & ~held & CONTROL_BACK){
  150.             //The s or lower arrow key [↓] was pressed and held
  151.             //llOwnerSay((string)(angleBetween(visionVector, up)*RAD_TO_DEG));
  152.            
  153.             float angle = PI/2-angleBetween(vectorProy(visionVector, up, forward), up);
  154.             //llOwnerSay((string)(angle*RAD_TO_DEG));
  155.             if(angle > -maxAngleVerticalAxis)
  156.             {
  157.                gCamFocus = gCamFocus - (up/movModifier);
  158.             }
  159.         }
  160.        
  161.         if (~change & held & CONTROL_ROT_LEFT){
  162.             //The a or left arrow key [←] was released
  163.         }
  164.        
  165.         if (change & ~held & CONTROL_ROT_LEFT){
  166.             //The a or left arrow key [←] was pressed and held
  167.            
  168.             float angle = PI/2-angleBetween(vectorProy(visionVector, left, forward), left);
  169.             if(angle < maxAngleHorizontalAxis){
  170.                gCamFocus = gCamFocus + (left/movModifier);
  171.             }
  172.         }
  173.        
  174.         if (~change & held & CONTROL_ROT_RIGHT){
  175.             //The a or left arrow key [←] was released
  176.         }
  177.        
  178.         if (change & ~held & CONTROL_ROT_RIGHT){
  179.             //The a or left arrow key [←] was pressed and held
  180.             float angle = PI/2-angleBetween(vectorProy(visionVector, left, forward), left);
  181.             if(angle > -maxAngleHorizontalAxis)
  182.             {
  183.                gCamFocus = gCamFocus - (left/movModifier);
  184.             }
  185.         }
  186.        
  187.         llSetCameraParams([CAMERA_ACTIVE, 1,
  188.                                 CAMERA_FOCUS, gCamFocus, // region relative position
  189.                                 CAMERA_FOCUS_LOCKED, TRUE,
  190.                                 CAMERA_POSITION, gCamPos, // region relative position
  191.                                 CAMERA_POSITION_LOCKED, TRUE,
  192.                                 CAMERA_FOCUS_LAG, 0.5]);
  193.        
  194.     }
  195.    
  196.     timer()
  197.     {
  198.         vector size = llGetAgentSize(gSitter);
  199.         gCamPos = llList2Vector(llGetObjectDetails(gSitter, [OBJECT_POS]), 0) + <0, 0, size.z/2>;
  200.         forward = llRot2Fwd(llList2Rot(llGetObjectDetails(gSitter, [OBJECT_ROT]), 0));
  201.         left = llRot2Left(llList2Rot(llGetObjectDetails(gSitter, [OBJECT_ROT]), 0));
  202.         up = llRot2Up(llList2Rot(llGetObjectDetails(gSitter, [OBJECT_ROT]), 0));
  203.         llRequestPermissions(gSitter, PERMISSION_CONTROL_CAMERA|PERMISSION_TAKE_CONTROLS);
  204.         gCamFocus = gCamPos + forward*3;    
  205.         llSetTimerEvent(0.0);
  206.     }
  207.  
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement