aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs70
1 files changed, 39 insertions, 31 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 79bd6fe..9b860f5 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -406,41 +406,49 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
406 406
407 return new LSL_Types.Quaternion(x, y, z, s); 407 return new LSL_Types.Quaternion(x, y, z, s);
408 } 408 }
409 409
410 public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) 410 public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up)
411 { 411 {
412 m_host.AddScriptLPS(1); 412 m_host.AddScriptLPS(1);
413 double x,y,z,s; 413 double x, y, z, s;
414 int f=0; 414 int f = 0;
415 // Important Note: q1=<x,y,z,s> is equal to q2=<-x,-y,-z,-s> 415 // Important Note: q1=<x,y,z,s> is equal to q2=<-x,-y,-z,-s>
416 // Computing quaternion x,y,z,s values 416 // Computing quaternion x,y,z,s values
417 x=((fwd.x-left.y-up.z+1)/4); 417 x = ((fwd.x - left.y - up.z + 1) / 4);
418 x*=x; 418 x *= x;
419 x=Math.Sqrt(Math.Sqrt(x)); 419 x = Math.Sqrt(Math.Sqrt(x));
420 y=((1-up.z)/2-x*x); 420 y = ((1 - up.z) / 2 - x * x);
421 y*=y; 421 y *= y;
422 y=Math.Sqrt(Math.Sqrt(y)); 422 y = Math.Sqrt(Math.Sqrt(y));
423 z=((1-left.y)/2-x*x); 423 z = ((1 - left.y) / 2 - x * x);
424 z*=z; 424 z *= z;
425 z=Math.Sqrt(Math.Sqrt(z)); 425 z = Math.Sqrt(Math.Sqrt(z));
426 s=(1-x*x-y*y-z*z); 426 s = (1 - x * x - y * y - z * z);
427 s*=s; 427 s *= s;
428 s=Math.Sqrt(Math.Sqrt(s)); 428 s = Math.Sqrt(Math.Sqrt(s));
429 429
430 // Set f for signs detection 430 // Set f for signs detection
431 if (fwd.y+left.x >= 0){f+=1;} 431 if (fwd.y + left.x >= 0) { f += 1; }
432 if (fwd.z+up.x >= 0){f+=2;} 432 if (fwd.z + up.x >= 0) { f += 2; }
433 if (left.z-up.y >= 0){f+=4;} 433 if (left.z - up.y >= 0) { f += 4; }
434 // Set correct quaternion signs based on f value 434 // Set correct quaternion signs based on f value
435 if (f==0){x=-x;} 435 if (f == 0) { x = -x; }
436 if (f==1){x=-x;y=-y;} 436 if (f == 1) { x = -x; y = -y; }
437 if (f==2){x=-x;z=-z;} 437 if (f == 2) { x = -x; z = -z; }
438 if (f==3){s=-s;} 438 if (f == 3) { s = -s; }
439 if (f==4){x=-x;s=-s;} 439 if (f == 4) { x = -x; s = -s; }
440 if (f==5){z=-z;} 440 if (f == 5) { z = -z; }
441 if (f==6){y=-y;} 441 if (f == 6) { y = -y; }
442 return new LSL_Types.Quaternion(x, y, z, s); 442
443 LSL_Types.Quaternion result = new LSL_Types.Quaternion(x, y, z, s);
444
445 // a hack to correct a few questionable angles :(
446 LSL_Types.Vector3 fwdTest = new LSL_Types.Vector3(1, 0, 0);
447 LSL_Types.Vector3 leftTest = new LSL_Types.Vector3(0, 1, 0);
448 if (llVecDist(fwdTest * result, fwd) > 0.001 || llVecDist(leftTest * result, left) > 0.001)
449 result.s = -s;
443 450
451 return result;
444 } 452 }
445 453
446 public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) 454 public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r)