From c473805510435860624a4de2286be7a30bb87223 Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 1 Dec 2024 17:03:43 -0500 Subject: [PATCH] fluid chunk sleeping --- buildNumber.properties | 4 ++-- src/fluid/includes/environment.h | 1 + src/fluid/src/javainterface.c | 3 +++ src/fluid/src/metadata/metadatacalc.c | 4 ++++ .../fluid/manager/ServerFluidChunk.java | 21 +++++++++++++++++++ 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/buildNumber.properties b/buildNumber.properties index 17ea0259..17466399 100644 --- a/buildNumber.properties +++ b/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Sun Dec 01 16:31:44 EST 2024 -buildNumber=477 +#Sun Dec 01 16:56:17 EST 2024 +buildNumber=480 diff --git a/src/fluid/includes/environment.h b/src/fluid/includes/environment.h index dc628966..9b7b8e1f 100644 --- a/src/fluid/includes/environment.h +++ b/src/fluid/includes/environment.h @@ -25,6 +25,7 @@ typedef struct { jfieldID chunkmaskJId; jfieldID updatedId; jfieldID totalDensityId; + jfieldID asleepId; } ServerFluidChunkLookupTable; /** diff --git a/src/fluid/src/javainterface.c b/src/fluid/src/javainterface.c index 0938baf7..88584b3a 100644 --- a/src/fluid/src/javainterface.c +++ b/src/fluid/src/javainterface.c @@ -113,6 +113,7 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate environment->lookupTable.serverFluidChunkTable.chunkmaskJId = (*env)->GetFieldID(env,fluidSimStorageClass,"chunkMask","I"); environment->lookupTable.serverFluidChunkTable.totalDensityId = (*env)->GetFieldID(env,fluidSimStorageClass,"totalDensity","F"); environment->lookupTable.serverFluidChunkTable.updatedId = (*env)->GetFieldID(env,fluidSimStorageClass,"updated","Z"); + environment->lookupTable.serverFluidChunkTable.asleepId = (*env)->GetFieldID(env,fluidSimStorageClass,"asleep","Z"); } /** @@ -137,6 +138,7 @@ int readInChunks(JNIEnv * env, jobject chunkList, Environment * environment){ jfieldID v0JId = environment->lookupTable.serverFluidChunkTable.v0JId; jfieldID w0JId = environment->lookupTable.serverFluidChunkTable.w0JId; jfieldID chunkmaskJId = environment->lookupTable.serverFluidChunkTable.chunkmaskJId; + jfieldID asleepId = environment->lookupTable.serverFluidChunkTable.asleepId; //the number of chunks numChunks = (*env)->CallIntMethod(env,chunkList,jListSize); @@ -161,6 +163,7 @@ int readInChunks(JNIEnv * env, jobject chunkList, Environment * environment){ //skip this chunk if the center array is not allocated (must not have been removed yet?) if( + (*env)->GetBooleanField(env,chunkJRaw,asleepId) == JNI_TRUE || getBuffArr(dJId) == NULL || (*env)->GetObjectArrayElement(env,getBuffArr(dJId),CENTER_LOC) == NULL || (*env)->GetDirectBufferAddress(env,(*env)->GetObjectArrayElement(env,getBuffArr(dJId),CENTER_LOC)) == NULL diff --git a/src/fluid/src/metadata/metadatacalc.c b/src/fluid/src/metadata/metadatacalc.c index d32c439c..70f3d308 100644 --- a/src/fluid/src/metadata/metadatacalc.c +++ b/src/fluid/src/metadata/metadatacalc.c @@ -46,6 +46,10 @@ void updateMetadata(JNIEnv * env, int numChunks, Chunk ** passedInChunks, Enviro (*env)->SetBooleanField(env,jObj,updatedId,JNI_TRUE); (*env)->SetFloatField(env,jObj,totalDensityId,sum); + if(sum <= 0){ + //sleep the chunk if it has no density + (*env)->SetBooleanField(env,jObj,environment->lookupTable.serverFluidChunkTable.asleepId,JNI_TRUE); + } } } diff --git a/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java b/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java index f0c356f8..8aa78531 100644 --- a/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java +++ b/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java @@ -137,6 +137,11 @@ public class ServerFluidChunk { */ public boolean updated = false; + /** + * Tracks whether this chunk is asleep or not + */ + public boolean asleep = false; + /** * The total density of the chunk */ @@ -467,6 +472,22 @@ public class ServerFluidChunk { public boolean isAllocated(){ return this.bWeights[CENTER_BUFF] != null; } + + /** + * Gets whether this chunk is asleep or not + * @return true if it is asleep, false otherwise + */ + public boolean isAsleep() { + return asleep; + } + + /** + * Sets whether this chunk is asleep or not + * @return true if it is asleep, false otherwise + */ + public void setAsleep(boolean asleep) { + this.asleep = asleep; + } /** * Allocates the central arrays for this chunk