Exemple #1
0
            //-----------------------------------------------------------------------------
            public void Execute()
            {
                for (int i = 0; i < Flowfield.Length; ++i)
                {
                    var cellIndex = FloodQueue[i];
                    if (cellIndex < 0 || cellIndex >= Flowfield.Length)
                    {
                        continue;
                    }

                    var flowDirection            = Flowfield[cellIndex];
                    var cellGrid                 = GridUtilties.Index2Grid(Settings, cellIndex);
                    var cellDirectionCeiling     = new int2((int)math.sign(flowDirection.x), (int)math.sign(flowDirection.z));
                    var backPropagationCellGrid  = cellGrid + cellDirectionCeiling;
                    var backPropagationCellIndex = GridUtilties.Grid2Index(Settings, backPropagationCellGrid);
                    if (backPropagationCellIndex < 0)
                    {
                        continue;
                    }
                    var backPropagationCellDirection = Flowfield[backPropagationCellIndex];

                    Flowfield[cellIndex] = math_experimental.normalizeSafe(
                        flowDirection * (1.0f - SmoothAmount) + backPropagationCellDirection * SmoothAmount);
                }
            }
        //-----------------------------------------------------------------------------
        public void Execute()
        {
            BurstQueue queue = new BurstQueue(FloodQueue);

            for (int index = 0; index < NumGoals; ++index)
            {
                var tileIndex = GridUtilties.Grid2Index(Settings, Goals[index]);
                if (DistanceMap[tileIndex] < TileSystem.k_ObstacleFloat)
                {
                    DistanceMap[tileIndex] = 0;
                    queue.Enqueue(tileIndex);
                }
            }

            // Search!
            while (queue.Length > 0)
            {
                var index       = queue.Dequeue();
                var newDistance = DistanceMap[index] + 1;
                var grid        = GridUtilties.Index2Grid(Settings, index);

                for (GridUtilties.Direction dir = GridUtilties.Direction.N; dir <= GridUtilties.Direction.W; ++dir)
                {
                    var neighborGrid  = grid + Offsets[(int)dir];
                    var neighborIndex = GridUtilties.Grid2Index(Settings, neighborGrid);

                    if (neighborIndex != -1 && DistanceMap[neighborIndex] < TileSystem.k_ObstacleFloat && newDistance < DistanceMap[neighborIndex])
                    {
                        DistanceMap[neighborIndex] = newDistance;
                        queue.Enqueue(neighborIndex);
                    }
                }
            }
        }
        //-----------------------------------------------------------------------------
        public void Execute(int index)
        {
            int2  gridPos = GridUtilties.Index2Grid(Settings, index);
            float weight  = DistanceMap[index];

            Flowfield[index] = new float3(0);

            for (GridUtilties.Direction dir = 0; dir < GridUtilties.Direction.MAX; ++dir)
            {
                int2 dirOffset  = Offsets[(int)dir];
                int  neigborIdx = GridUtilties.Grid2Index(Settings, gridPos + dirOffset);
                if (neigborIdx == -1)
                {
                    continue;
                }

                float neighborWeight = DistanceMap[neigborIdx];
                if (weight <= neighborWeight)
                {
                    continue;
                }

                weight = neighborWeight;
                float3 direction = new float3(dirOffset.x, 0, dirOffset.y);
                Flowfield[index] = math.normalize(direction);
            }
        }
Exemple #4
0
    //-----------------------------------------------------------------------------
    public static void CreateGrid(GridSettings grid,
                                  NativeArray <float> heightmap,
                                  NativeArray <float3> colormap,
                                  NativeArray <float3> normalmap,
                                  NativeArray <float3> flowMap,
                                  Func <float2, int2, CellData> func)
    {
        var entityManager = World.Active.GetOrCreateManager <EntityManager>();
        var entities      = new NativeArray <Entity>(grid.cellCount.x * grid.cellCount.y, Allocator.Temp);

        entityManager.CreateEntity(Archetypes.Tile, entities);
        var cells = new CellData[entities.Length];

        for (int ii = 0; ii < entities.Length; ii++)
        {
            var    coord = GridUtilties.Index2Grid(grid, ii);
            float2 per   = new float2(coord) / grid.cellCount;
            cells[ii] = func(per, coord);
        }

        float inv255 = 1f / 255f;

        for (int ii = 0; ii < entities.Length; ii++)
        {
            int2 coord = GridUtilties.Index2Grid(grid, ii);
            var  cd    = cells[ii];
            colormap[ii]  = cd.color;
            heightmap[ii] = cd.height;
            float[] s = new float[8];
            for (int i = 0; i < GridUtilties.Offset.Length; ++i)
            {
                var index = GridUtilties.Grid2Index(grid, coord + GridUtilties.Offset[i]);
                if (index != -1)
                {
                    s[i] = cells[index].height;
                }
                else
                {
                    s[i] = 0.5f;
                }
            }
            var normal = new float3(
                -(s[4] - s[6] + 2 * (s[2] - s[3]) + s[5] - s[7]),
                cd.height,                //.2f,
                -(s[7] - s[6] + 2 * (s[1] - s[0]) + s[5] - s[4]));

            normalmap[ii] = math.normalize(normal);
            normal.y      = 0;
            normal        = math.normalize(normal);
            var flow = normal * cd.cost * inv255;
            flowMap[ii] = flow;
            Archetypes.SetupTile(entityManager, entities[ii], Main.ActiveInitParams.TileDirectionMesh, Main.ActiveInitParams.TileDirectionMaterial, coord, cd.cost, new float3(), grid);
        }
        entities.Dispose();
    }
