pressurecell improvements
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
9fb2f3f2e1
commit
f009326ed3
@ -10,7 +10,7 @@
|
|||||||
/**
|
/**
|
||||||
* Spacing of cells
|
* Spacing of cells
|
||||||
*/
|
*/
|
||||||
#define FLUID_PRESSURECELL_SPACING 1.0f
|
#define FLUID_PRESSURECELL_SPACING (1.0f/DIM)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Multiplier applied to pressure calculations to encourage advection
|
* Multiplier applied to pressure calculations to encourage advection
|
||||||
@ -25,17 +25,12 @@
|
|||||||
/**
|
/**
|
||||||
* Diffusion constant
|
* Diffusion constant
|
||||||
*/
|
*/
|
||||||
#define FLUID_PRESSURECELL_DIFFUSION_CONSTANT 0.0001f
|
#define FLUID_PRESSURECELL_DIFFUSION_CONSTANT 0.01f
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Viscosity constant
|
* Viscosity constant
|
||||||
*/
|
*/
|
||||||
#define FLUID_PRESSURECELL_VISCOSITY_CONSTANT 0.0001f
|
#define FLUID_PRESSURECELL_VISCOSITY_CONSTANT 0.01f
|
||||||
|
|
||||||
/**
|
|
||||||
* Amount that density contributes to the pressure
|
|
||||||
*/
|
|
||||||
#define FLUID_PRESSURECELL_DENSITY_CONST 0.001f
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Amount of the residual to add to the pressure field each frame
|
* Amount of the residual to add to the pressure field each frame
|
||||||
|
|||||||
@ -66,14 +66,15 @@ LIBRARY_API void pressurecell_advect_density(Environment * environment, Chunk *
|
|||||||
float s0, s1, t0, t1, u0, u1;
|
float s0, s1, t0, t1, u0, u1;
|
||||||
float interpolated;
|
float interpolated;
|
||||||
float vecU, vecV, vecW;
|
float vecU, vecV, vecW;
|
||||||
|
float interpConst = environment->consts.dt / FLUID_PRESSURECELL_SPACING;
|
||||||
for(y = 1; y < DIM-1; y++){
|
for(y = 1; y < DIM-1; y++){
|
||||||
//TODO: eventually skip y levels if there is no density to advect
|
//TODO: eventually skip y levels if there is no density to advect
|
||||||
for(z = 1; z < DIM-1; z++){
|
for(z = 1; z < DIM-1; z++){
|
||||||
for(x = 1; x < DIM-1; x++){
|
for(x = 1; x < DIM-1; x++){
|
||||||
//calculate the real (float) position we are at
|
//calculate the real (float) position we are at
|
||||||
vecU = u[IX(x,y,z)] * environment->consts.dt;
|
vecU = u[IX(x,y,z)] * interpConst;
|
||||||
vecV = v[IX(x,y,z)] * environment->consts.dt;
|
vecV = v[IX(x,y,z)] * interpConst;
|
||||||
vecW = w[IX(x,y,z)] * environment->consts.dt;
|
vecW = w[IX(x,y,z)] * interpConst;
|
||||||
if(vecU > 0.999f){
|
if(vecU > 0.999f){
|
||||||
vecU = 0.999f;
|
vecU = 0.999f;
|
||||||
} else if(vecU < -0.999f){
|
} else if(vecU < -0.999f){
|
||||||
|
|||||||
@ -82,8 +82,8 @@ LIBRARY_API void pressurecell_approximate_pressure(Environment * environment, Ch
|
|||||||
for(y = 0; y < DIM; y++){
|
for(y = 0; y < DIM; y++){
|
||||||
for(x = 0; x < DIM; x++){
|
for(x = 0; x < DIM; x++){
|
||||||
phi0[IX(x,y,z)] = divArr[IX(x,y,z)];
|
phi0[IX(x,y,z)] = divArr[IX(x,y,z)];
|
||||||
// pressureTemp[IX(x,y,z)] = pressureCache[IX(x,y,z)];
|
pressureTemp[IX(x,y,z)] = pressureCache[IX(x,y,z)];
|
||||||
pressureTemp[IX(x,y,z)] = 0;
|
// pressureTemp[IX(x,y,z)] = 0;
|
||||||
if(divArr[IX(x,y,z)] > 3){
|
if(divArr[IX(x,y,z)] > 3){
|
||||||
printf("invalid divergence!\n");
|
printf("invalid divergence!\n");
|
||||||
printf("%f \n", divArr[IX(x,y,z)]);
|
printf("%f \n", divArr[IX(x,y,z)]);
|
||||||
|
|||||||
@ -59,7 +59,7 @@ LIBRARY_API void pressurecell_diffuse_velocity(Environment * environment, Chunk
|
|||||||
float * uTemp = chunk->uTempCache;
|
float * uTemp = chunk->uTempCache;
|
||||||
float * vTemp = chunk->vTempCache;
|
float * vTemp = chunk->vTempCache;
|
||||||
float * wTemp = chunk->wTempCache;
|
float * wTemp = chunk->wTempCache;
|
||||||
float D = FLUID_PRESSURECELL_DIFFUSION_CONSTANT * environment->consts.dt;
|
float D = FLUID_PRESSURECELL_DIFFUSION_CONSTANT * environment->consts.dt / (FLUID_PRESSURECELL_SPACING * FLUID_PRESSURECELL_SPACING);
|
||||||
for(z = 1; z < DIM-1; z++){
|
for(z = 1; z < DIM-1; z++){
|
||||||
for(y = 1; y < DIM-1; y++){
|
for(y = 1; y < DIM-1; y++){
|
||||||
for(x = 1; x < DIM-1; x++){
|
for(x = 1; x < DIM-1; x++){
|
||||||
@ -125,7 +125,7 @@ LIBRARY_API void pressurecell_advect_velocity(Environment * environment, Chunk *
|
|||||||
float s0, s1, t0, t1, u0, u1;
|
float s0, s1, t0, t1, u0, u1;
|
||||||
float interpolatedU, interpolatedV, interpolatedW;
|
float interpolatedU, interpolatedV, interpolatedW;
|
||||||
float magnitude;
|
float magnitude;
|
||||||
float interpConst = environment->consts.dt;
|
float interpConst = environment->consts.dt / FLUID_PRESSURECELL_SPACING;
|
||||||
for(y = 1; y < DIM-1; y++){
|
for(y = 1; y < DIM-1; y++){
|
||||||
for(z = 1; z < DIM-1; z++){
|
for(z = 1; z < DIM-1; z++){
|
||||||
for(x = 1; x < DIM-1; x++){
|
for(x = 1; x < DIM-1; x++){
|
||||||
@ -344,11 +344,11 @@ LIBRARY_API double pressurecell_project_velocity(Environment * environment, Chun
|
|||||||
|
|
||||||
//normalize if the projection has pushed us wayyy out of bounds
|
//normalize if the projection has pushed us wayyy out of bounds
|
||||||
//ie, large pressure differentials can create huge imbalances
|
//ie, large pressure differentials can create huge imbalances
|
||||||
if(magnitude > 1.0f){
|
// if(magnitude > 1.0f){
|
||||||
uArr[IX(x,y,z)] = uArr[IX(x,y,z)] / magnitude;
|
// uArr[IX(x,y,z)] = uArr[IX(x,y,z)] / magnitude;
|
||||||
vArr[IX(x,y,z)] = vArr[IX(x,y,z)] / magnitude;
|
// vArr[IX(x,y,z)] = vArr[IX(x,y,z)] / magnitude;
|
||||||
wArr[IX(x,y,z)] = wArr[IX(x,y,z)] / magnitude;
|
// wArr[IX(x,y,z)] = wArr[IX(x,y,z)] / magnitude;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// magnitude = sqrt(uTemp[IX(x,y,z)] * uTemp[IX(x,y,z)] + vTemp[IX(x,y,z)] * vTemp[IX(x,y,z)] + wTemp[IX(x,y,z)] * wTemp[IX(x,y,z)]);
|
// magnitude = sqrt(uTemp[IX(x,y,z)] * uTemp[IX(x,y,z)] + vTemp[IX(x,y,z)] * vTemp[IX(x,y,z)] + wTemp[IX(x,y,z)] * wTemp[IX(x,y,z)]);
|
||||||
|
|
||||||
|
|||||||
@ -29,7 +29,7 @@ public class FluidAcceleratedSimulator implements ServerFluidSimulator {
|
|||||||
/**
|
/**
|
||||||
* The gravity constant
|
* The gravity constant
|
||||||
*/
|
*/
|
||||||
public static final float GRAVITY_CONST = -10000f;
|
public static final float GRAVITY_CONST = -100f;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load fluid sim library
|
* Load fluid sim library
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user