Пример #1
0
        public NearestTriles NearestTrile(Vector3 position, QueryOptions options, Viewpoint?vp)
        {
            NearestTriles nearestTriles = new NearestTriles();
            bool          hasValue      = vp.HasValue;
            Viewpoint     view          = hasValue ? vp.Value : this.CameraManager.Viewpoint;

            if (!hasValue)
            {
                this.WaitForScreenInvalidation();
            }
            bool             flag1       = view == Viewpoint.Front || view == Viewpoint.Back;
            bool             flag2       = (options & QueryOptions.Background) == QueryOptions.Background;
            bool             simpleTest  = (options & QueryOptions.Simple) == QueryOptions.Simple;
            TrileEmplacement emplacement = new TrileEmplacement((int)position.X, (int)position.Y, (int)position.Z);
            Vector3          vector3     = FezMath.ForwardVector(view);
            int     forwardSign          = flag1 ? (int)vector3.Z : (int)vector3.X;
            Vector3 screenSpacePosition  = new Vector3(flag1 ? position.X : position.Z, position.Y, -1f);
            Point   key = !flag1 ? new Point(emplacement.Z, emplacement.Y) : new Point(emplacement.X, emplacement.Y);
            int     num1;

            if (hasValue)
            {
                forwardSign = flag1 ? (int)vector3.Z : (int)vector3.X;
                if (flag2)
                {
                    forwardSign *= -1;
                }
                float num2 = (float)(((flag1 ? (double)this.Size.Z : (double)this.Size.X) - 1.0) / 2.0);
                if (flag1)
                {
                    emplacement.Z = (int)((double)num2 - (double)forwardSign * (double)num2);
                }
                else
                {
                    emplacement.X = (int)((double)num2 - (double)forwardSign * (double)num2);
                }
                num1 = (int)((double)num2 + (double)forwardSign * (double)num2);
            }
            else if (simpleTest)
            {
                Limit limit;
                if (!this.screenSpaceLimits.TryGetValue(key, out limit))
                {
                    return(nearestTriles);
                }
                int num2 = flag2 ? limit.End : limit.Start;
                if (flag1)
                {
                    emplacement.Z = num2;
                }
                else
                {
                    emplacement.X = num2;
                }
                num1 = flag2 ? limit.Start : limit.End;
                if (flag2)
                {
                    forwardSign *= -1;
                }
            }
            else
            {
                Limit limit1;
                bool  flag3 = this.screenSpaceLimits.TryGetValue(key, out limit1);
                int   num2  = (double)FezMath.Frac(screenSpacePosition.X) > 0.5 ? 1 : -1;
                int   num3  = (double)FezMath.Frac(screenSpacePosition.Y) > 0.5 ? 1 : -1;
                key.X += num2;
                Limit limit2;
                bool  flag4 = this.screenSpaceLimits.TryGetValue(key, out limit2);
                key.X -= num2;
                key.Y += num3;
                Limit limit3;
                bool  flag5 = this.screenSpaceLimits.TryGetValue(key, out limit3);
                if (!flag3 && !flag5 && !flag4)
                {
                    return(nearestTriles);
                }
                Limit limit4;
                if (flag3)
                {
                    limit4 = limit1;
                    if (!flag4 && !flag5)
                    {
                        simpleTest = true;
                    }
                }
                else
                {
                    limit4.Start    = forwardSign == 1 ? int.MaxValue : int.MinValue;
                    limit4.End      = forwardSign == 1 ? int.MinValue : int.MaxValue;
                    limit4.NoOffset = true;
                }
                if (flag4)
                {
                    limit4.Start = forwardSign == 1 ? Math.Min(limit4.Start, limit2.Start) : Math.Max(limit4.Start, limit2.Start);
                    limit4.End   = forwardSign == 1 ? Math.Max(limit4.End, limit2.End) : Math.Min(limit4.End, limit2.End);
                }
                if (flag5)
                {
                    limit4.Start = forwardSign == 1 ? Math.Min(limit4.Start, limit3.Start) : Math.Max(limit4.Start, limit3.Start);
                    limit4.End   = forwardSign == 1 ? Math.Max(limit4.End, limit3.End) : Math.Min(limit4.End, limit3.End);
                }
                int num4 = flag2 ? limit4.End : limit4.Start;
                if (flag1)
                {
                    emplacement.Z = num4;
                }
                else
                {
                    emplacement.X = num4;
                }
                num1 = flag2 ? limit4.Start : limit4.End;
                if (flag2)
                {
                    forwardSign *= -1;
                }
            }
            int  num5  = num1 + forwardSign;
            bool flag6 = flag1 ? emplacement.Z != num5 : emplacement.X != num5;

            if (flag1)
            {
                for (; flag6; flag6 = emplacement.Z != num5)
                {
                    LevelManager.QueryResult nearestQueryResult;
                    TrileInstance            trileInstance = this.OffsetInstanceAt(ref emplacement, ref screenSpacePosition, true, forwardSign, true, false, simpleTest, options, out nearestQueryResult);
                    if (trileInstance != null)
                    {
                        if (nearestQueryResult == LevelManager.QueryResult.Full)
                        {
                            nearestTriles.Deep = trileInstance;
                            break;
                        }
                        else if (nearestTriles.Surface == null)
                        {
                            nearestTriles.Surface = trileInstance;
                        }
                    }
                    emplacement.Z += forwardSign;
                }
            }
            else
            {
                for (; flag6; flag6 = emplacement.X != num5)
                {
                    LevelManager.QueryResult nearestQueryResult;
                    TrileInstance            trileInstance = this.OffsetInstanceAt(ref emplacement, ref screenSpacePosition, false, forwardSign, true, false, simpleTest, options, out nearestQueryResult);
                    if (trileInstance != null)
                    {
                        if (nearestQueryResult == LevelManager.QueryResult.Full)
                        {
                            nearestTriles.Deep = trileInstance;
                            break;
                        }
                        else if (nearestTriles.Surface == null)
                        {
                            nearestTriles.Surface = trileInstance;
                        }
                    }
                    emplacement.X += forwardSign;
                }
            }
            return(nearestTriles);
        }
Пример #2
0
 public PointCollision(Vector3 point, NearestTriles instances)
 {
   this.Point = point;
   this.Instances = instances;
 }