native bounds solver
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-12-06 18:18:33 -05:00
parent 53a9a1b383
commit e5ce16a734
9 changed files with 1447 additions and 1 deletions

View File

@ -35,6 +35,7 @@
"simulator.h": "c", "simulator.h": "c",
"dispatcher.h": "c", "dispatcher.h": "c",
"cellular.h": "c", "cellular.h": "c",
"limits": "c" "limits": "c",
"boundsolver.h": "c"
} }
} }

View File

@ -1256,6 +1256,8 @@ Dedicated native fluid simulator
Define cellular simulator Define cellular simulator
Fix fluid dispatcher array deref Fix fluid dispatcher array deref
Bounds array allocation Bounds array allocation
Store world pos on native side
Native bounds solver

View File

@ -27,6 +27,9 @@ typedef struct {
jfieldID v0JId; jfieldID v0JId;
jfieldID w0JId; jfieldID w0JId;
jfieldID boundsId; jfieldID boundsId;
jfieldID worldXId;
jfieldID worldYId;
jfieldID worldZId;
jfieldID neighborsId; jfieldID neighborsId;
jfieldID chunkmaskJId; jfieldID chunkmaskJId;
jfieldID updatedId; jfieldID updatedId;

View File

@ -0,0 +1,21 @@
#ifndef FLUID_BOUNDSOLVER_H
#define FLUID_BOUNDSOLVER_H
#include "public.h"
#include "fluid/queue/chunk.h"
#include "fluid/env/environment.h"
/**
* Sets the boundary values for each chunk
* @param numReadIn The number of chunks
* @param chunkViewC The array of chunks
* @param environment The environment storing the simulation queues
*/
LIBRARY_API void fluid_solve_bounds(int numReadIn, Chunk ** chunkViewC, Environment * environment);
#endif

View File

@ -0,0 +1,359 @@
#include "fluid/queue/boundsolver.h"
#include "fluid/queue/chunkmask.h"
#include "fluid/env/utilities.h"
/**
* Sets the boundary values for each chunk
* @param numReadIn The number of chunks
* @param chunkViewC The array of chunks
* @param environment The environment storing the simulation queues
*/
LIBRARY_API void fluid_solve_bounds(int numReadIn, Chunk ** chunkViewC, Environment * environment){
int i, j, k;
int chunkIndex;
int index;
int neighborIndex;
for(chunkIndex = 0; chunkIndex < numReadIn; chunkIndex++){
Chunk * current = chunkViewC[chunkIndex];
//x+ face
neighborIndex = CK(2,1,1);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX(DIM-1, i, j)] = current->d[neighborIndex][IX( 1, i, j)];
}
}
} else {
for(i = 1; i < DIM; i++){
for(j = 1; j < DIM; j++){
current->d[CENTER_LOC][IX(DIM-1, i, j)] = 0;
}
}
}
//x- face
neighborIndex = CK(0,1,1);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX(0, i, j)] = current->d[neighborIndex][IX(DIM-2, i, j)];
}
}
} else {
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX(0, i, j)] = 0;
}
}
}
//y+ face
neighborIndex = CK(1,2,1);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX( i, DIM-1, j)] = current->d[neighborIndex][IX( i, 1, j)];
}
}
} else {
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX( i, DIM-1, j)] = 0;
}
}
}
//y- face
neighborIndex = CK(1,0,1);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX(i, 0, j)] = current->d[neighborIndex][IX( i, DIM-2, j)];
}
}
} else {
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX(i, 0, j)] = 0;
}
}
}
//z+ face
neighborIndex = CK(1,1,2);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX( i, j, DIM-1)] = current->d[neighborIndex][IX( i, j, 1)];
}
}
} else {
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX( i, j, DIM-1)] = 0;
}
}
}
//z- face
neighborIndex = CK(1,1,0);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX(i, j, 0)] = current->d[neighborIndex][IX( i, j, DIM-2)];
}
}
} else {
for(i = 1; i < DIM-1; i++){
for(j = 1; j < DIM-1; j++){
current->d[CENTER_LOC][IX(i, j, 0)] = 0;
}
}
}
//
// edges
//
//x+ y+ edge
neighborIndex = CK(2,2,1);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX(DIM-1, DIM-1, i)] = current->d[neighborIndex][IX( 1, 1, i)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX(DIM-1, DIM-1, i)] = 0;
}
}
//x+ y- edge
neighborIndex = CK(2,0,1);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX(DIM-1, 0, i)] = current->d[neighborIndex][IX( 1, DIM-2, i)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX(DIM-1, 0, i)] = 0;
}
}
//x- y+ edge
neighborIndex = CK(0,2,1);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX( 0, DIM-1, i)] = current->d[neighborIndex][IX( DIM-2, 1, i)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX( 0, DIM-1, i)] = 0;
}
}
//x- y- edge
neighborIndex = CK(0,0,1);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX( 0, 0, i)] = current->d[neighborIndex][IX( DIM-2, DIM-2, i)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX( 0, 0, i)] = 0;
}
}
//x+ z+ edge
neighborIndex = CK(2,1,2);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX(DIM-1, i, DIM-1)] = current->d[neighborIndex][IX( 1, i, 1)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX(DIM-1, i, DIM-1)] = 0;
}
}
//x+ z- edge
neighborIndex = CK(2,1,0);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX(DIM-1, i, 0)] = current->d[neighborIndex][IX( 1, i, DIM-2)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX(DIM-1, i, 0)] = 0;
}
}
//x- z+ edge
neighborIndex = CK(0,1,2);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX( 0, i, DIM-1)] = current->d[neighborIndex][IX( DIM-2, i, 1)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX( 0, i, DIM-1)] = 0;
}
}
//x- z- edge
neighborIndex = CK(0,1,0);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX( 0, i, 0)] = current->d[neighborIndex][IX( DIM-2, i, DIM-2)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX( 0, i, 0)] = 0;
}
}
//y+ z+ edge
neighborIndex = CK(1,2,2);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX( i, DIM-1, DIM-1)] = current->d[neighborIndex][IX( i, 1, 1)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX( i, DIM-1, DIM-1)] = 0;
}
}
//y+ z- edge
neighborIndex = CK(1,2,0);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX( i,DIM-1, 0)] = current->d[neighborIndex][IX( i, 1, DIM-2)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX( i,DIM-1, 0)] = 0;
}
}
//y- z+ edge
neighborIndex = CK(1,0,2);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX( i, 0, DIM-1)] = current->d[neighborIndex][IX( i, DIM-2, 1)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX( i, 0, DIM-1)] = 0;
}
}
//y- z- edge
neighborIndex = CK(1,0,0);
if(current->d[neighborIndex] != NULL){
for(i = 1; i < DIM-1; i++){
current->d[CENTER_LOC][IX( i, 0, 0)] = current->d[neighborIndex][IX( i, DIM-2, DIM-2)];
}
} else {
for(i = 1; i < DIM; i++){
current->d[CENTER_LOC][IX( i, 0, 0)] = 0;
}
}
//
// CORNERS
//
//x+ y+ z+ corner
neighborIndex = CK(2,2,2);
if(current->d[neighborIndex] != NULL){
current->d[CENTER_LOC][IX(DIM-1, DIM-1, DIM-1)] = current->d[neighborIndex][IX( 1, 1, 1)];
} else {
current->d[CENTER_LOC][IX(DIM-1, DIM-1, DIM-1)] = 0;
}
//x+ y+ z- corner
neighborIndex = CK(2,2,0);
if(current->d[neighborIndex] != NULL){
current->d[CENTER_LOC][IX(DIM-1, DIM-1, 0)] = current->d[neighborIndex][IX( 1, 1, DIM-2)];
} else {
current->d[CENTER_LOC][IX(DIM-1, DIM-1, 0)] = 0;
}
//x+ y- z+ corner
neighborIndex = CK(2,0,2);
if(current->d[neighborIndex] != NULL){
current->d[CENTER_LOC][IX(DIM-1, 0, DIM-1)] = current->d[neighborIndex][IX( 1, DIM-2, 1)];
} else {
current->d[CENTER_LOC][IX(DIM-1, 0, DIM-1)] = 0;
}
//x+ y- z- corner
neighborIndex = CK(2,0,0);
if(current->d[neighborIndex] != NULL){
current->d[CENTER_LOC][IX(DIM-1, 0, 0)] = current->d[neighborIndex][IX( 1, DIM-2, DIM-2)];
} else {
current->d[CENTER_LOC][IX(DIM-1, 0, 0)] = 0;
}
//x- y+ z+ corner
neighborIndex = CK(0,2,2);
if(current->d[neighborIndex] != NULL){
current->d[CENTER_LOC][IX(0, DIM-1, DIM-1)] = current->d[neighborIndex][IX( DIM-2, 1, 1)];
} else {
current->d[CENTER_LOC][IX(0, DIM-1, DIM-1)] = 0;
}
//x- y+ z- corner
neighborIndex = CK(0,2,0);
if(current->d[neighborIndex] != NULL){
current->d[CENTER_LOC][IX(0, DIM-1, 0)] = current->d[neighborIndex][IX( DIM-2, 1, DIM-2)];
} else {
current->d[CENTER_LOC][IX(0, DIM-1, 0)] = 0;
}
//x- y- z+ corner
neighborIndex = CK(0,0,2);
if(current->d[neighborIndex] != NULL){
current->d[CENTER_LOC][IX(0, 0, DIM-1)] = current->d[neighborIndex][IX( DIM-2, DIM-2, 1)];
} else {
current->d[CENTER_LOC][IX(0, 0, DIM-1)] = 0;
}
//x- y- z- corner
neighborIndex = CK(0,0,0);
if(current->d[neighborIndex] != NULL){
current->d[CENTER_LOC][IX(0, 0, 0)] = current->d[neighborIndex][IX( DIM-2, DIM-2, DIM-2)];
} else {
current->d[CENTER_LOC][IX(0, 0, 0)] = 0;
}
}
}

