From ff5a83d192105e4674cff261b13a447ff0d1e478 Mon Sep 17 00:00:00 2001 From: John Cochran Date: Thu, 5 Jan 2012 07:37:08 -0600 Subject: Fixed llAngleBetween() to allow denormal rotations --- .../ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation') 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 return (double)Math.Asin(val); } - // Xantor 30/apr/2008 + // jcochran 5/jan/2012 public LSL_Float llAngleBetween(LSL_Rotation a, LSL_Rotation b) { m_host.AddScriptLPS(1); - double angle = Math.Acos(a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s) * 2; - if (angle < 0) angle = -angle; - if (angle > Math.PI) return (Math.PI * 2 - angle); - return angle; + double aa = (a.x * a.x + a.y * a.y + a.z * a.z + a.s * a.s); + double bb = (b.x * b.x + b.y * b.y + b.z * b.z + b.s * b.s); + double aa_bb = aa * bb; + if (aa_bb == 0) return 0.0; + double ab = (a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s); + double quotient = (ab * ab) / aa_bb; + if (quotient >= 1.0) return 0.0; + return Math.Acos(2 * quotient - 1); } public LSL_String llGetInventoryKey(string name) -- cgit v1.1