diff --git a/.vscode/settings.json b/.vscode/settings.json index 70c694a4..b0d0d099 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,11 @@ "files.associations": { "electrosphere_fluidsim.h": "c", "jni.h": "c", - "electrosphere_server_fluid_simulator_fluidacceleratedsimulator.h": "c" + "electrosphere_server_fluid_simulator_fluidacceleratedsimulator.h": "c", + "utilities.h": "c", + "simulation.h": "c", + "chunk.h": "c", + "chunkmask.h": "c", + "metadatacalc.h": "c" } } \ No newline at end of file diff --git a/buildNumber.properties b/buildNumber.properties index 4698f3cf..8adc26f9 100644 --- a/buildNumber.properties +++ b/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Sat Nov 30 18:07:55 EST 2024 -buildNumber=427 +#Sat Nov 30 19:02:40 EST 2024 +buildNumber=435 diff --git a/src/fluid/compile.sh b/src/fluid/compile.sh index 5d16647c..419d345a 100644 --- a/src/fluid/compile.sh +++ b/src/fluid/compile.sh @@ -68,12 +68,17 @@ INPUT_FILES="./src/fluidsim.c" OUTPUT_FILE="./fluidsim.o" gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE +COMPILE_FLAGS="-c -fPIC -m64 -mavx -mavx2 -march=native -Ofast -DSAVE_STEPS=$SAVE_STEPS" +INPUT_FILES="./src/metadatacalc.c" +OUTPUT_FILE="./metadatacalc.o" +gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE + #compile shared object file OUTPUT_FILE="libfluidsim$LIB_ENDING" COMPILE_FLAGS="-shared" -INPUT_FILES="fluidsim.o javainterface.o" +INPUT_FILES="fluidsim.o javainterface.o metadatacalc.o" gcc $COMPILE_FLAGS $INPUT_FILES -o $OUTPUT_FILE #move to resources diff --git a/src/fluid/includes/electrosphere_server_fluid_simulator_FluidAcceleratedSimulator.h b/src/fluid/includes/electrosphere_server_fluid_simulator_FluidAcceleratedSimulator.h index 3e3464be..2d169ee2 100644 --- a/src/fluid/includes/electrosphere_server_fluid_simulator_FluidAcceleratedSimulator.h +++ b/src/fluid/includes/electrosphere_server_fluid_simulator_FluidAcceleratedSimulator.h @@ -7,6 +7,18 @@ #ifdef __cplusplus extern "C" { #endif +#undef electrosphere_server_fluid_simulator_FluidAcceleratedSimulator_SIMULATE_TIMESTEP +#define electrosphere_server_fluid_simulator_FluidAcceleratedSimulator_SIMULATE_TIMESTEP 0.01f +#undef electrosphere_server_fluid_simulator_FluidAcceleratedSimulator_GRAVITY_CONST +#define electrosphere_server_fluid_simulator_FluidAcceleratedSimulator_GRAVITY_CONST 1000.0f +/* + * Class: electrosphere_server_fluid_simulator_FluidAcceleratedSimulator + * Method: init + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAcceleratedSimulator_init + (JNIEnv *, jclass, jfloat); + /* * Class: electrosphere_server_fluid_simulator_FluidAcceleratedSimulator * Method: simulate diff --git a/src/fluid/includes/environment.h b/src/fluid/includes/environment.h new file mode 100644 index 00000000..d4fc6916 --- /dev/null +++ b/src/fluid/includes/environment.h @@ -0,0 +1,11 @@ +#ifndef ENVIRONMENT_H +#define ENVIRONMENT_H + +/** + * Stores data about the simulation environment +*/ +typedef struct { + float gravity; +} Environment; + +#endif \ No newline at end of file diff --git a/src/fluid/includes/metadatacalc.h b/src/fluid/includes/metadatacalc.h new file mode 100644 index 00000000..9d584ec1 --- /dev/null +++ b/src/fluid/includes/metadatacalc.h @@ -0,0 +1,18 @@ +#ifndef METADATACALC +#define METADATACALC + +#include "./chunk.h" +#include "./environment.h" + + +/** + * Updates the metadata for all chunks + * @param numChunks The number of chunks + * @param passedInChunks The chunks that were passed in + * @param environment The environment data + */ +void updateMetadata(int numChunks, Chunk ** passedInChunks, Environment * environment); + + + +#endif \ No newline at end of file diff --git a/src/fluid/includes/simulation.h b/src/fluid/includes/simulation.h index 4f86ca57..bf97216a 100644 --- a/src/fluid/includes/simulation.h +++ b/src/fluid/includes/simulation.h @@ -2,7 +2,15 @@ #define SIMULATION_H #include "./chunk.h" +#include "./environment.h" -void simulate(int numChunks, Chunk ** passedInChunks, float timestep); +/** + * Performs the main simulation + * @param numChunks The number of chunks + * @param passedInChunks The chunks to simulate + * @param environment The environment data + * @param timestep The timestep to simulate by + */ +void simulate(int numChunks, Chunk ** passedInChunks, Environment * environment, float timestep); #endif \ No newline at end of file diff --git a/src/fluid/src/fluidsim.c b/src/fluid/src/fluidsim.c index 4eea9517..a4fbfa40 100644 --- a/src/fluid/src/fluidsim.c +++ b/src/fluid/src/fluidsim.c @@ -31,10 +31,12 @@ Chunk ** chunks = NULL; //https://stackoverflow.com/questions/39823375/clarification-about-getfieldid static inline void saveStep(float * values, const char * name); +static inline void applyGravity(Chunk * currentChunk, Environment * environment); void simulate( int numChunks, Chunk ** passedInChunks, + Environment * environment, jfloat timestep ){ chunks = passedInChunks; @@ -50,6 +52,7 @@ void simulate( //solve chunk mask for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; + applyGravity(currentChunk,environment); addSourceToVectors( DIM, currentChunk->chunkMask, @@ -539,4 +542,20 @@ static inline void saveStep(float * values, const char * name){ fclose(fp); } +} + +/** + * Applies gravity to the chunk + * @param currentChunk The chunk to apply on + * @param environment The environment data of the world + */ +static inline void applyGravity(Chunk * currentChunk, Environment * environment){ + int N = DIM; + for(int x = 0; x < DIM; x++){ + for(int y = 0; y < DIM; y++){ + for(int z = 0; z < DIM; z++){ + GET_ARR_RAW(currentChunk->v0,CENTER_LOC)[IX(x,y,z)] = GET_ARR_RAW(currentChunk->d,CENTER_LOC)[IX(x,y,z)] * environment->gravity; + } + } + } } \ No newline at end of file diff --git a/src/fluid/src/javainterface.c b/src/fluid/src/javainterface.c index 3ea4d660..9ed4de2c 100644 --- a/src/fluid/src/javainterface.c +++ b/src/fluid/src/javainterface.c @@ -10,6 +10,7 @@ #include "../includes/chunkmask.h" #include "../includes/utilities.h" #include "../includes/simulation.h" +#include "../includes/metadatacalc.h" //defines @@ -35,6 +36,9 @@ Chunk ** javaChunkView = NULL; //the number of chunks int numChunks = 0; +//the environment data +Environment * environment = NULL; + JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAcceleratedSimulator_simulate( JNIEnv * env, @@ -43,7 +47,8 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate jfloat dt ){ readInChunks(env,chunkList); - simulate(numChunks,javaChunkView,dt); + simulate(numChunks,javaChunkView,environment,dt); + updateMetadata(numChunks,javaChunkView,environment); } /** @@ -66,6 +71,19 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate numChunks = 0; } +/** + * Initializes the library + */ +JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAcceleratedSimulator_init( + JNIEnv * env, + jclass fluidSimClass, + jfloat gravity + ){ + if(environment == NULL){ + environment = (Environment *)malloc(sizeof(Environment)); + } + environment->gravity = gravity; +} /** * Reads chunks into the dynamic array diff --git a/src/fluid/src/metadatacalc.c b/src/fluid/src/metadatacalc.c new file mode 100644 index 00000000..2363734f --- /dev/null +++ b/src/fluid/src/metadatacalc.c @@ -0,0 +1,18 @@ +#include +#include +#include + +#include "../includes/utilities.h" +#include "../includes/chunkmask.h" +#include "../includes/metadatacalc.h" + +/** + * Updates the metadata for all chunks + * @param numChunks The number of chunks + * @param passedInChunks The chunks that were passed in + * @param environment The environment data + */ +void updateMetadata(int numChunks, Chunk ** passedInChunks, Environment * environment){ + +} + diff --git a/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java b/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java index 9c39845e..1097af7a 100644 --- a/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java +++ b/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java @@ -8,8 +8,6 @@ import java.nio.FloatBuffer; import org.joml.Vector3f; import org.joml.Vector3i; -import electrosphere.server.terrain.manager.ServerTerrainChunk; - /** * Is a single chunk of terrain on the server @@ -405,7 +403,7 @@ public class ServerFluidChunk { * @return The index */ public int IX(int x, int y, int z){ - return x * ServerTerrainChunk.CHUNK_DIMENSION * ServerTerrainChunk.CHUNK_DIMENSION + y * ServerTerrainChunk.CHUNK_DIMENSION + z; + return x * ServerFluidChunk.BUFFER_DIM * ServerFluidChunk.BUFFER_DIM + y * ServerFluidChunk.BUFFER_DIM + z; } /** diff --git a/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java b/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java index 85ae6671..6da820c3 100644 --- a/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java +++ b/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java @@ -26,6 +26,16 @@ import org.joml.Vector3i; * Provides an interface for the server to query information about fluid */ public class ServerFluidManager { + + /** + * DEfault size of the cache + */ + static final int DEFAULT_CACHE_SIZE = 500; + + /** + * The number of frames to wait between updates + */ + static final int UPDATE_RATE = 0; //the seed for the water long seed; @@ -38,7 +48,7 @@ public class ServerFluidManager { //Basic idea is we associate string that contains chunk x&y&z with elevation //While we incur a penalty with converting ints -> string, think this will //offset regenerating the array every time we want a new one - int cacheSize = 500; + int cacheSize = DEFAULT_CACHE_SIZE; @Exclude Map chunkCache = new HashMap(); @Exclude @@ -85,6 +95,12 @@ public class ServerFluidManager { * The queue of chunks to broadcast */ List broadcastQueue = new LinkedList(); + + @Exclude + /** + * The update frame-skipping tracking variable + */ + int updatePhase = 0; /** @@ -263,7 +279,9 @@ public class ServerFluidManager { * @param worldZ The world z coordinate of the chunk */ public void queue(int worldX, int worldY, int worldZ){ - this.simulationQueue.add(this.getChunk(worldX, worldY, worldZ)); + ServerFluidChunk fluidChunk = this.getChunk(worldX, worldY, worldZ); + fluidChunk.updated = true; + this.simulationQueue.add(fluidChunk); } /** @@ -273,10 +291,18 @@ public class ServerFluidManager { Globals.profiler.beginAggregateCpuSample("ServerFluidManager.simulate"); lock.lock(); if(simulate){ - if(this.serverFluidSimulator != null){ - this.serverFluidSimulator.simulate(this.simulationQueue,this.broadcastQueue); + if(updatePhase == UPDATE_RATE){ + if(this.serverFluidSimulator != null){ + this.serverFluidSimulator.simulate(this.simulationQueue,this.broadcastQueue); + } } + this.simulationQueue.clear(); + + updatePhase++; + if(updatePhase > UPDATE_RATE){ + updatePhase = 0; + } } lock.unlock(); Globals.profiler.endCpuSample(); diff --git a/src/main/java/electrosphere/server/fluid/simulator/FluidAcceleratedSimulator.java b/src/main/java/electrosphere/server/fluid/simulator/FluidAcceleratedSimulator.java index c2ce85fd..b92ca944 100644 --- a/src/main/java/electrosphere/server/fluid/simulator/FluidAcceleratedSimulator.java +++ b/src/main/java/electrosphere/server/fluid/simulator/FluidAcceleratedSimulator.java @@ -26,6 +26,11 @@ public class FluidAcceleratedSimulator implements ServerFluidSimulator { */ public static final float SIMULATE_TIMESTEP = 0.01f; + /** + * The gravity constant + */ + public static final float GRAVITY_CONST = -1000; + /** * Load fluid sim library */ @@ -49,8 +54,29 @@ public class FluidAcceleratedSimulator implements ServerFluidSimulator { * Starts up the simulator */ public FluidAcceleratedSimulator(){ + FluidAcceleratedSimulator.init(FluidAcceleratedSimulator.GRAVITY_CONST); } + /** + * Initializes the data for the fluid sim library + */ + private static native void init(float gravity); + + /** + * Main native simulation function + * @param chunks The list of chunks to simulate with + * @param timestep The timestep to simulate + */ + private static native void simulate(List chunks, float timestep); + + /** + * Frees all native memory + */ + private static native void free(); + + + + @Override public void simulate(List fluidChunks, List broadcastQueue){ FluidAcceleratedSimulator.simulate(fluidChunks, SIMULATE_TIMESTEP); @@ -61,13 +87,6 @@ public class FluidAcceleratedSimulator implements ServerFluidSimulator { } } - /** - * Main native simulation function - * @param chunks The list of chunks to simulate with - * @param timestep The timestep to simulate - */ - private static native void simulate(List chunks, float timestep); - /** * Cleans up the simulator's native state @@ -76,9 +95,22 @@ public class FluidAcceleratedSimulator implements ServerFluidSimulator { FluidAcceleratedSimulator.free(); } + /** - * Frees all native memory + * Sums the density for a chunk + * @param fluidChunk The chunk + * @return The total density of the chunk */ - private static native void free(); + private static double sumAllDensity(ServerFluidChunk fluidChunk){ + double rVal = 0; + for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ + for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){ + for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){ + rVal = rVal + fluidChunk.getWeight(x, y, z); + } + } + } + return rVal; + } }