View File

@ -120,6 +120,9 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate
environment->lookupTable.serverFluidChunkTable.v0JId = (*env)->GetFieldID(env,fluidSimStorageClass,"b0VelocityY","[Ljava/nio/ByteBuffer;"); environment->lookupTable.serverFluidChunkTable.v0JId = (*env)->GetFieldID(env,fluidSimStorageClass,"b0VelocityY","[Ljava/nio/ByteBuffer;");
environment->lookupTable.serverFluidChunkTable.w0JId = (*env)->GetFieldID(env,fluidSimStorageClass,"b0VelocityZ","[Ljava/nio/ByteBuffer;"); environment->lookupTable.serverFluidChunkTable.w0JId = (*env)->GetFieldID(env,fluidSimStorageClass,"b0VelocityZ","[Ljava/nio/ByteBuffer;");
environment->lookupTable.serverFluidChunkTable.boundsId = (*env)->GetFieldID(env,fluidSimStorageClass,"bBounds","[Ljava/nio/ByteBuffer;"); environment->lookupTable.serverFluidChunkTable.boundsId = (*env)->GetFieldID(env,fluidSimStorageClass,"bBounds","[Ljava/nio/ByteBuffer;");
environment->lookupTable.serverFluidChunkTable.worldXId = (*env)->GetFieldID(env,fluidSimStorageClass,"worldX","I");
environment->lookupTable.serverFluidChunkTable.worldYId = (*env)->GetFieldID(env,fluidSimStorageClass,"worldY","I");
environment->lookupTable.serverFluidChunkTable.worldZId = (*env)->GetFieldID(env,fluidSimStorageClass,"worldZ","I");
environment->lookupTable.serverFluidChunkTable.neighborsId = (*env)->GetFieldID(env,fluidSimStorageClass,"neighbors","[Lelectrosphere/server/fluid/manager/ServerFluidChunk;"); environment->lookupTable.serverFluidChunkTable.neighborsId = (*env)->GetFieldID(env,fluidSimStorageClass,"neighbors","[Lelectrosphere/server/fluid/manager/ServerFluidChunk;");
environment->lookupTable.serverFluidChunkTable.chunkmaskJId = (*env)->GetFieldID(env,fluidSimStorageClass,"chunkMask","I"); environment->lookupTable.serverFluidChunkTable.chunkmaskJId = (*env)->GetFieldID(env,fluidSimStorageClass,"chunkMask","I");
environment->lookupTable.serverFluidChunkTable.totalDensityId = (*env)->GetFieldID(env,fluidSimStorageClass,"totalDensity","F"); environment->lookupTable.serverFluidChunkTable.totalDensityId = (*env)->GetFieldID(env,fluidSimStorageClass,"totalDensity","F");
@ -153,6 +156,9 @@ int readInChunks(JNIEnv * env, jobject chunkList, Environment * environment){
jfieldID boundsId = environment->lookupTable.serverFluidChunkTable.boundsId; jfieldID boundsId = environment->lookupTable.serverFluidChunkTable.boundsId;
jfieldID chunkmaskJId = environment->lookupTable.serverFluidChunkTable.chunkmaskJId; jfieldID chunkmaskJId = environment->lookupTable.serverFluidChunkTable.chunkmaskJId;
jfieldID asleepId = environment->lookupTable.serverFluidChunkTable.asleepId; jfieldID asleepId = environment->lookupTable.serverFluidChunkTable.asleepId;
jfieldID worldXId = environment->lookupTable.serverFluidChunkTable.worldXId;
jfieldID worldYId = environment->lookupTable.serverFluidChunkTable.worldYId;
jfieldID worldZId = environment->lookupTable.serverFluidChunkTable.worldZId;
//the number of chunks //the number of chunks
numChunks = (*env)->CallIntMethod(env,chunkList,jListSize); numChunks = (*env)->CallIntMethod(env,chunkList,jListSize);
@ -217,6 +223,9 @@ int readInChunks(JNIEnv * env, jobject chunkList, Environment * environment){
bounds = (*env)->GetObjectField(env,chunkJRaw,boundsId); bounds = (*env)->GetObjectField(env,chunkJRaw,boundsId);
newChunk->chunkMask = chunkMask; newChunk->chunkMask = chunkMask;
newChunk->chunkJRaw = chunkJRaw; newChunk->chunkJRaw = chunkJRaw;
newChunk->x = (*env)->GetIntField(env,chunkJRaw,worldXId);
newChunk->y = (*env)->GetIntField(env,chunkJRaw,worldYId);
newChunk->z = (*env)->GetIntField(env,chunkJRaw,worldZId);
for(int j = 0; j < 27; j++){ for(int j = 0; j < 27; j++){
if((chunkMask & CHUNK_INDEX_ARR[j]) > 0){ if((chunkMask & CHUNK_INDEX_ARR[j]) > 0){
newChunk->d[j] = getArray(env,jd,j); newChunk->d[j] = getArray(env,jd,j);

View File

@ -0,0 +1,872 @@
#include "stb/stb_ds.h"
#include "fluid/dispatch/dispatcher.h"
#include "fluid/queue/boundsolver.h"
#include "fluid/queue/chunkmask.h"
#include "fluid/env/environment.h"
#include "fluid/env/utilities.h"
#include "../../util/chunk_test_utils.h"
#include "../../util/test.h"
/**
* Checks if the bounds were set correctly for a given chunk
* @param chunk The chunk
* @param x the world x
* @param y the world y
* @param z the world z
* @param invert Inverts the check (ie for validating data prior to call)
*/
int checkBounds(Chunk * chunk, int x, int y, int z, int invert){
int rVal = 0;
int i, j;
int neighborIndex;
//
//check planes
//
//x+ plane
neighborIndex = CK(2,1,1);
if(x > 1){
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(DIM-1,i,j)],0,"chunk should NOT have (x=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(DIM-1,i,j)],0,"chunk should have (x=2) bound set to 0-- %d %d \n");
}
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x<2\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(DIM-1,i,j)] != chunk->d[neighborIndex][IX(1,i,j)];
} else {
pass = chunk->d[CENTER_LOC][IX(DIM-1,i,j)] == chunk->d[neighborIndex][IX(1,i,j)];
}
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x!=2) bound set to neighbor\n");
}
}
//x- plane
neighborIndex = CK(0,1,1);
if(x < 1){
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(0,i,j)],0,"chunk should NOT have (x=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(0,i,j)],0,"chunk should have (x=0) bound set to 0-- %d %d \n");
}
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x>0\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(0,i,j)] != chunk->d[neighborIndex][IX(DIM-2,i,j)];
} else {
pass = chunk->d[CENTER_LOC][IX(0,i,j)] == chunk->d[neighborIndex][IX(DIM-2,i,j)];
}
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x!=0) bound set to neighbor\n");
}
}
//y+ plane
neighborIndex = CK(1,2,1);
if(y > 1){
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(i,DIM-1,j)],0,"chunk should NOT have (y=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(i,DIM-1,j)],0,"chunk should have (y=2) bound set to 0-- %d %d \n");
}
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly y<2\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(i,DIM-1,j)] != chunk->d[neighborIndex][IX(i,1,j)];
} else {
pass = chunk->d[CENTER_LOC][IX(i,DIM-1,j)] == chunk->d[neighborIndex][IX(i,1,j)];
}
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (y!=2) bound set to neighbor\n");
}
}
//y- plane
neighborIndex = CK(1,0,1);
if(y < 1){
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(i,0,j)],0,"chunk should NOT have (y=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(i,0,j)],0,"chunk should have (y=0) bound set to 0-- %d %d \n");
}
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly y>0\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(i,0,j)] != chunk->d[neighborIndex][IX(i,DIM-2,j)];
} else {
pass = chunk->d[CENTER_LOC][IX(i,0,j)] == chunk->d[neighborIndex][IX(i,DIM-2,j)];
}
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (y!=0) bound set to neighbor\n");
}
}
//z+ plane
neighborIndex = CK(1,1,2);
if(z > 1){
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(i,j,DIM-1)],0,"chunk should NOT have (z=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(i,j,DIM-1)],0,"chunk should have (z=2) bound set to 0-- %d %d \n");
}
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly z<2\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(i,j,DIM-1)] != chunk->d[neighborIndex][IX(i,j,1)];
} else {
pass = chunk->d[CENTER_LOC][IX(i,j,DIM-1)] == chunk->d[neighborIndex][IX(i,j,1)];
}
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (z!=2) bound set to neighbor\n");
}
}
//z- plane
neighborIndex = CK(1,1,0);
if(z < 1){
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(i,j,0)],0,"chunk should NOT have (z=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(i,j,0)],0,"chunk should have (z=0) bound set to 0-- %d %d \n");
}
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly z>0\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
for(j = 1; j < DIM - 1; j++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(i,j,0)] != chunk->d[neighborIndex][IX(i,j,DIM-2)];
} else {
pass = chunk->d[CENTER_LOC][IX(i,j,0)] == chunk->d[neighborIndex][IX(i,j,DIM-2)];
}
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (z!=0) bound set to neighbor\n");
}
}
//
// edges
//
//x+ y+ edge
neighborIndex = CK(2,2,1);
if(x == 2 || y == 2){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(DIM-1,DIM-1,i)],0,"chunk should NOT have (x=2 y=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(DIM-1,DIM-1,i)],0,"chunk should have (x=2 y=2) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x<2 y<2\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(DIM-1,DIM-1,i)] != chunk->d[neighborIndex][IX(1,1,i)];
} else {
pass = chunk->d[CENTER_LOC][IX(DIM-1,DIM-1,i)] == chunk->d[neighborIndex][IX(1,1,i)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=2 y=2) bound set to neighbor\n");
}
}
//x+ y- edge
neighborIndex = CK(2,0,1);
if(x == 2 || y == 0){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(DIM-1,0,i)],0,"chunk should NOT have (x=2 y=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(DIM-1,0,i)],0,"chunk should have (x=2 y=0) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x<2 y>0\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(DIM-1,0,i)] != chunk->d[neighborIndex][IX(1,DIM-2,i)];
} else {
pass = chunk->d[CENTER_LOC][IX(DIM-1,0,i)] == chunk->d[neighborIndex][IX(1,DIM-2,i)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=2 y=0) bound set to neighbor\n");
}
}
//x- y+ edge
neighborIndex = CK(0,2,1);
if(x == 0 || y == 2){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(0,DIM-1,i)],0,"chunk should NOT have (x=0 y=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(0,DIM-1,i)],0,"chunk should have (x=0 y=2) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x>0 y<2\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(0,DIM-1,i)] != chunk->d[neighborIndex][IX(1,1,i)];
} else {
pass = chunk->d[CENTER_LOC][IX(0,DIM-1,i)] == chunk->d[neighborIndex][IX(1,1,i)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=0 y=2) bound set to neighbor\n");
}
}
//x- y- edge
neighborIndex = CK(0,0,1);
if(x == 0 || y == 0){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(0,0,i)],0,"chunk should NOT have (x=0 y=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(0,0,i)],0,"chunk should have (x=0 y=0) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x>0 y>0\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(0,0,i)] != chunk->d[neighborIndex][IX(DIM-2,DIM-2,i)];
} else {
pass = chunk->d[CENTER_LOC][IX(0,0,i)] == chunk->d[neighborIndex][IX(DIM-2,DIM-2,i)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=0 y=0) bound set to neighbor\n");
}
}
//x+ z+ edge
neighborIndex = CK(2,1,2);
if(x == 2 || z == 2){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(DIM-1,i,DIM-1)],0,"chunk should NOT have (x=2 z=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(DIM-1,i,DIM-1)],0,"chunk should have (x=2 z=2) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x<2 z<2\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(DIM-1,i,DIM-1)] != chunk->d[neighborIndex][IX(1,i,1)];
} else {
pass = chunk->d[CENTER_LOC][IX(DIM-1,i,DIM-1)] == chunk->d[neighborIndex][IX(1,i,1)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=2 z=2) bound set to neighbor\n");
}
}
//x+ z- edge
neighborIndex = CK(2,1,0);
if(x == 2 || z == 0){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(DIM-1,i,0)],0,"chunk should NOT have (x=2 z=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(DIM-1,i,0)],0,"chunk should have (x=2 z=0) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x<2 z>0\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(DIM-1,i,0)] != chunk->d[neighborIndex][IX(1,i,DIM-2)];
} else {
pass = chunk->d[CENTER_LOC][IX(DIM-1,i,0)] == chunk->d[neighborIndex][IX(1,i,DIM-2)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=2 z=0) bound set to neighbor\n");
}
}
//x- z+ edge
neighborIndex = CK(0,1,2);
if(x == 0 || z == 2){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(0,i,DIM-1)],0,"chunk should NOT have (x=0 z=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(0,i,DIM-1)],0,"chunk should have (x=0 z=2) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x>0 z<2\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(0,i,DIM-1)] != chunk->d[neighborIndex][IX(1,i,1)];
} else {
pass = chunk->d[CENTER_LOC][IX(0,i,DIM-1)] == chunk->d[neighborIndex][IX(1,i,1)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=0 z=2) bound set to neighbor\n");
}
}
//x- z- edge
neighborIndex = CK(0,1,0);
if(x == 0 || z == 0){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(0,i,0)],0,"chunk should NOT have (x=0 z=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(0,i,0)],0,"chunk should have (x=0 z=0) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x>0 z>0\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(0,i,0)] != chunk->d[neighborIndex][IX(DIM-2,i,DIM-2)];
} else {
pass = chunk->d[CENTER_LOC][IX(0,i,0)] == chunk->d[neighborIndex][IX(DIM-2,i,DIM-2)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=0 z=0) bound set to neighbor\n");
}
}
//y+ z+ edge
neighborIndex = CK(1,2,2);
if(y == 2 || z == 2){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(i,DIM-1,DIM-1)],0,"chunk should NOT have (y=2 z=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(i,DIM-1,DIM-1)],0,"chunk should have (y=2 z=2) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly y<2 z<2\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(i,DIM-1,DIM-1)] != chunk->d[neighborIndex][IX(i,1,1)];
} else {
pass = chunk->d[CENTER_LOC][IX(i,DIM-1,DIM-1)] == chunk->d[neighborIndex][IX(i,1,1)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (y=2 z=2) bound set to neighbor\n");
}
}
//y+ z- edge
neighborIndex = CK(1,2,0);
if(y == 2 || z == 0){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(i,DIM-1,0)],0,"chunk should NOT have (y=2 z=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(i,DIM-1,0)],0,"chunk should have (y=2 z=0) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly y<2 z>0\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(i,DIM-1,0)] != chunk->d[neighborIndex][IX(i,1,DIM-2)];
} else {
pass = chunk->d[CENTER_LOC][IX(i,DIM-1,0)] == chunk->d[neighborIndex][IX(i,1,DIM-2)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (y=2 z=0) bound set to neighbor\n");
}
}
//y- z+ edge
neighborIndex = CK(1,0,2);
if(y == 0 || z == 2){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(i,0,DIM-1)],0,"chunk should NOT have (y=0 z=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(i,0,DIM-1)],0,"chunk should have (y=0 z=2) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly y>0 z<2\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(i,0,DIM-1)] != chunk->d[neighborIndex][IX(i,1,1)];
} else {
pass = chunk->d[CENTER_LOC][IX(i,0,DIM-1)] == chunk->d[neighborIndex][IX(i,1,1)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (y=0 z=2) bound set to neighbor\n");
}
}
//y- z- edge
neighborIndex = CK(1,0,0);
if(y == 0 || z == 0){
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX(i,0,0)],0,"chunk should NOT have (y=0 z=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX(i,0,0)],0,"chunk should have (y=0 z=0) bound set to 0-- %d %d \n");
}
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly y>0 z>0\n");
}
int pass = 0;
for(i = 1; i < DIM - 1; i++){
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX(i,0,0)] != chunk->d[neighborIndex][IX(i,DIM-2,DIM-2)];
} else {
pass = chunk->d[CENTER_LOC][IX(i,0,0)] == chunk->d[neighborIndex][IX(i,DIM-2,DIM-2)];
}
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (y=0 z=0) bound set to neighbor\n");
}
}
//
// CORNERS
//
//x+ y+ z+
neighborIndex = CK(2,2,2);
if(x == 2 || y == 2 || z == 2){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX( DIM-1, DIM-1, DIM-1 )],0,"chunk should NOT have (x=2 y=2 z=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX( DIM-1, DIM-1, DIM-1 )],0,"chunk should have (x=2 y=2 z=2) bound set to 0-- %d %d \n");
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x<2 y<2 z<2\n");
}
int pass = 0;
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX( DIM-1, DIM-1, DIM-1 )] != chunk->d[neighborIndex][IX( 1, 1, 1)];
} else {
pass = chunk->d[CENTER_LOC][IX( DIM-1, DIM-1, DIM-1 )] == chunk->d[neighborIndex][IX( 1, 1, 1)];
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=2 y=2 z=2) bound set to neighbor\n");
}
}
//x+ y+ z-
neighborIndex = CK(2,2,0);
if(x == 2 || y == 2 || z == 0){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX( DIM-1, DIM-1, 0 )],0,"chunk should NOT have (x=2 y=2 z=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX( DIM-1, DIM-1, 0 )],0,"chunk should have (x=2 y=2 z=0) bound set to 0-- %d %d \n");
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x<2 y<2 z>0\n");
}
int pass = 0;
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX( DIM-1, DIM-1, 0 )] != chunk->d[neighborIndex][IX( 1, 1, DIM-2)];
} else {
pass = chunk->d[CENTER_LOC][IX( DIM-1, DIM-1, 0 )] == chunk->d[neighborIndex][IX( 1, 1, DIM-2)];
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=2 y=2 z=0) bound set to neighbor\n");
}
}
//x+ y- z+
neighborIndex = CK(2,0,2);
if(x == 2 || y == 0 || z == 2){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX( DIM-1, 0, DIM-1 )],0,"chunk should NOT have (x=2 y=0 z=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX( DIM-1, 0, DIM-1 )],0,"chunk should have (x=2 y=0 z=2) bound set to 0-- %d %d \n");
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x<2 y>0 z<2\n");
}
int pass = 0;
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX( DIM-1, 0, DIM-1 )] != chunk->d[neighborIndex][IX( 1, 1, 1)];
} else {
pass = chunk->d[CENTER_LOC][IX( DIM-1, 0, DIM-1 )] == chunk->d[neighborIndex][IX( 1, 1, 1)];
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=2 y=0 z=2) bound set to neighbor\n");
}
}
//x+ y- z-
neighborIndex = CK(2,0,0);
if(x == 2 || y == 0 || z == 0){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX( DIM-1, 0, 0 )],0,"chunk should NOT have (x=2 y=0 z=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX( DIM-1, 0, 0 )],0,"chunk should have (x=2 y=0 z=0) bound set to 0-- %d %d \n");
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x<2 y>0 z>0\n");
}
int pass = 0;
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX( DIM-1, 0, 0 )] != chunk->d[neighborIndex][IX( 1, DIM-2, DIM-2)];
} else {
pass = chunk->d[CENTER_LOC][IX( DIM-1, 0, 0 )] == chunk->d[neighborIndex][IX( 1, DIM-2, DIM-2)];
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=2 y=0 z=0) bound set to neighbor\n");
}
}
//x- y+ z+
neighborIndex = CK(0,2,2);
if(x == 0 || y == 2 || z == 2){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX( 0, DIM-1, DIM-1 )],0,"chunk should NOT have (x=0 y=2 z=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX( 0, DIM-1, DIM-1 )],0,"chunk should have (x=0 y=2 z=2) bound set to 0-- %d %d \n");
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x>0 y<2 z<2\n");
}
int pass = 0;
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX( 0, DIM-1, DIM-1 )] != chunk->d[neighborIndex][IX( DIM-2, 1, 1)];
} else {
pass = chunk->d[CENTER_LOC][IX( 0, DIM-1, DIM-1 )] == chunk->d[neighborIndex][IX( DIM-2, 1, 1)];
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=0 y=2 z=2) bound set to neighbor\n");
}
}
//x- y+ z-
neighborIndex = CK(0,2,0);
if(x == 0 || y == 2 || z == 0){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX( 0, DIM-1, 0 )],0,"chunk should NOT have (x=0 y=2 z=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX( 0, DIM-1, 0 )],0,"chunk should have (x=0 y=2 z=0) bound set to 0-- %d %d \n");
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x>0 y<2 z>0\n");
}
int pass = 0;
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX( 0, DIM-1, 0 )] != chunk->d[neighborIndex][IX( DIM-2, 1, DIM-2)];
} else {
pass = chunk->d[CENTER_LOC][IX( 0, DIM-1, 0 )] == chunk->d[neighborIndex][IX( DIM-2, 1, DIM-2)];
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=0 y=2 z=0) bound set to neighbor\n");
}
}
//x- y- z+
neighborIndex = CK(0,0,2);
if(x == 0 || y == 0 || z == 2){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX( 0, 0, DIM-1 )],0,"chunk should NOT have (x=0 y=0 z=2) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX( 0, 0, DIM-1 )],0,"chunk should have (x=0 y=0 z=2) bound set to 0-- %d %d \n");
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x>0 y>0 z<2\n");
}
int pass = 0;
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX( 0, 0, DIM-1 )] != chunk->d[neighborIndex][IX( DIM-2, 1, 1)];
} else {
pass = chunk->d[CENTER_LOC][IX( 0, 0, DIM-1 )] == chunk->d[neighborIndex][IX( DIM-2, 1, 1)];
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=0 y=0 z=2) bound set to neighbor\n");
}
}
//x- y- z-
neighborIndex = CK(0,0,0);
if(x == 0 || y == 0 || z == 0){
if(invert == 1){
rVal += assertNotEquals(chunk->d[CENTER_LOC][IX( 0, 0, 0 )],0,"chunk should NOT have (x=0 y=0 z=0) bound set to 0 -- %d %d \n");
} else {
rVal += assertEquals(chunk->d[CENTER_LOC][IX( 0, 0, 0 )],0,"chunk should have (x=0 y=0 z=0) bound set to 0-- %d %d \n");
}
} else {
if(chunk->d[neighborIndex] == NULL){
rVal += assertEquals(0,1,"Failed to assign neighbors properly x>0 y>0 z>0\n");
}
int pass = 0;
if(invert == 1){
pass = chunk->d[CENTER_LOC][IX( 0, 0, 0 )] != chunk->d[neighborIndex][IX( DIM-2, DIM-2, DIM-2)];
} else {
pass = chunk->d[CENTER_LOC][IX( 0, 0, 0 )] == chunk->d[neighborIndex][IX( DIM-2, DIM-2, DIM-2)];
}
if(!pass){
rVal += assertEquals(0,1,"chunk should have (x=0 y=0 z=0) bound set to neighbor\n");
}
}
return rVal;
}
int kernelx[27] = {
0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2,
};
int kernely[27] = {
0, 0, 0, 1, 1, 1, 2, 2, 2,
0, 0, 0, 1, 1, 1, 2, 2, 2,
0, 0, 0, 1, 1, 1, 2, 2, 2,
};
int kernelz[27] = {
0, 1, 2, 0, 1, 2, 0, 1, 2,
0, 1, 2, 0, 1, 2, 0, 1, 2,
0, 1, 2, 0, 1, 2, 0, 1, 2,
};
int fluid_queue_boundsolver_tests(){
int rVal = 0;
Environment * env = fluid_environment_create();
int chunkCount = 27;
Chunk ** queue = NULL;
for(int i = 0; i < chunkCount; i++){
arrput(queue,chunk_create(kernelx[i],kernely[i],kernelz[i]));
}
//link neighbors
chunk_link_neighbors(queue);
//fill them with values
for(int i = 0; i < chunkCount; i++){
chunk_fill(queue[i],i+1);
}
//make sure the data is setup correctly before the call
for(int i = 0; i < chunkCount; i++){
rVal += checkBounds(queue[i],kernelx[i],kernely[i],kernelz[i],1);
}
//call bounds setter
fluid_solve_bounds(chunkCount,queue,env);
//check that the 0 values are 0'd
for(int i = 0; i < chunkCount; i++){
rVal += checkBounds(queue[i],kernelx[i],kernely[i],kernelz[i],0);
}
//cleanup test
chunk_free_queue(queue);
return rVal;
}

