Axiom.Core.DefaultIntersectionSceneQuery.Execute C# (CSharp) Метод

Execute() публичный метод

public Execute ( IIntersectionSceneQueryListener listener ) : void
listener IIntersectionSceneQueryListener
Результат void
		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();
			}
		}
	}
DefaultIntersectionSceneQuery