diff options
author | John Cochran | 2012-01-05 07:37:08 -0600 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-01-06 21:14:42 +0000 |
commit | ff5a83d192105e4674cff261b13a447ff0d1e478 (patch) | |
tree | fe81ac25a73ca3e26ae2f1e4225dd17d9c5d8753 /OpenSim/Region/ScriptEngine/Shared/Api | |
parent | Add script instruction count back to llRot2Euler. Other minor formatting/doc... (diff) | |
download | opensim-SC-ff5a83d192105e4674cff261b13a447ff0d1e478.zip opensim-SC-ff5a83d192105e4674cff261b13a447ff0d1e478.tar.gz opensim-SC-ff5a83d192105e4674cff261b13a447ff0d1e478.tar.bz2 opensim-SC-ff5a83d192105e4674cff261b13a447ff0d1e478.tar.xz |
Fixed llAngleBetween() to allow denormal rotations
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index a35e75f..d6de39f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -4698,15 +4698,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4698 | return (double)Math.Asin(val); | 4698 | return (double)Math.Asin(val); |
4699 | } | 4699 | } |
4700 | 4700 | ||
4701 | // Xantor 30/apr/2008 | 4701 | // jcochran 5/jan/2012 |
4702 | public LSL_Float llAngleBetween(LSL_Rotation a, LSL_Rotation b) | 4702 | public LSL_Float llAngleBetween(LSL_Rotation a, LSL_Rotation b) |
4703 | { | 4703 | { |
4704 | m_host.AddScriptLPS(1); | 4704 | m_host.AddScriptLPS(1); |
4705 | 4705 | ||
4706 | double angle = Math.Acos(a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s) * 2; | 4706 | double aa = (a.x * a.x + a.y * a.y + a.z * a.z + a.s * a.s); |
4707 | if (angle < 0) angle = -angle; | 4707 | double bb = (b.x * b.x + b.y * b.y + b.z * b.z + b.s * b.s); |
4708 | if (angle > Math.PI) return (Math.PI * 2 - angle); | 4708 | double aa_bb = aa * bb; |
4709 | return angle; | 4709 | if (aa_bb == 0) return 0.0; |
4710 | double ab = (a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s); | ||
4711 | double quotient = (ab * ab) / aa_bb; | ||
4712 | if (quotient >= 1.0) return 0.0; | ||
4713 | return Math.Acos(2 * quotient - 1); | ||
4710 | } | 4714 | } |
4711 | 4715 | ||
4712 | public LSL_String llGetInventoryKey(string name) | 4716 | public LSL_String llGetInventoryKey(string name) |