From d8eaf7f50131a7987537e28f377f67009aa3d5a4 Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 1 Dec 2024 17:56:47 -0500 Subject: [PATCH] conditional fluid chunk rasterization --- docs/src/progress/renderertodo.md | 1 + .../client/fluid/cells/FluidCell.java | 169 ++---------------- 2 files changed, 15 insertions(+), 155 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 2ccc6126..390aee55 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1213,6 +1213,7 @@ Fix fluid chunk indexing from java side Memory pooling for chunk buffer allocations Server homogenous fluid chunk declarations Unsleeping fluid chunks on edit +Conditionally rasterize fluid chunks based on homogeneity diff --git a/src/main/java/electrosphere/client/fluid/cells/FluidCell.java b/src/main/java/electrosphere/client/fluid/cells/FluidCell.java index 4abe6f89..4fe4b737 100644 --- a/src/main/java/electrosphere/client/fluid/cells/FluidCell.java +++ b/src/main/java/electrosphere/client/fluid/cells/FluidCell.java @@ -65,11 +65,12 @@ public class FluidCell { Globals.clientScene.deregisterEntity(modelEntity); } - fillInData(); - - modelEntity = FluidChunk.clientCreateFluidChunkEntity(weights); - - ClientEntityUtils.initiallyPositionEntity(modelEntity, getRealPos(), new Quaterniond()); + FluidChunkData currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos); + if(!currentChunk.isHomogenous()){ + this.fillInData(currentChunk); + modelEntity = FluidChunk.clientCreateFluidChunkEntity(weights); + ClientEntityUtils.initiallyPositionEntity(modelEntity, getRealPos(), new Quaterniond()); + } } protected Vector3d getRealPos(){ @@ -85,11 +86,13 @@ public class FluidCell { */ public void destroy(){ CollisionEngine collisionEngine = Globals.clientSceneWrapper.getCollisionEngine(); - collisionEngine.destroyPhysics(modelEntity); - ClientEntityUtils.destroyEntity(modelEntity); - //destruct model - String modelPath = (String)modelEntity.getData(EntityDataStrings.DATA_STRING_MODEL_PATH); - Globals.assetManager.deregisterModelPath(modelPath); + if(modelEntity != null){ + collisionEngine.destroyPhysics(modelEntity); + ClientEntityUtils.destroyEntity(modelEntity); + //destruct model + String modelPath = (String)modelEntity.getData(EntityDataStrings.DATA_STRING_MODEL_PATH); + Globals.assetManager.deregisterModelPath(modelPath); + } } /** @@ -103,13 +106,12 @@ public class FluidCell { /** * Fills in the internal arrays of data for generate terrain models */ - private void fillInData(){ + private void fillInData(FluidChunkData currentChunk){ // //fill in data // //main chunk - FluidChunkData currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos); 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++){ @@ -119,149 +121,6 @@ public class FluidCell { } } } - // //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