aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs33
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs32
2 files changed, 61 insertions, 4 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
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index e396bb4..decd2d0 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -437,13 +437,41 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
437 public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) 437 public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r)
438 { 438 {
439 m_host.AddScriptLPS(1); 439 m_host.AddScriptLPS(1);
440 return (new LSL_Types.Vector3(0, 1, 0) * r); 440 double x,y,z,m;
441 m = Math.Sqrt(r.x*r.x+r.y*r.y+r.z*r.z+r.s*r.s);
442 // m is always greater than zero
443 if (m!=1) // if m is not equal to 1 then Rotation needs to be normalized
444 {
445 r.x/=m;
446 r.y/=m;
447 r.z/=m;
448 r.s/=m;
449 }
450 // Fast Algebric Calculations instead of Vectors & Quaternions Product
451 x = 2*(r.x*r.y-r.z*r.s);
452 y = -r.x*r.x+r.y*r.y-r.z*r.z+r.s*r.s;
453 z = 2*(r.x*r.s+r.y*r.z);
454 return (new LSL_Types.Vector3(x,y,z));
441 } 455 }
442 456
443 public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r) 457 public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r)
444 { 458 {
445 m_host.AddScriptLPS(1); 459 m_host.AddScriptLPS(1);
446 return (new LSL_Types.Vector3(0, 0, 1) * r); 460 double x,y,z,m;
461 m = Math.Sqrt(r.x*r.x+r.y*r.y+r.z*r.z+r.s*r.s);
462 // m is always greater than zero
463 if (m!=1) // if m is not equal to 1 then Rotation needs to be normalized
464 {
465 r.x/=m;
466 r.y/=m;
467 r.z/=m;
468 r.s/=m;
469 }
470 // Fast Algebric Calculations instead of Vectors & Quaternions Product
471 x = 2*(r.x*r.z+r.y*r.s);
472 y = 2*(-r.x*r.s+r.y*r.z);
473 z = -r.x*r.x-r.y*r.y+r.z*r.z+r.s*r.s;
474 return (new LSL_Types.Vector3(x,y,z));
447 } 475 }
448 476
449 public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 a, LSL_Types.Vector3 b) 477 public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 a, LSL_Types.Vector3 b)