From 60feb2ed5956b7dd04283c3a1320b86a6a3faa97 Mon Sep 17 00:00:00 2001 From: austin Date: Wed, 4 Jun 2025 17:10:47 -0400 Subject: [PATCH] ServerGroundMovementTree value fix --- docs/src/progress/renderertodo.md | 4 +- .../electrosphere/engine/time/Timekeeper.java | 54 +++++++++++++------ .../groundmove/ServerGroundMovementTree.java | 7 +-- .../ai/nodes/plan/MacroPathfindingNode.java | 6 ++- 4 files changed, 48 insertions(+), 23 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 1120408e..03859916 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -2103,11 +2103,13 @@ ServerGroundMovementTree geom work ServerLODComponent replaces bodies with geometries instead of just destroying the geometries -(06/04/2025) +(06/01/2025 - 06/04/2025) Fix rebase world origin routine Non-rigid-body collidables behave as expected Fix physics performance issues +(06/04/2025) +ServerGroundMovementTree actually moves collidable-based entities diff --git a/src/main/java/electrosphere/engine/time/Timekeeper.java b/src/main/java/electrosphere/engine/time/Timekeeper.java index 139c5284..1e11ca9d 100644 --- a/src/main/java/electrosphere/engine/time/Timekeeper.java +++ b/src/main/java/electrosphere/engine/time/Timekeeper.java @@ -9,34 +9,54 @@ import electrosphere.engine.EngineState; */ public class Timekeeper { - //the time a single simulation frame should simulate for (this is fixed) - double simFrameTime = 0.0; + /** + * the time a single simulation frame should simulate for (this is fixed) + */ + private double simFrameTime = 0.0; - //the time that the system started (0 if using glfw reference, current system time if using java reference) - double engineStartTime = 0.0; + /** + * the time that the system started (0 if using glfw reference, current system time if using java reference) + */ + private double engineStartTime = 0.0; - //the system time at the last call to update() - double currentTime = 0.0; + /** + * the system time at the last call to update() + */ + private double currentTime = 0.0; - //accumulates time between current frame and next frame - double frameAccumulator = 0.0; + /** + * accumulates time between current frame and next frame + */ + private double frameAccumulator = 0.0; - //the number of frames that have elapsed - long numberOfSimFramesElapsed = 0; + /** + * the number of frames that have elapsed + */ + private long numberOfSimFramesElapsed = 0; - //the number of times the render pipeline has rendered a frame + /** + * the number of times the render pipeline has rendered a frame + */ public long numberOfRenderedFrames = 0; - //the raw (not simulation) frametime of the most recent frame - double mostRecentRawFrametime = 0; + /** + * the raw (not simulation) frametime of the most recent frame + */ + private double mostRecentRawFrametime = 0; - //The maximum amount of time that can overflow (ie cause more than one sim frame/render frame) before the sim frames are tossed out - static double overflowMax = 20; + /** + * The maximum amount of time that can overflow (ie cause more than one sim frame/render frame) before the sim frames are tossed out + */ + private static double overflowMax = 20; - //the maximum number of simulation frames that can happen in a row before the main loop immediately skips more + /** + * the maximum number of simulation frames that can happen in a row before the main loop immediately skips more + */ public static final int SIM_FRAME_HARDCAP = 3; - //step interval time size (for physics) + /** + * step interval time size (for physics) + */ public static final float ENGINE_STEP_SIZE = 0.01f; diff --git a/src/main/java/electrosphere/entity/state/movement/groundmove/ServerGroundMovementTree.java b/src/main/java/electrosphere/entity/state/movement/groundmove/ServerGroundMovementTree.java index 8d623b5c..f7333b49 100644 --- a/src/main/java/electrosphere/entity/state/movement/groundmove/ServerGroundMovementTree.java +++ b/src/main/java/electrosphere/entity/state/movement/groundmove/ServerGroundMovementTree.java @@ -10,6 +10,7 @@ import electrosphere.collision.PhysicsEntityUtils; import electrosphere.collision.collidable.Collidable; import electrosphere.data.entity.creature.movement.GroundMovementSystem; import electrosphere.engine.Globals; +import electrosphere.engine.time.Timekeeper; import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.Entity; import electrosphere.entity.EntityDataStrings; @@ -291,7 +292,7 @@ public class ServerGroundMovementTree implements BehaviorTree { } if(body == null){ Vector3d velVec = new Vector3d(movementVector); - velVec.mul(velocity * Globals.engineState.timekeeper.getSimFrameTime()); + velVec.mul(velocity * Globals.engineState.timekeeper.getSimFrameTime() * Timekeeper.ENGINE_STEP_SIZE); velVec.add(position); ServerEntityUtils.repositionEntity(parent, velVec); } else { @@ -343,7 +344,7 @@ public class ServerGroundMovementTree implements BehaviorTree { float velocity = this.getModifiedVelocity(); if(body == null){ Vector3d velVec = new Vector3d(movementVector); - velVec.mul(velocity * Globals.engineState.timekeeper.getSimFrameTime()); + velVec.mul(velocity * Globals.engineState.timekeeper.getSimFrameTime() * Timekeeper.ENGINE_STEP_SIZE); velVec.add(position); ServerEntityUtils.repositionEntity(parent, velVec); } else { @@ -414,7 +415,7 @@ public class ServerGroundMovementTree implements BehaviorTree { } if(body == null){ Vector3d velVec = new Vector3d(movementVector); - velVec.mul(velocity * Globals.engineState.timekeeper.getSimFrameTime()); + velVec.mul(velocity * Globals.engineState.timekeeper.getSimFrameTime() * Timekeeper.ENGINE_STEP_SIZE); velVec.add(position); ServerEntityUtils.repositionEntity(parent, velVec); } else { diff --git a/src/main/java/electrosphere/server/ai/nodes/plan/MacroPathfindingNode.java b/src/main/java/electrosphere/server/ai/nodes/plan/MacroPathfindingNode.java index 87937d56..e88ce816 100644 --- a/src/main/java/electrosphere/server/ai/nodes/plan/MacroPathfindingNode.java +++ b/src/main/java/electrosphere/server/ai/nodes/plan/MacroPathfindingNode.java @@ -146,8 +146,10 @@ public class MacroPathfindingNode implements AITreeNode { targetPos = (Vector3d)targetRaw; } else if(targetRaw instanceof Entity){ targetPos = new Vector3d(EntityUtils.getPosition((Entity)targetRaw)); - } else if(targetRaw instanceof VirtualStructure){ - targetPos = ((VirtualStructure)targetRaw).getPos(); + } else if(targetRaw instanceof VirtualStructure struct){ + targetPos = struct.getPos(); + } else if(targetRaw instanceof MacroRegion region){ + targetPos = region.getPos(); } else { throw new Error("Unsupported target type " + targetRaw); }