From 98b6208c74295c994abe6bf08a2406eff23bb869 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 24 Aug 2023 15:19:32 +0200 Subject: [PATCH] Implementing Rotation of the camera by mouse input --- client/src/main/java/core/engine/Engine.java | 127 +++++++++++++----- .../main/java/core/engine/entity/Camera.java | 28 ++++ 2 files changed, 120 insertions(+), 35 deletions(-) diff --git a/client/src/main/java/core/engine/Engine.java b/client/src/main/java/core/engine/Engine.java index 2c298cb..a8cbba4 100644 --- a/client/src/main/java/core/engine/Engine.java +++ b/client/src/main/java/core/engine/Engine.java @@ -8,12 +8,14 @@ import core.engine.model.TexturedModel; import core.engine.renderer.MasterRenderer; import core.engine.terrain.Terrain; import core.engine.textures.ModelTexture; +import org.lwjgl.BufferUtils; import org.lwjgl.Version; import org.lwjgl.glfw.*; import org.lwjgl.opengl.GL; import org.lwjgl.system.MemoryStack; import utils.vectors.Vector3f; +import java.nio.DoubleBuffer; import java.nio.IntBuffer; import static org.lwjgl.glfw.Callbacks.glfwFreeCallbacks; @@ -30,6 +32,10 @@ public class Engine { private final Loader loader = new Loader(); public static int WINDOW_WIDTH = 1280; public static int WINDOW_HEIGHT = 720; + private static boolean isMouseWheelPressed = false; + private static DoubleBuffer lastCursorX = BufferUtils.createDoubleBuffer(1); + private static DoubleBuffer lastCursorY = BufferUtils.createDoubleBuffer(1); + public Engine() { @@ -112,41 +118,7 @@ public class Engine { glClearColor(1.0f, 0.0f, 0.0f, 0.0f); Camera camera = new Camera(); - GLFWScrollCallback glfwScrollCallback = new GLFWScrollCallback() { - @Override - public void invoke(long window, double xOffset, double yOffset) { - if(yOffset > 0) { - camera.zoomIn(); - } else if(yOffset < 0) { - camera.zoomOut(); - } - } - }; - - glfwSetScrollCallback(window, glfwScrollCallback); - glfwSetKeyCallback(window, glfwKeyCallback = new GLFWKeyCallback() { - @Override - public void invoke(long window, int key, int scancode, int action, int mods) { - if(key == GLFW_KEY_A) { - //move camera to left - camera.moveLeft(); - } - - if(key == GLFW_KEY_D) { - //move camera to right - camera.moveRight(); - } - - if(key == GLFW_KEY_W) { - camera.moveForward(); - } - - if(key == GLFW_KEY_S) { - camera.moveBackward(); - } - } - }); - + input(camera); Light light = new Light(new Vector3f(0,0,-20), new Vector3f(1,1,1)); RawModel model = OBJLoader.loadOBJModel("dragon", loader); @@ -177,4 +149,89 @@ public class Engine { loader.cleanUp(); } + private void input(Camera camera) { + + GLFWScrollCallback glfwScrollCallback = new GLFWScrollCallback() { + @Override + public void invoke(long window, double xOffset, double yOffset) { + if(yOffset > 0) { + camera.zoomIn(); + } else if(yOffset < 0) { + camera.zoomOut(); + } + } + }; + + GLFWMouseButtonCallback glfwMouseButtonCallback = new GLFWMouseButtonCallback() { + @Override + public void invoke(long window, int button, int action, int mods) { + if (button == GLFW.GLFW_MOUSE_BUTTON_MIDDLE && action == GLFW.GLFW_PRESS) { + // Middle mouse button pressed + isMouseWheelPressed = true; + glfwGetCursorPos(window, lastCursorX, lastCursorY); + } else if (button == GLFW.GLFW_MOUSE_BUTTON_MIDDLE && action == GLFW.GLFW_RELEASE) { + // Middle mouse button released + isMouseWheelPressed = false; + } + } + }; + + // Define the cursor position callback function + GLFWCursorPosCallback cursorPosCallback = new GLFWCursorPosCallback() { + @Override + public void invoke(long window, double xpos, double ypos) { + if (isMouseWheelPressed) { + // Calculate the offset + double xOffset = xpos - lastCursorX.get(0); + double yOffset = ypos - lastCursorY.get(0); + + // Use xOffset and yOffset for your desired functionality + if(yOffset > 0) { + camera.decreasePitch(); + } else if(yOffset < 0) { + camera.increasePitch(); + } + + if(xOffset > 0) { + camera.decreaseYaw(); + } else if(xOffset < 0) { + camera.increaseYaw(); + } + + // Update the last cursor position + lastCursorX.put(0, xpos); + lastCursorY.put(0, ypos); + } + } + }; + + glfwSetMouseButtonCallback(window, glfwMouseButtonCallback); + glfwSetCursorPosCallback(window, cursorPosCallback); + + glfwSetScrollCallback(window, glfwScrollCallback); + glfwSetKeyCallback(window, glfwKeyCallback = new GLFWKeyCallback() { + @Override + public void invoke(long window, int key, int scancode, int action, int mods) { + if(key == GLFW_KEY_A) { + //move camera to left + camera.moveLeft(); + } + + if(key == GLFW_KEY_D) { + //move camera to right + camera.moveRight(); + } + + if(key == GLFW_KEY_W) { + camera.moveForward(); + } + + if(key == GLFW_KEY_S) { + camera.moveBackward(); + } + } + }); + + } + } diff --git a/client/src/main/java/core/engine/entity/Camera.java b/client/src/main/java/core/engine/entity/Camera.java index a34383a..0ed6825 100644 --- a/client/src/main/java/core/engine/entity/Camera.java +++ b/client/src/main/java/core/engine/entity/Camera.java @@ -33,6 +33,22 @@ public class Camera { position.y -= 0.5f; } + public void increasePitch() { + this.pitch += .5f; + } + + public void decreasePitch() { + this.pitch -= .5f; + } + + public void increaseYaw() { + this.yaw += 0.5f; + } + + public void decreaseYaw() { + this.yaw -= 0.5f; + } + public Vector3f getPosition() { return position; } @@ -48,4 +64,16 @@ public class Camera { public float getRoll() { return roll; } + + public void setPitch(float pitch) { + this.pitch += pitch; + } + + public void setYaw(float yaw) { + this.yaw += yaw; + } + + public void setRoll(float roll) { + this.roll += roll; + } }