From 168257e92c9bfa7bd531b19734a6a1bf0de30367 Mon Sep 17 00:00:00 2001 From: okseby Date: Wed, 31 May 2023 19:11:43 -0400 Subject: [PATCH] Add camera movement. --- res/textures/grassblock.jpg | Bin 0 -> 20480 bytes src/main/java/com/okseby/core/Camera.java | 49 ++++++++ .../java/com/okseby/core/EngineManager.java | 10 +- src/main/java/com/okseby/core/Launcher.java | 2 +- .../java/com/okseby/core/RenderManager.java | 6 +- .../java/com/okseby/core/WindowManager.java | 13 ++- .../java/com/okseby/core/test/TestGame.java | 108 ++++++++++++------ .../com/okseby/core/utils/Transformation.java | 17 +++ src/main/resources/shaders/vertex.vs | 4 +- 9 files changed, 161 insertions(+), 48 deletions(-) create mode 100644 res/textures/grassblock.jpg create mode 100644 src/main/java/com/okseby/core/Camera.java diff --git a/res/textures/grassblock.jpg b/res/textures/grassblock.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f87254fcc106dc8a66e6d8a40051f170a353926 GIT binary patch literal 20480 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 RhyMRV|No)?|9{f|{|5&&NM8T| literal 0 HcmV?d00001 diff --git a/src/main/java/com/okseby/core/Camera.java b/src/main/java/com/okseby/core/Camera.java new file mode 100644 index 0000000..3191732 --- /dev/null +++ b/src/main/java/com/okseby/core/Camera.java @@ -0,0 +1,49 @@ +package com.okseby.core; + +import lombok.Getter; +import org.joml.Vector3f; + +public class Camera { + @Getter private Vector3f position, rotation; + + public Camera() { + position = new Vector3f(0, 0, 0); + rotation = new Vector3f(0, 0, 0); + } + + public Camera(Vector3f position, Vector3f rotation) { + this.position = position; + this.rotation = rotation; + } + + public void movePosition(float x, float y, float z) { + if (z != 0) { + position.x += (float) Math.sin(Math.toRadians(rotation.y)) * -1.0f * z; + position.z += (float) Math.cos(Math.toRadians(rotation.y)) * z; + } + if (x != 0) { + position.x += (float) Math.sin(Math.toRadians(rotation.y - 90)) * -1.0f * x; + position.z += (float) Math.cos(Math.toRadians(rotation.y - 90)) * x; + } + + position.y += y; + } + + public void setPosition(float x, float y, float z) { + this.position.x = x; + this.position.y = y; + this.position.z = z; + } + + public void setRotation(float x, float y, float z) { + this.rotation.x = x; + this.rotation.y = y; + this.rotation.z = z; + } + + public void incrementRotation(float x, float y, float z) { + this.rotation.x += x; + this.rotation.y += y; + this.rotation.z += z; + } +} diff --git a/src/main/java/com/okseby/core/EngineManager.java b/src/main/java/com/okseby/core/EngineManager.java index 1970777..d9df245 100644 --- a/src/main/java/com/okseby/core/EngineManager.java +++ b/src/main/java/com/okseby/core/EngineManager.java @@ -5,11 +5,11 @@ import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFWErrorCallback; public class EngineManager { - public static final long NANOSECOND = 1000000000; - public static final float FRAMERATE = 1000; + public static final long nanosecond = 1000000000; + public static final float framerate = 1000; private static int fps; - private static float frametime = 1.0f / FRAMERATE; + private static float frametime = 1.0f / framerate; private boolean isRunning; @@ -49,7 +49,7 @@ public class EngineManager { long passedTime = startTime - lastTime; lastTime = startTime; - unprocessedTime += passedTime / (double) NANOSECOND; + unprocessedTime += passedTime / (double) nanosecond; frameCounter += passedTime; input(); @@ -61,7 +61,7 @@ public class EngineManager { if (window.windowShouldClose()) stop(); - if (frameCounter >= NANOSECOND) { + if (frameCounter >= nanosecond) { setFps(frames); window.setTitle(Constants.title + " - FPS: " + getFps()); diff --git a/src/main/java/com/okseby/core/Launcher.java b/src/main/java/com/okseby/core/Launcher.java index 258767e..b47ec22 100644 --- a/src/main/java/com/okseby/core/Launcher.java +++ b/src/main/java/com/okseby/core/Launcher.java @@ -13,7 +13,7 @@ public class Launcher { public static void main(String[] args) { System.out.println("LWJGL Version: " + Version.getVersion()); - window = new WindowManager(Constants.title, 1600, 900, false); + window = new WindowManager(Constants.title, 1600, 900, true); game = new TestGame(); EngineManager engine = new EngineManager(); diff --git a/src/main/java/com/okseby/core/RenderManager.java b/src/main/java/com/okseby/core/RenderManager.java index 2db9e1f..129b8ef 100644 --- a/src/main/java/com/okseby/core/RenderManager.java +++ b/src/main/java/com/okseby/core/RenderManager.java @@ -27,15 +27,19 @@ public class RenderManager { shader.createUniform("textureSampler"); shader.createUniform("transformationMatrix"); + shader.createUniform("projectionMatrix"); + shader.createUniform("viewMatrix"); } - public void render(Entity entity) { + public void render(Entity entity, Camera camera) { clear(); shader.bind(); shader.setUniform("textureSampler", 0); shader.setUniform("transformationMatrix", Transformation.createTransformationMatrix(entity)); + shader.setUniform("projectionMatrix", window.updateProjectionMatrix()); + shader.setUniform("viewMatrix", Transformation.getViewMatrix(camera)); GL30.glBindVertexArray(entity.getModel().getId()); GL20.glEnableVertexAttribArray(0); diff --git a/src/main/java/com/okseby/core/WindowManager.java b/src/main/java/com/okseby/core/WindowManager.java index 48f1faf..735caa6 100644 --- a/src/main/java/com/okseby/core/WindowManager.java +++ b/src/main/java/com/okseby/core/WindowManager.java @@ -11,9 +11,9 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.system.MemoryUtil; public class WindowManager { - public static final float FOV = (float) Math.toRadians(60); - public static final float Z_NEAR = 0.01f; - public static final float Z_FAR = 1000f; + public static final float fov = (float) Math.toRadians(60); + public static final float zNear = 0.01f; + public static final float zFar = 1000f; @Getter private String title; @Getter private long window; @@ -90,8 +90,9 @@ public class WindowManager { GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glEnable(GL11.GL_STENCIL_TEST); + /* Culling disabled as it stops faces from rendering that should be GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glCullFace(GL11.GL_BACK); + GL11.glCullFace(GL11.GL_BACK); */ } public void update() { @@ -121,11 +122,11 @@ public class WindowManager { public Matrix4f updateProjectionMatrix() { float aspectRatio = (float) width / height; - return projectionMatrix.setPerspective(FOV, aspectRatio, Z_NEAR, Z_FAR); + return projectionMatrix.setPerspective(fov, aspectRatio, zNear, zFar); } public Matrix4f updateProjectionMatrix(Matrix4f matrix) { float aspectRatio = (float) width / height; - return matrix.setPerspective(FOV, aspectRatio, Z_NEAR, Z_FAR); + return matrix.setPerspective(fov, aspectRatio, zNear, zFar); } } diff --git a/src/main/java/com/okseby/core/test/TestGame.java b/src/main/java/com/okseby/core/test/TestGame.java index db52932..47b3222 100644 --- a/src/main/java/com/okseby/core/test/TestGame.java +++ b/src/main/java/com/okseby/core/test/TestGame.java @@ -9,19 +9,23 @@ import org.lwjgl.glfw.GLFW; import org.lwjgl.opengl.GL11; public class TestGame implements ILogic { - private int direction = 0; - private float color = 0.0f; + private static final float cameraMoveSpeed = 0.05f; private final RenderManager renderer; private final ObjectLoader loader; private final WindowManager window; private Entity entity; + private Camera camera; + + Vector3f cameraInc; public TestGame() { renderer = new RenderManager(); window = Launcher.getWindow(); loader = new ObjectLoader(); + camera = new Camera(); + cameraInc = new Vector3f(0, 0, 0); } @Override @@ -29,51 +33,87 @@ public class TestGame implements ILogic { renderer.init(); float[] vertices = { - -0.5f, 0.5f, 0f, - -0.5f, -0.5f, 0f, - 0.5f, -0.5f, 0f, - 0.5f, 0.5f, 0f, - }; - - int[] indices = { - 0, 1, 3, - 3, 1, 2 + -0.5f, 0.5f, 0.5f, + -0.5f, -0.5f, 0.5f, + 0.5f, -0.5f, 0.5f, + 0.5f, 0.5f, 0.5f, + -0.5f, 0.5f, -0.5f, + 0.5f, 0.5f, -0.5f, + -0.5f, -0.5f, -0.5f, + 0.5f, -0.5f, -0.5f, + -0.5f, 0.5f, -0.5f, + 0.5f, 0.5f, -0.5f, + -0.5f, 0.5f, 0.5f, + 0.5f, 0.5f, 0.5f, + 0.5f, 0.5f, 0.5f, + 0.5f, -0.5f, 0.5f, + -0.5f, 0.5f, 0.5f, + -0.5f, -0.5f, 0.5f, + -0.5f, -0.5f, -0.5f, + 0.5f, -0.5f, -0.5f, + -0.5f, -0.5f, 0.5f, + 0.5f, -0.5f, 0.5f, }; float[] textureCoordinates = { - 0, 0, - 0, 1, - 1, 1, - 1, 0 + 0.0f, 0.0f, + 0.0f, 0.5f, + 0.5f, 0.5f, + 0.5f, 0.0f, + 0.0f, 0.0f, + 0.5f, 0.0f, + 0.0f, 0.5f, + 0.5f, 0.5f, + 0.0f, 0.5f, + 0.5f, 0.5f, + 0.0f, 1.0f, + 0.5f, 1.0f, + 0.0f, 0.0f, + 0.0f, 0.5f, + 0.5f, 0.0f, + 0.5f, 0.5f, + 0.5f, 0.0f, + 1.0f, 0.0f, + 0.5f, 0.5f, + 1.0f, 0.5f, + }; + + int[] indices = { + 0, 1, 3, 3, 1, 2, + 8, 10, 11, 9, 8, 11, + 12, 13, 7, 5, 12, 7, + 14, 15, 6, 4, 14, 6, + 16, 18, 19, 17, 16, 19, + 4, 6, 7, 5, 4, 7, }; Model model = loader.loadModel(vertices, textureCoordinates, indices); - model.setTexture(new Texture(loader.loadTexture("res/textures/grassblock.png"))); + model.setTexture(new Texture(loader.loadTexture("res/textures/grassblock.jpg"))); - entity = new Entity(model, new Vector3f(1, 0, 0), new Vector3f(0, 0, 0), 1); + entity = new Entity(model, new Vector3f(0, 0, -5), new Vector3f(0, 0, 0), 1); } @Override public void input() { - if (window.isKeyPressed(GLFW.GLFW_KEY_UP)) - direction = 1; - else if (window.isKeyPressed(GLFW.GLFW_KEY_DOWN)) - direction = -1; - else - direction = 0; + cameraInc.set(0, 0, 0); + if (window.isKeyPressed(GLFW.GLFW_KEY_W)) + cameraInc.z = -1; + if (window.isKeyPressed(GLFW.GLFW_KEY_A)) + cameraInc.x = 1; + if (window.isKeyPressed(GLFW.GLFW_KEY_S)) + cameraInc.z = 1; + if (window.isKeyPressed(GLFW.GLFW_KEY_D)) + cameraInc.x = -1; + if (window.isKeyPressed(GLFW.GLFW_KEY_Z)) + cameraInc.y = 1; + if (window.isKeyPressed(GLFW.GLFW_KEY_X)) + cameraInc.y = -1; } @Override public void update() { - color += direction * 0.01f; - if (color > 1) - color = 1.0f; - else if (color <= 0) - color = 0.0f; - - if (entity.getPosition().x < -1.5f) - entity.getPosition().x = 1.5f; - entity.getPosition().x -= 0.01f; + camera.movePosition(cameraInc.x * cameraMoveSpeed, cameraInc.y * cameraMoveSpeed, cameraInc.z * cameraMoveSpeed); + entity.incrementRotation(0.0f, 0.5f, 0.0f); } @Override @@ -83,8 +123,8 @@ public class TestGame implements ILogic { window.setResizeable(true); } - window.setClearColor(color, color, color, 0.0f); - renderer.render(entity); + window.setClearColor(0.0f, 0.0f, 0.0f, 0.0f); + renderer.render(entity, camera); } @Override diff --git a/src/main/java/com/okseby/core/utils/Transformation.java b/src/main/java/com/okseby/core/utils/Transformation.java index fd8640e..61f50b4 100644 --- a/src/main/java/com/okseby/core/utils/Transformation.java +++ b/src/main/java/com/okseby/core/utils/Transformation.java @@ -1,7 +1,9 @@ package com.okseby.core.utils; +import com.okseby.core.Camera; import com.okseby.core.entity.Entity; import org.joml.Matrix4f; +import org.joml.Vector3f; public class Transformation { public static Matrix4f createTransformationMatrix(Entity entity) { @@ -15,4 +17,19 @@ public class Transformation { return matrix; } + + public static Matrix4f getViewMatrix(Camera camera) { + Vector3f position = camera.getPosition(); + Vector3f rotation = camera.getRotation(); + Matrix4f matrix = new Matrix4f(); + + matrix.identity(); + matrix.rotate((float) Math.toRadians(rotation.x), new Vector3f(1, 0, 0)). + rotate((float) Math.toRadians(rotation.y), new Vector3f(0, 1, 0)). + rotate((float) Math.toRadians(rotation.z), new Vector3f(0, 0, 1)); + + matrix.translate(-position.x, -position.y, -position.z); + + return matrix; + } } diff --git a/src/main/resources/shaders/vertex.vs b/src/main/resources/shaders/vertex.vs index 73d9ef7..4ec47f0 100644 --- a/src/main/resources/shaders/vertex.vs +++ b/src/main/resources/shaders/vertex.vs @@ -6,8 +6,10 @@ in vec2 textureCoordinates; out vec2 fragmentTextureCoordinates; uniform mat4 transformationMatrix; +uniform mat4 projectionMatrix; +uniform mat4 viewMatrix; void main() { - gl_Position = transformationMatrix * vec4(position, 1.0); + gl_Position = projectionMatrix * viewMatrix * transformationMatrix * vec4(position, 1.0); fragmentTextureCoordinates = textureCoordinates; } \ No newline at end of file