chunk referencing

This commit is contained in:
unknown 2024-03-10 16:58:32 -04:00
parent a41a848c04
commit a004e7e2c3

View File

@ -5,23 +5,35 @@
#include "includes/electrosphere_FluidSim.h"
#include "includes/mainFunctions.h"
//include stb ds
#define STB_DS_IMPLEMENTATION
#include "./lib/stb/stb_ds.h"
#define DIM 18
#define LINEARSOLVERTIMES 20
#define DIFFUSION_CONSTANT 0.0
#define VISCOSITY_CONSTANT 0.0
/**
* A chunk
*/
typedef struct {
float * d;
float * u;
float * v;
float * w;
float * d0;
float * u0;
float * v0;
float * w0;
jobject jchunk;
jobjectArray jd;
jobjectArray jd0;
jobjectArray ju;
jobjectArray jv;
jobjectArray jw;
jobjectArray ju0;
jobjectArray jv0;
jobjectArray jw0;
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)
@ -74,20 +86,78 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
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);
}
d = (*env)->GetObjectField(env,chunkJRaw,dJId);
d0 = (*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->jd = d;
newChunk->jd0 = d0;
newChunk->ju = u;
newChunk->jv = v;
newChunk->jw = w;
newChunk->ju0 = u0;
newChunk->jv0 = v0;
newChunk->jw0 = w0;
newChunk->jchunk = chunkJRaw;
newChunk->chunkMask = chunkMask;
// 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);
}
// printf("%p\n",chunks[0].d);
//solve chunk mask
for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i);
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
d = getBuffArr(dJId);
d0 = getBuffArr(d0JId);
u = getBuffArr(uJId);
v = getBuffArr(vJId);
w = getBuffArr(wJId);
u0 = getBuffArr(u0JId);
v0 = getBuffArr(v0JId);
w0 = getBuffArr(w0JId);
Chunk * currentChunk = chunks[i];
chunkJRaw = currentChunk->jchunk;
chunkMask = currentChunk->chunkMask;
d = currentChunk->jd;
d = currentChunk->jd0;
u = currentChunk->ju;
v = currentChunk->jv;
w = currentChunk->jw;
u0 = currentChunk->ju0;
v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
//old assignments
// chunkJRaw = getChunk(i);
// chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
// d = getBuffArr(dJId);
// d0 = getBuffArr(d0JId);
// u = getBuffArr(uJId);
// v = getBuffArr(vJId);
// w = getBuffArr(wJId);
// u0 = getBuffArr(u0JId);
// v0 = getBuffArr(v0JId);
// w0 = getBuffArr(w0JId);
Java_electrosphere_FluidSim_addSourceToVectors(
env,
chunkJRaw,