Make raycast more efficient by checking exclusion flags earlier

avinationmerge
Melanie 2011-12-17 12:57:20 +01:00
parent 8a9a8ed5c9
commit c4f1906b0a
1 changed files with 21 additions and 15 deletions

View File

@ -11184,7 +11184,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return contacts.ToArray();
}
private ContactResult[] ObjectIntersection(Vector3 rayStart, Vector3 rayEnd)
private ContactResult[] ObjectIntersection(Vector3 rayStart, Vector3 rayEnd, bool includePhysical, bool includeNonPhysical, bool includePhantom)
{
Ray ray = new Ray(rayStart, Vector3.Normalize(rayEnd - rayStart));
List<ContactResult> contacts = new List<ContactResult>();
@ -11199,6 +11199,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (group.IsAttachment)
return;
if (group.RootPart.PhysActor == null)
{
if (!includePhantom)
return;
}
else
{
if (group.RootPart.PhysActor.IsPhysical)
{
if (!includePhysical)
return;
}
else
{
if (!includeNonPhysical)
return;
}
}
// Find the radius ouside of which we don't even need to hit test
float minX;
float maxX;
@ -11434,7 +11453,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (checkPhysical || checkNonPhysical)
{
ContactResult[] objectHits = ObjectIntersection(rayStart, rayEnd);
ContactResult[] objectHits = ObjectIntersection(rayStart, rayEnd, checkPhysical, checkNonPhysical, detectPhantom);
foreach (ContactResult r in objectHits)
results.Add(r);
}
@ -11454,19 +11473,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// It's a prim!
if (part != null)
{
if (part.PhysActor != null)
{
if (part.PhysActor.IsPhysical && !checkPhysical)
continue;
if (!part.PhysActor.IsPhysical && !checkNonPhysical)
continue;
}
else
{
if (!detectPhantom)
continue;
}
if ((dataFlags & ScriptBaseClass.RC_GET_ROOT_KEY) == ScriptBaseClass.RC_GET_ROOT_KEY)
itemID = part.ParentGroup.UUID;
else