work on pressurecell
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-12-19 13:24:49 -05:00
parent efb37b1618
commit 913962c7f0
8 changed files with 182 additions and 41 deletions

View File

@ -10,7 +10,7 @@
/**
* Force of gravity in unit tests
*/
#define FLUID_PRESSURECELL_GRAVITY 1.0f
#define FLUID_PRESSURECELL_GRAVITY -100.0f
/**
* Spacing of cells
@ -47,6 +47,11 @@
*/
#define FLUID_PRESSURECELL_DIV_PRESSURE_CONST 5.0f
/**
* Set to 1 to clamp small density values to 0
*/
#define FLUID_PRESSURECELL_CLAMP_MIN_DENSITY 0
/**
* Cutoff after which density is clamped to zero while diffusing
*/
@ -75,12 +80,17 @@
/**
* Percentage of presure to keep from last frame
*/
#define FLUID_PRESSURECELL_PRESSURE_BACKDOWN_FACTOR 0.5f
#define FLUID_PRESSURECELL_PRESSURE_BACKDOWN_FACTOR 1.0f
/**
* Pressure added on recapturing fluid pushed into borders
*/
#define FLUID_PRESSURECELL_RECAPTURE_PRESSURE 1.0f
/**
* Pressure of bounds
*/
#define FLUID_PRESSURECELL_BOUND_PRESSURE FLUID_PRESSURECELL_MAX_PRESSURE
#endif

View File

