diff --git a/src/main/java/electrosphere/server/terrain/generation/TestGenerationChunkGenerator.java b/src/main/java/electrosphere/server/terrain/generation/TestGenerationChunkGenerator.java index 65a86e8b..16d83fce 100644 --- a/src/main/java/electrosphere/server/terrain/generation/TestGenerationChunkGenerator.java +++ b/src/main/java/electrosphere/server/terrain/generation/TestGenerationChunkGenerator.java @@ -1,6 +1,5 @@ package electrosphere.server.terrain.generation; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -72,72 +71,52 @@ public class TestGenerationChunkGenerator implements ChunkGenerator { int[][][] values = new int[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION]; try { - if(worldX == 0 || worldZ == 0){ - //generate flat ground for the player to spawn on - for(int x = 0; x < ServerTerrainChunk.CHUNK_DIMENSION; x++){ - for(int y = 0; y < ServerTerrainChunk.CHUNK_DIMENSION; y++){ - Arrays.fill(weights[x][y],-1f); - } - } - if(worldY == 0){ - for(int x = 0; x < ServerTerrainChunk.CHUNK_DIMENSION; x++){ - for(int z = 0; z < ServerTerrainChunk.CHUNK_DIMENSION; z++){ - values[x][0][z] = 1; - weights[x][0][z] = 0.1f; - } - } + //actual generation algo + + //biome of the current chunk + BiomeData surfaceBiome = this.terrainModel.getSurfaceBiome(worldX, worldY, worldZ); + + BiomeSurfaceGenerationParams surfaceParams = surfaceBiome.getSurfaceGenerationParams(); + HeightmapGenerator heightmapGen = this.tagGeneratorMap.get(surfaceParams.getSurfaceGenTag()); + if(heightmapGen == null){ + throw new Error("Undefined heightmap generator in biome! " + surfaceBiome.getId() + " " + surfaceBiome.getDisplayName() + " " + surfaceParams.getSurfaceGenTag()); + } + + //stride value + int strideValue = (int)Math.pow(2,stride); + + //presolve heightfield + float[][] heightfield = new float[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION]; + for(int x = 0; x < ServerTerrainChunk.CHUNK_DIMENSION; x++){ + for(int z = 0; z < ServerTerrainChunk.CHUNK_DIMENSION; z++){ + int finalWorldX = worldX + ((x * strideValue) / ServerTerrainChunk.CHUNK_DIMENSION); + int finalWorldZ = worldZ + ((z * strideValue) / ServerTerrainChunk.CHUNK_DIMENSION); + int finalChunkX = (x * strideValue) % ServerTerrainChunk.CHUNK_DIMENSION; + int finalChunkZ = (z * strideValue) % ServerTerrainChunk.CHUNK_DIMENSION; + heightfield[x][z] = heightmapGen.getHeight( + this.terrainModel.getSeed(), + this.serverWorldData.convertVoxelToRealSpace(finalChunkX, finalWorldX), + this.serverWorldData.convertVoxelToRealSpace(finalChunkZ, finalWorldZ) + ); } + } - - - } else { - //actual generation algo - - //biome of the current chunk - BiomeData surfaceBiome = this.terrainModel.getSurfaceBiome(worldX, worldY, worldZ); - - BiomeSurfaceGenerationParams surfaceParams = surfaceBiome.getSurfaceGenerationParams(); - HeightmapGenerator heightmapGen = this.tagGeneratorMap.get(surfaceParams.getSurfaceGenTag()); - if(heightmapGen == null){ - throw new Error("Undefined heightmap generator in biome! " + surfaceBiome.getId() + " " + surfaceBiome.getDisplayName() + " " + surfaceParams.getSurfaceGenTag()); - } - - //stride value - int strideValue = (int)Math.pow(2,stride); - - //presolve heightfield - float[][] heightfield = new float[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION]; - for(int x = 0; x < ServerTerrainChunk.CHUNK_DIMENSION; x++){ + for(int x = 0; x < ServerTerrainChunk.CHUNK_DIMENSION; x++){ + Globals.profiler.beginAggregateCpuSample("TestGenerationChunkGenerator - Generate slice"); + for(int y = 0; y < ServerTerrainChunk.CHUNK_DIMENSION; y++){ for(int z = 0; z < ServerTerrainChunk.CHUNK_DIMENSION; z++){ int finalWorldX = worldX + ((x * strideValue) / ServerTerrainChunk.CHUNK_DIMENSION); + int finalWorldY = worldY + ((y * strideValue) / ServerTerrainChunk.CHUNK_DIMENSION); int finalWorldZ = worldZ + ((z * strideValue) / ServerTerrainChunk.CHUNK_DIMENSION); int finalChunkX = (x * strideValue) % ServerTerrainChunk.CHUNK_DIMENSION; + int finalChunkY = (y * strideValue) % ServerTerrainChunk.CHUNK_DIMENSION; int finalChunkZ = (z * strideValue) % ServerTerrainChunk.CHUNK_DIMENSION; - heightfield[x][z] = heightmapGen.getHeight( - this.terrainModel.getSeed(), - this.serverWorldData.convertVoxelToRealSpace(finalChunkX, finalWorldX), - this.serverWorldData.convertVoxelToRealSpace(finalChunkZ, finalWorldZ) - ); + GeneratedVoxel voxel = this.getVoxel(finalWorldX, finalWorldY, finalWorldZ, finalChunkX, finalChunkY, finalChunkZ, heightfield[x][z], this.terrainModel, surfaceBiome); + weights[x][y][z] = voxel.weight; + values[x][y][z] = voxel.type; } } - - for(int x = 0; x < ServerTerrainChunk.CHUNK_DIMENSION; x++){ - Globals.profiler.beginAggregateCpuSample("TestGenerationChunkGenerator - Generate slice"); - for(int y = 0; y < ServerTerrainChunk.CHUNK_DIMENSION; y++){ - for(int z = 0; z < ServerTerrainChunk.CHUNK_DIMENSION; z++){ - int finalWorldX = worldX + ((x * strideValue) / ServerTerrainChunk.CHUNK_DIMENSION); - int finalWorldY = worldY + ((y * strideValue) / ServerTerrainChunk.CHUNK_DIMENSION); - int finalWorldZ = worldZ + ((z * strideValue) / ServerTerrainChunk.CHUNK_DIMENSION); - int finalChunkX = (x * strideValue) % ServerTerrainChunk.CHUNK_DIMENSION; - int finalChunkY = (y * strideValue) % ServerTerrainChunk.CHUNK_DIMENSION; - int finalChunkZ = (z * strideValue) % ServerTerrainChunk.CHUNK_DIMENSION; - GeneratedVoxel voxel = this.getVoxel(finalWorldX, finalWorldY, finalWorldZ, finalChunkX, finalChunkY, finalChunkZ, heightfield[x][z], this.terrainModel, surfaceBiome); - weights[x][y][z] = voxel.weight; - values[x][y][z] = voxel.type; - } - } - Globals.profiler.endCpuSample(); - } + Globals.profiler.endCpuSample(); } } catch(Exception ex){ ex.printStackTrace(); diff --git a/src/main/java/electrosphere/server/terrain/manager/ChunkGenerationThread.java b/src/main/java/electrosphere/server/terrain/manager/ChunkGenerationThread.java index cf1ed51b..7d391c54 100644 --- a/src/main/java/electrosphere/server/terrain/manager/ChunkGenerationThread.java +++ b/src/main/java/electrosphere/server/terrain/manager/ChunkGenerationThread.java @@ -98,7 +98,7 @@ public class ChunkGenerationThread implements Runnable { int i = 0; try { while(chunk == null && i < MAX_TIME_TO_WAIT && Globals.threadManager.shouldKeepRunning()){ - if(chunkCache.containsChunk(worldX,worldY,worldZ,stride)){ + if(chunkCache.containsChunk(worldX, worldY, worldZ, stride)){ chunk = chunkCache.get(worldX, worldY, worldZ, stride); } else { //pull from disk if it exists