moving bounds setting around
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-12-11 12:00:28 -05:00
parent 5f565c457d
commit 2a753ddf53
4 changed files with 96 additions and 38 deletions

View File

@ -208,6 +208,8 @@ LIBRARY_API void fluid_grid2_advectDensity(float ** d, float ** d0, float ** ur,
}
}
}
//set bounds
fluid_grid2_set_bounds(0,center_d);
}
/**

View File

@ -86,28 +86,13 @@ LIBRARY_API void fluid_grid2_simulate(
//setup projection
fluid_grid2_setupProjection(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,timestep);
//update array for vectors
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,currentChunk->u[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,currentChunk->v[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_NO_DIR,currentChunk->u0[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_NO_DIR,currentChunk->v0[CENTER_LOC]);
//
//Perform main projection solver
fluid_grid2_solveProjection(currentChunk->u0,currentChunk->v0,timestep);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_NO_DIR,currentChunk->u0[CENTER_LOC]);
//Finalize projection
fluid_grid2_finalizeProjection(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,timestep);
//set boundaries for u,v,w
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,currentChunk->u[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,currentChunk->v[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,currentChunk->w[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,currentChunk->u0[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,currentChunk->v0[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,currentChunk->w0[CENTER_LOC]);
//swap all vector fields
fluid_grid2_flip_arrays(currentChunk->u,currentChunk->u0);
fluid_grid2_flip_arrays(currentChunk->v,currentChunk->v0);
@ -115,31 +100,13 @@ LIBRARY_API void fluid_grid2_simulate(
//advect
fluid_grid2_advectVectors(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,timestep);
//update neighbor arr
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,currentChunk->u[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,currentChunk->v[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,currentChunk->w[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,currentChunk->u0[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,currentChunk->v0[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,currentChunk->w0[CENTER_LOC]);
//setup projection
fluid_grid2_setupProjection(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,timestep);
//update array for vectors
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,currentChunk->u0[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,currentChunk->v0[CENTER_LOC]);
//Perform main projection solver
fluid_grid2_solveProjection(currentChunk->u0,currentChunk->v0,timestep);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_NO_DIR,currentChunk->u0[CENTER_LOC]);
//Finalize projection
fluid_grid2_finalizeProjection(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,timestep);
//set boundaries for u,v,w
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,currentChunk->u[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,currentChunk->v[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,currentChunk->w[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,currentChunk->u0[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,currentChunk->v0[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,currentChunk->w0[CENTER_LOC]);
}
@ -169,13 +136,10 @@ LIBRARY_API void fluid_grid2_simulate(
fluid_grid2_addDensity(environment,currentChunk->d,currentChunk->d0,timestep);
//swap all density arrays
//swap vector fields
fluid_grid2_flip_arrays(currentChunk->d,currentChunk->d0);
//diffuse density
fluid_grid2_solveDiffuseDensity(currentChunk->d,currentChunk->d0,timestep);
fluid_grid2_set_bounds(0,currentChunk->d[CENTER_LOC]);
//swap all density arrays
//swap vector fields
fluid_grid2_flip_arrays(currentChunk->d,currentChunk->d0);
//advect density

View File

@ -153,6 +153,8 @@ LIBRARY_API void fluid_grid2_setupProjection(
}
}
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_NO_DIR,p);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_NO_DIR,div);
}
/**
@ -214,8 +216,8 @@ LIBRARY_API void fluid_grid2_finalizeProjection(
float * p = GET_ARR_RAW(jru0,CENTER_LOC);
float * div = GET_ARR_RAW(jrv0,CENTER_LOC);
for ( k=1 ; k<DIM-1 ; k++ ) {
for ( j=1 ; j<DIM-1 ; j++ ) {
for(k=1; k<DIM-1; k++){
for(j=1; j<DIM-1; j++){
//
//v
//
@ -269,6 +271,10 @@ LIBRARY_API void fluid_grid2_finalizeProjection(
_mm256_storeu_ps(&w[IX(9,j,k)],vector);
}
}
//set bounds
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,u);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,v);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,w);
}
/*
@ -437,4 +443,8 @@ void fluid_grid2_advect_velocity(int b, float ** jrd, float ** jrd0, float * u,
}
}
}
//set bounds
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,u);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,v);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,w);
}

View File

@ -0,0 +1,82 @@
#include <math.h>
#include "stb/stb_ds.h"
#include "fluid/queue/boundsolver.h"
#include "fluid/queue/chunkmask.h"
#include "fluid/queue/chunk.h"
#include "fluid/env/environment.h"
#include "fluid/env/utilities.h"
#include "fluid/sim/grid2/density.h"
#include "fluid/sim/grid2/grid2.h"
#include "fluid/sim/grid2/solver_consts.h"
#include "fluid/sim/grid2/utilities.h"
#include "fluid/sim/grid2/velocity.h"
#include "math/ode/multigrid.h"
#include "../../../util/chunk_test_utils.h"
#include "../../../util/test.h"
/**
* Center of the advection cell
*/
#define FLUID_GRID2_PROJECTION_CELL_CENTER 24
/**
* Error margin for tests
*/
#define FLUID_GRID2_PROJECTION_ERROR_MARGIN 0.00001f
/**
* Testing full sim routine
*/
int fluid_sim_grid2_add_dens_test1(){
printf("fluid_sim_grid2_add_dens_test1\n");
int rVal = 0;
Environment * env = fluid_environment_create();
Chunk ** queue = NULL;
queue = createChunkGrid(env,3,3,3);
//setup chunk values
Chunk * currentChunk = queue[0];
float beforeSum = chunk_queue_sum_density(queue);
//actually simulate
int frameCount = 50;
int additionFrameCutoff = 10;
for(int frame = 0; frame < frameCount; frame++){
if(frame < additionFrameCutoff){
queue[0]->d0[CENTER_LOC][IX(5,5,5)] = MAX_FLUID_VALUE;
}
fluid_grid2_simulate(3*3*3,queue,env,FLUID_GRID2_SIM_STEP);
printf("Existing sum: %lf\n", env->state.existingDensity);
printf("New density: %lf\n", env->state.newDensity);
printf("Adjustment Ratio: %f\n", env->state.normalizationRatio);
float afterSum = chunk_queue_sum_density(queue);
printf("AFter transform sum: %f\n",afterSum);
printf("\n");
}
//test the result
float afterSum = chunk_queue_sum_density(queue);
if(fabs(beforeSum - afterSum) > FLUID_GRID2_PROJECTION_ERROR_MARGIN){
rVal += assertEqualsFloat(beforeSum,afterSum,"Advection changed density! %f %f \n");
}
return rVal;
}
/**
* Testing full sim routines
*/
int fluid_sim_grid2_add_dens_tests(int argc, char **argv){
int rVal = 0;
solver_multigrid_allocate();
fluid_grid2_allocate_arrays();
// rVal += fluid_sim_grid2_add_dens_test1();
return rVal;
}