Compare commits

..

2 Commits

Author SHA1 Message Date
austin
512998eb24 Free camera support for debugging
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
2024-03-20 21:09:00 -04:00
austin
86edabf4de player entity debug menu 2024-03-20 18:57:48 -04:00
12 changed files with 224 additions and 78 deletions

View File

@ -170,17 +170,30 @@ Cellular Automata Fluid Dynamics System
- Advect force - Advect force
- Advect density - Advect density
- Diffuse density - Diffuse density
- Do not bound to single chunks
Fluid Chunk System
- Basic model creation
- Streaming chunks over network
- Only add compression when it starts to become an issue
Fix character movement Fix character movement
- Walking left or right while turning camera is very jittery - Walking left or right while turning camera is very jittery
Fix Frustum Culling for skybox Fix Frustum Culling for skybox
Free camera system that can detatch from player entity
Fix Character creation preview not working Fix Character creation preview not working
Clean up main method/class Clean up main method/class
Bring LWJGL version up to latest
Include Remotery library
Physics-controlled objects system
Shader library system Shader library system
- Abiltiy to include the shader library in individual files (ie implement #include) - Abiltiy to include the shader library in individual files (ie implement #include)
@ -342,3 +355,12 @@ dynamic camp/house system - npcs will gradually join your camp the longer you st
dynamic warfare system dynamic warfare system
- Guard towers that need to be captured by factions before enabling assault on real settlements - Guard towers that need to be captured by factions before enabling assault on real settlements
- Raids against villages - Raids against villages
# Known bugs
- Draw cell manager iso values dont make sense and should scale empty cells based on neighbor cells
- Draw cell manager logic doesn't fill in border cells properly (the logic to check if a border cell exists always succeeds as long as the potential location is within world bounds, not if it actually exists in cache)
- Control handler re-polls for mouse coordiantes for each control handler group it processes, so only the first group gets the mouse movement event properly

View File

@ -113,9 +113,7 @@ public class FluidCell {
* Fills in the internal arrays of data for generate terrain models * Fills in the internal arrays of data for generate terrain models
*/ */
private void fillInData(){ private void fillInData(){
if(worldPos.x == 1 && worldPos.y == 0 && worldPos.z == 0){
System.out.println("aaaa");
}
// //
//fill in data //fill in data
// //
@ -293,8 +291,10 @@ public class FluidCell {
currZ >= 0 && currZ < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE && currZ >= 0 && currZ < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE &&
(1 + weights[x][y][z]) < weights[currX][currY][currZ] (1 + weights[x][y][z]) < weights[currX][currY][currZ]
){ ){
System.out.println("set neighbor weight");
weights[x][y][z] = -(1 - weights[currX][currY][currZ]); weights[x][y][z] = -(1 - weights[currX][currY][currZ]);
if(weights[x][y][z] >= 0){
weights[x][y][z] = -0.01f;
}
} }
} }
} }

View File

@ -32,6 +32,7 @@ public class ClientFunctions {
updateSkyboxPos(); updateSkyboxPos();
Globals.clientSceneWrapper.destroyEntitiesOutsideSimRange(); Globals.clientSceneWrapper.destroyEntitiesOutsideSimRange();
InstanceUpdater.updateInstancedActorPriority(); InstanceUpdater.updateInstancedActorPriority();
Globals.cameraHandler.updateGlobalCamera();
// updateCellManager(); // updateCellManager();
} }

View File

@ -20,6 +20,7 @@ public class CameraHandler {
float pitch = 50; float pitch = 50;
Vector3f cameraRotationVector = new Vector3f(); Vector3f cameraRotationVector = new Vector3f();
Vector3f radialOffset = new Vector3f(0,1,0); Vector3f radialOffset = new Vector3f(0,1,0);
boolean trackPlayerEntity = true;
public void handleMouseEvent(MouseEvent event){ public void handleMouseEvent(MouseEvent event){
@ -89,6 +90,10 @@ public class CameraHandler {
// cameraRotationVector.normalize(); // cameraRotationVector.normalize();
// System.out.println(yaw + " " + pitch); // System.out.println(yaw + " " + pitch);
} }
if(trackPlayerEntity && Globals.playerEntity != null){
Vector3d entityPos = EntityUtils.getPosition(Globals.playerEntity);
CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)entityPos.x,(float)entityPos.y,(float)entityPos.z).add(CameraEntityUtils.getOrbitalCameraRadialOffset(Globals.playerCamera)));
}
//update view matrix offset //update view matrix offset
float xFactor = (float)Math.cos(yaw / 180.0f * Math.PI); float xFactor = (float)Math.cos(yaw / 180.0f * Math.PI);
float yFactor = (float)Math.sin(yaw / 180.0f * Math.PI); float yFactor = (float)Math.sin(yaw / 180.0f * Math.PI);
@ -110,4 +115,17 @@ public class CameraHandler {
return pitch; return pitch;
} }
//set player tracking
public void setTrackPlayerEntity(boolean track){
trackPlayerEntity = track;
}
//get trackPlayerEntity
public boolean getTrackPlayerEntity(){
return trackPlayerEntity;
}
} }