View File

@ -3,12 +3,24 @@
#include "stb/stb_ds.h" #include "stb/stb_ds.h"
#include "fluid/queue/chunk.h" #include "fluid/queue/chunk.h"
#include "fluid/queue/chunkmask.h" #include "fluid/queue/chunkmask.h"
#include "fluid/env/utilities.h"
/** /**
* Creates a chunk at a world position * Creates a chunk at a world position
*/ */
Chunk * chunk_create(int x, int y, int z){ Chunk * chunk_create(int x, int y, int z){
Chunk * chunk1 = (Chunk *)malloc(sizeof(Chunk)); Chunk * chunk1 = (Chunk *)malloc(sizeof(Chunk));
for(int i = 0; i < 27; i++){
chunk1->d[i] = NULL;
chunk1->d0[i] = NULL;
chunk1->u[i] = NULL;
chunk1->v[i] = NULL;
chunk1->w[i] = NULL;
chunk1->u0[i] = NULL;
chunk1->v0[i] = NULL;
chunk1->w0[i] = NULL;
chunk1->bounds[i] = NULL;
}
chunk1->d[CENTER_LOC] = (float *)malloc(DIM * DIM * DIM * sizeof(float)); chunk1->d[CENTER_LOC] = (float *)malloc(DIM * DIM * DIM * sizeof(float));
chunk1->d0[CENTER_LOC] = (float *)malloc(DIM * DIM * DIM * sizeof(float)); chunk1->d0[CENTER_LOC] = (float *)malloc(DIM * DIM * DIM * sizeof(float));
chunk1->u[CENTER_LOC] = (float *)malloc(DIM * DIM * DIM * sizeof(float)); chunk1->u[CENTER_LOC] = (float *)malloc(DIM * DIM * DIM * sizeof(float));
@ -36,6 +48,7 @@ void chunk_free(Chunk * chunk){
free(chunk->u0[CENTER_LOC]); free(chunk->u0[CENTER_LOC]);
free(chunk->v0[CENTER_LOC]); free(chunk->v0[CENTER_LOC]);
free(chunk->w0[CENTER_LOC]); free(chunk->w0[CENTER_LOC]);
free(chunk->bounds[CENTER_LOC]);
free(chunk); free(chunk);
} }
@ -52,6 +65,155 @@ Chunk ** chunk_create_queue(int size){
return rVal; return rVal;
} }
/**
* Frees a chunk queue
*/
void chunk_free_queue(Chunk ** chunks){
int num = arrlen(chunks);
for(int i = 0; i < num; i++){
chunk_free(chunks[i]);
}
arrfree(chunks);
}
/**
* Fills a chunk with a value
* @param chunk The chunk to fill
* @param val The value to fill
*/
void chunk_fill(Chunk * chunk, int val){
for(int i = 0; i < DIM*DIM*DIM; i++){
chunk->d[CENTER_LOC][i] = val;
chunk->d0[CENTER_LOC][i] = val;
chunk->u[CENTER_LOC][i] = val;
chunk->v[CENTER_LOC][i] = val;
chunk->w[CENTER_LOC][i] = val;
chunk->u0[CENTER_LOC][i] = val;
chunk->v0[CENTER_LOC][i] = val;
chunk->w0[CENTER_LOC][i] = val;
chunk->bounds[CENTER_LOC][i] = val;
}
}
/**
* Used in chunk_link_neighbors
*/
void chunk_link_by_index(Chunk * chunk1, Chunk * chunk2, int x, int y, int z){
chunk1->d[CK(x,y,z)] = chunk2->d[CENTER_LOC];
chunk1->d0[CK(x,y,z)] = chunk2->d0[CENTER_LOC];
chunk1->u[CK(x,y,z)] = chunk2->u[CENTER_LOC];
chunk1->v[CK(x,y,z)] = chunk2->v[CENTER_LOC];
chunk1->w[CK(x,y,z)] = chunk2->w[CENTER_LOC];
chunk1->u0[CK(x,y,z)] = chunk2->u0[CENTER_LOC];
chunk1->v0[CK(x,y,z)] = chunk2->v0[CENTER_LOC];
chunk1->w0[CK(x,y,z)] = chunk2->w0[CENTER_LOC];
chunk1->bounds[CK(x,y,z)] = chunk2->bounds[CENTER_LOC];
}
/**
* Links all neighbors in a chunk queue
*/
void chunk_link_neighbors(Chunk ** chunks){
int num = arrlen(chunks);
for(int i = 0; i < num; i++){
for(int j = 0; j < num; j++){
if(i == j){
continue;
}
Chunk * chunk1 = chunks[i];
Chunk * chunk2 = chunks[j];
//one coord
if(chunk1->x - 1 == chunk2->x && chunk1->y == chunk2->y && chunk1->z == chunk2->z){
chunk_link_by_index(chunk1,chunk2,0,1,1);
}
if(chunk1->x == chunk2->x && chunk1->y - 1 == chunk2->y && chunk1->z == chunk2->z){
chunk_link_by_index(chunk1,chunk2,1,0,1);
}
if(chunk1->x == chunk2->x && chunk1->y == chunk2->y && chunk1->z - 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,1,1,0);
}
if(chunk1->x + 1 == chunk2->x && chunk1->y == chunk2->y && chunk1->z == chunk2->z){
chunk_link_by_index(chunk1,chunk2,2,1,1);
}
if(chunk1->x == chunk2->x && chunk1->y + 1 == chunk2->y && chunk1->z == chunk2->z){
chunk_link_by_index(chunk1,chunk2,1,2,1);
}
if(chunk1->x == chunk2->x && chunk1->y == chunk2->y && chunk1->z + 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,1,1,2);
}
//two coords
if(chunk1->x - 1 == chunk2->x && chunk1->y - 1 == chunk2->y && chunk1->z == chunk2->z){
chunk_link_by_index(chunk1,chunk2,0,0,1);
}
if(chunk1->x - 1 == chunk2->x && chunk1->y + 1 == chunk2->y && chunk1->z == chunk2->z){
chunk_link_by_index(chunk1,chunk2,0,2,1);
}
if(chunk1->x + 1 == chunk2->x && chunk1->y - 1 == chunk2->y && chunk1->z == chunk2->z){
chunk_link_by_index(chunk1,chunk2,2,0,1);
}
if(chunk1->x + 1 == chunk2->x && chunk1->y + 1 == chunk2->y && chunk1->z == chunk2->z){
chunk_link_by_index(chunk1,chunk2,2,2,1);
}
if(chunk1->x - 1 == chunk2->x && chunk1->y == chunk2->y && chunk1->z - 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,0,1,0);
}
if(chunk1->x - 1 == chunk2->x && chunk1->y == chunk2->y && chunk1->z + 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,0,1,2);
}
if(chunk1->x + 1 == chunk2->x && chunk1->y == chunk2->y && chunk1->z - 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,2,1,0);
}
if(chunk1->x + 1 == chunk2->x && chunk1->y == chunk2->y && chunk1->z + 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,2,1,2);
}
if(chunk1->x == chunk2->x && chunk1->y - 1 == chunk2->y && chunk1->z - 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,1,0,0);
}
if(chunk1->x == chunk2->x && chunk1->y - 1 == chunk2->y && chunk1->z + 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,1,0,2);
}
if(chunk1->x == chunk2->x && chunk1->y + 1 == chunk2->y && chunk1->z - 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,1,2,0);
}
if(chunk1->x == chunk2->x && chunk1->y + 1 == chunk2->y && chunk1->z + 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,1,2,2);
}
//three coords
if(chunk1->x - 1 == chunk2->x && chunk1->y - 1 == chunk2->y && chunk1->z - 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,0,0,0);
}
if(chunk1->x - 1 == chunk2->x && chunk1->y - 1 == chunk2->y && chunk1->z + 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,0,0,2);
}
if(chunk1->x - 1 == chunk2->x && chunk1->y + 1 == chunk2->y && chunk1->z - 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,0,2,0);
}
if(chunk1->x - 1 == chunk2->x && chunk1->y + 1 == chunk2->y && chunk1->z + 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,0,2,2);
}
if(chunk1->x + 1 == chunk2->x && chunk1->y - 1 == chunk2->y && chunk1->z - 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,2,0,0);
}
if(chunk1->x + 1 == chunk2->x && chunk1->y - 1 == chunk2->y && chunk1->z + 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,2,0,2);
}
if(chunk1->x + 1 == chunk2->x && chunk1->y + 1 == chunk2->y && chunk1->z - 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,2,2,0);
}
if(chunk1->x + 1 == chunk2->x && chunk1->y + 1 == chunk2->y && chunk1->z + 1 == chunk2->z){
chunk_link_by_index(chunk1,chunk2,2,2,2);
}
}
}
}
/** /**
* Empty test launcher * Empty test launcher
*/ */

View File

@ -71,4 +71,21 @@ void chunk_set_val(Chunk * chunk, int i, int arr);
*/ */
Chunk ** chunk_create_queue(int size); Chunk ** chunk_create_queue(int size);
/**
* Fills a chunk with a value
* @param chunk The chunk to fill
* @param val The value to fill
*/
void chunk_fill(Chunk * chunk, int val);
/**
* Frees a chunk queue
*/
void chunk_free_queue(Chunk ** chunks);
/**
* Links all neighbors in a chunk queue
*/
void chunk_link_neighbors(Chunk ** chunks);
#endif #endif