fix bounds check for cellular sim
This commit is contained in:
parent
d3f545955f
commit
3436bfa457
@ -1,3 +1,3 @@
|
||||
#maven.buildNumber.plugin properties file
|
||||
#Fri Dec 06 19:03:01 EST 2024
|
||||
buildNumber=558
|
||||
#Fri Dec 06 19:27:15 EST 2024
|
||||
buildNumber=569
|
||||
|
||||
@ -6,18 +6,18 @@
|
||||
#ifndef CHUNK_H
|
||||
#define CHUNK_H
|
||||
|
||||
#define MIN_VALUE 0
|
||||
#define MAX_VALUE 1
|
||||
#define MIN_VALUE 0.0
|
||||
#define MAX_VALUE 1.0
|
||||
|
||||
/**
|
||||
* Minimum value of bounds array for it to be considered a blocker
|
||||
* The cutoff value for the bounds array
|
||||
*/
|
||||
#define BOUND_MIN_VALUE 0
|
||||
#define BOUND_CUTOFF_VALUE 0.0
|
||||
|
||||
/**
|
||||
* Maximum value of bounds array for it to be considered a blocker
|
||||
*/
|
||||
#define BOUND_MAX_VALUE 1
|
||||
#define BOUND_MAX_VALUE 1.0
|
||||
|
||||
/**
|
||||
* The dimension of a single chunk's array
|
||||
|
||||
@ -43,48 +43,49 @@ void updateMetadata(JNIEnv * env, int numChunks, Chunk ** passedInChunks, Enviro
|
||||
}
|
||||
//get whether the chunk is currently homogenous or not
|
||||
int homogenous = sum <= 0 ? JNI_TRUE : JNI_FALSE;
|
||||
(*env)->SetBooleanField(env,jObj,environment->lookupTable.serverFluidChunkTable.homogenousId,homogenous);
|
||||
// (*env)->SetBooleanField(env,jObj,environment->lookupTable.serverFluidChunkTable.homogenousId,homogenous);
|
||||
(*env)->SetBooleanField(env,jObj,environment->lookupTable.serverFluidChunkTable.homogenousId,JNI_FALSE);
|
||||
|
||||
//update total density
|
||||
(*env)->SetFloatField(env,jObj,totalDensityId,sum);
|
||||
|
||||
//check if any neighbor is non-homogenous
|
||||
jobject neighborArr = (*env)->GetObjectField(env,jObj,environment->lookupTable.serverFluidChunkTable.neighborsId);
|
||||
int nonHomogenousNeighbor = JNI_FALSE;
|
||||
for(int j = 0; j < NEIGHBOR_ARRAY_COUNT; j++){
|
||||
if(j == CENTER_LOC){
|
||||
continue;
|
||||
}
|
||||
jobject neighborObj = (*env)->GetObjectArrayElement(env,neighborArr,j);
|
||||
if(neighborObj != NULL){
|
||||
int neighborHomogenous = (*env)->GetBooleanField(env,neighborObj,environment->lookupTable.serverFluidChunkTable.homogenousId);
|
||||
if(neighborHomogenous == JNI_FALSE){
|
||||
nonHomogenousNeighbor = JNI_TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// jobject neighborArr = (*env)->GetObjectField(env,jObj,environment->lookupTable.serverFluidChunkTable.neighborsId);
|
||||
// int nonHomogenousNeighbor = JNI_FALSE;
|
||||
// for(int j = 0; j < NEIGHBOR_ARRAY_COUNT; j++){
|
||||
// if(j == CENTER_LOC){
|
||||
// continue;
|
||||
// }
|
||||
// jobject neighborObj = (*env)->GetObjectArrayElement(env,neighborArr,j);
|
||||
// if(neighborObj != NULL){
|
||||
// int neighborHomogenous = (*env)->GetBooleanField(env,neighborObj,environment->lookupTable.serverFluidChunkTable.homogenousId);
|
||||
// if(neighborHomogenous == JNI_FALSE){
|
||||
// nonHomogenousNeighbor = JNI_TRUE;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
//figure out if this chunk should sleep or not
|
||||
int shouldSleep = JNI_TRUE;
|
||||
if(nonHomogenousNeighbor == JNI_TRUE || homogenous == JNI_FALSE){
|
||||
// if(nonHomogenousNeighbor == JNI_TRUE || homogenous == JNI_FALSE){
|
||||
shouldSleep = JNI_FALSE;
|
||||
}
|
||||
// }
|
||||
(*env)->SetBooleanField(env,jObj,environment->lookupTable.serverFluidChunkTable.asleepId,shouldSleep);
|
||||
|
||||
//if this cell is awake AND non-homogenous, make sure all neighbors are awake
|
||||
if(shouldSleep == JNI_FALSE && homogenous == JNI_FALSE){
|
||||
// if(shouldSleep == JNI_FALSE && homogenous == JNI_FALSE){
|
||||
(*env)->SetBooleanField(env,jObj,updatedId,JNI_TRUE);
|
||||
for(int j = 0; j < NEIGHBOR_ARRAY_COUNT; j++){
|
||||
if(j == CENTER_LOC){
|
||||
continue;
|
||||
}
|
||||
jobject neighborObj = (*env)->GetObjectArrayElement(env,neighborArr,j);
|
||||
if(neighborObj != NULL){
|
||||
(*env)->SetBooleanField(env,neighborObj,environment->lookupTable.serverFluidChunkTable.asleepId,JNI_FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
// for(int j = 0; j < NEIGHBOR_ARRAY_COUNT; j++){
|
||||
// if(j == CENTER_LOC){
|
||||
// continue;
|
||||
// }
|
||||
// jobject neighborObj = (*env)->GetObjectArrayElement(env,neighborArr,j);
|
||||
// if(neighborObj != NULL){
|
||||
// (*env)->SetBooleanField(env,neighborObj,environment->lookupTable.serverFluidChunkTable.asleepId,JNI_FALSE);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
//alert java side to updated static values
|
||||
|
||||
@ -29,10 +29,10 @@ LIBRARY_API void fluid_cellular_simulate(Environment * environment){
|
||||
continue;
|
||||
} else {
|
||||
//transfer straight down
|
||||
if(bounds[IX(x,y-1,z)] < BOUND_MIN_VALUE){
|
||||
int deltaLower = MAX_VALUE - d[IX(x,y-1,z)];
|
||||
if(bounds[IX(x,y-1,z)] <= BOUND_CUTOFF_VALUE){
|
||||
float deltaLower = MAX_VALUE - d[IX(x,y-1,z)];
|
||||
if(deltaLower > 0){
|
||||
int transferLower;
|
||||
float transferLower;
|
||||
if(d[IX(x,y,z)] >= deltaLower){
|
||||
transferLower = deltaLower;
|
||||
} else {
|
||||
@ -49,16 +49,18 @@ LIBRARY_API void fluid_cellular_simulate(Environment * environment){
|
||||
for(int i = 0; i < 4; i++){
|
||||
int nX = x + offsetX[i];
|
||||
int nZ = z + offsetZ[i];
|
||||
int deltaLateral = d[IX(x,y,z)] - d[IX(nX,y,nZ)];
|
||||
if(deltaLateral > 0){
|
||||
int transferLateral;
|
||||
if(d[IX(nX,y,nZ)] >= deltaLateral){
|
||||
transferLateral = deltaLateral;
|
||||
} else {
|
||||
transferLateral = d[IX(nX,y,nZ)];
|
||||
if(bounds[IX(nX,y,nZ)] <= BOUND_CUTOFF_VALUE){
|
||||
float deltaLateral = d[IX(x,y,z)] - d[IX(nX,y,nZ)];
|
||||
if(deltaLateral > 0){
|
||||
float transferLateral;
|
||||
if(d[IX(x,y,z)] >= deltaLateral){
|
||||
transferLateral = deltaLateral;
|
||||
} else {
|
||||
transferLateral = d[IX(x,y,z)];
|
||||
}
|
||||
d[IX(x,y,z)] -= transferLateral;
|
||||
d[IX(nX,y,nZ)] += transferLateral;
|
||||
}
|
||||
d[IX(nX,y,nZ)] -= transferLateral;
|
||||
d[IX(nX,y,nZ)] += transferLateral;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,11 +74,13 @@ public class ServerBehaviorTreeUtils {
|
||||
public static void updateCell(Entity entity, ServerDataCell oldCell){
|
||||
Set<BehaviorTree> trees = entityBTreeMap.get(entity);
|
||||
ServerDataCell newCell = DataCellSearchUtils.getEntityDataCell(entity);
|
||||
for(BehaviorTree tree : trees){
|
||||
if(oldCell != null){
|
||||
oldCell.getScene().deregisterBehaviorTree(tree);
|
||||
if(trees != null){
|
||||
for(BehaviorTree tree : trees){
|
||||
if(oldCell != null){
|
||||
oldCell.getScene().deregisterBehaviorTree(tree);
|
||||
}
|
||||
newCell.getScene().registerBehaviorTree(tree);
|
||||
}
|
||||
newCell.getScene().registerBehaviorTree(tree);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user