From 586232dd79b45b825ee68f400c22eb82021faa1d Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 1 Dec 2024 12:02:16 -0500 Subject: [PATCH] fluid update work --- buildNumber.properties | 4 +- docs/src/progress/renderertodo.md | 2 + src/fluid/src/fluidsim.c | 1 - src/fluid/src/metadatacalc.c | 8 +-- .../client/fluid/cells/FluidCellManager.java | 19 ++++-- .../fluid/manager/ClientFluidManager.java | 14 +++++ .../ui/menu/debug/ImGuiFluidMonitor.java | 63 +++++++++++++++++++ .../ui/menu/debug/ImGuiWindowMacros.java | 29 +-------- .../fluid/manager/ServerFluidManager.java | 14 +++++ 9 files changed, 112 insertions(+), 42 deletions(-) create mode 100644 src/main/java/electrosphere/client/ui/menu/debug/ImGuiFluidMonitor.java diff --git a/buildNumber.properties b/buildNumber.properties index ee13acb2..d8297665 100644 --- a/buildNumber.properties +++ b/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Sun Dec 01 11:40:49 EST 2024 -buildNumber=448 +#Sun Dec 01 11:59:35 EST 2024 +buildNumber=449 diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index d63834f5..9690ea2b 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1203,6 +1203,8 @@ Break out solver consts (12/01/2024) Move header file generation location +Add more debugging tools for fluids +Remove conditional update check in fluid sim diff --git a/src/fluid/src/fluidsim.c b/src/fluid/src/fluidsim.c index 34c2db34..6cc18c94 100644 --- a/src/fluid/src/fluidsim.c +++ b/src/fluid/src/fluidsim.c @@ -16,7 +16,6 @@ #endif -#define DIM 18 #define REALLY_SMALL_VALUE 0.00001 #define DIFFUSION_CONSTANT 0.00001 diff --git a/src/fluid/src/metadatacalc.c b/src/fluid/src/metadatacalc.c index bf2ef29d..84edb88f 100644 --- a/src/fluid/src/metadatacalc.c +++ b/src/fluid/src/metadatacalc.c @@ -43,12 +43,8 @@ void updateMetadata(JNIEnv * env, int numChunks, Chunk ** passedInChunks, Enviro } //update total density - if(fabs(sum - prevDensity) > UPDATE_THRESHOLD){ - (*env)->SetBooleanField(env,jObj,updatedId,JNI_TRUE); - (*env)->SetFloatField(env,jObj,totalDensityId,sum); - } else { - (*env)->SetBooleanField(env,jObj,updatedId,JNI_FALSE); - } + (*env)->SetBooleanField(env,jObj,updatedId,JNI_TRUE); + (*env)->SetFloatField(env,jObj,totalDensityId,sum); } } diff --git a/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java b/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java index dcebc781..f51828d1 100644 --- a/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java +++ b/src/main/java/electrosphere/client/fluid/cells/FluidCellManager.java @@ -21,6 +21,11 @@ import electrosphere.server.terrain.manager.ServerTerrainChunk; * @author satellite */ public class FluidCellManager { + + /** + * The number of times to iteratively update per frame + */ + static final int UPDATE_COUNT = 5; //the center of this cell manager's array in cell space @@ -356,12 +361,14 @@ public class FluidCellManager { Globals.profiler.beginCpuSample("FluidCellManager.update"); calculateDeltas(); if(update){ - if(containsUnrequestedCell()){ - updateUnrequestedCell(); - } else if(containsUndrawableCell()){ - makeCellDrawable(); - } else if(containsUpdateableCell()){ - updateCellModel(); + for(int i = 0; i < UPDATE_COUNT; i++){ + if(containsUnrequestedCell()){ + updateUnrequestedCell(); + } else if(containsUndrawableCell()){ + makeCellDrawable(); + } else if(containsUpdateableCell()){ + updateCellModel(); + } } } Globals.profiler.endCpuSample(); diff --git a/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java b/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java index 504ceebc..d9e9c717 100644 --- a/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java +++ b/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java @@ -44,6 +44,11 @@ public class ClientFluidManager { //The queue of fluid chunk data to be buffered to gpu static List fluidChunkGenerationQueue = new LinkedList(); + /** + * The number of messages parsed this frame + */ + int messageCount; + /** * Lock for thread-safeing the manager */ @@ -60,6 +65,7 @@ public class ClientFluidManager { public void handleMessages(){ lock.lock(); List bouncedMessages = new LinkedList(); + messageCount = messageQueue.size(); for(TerrainMessage message : messageQueue){ switch(message.getMessageSubtype()){ case SENDFLUIDDATA: { @@ -211,5 +217,13 @@ public class ClientFluidManager { data.setVoxelWeight(weights); return data; } + + /** + * Gets the number of messages processed this frame + * @return The number of messages + */ + public int getMessageCount(){ + return messageCount; + } } diff --git a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiFluidMonitor.java b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiFluidMonitor.java new file mode 100644 index 00000000..4cd4c3a1 --- /dev/null +++ b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiFluidMonitor.java @@ -0,0 +1,63 @@ +package electrosphere.client.ui.menu.debug; + +import electrosphere.client.fluid.cells.FluidCellManager; +import electrosphere.client.fluid.manager.ClientFluidManager; +import electrosphere.engine.Globals; +import electrosphere.renderer.ui.imgui.ImGuiWindow; +import electrosphere.renderer.ui.imgui.ImGuiWindow.ImGuiWindowCallback; +import electrosphere.server.fluid.manager.ServerFluidManager; +import imgui.ImGui; + +/** + * Monitors the fluid system on server/client + */ +public class ImGuiFluidMonitor { + + /** + * Window for viewing chunk status on server and client + */ + protected static ImGuiWindow fluidWindow; + + /** + * Creates the windows in this file + */ + protected static void createFluidDebugWindows(){ + createFluidDebugWindow(); + } + + /** + * Client scene entity view + */ + protected static void createFluidDebugWindow(){ + fluidWindow = new ImGuiWindow("Fluids"); + fluidWindow.setCallback(new ImGuiWindowCallback() { + @Override + public void exec() { + if(ImGui.collapsingHeader("Server Data")){ + ServerFluidManager fluidManager = Globals.playerManager.getPlayerRealm(Globals.clientPlayer).getServerWorldData().getServerFluidManager(); + //audio engine details + ImGui.text("Fluids Debug"); + ImGui.text("State: " + (fluidManager.getSimulate() ? "on" : "off")); + if(ImGui.button("Toggle Simulation")){ + fluidManager.setSimulate(!fluidManager.getSimulate()); + } + ImGui.text("Broadcast Size (This Frame): " + fluidManager.getBroadcastSize()); + } + if(ImGui.collapsingHeader("Client Data")){ + + FluidCellManager fluidCellManager = Globals.fluidCellManager; + ImGui.text("FluidCellManager Data"); + ImGui.text("Undrawable size: " + fluidCellManager.getUndrawableSize()); + ImGui.text("Unrequested size: " + fluidCellManager.getUnrequestedSize()); + + ClientFluidManager clientFluidManager = Globals.clientFluidManager; + ImGui.text("ClientFluidManager Data"); + ImGui.text("Message Count (This Frame): " + clientFluidManager.getMessageCount()); + } + } + }); + fluidWindow.setOpen(false); + Globals.renderingEngine.getImGuiPipeline().addImGuiWindow(fluidWindow); + } + +} diff --git a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiWindowMacros.java b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiWindowMacros.java index 5e58a9f9..4bd0426d 100644 --- a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiWindowMacros.java +++ b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiWindowMacros.java @@ -10,7 +10,6 @@ import electrosphere.renderer.ui.imgui.ImGuiLinePlot; import electrosphere.renderer.ui.imgui.ImGuiWindow; import electrosphere.renderer.ui.imgui.ImGuiLinePlot.ImGuiLinePlotDataset; import electrosphere.renderer.ui.imgui.ImGuiWindow.ImGuiWindowCallback; -import electrosphere.server.fluid.manager.ServerFluidManager; import electrosphere.server.terrain.generation.TestGenerationChunkGenerator; import imgui.ImGui; @@ -32,9 +31,6 @@ public class ImGuiWindowMacros { private static ImGuiLinePlot globalFrametimePlot; private static Map globalFrametimeDatasets; - //fluid details - private static ImGuiWindow fluidWindow; - /** * Initializes imgui windows */ @@ -42,7 +38,7 @@ public class ImGuiWindowMacros { createMainDebugMenu(); createFramerateGraph(); ImGuiPlayerEntity.createPlayerEntityDebugWindow(); - createFluidDebugWindow(); + ImGuiFluidMonitor.createFluidDebugWindows(); ImGuiEntityMacros.createClientEntityWindows(); ImGuiUIFramework.createUIFrameworkWindows(); ImGuiControls.createControlsWindows(); @@ -108,27 +104,6 @@ public class ImGuiWindowMacros { } } - /** - * Create fluid debug menu - */ - private static void createFluidDebugWindow(){ - fluidWindow = new ImGuiWindow("Fluids"); - fluidWindow.setCallback(new ImGuiWindowCallback() { - @Override - public void exec() { - ServerFluidManager fluidManager = Globals.playerManager.getPlayerRealm(Globals.clientPlayer).getServerWorldData().getServerFluidManager(); - //audio engine details - ImGui.text("Fluids Debug"); - ImGui.text("State: " + (fluidManager.getSimulate() ? "on" : "off")); - if(ImGui.button("Toggle Simulation")){ - fluidManager.setSimulate(!fluidManager.getSimulate()); - } - } - }); - fluidWindow.setOpen(false); - Globals.renderingEngine.getImGuiPipeline().addImGuiWindow(fluidWindow); - } - /** * Inits the main debug menu @@ -152,7 +127,7 @@ public class ImGuiWindowMacros { } //show fluids debug if(ImGui.button("Show Fluids Debug Menu")){ - fluidWindow.setOpen(true); + ImGuiFluidMonitor.fluidWindow.setOpen(true); } //client entity debug if(ImGui.button("Client Entity Debug")){ diff --git a/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java b/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java index 236a3548..1b620cbc 100644 --- a/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java +++ b/src/main/java/electrosphere/server/fluid/manager/ServerFluidManager.java @@ -101,6 +101,12 @@ public class ServerFluidManager { * The update frame-skipping tracking variable */ int updatePhase = 0; + + @Exclude + /** + * The number of chunks broadcast this frame + */ + int broadcastSize = 0; /** @@ -297,6 +303,7 @@ public class ServerFluidManager { } this.simulationQueue.clear(); + this.broadcastSize = this.broadcastQueue.size(); updatePhase++; if(updatePhase > UPDATE_RATE){ @@ -388,6 +395,13 @@ public class ServerFluidManager { return serverFluidSimulator; } + /** + * Gets the number of chunks broadcast this frame + * @return The number of chunks + */ + public int getBroadcastSize(){ + return broadcastSize; + } }