diff options
author | teravus | 2013-01-23 21:58:51 -0500 |
---|---|---|
committer | teravus | 2013-01-23 21:58:51 -0500 |
commit | 878df52515ea3519130ba646a050c8d8c1f09b29 (patch) | |
tree | 2fbccc21e6e45e8ad552b4bece3f331322a6e838 /OpenSim/Region/ScriptEngine | |
parent | Remove unnecessary System.Linq reference from Compiler.cs (diff) | |
download | opensim-SC_OLD-878df52515ea3519130ba646a050c8d8c1f09b29.zip opensim-SC_OLD-878df52515ea3519130ba646a050c8d8c1f09b29.tar.gz opensim-SC_OLD-878df52515ea3519130ba646a050c8d8c1f09b29.tar.bz2 opensim-SC_OLD-878df52515ea3519130ba646a050c8d8c1f09b29.tar.xz |
* This makes the non-physics llCastRay 'better'. It's not 'correctly working', and if you look deep enough, you see that the results are not really stable depending on the direction of the ray.
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 63f4800..001f4d9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -11152,12 +11152,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11152 | radius = Math.Abs(maxY); | 11152 | radius = Math.Abs(maxY); |
11153 | if (Math.Abs(maxZ) > radius) | 11153 | if (Math.Abs(maxZ) > radius) |
11154 | radius = Math.Abs(maxZ); | 11154 | radius = Math.Abs(maxZ); |
11155 | 11155 | radius = radius*1.413f; | |
11156 | Vector3 ac = group.AbsolutePosition - rayStart; | 11156 | Vector3 ac = group.AbsolutePosition - rayStart; |
11157 | Vector3 bc = group.AbsolutePosition - rayEnd; | 11157 | Vector3 bc = group.AbsolutePosition - rayEnd; |
11158 | 11158 | ||
11159 | double d = Math.Abs(Vector3.Mag(Vector3.Cross(ab, ac)) / Vector3.Distance(rayStart, rayEnd)); | 11159 | double d = Math.Abs(Vector3.Mag(Vector3.Cross(ab, ac)) / Vector3.Distance(rayStart, rayEnd)); |
11160 | 11160 | ||
11161 | // Too far off ray, don't bother | 11161 | // Too far off ray, don't bother |
11162 | if (d > radius) | 11162 | if (d > radius) |
11163 | return; | 11163 | return; |
@@ -11167,11 +11167,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11167 | if (d2 > 0) | 11167 | if (d2 > 0) |
11168 | return; | 11168 | return; |
11169 | 11169 | ||
11170 | ray = new Ray(rayStart, Vector3.Normalize(rayEnd - rayStart)); | ||
11170 | EntityIntersection intersection = group.TestIntersection(ray, true, false); | 11171 | EntityIntersection intersection = group.TestIntersection(ray, true, false); |
11171 | // Miss. | 11172 | // Miss. |
11172 | if (!intersection.HitTF) | 11173 | if (!intersection.HitTF) |
11173 | return; | 11174 | return; |
11174 | 11175 | ||
11176 | Vector3 b1 = group.AbsolutePosition + new Vector3(minX, minY, minZ); | ||
11177 | Vector3 b2 = group.AbsolutePosition + new Vector3(maxX, maxY, maxZ); | ||
11178 | //m_log.DebugFormat("[LLCASTRAY]: min<{0},{1},{2}>, max<{3},{4},{5}> = hitp<{6},{7},{8}>", b1.X,b1.Y,b1.Z,b2.X,b2.Y,b2.Z,intersection.ipoint.X,intersection.ipoint.Y,intersection.ipoint.Z); | ||
11179 | if (!(intersection.ipoint.X >= b1.X && intersection.ipoint.X <= b2.X && | ||
11180 | intersection.ipoint.Y >= b1.Y && intersection.ipoint.Y <= b2.Y && | ||
11181 | intersection.ipoint.Z >= b1.Z && intersection.ipoint.Z <= b2.Z)) | ||
11182 | return; | ||
11183 | |||
11175 | ContactResult result = new ContactResult (); | 11184 | ContactResult result = new ContactResult (); |
11176 | result.ConsumerID = group.LocalId; | 11185 | result.ConsumerID = group.LocalId; |
11177 | result.Depth = intersection.distance; | 11186 | result.Depth = intersection.distance; |
@@ -11423,8 +11432,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11423 | if (checkPhysical || checkNonPhysical || detectPhantom) | 11432 | if (checkPhysical || checkNonPhysical || detectPhantom) |
11424 | { | 11433 | { |
11425 | ContactResult[] objectHits = ObjectIntersection(rayStart, rayEnd, checkPhysical, checkNonPhysical, detectPhantom); | 11434 | ContactResult[] objectHits = ObjectIntersection(rayStart, rayEnd, checkPhysical, checkNonPhysical, detectPhantom); |
11426 | foreach (ContactResult r in objectHits) | 11435 | for (int iter = 0; iter < objectHits.Length; iter++) |
11427 | results.Add(r); | 11436 | { |
11437 | // Redistance the Depth because the Scene RayCaster returns distance from center to make the rezzing code simpler. | ||
11438 | objectHits[iter].Depth = Vector3.Distance(objectHits[iter].Pos, rayStart); | ||
11439 | results.Add(objectHits[iter]); | ||
11440 | } | ||
11428 | } | 11441 | } |
11429 | } | 11442 | } |
11430 | 11443 | ||