示例#1
0
        private TrileInstance OffsetInstanceOrOverlapsContain(TrileInstance instance, Vector3 screenSpacePosition, bool depthIsZ, int forwardSign, bool useSelector, QueryOptions context, out LevelManager.QueryResult queryResult)
        {
            TrileInstance nearest = (TrileInstance)null;

            queryResult = LevelManager.QueryResult.Full;
            LevelManager.QueryResult queryResult1 = LevelManager.QueryResult.Nothing;
            if (LevelManager.OffsetInstanceContains(screenSpacePosition, instance, depthIsZ) && (!useSelector || this.InstanceMaterialForQuery(instance, context, out queryResult)))
            {
                nearest      = instance;
                queryResult1 = queryResult;
            }
            if (instance.Overlaps)
            {
                foreach (TrileInstance trileInstance in instance.OverlappedTriles)
                {
                    if (LevelManager.OffsetInstanceContains(screenSpacePosition, trileInstance, depthIsZ) && (!useSelector || this.InstanceMaterialForQuery(trileInstance, context, out queryResult)))
                    {
                        nearest      = LevelManager.KeepNearestInstance(nearest, trileInstance, depthIsZ, forwardSign);
                        queryResult1 = queryResult;
                    }
                }
            }
            queryResult = queryResult1;
            return(nearest);
        }
示例#2
0
        private bool InstanceMaterialForQuery(TrileInstance instance, QueryOptions options, out LevelManager.QueryResult queryResult)
        {
            Trile         trile       = instance.Trile;
            CollisionType rotatedFace = instance.GetRotatedFace((options & QueryOptions.Background) == QueryOptions.Background ? FezMath.GetOpposite(this.CameraManager.VisibleOrientation) : this.CameraManager.VisibleOrientation);

            queryResult = trile.Immaterial || instance.PhysicsState != null && instance.PhysicsState.UpdatingPhysics || rotatedFace == CollisionType.Immaterial ? LevelManager.QueryResult.Nothing : (trile.Thin ? LevelManager.QueryResult.Thin : LevelManager.QueryResult.Full);
            return(queryResult != LevelManager.QueryResult.Nothing);
        }
示例#3
0
        private TrileInstance OffsetInstanceAt(ref TrileEmplacement emplacement, ref Vector3 screenSpacePosition, bool depthIsZ, int forwardSign, bool useSelector, bool keepNearest, bool simpleTest, QueryOptions context, out LevelManager.QueryResult nearestQueryResult)
        {
            LevelManager.QueryResult queryResult = LevelManager.QueryResult.Nothing;
            TrileInstance            instance1;

            if (this.Triles.TryGetValue(emplacement, out instance1))
            {
                instance1 = this.OffsetInstanceOrOverlapsContain(instance1, screenSpacePosition, depthIsZ, forwardSign, useSelector, context, out queryResult);
            }
            if (simpleTest || instance1 != null && !keepNearest)
            {
                nearestQueryResult = queryResult;
                return(instance1);
            }
            else
            {
                TrileInstance nearest = instance1;
                nearestQueryResult = queryResult;
                bool             flag      = depthIsZ;
                int              num       = (double)FezMath.Frac(screenSpacePosition.X) > 0.5 ? 1 : -1;
                TrileEmplacement id        = flag ? emplacement.GetOffset(num, 0, 0) : emplacement.GetOffset(0, 0, num);
                TrileInstance    instance2 = this.TrileInstanceAt(ref id);
                if (instance2 != null)
                {
                    TrileInstance contender = this.OffsetInstanceOrOverlapsContain(instance2, screenSpacePosition, depthIsZ, forwardSign, useSelector, context, out queryResult);
                    if (contender != null)
                    {
                        nearestQueryResult = queryResult;
                        if (!keepNearest)
                        {
                            return(contender);
                        }
                        nearest = LevelManager.KeepNearestInstance(nearest, contender, depthIsZ, forwardSign);
                    }
                }
                int offsetY                = (double)FezMath.Frac(screenSpacePosition.Y) > 0.5 ? 1 : -1;
                TrileEmplacement offset    = emplacement.GetOffset(0, offsetY, 0);
                TrileInstance    instance3 = this.TrileInstanceAt(ref offset);
                if (instance3 != null)
                {
                    TrileInstance contender = this.OffsetInstanceOrOverlapsContain(instance3, screenSpacePosition, depthIsZ, forwardSign, useSelector, context, out queryResult);
                    if (contender != null)
                    {
                        nearestQueryResult = queryResult;
                        if (!keepNearest)
                        {
                            return(contender);
                        }
                        nearest = LevelManager.KeepNearestInstance(nearest, contender, depthIsZ, forwardSign);
                    }
                }
                offset = id.GetOffset(0, offsetY, 0);
                TrileInstance instance4 = this.TrileInstanceAt(ref offset);
                if (instance4 != null)
                {
                    TrileInstance contender = this.OffsetInstanceOrOverlapsContain(instance4, screenSpacePosition, depthIsZ, forwardSign, useSelector, context, out queryResult);
                    if (contender != null)
                    {
                        nearestQueryResult = queryResult;
                        if (!keepNearest)
                        {
                            return(contender);
                        }
                        nearest = LevelManager.KeepNearestInstance(nearest, contender, depthIsZ, forwardSign);
                    }
                }
                return(nearest);
            }
        }
示例#4
0
 private TrileInstance OffsetInstanceAt(TrileEmplacement emplacement, Vector3 screenSpacePosition, bool depthIsZ, int forwardSign, bool useSelector, bool keepNearest, QueryOptions context, out LevelManager.QueryResult queryResult)
 {
     return(this.OffsetInstanceAt(ref emplacement, ref screenSpacePosition, depthIsZ, forwardSign, useSelector, keepNearest, false, context, out queryResult));
 }