View File

@ -193,6 +193,15 @@ public class ControlHandler {
public static final String DEBUG_FRAMESTEP = "framestep"; public static final String DEBUG_FRAMESTEP = "framestep";
public static final String DEBUG_OPEN_DEBUG_MENU = "openDebugMenu"; public static final String DEBUG_OPEN_DEBUG_MENU = "openDebugMenu";
public static final String FREECAM_UP = "freecamUp";
public static final String FREECAM_DOWN = "freecamDown";
public static final String FREECAM_FORWARD = "freecamForward";
public static final String FREECAM_BACKWARD = "freecamBackward";
public static final String FREECAM_LEFT = "freecamLeft";
public static final String FREECAM_RIGHT = "freecamRight";
public static final String FREECAM_MOUSE = "freecamMouse";
public static enum ControlsState { public static enum ControlsState {
@ -200,6 +209,7 @@ public class ControlHandler {
TITLE_MENU, TITLE_MENU,
MAIN_GAME, MAIN_GAME,
IN_GAME_MAIN_MENU, IN_GAME_MAIN_MENU,
IN_GAME_FREE_CAMERA,
INVENTORY, INVENTORY,
NO_INPUT, NO_INPUT,
} }
@ -232,6 +242,7 @@ public class ControlHandler {
List<Control> typingControlList = new LinkedList<Control>(); List<Control> typingControlList = new LinkedList<Control>();
List<Control> inventoryControlList = new LinkedList<Control>(); List<Control> inventoryControlList = new LinkedList<Control>();
List<Control> alwaysOnDebugControlList = new LinkedList<Control>(); List<Control> alwaysOnDebugControlList = new LinkedList<Control>();
List<Control> freeCameraControlList = new LinkedList<Control>();
ControlHandler(){ ControlHandler(){
controls = new HashMap<String, Control>(); controls = new HashMap<String, Control>();
@ -341,6 +352,18 @@ public class ControlHandler {
set state set state
*/ */
handler.setHandlerState(ControlsState.TITLE_MENU); handler.setHandlerState(ControlsState.TITLE_MENU);
/*
* Free camera
*/
handler.addControl(FREECAM_UP, new Control(ControlType.KEY,GLFW_KEY_SPACE));
handler.addControl(FREECAM_DOWN, new Control(ControlType.KEY,GLFW_KEY_LEFT_CONTROL));
handler.addControl(FREECAM_FORWARD, new Control(ControlType.KEY,GLFW_KEY_W));
handler.addControl(FREECAM_BACKWARD, new Control(ControlType.KEY,GLFW_KEY_S));
handler.addControl(FREECAM_LEFT, new Control(ControlType.KEY,GLFW_KEY_A));
handler.addControl(FREECAM_RIGHT, new Control(ControlType.KEY,GLFW_KEY_D));
handler.addControl(FREECAM_MOUSE, new Control(ControlType.MOUSE_MOVEMENT,0));
/* /*
Save to file Save to file
@ -395,6 +418,12 @@ public class ControlHandler {
// pollMenuNavigationControls(); // pollMenuNavigationControls();
break; break;
case IN_GAME_FREE_CAMERA:
runHandlers(freeCameraControlList);
runHandlers(mainGameDebugControlList);
runHandlers(alwaysOnDebugControlList);
break;
case INVENTORY: case INVENTORY:
runHandlers(inventoryControlList); runHandlers(inventoryControlList);
runHandlers(menuNavigationControlList); runHandlers(menuNavigationControlList);
@ -416,6 +445,7 @@ public class ControlHandler {
setTypingControls(); setTypingControls();
setInventoryControls(); setInventoryControls();
setAlwaysOnDebugControls(); setAlwaysOnDebugControls();
setFreecamControls();
} }
void setMainGameControls(){ void setMainGameControls(){
@ -1121,6 +1151,48 @@ public class ControlHandler {
controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setRepeatTimeout(0.5f * Main.targetFrameRate); controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setRepeatTimeout(0.5f * Main.targetFrameRate);
} }
void setFreecamControls(){
freeCameraControlList.add(controls.get(FREECAM_UP));
controls.get(FREECAM_UP).setOnRepeat(new ControlMethod(){public void execute(){
Vector3f playerCameraCenterPos = CameraEntityUtils.getCameraCenter(Globals.playerCamera);
playerCameraCenterPos.add(0,0.1f,0);
CameraEntityUtils.setCameraCenter(Globals.playerCamera,playerCameraCenterPos);
}});
freeCameraControlList.add(controls.get(FREECAM_DOWN));
controls.get(FREECAM_DOWN).setOnRepeat(new ControlMethod(){public void execute(){
Vector3f playerCameraCenterPos = CameraEntityUtils.getCameraCenter(Globals.playerCamera);
playerCameraCenterPos.add(0,-0.1f,0);
CameraEntityUtils.setCameraCenter(Globals.playerCamera,playerCameraCenterPos);
}});
freeCameraControlList.add(controls.get(FREECAM_FORWARD));
controls.get(FREECAM_FORWARD).setOnRepeat(new ControlMethod(){public void execute(){
Vector3f playerCameraCenterPos = CameraEntityUtils.getCameraCenter(Globals.playerCamera);
Vector3f playerCameraEyePos = CameraEntityUtils.getCameraEye(Globals.playerCamera);
playerCameraCenterPos.add(new Vector3f(playerCameraEyePos).mul(-0.1f));
CameraEntityUtils.setCameraCenter(Globals.playerCamera,playerCameraCenterPos);
}});
freeCameraControlList.add(controls.get(FREECAM_BACKWARD));
controls.get(FREECAM_BACKWARD).setOnRepeat(new ControlMethod(){public void execute(){
Vector3f playerCameraCenterPos = CameraEntityUtils.getCameraCenter(Globals.playerCamera);
Vector3f playerCameraEyePos = CameraEntityUtils.getCameraEye(Globals.playerCamera);
playerCameraCenterPos.add(new Vector3f(playerCameraEyePos).mul(0.1f));
CameraEntityUtils.setCameraCenter(Globals.playerCamera,playerCameraCenterPos);
}});
freeCameraControlList.add(controls.get(FREECAM_MOUSE));
controls.get(FREECAM_MOUSE).setOnMove(new Control.MouseCallback(){public void execute(MouseEvent event){
Globals.cameraHandler.handleMouseEvent(event);
}});
freeCameraControlList.add(controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU));
}
void setTypingControls(){ void setTypingControls(){
@ -1352,6 +1424,10 @@ public class ControlHandler {
public void setHandlerState(ControlsState state){ public void setHandlerState(ControlsState state){
this.state = state; this.state = state;
} }
public ControlsState getHandlerState(){
return state;
}
public ControlsState getState(){ public ControlsState getState(){
return state; return state;

View File

@ -18,8 +18,8 @@ import electrosphere.engine.loadingthreads.LoadingThread;
import electrosphere.game.config.UserSettings; import electrosphere.game.config.UserSettings;
import electrosphere.game.server.world.MacroData; import electrosphere.game.server.world.MacroData;
import electrosphere.logger.LoggerInterface; import electrosphere.logger.LoggerInterface;
import electrosphere.menu.ImGuiWindowMacros;
import electrosphere.renderer.RenderingEngine; import electrosphere.renderer.RenderingEngine;
import electrosphere.renderer.ui.imgui.ImGuiWindowMacros;
import electrosphere.server.simulation.MacroSimulation; import electrosphere.server.simulation.MacroSimulation;

View File

@ -177,7 +177,6 @@ public class ClientLoading {
*/ */
Globals.playerCamera = CameraEntityUtils.spawnPlayerEntityTrackingCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,1)); Globals.playerCamera = CameraEntityUtils.spawnPlayerEntityTrackingCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,1));
// Globals.playerCamera = CameraEntityUtils.spawnPlayerEntityAirplaneTrackingCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,1));

View File

@ -62,16 +62,7 @@ public class CameraEntityUtils {
rVal.putData(EntityDataStrings.CAMERA_ORBIT_RADIAL_OFFSET, new Vector3f(0,1,0)); rVal.putData(EntityDataStrings.CAMERA_ORBIT_RADIAL_OFFSET, new Vector3f(0,1,0));
rVal.putData(EntityDataStrings.CAMERA_PITCH, 0.0f); rVal.putData(EntityDataStrings.CAMERA_PITCH, 0.0f);
rVal.putData(EntityDataStrings.CAMERA_YAW, 0.0f); rVal.putData(EntityDataStrings.CAMERA_YAW, 0.0f);
BehaviorTree entityTrackingTree = new BehaviorTree() { Globals.cameraHandler.setTrackPlayerEntity(true);
@Override
public void simulate(float deltaTime) {
if(Globals.playerEntity != null){
Vector3d entityPos = EntityUtils.getPosition(Globals.playerEntity);
CameraEntityUtils.setCameraCenter(rVal, new Vector3f((float)entityPos.x,(float)entityPos.y,(float)entityPos.z).add(getOrbitalCameraRadialOffset(rVal)));
}
}
};
Globals.clientScene.registerBehaviorTree(entityTrackingTree);
return rVal; return rVal;
} }

View File

@ -1,11 +1,16 @@
package electrosphere.renderer.ui.imgui; package electrosphere.menu;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import electrosphere.audio.VirtualAudioSource; import electrosphere.audio.VirtualAudioSource;
import electrosphere.controls.ControlHandler.ControlsState;
import electrosphere.engine.Globals; import electrosphere.engine.Globals;
import electrosphere.entity.EntityUtils;
import electrosphere.renderer.RenderingEngine; import electrosphere.renderer.RenderingEngine;
import electrosphere.renderer.ui.imgui.ImGuiLinePlot;
import electrosphere.renderer.ui.imgui.ImGuiBarPlot;
import electrosphere.renderer.ui.imgui.ImGuiWindow;
import electrosphere.renderer.ui.imgui.ImGuiLinePlot.ImGuiLinePlotDataset; import electrosphere.renderer.ui.imgui.ImGuiLinePlot.ImGuiLinePlotDataset;
import electrosphere.renderer.ui.imgui.ImGuiWindow.ImGuiWindowCallback; import electrosphere.renderer.ui.imgui.ImGuiWindow.ImGuiWindowCallback;
import imgui.ImGui; import imgui.ImGui;
@ -25,24 +30,26 @@ public class ImGuiWindowMacros {
private static ImGuiLinePlot globalFrametimePlot; private static ImGuiLinePlot globalFrametimePlot;
private static Map<String,ImGuiLinePlotDataset> globalFrametimeDatasets; private static Map<String,ImGuiLinePlotDataset> globalFrametimeDatasets;
//server sim time graph
private static ImGuiWindow serverFrametimeWindow;
private static ImGuiBarPlot serverFrametimePlot;
private static double serverFrametimeTrackerStorage = 0;
//audio debug menu //audio debug menu
private static ImGuiWindow audioDebugMenu; private static ImGuiWindow audioDebugMenu;
private static boolean showAllVirtualAudioChildren = false; private static boolean showAllVirtualAudioChildren = false;
private static boolean showMappedVirtualAudioChildren = true; private static boolean showMappedVirtualAudioChildren = true;
//player entity details
private static ImGuiWindow playerEntityWindow;
//fluid details
private static ImGuiWindow fluidWindow;
/** /**
* Initializes imgui windows * Initializes imgui windows
*/ */
public static void initImGuiWindows(){ public static void initImGuiWindows(){
createMainDebugMenu(); createMainDebugMenu();
createFramerateGraph(); createFramerateGraph();
createServerFrametimeGraph();
createAudioDebugMenu(); createAudioDebugMenu();
createPlayerEntityDebugWindow();
createFluidDebugWindow();
} }
/** /**
@ -87,46 +94,12 @@ public class ImGuiWindowMacros {
} }
} }
/**
* Creates a server frametime breakdown graph
*/
private static void createServerFrametimeGraph(){
serverFrametimeWindow = new ImGuiWindow("Server Frametime Graph");
serverFrametimePlot = new ImGuiBarPlot("Server Frametime plot");
serverFrametimeWindow.addElement(serverFrametimePlot);
serverFrametimeWindow.setOpen(false);
RenderingEngine.addImGuiWindow(serverFrametimeWindow);
}
/**
* Starts a tracker for server frametime for a given method
*/
public static void startServerFrametimeTrackerFlame(double startValue){
serverFrametimeTrackerStorage = startValue;
}
/**
* Finishes tracking a single run of a specific method
* @param valueName The name of the method
* @param endValue the end time that the method finished on
*/
public static void clockServerFrametimeTrackerFlame(String valueName, double endValue){
serverFrametimePlot.addToDatapoint(valueName, endValue - serverFrametimeTrackerStorage);
}
/**
* Clears the server frametime values so they can be re-filled
*/
public static void clearServerFrametime(){
serverFrametimePlot.clearDatapoints();
}
/** /**
* Create audio debug menu * Create audio debug menu
*/ */
private static void createAudioDebugMenu(){ private static void createAudioDebugMenu(){
audioDebugMenu = new ImGuiWindow("Audio"); audioDebugMenu = new ImGuiWindow("Audio");
audioDebugMenu.callback = new ImGuiWindowCallback() { audioDebugMenu.setCallback(new ImGuiWindowCallback() {
@Override @Override
public void exec() { public void exec() {
//audio engine details //audio engine details
@ -175,38 +148,84 @@ public class ImGuiWindowMacros {
} }
} }
} }
}; });
audioDebugMenu.setOpen(false); audioDebugMenu.setOpen(false);
RenderingEngine.addImGuiWindow(audioDebugMenu); RenderingEngine.addImGuiWindow(audioDebugMenu);
} }
/**
* Create player entity debug menu
*/
private static void createPlayerEntityDebugWindow(){
playerEntityWindow = new ImGuiWindow("Player Entity");
playerEntityWindow.setCallback(new ImGuiWindowCallback() {
@Override
public void exec() {
//player entity details
ImGui.text("Player Entity Details");
if(Globals.playerEntity != null){
ImGui.text("Position: " + EntityUtils.getPosition(Globals.playerEntity));
}
if(ImGui.button("Toggle Player Camera Lock")){
Globals.cameraHandler.setTrackPlayerEntity(!Globals.cameraHandler.getTrackPlayerEntity());
}
}
});
playerEntityWindow.setOpen(false);
RenderingEngine.addImGuiWindow(playerEntityWindow);
}
/**
* Create fluid debug menu
*/
private static void createFluidDebugWindow(){
fluidWindow = new ImGuiWindow("Fluids");
fluidWindow.setCallback(new ImGuiWindowCallback() {
@Override
public void exec() {
//audio engine details
ImGui.text("Fluids Debug");
if(ImGui.button("Toggle Simulation")){
Globals.serverFluidManager.setSimulate(!Globals.serverFluidManager.getSimulate());;
}
}
});
fluidWindow.setOpen(false);
RenderingEngine.addImGuiWindow(fluidWindow);
}
/** /**
* Inits the main debug menu * Inits the main debug menu
*/ */
private static void createMainDebugMenu(){ private static void createMainDebugMenu(){
mainDebugWindow = new ImGuiWindow("Debug"); mainDebugWindow = new ImGuiWindow("Debug");
mainDebugWindow.callback = new ImGuiWindowCallback() { mainDebugWindow.setCallback(new ImGuiWindowCallback() {
@Override @Override
public void exec() { public void exec() {
//show global framerate line graph //show global framerate line graph
if(ImGui.button("Show Overall Frametime")){ if(ImGui.button("Show Overall Frametime")){
globalFrametimeWindow.setOpen(true); globalFrametimeWindow.setOpen(true);
} }
//show server frametime bar graph
if(ImGui.button("Show Server Frametime Breakdown")){
serverFrametimeWindow.setOpen(true);
}
//show audio debug //show audio debug
if(ImGui.button("Show Audio Debug Menu")){ if(ImGui.button("Show Audio Debug Menu")){
audioDebugMenu.setOpen(true); audioDebugMenu.setOpen(true);
} }
//show audio debug
if(ImGui.button("Show Player Entity Debug Menu")){
playerEntityWindow.setOpen(true);
}
//show fluids debug
if(ImGui.button("Show Fluids Debug Menu")){
fluidWindow.setOpen(true);
}
//close button //close button
if(ImGui.button("Close")){ if(ImGui.button("Close")){
mainDebugWindow.setOpen(false); mainDebugWindow.setOpen(false);
} }
} }
}; });
RenderingEngine.addImGuiWindow(mainDebugWindow); RenderingEngine.addImGuiWindow(mainDebugWindow);
} }

