Example #1
0
    public void MapDataThread(object threadTask)
    {
        ThreadMapObject threadTaskInfo = (ThreadMapObject)threadTask;

        ChunkColumn.MapDataInfo chunkMapData = World.perlinMapGen.GenerateNoiseMap(threadTaskInfo.colCoord);
        ThreadMapInfo           threadInfo   = new ThreadMapInfo(threadTaskInfo.callback, chunkMapData);

        lock (threadMapQueue)
        {
            threadMapQueue.Enqueue(threadInfo);
        }
    }
Example #2
0
 public ThreadMapInfo(System.Action <ChunkColumn.MapDataInfo> callback, ChunkColumn.MapDataInfo chunkMapData)
 {
     this.callback     = callback;
     this.chunkMapData = chunkMapData;
 }
Example #3
0
    /// <summary>
    /// Generate chunk map data based on perlin noise and interpolation
    /// </summary>
    /// <param name="colCoord">Column coordinate to sample</param>
    /// <returns>Chunk block data</returns>
    public ChunkColumn.MapDataInfo GenerateNoiseMap(ColumnCoord colCoord)
    {
        int size = ChunkColumn.chunkSize;
        int amountOfVerticalChunks = ChunkColumn.worldHeight;

        ChunkColumn.MapDataInfo mapData = new ChunkColumn.MapDataInfo();
        mapData.SetAllEmpty();
        byte[,,] chunkBlockData = new byte[size, size *amountOfVerticalChunks, size];

        // Sampling all points using perlin noise within chunk
        float[,,] sampleNoiseMap = SamplePoints(colCoord);

        // 0 = differences, 1 = all non-solid, 2 = all solid
        int allSolidIndex;

        for (int x = 0; x < sampleNoiseMap.GetLength(0) - 1; x++)
        {
            for (int y = 0; y < sampleNoiseMap.GetLength(1) - 1; y++)
            {
                for (int z = 0; z < sampleNoiseMap.GetLength(2) - 1; z++)
                {
                    allSolidIndex = GetAllSolidIndex(ref sampleNoiseMap, x, y, z);

                    if (allSolidIndex == 0)
                    {
                        InterpolatePoints(ref sampleNoiseMap, ref chunkBlockData, x, y, z, colCoord);
                        // Any interpolation means the is atleast 1 solid block
                        mapData.isEmpty[(y * verticalNoiseScale + verticalNoiseScale / 2) / ChunkColumn.chunkSize] = false;
                    }
                    else
                    {
                        float noiseVal;
                        int   blockX, blockY, blockZ;

                        if (allSolidIndex == 2)
                        {
                            mapData.isEmpty[(y * verticalNoiseScale + verticalNoiseScale / 2) / ChunkColumn.chunkSize] = false;
                        }

                        // All points the same, skip interpolation
                        for (int k = 0; k < horizontalNoiseScale; k++)
                        {
                            for (int j = 0; j < verticalNoiseScale; j++)
                            {
                                for (int i = 0; i < horizontalNoiseScale; i++)
                                {
                                    blockX = x * horizontalNoiseScale + k;
                                    blockY = y * verticalNoiseScale + j;
                                    blockZ = z * horizontalNoiseScale + i;

                                    noiseVal = allSolidIndex == 1 ? 0 : 1;

                                    byte blockId = GetBlockIdFromNoise(blockX, blockY, blockZ, noiseVal, colCoord);
                                    chunkBlockData[blockX, blockY, blockZ] = blockId;

                                    // Add grass to the top layer
                                    if (y == 0)
                                    {
                                        continue;
                                    }

                                    if (blockId == 0 && chunkBlockData[blockX, blockY - 1, blockZ] == 2)
                                    {
                                        // Spawn grass
                                        chunkBlockData[blockX, blockY - 1, blockZ] = 3;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        mapData.voxelData = chunkBlockData;
        return(mapData);
    }