public override void Execute( IIntersectionSceneQueryListener listener )
{
Dictionary<MovableObject, MovableObject> set = new Dictionary<MovableObject, MovableObject>();
// Iterate over all movable types
foreach ( Core.MovableObjectFactory factory in Root.Instance.MovableObjectFactories.Values )
{
MovableObjectCollection col = creator.GetMovableObjectCollection( factory.Type );
foreach ( MovableObject e in col.Values )
{
PCZone zone = ( (PCZSceneNode)( e.ParentSceneNode ) ).HomeZone;
List<PCZSceneNode> list = new List<PCZSceneNode>();
//find the nodes that intersect the AAB
( (PCZSceneManager)creator ).FindNodesIn( e.GetWorldBoundingBox(), ref list, zone, null );
//grab all moveables from the node that intersect...
foreach ( PCZSceneNode node in list )
{
foreach ( MovableObject m in node.Objects )
{
// MovableObject m =
if ( m != e &&
!set.ContainsKey( m ) &&
!set.ContainsKey( e ) &&
( m.QueryFlags & queryMask ) != 0 &&
( m.TypeFlags & queryTypeMask ) != 0 &&
m.IsAttached &&
e.GetWorldBoundingBox().Intersects( m.GetWorldBoundingBox() ) )
{
listener.OnQueryResult( e, m );
// deal with attached objects, since they are not directly attached to nodes
if ( m.MovableType == "Entity" )
{
Entity e2 = (Entity)m;
foreach ( MovableObject c in e2.SubEntities )
{
if ( ( c.QueryFlags & queryMask ) != 0 &&
e.GetWorldBoundingBox().Intersects( c.GetWorldBoundingBox() ) )
{
listener.OnQueryResult( e, c );
}
}
}
}
set.Add( e, m );
}
}
}
}
}
}