Exemple #5
0
    static void TestGrid(int2 grid)
    {
        int min = 0;
        int max = grid.x * grid.y - 1;

        int edge = grid.x - 1;

        // Bounds Checks
        Assert.AreEqual(new int2(0, 0), GridUtilties.Index2Grid(grid, min));
        Assert.AreEqual(new int2(grid.x - 1, grid.y - 1), GridUtilties.Index2Grid(grid, max));

        // Out Of Bounds Checks
        Assert.AreEqual(Invalid_Grid, GridUtilties.Index2Grid(grid, min - 1));
        Assert.AreEqual(Invalid_Grid, GridUtilties.Index2Grid(grid, max + 1));

        // Value Checks
        Assert.AreEqual(new int2(grid.x - 1, 0), GridUtilties.Index2Grid(grid, edge));
        Assert.AreEqual(new int2(0, 1), GridUtilties.Index2Grid(grid, edge + 1));
        Assert.AreEqual(new int2(1, 1), GridUtilties.Index2Grid(grid, edge + 2));
    }
Exemple #6
0
        //-----------------------------------------------------------------------------
        public void Execute(int index)
        {
//            // don't smooth tiles which are next to obstacles
//            if (DistanceMap[index] >= TileSystem.k_ObstacleFloat
//                || DistanceMap[index + 1] >= TileSystem.k_ObstacleFloat
//                || DistanceMap[index - 1] >= TileSystem.k_ObstacleFloat
//                || DistanceMap[index + cellCount] >= TileSystem.k_ObstacleFloat
//                || DistanceMap[index - cellCount] >= TileSystem.k_ObstacleFloat
//                || DistanceMap[index + cellCount + 1] >= TileSystem.k_ObstacleFloat
//                || DistanceMap[index - cellCount - 1] >= TileSystem.k_ObstacleFloat
//                || DistanceMap[index + cellCount - 1] >= TileSystem.k_ObstacleFloat
//                || DistanceMap[index - cellCount + 1] >= TileSystem.k_ObstacleFloat)
//                return;

            var cellCount    = Settings.cellCount.x;
            var minCellCount = cellCount + 1;

            if (index < minCellCount || index >= Flowfield.Length - minCellCount)
            {
                return;
            }

            int2 gridPos = GridUtilties.Index2Grid(Settings, index);

            Flowfield[index] = new float3(0);
            float distance = DistanceMap[index];

            int   neigborIndex = GridUtilties.Grid2Index(Settings, gridPos + Offsets[(int)GridUtilties.Direction.E]);
            float ax           = (neigborIndex != -1 && DistanceMap[neigborIndex] < TileSystem.k_ObstacleFloat ? DistanceMap[neigborIndex] : distance);

            neigborIndex = GridUtilties.Grid2Index(Settings, gridPos + Offsets[(int)GridUtilties.Direction.W]);
            float bx = (neigborIndex != -1 && DistanceMap[neigborIndex] < TileSystem.k_ObstacleFloat ? DistanceMap[neigborIndex] : distance);

            neigborIndex = GridUtilties.Grid2Index(Settings, gridPos + Offsets[(int)GridUtilties.Direction.N]);
            float ay = (neigborIndex != -1 && DistanceMap[neigborIndex] < TileSystem.k_ObstacleFloat ? DistanceMap[neigborIndex] : distance);

            neigborIndex = GridUtilties.Grid2Index(Settings, gridPos + Offsets[(int)GridUtilties.Direction.S]);
            float by = (neigborIndex != -1 && DistanceMap[neigborIndex] < TileSystem.k_ObstacleFloat ? DistanceMap[neigborIndex] : distance);

            Flowfield[index] = math_experimental.normalizeSafe(new float3(ax - bx, 0, ay - by) * math.max((byte.MaxValue - Costs[index]), 1));
        }