From 12c3f4951df743ddf0e0c88965f734672a01cf2f Mon Sep 17 00:00:00 2001 From: supermerill Date: Tue, 21 May 2024 19:26:01 +0200 Subject: [PATCH] Change glReadPixels(GL_DEPTH_COMPONENT) from flaot to int: better performance & compatibility supermerill/superslicer#2864 --- src/slic3r/GUI/GLCanvas3D.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index a831834d481..7b67380cdda 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5922,11 +5922,20 @@ Vec3d GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z) Vec4i32 viewport(camera.get_viewport().data()); GLint y = viewport[3] - (GLint)mouse_pos(1); - GLfloat mouse_z; - if (z == nullptr) - glsafe(::glReadPixels((GLint)mouse_pos(0), y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, (void*)&mouse_z)); - else + double mouse_z; + if (z == nullptr) { + GLuint render_z; + if(sizeof(render_z)==2) + glsafe(::glReadPixels((GLint) mouse_pos(0), y, 1, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, (void *) &render_z)); + else if(sizeof(render_z)==4) + glsafe(::glReadPixels((GLint) mouse_pos(0), y, 1, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, (void *) &render_z)); + else { + BOOST_LOG_TRIVIAL(error) << "error, opengl depth buffer of odd size."; + } + mouse_z = (double(render_z)/std::numeric_limits::max()); + } else { mouse_z = *z; + } Vec3d out; igl::unproject(Vec3d(mouse_pos(0), y, mouse_z), modelview, projection, viewport, out);