diff --git a/.vscode/settings.json b/.vscode/settings.json index b9cbf89..5d1101b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,6 +14,7 @@ "threadpool.h": "c", "electrosphere_fluidsim.h": "c", "type_traits": "c", - "mainfunctions.h": "c" + "mainfunctions.h": "c", + "chunk.h": "c" } } \ No newline at end of file diff --git a/src/main/c/chunkmask.c b/src/main/c/chunkmask.c index 5e38a17..a588b00 100644 --- a/src/main/c/chunkmask.c +++ b/src/main/c/chunkmask.c @@ -3,46 +3,6 @@ #include "includes/utilities.h" #include "includes/chunkmask.h" -uint32_t matrix_transform(JNIEnv * env, jobjectArray jrx); - -/** - * Calculates the bitmask for available chunks for the provided chunk's neighbor array -*/ -int calculateChunkMask(JNIEnv * env, jobjectArray jrx){ - return matrix_transform(env,jrx); -} - -/** - * Calculates a mask that represents all nearby chunks that are actually accessible and exist -*/ -uint32_t matrix_transform(JNIEnv * env, jobjectArray jrx){ - - //The returned value, an availability mask that contains the availability of each neighbor chunk - uint32_t rVal = 0; - - //Add to maks for initial chunks - for(int i = 0; i < CENTER_LOC; i++){ - if((*env)->GetObjectArrayElement(env,jrx,i)!=NULL){ - rVal = rVal + 1; - } - rVal = rVal << 1; - } - //add 1 for center chunk because we already have that - rVal = rVal + 1; - rVal = rVal << 1; - //continue on for remaining chunks - for(int i = CENTER_LOC+1; i < 27; i++){ - if((*env)->GetObjectArrayElement(env,jrx,i)!=NULL){ - rVal = rVal + 1; - } - if(i < 26){ - rVal = rVal << 1; - } - } - - return rVal; -} - const uint32_t CHUNK_INDEX_ARR[] = { CHUNK_000, CHUNK_100, CHUNK_200, CHUNK_010, CHUNK_110, CHUNK_210, diff --git a/src/main/c/compile.sh b/src/main/c/compile.sh index b0337a5..dd40d53 100644 --- a/src/main/c/compile.sh +++ b/src/main/c/compile.sh @@ -51,10 +51,10 @@ rm -f ./*.dll # OUTPUT_FILE="./velocitystep.o" # gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE -# COMPILE_FLAGS="-c -fPIC -m64 -mavx -mavx2 -march=native -Ofast -msse -msse2 -msse3 -mmmx -m3dnow" -# INPUT_FILES="./chunkmask.c" -# OUTPUT_FILE="./chunkmask.o" -# gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE +COMPILE_FLAGS="-c -fPIC -m64 -mavx -mavx2 -march=native -Ofast -msse -msse2 -msse3 -mmmx -m3dnow" +INPUT_FILES="./javainterface.c" +OUTPUT_FILE="./javainterface.o" +gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE COMPILE_FLAGS="-c -fPIC -m64 -mavx -mavx2 -march=native -Ofast -msse -msse2 -msse3 -mmmx -m3dnow" INPUT_FILES="./fluidsim.c" @@ -66,7 +66,7 @@ gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OU #compile shared object file OUTPUT_FILE="libfluidsim$LIB_ENDING" COMPILE_FLAGS="-shared" -INPUT_FILES="fluidsim.o" +INPUT_FILES="fluidsim.o javainterface.o" gcc $COMPILE_FLAGS $INPUT_FILES -o $OUTPUT_FILE #move to resources diff --git a/src/main/c/fluidsim.c b/src/main/c/fluidsim.c index a91efe4..ae84c19 100644 --- a/src/main/c/fluidsim.c +++ b/src/main/c/fluidsim.c @@ -4,14 +4,12 @@ #include "includes/chunkmask.h" #include "includes/electrosphere_FluidSim.h" #include "includes/mainFunctions.h" +#include "includes/chunk.h" #include "./chunkmask.c" #include "./velocitystep.c" #include "./densitystep.c" -//include stb ds -#define STB_DS_IMPLEMENTATION -#include "./lib/stb/stb_ds.h" #define DIM 18 #define LINEARSOLVERTIMES 20 @@ -23,126 +21,20 @@ char fileNameBuff[50]; -/** - * A chunk -*/ -typedef struct { - float * d[27]; - float * d0[27]; - float * u[27]; - float * v[27]; - float * w[27]; - float * u0[27]; - float * v0[27]; - float * w0[27]; - int chunkMask; -} Chunk; - //all chunks Chunk ** chunks = NULL; -#define getChunk(i) (*env)->CallObjectMethod(env,chunkList,jListGet,i) -#define getBuffArr(buffId) (*env)->GetObjectField(env,chunkJRaw,buffId) -#define setBuffArr(buffId,value) (*env)->SetObjectField(env,chunkJRaw,buffId,value) - //jni help: //https://stackoverflow.com/questions/39823375/clarification-about-getfieldid void saveStep(float * values, const char * name); -JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( - JNIEnv * env, - jclass class, - jobject chunkList, +void simulate( + int numChunks, + Chunk ** passedInChunks, jfloat timestep ){ - jclass listClass = (*env)->FindClass(env,"java/util/List"); - jclass fluidSimClass = (*env)->FindClass(env,"electrosphere/FluidSim"); - //JNIEnv *env, jclass clazz, const char *name, const char *sig - jmethodID jListSize = (*env)->GetMethodID(env, listClass, "size", "()I"); - jmethodID jListGet = (*env)->GetMethodID(env, listClass, "get", "(I)Ljava/lang/Object;"); - jmethodID jListAdd = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z"); - - //ByteBuffer[] - jfieldID dJId = (*env)->GetFieldID(env,fluidSimClass,"density","[Ljava/nio/ByteBuffer;"); - jfieldID d0JId = (*env)->GetFieldID(env,fluidSimClass,"densityAddition","[Ljava/nio/ByteBuffer;"); - jfieldID uJId = (*env)->GetFieldID(env,fluidSimClass,"uVector","[Ljava/nio/ByteBuffer;"); - jfieldID vJId = (*env)->GetFieldID(env,fluidSimClass,"vVector","[Ljava/nio/ByteBuffer;"); - jfieldID wJId = (*env)->GetFieldID(env,fluidSimClass,"wVector","[Ljava/nio/ByteBuffer;"); - jfieldID u0JId = (*env)->GetFieldID(env,fluidSimClass,"uAdditionVector","[Ljava/nio/ByteBuffer;"); - jfieldID v0JId = (*env)->GetFieldID(env,fluidSimClass,"vAdditionVector","[Ljava/nio/ByteBuffer;"); - jfieldID w0JId = (*env)->GetFieldID(env,fluidSimClass,"wAdditionVector","[Ljava/nio/ByteBuffer;"); - jfieldID chunkmaskJId = (*env)->GetFieldID(env,fluidSimClass,"chunkMask","I"); - - //the number of chunks - int numChunks = (*env)->CallIntMethod(env,chunkList,jListSize); - - //current chunk (this) - jobject chunkJRaw; - //current chunk fields - jobjectArray jd; - jobjectArray jd0; - jobjectArray u; - jobjectArray v; - jobjectArray w; - jobjectArray u0; - jobjectArray v0; - jobjectArray w0; - int chunkMask; - - //solve chunk mask - for(int i = 0; i < numChunks; i++){ - chunkJRaw = getChunk(i); - chunkMask = Java_electrosphere_FluidSim_calculateChunkMask(env,chunkJRaw,getBuffArr(dJId)); - (*env)->SetIntField(env,chunkJRaw,chunkmaskJId,chunkMask); - - Chunk * newChunk; - if(i >= stbds_arrlen(chunks)){ - // printf("allocate chunk %d\n",i); - // fflush(stdout); - newChunk = (Chunk *)malloc(sizeof(Chunk)); - // printf("new chunk %p\n",newChunk); - // fflush(stdout); - stbds_arrput(chunks,newChunk); - // printf("new chunk %p\n",chunks[i]); - // fflush(stdout); - } else { - newChunk = chunks[i]; - // printf("get chunk %d: %p\n",i,newChunk); - // fflush(stdout); - } - jd = (*env)->GetObjectField(env,chunkJRaw,dJId); - jd0 = (*env)->GetObjectField(env,chunkJRaw,d0JId); - u = (*env)->GetObjectField(env,chunkJRaw,uJId); - v = (*env)->GetObjectField(env,chunkJRaw,vJId); - w = (*env)->GetObjectField(env,chunkJRaw,wJId); - u0 = (*env)->GetObjectField(env,chunkJRaw,u0JId); - v0 = (*env)->GetObjectField(env,chunkJRaw,v0JId); - w0 = (*env)->GetObjectField(env,chunkJRaw,w0JId); - newChunk->chunkMask = chunkMask; - for(int j = 0; j < 27; j++){ - if((chunkMask & CHUNK_INDEX_ARR[j]) > 0){ - newChunk->d[j] = GET_ARR(env,jd,j); - newChunk->d0[j] = GET_ARR(env,jd0,j); - newChunk->u[j] = GET_ARR(env,u,j); - newChunk->v[j] = GET_ARR(env,v,j); - newChunk->w[j] = GET_ARR(env,w,j); - newChunk->u0[j] = GET_ARR(env,u0,j); - newChunk->v0[j] = GET_ARR(env,v0,j); - newChunk->w0[j] = GET_ARR(env,w0,j); - } - } - // for(int j = 0; j < 27; j++){ - // newChunk.d[j] = GET_ARR(env,d,j); - // } - // chunks[i].d0 = getBuffArr(d0JId); - // chunks[i].u = getBuffArr(uJId); - // chunks[i].v = getBuffArr(vJId); - // chunks[i].w = getBuffArr(wJId); - // chunks[i].u0 = getBuffArr(u0JId); - // chunks[i].v0 = getBuffArr(v0JId); - // chunks[i].w0 = getBuffArr(w0JId); - } + chunks = passedInChunks; // printf("%p\n",chunks[0].d); saveStep(chunks[0]->u[CENTER_LOC], "./chunks/beginU"); @@ -155,10 +47,9 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //solve chunk mask for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; addSourceToVectors( DIM, - chunkMask, + currentChunk->chunkMask, currentChunk->u, currentChunk->v, currentChunk->w, @@ -181,7 +72,6 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //swap vector fields for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; float * tmpArr; for(int j = 0; j < 27; j++){ @@ -203,13 +93,12 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //copy neighbors for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w0); } } saveStep(chunks[0]->u[CENTER_LOC], "./chunks/swapU"); @@ -228,8 +117,7 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //solve vector diffusion for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - solveVectorDiffuse(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); + solveVectorDiffuse(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); } if(SAVE_STEPS){ sprintf(fileNameBuff, "./chunks/diffuseUStep%dx", l); @@ -248,19 +136,18 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //update array for vectors for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); - setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w); // setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); // setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); // setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w0); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->u); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->v); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->w); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->v0); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->w0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->u); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->v); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->w); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->v0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->w0); } if(SAVE_STEPS){ sprintf(fileNameBuff, "./chunks/diffuseUStep%dxBnd", l); @@ -289,23 +176,21 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //update array for vectors for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; // setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); // setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); // setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); // setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); // setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0); } //setup projection for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setupProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); + setupProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); } saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/setupProj1Div"); @@ -314,11 +199,10 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //update array for vectors for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->u0); - setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->v0); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->v0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->u0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->v0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->v0); } saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/setupProj1DivBnd"); @@ -332,8 +216,7 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( for(int l = 0; l < LINEARSOLVERTIMES; l++){ for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - solveProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); + solveProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); } if(SAVE_STEPS){ sprintf(fileNameBuff, "./chunks/proj1Step%dx", l); @@ -343,9 +226,8 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( } for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->u0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->u0); } if(SAVE_STEPS){ sprintf(fileNameBuff, "./chunks/proj1Step%dxBnd", l); @@ -359,8 +241,7 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //Finalize projection for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - finalizeProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); + finalizeProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); } saveStep(chunks[0]->u[CENTER_LOC], "./chunks/finalizeProj1U"); @@ -371,19 +252,18 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //... for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); - setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); - setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w0); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w0); } } saveStep(chunks[0]->u[CENTER_LOC], "./chunks/projU"); @@ -398,7 +278,6 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //swap vector fields for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; float * tmpArr; for(int j = 0; j < 27; j++){ @@ -420,13 +299,12 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //copy neighbors for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w0); } } saveStep(chunks[0]->u[CENTER_LOC], "./chunks/swap2U"); @@ -440,36 +318,33 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //update border arrs for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); - setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); - setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w0); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w0); } //advect for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - advectVectors(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); + advectVectors(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); } //update neighbor arr for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); - setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w); } } saveStep(chunks[0]->u[CENTER_LOC], "./chunks/advectU"); @@ -483,32 +358,29 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //update array for vectors for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); - setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0); } //setup projection for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setupProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); + setupProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); } //update array for vectors for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0); } //samples u0, v0 //sets u0 @@ -518,14 +390,12 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( for(int l = 0; l < LINEARSOLVERTIMES; l++){ for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - solveProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); + solveProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); } for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->u0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->u0); } } //samples u,v,w,u0 @@ -533,26 +403,24 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //Finalize projection for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - finalizeProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); + finalizeProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); } //set boundaries a final time for u,v,w //... for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); - setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); - setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); - setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); - setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w0); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); - copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); - copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); - copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v0); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w0); } } @@ -572,8 +440,7 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( { for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - addDensity(DIM,chunkMask,currentChunk->d,currentChunk->d0,timestep); + addDensity(DIM,currentChunk->chunkMask,currentChunk->d,currentChunk->d0,timestep); } } //swap all density arrays @@ -591,9 +458,8 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( } for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->d); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->d0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->d); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->d0); } } //diffuse density @@ -601,13 +467,11 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( for(int l = 0; l < LINEARSOLVERTIMES; l++){ for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - solveDiffuseDensity(DIM,chunkMask,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); + solveDiffuseDensity(DIM,currentChunk->chunkMask,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); } for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->d); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->d); } } } @@ -625,25 +489,22 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( } for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->d); - copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->d0); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->d); + copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->d0); } } //advect density { for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - advectDensity(chunkMask,DIM,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,timestep); + advectDensity(currentChunk->chunkMask,DIM,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,timestep); } } //mirror densities { for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; - chunkMask = currentChunk->chunkMask; - setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->d); + setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->d); } } } diff --git a/src/main/c/includes/chunk.h b/src/main/c/includes/chunk.h new file mode 100644 index 0000000..586f37e --- /dev/null +++ b/src/main/c/includes/chunk.h @@ -0,0 +1,19 @@ +#ifndef CHUNK_H +#define CHUNK_H + +/** + * A chunk +*/ +typedef struct { + float * d[27]; + float * d0[27]; + float * u[27]; + float * v[27]; + float * w[27]; + float * u0[27]; + float * v0[27]; + float * w0[27]; + int chunkMask; +} Chunk; + +#endif \ No newline at end of file diff --git a/src/main/c/includes/mainFunctions.h b/src/main/c/includes/mainFunctions.h index 32e5bab..13d4354 100644 --- a/src/main/c/includes/mainFunctions.h +++ b/src/main/c/includes/mainFunctions.h @@ -3,13 +3,9 @@ #include -/* - * Class: electrosphere_FluidSim - * Method: calculateChunkMask - * Signature: ([Ljava/nio/ByteBuffer;)I - */ -JNIEXPORT jint JNICALL Java_electrosphere_FluidSim_calculateChunkMask - (JNIEnv *, jobject, jobjectArray); +#include "./chunk.h" + +void simulate(int numChunks, Chunk ** passedInChunks, jfloat timestep); /* * Class: electrosphere_FluidSim diff --git a/src/main/c/javainterface.c b/src/main/c/javainterface.c new file mode 100644 index 0000000..cd68b07 --- /dev/null +++ b/src/main/c/javainterface.c @@ -0,0 +1,169 @@ +#include + +//library includes +//include stb ds +#define STB_DS_IMPLEMENTATION +#include "./lib/stb/stb_ds.h" + +//local includes +#include "./includes/chunk.h" +#include "./includes/chunkmask.h" +#include "./includes/mainFunctions.h" +#include "./includes/utilities.h" + + +//defines + + +//function defines +#define getChunk(i) (*env)->CallObjectMethod(env,chunkList,jListGet,i) +#define getBuffArr(buffId) (*env)->GetObjectField(env,chunkJRaw,buffId) +#define setBuffArr(buffId,value) (*env)->SetObjectField(env,chunkJRaw,buffId,value) + + + +//declarations +void readInChunks(JNIEnv * env, jobject chunkList); +int calculateChunkMask(JNIEnv * env, jobjectArray jrx); +uint32_t matrix_transform(JNIEnv * env, jobjectArray jrx); + + + +//the list of chunks +Chunk ** javaChunkView = NULL; +//the number of chunks +int numChunks = 0; + + +JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( + JNIEnv * env, + jclass fluidSimClass, + jobject chunkList, + jfloat dt + ){ + readInChunks(env,chunkList); + simulate(numChunks,javaChunkView,dt); +} + + +/** + * Reads chunks into the dynamic array +*/ +void readInChunks(JNIEnv * env, jobject chunkList){ + jclass listClass = (*env)->FindClass(env,"java/util/List"); + jclass fluidSimClass = (*env)->FindClass(env,"electrosphere/FluidSim"); + //JNIEnv *env, jclass clazz, const char *name, const char *sig + jmethodID jListSize = (*env)->GetMethodID(env, listClass, "size", "()I"); + jmethodID jListGet = (*env)->GetMethodID(env, listClass, "get", "(I)Ljava/lang/Object;"); + jmethodID jListAdd = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z"); + + //ByteBuffer[] + jfieldID dJId = (*env)->GetFieldID(env,fluidSimClass,"density","[Ljava/nio/ByteBuffer;"); + jfieldID d0JId = (*env)->GetFieldID(env,fluidSimClass,"densityAddition","[Ljava/nio/ByteBuffer;"); + jfieldID uJId = (*env)->GetFieldID(env,fluidSimClass,"uVector","[Ljava/nio/ByteBuffer;"); + jfieldID vJId = (*env)->GetFieldID(env,fluidSimClass,"vVector","[Ljava/nio/ByteBuffer;"); + jfieldID wJId = (*env)->GetFieldID(env,fluidSimClass,"wVector","[Ljava/nio/ByteBuffer;"); + jfieldID u0JId = (*env)->GetFieldID(env,fluidSimClass,"uAdditionVector","[Ljava/nio/ByteBuffer;"); + jfieldID v0JId = (*env)->GetFieldID(env,fluidSimClass,"vAdditionVector","[Ljava/nio/ByteBuffer;"); + jfieldID w0JId = (*env)->GetFieldID(env,fluidSimClass,"wAdditionVector","[Ljava/nio/ByteBuffer;"); + jfieldID chunkmaskJId = (*env)->GetFieldID(env,fluidSimClass,"chunkMask","I"); + + //the number of chunks + numChunks = (*env)->CallIntMethod(env,chunkList,jListSize); + + //current chunk (this) + jobject chunkJRaw; + //current chunk fields + jobjectArray jd; + jobjectArray jd0; + jobjectArray u; + jobjectArray v; + jobjectArray w; + jobjectArray u0; + jobjectArray v0; + jobjectArray w0; + int chunkMask; + + //solve chunk mask + for(int i = 0; i < numChunks; i++){ + chunkJRaw = getChunk(i); + chunkMask = calculateChunkMask(env,getBuffArr(dJId)); + (*env)->SetIntField(env,chunkJRaw,chunkmaskJId,chunkMask); + + Chunk * newChunk; + if(i >= stbds_arrlen(javaChunkView)){ + // printf("allocate chunk %d\n",i); + // fflush(stdout); + newChunk = (Chunk *)malloc(sizeof(Chunk)); + // printf("new chunk %p\n",newChunk); + // fflush(stdout); + stbds_arrput(javaChunkView,newChunk); + // printf("new chunk %p\n",chunks[i]); + // fflush(stdout); + } else { + newChunk = javaChunkView[i]; + // printf("get chunk %d: %p\n",i,newChunk); + // fflush(stdout); + } + jd = (*env)->GetObjectField(env,chunkJRaw,dJId); + jd0 = (*env)->GetObjectField(env,chunkJRaw,d0JId); + u = (*env)->GetObjectField(env,chunkJRaw,uJId); + v = (*env)->GetObjectField(env,chunkJRaw,vJId); + w = (*env)->GetObjectField(env,chunkJRaw,wJId); + u0 = (*env)->GetObjectField(env,chunkJRaw,u0JId); + v0 = (*env)->GetObjectField(env,chunkJRaw,v0JId); + w0 = (*env)->GetObjectField(env,chunkJRaw,w0JId); + newChunk->chunkMask = chunkMask; + for(int j = 0; j < 27; j++){ + if((chunkMask & CHUNK_INDEX_ARR[j]) > 0){ + newChunk->d[j] = GET_ARR(env,jd,j); + newChunk->d0[j] = GET_ARR(env,jd0,j); + newChunk->u[j] = GET_ARR(env,u,j); + newChunk->v[j] = GET_ARR(env,v,j); + newChunk->w[j] = GET_ARR(env,w,j); + newChunk->u0[j] = GET_ARR(env,u0,j); + newChunk->v0[j] = GET_ARR(env,v0,j); + newChunk->w0[j] = GET_ARR(env,w0,j); + } + } + } +} + + +/** + * Calculates the bitmask for available chunks for the provided chunk's neighbor array +*/ +int calculateChunkMask(JNIEnv * env, jobjectArray jrx){ + return matrix_transform(env,jrx); +} + +/** + * Calculates a mask that represents all nearby chunks that are actually accessible and exist +*/ +uint32_t matrix_transform(JNIEnv * env, jobjectArray jrx){ + + //The returned value, an availability mask that contains the availability of each neighbor chunk + uint32_t rVal = 0; + + //Add to maks for initial chunks + for(int i = 0; i < CENTER_LOC; i++){ + if((*env)->GetObjectArrayElement(env,jrx,i)!=NULL){ + rVal = rVal + 1; + } + rVal = rVal << 1; + } + //add 1 for center chunk because we already have that + rVal = rVal + 1; + rVal = rVal << 1; + //continue on for remaining chunks + for(int i = CENTER_LOC+1; i < 27; i++){ + if((*env)->GetObjectArrayElement(env,jrx,i)!=NULL){ + rVal = rVal + 1; + } + if(i < 26){ + rVal = rVal << 1; + } + } + + return rVal; +} \ No newline at end of file