aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs21
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