cellular sim deterministic work
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
This commit is contained in:
parent
6cd97ec13b
commit
01a2ab603c
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@ -36,6 +36,8 @@
|
||||
"dispatcher.h": "c",
|
||||
"cellular.h": "c",
|
||||
"limits": "c",
|
||||
"boundsolver.h": "c"
|
||||
"boundsolver.h": "c",
|
||||
"randutils.h": "c",
|
||||
"mathutils.h": "c"
|
||||
}
|
||||
}
|
||||
@ -1265,6 +1265,8 @@ Add hard walls to bounds solver
|
||||
Cellular bounds transfer properly
|
||||
Fluid chunk terrain bounds transfer
|
||||
Cellular transfer behavior work
|
||||
Native math utils
|
||||
Frame tracking on native side
|
||||
|
||||
|
||||
# TODO
|
||||
|
||||
5
src/main/c/includes/fluid/env/environment.h
vendored
5
src/main/c/includes/fluid/env/environment.h
vendored
@ -71,7 +71,8 @@ typedef struct {
|
||||
double existingDensity;
|
||||
double newDensity;
|
||||
float normalizationRatio;
|
||||
} FluidDensityTracking;
|
||||
int frame;
|
||||
} FluidSimState;
|
||||
|
||||
/**
|
||||
* Stores data about the simulation environment
|
||||
@ -80,7 +81,7 @@ typedef struct {
|
||||
JNILookupTable lookupTable;
|
||||
FluidSimQueue queue;
|
||||
FluidSimConsts consts;
|
||||
FluidDensityTracking densityTracking;
|
||||
FluidSimState state;
|
||||
} Environment;
|
||||
|
||||
/**
|
||||
|
||||
23
src/main/c/includes/math/mathutils.h
Normal file
23
src/main/c/includes/math/mathutils.h
Normal file
@ -0,0 +1,23 @@
|
||||
#ifndef MATHUTILS_H
|
||||
#define MATHUTILS_H
|
||||
|
||||
#include "public.h"
|
||||
|
||||
|
||||
/**
|
||||
* Calculates the fractional component of a float
|
||||
*/
|
||||
LIBRARY_API float fract(float x);
|
||||
|
||||
/**
|
||||
* Calculates the dot product of 2D vectors
|
||||
*/
|
||||
LIBRARY_API float dot2(float x1, float y1, float x2, float y2);
|
||||
|
||||
/**
|
||||
* Calculates the dot product of 3D vectors
|
||||
*/
|
||||
LIBRARY_API float dot3(float x1, float y1, float z1, float x2, float y2, float z2);
|
||||
|
||||
|
||||
#endif
|
||||
28
src/main/c/includes/math/randutils.h
Normal file
28
src/main/c/includes/math/randutils.h
Normal file
@ -0,0 +1,28 @@
|
||||
#ifndef RANDUTILS_H
|
||||
#define RANDUTILS_H
|
||||
|
||||
#include "public.h"
|
||||
|
||||
|
||||
/**
|
||||
* Generates a random number given a seed value
|
||||
*/
|
||||
LIBRARY_API float randutils_rand1(float x);
|
||||
|
||||
/**
|
||||
* Generates a random number given two seed values
|
||||
*/
|
||||
LIBRARY_API float randutils_rand2(float x, float y);
|
||||
|
||||
/**
|
||||
* Generates a random number given three seed values
|
||||
*/
|
||||
LIBRARY_API float randutils_rand3(float x, float y, float z);
|
||||
|
||||
/**
|
||||
* Maps a float of range [0,1] to an integer range
|
||||
*/
|
||||
LIBRARY_API float randutils_map(float x, int min, int max);
|
||||
|
||||
|
||||
#endif
|
||||
@ -100,9 +100,10 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate
|
||||
|
||||
//store variables from java side
|
||||
environment->consts.gravity = gravity;
|
||||
environment->densityTracking.existingDensity = 0;
|
||||
environment->densityTracking.newDensity = 0;
|
||||
environment->densityTracking.normalizationRatio = 0;
|
||||
environment->state.existingDensity = 0;
|
||||
environment->state.newDensity = 0;
|
||||
environment->state.normalizationRatio = 0;
|
||||
environment->state.frame = 0;
|
||||
|
||||
//store jni lookup tables
|
||||
jclass listClass = (*env)->FindClass(env,"java/util/List");
|
||||
|
||||
@ -89,7 +89,11 @@ void updateMetadata(JNIEnv * env, int numChunks, Chunk ** passedInChunks, Enviro
|
||||
}
|
||||
|
||||
//alert java side to updated static values
|
||||
float normalizationRatio = environment->densityTracking.normalizationRatio;
|
||||
float normalizationRatio = environment->state.normalizationRatio;
|
||||
(*env)->SetStaticFloatField(env,environment->lookupTable.serverFluidChunkClass,environment->lookupTable.serverFluidChunkTable.normalizationRatioId,normalizationRatio);
|
||||
|
||||
|
||||
//update frame state
|
||||
environment->state.frame += 1;
|
||||
}
|
||||
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
#include "fluid/sim/cellular/cellular.h"
|
||||
#include "fluid/queue/chunkmask.h"
|
||||
#include "fluid/env/utilities.h"
|
||||
#include "math/randutils.h"
|
||||
|
||||
|
||||
#define FLUID_CELLULAR_DIFFUSE_RATE 0.001
|
||||
@ -43,8 +44,10 @@ LIBRARY_API void fluid_cellular_simulate(Environment * environment){
|
||||
int transferred = 0;
|
||||
|
||||
// printf("%f %f %f %d %d %d\n",bounds[IX(0,1,1)],bounds[IX(1,0,1)],bounds[IX(1,1,0)],currentChunk->x,currentChunk->y,currentChunk->z);
|
||||
for(int x = 0; x < DIM; x++){
|
||||
for(int y = 0; y < DIM; y++){
|
||||
int shift = randutils_map(randutils_rand2(environment->state.frame,y),0,FLUID_CELLULAR_KERNEL_PERMUTATIONS - 1);
|
||||
int permutation = randutils_map(randutils_rand2(environment->state.frame,y + 1),0,FLUID_CELLULAR_KERNEL_PERMUTATIONS - 1);
|
||||
for(int x = 0; x < DIM; x++){
|
||||
for(int z = 0; z < DIM; z++){
|
||||
|
||||
//diffuse density
|
||||
@ -116,10 +119,10 @@ LIBRARY_API void fluid_cellular_simulate(Environment * environment){
|
||||
}
|
||||
}
|
||||
//transfer laterally
|
||||
int permutation = (z % (FLUID_CELLULAR_KERNEL_PERMUTATIONS / 2)) + ((x % (FLUID_CELLULAR_KERNEL_PERMUTATIONS / 2)) * (FLUID_CELLULAR_KERNEL_PERMUTATIONS / 2));
|
||||
for(int j = 0; j < FLUID_CELLULAR_KERNEL_SIZE; j++){
|
||||
int nX = x + fluid_cellular_kernel_x[permutation][j];
|
||||
int nZ = z + fluid_cellular_kernel_z[permutation][j];
|
||||
// int permutation = (z % (FLUID_CELLULAR_KERNEL_PERMUTATIONS / 2)) + ((x % (FLUID_CELLULAR_KERNEL_PERMUTATIONS / 2)) * (FLUID_CELLULAR_KERNEL_PERMUTATIONS / 2));
|
||||
// for(int j = 0; j < FLUID_CELLULAR_KERNEL_SIZE; j++){
|
||||
int nX = x + fluid_cellular_kernel_x[permutation][shift];
|
||||
int nZ = z + fluid_cellular_kernel_z[permutation][shift];
|
||||
if(nX < 0 || nX >= DIM || nZ < 0 || nZ >= DIM){
|
||||
continue;
|
||||
}
|
||||
@ -130,7 +133,7 @@ LIBRARY_API void fluid_cellular_simulate(Environment * environment){
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -26,8 +26,8 @@ void addDensity(
|
||||
float * x = GET_ARR_RAW(d,CENTER_LOC);
|
||||
float * s = GET_ARR_RAW(d0,CENTER_LOC);
|
||||
for(i=0; i<size; i++){
|
||||
environment->densityTracking.newDensity = environment->densityTracking.newDensity + dt * s[i];
|
||||
environment->densityTracking.existingDensity = environment->densityTracking.existingDensity + x[i];
|
||||
environment->state.newDensity = environment->state.newDensity + dt * s[i];
|
||||
environment->state.existingDensity = environment->state.existingDensity + x[i];
|
||||
x[i] += dt*s[i];
|
||||
if(x[i] < MIN_FLUID_VALUE){
|
||||
x[i] = MIN_FLUID_VALUE;
|
||||
|
||||
@ -445,8 +445,8 @@ void fluid_grid_simulate(
|
||||
//add density
|
||||
{
|
||||
double deltaDensity = 0;
|
||||
environment->densityTracking.existingDensity = 0;
|
||||
environment->densityTracking.newDensity = 0;
|
||||
environment->state.existingDensity = 0;
|
||||
environment->state.newDensity = 0;
|
||||
for(int i = 0; i < numChunks; i++){
|
||||
Chunk * currentChunk = chunks[i];
|
||||
addDensity(environment,DIM,currentChunk->chunkMask,currentChunk->d,currentChunk->d0,timestep);
|
||||
@ -525,8 +525,8 @@ void fluid_grid_simulate(
|
||||
}
|
||||
float normalizationRatio = 0;
|
||||
if(transformedDensity != 0){
|
||||
normalizationRatio = (environment->densityTracking.existingDensity + environment->densityTracking.newDensity) / transformedDensity;
|
||||
environment->densityTracking.normalizationRatio = normalizationRatio;
|
||||
normalizationRatio = (environment->state.existingDensity + environment->state.newDensity) / transformedDensity;
|
||||
environment->state.normalizationRatio = normalizationRatio;
|
||||
}
|
||||
for(int i = 0; i < numChunks; i++){
|
||||
Chunk * currentChunk = chunks[i];
|
||||
|
||||
27
src/main/c/src/math/mathutils.c
Normal file
27
src/main/c/src/math/mathutils.c
Normal file
@ -0,0 +1,27 @@
|
||||
#include <math.h>
|
||||
|
||||
|
||||
#include "math/mathutils.h"
|
||||
|
||||
|
||||
/**
|
||||
* Calculates the fractional component of a float
|
||||
*/
|
||||
LIBRARY_API float fract(float x){
|
||||
return x - floor(x);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the dot product of 2D vectors
|
||||
*/
|
||||
LIBRARY_API float dot2(float x1, float y1, float x2, float y2){
|
||||
return (x1 * x2) + (y1 * y2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the dot product of 3D vectors
|
||||
*/
|
||||
LIBRARY_API float dot3(float x1, float y1, float z1, float x2, float y2, float z2){
|
||||
return (x1 * x2) + (y1 * y2) + (z1 * z2);
|
||||
}
|
||||
|
||||
46
src/main/c/src/math/randutils.c
Normal file
46
src/main/c/src/math/randutils.c
Normal file
@ -0,0 +1,46 @@
|
||||
#include <math.h>
|
||||
|
||||
#include "math/mathutils.h"
|
||||
#include "math/randutils.h"
|
||||
|
||||
/**
|
||||
* The magnitude of the random oscillator
|
||||
*/
|
||||
#define MATHUTILS_RAND_MAG 100000.0f
|
||||
|
||||
/**
|
||||
* Vectors used for prng generation
|
||||
*/
|
||||
#define MATHUTILS_RAND_VEC_X 111.154315f
|
||||
#define MATHUTILS_RAND_VEC_Y 123.631631f
|
||||
#define MATHUTILS_RAND_VEC_Z 117.724545f
|
||||
|
||||
/**
|
||||
* Generates a random number given a seed value
|
||||
*/
|
||||
LIBRARY_API float randutils_rand1(float x){
|
||||
return fract(sin(x) * MATHUTILS_RAND_MAG);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a random number given two seed values
|
||||
*/
|
||||
LIBRARY_API float randutils_rand2(float x, float y){
|
||||
return fract(sin(dot2(x,y,MATHUTILS_RAND_VEC_X,MATHUTILS_RAND_VEC_Y)) * MATHUTILS_RAND_MAG);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a random number given three seed values
|
||||
*/
|
||||
LIBRARY_API float randutils_rand3(float x, float y, float z){
|
||||
return fract(sin(dot3(x,y,z,MATHUTILS_RAND_VEC_X,MATHUTILS_RAND_VEC_Y,MATHUTILS_RAND_VEC_Z)) * MATHUTILS_RAND_MAG);
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a float of range [0,1] to an integer range
|
||||
*/
|
||||
LIBRARY_API float randutils_map(float x, int min, int max){
|
||||
return (int)(x * (max - min) + min);
|
||||
}
|
||||
|
||||
|
||||
26
src/test/c/math/mathutils_tests.c
Normal file
26
src/test/c/math/mathutils_tests.c
Normal file
@ -0,0 +1,26 @@
|
||||
|
||||
#include "math/mathutils.h"
|
||||
#include "../util/test.h"
|
||||
|
||||
|
||||
int math_mathutils_tests(){
|
||||
int rVal = 0;
|
||||
|
||||
//test fract()
|
||||
rVal += assertEqualsFloat(0.5,fract(1.5),"Fract failed to calculate correctly! %f %f \n");
|
||||
rVal += assertEqualsFloat(0.0,fract(1.0),"Fract failed to calculate correctly! %f %f \n");
|
||||
|
||||
//test dot2()
|
||||
rVal += assertEqualsFloat(1,dot2(1,0,1,0),"dot2 should be 1! %f %f \n");
|
||||
rVal += assertEqualsFloat(-1,dot2(1,0,-1,0),"dot2 should be -1! %f %f \n");
|
||||
rVal += assertEqualsFloat(0,dot2(1,0,0,1),"dot2 should be 0! %f %f \n");
|
||||
|
||||
|
||||
//test dot3()
|
||||
rVal += assertEqualsFloat(1,dot3(1,0,0,1,0,0),"dot3 should be 1! %f %f \n");
|
||||
rVal += assertEqualsFloat(-1,dot3(1,0,0,-1,0,0),"dot3 should be -1! %f %f \n");
|
||||
rVal += assertEqualsFloat(0,dot3(1,0,0,0,1,0),"dot3 should be 0! %f %f \n");
|
||||
|
||||
|
||||
return rVal;
|
||||
}
|
||||
15
src/test/c/math/randutils_tests.c
Normal file
15
src/test/c/math/randutils_tests.c
Normal file
@ -0,0 +1,15 @@
|
||||
|
||||
#include "math/mathutils.h"
|
||||
#include "math/randutils.h"
|
||||
#include "../util/test.h"
|
||||
|
||||
|
||||
int math_randutils_tests(){
|
||||
int rVal = 0;
|
||||
|
||||
randutils_rand1(1);
|
||||
randutils_rand2(1,2);
|
||||
randutils_rand3(1,2,3);
|
||||
|
||||
return rVal;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user