fix fluid sim null ptr bug
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
This commit is contained in:
parent
569311a23e
commit
59be0068f1
@ -1,3 +1,3 @@
|
|||||||
#maven.buildNumber.plugin properties file
|
#maven.buildNumber.plugin properties file
|
||||||
#Sun Dec 01 12:58:18 EST 2024
|
#Sun Dec 01 15:41:36 EST 2024
|
||||||
buildNumber=462
|
buildNumber=471
|
||||||
|
|||||||
@ -1207,6 +1207,7 @@ Add more debugging tools for fluids
|
|||||||
Remove conditional update check in fluid sim
|
Remove conditional update check in fluid sim
|
||||||
Explicit memory management of fluid chunk cache buffers
|
Explicit memory management of fluid chunk cache buffers
|
||||||
Fix GriddedDataCellManager memory leak caused by physics and ConcurrentHashMap
|
Fix GriddedDataCellManager memory leak caused by physics and ConcurrentHashMap
|
||||||
|
Fix fluid sim null pointer bug with unallocated chunks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,5 +2,6 @@
|
|||||||
#define SOLVER_CONSTS_H
|
#define SOLVER_CONSTS_H
|
||||||
|
|
||||||
#define LINEARSOLVERTIMES 5
|
#define LINEARSOLVERTIMES 5
|
||||||
|
#define VECTOR_DIFFUSE_TIMES 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -118,7 +118,7 @@ void simulate(
|
|||||||
// printLayer(chunks[0]->u0[CENTER_LOC],targetLayer);
|
// printLayer(chunks[0]->u0[CENTER_LOC],targetLayer);
|
||||||
//solve vector diffusion
|
//solve vector diffusion
|
||||||
{
|
{
|
||||||
for(int l = 0; l < LINEARSOLVERTIMES; l++){
|
for(int l = 0; l < VECTOR_DIFFUSE_TIMES; l++){
|
||||||
//solve vector diffusion
|
//solve vector diffusion
|
||||||
for(int i = 0; i < numChunks; i++){
|
for(int i = 0; i < numChunks; i++){
|
||||||
Chunk * currentChunk = chunks[i];
|
Chunk * currentChunk = chunks[i];
|
||||||
|
|||||||
@ -148,13 +148,22 @@ void readInChunks(JNIEnv * env, jobject chunkList, Environment * environment){
|
|||||||
int chunkMask;
|
int chunkMask;
|
||||||
|
|
||||||
//solve chunk mask
|
//solve chunk mask
|
||||||
|
int cSideArrPos = 0;
|
||||||
for(int i = 0; i < numChunks; i++){
|
for(int i = 0; i < numChunks; i++){
|
||||||
chunkJRaw = getChunk(i);
|
chunkJRaw = getChunk(i);
|
||||||
chunkMask = calculateChunkMask(env,getBuffArr(dJId));
|
chunkMask = calculateChunkMask(env,getBuffArr(dJId));
|
||||||
(*env)->SetIntField(env,chunkJRaw,chunkmaskJId,chunkMask);
|
(*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;
|
Chunk * newChunk;
|
||||||
if(i >= stbds_arrlen(chunkViewC)){
|
if(cSideArrPos >= stbds_arrlen(chunkViewC)){
|
||||||
// printf("allocate chunk %d\n",i);
|
// printf("allocate chunk %d\n",i);
|
||||||
// fflush(stdout);
|
// fflush(stdout);
|
||||||
newChunk = (Chunk *)malloc(sizeof(Chunk));
|
newChunk = (Chunk *)malloc(sizeof(Chunk));
|
||||||
@ -164,10 +173,11 @@ void readInChunks(JNIEnv * env, jobject chunkList, Environment * environment){
|
|||||||
// printf("new chunk %p\n",chunks[i]);
|
// printf("new chunk %p\n",chunks[i]);
|
||||||
// fflush(stdout);
|
// fflush(stdout);
|
||||||
} else {
|
} else {
|
||||||
newChunk = chunkViewC[i];
|
newChunk = chunkViewC[cSideArrPos];
|
||||||
// printf("get chunk %d: %p\n",i,newChunk);
|
// printf("get chunk %d: %p\n",i,newChunk);
|
||||||
// fflush(stdout);
|
// fflush(stdout);
|
||||||
}
|
}
|
||||||
|
cSideArrPos++;
|
||||||
jd = (*env)->GetObjectField(env,chunkJRaw,dJId);
|
jd = (*env)->GetObjectField(env,chunkJRaw,dJId);
|
||||||
jd0 = (*env)->GetObjectField(env,chunkJRaw,d0JId);
|
jd0 = (*env)->GetObjectField(env,chunkJRaw,d0JId);
|
||||||
u = (*env)->GetObjectField(env,chunkJRaw,uJId);
|
u = (*env)->GetObjectField(env,chunkJRaw,uJId);
|
||||||
|
|||||||
@ -58,7 +58,7 @@ public class FluidCellManager {
|
|||||||
int drawStepdownInterval = 3;
|
int drawStepdownInterval = 3;
|
||||||
int drawStepdownValue = 25;
|
int drawStepdownValue = 25;
|
||||||
|
|
||||||
double drawRadius = 50;
|
double drawRadius = 5 * ServerTerrainChunk.CHUNK_PLACEMENT_OFFSET;
|
||||||
|
|
||||||
int physicsRadius = 3;
|
int physicsRadius = 3;
|
||||||
|
|
||||||
|
|||||||
@ -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
|
* Allocates the central arrays for this chunk
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -72,7 +72,7 @@ public class ServerFluidManager {
|
|||||||
ServerTerrainManager serverTerrainManager;
|
ServerTerrainManager serverTerrainManager;
|
||||||
|
|
||||||
//controls whether fluid simulation should actually happen or not
|
//controls whether fluid simulation should actually happen or not
|
||||||
boolean simulate = false;
|
boolean simulate = true;
|
||||||
|
|
||||||
@Exclude
|
@Exclude
|
||||||
/**
|
/**
|
||||||
@ -291,7 +291,9 @@ public class ServerFluidManager {
|
|||||||
public void queue(int worldX, int worldY, int worldZ){
|
public void queue(int worldX, int worldY, int worldZ){
|
||||||
if(simulate){
|
if(simulate){
|
||||||
ServerFluidChunk fluidChunk = this.getChunk(worldX, worldY, worldZ);
|
ServerFluidChunk fluidChunk = this.getChunk(worldX, worldY, worldZ);
|
||||||
this.simulationQueue.add(fluidChunk);
|
if(fluidChunk.isAllocated()){
|
||||||
|
this.simulationQueue.add(fluidChunk);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user