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); }
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); }
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); } }
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)); }