From 341d5683cfd26a1fc8a16a9bf0c780aca1383169 Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 12 May 2024 12:42:12 -0400 Subject: [PATCH] camera movement work + freecam terrain editing --- .../dungeons/dungeonsindex.md | 5 +++ .../highlevel-design/highleveldesignindex.md | 3 +- docs/src/progress/renderertodo.md | 9 ++++ .../controls/ControlHandler.java | 42 ++++++++++++++++--- .../groundmove/GroundMovementTree.java | 15 +++++++ .../groundmove/ServerGroundMovementTree.java | 15 +++++++ .../electrosphere/logger/LoggerInterface.java | 2 +- .../pipelines/FirstPersonItemsPipeline.java | 13 ++++++ 8 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 docs/src/highlevel-design/dungeons/dungeonsindex.md create mode 100644 src/main/java/electrosphere/renderer/pipelines/FirstPersonItemsPipeline.java diff --git a/docs/src/highlevel-design/dungeons/dungeonsindex.md b/docs/src/highlevel-design/dungeons/dungeonsindex.md new file mode 100644 index 00000000..62243ed2 --- /dev/null +++ b/docs/src/highlevel-design/dungeons/dungeonsindex.md @@ -0,0 +1,5 @@ +@page dungeonsindex Dungeons + +Enforce slower walking speed in dungeons (to give movement a more deliberate and weighty feel) + - Slower movement will also help with weapons feel more impactful +Have the engine generate different types of shortcuts to allow you to quickly navigate up/down to the uncleared floors diff --git a/docs/src/highlevel-design/highleveldesignindex.md b/docs/src/highlevel-design/highleveldesignindex.md index e1e14623..d121e9ec 100644 --- a/docs/src/highlevel-design/highleveldesignindex.md +++ b/docs/src/highlevel-design/highleveldesignindex.md @@ -17,4 +17,5 @@ Discussion of, at a high game-design level, how everything should work and conne - @subpage fluidindex - @subpage locomotion - @subpage economicsindex -- @subpage structuresandbuildings \ No newline at end of file +- @subpage structuresandbuildings +- @subpage dungeonsindex \ No newline at end of file diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 285ea923..e8e27c07 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -275,6 +275,15 @@ First Person Camera # TODO +First person render pipeline + - Dedicated client scene + - Properly compositing onto main texture + - Potentially look at storing the framebuffer for the pipeline in the pipeline class itself + +Overhaul of 'attach' semantics + - Having different types of attach tree propagation + - Ability to turn on/off combinations of models at will (already exists, but needs review) + Character movement in particular feels off - Bring back strafing - Fix interaction with networking diff --git a/src/main/java/electrosphere/controls/ControlHandler.java b/src/main/java/electrosphere/controls/ControlHandler.java index c16f6ba2..c9eb254d 100644 --- a/src/main/java/electrosphere/controls/ControlHandler.java +++ b/src/main/java/electrosphere/controls/ControlHandler.java @@ -1215,20 +1215,50 @@ public class ControlHandler { freeCameraControlList.add(controls.get(FREECAM_FORWARD)); - controls.get(FREECAM_FORWARD).setOnRepeat(new ControlMethod(){public void execute(){ + ControlMethod freeCamForwardCallback = 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)); + playerCameraCenterPos.add(new Vector3f(playerCameraEyePos).normalize().mul(-0.1f)); CameraEntityUtils.setCameraCenter(Globals.playerCamera,playerCameraCenterPos); - }}); + }}; + controls.get(FREECAM_FORWARD).setOnClick(freeCamForwardCallback); + controls.get(FREECAM_FORWARD).setOnRepeat(freeCamForwardCallback); freeCameraControlList.add(controls.get(FREECAM_BACKWARD)); - controls.get(FREECAM_BACKWARD).setOnRepeat(new ControlMethod(){public void execute(){ + ControlMethod freeCamBackwardCallback = 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)); + playerCameraCenterPos.add(new Vector3f(playerCameraEyePos).normalize().mul(0.1f)); CameraEntityUtils.setCameraCenter(Globals.playerCamera,playerCameraCenterPos); - }}); + }}; + controls.get(FREECAM_BACKWARD).setOnClick(freeCamBackwardCallback); + controls.get(FREECAM_BACKWARD).setOnRepeat(freeCamBackwardCallback); + + freeCameraControlList.add(controls.get(FREECAM_LEFT)); + ControlMethod freeCamLeftCallback = new ControlMethod(){public void execute(){ + Vector3f playerCameraCenterPos = CameraEntityUtils.getCameraCenter(Globals.playerCamera); + Vector3f playerCameraEyePos = CameraEntityUtils.getCameraEye(Globals.playerCamera); + Vector3f modifiedVec = new Vector3f(playerCameraEyePos.x,0,playerCameraEyePos.z).rotateY((float)(-90 * Math.PI / 180)).normalize(); + playerCameraCenterPos.add(new Vector3f(modifiedVec).mul(0.1f)); + CameraEntityUtils.setCameraCenter(Globals.playerCamera,playerCameraCenterPos); + }}; + controls.get(FREECAM_LEFT).setOnClick(freeCamLeftCallback); + controls.get(FREECAM_LEFT).setOnRepeat(freeCamLeftCallback); + + freeCameraControlList.add(controls.get(FREECAM_RIGHT)); + ControlMethod freeCamRightCallback = new ControlMethod(){public void execute(){ + Vector3f playerCameraCenterPos = CameraEntityUtils.getCameraCenter(Globals.playerCamera); + Vector3f playerCameraEyePos = CameraEntityUtils.getCameraEye(Globals.playerCamera); + Vector3f modifiedVec = new Vector3f(playerCameraEyePos.x,0,playerCameraEyePos.z).rotateY((float)(90 * Math.PI / 180)).normalize(); + playerCameraCenterPos.add(new Vector3f(modifiedVec).mul(0.1f)); + CameraEntityUtils.setCameraCenter(Globals.playerCamera,playerCameraCenterPos); + }}; + controls.get(FREECAM_RIGHT).setOnClick(freeCamRightCallback); + controls.get(FREECAM_RIGHT).setOnRepeat(freeCamRightCallback); + + //terrain controls -- these should have already been defined in the main game controls section + freeCameraControlList.add(controls.get(INPUT_CODE_PLACE_TERRAIN)); + freeCameraControlList.add(controls.get(INPUT_CODE_REMOVE_TERRAIN)); freeCameraControlList.add(controls.get(FREECAM_MOUSE)); controls.get(FREECAM_MOUSE).setOnMove(new Control.MouseCallback(){public void execute(MouseEvent event){ diff --git a/src/main/java/electrosphere/entity/state/movement/groundmove/GroundMovementTree.java b/src/main/java/electrosphere/entity/state/movement/groundmove/GroundMovementTree.java index aa9843d1..ead4a50f 100644 --- a/src/main/java/electrosphere/entity/state/movement/groundmove/GroundMovementTree.java +++ b/src/main/java/electrosphere/entity/state/movement/groundmove/GroundMovementTree.java @@ -287,6 +287,11 @@ public class GroundMovementTree implements BehaviorTree { } CreatureUtils.setVelocity(parent, velocity); //actually update + // body.addForce( + // movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), + // linearVelocity.get1(), + // movementVector.z * velocity * Globals.timekeeper.getSimFrameTime() + // ); body.setLinearVel( movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), linearVelocity.get1(), @@ -316,6 +321,11 @@ public class GroundMovementTree implements BehaviorTree { velocity = maxNaturalVelocity; CreatureUtils.setVelocity(parent, velocity); } + // body.addForce( + // movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), + // linearVelocity.get1(), + // movementVector.z * velocity * Globals.timekeeper.getSimFrameTime() + // ); body.setLinearVel( movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), linearVelocity.get1(), @@ -354,6 +364,11 @@ public class GroundMovementTree implements BehaviorTree { } } CreatureUtils.setVelocity(parent, velocity); + // body.addForce( + // movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), + // linearVelocity.get1(), + // movementVector.z * velocity * Globals.timekeeper.getSimFrameTime() + // ); body.setLinearVel( movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), linearVelocity.get1(), 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 9137efc7..a99caf1d 100644 --- a/src/main/java/electrosphere/entity/state/movement/groundmove/ServerGroundMovementTree.java +++ b/src/main/java/electrosphere/entity/state/movement/groundmove/ServerGroundMovementTree.java @@ -274,6 +274,11 @@ public class ServerGroundMovementTree implements BehaviorTree { } CreatureUtils.setVelocity(parent, velocity); // //actually update + // PhysicsEntityUtils.getDBody(parent).addForce( + // movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), + // linearVelocity.get1(), + // movementVector.z * velocity * Globals.timekeeper.getSimFrameTime() + // ); PhysicsEntityUtils.getDBody(parent).setLinearVel( movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), linearVelocity.get1(), @@ -319,6 +324,11 @@ public class ServerGroundMovementTree implements BehaviorTree { velocity = maxNaturalVelocity; CreatureUtils.setVelocity(parent, velocity); } + // PhysicsEntityUtils.getDBody(parent).addForce( + // movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), + // linearVelocity.get1(), + // movementVector.z * velocity * Globals.timekeeper.getSimFrameTime() + // ); PhysicsEntityUtils.getDBody(parent).setLinearVel( movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), linearVelocity.get1(), @@ -373,6 +383,11 @@ public class ServerGroundMovementTree implements BehaviorTree { } } CreatureUtils.setVelocity(parent, velocity); + // PhysicsEntityUtils.getDBody(parent).addForce( + // movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), + // linearVelocity.get1(), + // movementVector.z * velocity * Globals.timekeeper.getSimFrameTime() + // ); PhysicsEntityUtils.getDBody(parent).setLinearVel( movementVector.x * velocity * Globals.timekeeper.getSimFrameTime(), linearVelocity.get1(), diff --git a/src/main/java/electrosphere/logger/LoggerInterface.java b/src/main/java/electrosphere/logger/LoggerInterface.java index a57827cc..2ebb3cf4 100644 --- a/src/main/java/electrosphere/logger/LoggerInterface.java +++ b/src/main/java/electrosphere/logger/LoggerInterface.java @@ -26,7 +26,7 @@ public class LoggerInterface { */ public static void initLoggers(){ loggerStartup = new Logger(LogLevel.WARNING); - loggerNetworking = new Logger(LogLevel.WARNING); + loggerNetworking = new Logger(LogLevel.DEBUG); loggerFileIO = new Logger(LogLevel.WARNING); loggerGameLogic = new Logger(LogLevel.WARNING); loggerRenderer = new Logger(LogLevel.WARNING); diff --git a/src/main/java/electrosphere/renderer/pipelines/FirstPersonItemsPipeline.java b/src/main/java/electrosphere/renderer/pipelines/FirstPersonItemsPipeline.java new file mode 100644 index 00000000..081089c2 --- /dev/null +++ b/src/main/java/electrosphere/renderer/pipelines/FirstPersonItemsPipeline.java @@ -0,0 +1,13 @@ +package electrosphere.renderer.pipelines; + +import electrosphere.renderer.OpenGLState; +import electrosphere.renderer.RenderPipelineState; + +public class FirstPersonItemsPipeline implements RenderPipeline { + + @Override + public void render(OpenGLState openGLState, RenderPipelineState renderPipelineState) { + //todo, render hands to a screenbuffer + } + +}