@ -7,13 +7,19 @@
/**
* Define as 1 to source values from surrounding chunks
*/
#define USE_BOUNDS 1
static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
int i, j;
int neighborIndex;
//x+ face
neighborIndex = CK(2,1,1);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
arrays[CENTER_LOC][IX(DIM-1, i, j)] = arrays[neighborIndex][IX( 1, i, j)];
@ -29,7 +35,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x- face
neighborIndex = CK(0,1,1);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
arrays[CENTER_LOC][IX(0, i, j)] = arrays[neighborIndex][IX(DIM-2, i, j)];
@ -45,7 +51,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//y+ face
neighborIndex = CK(1,2,1);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
arrays[CENTER_LOC][IX( i, DIM-1, j)] = arrays[neighborIndex][IX( i, 1, j)];
@ -61,7 +67,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//y- face
neighborIndex = CK(1,0,1);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
arrays[CENTER_LOC][IX(i, 0, j)] = arrays[neighborIndex][IX( i, DIM-2, j)];
@ -77,7 +83,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//z+ face
neighborIndex = CK(1,1,2);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
arrays[CENTER_LOC][IX( i, j, DIM-1)] = arrays[neighborIndex][IX( i, j, 1)];
@ -93,7 +99,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//z- face
neighborIndex = CK(1,1,0);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
arrays[CENTER_LOC][IX(i, j, 0)] = arrays[neighborIndex][IX( i, j, DIM-2)];
@ -114,7 +120,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x+ y+ edge
neighborIndex = CK(2,2,1);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX(DIM-1, DIM-1, i)] = arrays[neighborIndex][IX( 1, 1, i)];
}
@ -126,7 +132,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x+ y- edge
neighborIndex = CK(2,0,1);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX(DIM-1, 0, i)] = arrays[neighborIndex][IX( 1, DIM-2, i)];
}
@ -138,7 +144,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x- y+ edge
neighborIndex = CK(0,2,1);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX( 0, DIM-1, i)] = arrays[neighborIndex][IX( DIM-2, 1, i)];
}
@ -150,7 +156,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x- y- edge
neighborIndex = CK(0,0,1);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX( 0, 0, i)] = arrays[neighborIndex][IX( DIM-2, DIM-2, i)];
}
@ -170,7 +176,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x+ z+ edge
neighborIndex = CK(2,1,2);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX(DIM-1, i, DIM-1)] = arrays[neighborIndex][IX( 1, i, 1)];
}
@ -182,7 +188,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x+ z- edge
neighborIndex = CK(2,1,0);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX(DIM-1, i, 0)] = arrays[neighborIndex][IX( 1, i, DIM-2)];
}
@ -194,7 +200,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x- z+ edge
neighborIndex = CK(0,1,2);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX( 0, i, DIM-1)] = arrays[neighborIndex][IX( DIM-2, i, 1)];
}
@ -206,7 +212,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x- z- edge
neighborIndex = CK(0,1,0);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX( 0, i, 0)] = arrays[neighborIndex][IX( DIM-2, i, DIM-2)];
}
@ -225,7 +231,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//y+ z+ edge
neighborIndex = CK(1,2,2);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX( i, DIM-1, DIM-1)] = arrays[neighborIndex][IX( i, 1, 1)];
}
@ -237,7 +243,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//y+ z- edge
neighborIndex = CK(1,2,0);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX( i,DIM-1, 0)] = arrays[neighborIndex][IX( i, 1, DIM-2)];
}
@ -249,7 +255,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//y- z+ edge
neighborIndex = CK(1,0,2);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX( i, 0, DIM-1)] = arrays[neighborIndex][IX( i, DIM-2, 1)];
}
@ -261,7 +267,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//y- z- edge
neighborIndex = CK(1,0,0);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
arrays[CENTER_LOC][IX( i, 0, 0)] = arrays[neighborIndex][IX( i, DIM-2, DIM-2)];
}
@ -278,7 +284,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x+ y+ z+ corner
neighborIndex = CK(2,2,2);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
arrays[CENTER_LOC][IX(DIM-1, DIM-1, DIM-1)] = arrays[neighborIndex][IX( 1, 1, 1)];
} else {
arrays[CENTER_LOC][IX(DIM-1, DIM-1, DIM-1)] = fillVal;
@ -286,7 +292,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x+ y+ z- corner
neighborIndex = CK(2,2,0);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
arrays[CENTER_LOC][IX(DIM-1, DIM-1, 0)] = arrays[neighborIndex][IX( 1, 1, DIM-2)];
} else {
arrays[CENTER_LOC][IX(DIM-1, DIM-1, 0)] = fillVal;
@ -296,7 +302,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x+ y- z+ corner
neighborIndex = CK(2,0,2);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
arrays[CENTER_LOC][IX(DIM-1, 0, DIM-1)] = arrays[neighborIndex][IX( 1, DIM-2, 1)];
} else {
arrays[CENTER_LOC][IX(DIM-1, 0, DIM-1)] = fillVal;
@ -304,7 +310,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x+ y- z- corner
neighborIndex = CK(2,0,0);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
arrays[CENTER_LOC][IX(DIM-1, 0, 0)] = arrays[neighborIndex][IX( 1, DIM-2, DIM-2)];
} else {
arrays[CENTER_LOC][IX(DIM-1, 0, 0)] = fillVal;
@ -314,7 +320,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x- y+ z+ corner
neighborIndex = CK(0,2,2);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
arrays[CENTER_LOC][IX(0, DIM-1, DIM-1)] = arrays[neighborIndex][IX( DIM-2, 1, 1)];
} else {
arrays[CENTER_LOC][IX(0, DIM-1, DIM-1)] = fillVal;
@ -322,7 +328,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x- y+ z- corner
neighborIndex = CK(0,2,0);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
arrays[CENTER_LOC][IX(0, DIM-1, 0)] = arrays[neighborIndex][IX( DIM-2, 1, DIM-2)];
} else {
arrays[CENTER_LOC][IX(0, DIM-1, 0)] = fillVal;
@ -332,7 +338,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x- y- z+ corner
neighborIndex = CK(0,0,2);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
arrays[CENTER_LOC][IX(0, 0, DIM-1)] = arrays[neighborIndex][IX( DIM-2, DIM-2, 1)];
} else {
arrays[CENTER_LOC][IX(0, 0, DIM-1)] = fillVal;
@ -340,7 +346,7 @@ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
//x- y- z- corner
neighborIndex = CK(0,0,0);
if(arrays[neighborIndex] != NULL){
if(USE_BOUNDS && arrays[neighborIndex] != NULL){
arrays[CENTER_LOC][IX(0, 0, 0)] = arrays[neighborIndex][IX( DIM-2, DIM-2, DIM-2)];
} else {
arrays[CENTER_LOC][IX(0, 0, 0)] = fillVal;

View File

@ -130,7 +130,7 @@ LIBRARY_API void pressurecell_diffuse_density(Environment * environment, Chunk *
)
) * a
;
if(densityTemp[IX(x,y,z)] < FLUID_PRESSURECELL_MIN_DENSITY_CLAMP_CUTOFF){
if(FLUID_PRESSURECELL_CLAMP_MIN_DENSITY && densityTemp[IX(x,y,z)] < FLUID_PRESSURECELL_MIN_DENSITY_CLAMP_CUTOFF){
densityTemp[IX(x,y,z)] = 0;
}
}

View File

@ -6,7 +6,10 @@
#include "fluid/queue/chunk.h"
/**
* Inverts the force applied to the border
*/
#define INVERT_BORDER_FORCE 1
/**
* Calculates the expected density and pressure
@ -114,6 +117,9 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(DIM-2,x,y);
if(uArr[adjacentIndex] > 0 && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = 1.0f - fabs(uArr[adjacentIndex]);
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -148,6 +154,9 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(1,x,y);
if(uArr[adjacentIndex] < 0 && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = 1.0f - fabs(uArr[adjacentIndex]);
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -182,6 +191,9 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(x,DIM-2,y);
if(vArr[adjacentIndex] > 0 && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = 1.0f - fabs(vArr[adjacentIndex]);
if(INVERT_BORDER_FORCE){
vArr[adjacentIndex] = -vArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -216,6 +228,9 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(x,1,y);
if(vArr[adjacentIndex] < 0 && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = 1.0f - fabs(vArr[adjacentIndex]);
if(INVERT_BORDER_FORCE){
vArr[adjacentIndex] = -vArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -250,6 +265,9 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(x,y,DIM-2);
if(wArr[adjacentIndex] > 0 && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = 1.0f - fabs(wArr[adjacentIndex]);
if(INVERT_BORDER_FORCE){
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -284,6 +302,9 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(x,y,1);
if(wArr[adjacentIndex] < 0 && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = 1.0f - fabs(wArr[adjacentIndex]);
if(INVERT_BORDER_FORCE){
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -337,6 +358,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(1,1,x);
if((uArr[adjacentIndex] < 0 && vArr[adjacentIndex] < 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -367,6 +392,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(1,DIM-2,x);
if((uArr[adjacentIndex] < 0 && vArr[adjacentIndex] > 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -397,6 +426,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(DIM-2,1,x);
if((uArr[adjacentIndex] > 0 && vArr[adjacentIndex] < 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -427,6 +460,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(DIM-2,DIM-2,x);
if((uArr[adjacentIndex] > 0 && vArr[adjacentIndex] > 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -463,6 +500,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(1,x,1);
if((uArr[adjacentIndex] < 0 && wArr[adjacentIndex] < 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -493,6 +534,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(1,x,DIM-2);
if((uArr[adjacentIndex] < 0 && wArr[adjacentIndex] > 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -523,6 +568,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(DIM-2,x,1);
if((uArr[adjacentIndex] > 0 && wArr[adjacentIndex] < 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -553,6 +602,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(DIM-2,x,DIM-2);
if((uArr[adjacentIndex] > 0 && wArr[adjacentIndex] > 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -587,6 +640,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(x,1,1);
if((vArr[adjacentIndex] < 0 && wArr[adjacentIndex] < 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -617,6 +674,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(x,1,DIM-2);
if((vArr[adjacentIndex] < 0 && wArr[adjacentIndex] > 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -647,6 +708,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(x,DIM-2,1);
if((vArr[adjacentIndex] > 0 && wArr[adjacentIndex] < 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -677,6 +742,10 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(x,DIM-2,DIM-2);
if((vArr[adjacentIndex] > 0 && wArr[adjacentIndex] > 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] - estimatedLoss;
@ -740,6 +809,11 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(1,1,1);
if((uArr[adjacentIndex] < 0 && vArr[adjacentIndex] < 0 && wArr[adjacentIndex] < 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -768,6 +842,11 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(1,DIM-2,1);
if((uArr[adjacentIndex] < 0 && vArr[adjacentIndex] > 0 && wArr[adjacentIndex] < 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -795,6 +874,11 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(DIM-2,1,1);
if((uArr[adjacentIndex] > 0 && vArr[adjacentIndex] < 0 && wArr[adjacentIndex] < 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -823,6 +907,11 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(DIM-2,DIM-2,1);
if((uArr[adjacentIndex] > 0 && vArr[adjacentIndex] > 0 && wArr[adjacentIndex] < 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -855,6 +944,11 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(1,1,DIM-2);
if((uArr[adjacentIndex] < 0 && vArr[adjacentIndex] < 0 && wArr[adjacentIndex] > 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -883,6 +977,11 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(1,DIM-2,DIM-2);
if((uArr[adjacentIndex] < 0 && vArr[adjacentIndex] > 0 && wArr[adjacentIndex] > 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -910,6 +1009,11 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(DIM-2,1,DIM-2);
if((uArr[adjacentIndex] > 0 && vArr[adjacentIndex] < 0 && wArr[adjacentIndex] > 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;
@ -938,6 +1042,11 @@ LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk *
adjacentIndex = IX(DIM-2,DIM-2,DIM-2);
if((uArr[adjacentIndex] > 0 && vArr[adjacentIndex] > 0 && wArr[adjacentIndex] > 0) && dArr[adjacentIndex] > MIN_FLUID_VALUE){
invertedForce = (1.0f - fabs(uArr[adjacentIndex])) * (1.0f - fabs(vArr[adjacentIndex])) * (1.0f - fabs(wArr[adjacentIndex]));
if(INVERT_BORDER_FORCE){
uArr[adjacentIndex] = -uArr[adjacentIndex];
vArr[adjacentIndex] = -vArr[adjacentIndex];
wArr[adjacentIndex] = -wArr[adjacentIndex];
}
if(invertedForce > MIN_FLUID_VALUE){
estimatedLoss = dArr[adjacentIndex] / invertedForce;
dTemp[adjacentIndex] = dArr[adjacentIndex] + estimatedLoss;

View File

@ -17,6 +17,7 @@ LIBRARY_API void pressurecell_approximate_pressure(Environment * environment, Ch
float * uArr = chunk->u[CENTER_LOC];
float * vArr = chunk->v[CENTER_LOC];
float * wArr = chunk->w[CENTER_LOC];
float * border = chunk->bounds[CENTER_LOC];
// float * uArr = chunk->uTempCache;
// float * vArr = chunk->vTempCache;
// float * wArr = chunk->wTempCache;
@ -99,12 +100,18 @@ LIBRARY_API void pressurecell_approximate_pressure(Environment * environment, Ch
//there are two values that should potentially be set to here
//either, same pressure as voxel in normal direction if this edge is actually an edge
//otherwise, set to the pressure of the neighboring chunk
// pressureTemp[IX(0,x,y)] = pressureCache[IX(0,x,y)];
// pressureTemp[IX(DIM-1,x,y)] = pressureCache[IX(DIM-1,x,y)];
// pressureTemp[IX(x,0,y)] = pressureCache[IX(x,0,y)];
// pressureTemp[IX(x,DIM-1,y)] = pressureCache[IX(x,DIM-1,y)];
// pressureTemp[IX(x,y,0)] = pressureCache[IX(x,y,0)];
// pressureTemp[IX(x,y,DIM-1)] = pressureCache[IX(x,y,DIM-1)];
pressureTemp[IX(0,x,y)] = pressureCache[IX(0,x,y)];
pressureTemp[IX(DIM-1,x,y)] = pressureCache[IX(DIM-1,x,y)];
pressureTemp[IX(x,0,y)] = pressureCache[IX(x,0,y)];
pressureTemp[IX(x,DIM-1,y)] = pressureCache[IX(x,DIM-1,y)];
pressureTemp[IX(x,y,0)] = pressureCache[IX(x,y,0)];
pressureTemp[IX(x,y,DIM-1)] = pressureCache[IX(x,y,DIM-1)];
// pressureTemp[IX(0,x,y)] = border[IX(0,x,y)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
// pressureTemp[IX(DIM-1,x,y)] = border[IX(DIM-1,x,y)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
// pressureTemp[IX(x,0,y)] = border[IX(x,0,y)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
// pressureTemp[IX(x,DIM-1,y)] = border[IX(x,DIM-1,y)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
// pressureTemp[IX(x,y,0)] = border[IX(x,y,0)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
// pressureTemp[IX(x,y,DIM-1)] = border[IX(x,y,DIM-1)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
//divergence borders
phi0[IX(0,x,y)] = divCache[IX(0,x,y)];
@ -149,6 +156,12 @@ LIBRARY_API void pressurecell_approximate_pressure(Environment * environment, Ch
pressureTemp[IX(x,DIM-1,y)] = pressureTemp[IX(x,DIM-2,y)];
pressureTemp[IX(x,y,0)] = pressureTemp[IX(x,y,1)];
pressureTemp[IX(x,y,DIM-1)] = pressureTemp[IX(x,y,DIM-2)];
// pressureTemp[IX(0,x,y)] = border[IX(0,x,y)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
// pressureTemp[IX(DIM-1,x,y)] = border[IX(DIM-1,x,y)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
// pressureTemp[IX(x,0,y)] = border[IX(x,0,y)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
// pressureTemp[IX(x,DIM-1,y)] = border[IX(x,DIM-1,y)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
// pressureTemp[IX(x,y,0)] = border[IX(x,y,0)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
// pressureTemp[IX(x,y,DIM-1)] = border[IX(x,y,DIM-1)] * FLUID_PRESSURECELL_BOUND_PRESSURE;
}
}
chunk->projectionIterations++;
@ -160,6 +173,7 @@ LIBRARY_API void pressurecell_approximate_pressure(Environment * environment, Ch
if(pressureTemp[IX(x,y,z)] > FLUID_PRESSURECELL_MAX_PRESSURE){
printf("Invalid pressure!\n");
printf("%f %f \n", phi0[IX(x-1,y,z)], phi0[IX(x+1,y,z)]);
printf("%f \n", pressureTemp[IX(x,y,z)]);
printf("\n");
}
}

View File

@ -165,8 +165,8 @@ int fluid_sim_grid2_convergence_test3(){
int fluid_sim_grid2_convergence_tests(){
int rVal = 0;
rVal += fluid_sim_grid2_convergence_test1();
rVal += fluid_sim_grid2_convergence_test2();
// rVal += fluid_sim_grid2_convergence_test1();
// rVal += fluid_sim_grid2_convergence_test2();
// rVal += fluid_sim_grid2_convergence_test3();
return rVal;

View File

@ -65,10 +65,12 @@ int fluid_sim_pressurecell_add_gravity_test1(){
//
expected = 0;
actual = currentChunk->v[CENTER_LOC][IX(1,1,DIM-2)];
if(fabs(expected - actual) < FLUID_PRESSURE_CELL_ERROR_MARGIN){
if(fabs(expected - actual) > FLUID_PRESSURE_CELL_ERROR_MARGIN){
rVal++;
printf("Gravity not applied!\n");
printf("grav(1,1,DIM-2): %f \n", currentChunk->v[CENTER_LOC][IX(1,1,DIM-2)]);
printf("grav(1,1,DIM-2): %f \n", actual);
printf("expected: %f \n", expected);
printf("diff: %f \n", fabs(expected - actual));
}
return rVal;

View File

@ -133,7 +133,7 @@ int fluid_sim_pressurecell_sim_e2e_tests(int argc, char **argv){
int rVal = 0;
rVal += fluid_sim_pressurecell_sim_e2e_test1();
rVal += fluid_sim_pressurecell_sim_e2e_test2();
// rVal += fluid_sim_pressurecell_sim_e2e_test2();
return rVal;
}