add tracking for pressurecell
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-12-19 16:25:29 -05:00
parent 058aff6b31
commit 67238f0648
10 changed files with 127 additions and 1 deletions

View File

@ -41,6 +41,8 @@ typedef struct {
jfieldID homogenousId;
jfieldID normalizationRatioId;
jfieldID massCountId;
jfieldID pressureTotalId;
jfieldID velocityMagTotalId;
} ServerFluidChunkLookupTable;
/**

View File

@ -75,6 +75,16 @@ typedef struct {
*/
double recaptureDensity;
/**
* The total pressure of the chunk
*/
double pressureTotal;
/**
* Total velocity magnitude of the chunk
*/
double velocityMagTotal;
/**
* The density outgoing to neighbors
*/

View File

@ -50,7 +50,7 @@
/**
* Set to 1 to clamp small density values to 0
*/
#define FLUID_PRESSURECELL_ENABLE_CLAMP_MIN_DENSITY 0
#define FLUID_PRESSURECELL_ENABLE_CLAMP_MIN_DENSITY 1
/**
* Cutoff after which density is clamped to zero while diffusing

View File

@ -0,0 +1,17 @@
#ifndef FLUID_PRESSURECELL_TRACKING_H
#define FLUID_PRESSURECELL_TRACKING_H
#include "public.h"
#include "fluid/queue/chunk.h"
#include "fluid/queue/chunkmask.h"
#include "fluid/env/environment.h"
#include "fluid/env/utilities.h"
/**
* Updates the tracking data for this chunk
*/
LIBRARY_API void pressurecell_update_tracking(Environment * environment, Chunk * chunk);
#endif

View File

@ -143,6 +143,8 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate
environment->lookupTable.serverFluidChunkTable.homogenousId = (*env)->GetFieldID(env,fluidSimStorageClass,"isHomogenous","Z");
environment->lookupTable.serverFluidChunkTable.normalizationRatioId = (*env)->GetStaticFieldID(env,fluidSimStorageClass,"normalizationRatio","F");
environment->lookupTable.serverFluidChunkTable.massCountId = (*env)->GetStaticFieldID(env,fluidSimStorageClass,"massCount","F");
environment->lookupTable.serverFluidChunkTable.pressureTotalId = (*env)->GetFieldID(env,fluidSimStorageClass,"totalPressure","F");
environment->lookupTable.serverFluidChunkTable.velocityMagTotalId = (*env)->GetFieldID(env,fluidSimStorageClass,"totalVelocityMag","F");
}
/**

View File

@ -106,6 +106,27 @@ LIBRARY_API void updateMetadata(JNIEnv * env, int numChunks, Chunk ** passedInCh
massCount
);
//set non-static metadata in each chunk
for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = passedInChunks[i];
//total pressure
float pressureTotal = (float)currentChunk->pressureCellData.pressureTotal;
(*env)->SetFloatField(
env,
currentChunk->chunkJRaw,
environment->lookupTable.serverFluidChunkTable.pressureTotalId,
pressureTotal
);
//total velocity magnitude
float velocityMagTotal = (float)currentChunk->pressureCellData.velocityMagTotal;
(*env)->SetFloatField(
env,
currentChunk->chunkJRaw,
environment->lookupTable.serverFluidChunkTable.velocityMagTotalId,
velocityMagTotal
);
}
//update frame state
environment->state.frame = environment->state.frame + 1;

View File

@ -14,6 +14,7 @@
#include "fluid/sim/pressurecell/pressure.h"
#include "fluid/sim/pressurecell/solver_consts.h"
#include "fluid/sim/pressurecell/normalization.h"
#include "fluid/sim/pressurecell/tracking.h"
#include "fluid/sim/pressurecell/velocity.h"
@ -156,6 +157,15 @@ LIBRARY_API void fluid_pressurecell_simulate(
}
//
// Update tracking
//
for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i];
pressurecell_update_tracking(environment,currentChunk);
}
//
// Setup for next iteration
//

View File

@ -0,0 +1,33 @@
#include<math.h>
#include "fluid/sim/pressurecell/tracking.h"
/**
* Updates the tracking data for this chunk
*/
LIBRARY_API void pressurecell_update_tracking(Environment * environment, Chunk * chunk){
int x, y, z;
double pressureSum = 0;
double velocitySum = 0;
float * u = chunk->u[CENTER_LOC];
float * v = chunk->v[CENTER_LOC];
float * w = chunk->w[CENTER_LOC];
float * pressure = chunk->pressureCache[CENTER_LOC];
for(x = 0; x < DIM; x++){
for(y = 0; y < DIM; y++){
for(z = 0; z < DIM; z++){
float velocityMagnitude = sqrt(u[IX(x,y,z)] * u[IX(x,y,z)] + v[IX(x,y,z)] * v[IX(x,y,z)] + w[IX(x,y,z)] * w[IX(x,y,z)]);
velocitySum = velocitySum + velocityMagnitude;
pressureSum = pressureSum + pressure[IX(x,y,z)];
}
}
}
chunk->pressureCellData.pressureTotal = pressureSum;
chunk->pressureCellData.velocityMagTotal = velocitySum;
}

View File

@ -45,6 +45,11 @@ public class ImGuiFluidMonitor {
ImGui.text("Broadcast Size (This Frame): " + fluidManager.getBroadcastSize());
ImGui.text("Normalization Ratio: " + ServerFluidChunk.getNormalizationRatio());
ImGui.text("Mass: " + ServerFluidChunk.getMassCount());
if(fluidManager.getChunk(0, 0, 0) != null){
ServerFluidChunk chunk = fluidManager.getChunk(0, 0, 0);
ImGui.text("Pressure: " + chunk.getTotalPressure());
ImGui.text("Velocity magnitude: " + chunk.getTotalVelocityMag());
}
}
if(ImGui.collapsingHeader("Client Data")){

View File

@ -196,6 +196,16 @@ public class ServerFluidChunk {
*/
public float totalDensity = 0;
/**
* Total pressure of this chunk
*/
public float totalPressure = 0;
/**
* Total velocity magnitude of this chunk
*/
public float totalVelocityMag = 0;
/**
* The normalization ratio used to smooth fluid simulation steps
*/
@ -658,6 +668,22 @@ public class ServerFluidChunk {
return massCount;
}
/**
* Gets the total pressure of this chunk
* @return The total pressure of this chunk
*/
public float getTotalPressure(){
return totalPressure;
}
/**
* Gets the total velocity magnitude of this chunk
* @return The total velocity magnitude of this chunk
*/
public float getTotalVelocityMag(){
return totalVelocityMag;
}
}