aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared
diff options
context:
space:
mode:
authorMelanie2012-01-06 21:41:36 +0000
committerMelanie2012-01-06 21:41:36 +0000
commit11c48ac80708051a7d5b32ced81712b5c1be77aa (patch)
tree3a1e0fdd41b7c8a47072b84037828a9f4db31f27 /OpenSim/Region/ScriptEngine/Shared
parentReplaced llRot2Euler function. (diff)
parenteliminate a few tabs from OpenSimDefaults.ini (diff)
downloadopensim-SC_OLD-11c48ac80708051a7d5b32ced81712b5c1be77aa.zip
opensim-SC_OLD-11c48ac80708051a7d5b32ced81712b5c1be77aa.tar.gz
opensim-SC_OLD-11c48ac80708051a7d5b32ced81712b5c1be77aa.tar.bz2
opensim-SC_OLD-11c48ac80708051a7d5b32ced81712b5c1be77aa.tar.xz
Merge branch 'master' into careminster
Conflicts: OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs14
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs81
2 files changed, 61 insertions, 34 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 3bc8750..466e540 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -5096,15 +5096,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5096 return (double)Math.Asin(val); 5096 return (double)Math.Asin(val);
5097 } 5097 }
5098 5098
5099 // Xantor 30/apr/2008 5099 // jcochran 5/jan/2012
5100 public LSL_Float llAngleBetween(LSL_Rotation a, LSL_Rotation b) 5100 public LSL_Float llAngleBetween(LSL_Rotation a, LSL_Rotation b)
5101 { 5101 {
5102 m_host.AddScriptLPS(1); 5102 m_host.AddScriptLPS(1);
5103 5103
5104 double angle = Math.Acos(a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s) * 2; 5104 double aa = (a.x * a.x + a.y * a.y + a.z * a.z + a.s * a.s);
5105 if (angle < 0) angle = -angle; 5105 double bb = (b.x * b.x + b.y * b.y + b.z * b.z + b.s * b.s);
5106 if (angle > Math.PI) return (Math.PI * 2 - angle); 5106 double aa_bb = aa * bb;
5107 return angle; 5107 if (aa_bb == 0) return 0.0;
5108 double ab = (a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s);
5109 double quotient = (ab * ab) / aa_bb;
5110 if (quotient >= 1.0) return 0.0;
5111 return Math.Acos(2 * quotient - 1);
5108 } 5112 }
5109 5113
5110 public LSL_String llGetInventoryKey(string name) 5114 public LSL_String llGetInventoryKey(string name)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
index 7594691..3baa723 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
@@ -75,32 +75,49 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
75 [Test] 75 [Test]
76 public void TestllAngleBetween() 76 public void TestllAngleBetween()
77 { 77 {
78 CheckllAngleBetween(new Vector3(1, 0, 0), 0); 78 CheckllAngleBetween(new Vector3(1, 0, 0), 0, 1, 1);
79 CheckllAngleBetween(new Vector3(1, 0, 0), 90); 79 CheckllAngleBetween(new Vector3(1, 0, 0), 90, 1, 1);
80 CheckllAngleBetween(new Vector3(1, 0, 0), 180); 80 CheckllAngleBetween(new Vector3(1, 0, 0), 180, 1, 1);
81 81
82 CheckllAngleBetween(new Vector3(0, 1, 0), 0); 82 CheckllAngleBetween(new Vector3(0, 1, 0), 0, 1, 1);
83 CheckllAngleBetween(new Vector3(0, 1, 0), 90); 83 CheckllAngleBetween(new Vector3(0, 1, 0), 90, 1, 1);
84 CheckllAngleBetween(new Vector3(0, 1, 0), 180); 84 CheckllAngleBetween(new Vector3(0, 1, 0), 180, 1, 1);
85 85
86 CheckllAngleBetween(new Vector3(0, 0, 1), 0); 86 CheckllAngleBetween(new Vector3(0, 0, 1), 0, 1, 1);
87 CheckllAngleBetween(new Vector3(0, 0, 1), 90); 87 CheckllAngleBetween(new Vector3(0, 0, 1), 90, 1, 1);
88 CheckllAngleBetween(new Vector3(0, 0, 1), 180); 88 CheckllAngleBetween(new Vector3(0, 0, 1), 180, 1, 1);
89 89
90 CheckllAngleBetween(new Vector3(1, 1, 1), 0); 90 CheckllAngleBetween(new Vector3(1, 1, 1), 0, 1, 1);
91 CheckllAngleBetween(new Vector3(1, 1, 1), 90); 91 CheckllAngleBetween(new Vector3(1, 1, 1), 90, 1, 1);
92 CheckllAngleBetween(new Vector3(1, 1, 1), 180); 92 CheckllAngleBetween(new Vector3(1, 1, 1), 180, 1, 1);
93
94 CheckllAngleBetween(new Vector3(1, 0, 0), 0, 1.6f, 1.8f);
95 CheckllAngleBetween(new Vector3(1, 0, 0), 90, 0.3f, 3.9f);
96 CheckllAngleBetween(new Vector3(1, 0, 0), 180, 8.8f, 7.4f);
97
98 CheckllAngleBetween(new Vector3(0, 1, 0), 0, 9.8f, -9.4f);
99 CheckllAngleBetween(new Vector3(0, 1, 0), 90, 8.4f, -8.2f);
100 CheckllAngleBetween(new Vector3(0, 1, 0), 180, 0.4f, -5.8f);
101
102 CheckllAngleBetween(new Vector3(0, 0, 1), 0, -6.8f, 3.4f);
103 CheckllAngleBetween(new Vector3(0, 0, 1), 90, -3.6f, 5.6f);
104 CheckllAngleBetween(new Vector3(0, 0, 1), 180, -3.8f, 1.1f);
105
106 CheckllAngleBetween(new Vector3(1, 1, 1), 0, -7.7f, -2.0f);
107 CheckllAngleBetween(new Vector3(1, 1, 1), 90, -3.0f, -9.1f);
108 CheckllAngleBetween(new Vector3(1, 1, 1), 180, -7.9f, -8.0f);
93 } 109 }
94 110
95 private void CheckllAngleBetween(Vector3 axis,float originalAngle) 111 private void CheckllAngleBetween(Vector3 axis,float originalAngle, float denorm1, float denorm2)
96 { 112 {
97 Quaternion rotation1 = Quaternion.CreateFromAxisAngle(axis, 0); 113 Quaternion rotation1 = Quaternion.CreateFromAxisAngle(axis, 0);
98 Quaternion rotation2 = Quaternion.CreateFromAxisAngle(axis, ToRadians(originalAngle)); 114 Quaternion rotation2 = Quaternion.CreateFromAxisAngle(axis, ToRadians(originalAngle));
115 rotation1 *= denorm1;
116 rotation2 *= denorm2;
99 117
100 double deducedAngle = FromLslFloat(m_lslApi.llAngleBetween(ToLslQuaternion(rotation2), ToLslQuaternion(rotation1))); 118 double deducedAngle = FromLslFloat(m_lslApi.llAngleBetween(ToLslQuaternion(rotation2), ToLslQuaternion(rotation1)));
101 119
102 Assert.Greater(deducedAngle, ToRadians(originalAngle) - ANGLE_ACCURACY_IN_RADIANS); 120 Assert.That(deducedAngle, Is.EqualTo(ToRadians(originalAngle)).Within(ANGLE_ACCURACY_IN_RADIANS), "TestllAngleBetween check fail");
103 Assert.Less(deducedAngle, ToRadians(originalAngle) + ANGLE_ACCURACY_IN_RADIANS);
104 } 121 }
105 122
106 #region Conversions to and from LSL_Types 123 #region Conversions to and from LSL_Types
@@ -201,20 +218,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
201 CheckllRot2Euler(new LSL_Types.Quaternion(-0.092302, -0.701059, -0.092302, -0.701059)); 218 CheckllRot2Euler(new LSL_Types.Quaternion(-0.092302, -0.701059, -0.092302, -0.701059));
202 } 219 }
203 220
204 // Testing Rot2Euler this way instead of comparing against expected angles because 221 /// <summary>
205 // 1. There are several ways to get to the original Quaternion. For example a rotation 222 /// Check an llRot2Euler conversion.
206 // of PI and -PI will give the same result. But PI and -PI aren't equal. 223 /// </summary>
207 // 2. This method checks to see if the calculated angles from a quaternion can be used 224 /// <remarks>
208 // to create a new quaternion to produce the same rotation. 225 /// Testing Rot2Euler this way instead of comparing against expected angles because
209 // However, can't compare the newly calculated quaternion against the original because 226 /// 1. There are several ways to get to the original Quaternion. For example a rotation
210 // once again, there are multiple quaternions that give the same result. For instance 227 /// of PI and -PI will give the same result. But PI and -PI aren't equal.
211 // <X, Y, Z, S> == <-X, -Y, -Z, -S>. Additionally, the magnitude of S can be changed 228 /// 2. This method checks to see if the calculated angles from a quaternion can be used
212 // and will still result in the same rotation if the values for X, Y, Z are also changed 229 /// to create a new quaternion to produce the same rotation.
213 // to compensate. 230 /// However, can't compare the newly calculated quaternion against the original because
214 // However, if two quaternions represent the same rotation, then multiplying the first 231 /// once again, there are multiple quaternions that give the same result. For instance
215 // quaternion by the conjugate of the second, will give a third quaternion representing 232 /// <X, Y, Z, S> == <-X, -Y, -Z, -S>. Additionally, the magnitude of S can be changed
216 // a zero rotation. This can be tested for by looking at the X, Y, Z values which should 233 /// and will still result in the same rotation if the values for X, Y, Z are also changed
217 // be zero. 234 /// to compensate.
235 /// However, if two quaternions represent the same rotation, then multiplying the first
236 /// quaternion by the conjugate of the second, will give a third quaternion representing
237 /// a zero rotation. This can be tested for by looking at the X, Y, Z values which should
238 /// be zero.
239 /// </remarks>
240 /// <param name="rot"></param>
218 private void CheckllRot2Euler(LSL_Types.Quaternion rot) 241 private void CheckllRot2Euler(LSL_Types.Quaternion rot)
219 { 242 {
220 // Call LSL function to convert quaternion rotaion to euler radians. 243 // Call LSL function to convert quaternion rotaion to euler radians.