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); }
public PointCollision(Vector3 point, NearestTriles instances) { this.Point = point; this.Instances = instances; }