//
// Created by sebastian on 07.02.26.
//

#ifndef MOUSEPICKER_H
#define MOUSEPICKER_H
#include "glm/mat4x4.hpp"
#include "glm/vec3.hpp"

class Camera;

class MousePicker {
private:
    glm::vec3 currentRay = glm::vec3(0.0f);
    glm::mat4 projectionMatrix;
    glm::mat4 viewMatrix;

    glm::vec3 calculateMouseRay();

    static glm::vec2 getNormalizedDeviceCoords(float mouseX, float mouseY);
    [[nodiscard]] glm::vec4 toEyeSpace(glm::vec4 clipCoords) const;
    [[nodiscard]] glm::vec3 toWorldSpace(glm::vec4 eyeCoords) const;

public:
    MousePicker(const glm::mat4 &projectionMatrix, const glm::mat4 &viewMatrix) : projectionMatrix(projectionMatrix), viewMatrix(viewMatrix) {};

    [[nodiscard]] glm::vec3 getCurrentRay() const {
        return currentRay;
    }

    void update(const Camera& camera);
};



#endif //MOUSEPICKER_H
