actual fluid sim in bounded level
	
		
			
	
		
	
	
		
	
		
			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
							
								
									5caed003d1
								
							
						
					
					
						commit
						f2fc2d2dc4
					
				
							
								
								
									
										7
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -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" | ||||
|     } | ||||
| } | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
							
								
								
									
										11
									
								
								src/fluid/includes/environment.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/fluid/includes/environment.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| #ifndef ENVIRONMENT_H | ||||
| #define ENVIRONMENT_H | ||||
| 
 | ||||
| /**
 | ||||
|  * Stores data about the simulation environment | ||||
| */ | ||||
| typedef struct { | ||||
|     float gravity; | ||||
| } Environment; | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										18
									
								
								src/fluid/includes/metadatacalc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/fluid/includes/metadatacalc.h
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
| @ -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 | ||||
| @ -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; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -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 | ||||
|  | ||||
							
								
								
									
										18
									
								
								src/fluid/src/metadatacalc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/fluid/src/metadatacalc.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| #include <stdio.h> | ||||
| #include <immintrin.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #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){ | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| @ -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; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -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<String, ServerFluidChunk> chunkCache = new HashMap<String, ServerFluidChunk>(); | ||||
|     @Exclude | ||||
| @ -85,6 +95,12 @@ public class ServerFluidManager { | ||||
|      * The queue of chunks to broadcast | ||||
|      */ | ||||
|     List<ServerFluidChunk> broadcastQueue = new LinkedList<ServerFluidChunk>(); | ||||
| 
 | ||||
|     @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(); | ||||
|  | ||||
| @ -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<ServerFluidChunk> chunks, float timestep); | ||||
| 
 | ||||
|     /** | ||||
|      * Frees all native memory | ||||
|      */ | ||||
|     private static native void free(); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     @Override | ||||
|     public void simulate(List<ServerFluidChunk> fluidChunks, List<ServerFluidChunk> 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<ServerFluidChunk> 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; | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user