fix array error
Some checks failed
studiorailgun/Renderer/pipeline/pr-master There was a failure building this commit
Some checks failed
studiorailgun/Renderer/pipeline/pr-master There was a failure building this commit
This commit is contained in:
parent
ae4c0aa4e5
commit
96b65dba46
@ -130,6 +130,17 @@ public class Logger {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs an error message.
|
||||||
|
* This should be used every time we throw any kind of error in the engine
|
||||||
|
* @param e The exception to report
|
||||||
|
*/
|
||||||
|
public void ERROR(Error e){
|
||||||
|
if(level == LogLevel.LOOP_DEBUG || level == LogLevel.DEBUG || level == LogLevel.INFO || level == LogLevel.WARNING || level == LogLevel.ERROR){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prints a message at the specified logging level
|
* Prints a message at the specified logging level
|
||||||
* @param level The logging level
|
* @param level The logging level
|
||||||
|
|||||||
@ -68,81 +68,80 @@ public class TestGenerationChunkGenerator implements ChunkGenerator {
|
|||||||
public ServerTerrainChunk generateChunk(int worldX, int worldY, int worldZ, int stride) {
|
public ServerTerrainChunk generateChunk(int worldX, int worldY, int worldZ, int stride) {
|
||||||
Globals.profiler.beginAggregateCpuSample("TestGenerationChunkGenerator.generateChunk");
|
Globals.profiler.beginAggregateCpuSample("TestGenerationChunkGenerator.generateChunk");
|
||||||
ServerTerrainChunk rVal = null;
|
ServerTerrainChunk rVal = null;
|
||||||
float[][][] weights;
|
float[][][] weights = new float[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION];;
|
||||||
int[][][] values;
|
int[][][] values = new int[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION];
|
||||||
|
|
||||||
if(worldX == 0 || worldZ == 0){
|
try {
|
||||||
//generate flat ground for the player to spawn on
|
if(worldX == 0 || worldZ == 0){
|
||||||
weights = new float[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION];
|
//generate flat ground for the player to spawn on
|
||||||
values = new int[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION];
|
for(int x = 0; x < ServerTerrainChunk.CHUNK_DIMENSION; x++){
|
||||||
for(int x = 0; x < ServerTerrainChunk.CHUNK_DIMENSION; x++){
|
for(int y = 0; y < ServerTerrainChunk.CHUNK_DIMENSION; y++){
|
||||||
for(int y = 0; y < ServerTerrainChunk.CHUNK_DIMENSION; y++){
|
Arrays.fill(weights[x][y],-1f);
|
||||||
Arrays.fill(weights[x][y],-1f);
|
}
|
||||||
}
|
}
|
||||||
}
|
if(worldY == 0){
|
||||||
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} 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++){
|
||||||
for(int z = 0; z < ServerTerrainChunk.CHUNK_DIMENSION; z++){
|
|
||||||
values[x][0][z] = 1;
|
|
||||||
weights[x][0][z] = 0.1f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//actual generation algo
|
|
||||||
weights = new float[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION];
|
|
||||||
values = new int[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION];
|
|
||||||
|
|
||||||
//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)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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++){
|
for(int z = 0; z < ServerTerrainChunk.CHUNK_DIMENSION; z++){
|
||||||
int finalWorldX = worldX + ((x * strideValue) / ServerTerrainChunk.CHUNK_DIMENSION);
|
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 finalWorldZ = worldZ + ((z * strideValue) / ServerTerrainChunk.CHUNK_DIMENSION);
|
||||||
int finalChunkX = (x * 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;
|
int finalChunkZ = (z * strideValue) % ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
GeneratedVoxel voxel = this.getVoxel(finalWorldX, finalWorldY, finalWorldZ, finalChunkX, finalChunkY, finalChunkZ, heightfield[x][z], this.terrainModel, surfaceBiome);
|
heightfield[x][z] = heightmapGen.getHeight(
|
||||||
weights[x][y][z] = voxel.weight;
|
this.terrainModel.getSeed(),
|
||||||
values[x][y][z] = voxel.type;
|
this.serverWorldData.convertVoxelToRealSpace(finalChunkX, finalWorldX),
|
||||||
|
this.serverWorldData.convertVoxelToRealSpace(finalChunkZ, finalWorldZ)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Globals.profiler.endCpuSample();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(Exception ex){
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
rVal = new ServerTerrainChunk(worldX, worldY, worldZ, weights, values);
|
rVal = new ServerTerrainChunk(worldX, worldY, worldZ, weights, values);
|
||||||
Globals.profiler.endCpuSample();
|
Globals.profiler.endCpuSample();
|
||||||
return rVal;
|
return rVal;
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import java.util.concurrent.TimeUnit;
|
|||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import electrosphere.engine.Globals;
|
import electrosphere.engine.Globals;
|
||||||
|
import electrosphere.logger.LoggerInterface;
|
||||||
import electrosphere.server.terrain.diskmap.ChunkDiskMap;
|
import electrosphere.server.terrain.diskmap.ChunkDiskMap;
|
||||||
import electrosphere.server.terrain.generation.interfaces.ChunkGenerator;
|
import electrosphere.server.terrain.generation.interfaces.ChunkGenerator;
|
||||||
|
|
||||||
@ -95,37 +96,41 @@ public class ChunkGenerationThread implements Runnable {
|
|||||||
public void run() {
|
public void run() {
|
||||||
ServerTerrainChunk chunk = null;
|
ServerTerrainChunk chunk = null;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while(chunk == null && i < MAX_TIME_TO_WAIT && Globals.threadManager.shouldKeepRunning()){
|
try {
|
||||||
if(chunkCache.containsChunk(worldX,worldY,worldZ,stride)){
|
while(chunk == null && i < MAX_TIME_TO_WAIT && Globals.threadManager.shouldKeepRunning()){
|
||||||
chunk = chunkCache.get(worldX, worldY, worldZ, stride);
|
if(chunkCache.containsChunk(worldX,worldY,worldZ,stride)){
|
||||||
} else {
|
chunk = chunkCache.get(worldX, worldY, worldZ, stride);
|
||||||
//pull from disk if it exists
|
} else {
|
||||||
if(chunkDiskMap != null){
|
//pull from disk if it exists
|
||||||
if(chunkDiskMap.containsTerrainAtPosition(worldX, worldY, worldZ)){
|
if(chunkDiskMap != null){
|
||||||
chunk = chunkDiskMap.getTerrainChunk(worldX, worldY, worldZ);
|
if(chunkDiskMap.containsTerrainAtPosition(worldX, worldY, worldZ)){
|
||||||
|
chunk = chunkDiskMap.getTerrainChunk(worldX, worldY, worldZ);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//generate if it does not exist
|
||||||
|
if(chunk == null){
|
||||||
|
chunk = chunkGenerator.generateChunk(worldX, worldY, worldZ, stride);
|
||||||
|
}
|
||||||
|
if(chunk != null){
|
||||||
|
chunkCache.add(worldX, worldY, worldZ, stride, chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//generate if it does not exist
|
|
||||||
if(chunk == null){
|
if(chunk == null){
|
||||||
chunk = chunkGenerator.generateChunk(worldX, worldY, worldZ, stride);
|
try {
|
||||||
}
|
TimeUnit.MILLISECONDS.sleep(WAIT_TIME_MS);
|
||||||
if(chunk != null){
|
} catch (InterruptedException e) {
|
||||||
chunkCache.add(worldX, worldY, worldZ, stride, chunk);
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
if(chunk == null){
|
if(i >= MAX_TIME_TO_WAIT){
|
||||||
try {
|
throw new Error("Failed to resolve chunk!");
|
||||||
TimeUnit.MILLISECONDS.sleep(WAIT_TIME_MS);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
i++;
|
this.onLoad.accept(chunk);
|
||||||
|
} catch (Error e){
|
||||||
|
LoggerInterface.loggerEngine.ERROR(e);
|
||||||
}
|
}
|
||||||
if(i >= MAX_TIME_TO_WAIT){
|
|
||||||
throw new Error("Failed to resolve chunk!");
|
|
||||||
}
|
|
||||||
this.onLoad.accept(chunk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -127,11 +127,13 @@ public class TerrainModel {
|
|||||||
TerrainModel rVal = new TerrainModel();
|
TerrainModel rVal = new TerrainModel();
|
||||||
rVal.discreteArrayDimension = TestGenerationChunkGenerator.GENERATOR_REALM_SIZE;
|
rVal.discreteArrayDimension = TestGenerationChunkGenerator.GENERATOR_REALM_SIZE;
|
||||||
rVal.dynamicInterpolationRatio = 1;
|
rVal.dynamicInterpolationRatio = 1;
|
||||||
rVal.biome = new short[2][2];
|
int macroDataImageScale = TestGenerationChunkGenerator.GENERATOR_REALM_SIZE / DEFAULT_MACRO_DATA_SCALE + 1;
|
||||||
rVal.biome[0][0] = TestGenerationChunkGenerator.DEFAULT_BIOME_INDEX;
|
rVal.biome = new short[macroDataImageScale][macroDataImageScale];
|
||||||
rVal.biome[1][0] = TestGenerationChunkGenerator.DEFAULT_BIOME_INDEX;
|
for(int x = 0; x < macroDataImageScale; x++){
|
||||||
rVal.biome[0][1] = TestGenerationChunkGenerator.DEFAULT_BIOME_INDEX;
|
for(int z = 0; z < macroDataImageScale; z++){
|
||||||
rVal.biome[1][1] = TestGenerationChunkGenerator.DEFAULT_BIOME_INDEX;
|
rVal.biome[x][z] = TestGenerationChunkGenerator.DEFAULT_BIOME_INDEX;
|
||||||
|
}
|
||||||
|
}
|
||||||
return rVal;
|
return rVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user