diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
-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 | ||