private static Vector2i?GetActualPosition(Vector2 position) { NavigationField navigationField = NavigationField.Instance; Vector2i pos = Vector2i.FromVector2Round(position); if (!navigationField.fieldSize.ContainsAsSize(pos)) { return(null); } if (!float.IsPositiveInfinity(navigationField.Costs[pos.x, pos.y])) { return(pos); } // Try to find a nice neighbour... for (int y = -1; y <= 1; y++) { for (int x = -1; x <= 1; x++) { Vector2i test = new Vector2i(pos.x + x, pos.y + y); if (!float.IsPositiveInfinity(navigationField.GetCost(test))) { return(test); } } } return(null); }
public void Start() { Instance = this; _halfGrid = new Vector2(gridSize * 0.5f, gridSize * 0.5f); Costs = new FloatField(fieldSize); Populate(); }
public StationSqlQueryBuilder() { this.HasKey("Id", t => t.Id); NavigationField <Station, StationType> nav1 = new NavigationField <Station, StationType>("StationType", "StationTypeId", "Id", s => s.Id); NavigationField <Station, StationWard> nav2 = new NavigationField <Station, StationWard>("StationWards", "Id", "StationId", s => new { StationId = s.StationId, WardId = s.WardId }); this.Navigate(nav1, nav2); }
public AQueryBuilder() : base() { this.HasKey("Id", a => a.Id); NavigationField <A, B> nav1 = new NavigationField <A, B>("ListB", "Id", "AId", b => b.Id); NavigationField <A, C> nav2 = new NavigationField <A, C>("ListC", "Id", "AId", c => c.Id); NavigationField <A, D> nav3 = new NavigationField <A, D>("D", "DId", "Id", d => d.Id); this.Navigate(nav1, nav2, nav3); this.MakeResult = Split; }
public override void OnInspectorGUI() { DrawDefaultInspector(); NavigationField navigationField = (NavigationField)target; if (GUILayout.Button("It's even more fun to recompute!")) { navigationField.Populate(); navigationField.transform.position += new Vector3(0, 0, 1); navigationField.transform.position -= new Vector3(0, 0, 1); } }
public PotentialField( NavigationField navigationField, Target target) { Size = navigationField.fieldSize; NavigationField = navigationField; Target = target; Potentials = new FloatField(navigationField.fieldSize); Flows = new Vector2Field(navigationField.fieldSize); _heap = new MaxHeap <CellPotentialHeapEntry> { RemoveAction = CellPotentialHeapEntry.ReturnCellCostHeapEntry }; }
public PotentialField( NavigationField navigationField, Target target) { Size = navigationField.fieldSize; NavigationField = navigationField; Target = target; Potentials = new FloatField(navigationField.fieldSize); Flows = new Vector2Field(navigationField.fieldSize); _heap = new MaxHeap<CellPotentialHeapEntry> { RemoveAction = CellPotentialHeapEntry.ReturnCellCostHeapEntry }; }
private void TryAddTraversal(Vector2i position, Vector2iWithNormal delta, float incomingPotential) { Vector2i destination = position + delta.vector2i; if (!Size.ContainsAsSize(destination)) { return; } float currentPotential = Potentials[destination.x, destination.y]; if (float.IsNegativeInfinity(currentPotential)) { return; } float cost = NavigationField.GetCost(destination); float newPotential = incomingPotential - delta.magnitude * cost; if (newPotential <= currentPotential) { return; } if (delta.isDiagonal) { // Only flow diagonally if it can step there cardinally in two steps. If both // cardinal two-steps are blocked, there is no route. if (float.IsNegativeInfinity(Potentials[position.x + delta.vector2i.x, position.y]) && float.IsNegativeInfinity(Potentials[position.x, position.y + delta.vector2i.y])) { return; } } Flows[destination.x, destination.y] = -delta.normal; AddTraversal(destination, newPotential); }