public override void Execute( IIntersectionSceneQueryListener listener )
{
MovableObjectFactoryMap factories = Root.Instance.MovableObjectFactories;
IEnumerator enumFactories = factories.GetEnumerator();
while ( enumFactories.Current != null )
{
KeyValuePair<string, MovableObjectFactory> map = (KeyValuePair<string, MovableObjectFactory>)enumFactories.Current;
MovableObjectCollection movableObjects = this.creator.GetMovableObjectCollection( map.Value.Type );
IEnumerator enumA = movableObjects.GetEnumerator();
while ( enumA.Current != null )
{
MovableObject objectA = (MovableObject)enumA.Current;
// skip group if query type doesn't match
if ( ( this.QueryTypeMask & objectA.TypeFlags ) == 0 )
{
break;
}
// skip if unattached or filtered out by query flags
if ( !objectA.IsInScene || ( objectA.QueryFlags & this.queryMask ) == 0 )
{
continue;
}
// Check against later objects in the same group
IEnumerator enumB = enumA;
while ( enumB.Current != null )
{
MovableObject objectB = (MovableObject)enumB.Current;
if ( ( ( this.QueryMask & objectB.QueryFlags ) != 0 ) && objectB.IsInScene )
{
AxisAlignedBox box1 = objectA.GetWorldBoundingBox();
AxisAlignedBox box2 = objectB.GetWorldBoundingBox();
if ( box1.Intersects( box2 ) )
{
listener.OnQueryResult( objectA, objectB );
}
}
enumB.MoveNext();
}
// Check against later groups
IEnumerator enumFactoriesLater = enumFactories;
while ( enumFactoriesLater.Current != null )
{
KeyValuePair<string, MovableObjectFactory> mapLater = (KeyValuePair<string, MovableObjectFactory>)enumFactoriesLater.Current;
MovableObjectCollection movableObjectsLater = this.creator.GetMovableObjectCollection( mapLater.Value.Type );
IEnumerator enumC = movableObjectsLater.GetEnumerator();
while ( enumC.Current != null )
{
MovableObject objectC = (MovableObject)enumC.Current;
// skip group if query type doesn't match
if ( ( this.QueryTypeMask & objectC.TypeFlags ) == 0 )
{
break;
}
if ( ( ( this.QueryMask & objectC.QueryFlags ) != 0 ) && objectC.IsInScene )
{
AxisAlignedBox box1 = objectA.GetWorldBoundingBox();
AxisAlignedBox box2 = objectC.GetWorldBoundingBox();
if ( box1.Intersects( box2 ) )
{
listener.OnQueryResult( objectA, objectC );
}
}
enumC.MoveNext();
}
enumFactoriesLater.MoveNext();
}
enumA.MoveNext();
}
enumFactories.MoveNext();
}
}
}