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;
}
}
}