View File

@ -47,7 +47,11 @@ public class MenuGeneratorsInGame {
div.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ div.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false); WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false);
Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); if(Globals.cameraHandler.getTrackPlayerEntity()){
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
} else {
Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_FREE_CAMERA);
}
Globals.controlHandler.hideMouse(); Globals.controlHandler.hideMouse();
return false; return false;
}}); }});
@ -68,7 +72,11 @@ public class MenuGeneratorsInGame {
backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false); WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false);
Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); if(Globals.cameraHandler.getTrackPlayerEntity()){
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
} else {
Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_FREE_CAMERA);
}
Globals.controlHandler.hideMouse(); Globals.controlHandler.hideMouse();
return false; return false;
}}); }});

View File

@ -6,8 +6,8 @@ import electrosphere.engine.Main;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.Scene; import electrosphere.entity.Scene;
import electrosphere.entity.types.hitbox.HitboxManager; import electrosphere.entity.types.hitbox.HitboxManager;
import electrosphere.menu.ImGuiWindowMacros;
import electrosphere.net.parser.net.message.NetworkMessage; import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.renderer.ui.imgui.ImGuiWindowMacros;
import electrosphere.server.datacell.interfaces.DataCellManager; import electrosphere.server.datacell.interfaces.DataCellManager;
import java.util.HashSet; import java.util.HashSet;
@ -156,15 +156,10 @@ public class Realm {
* Tells the data cell manager to simulate all loaded cells * Tells the data cell manager to simulate all loaded cells
*/ */
protected void simulate(){ protected void simulate(){
ImGuiWindowMacros.clearServerFrametime();
//simulate bullet physics engine step //simulate bullet physics engine step
ImGuiWindowMacros.startServerFrametimeTrackerFlame(System.currentTimeMillis());
collisionEngine.simulatePhysics((float)Globals.timekeeper.getSimFrameTime()); collisionEngine.simulatePhysics((float)Globals.timekeeper.getSimFrameTime());
ImGuiWindowMacros.clockServerFrametimeTrackerFlame("physics", System.currentTimeMillis());
//main simulation //main simulation
ImGuiWindowMacros.startServerFrametimeTrackerFlame(System.currentTimeMillis());
dataCellManager.simulate(); dataCellManager.simulate();
ImGuiWindowMacros.clockServerFrametimeTrackerFlame("simulate", System.currentTimeMillis());
//data cell manager update misc variables (player positions, unload not-in-use cells) //data cell manager update misc variables (player positions, unload not-in-use cells)
if(dataCellManager != null){ if(dataCellManager != null){
dataCellManager.unloadPlayerlessChunks(); dataCellManager.unloadPlayerlessChunks();

View File

@ -58,6 +58,9 @@ public class ServerFluidManager {
//the terrain manager associated //the terrain manager associated
ServerTerrainManager serverTerrainManager; ServerTerrainManager serverTerrainManager;
//controls whether fluid simulation should actually happen or not
boolean simulate = true;
/** /**
@ -292,12 +295,26 @@ public class ServerFluidManager {
* Simulates a chunk * Simulates a chunk
*/ */
public boolean simulate(int worldX, int worldY, int worldZ){ public boolean simulate(int worldX, int worldY, int worldZ){
ServerFluidChunk fluidChunk = this.getChunk(worldX, worldY, worldZ); if(simulate){
ServerTerrainChunk terrainChunk = this.serverTerrainManager.getChunk(worldX, worldY, worldZ); ServerFluidChunk fluidChunk = this.getChunk(worldX, worldY, worldZ);
if(fluidChunk != null && terrainChunk != null && this.serverFluidSimulator != null){ ServerTerrainChunk terrainChunk = this.serverTerrainManager.getChunk(worldX, worldY, worldZ);
return this.serverFluidSimulator.simulate(fluidChunk,terrainChunk,worldX,worldY,worldZ); if(fluidChunk != null && terrainChunk != null && this.serverFluidSimulator != null){
return this.serverFluidSimulator.simulate(fluidChunk,terrainChunk,worldX,worldY,worldZ);
}
} }
return false; return false;
} }
//getter for simulate
public boolean getSimulate(){
return simulate;
}
//setter for simulate
public void setSimulate(boolean simulate){
this.simulate = simulate;
}
} }