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); } }
public ThreadMapInfo(System.Action <ChunkColumn.MapDataInfo> callback, ChunkColumn.MapDataInfo chunkMapData) { this.callback = callback; this.chunkMapData = chunkMapData; }
/// <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); }