private static int GetUpperGroundHeight(MCD_WorldData aWorldData, int blockWorldX, int blockWorldZ, float lowerGroundHeight) { float octave1 = Mathf.PerlinNoise(blockWorldX * 0.001f, blockWorldZ * 0.001f) * 0.5f; float octave2 = Mathf.PerlinNoise((blockWorldX + 100) * 0.002f, blockWorldZ * 0.002f) * 0.25f; float octave3 = Mathf.PerlinNoise((blockWorldX + 100) * 0.01f, blockWorldZ * 0.01f) * 0.25f; float octaveSum = octave1 + octave2 + octave3; return((int)(octaveSum * 4 + (int)(lowerGroundHeight))); }
void Start() { Vector3Int terrainSize = new Vector3Int(myTerrainWidth, myTerrainHeight + myTerrainDepth, myTerrainLength); myWorldData = new MCD_WorldData(terrainSize, myChunkSize, myVoxelSize); myWorld = new MCS_World(myWorldData); terrainGeneration = new MCG_TerrainGeneration(); decorationGeneration = new MCG_DecorationGeneration(myWorldData); myWorld.InitChunkGrid(); myWorldData.GenerateUVCoordinatesForAllBlocks(); CreateChunksObject(); GenerateChunkMesh(); }
public void GenerateChunk(MCD_WorldData aWorldData, MCS_Chunk chunk) { for (int x = 0; x < aWorldData.MyChunkSizeX; x++) { int blocX = chunk.WorldPos.x + x; for (int z = 0; z < aWorldData.MyChunkSizeZ; z++) { int blocZ = chunk.WorldPos.z + z; float lowerGroundHeight = GetLowerGroundHeight(chunk, blocX, blocZ, x, z, aWorldData.MyTerrainDepth); int upperGround = GetUpperGroundHeight(aWorldData, blocX, blocZ, lowerGroundHeight); bool sunlit = true; for (int y = aWorldData.MyChunkSizeY - 1; y >= 0; y--) { BlockType blockType; if (y > upperGround) { blockType = BlockType.Air; } else if (y >= lowerGroundHeight) { if (sunlit) { blockType = BlockType.TopSoil; // Remember, this adds the block global coordinates chunk.TopSoilBlocks.Add(new Vector3Int(blocX, y, blocZ)); sunlit = false; } else { blockType = BlockType.Dirt; } } else { blockType = BlockType.Stone; } Vector3Int pos = new Vector3Int(x, y, z); aWorldData.GetBlock(pos + chunk.WorldPos).SetType(blockType); } } } }
public MCS_Chunk(MCD_WorldData aWorldData, Vector3Int aChunkPos) { myChunkPos = aChunkPos; myWorldData = aWorldData; myWorldPos = new Vector3Int(myChunkPos.x * myWorldData.MyChunkSizeX, myChunkPos.y * myWorldData.MyChunkSizeY, myChunkPos.z * myWorldData.MyChunkSizeZ); }
public MCS_ChunkMesh(MCD_WorldData aWorldData) { myWorldData = aWorldData; }
public MCG_DecorationGeneration(MCD_WorldData aWorldData) { myWorldData = aWorldData; }
public MCS_World(MCD_WorldData aWorldData) { myWorldData = aWorldData; }