From 59be0068f10de657f99d266056fe1178df96381f Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 1 Dec 2024 15:49:48 -0500 Subject: [PATCH] fix fluid sim null ptr bug --- buildNumber.properties | 4 ++-- docs/src/progress/renderertodo.md | 1 + src/fluid/includes/solver_consts.h | 1 + src/fluid/src/fluidsim.c | 2 +- src/fluid/src/javainterface.c | 14 ++++++++++++-- .../client/fluid/cells/FluidCellManager.java | 2 +- .../server/fluid/manager/ServerFluidChunk.java | 8 ++++++++ .../server/fluid/manager/ServerFluidManager.java | 6 ++++-- 8 files changed, 30 insertions(+), 8 deletions(-) diff --git a/buildNumber.properties b/buildNumber.properties index 36f6d424..d9e60052 100644 --- a/buildNumber.properties +++ b/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Sun Dec 01 12:58:18 EST 2024 -buildNumber=462 +#Sun Dec 01 15:41:36 EST 2024 +buildNumber=471 diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 96d1e33f..505ae1d8 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1207,6 +1207,7 @@ Add more debugging tools for fluids Remove conditional update check in fluid sim Explicit memory management of fluid chunk cache buffers Fix GriddedDataCellManager memory leak caused by physics and ConcurrentHashMap +Fix fluid sim null pointer bug with unallocated chunks diff --git a/src/fluid/includes/solver_consts.h b/src/fluid/includes/solver_consts.h index 646baf90..d1e99b27 100644 --- a/src/fluid/includes/solver_consts.h +++ b/src/fluid/includes/solver_consts.h @@ -2,5 +2,6 @@ #define SOLVER_CONSTS_H #define LINEARSOLVERTIMES 5 +#define VECTOR_DIFFUSE_TIMES 1 #endif \ No newline at end of file diff --git a/src/fluid/src/fluidsim.c b/src/fluid/src/fluidsim.c index 6cc18c94..258dd81b 100644 --- a/src/fluid/src/fluidsim.c +++ b/src/fluid/src/fluidsim.c @@ -118,7 +118,7 @@ void simulate( // printLayer(chunks[0]->u0[CENTER_LOC],targetLayer); //solve vector diffusion { - for(int l = 0; l < LINEARSOLVERTIMES; l++){ + for(int l = 0; l < VECTOR_DIFFUSE_TIMES; l++){ //solve vector diffusion for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; diff --git a/src/fluid/src/javainterface.c b/src/fluid/src/javainterface.c index a11dddad..984e8ff1 100644 --- a/src/fluid/src/javainterface.c +++ b/src/fluid/src/javainterface.c @@ -148,13 +148,22 @@ void readInChunks(JNIEnv * env, jobject chunkList, Environment * environment){ int chunkMask; //solve chunk mask + int cSideArrPos = 0; for(int i = 0; i < numChunks; i++){ chunkJRaw = getChunk(i); chunkMask = calculateChunkMask(env,getBuffArr(dJId)); (*env)->SetIntField(env,chunkJRaw,chunkmaskJId,chunkMask); + //skip this chunk if the center array is not allocated (must not have been removed yet?) + if( + (*env)->GetObjectArrayElement(env,(*env)->GetObjectField(env,chunkJRaw,dJId),CENTER_LOC) == NULL || + (*env)->GetDirectBufferAddress(env,(*env)->GetObjectArrayElement(env,(*env)->GetObjectField(env,chunkJRaw,dJId),CENTER_LOC)) == NULL + ){ + continue; + } + Chunk * newChunk; - if(i >= stbds_arrlen(chunkViewC)){ + if(cSideArrPos >= stbds_arrlen(chunkViewC)){ // printf("allocate chunk %d\n",i); // fflush(stdout); newChunk = (Chunk *)malloc(sizeof(Chunk)); @@ -164,10 +173,11 @@ void readInChunks(JNIEnv * env, jobject chunkList, Environment * environment){ // printf("new chunk %p\n",chunks[i]); // fflush(stdout); } else { - newChunk = chunkViewC[i]; + newChunk = chunkViewC[cSideArrPos]; // printf("get chunk %d: %p\n",i,newChunk); // fflush(stdout); } + cSideArrPos++; jd = (*env)->GetObjectField(env,chunkJRaw,dJId); jd0 = (*env)->GetObjectField(env,chunkJRaw,d0JId); u = (*env)->GetObjectField(env,chunkJRaw,uJId); diff --git a/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java b/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java index fde76c64..a71f4693 100644 --- a/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java +++ b/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java @@ -58,7 +58,7 @@ public class FluidCellManager { int drawStepdownInterval = 3; int drawStepdownValue = 25; - double drawRadius = 50; + double drawRadius = 5 * ServerTerrainChunk.CHUNK_PLACEMENT_OFFSET; int physicsRadius = 3; diff --git a/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java b/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java index e53b46a0..f302a505 100644 --- a/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java +++ b/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java @@ -460,6 +460,14 @@ public class ServerFluidChunk { } } + /** + * Checks if this chunk is allocated or not + * @return true if it is allocated, false otherwise + */ + public boolean isAllocated(){ + return this.bWeights[CENTER_BUFF] != null; + } + /** * Allocates the central arrays for this chunk */ diff --git a/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java b/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java index f29aeb2b..bb3599d0 100644 --- a/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java +++ b/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java @@ -72,7 +72,7 @@ public class ServerFluidManager { ServerTerrainManager serverTerrainManager; //controls whether fluid simulation should actually happen or not - boolean simulate = false; + boolean simulate = true; @Exclude /** @@ -291,7 +291,9 @@ public class ServerFluidManager { public void queue(int worldX, int worldY, int worldZ){ if(simulate){ ServerFluidChunk fluidChunk = this.getChunk(worldX, worldY, worldZ); - this.simulationQueue.add(fluidChunk); + if(fluidChunk.isAllocated()){ + this.simulationQueue.add(fluidChunk); + } } }