示例#1
0
    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);
    }
示例#2
0
 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);
        }
示例#4
0
        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;
        }
示例#5
0
    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);
        }
    }
示例#6
0
    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
        };
    }
示例#7
0
    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
            };
    }
示例#8
0
    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);
    }