diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs index 42c5abc..cbd4db2 100644 --- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | |||
@@ -450,14 +450,43 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
450 | public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) | 450 | public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) |
451 | { | 451 | { |
452 | m_host.AddScriptLPS(1); | 452 | m_host.AddScriptLPS(1); |
453 | return (new LSL_Types.Vector3(0, 1, 0) * r); | 453 | double x,y,z,m; |
454 | m = Math.Sqrt(r.x*r.x+r.y*r.y+r.z*r.z+r.s*r.s); | ||
455 | // m is always greater than zero | ||
456 | if (m!=1) // if m is not equal to 1 then Rotation needs to be normalized | ||
457 | { | ||
458 | r.x/=m; | ||
459 | r.y/=m; | ||
460 | r.z/=m; | ||
461 | r.s/=m; | ||
462 | } | ||
463 | // Fast Algebric Calculations instead of Vectors & Quaternions Product | ||
464 | x = 2*(r.x*r.y-r.z*r.s); | ||
465 | y = -r.x*r.x+r.y*r.y-r.z*r.z+r.s*r.s; | ||
466 | z = 2*(r.x*r.s+r.y*r.z); | ||
467 | return (new LSL_Types.Vector3(x,y,z)); | ||
454 | } | 468 | } |
455 | 469 | ||
456 | public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r) | 470 | public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r) |
457 | { | 471 | { |
458 | m_host.AddScriptLPS(1); | 472 | m_host.AddScriptLPS(1); |
459 | return (new LSL_Types.Vector3(0, 0, 1) * r); | 473 | double x,y,z,m; |
474 | m = Math.Sqrt(r.x*r.x+r.y*r.y+r.z*r.z+r.s*r.s); | ||
475 | // m is always greater than zero | ||
476 | if (m!=1) // if m is not equal to 1 then Rotation needs to be normalized | ||
477 | { | ||
478 | r.x/=m; | ||
479 | r.y/=m; | ||
480 | r.z/=m; | ||
481 | r.s/=m; | ||
482 | } | ||
483 | // Fast Algebric Calculations instead of Vectors & Quaternions Product | ||
484 | x = 2*(r.x*r.z+r.y*r.s); | ||
485 | y = 2*(-r.x*r.s+r.y*r.z); | ||
486 | z = -r.x*r.x-r.y*r.y+r.z*r.z+r.s*r.s; | ||
487 | return (new LSL_Types.Vector3(x,y,z)); | ||
460 | } | 488 | } |
489 | |||
461 | public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 a, LSL_Types.Vector3 b) | 490 | public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 a, LSL_Types.Vector3 b) |
462 | { | 491 | { |
463 | //A and B should both be normalized | 492 | //A and B should both be normalized |