diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 73eba962..f7e983ed 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1251,6 +1251,7 @@ Refactoring fluid sim code Refactoring fluid sim headers Refactor native test code under src/test More test file refactoring +Native fluid chunk dispatcher diff --git a/src/main/c/includes/fluid/dispatch/dispatcher.h b/src/main/c/includes/fluid/dispatch/dispatcher.h new file mode 100644 index 00000000..425f470b --- /dev/null +++ b/src/main/c/includes/fluid/dispatch/dispatcher.h @@ -0,0 +1,21 @@ +#ifndef FLUID_DISPATCH_H +#define FLUID_DISPATCH_H + +#include "public.h" +#include "fluid/queue/chunk.h" +#include "fluid/env/environment.h" + + + +/** + * Dispatches chunks to different simulation queues based on the chunk's properties + * @param numReadIn The number of chunks + * @param chunkViewC The array of chunks + * @param environment The environment storing the simulation queues + */ +LIBRARY_API void fluid_dispatch(int numReadIn, Chunk ** chunkViewC, Environment * environment); + + + + +#endif \ No newline at end of file diff --git a/src/main/c/includes/fluid/env/environment.h b/src/main/c/includes/fluid/env/environment.h index cd57bc41..7a4b3422 100644 --- a/src/main/c/includes/fluid/env/environment.h +++ b/src/main/c/includes/fluid/env/environment.h @@ -1,8 +1,10 @@ -#include - #ifndef ENVIRONMENT_H #define ENVIRONMENT_H +#include +#include "public.h" +#include "fluid/queue/chunk.h" + /** * The List lookup table */ @@ -42,15 +44,34 @@ typedef struct { jclass serverFluidChunkClass; } JNILookupTable; +/** + * Stores the different queues of cells to simulate + */ +typedef struct { + Chunk ** cellularQueue; +} FluidSimQueue; + /** * Stores data about the simulation environment */ typedef struct { JNILookupTable lookupTable; + FluidSimQueue queue; float gravity; double existingDensity; double newDensity; float normalizationRatio; } Environment; +/** + * Creates an environment + */ +LIBRARY_API Environment * fluid_environment_create(); + +/** + * Frees an environment + * @param environment The environment to free + */ +LIBRARY_API void fluid_environment_free(Environment * environment); + #endif \ No newline at end of file diff --git a/src/main/c/src/fluid/dispatch/dispatcher.c b/src/main/c/src/fluid/dispatch/dispatcher.c new file mode 100644 index 00000000..fb5501b8 --- /dev/null +++ b/src/main/c/src/fluid/dispatch/dispatcher.c @@ -0,0 +1,23 @@ +#include + +#include "stb/stb_ds.h" + +#include "fluid/dispatch/dispatcher.h" +#include "fluid/queue/chunk.h" +#include "fluid/env/environment.h" + +/** + * Dispatches chunks to different simulation queues based on the chunk's properties + * @param numReadIn The number of chunks + * @param chunkViewC The array of chunks + * @param environment The environment storing the simulation queues + */ +LIBRARY_API void fluid_dispatch(int numReadIn, Chunk ** chunkViewC, Environment * environment){ + FluidSimQueue queue = environment->queue; + for(int i = 0; i < numReadIn; i++){ + Chunk * currentChunk = chunkViewC[i]; + //TODO: conditionally add to queues based on some values (ie lod, spatial loc, etc) + stbds_arrput(queue.cellularQueue,currentChunk); + } +} + diff --git a/src/main/c/src/fluid/env/environment.c b/src/main/c/src/fluid/env/environment.c new file mode 100644 index 00000000..3dfa58d4 --- /dev/null +++ b/src/main/c/src/fluid/env/environment.c @@ -0,0 +1,20 @@ +#include + +#include "public.h" +#include "fluid/env/environment.h" + + +/** + * Creates an environment + */ +LIBRARY_API Environment * fluid_environment_create(){ + Environment * rVal = (Environment *)malloc(sizeof(Environment)); + return rVal; +} + +/** + * Frees an environment + */ +LIBRARY_API void fluid_environment_free(Environment * environment){ + free(environment); +} \ No newline at end of file diff --git a/src/main/c/src/fluid/queue/javainterface.c b/src/main/c/src/fluid/queue/javainterface.c index 826a651b..05c0dce4 100644 --- a/src/main/c/src/fluid/queue/javainterface.c +++ b/src/main/c/src/fluid/queue/javainterface.c @@ -8,9 +8,11 @@ //local includes #include "fluid/queue/chunk.h" #include "fluid/queue/chunkmask.h" +#include "fluid/queue/metadatacalc.h" +#include "fluid/env/environment.h" #include "fluid/env/utilities.h" #include "fluid/sim/grid/simulation.h" -#include "fluid/queue/metadatacalc.h" +#include "fluid/dispatch/dispatcher.h" //defines @@ -53,6 +55,7 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate jfloat dt ){ int numReadIn = readInChunks(env,chunkList,environment); + fluid_dispatch(numReadIn,chunkViewC,environment); simulate(numReadIn,chunkViewC,environment,dt); updateMetadata(env,numReadIn,chunkViewC,environment); } @@ -88,7 +91,7 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate //allocate if unallocated if(environment == NULL){ - environment = (Environment *)malloc(sizeof(Environment)); + environment = fluid_environment_create(); } //store variables from java side diff --git a/src/test/c/StormEngineTests.c b/src/test/c/StormEngineTests.c index 0b0ead57..b4f96408 100644 --- a/src/test/c/StormEngineTests.c +++ b/src/test/c/StormEngineTests.c @@ -1,5 +1,10 @@ #include +//library includes +//include stb ds +#define STB_DS_IMPLEMENTATION +#include "stb/stb_ds.h" + int StormEngineTests(int argc, char **argv){ printf("it lives\n"); return 0; diff --git a/src/test/c/fluid/dispatch/dispatcher_tests.c b/src/test/c/fluid/dispatch/dispatcher_tests.c new file mode 100644 index 00000000..249f8932 --- /dev/null +++ b/src/test/c/fluid/dispatch/dispatcher_tests.c @@ -0,0 +1,17 @@ + +#include "fluid/dispatch/dispatcher.h" +#include "fluid/env/environment.h" + +#include "../../util/chunk_test_utils.h" + +int fluid_dispatch_dispatcher_tests(){ + int rVal = 0; + + Environment * env = fluid_environment_create(); + + int queueSize = 10; + Chunk ** queue = chunk_create_queue(queueSize); + fluid_dispatch(queueSize,queue,env); + + return rVal; +} \ No newline at end of file diff --git a/src/test/c/util/chunk_test_utils.c b/src/test/c/util/chunk_test_utils.c index ce1f38a5..8b14d37f 100644 --- a/src/test/c/util/chunk_test_utils.c +++ b/src/test/c/util/chunk_test_utils.c @@ -1,5 +1,6 @@ #include +#include "stb/stb_ds.h" #include "fluid/queue/chunk.h" #include "fluid/queue/chunkmask.h" @@ -37,6 +38,19 @@ void chunk_free(Chunk * chunk){ free(chunk); } +/** + * Creates a chunk queue + * @param size The size of the queue to create + */ +Chunk ** chunk_create_queue(int size){ + Chunk ** rVal = NULL; + for(int i = 0; i < size; i++){ + Chunk * chunk = chunk_create(i,i,i); + stbds_arrput(rVal,chunk); + } + return rVal; +} + /** * Empty test launcher */ diff --git a/src/test/c/util/chunk_test_utils.h b/src/test/c/util/chunk_test_utils.h index 7302658c..28aa0665 100644 --- a/src/test/c/util/chunk_test_utils.h +++ b/src/test/c/util/chunk_test_utils.h @@ -65,4 +65,10 @@ void chunk_free(Chunk * chunk); */ void chunk_set_val(Chunk * chunk, int i, int arr); +/** + * Creates a chunk queue + * @param size The size of the queue to create + */ +Chunk ** chunk_create_queue(int size); + #endif \ No newline at end of file