diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 70 |
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) |