diff --git a/buildNumber.properties b/buildNumber.properties index 17466399..0802f1b2 100644 --- a/buildNumber.properties +++ b/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Sun Dec 01 16:56:17 EST 2024 -buildNumber=480 +#Sun Dec 01 17:42:04 EST 2024 +buildNumber=481 diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index b6f9c385..2c069d43 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1211,6 +1211,7 @@ Fix fluid sim null pointer bug with unallocated chunks Fix fluid sim NP bug with skipped chunks Fix fluid chunk indexing from java side Memory pooling for chunk buffer allocations +Server homogenous fluid chunk declarations diff --git a/src/main/java/electrosphere/client/fluid/cache/FluidChunkData.java b/src/main/java/electrosphere/client/fluid/cache/FluidChunkData.java index 23050637..6328d960 100644 --- a/src/main/java/electrosphere/client/fluid/cache/FluidChunkData.java +++ b/src/main/java/electrosphere/client/fluid/cache/FluidChunkData.java @@ -58,25 +58,26 @@ public class FluidChunkData { */ public ByteBuffer bVelocityZ = null; + /** + * Tracks whether this is homogenous or not + */ + boolean homogenous = false; + + /** + * Allocates the buffers for this chunk + */ + private native void allocate(); + + /** + * Frees all native memory + */ + private native void free(); + /** * Constructor */ public FluidChunkData(){ - //allocate buffers - this.allocate(); - - //reorder - this.bWeights.order(ByteOrder.LITTLE_ENDIAN); - this.bVelocityX.order(ByteOrder.LITTLE_ENDIAN); - this.bVelocityY.order(ByteOrder.LITTLE_ENDIAN); - this.bVelocityZ.order(ByteOrder.LITTLE_ENDIAN); - - //get float view - this.weights = this.bWeights.asFloatBuffer(); - this.velocityX = this.bVelocityX.asFloatBuffer(); - this.velocityY = this.bVelocityY.asFloatBuffer(); - this.velocityZ = this.bVelocityZ.asFloatBuffer(); } /** @@ -175,16 +176,6 @@ public class FluidChunkData { velocityZ.put(this.IX(x,y,z),vel); } - /** - * Allocates the buffers for this chunk - */ - private native void allocate(); - - /** - * Frees all native memory - */ - private native void free(); - /** * Frees the buffers contained within this chunk */ @@ -192,4 +183,41 @@ public class FluidChunkData { this.free(); } + /** + * Allocates the buffers for this data + */ + public void allocateBuffs(){ + this.allocate(); + + //reorder + this.bWeights.order(ByteOrder.LITTLE_ENDIAN); + this.bVelocityX.order(ByteOrder.LITTLE_ENDIAN); + this.bVelocityY.order(ByteOrder.LITTLE_ENDIAN); + this.bVelocityZ.order(ByteOrder.LITTLE_ENDIAN); + + //get float view + this.weights = this.bWeights.asFloatBuffer(); + this.velocityX = this.bVelocityX.asFloatBuffer(); + this.velocityY = this.bVelocityY.asFloatBuffer(); + this.velocityZ = this.bVelocityZ.asFloatBuffer(); + } + + /** + * Gets whether this chunk is homogenous or not + * @return true if it is homogenous, false otherwise + */ + public boolean isHomogenous() { + return homogenous; + } + + /** + * Sets whether this chunk is homogenous or not + * @param homogenous true if it is homogenous, false otherwise + */ + public void setHomogenous(boolean homogenous) { + this.homogenous = homogenous; + } + + + } diff --git a/src/main/java/electrosphere/client/fluid/cells/FluidCell.java b/src/main/java/electrosphere/client/fluid/cells/FluidCell.java index 562b3ec5..dd1d74d9 100644 --- a/src/main/java/electrosphere/client/fluid/cells/FluidCell.java +++ b/src/main/java/electrosphere/client/fluid/cells/FluidCell.java @@ -110,156 +110,158 @@ public class FluidCell { // //main chunk FluidChunkData currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos); - for(int x = ServerFluidChunk.TRUE_DATA_OFFSET; x < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; x++){ - for(int y = ServerFluidChunk.TRUE_DATA_OFFSET; y < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; y++){ - for(int z = ServerFluidChunk.TRUE_DATA_OFFSET; z < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; z++){ - weights[x][y][z] = currentChunk.getWeight(x,y,z); - } - } - } - //face X - if(worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize()){ - currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y, worldPos.z); - if(currentChunk != null){ - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ - weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = currentChunk.getWeight(0, i, j); - } - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ - weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = ISO_SURFACE_EMPTY; + if(!currentChunk.isHomogenous()){ + for(int x = ServerFluidChunk.TRUE_DATA_OFFSET; x < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE + ServerFluidChunk.TRUE_DATA_OFFSET; x++){ + for(int y = ServerFluidChunk.TRUE_DATA_OFFSET; y < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE + ServerFluidChunk.TRUE_DATA_OFFSET; y++){ + for(int z = ServerFluidChunk.TRUE_DATA_OFFSET; z < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE + ServerFluidChunk.TRUE_DATA_OFFSET; z++){ + weights[x][y][z] = currentChunk.getWeight(x,y,z); } } } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ - weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = ISO_SURFACE_EMPTY; - } - } - } - //face Y - if(worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize()){ - currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y + 1, worldPos.z); - if(currentChunk != null){ - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ - weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = currentChunk.getWeight(i, 0, j); - } - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ - weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = ISO_SURFACE_EMPTY; - } - } - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ - weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = ISO_SURFACE_EMPTY; - } - } - } - //face Z - if(worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize()){ - currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y, worldPos.z + 1); - if(currentChunk != null){ - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ - weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(i, j, 0); - } - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ - weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; - } - } - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ - weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; - } - } - } - //edge X-Y - if( - worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() && - worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize() - ){ - currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y + 1, worldPos.z); - if(currentChunk != null){ - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = currentChunk.getWeight(0, 0, i); - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = ISO_SURFACE_EMPTY; - } - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = ISO_SURFACE_EMPTY; - } - } - //edge X-Z - if( - worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() && - worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize() - ){ - currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y, worldPos.z + 1); - if(currentChunk != null){ - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(0, i, 0); - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; - } - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; - } - } - //edge Y-Z - if( - worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize() && - worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize() - ){ - currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y + 1, worldPos.z + 1); - if(currentChunk != null){ - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(i, 0, 0); - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; - } - } - } else { - for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ - weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; - } - } - if( - worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() && - worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize() && - worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize() - ){ - currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y + 1, worldPos.z + 1); - if(currentChunk != null){ - weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(0, 0, 0); - } else { - weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; - } - } else { - weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; } + // //face X + // if(worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize()){ + // currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y, worldPos.z); + // if(currentChunk != null && !currentChunk.isHomogenous()){ + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ + // weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = currentChunk.getWeight(0, i, j); + // } + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ + // weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = ISO_SURFACE_EMPTY; + // } + // } + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ + // weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = ISO_SURFACE_EMPTY; + // } + // } + // } + // //face Y + // if(worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize()){ + // currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y + 1, worldPos.z); + // if(currentChunk != null && !currentChunk.isHomogenous()){ + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ + // weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = currentChunk.getWeight(i, 0, j); + // } + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ + // weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = ISO_SURFACE_EMPTY; + // } + // } + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ + // weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = ISO_SURFACE_EMPTY; + // } + // } + // } + // //face Z + // if(worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize()){ + // currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y, worldPos.z + 1); + // if(currentChunk != null && !currentChunk.isHomogenous()){ + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ + // weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(i, j, 0); + // } + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ + // weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; + // } + // } + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){ + // weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; + // } + // } + // } + // //edge X-Y + // if( + // worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() && + // worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize() + // ){ + // currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y + 1, worldPos.z); + // if(currentChunk != null && !currentChunk.isHomogenous()){ + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = currentChunk.getWeight(0, 0, i); + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = ISO_SURFACE_EMPTY; + // } + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = ISO_SURFACE_EMPTY; + // } + // } + // //edge X-Z + // if( + // worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() && + // worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize() + // ){ + // currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y, worldPos.z + 1); + // if(currentChunk != null && !currentChunk.isHomogenous()){ + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(0, i, 0); + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; + // } + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; + // } + // } + // //edge Y-Z + // if( + // worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize() && + // worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize() + // ){ + // currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y + 1, worldPos.z + 1); + // if(currentChunk != null && !currentChunk.isHomogenous()){ + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(i, 0, 0); + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; + // } + // } + // } else { + // for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){ + // weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; + // } + // } + // if( + // worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() && + // worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize() && + // worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize() + // ){ + // currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y + 1, worldPos.z + 1); + // if(currentChunk != null && !currentChunk.isHomogenous()){ + // weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(0, 0, 0); + // } else { + // weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; + // } + // } else { + // weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY; + // } //now set neighboring air weights based on nearby fluid count //idea being that we dont have the snapping behavior from iso surface jumping from -1->0.01 diff --git a/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java b/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java index a71f4693..4e130ca6 100644 --- a/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java +++ b/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java @@ -191,7 +191,7 @@ public class FluidCellManager { if(updateable.size() > 0){ String targetKey = updateable.iterator().next(); updateable.remove(targetKey); - Vector3i worldPos = getVectorFromKey(targetKey); + Vector3i worldPos = this.getVectorFromKey(targetKey); if( worldPos.x >= 0 && worldPos.x < Globals.clientWorldData.getWorldDiscreteSize() && @@ -208,8 +208,10 @@ public class FluidCellManager { // while(commonWorldData.getDynamicInterpolationRatio() % stride != 0){ // stride = stride + 1; // } - keyCellMap.get(targetKey).destroy(); - keyCellMap.get(targetKey).generateDrawableEntity(); + if(keyCellMap.get(targetKey) != null){ + keyCellMap.get(targetKey).destroy(); + keyCellMap.get(targetKey).generateDrawableEntity(); + } } drawable.add(targetKey); } diff --git a/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java b/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java index 22209587..21a70edc 100644 --- a/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java +++ b/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java @@ -19,6 +19,7 @@ import electrosphere.logger.LoggerInterface; import electrosphere.net.parser.net.message.TerrainMessage; import electrosphere.renderer.meshgen.FluidChunkModelGeneration; import electrosphere.renderer.model.Model; +import electrosphere.server.fluid.manager.ServerFluidChunk; import electrosphere.server.terrain.manager.ServerTerrainManager; /** @@ -179,38 +180,44 @@ public class ClientFluidManager { private FluidChunkData parseFluidDataBuffer(ByteBuffer buffer){ FluidChunkData data = new FluidChunkData(); FloatBuffer floatBuffer = buffer.asFloatBuffer(); - for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){ - for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){ - for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){ - data.setWeight(x,y,z,floatBuffer.get()); - if(data.getWeight(x, y, z) <= 0){ - data.setWeight(x, y, z, FluidCell.ISO_SURFACE_EMPTY); + float homogenous = buffer.getFloat(); + if(homogenous == ServerFluidChunk.IS_HOMOGENOUS){ + data.setHomogenous(true); + } else { + data.setHomogenous(false); + data.allocateBuffs(); + for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){ + for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){ + for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){ + data.setWeight(x,y,z,floatBuffer.get()); + if(data.getWeight(x, y, z) <= 0){ + data.setWeight(x, y, z, FluidCell.ISO_SURFACE_EMPTY); + } + } + } + } + for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){ + for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){ + for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){ + data.setVelocityX(x, y, z, floatBuffer.get()); + } + } + } + for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){ + for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){ + for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){ + data.setVelocityY(x, y, z, floatBuffer.get()); + } + } + } + for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){ + for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){ + for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){ + data.setVelocityZ(x, y, z, floatBuffer.get()); } } } } - for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){ - for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){ - for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){ - data.setVelocityX(x, y, z, floatBuffer.get()); - } - } - } - for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){ - for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){ - for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){ - data.setVelocityY(x, y, z, floatBuffer.get()); - } - } - } - for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){ - for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){ - for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){ - data.setVelocityZ(x, y, z, floatBuffer.get()); - } - } - } - // data.setVoxelWeight(weights); return data; } diff --git a/src/main/java/electrosphere/net/server/protocol/TerrainProtocol.java b/src/main/java/electrosphere/net/server/protocol/TerrainProtocol.java index 4ad890c5..de1fb7e0 100644 --- a/src/main/java/electrosphere/net/server/protocol/TerrainProtocol.java +++ b/src/main/java/electrosphere/net/server/protocol/TerrainProtocol.java @@ -396,42 +396,51 @@ public class TerrainProtocol implements ServerProtocolTemplate { * @return the buffer */ public static ByteBuffer constructFluidByteBuffer(ServerFluidChunk chunk){ - ByteBuffer buffer = ByteBuffer.allocate(ServerFluidChunk.BUFFER_SIZE*(4+4+4+4)); - FloatBuffer floatView = buffer.asFloatBuffer(); + ByteBuffer rVal = null; + if(chunk.isHomogenous()){ + rVal = ByteBuffer.allocate(ServerFluidChunk.HOMOGENOUS_BUFFER_SIZE); + FloatBuffer floatView = rVal.asFloatBuffer(); + floatView.put(ServerFluidChunk.IS_HOMOGENOUS); + } else { + rVal = ByteBuffer.allocate(ServerFluidChunk.BUFFER_SIZE*(4+4+4+4) + ServerFluidChunk.HOMOGENOUS_BUFFER_SIZE); + FloatBuffer floatView = rVal.asFloatBuffer(); - for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ - for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){ - for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){ - floatView.put(chunk.getWeight(x, y, z)); + floatView.put(ServerFluidChunk.IS_NOT_HOMOGENOUS); + + for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ + for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){ + for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){ + floatView.put(chunk.getWeight(x, y, z)); + } + } + } + + for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ + for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){ + for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){ + floatView.put(chunk.getVelocityX(x, y, z)); + } + } + } + + for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ + for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){ + for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){ + floatView.put(chunk.getVelocityY(x, y, z)); + } + } + } + + for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ + for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){ + for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){ + floatView.put(chunk.getVelocityZ(x, y, z)); + } } } } - for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ - for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){ - for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){ - floatView.put(chunk.getVelocityX(x, y, z)); - } - } - } - - for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ - for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){ - for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){ - floatView.put(chunk.getVelocityY(x, y, z)); - } - } - } - - for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ - for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){ - for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){ - floatView.put(chunk.getVelocityZ(x, y, z)); - } - } - } - - return buffer; + return rVal; } } diff --git a/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java b/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java index 8aa78531..36cb0930 100644 --- a/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java +++ b/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java @@ -50,6 +50,20 @@ public class ServerFluidChunk { */ public static final int BUFFER_SIZE = ServerFluidChunk.BUFFER_DIM * ServerFluidChunk.BUFFER_DIM * ServerFluidChunk.BUFFER_DIM; + /** + * Fluid data dto value for homogenous chunk + */ + public static final float IS_HOMOGENOUS = 1; + + /** + * Fluid data dto value for non-homogenous chunk + */ + public static final float IS_NOT_HOMOGENOUS = 0; + + /** + * Size of the homogenous value at the front of the fluid chunk dto + */ + public static final int HOMOGENOUS_BUFFER_SIZE = 1 * 4; /** * The world x coordinate of this chunk @@ -142,11 +156,26 @@ public class ServerFluidChunk { */ public boolean asleep = false; + /** + * Tracks whether this chunk is homogenous or not + */ + public boolean isHomogenous = true; + /** * The total density of the chunk */ public float totalDensity = 0; + /** + * Allocates the central arrays for this chunk + */ + private native void allocate(); + + /** + * Frees all native memory + */ + private native void free(); + /** * Constructor * @param worldX The world x coordinate @@ -489,16 +518,6 @@ public class ServerFluidChunk { this.asleep = asleep; } - /** - * Allocates the central arrays for this chunk - */ - private native void allocate(); - - /** - * Frees all native memory - */ - private native void free(); - /** * Frees the buffers contained within this chunk */ @@ -506,4 +525,20 @@ public class ServerFluidChunk { this.free(); } + /** + * Gets the total density of this chunk + * @return The total density + */ + public float getTotalDensity(){ + return this.totalDensity; + } + + /** + * Gets whether this chunk is homogenous or not + * @return true if it is homogenous, false otherwise + */ + public boolean isHomogenous(){ + return this.isHomogenous; + } + } diff --git a/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java b/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java index bb3599d0..a721490e 100644 --- a/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java +++ b/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java @@ -278,6 +278,7 @@ public class ServerFluidManager { // } lock.lock(); ServerFluidChunk fluidChunk = this.getChunk(worldPos.x, worldPos.y, worldPos.z); + fluidChunk.setAsleep(false); fluidChunk.setWeight(voxelPos.x, voxelPos.y, voxelPos.z, weight); lock.unlock(); }