Beispiel #1
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();
    }