diff --git a/framework/opengl_renderer/src/mm/opengl/camera_3d.cpp b/framework/opengl_renderer/src/mm/opengl/camera_3d.cpp index 6a89c9c..95707ec 100644 --- a/framework/opengl_renderer/src/mm/opengl/camera_3d.cpp +++ b/framework/opengl_renderer/src/mm/opengl/camera_3d.cpp @@ -181,6 +181,19 @@ std::array Camera3D::getFrustumPlanes(void) const { return planes; } +// example use: +// const glm::vec4 screen { + // ( + // glm::vec2{mouse_pos.x, window_size.y - mouse_pos.y} + // / (glm::vec2{window_size.x, window_size.y} * 0.5f) + // ) + // - glm::vec2{1.f, 1.f} + // , 1.f, 1.f +// }; +glm::vec4 Camera3D::screenToWorld(const glm::vec4& screen) const { + return glm::inverse(getViewProjection()) * screen; +} + template static T dot34(glm::vec<3, T> lhs, glm::vec<4, T> rhs) { return glm::dot(lhs, glm::vec<3, T>(rhs)) + rhs.w; diff --git a/framework/opengl_renderer/src/mm/opengl/camera_3d.hpp b/framework/opengl_renderer/src/mm/opengl/camera_3d.hpp index 4f9ddc9..02decf7 100644 --- a/framework/opengl_renderer/src/mm/opengl/camera_3d.hpp +++ b/framework/opengl_renderer/src/mm/opengl/camera_3d.hpp @@ -49,6 +49,10 @@ namespace MM::OpenGL { // call updateView beforehand, does not cache std::array getFrustumPlanes(void) const; + + // uses getViewProjection(), does not cache + // screen has to be in NDC, xy -> [-1, 1] + glm::vec4 screenToWorld(const glm::vec4& screen) const; }; // test if aabb in frustum