package com.javamarcher.systems; import static org.lwjgl.glfw.GLFW.glfwSetKeyCallback; import static org.lwjgl.glfw.GLFW.glfwSetWindowShouldClose; import org.joml.Vector3f; import org.lwjgl.glfw.GLFW; import com.javamarcher.configuration.GlobalConfig; import com.javamarcher.ecs.component.CameraTransform; import com.javamarcher.input.Input; import com.javamarcher.input.MouseInput; import com.javamarcher.window.MainWindow; import at.fhooe.mtd.ecs.Engine; import at.fhooe.mtd.ecs.EngineSystem; public class CameraMovementSystem extends EngineSystem { private CameraSystem cameraSystem; private Camera cam; private CameraTransform camTransform; private float speed = 2f; private float originalSpeed; private float mouseSpeed = 3.5f; private final Vector3f tmpVector = new Vector3f(); MouseInput mouseInput; @Override public void addedToEngine(Engine e) { originalSpeed = speed; GLFW.glfwSetCursorPos(MainWindow.WINDOW, (float) (MainWindow.WIDTH * 0.5), (float) (MainWindow.HEIGHT * 0.5)); cameraSystem = e.getSystem(CameraSystem.class); cam = cameraSystem.getDefaultCamera(); camTransform = cam.getTransform(); glfwSetKeyCallback(MainWindow.WINDOW, new Input()); GLFW.glfwSetInputMode(MainWindow.WINDOW, GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_DISABLED); GLFW.glfwSetCursorPosCallback(MainWindow.WINDOW, mouseInput = new MouseInput()); } @Override public void update(double dt) { handleExitInput(); if(!GlobalConfig.IS_ANIMATION_CONTROLLED) { handleKeyboardInput(); handleMouseInput(dt); } } private void handleExitInput() { if(Input.keys[GLFW.GLFW_KEY_ESCAPE]) { glfwSetWindowShouldClose(MainWindow.WINDOW, true); } } private void handleMouseInput(double dt) { mouseInput.getMouseDelta().mul((float) (mouseSpeed * dt)); camTransform.processMouseMovement(mouseInput.getMouseDelta().x, -mouseInput.getMouseDelta().y); } private void handleKeyboardInput() { if(Input.keys[GLFW.GLFW_KEY_W]) { tmpVector.set(camTransform.forward.x, camTransform.forward.y, camTransform.forward.z); camTransform.translate(tmpVector.mul((float) (speed * MainWindow.getDeltaTime()))); } if(Input.keys[GLFW.GLFW_KEY_S]) { tmpVector.set(-camTransform.forward.x, -camTransform.forward.y, -camTransform.forward.z); camTransform.translate(tmpVector.mul((float) (speed * MainWindow.getDeltaTime()))); } if(Input.keys[GLFW.GLFW_KEY_A]) { tmpVector.set(-camTransform.right.x, -camTransform.right.y, -camTransform.right.z); camTransform.translate(tmpVector.mul((float) (speed * MainWindow.getDeltaTime()))); } if(Input.keys[GLFW.GLFW_KEY_D]) { tmpVector.set(camTransform.right.x, camTransform.right.y, camTransform.right.z); camTransform.translate(tmpVector.mul((float) (speed * MainWindow.getDeltaTime()))); } if(Input.keys[GLFW.GLFW_KEY_Q]) { tmpVector.set(camTransform.up.x, camTransform.up.y, camTransform.up.z); camTransform.translate(tmpVector.mul((float) (speed * MainWindow.getDeltaTime()))); } if(Input.keys[GLFW.GLFW_KEY_E]) { tmpVector.set(-camTransform.up.x, -camTransform.up.y, -camTransform.up.z); camTransform.translate(tmpVector.mul((float) (speed * MainWindow.getDeltaTime()))); } if(Input.keys[GLFW.GLFW_KEY_LEFT_SHIFT]) { speed = originalSpeed * 4f; } else { speed = originalSpeed; } } }