fix fluid dispatch array deref
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-12-06 15:39:17 -05:00
parent 89b4fbb862
commit c022ee1206
9 changed files with 34 additions and 21 deletions

View File

@ -1,3 +1,3 @@
#maven.buildNumber.plugin properties file #maven.buildNumber.plugin properties file
#Fri Dec 06 15:07:16 EST 2024 #Fri Dec 06 15:38:11 EST 2024
buildNumber=525 buildNumber=526

View File

@ -1254,6 +1254,7 @@ More test file refactoring
Native fluid chunk dispatcher Native fluid chunk dispatcher
Dedicated native fluid simulator Dedicated native fluid simulator
Define cellular simulator Define cellular simulator
Fix fluid dispatcher array deref

View File

@ -60,6 +60,15 @@ typedef struct {
float dt; float dt;
} FluidSimConsts; } FluidSimConsts;
/**
* Used for tracking the change in density over time of the environment
*/
typedef struct {
double existingDensity;
double newDensity;
float normalizationRatio;
} FluidDensityTracking;
/** /**
* Stores data about the simulation environment * Stores data about the simulation environment
*/ */
@ -67,9 +76,7 @@ typedef struct {
JNILookupTable lookupTable; JNILookupTable lookupTable;
FluidSimQueue queue; FluidSimQueue queue;
FluidSimConsts consts; FluidSimConsts consts;
double existingDensity; FluidDensityTracking densityTracking;
double newDensity;
float normalizationRatio;
} Environment; } Environment;
/** /**

View File

@ -13,23 +13,22 @@
* @param environment The environment storing the simulation queues * @param environment The environment storing the simulation queues
*/ */
LIBRARY_API void fluid_dispatch(int numReadIn, Chunk ** chunkViewC, Environment * environment){ LIBRARY_API void fluid_dispatch(int numReadIn, Chunk ** chunkViewC, Environment * environment){
FluidSimQueue queue = environment->queue;
//clear queues //clear queues
int countCurrent; int countCurrent;
countCurrent = stbds_arrlen(queue.cellularQueue); countCurrent = arrlen(environment->queue.cellularQueue);
if(countCurrent > 0){ if(countCurrent > 0){
stbds_arrdeln(queue.cellularQueue,0,countCurrent); arrdeln(environment->queue.cellularQueue,0,countCurrent);
} }
countCurrent = stbds_arrlen(queue.gridQueue); countCurrent = arrlen(environment->queue.gridQueue);
if(countCurrent > 0){ if(countCurrent > 0){
stbds_arrdeln(queue.gridQueue,0,countCurrent); arrdeln(environment->queue.gridQueue,0,countCurrent);
} }
//queue new chunks //queue new chunks
for(int i = 0; i < numReadIn; i++){ for(int i = 0; i < numReadIn; i++){
Chunk * currentChunk = chunkViewC[i]; Chunk * currentChunk = chunkViewC[i];
//TODO: conditionally add to queues based on some values (ie lod, spatial loc, etc) //TODO: conditionally add to queues based on some values (ie lod, spatial loc, etc)
stbds_arrput(queue.gridQueue,currentChunk); arrput(environment->queue.gridQueue,currentChunk);
} }
} }

View File

@ -98,9 +98,9 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate
//store variables from java side //store variables from java side
environment->consts.gravity = gravity; environment->consts.gravity = gravity;
environment->existingDensity = 0; environment->densityTracking.existingDensity = 0;
environment->newDensity = 0; environment->densityTracking.newDensity = 0;
environment->normalizationRatio = 0; environment->densityTracking.normalizationRatio = 0;
//store jni lookup tables //store jni lookup tables
jclass listClass = (*env)->FindClass(env,"java/util/List"); jclass listClass = (*env)->FindClass(env,"java/util/List");

View File

@ -88,7 +88,7 @@ void updateMetadata(JNIEnv * env, int numChunks, Chunk ** passedInChunks, Enviro
} }
//alert java side to updated static values //alert java side to updated static values
float normalizationRatio = environment->normalizationRatio; float normalizationRatio = environment->densityTracking.normalizationRatio;
(*env)->SetStaticFloatField(env,environment->lookupTable.serverFluidChunkClass,environment->lookupTable.serverFluidChunkTable.normalizationRatioId,normalizationRatio); (*env)->SetStaticFloatField(env,environment->lookupTable.serverFluidChunkClass,environment->lookupTable.serverFluidChunkTable.normalizationRatioId,normalizationRatio);
} }

View File

@ -26,8 +26,8 @@ void addDensity(
float * x = GET_ARR_RAW(d,CENTER_LOC); float * x = GET_ARR_RAW(d,CENTER_LOC);
float * s = GET_ARR_RAW(d0,CENTER_LOC); float * s = GET_ARR_RAW(d0,CENTER_LOC);
for(i=0; i<size; i++){ for(i=0; i<size; i++){
environment->newDensity = environment->newDensity + dt * s[i]; environment->densityTracking.newDensity = environment->densityTracking.newDensity + dt * s[i];
environment->existingDensity = environment->existingDensity + x[i]; environment->densityTracking.existingDensity = environment->densityTracking.existingDensity + x[i];
x[i] += dt*s[i]; x[i] += dt*s[i];
if(x[i] < MIN_VALUE){ if(x[i] < MIN_VALUE){
x[i] = MIN_VALUE; x[i] = MIN_VALUE;

View File

@ -445,8 +445,8 @@ void fluid_grid_simulate(
//add density //add density
{ {
double deltaDensity = 0; double deltaDensity = 0;
environment->existingDensity = 0; environment->densityTracking.existingDensity = 0;
environment->newDensity = 0; environment->densityTracking.newDensity = 0;
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
addDensity(environment,DIM,currentChunk->chunkMask,currentChunk->d,currentChunk->d0,timestep); addDensity(environment,DIM,currentChunk->chunkMask,currentChunk->d,currentChunk->d0,timestep);
@ -525,8 +525,8 @@ void fluid_grid_simulate(
} }
float normalizationRatio = 0; float normalizationRatio = 0;
if(transformedDensity != 0){ if(transformedDensity != 0){
normalizationRatio = (environment->existingDensity + environment->newDensity) / transformedDensity; normalizationRatio = (environment->densityTracking.existingDensity + environment->densityTracking.newDensity) / transformedDensity;
environment->normalizationRatio = normalizationRatio; environment->densityTracking.normalizationRatio = normalizationRatio;
} }
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];

View File

@ -1,8 +1,11 @@
#include "stb/stb_ds.h"
#include "fluid/dispatch/dispatcher.h" #include "fluid/dispatch/dispatcher.h"
#include "fluid/env/environment.h" #include "fluid/env/environment.h"
#include "../../util/chunk_test_utils.h" #include "../../util/chunk_test_utils.h"
#include "../../util/test.h"
int fluid_dispatch_dispatcher_tests(){ int fluid_dispatch_dispatcher_tests(){
int rVal = 0; int rVal = 0;
@ -13,5 +16,8 @@ int fluid_dispatch_dispatcher_tests(){
Chunk ** queue = chunk_create_queue(queueSize); Chunk ** queue = chunk_create_queue(queueSize);
fluid_dispatch(queueSize,queue,env); fluid_dispatch(queueSize,queue,env);
int gridChunksFound = stbds_arrlen(env->queue.gridQueue);
rVal += assertEquals(gridChunksFound,queueSize,"should have 10 queued chunks -- %d %d \n");
return rVal; return rVal;
} }