From 8c560522a3229021d561d909ba5b6552888b65bf Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 28 May 2021 15:44:39 +0200 Subject: [PATCH] Fixed rendering of gizmo grabbers --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 12 +++++++++--- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 4 +++- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 12 ++++++++---- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 12 ++++++++---- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index e284822d2..98729bd7f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -21,9 +21,6 @@ GLGizmoBase::Grabber::Grabber() , enabled(true) { color = { 1.0f, 1.0f, 1.0f, 1.0f }; - TriangleMesh mesh = make_cube(1., 1., 1.); - mesh.translate(Vec3f(-0.5, -0.5, -0.5)); - cube.init_from(mesh); } void GLGizmoBase::Grabber::render(bool hover, float size) const @@ -53,6 +50,15 @@ float GLGizmoBase::Grabber::get_dragging_half_size(float size) const void GLGizmoBase::Grabber::render(float size, const std::array& render_color, bool picking) const { + if (! cube_initialized) { + // This cannot be done in constructor, OpenGL is not yet + // initialized at that point (on Linux at least). + TriangleMesh mesh = make_cube(1., 1., 1.); + mesh.translate(Vec3f(-0.5, -0.5, -0.5)); + const_cast(cube).init_from(mesh); + const_cast(cube_initialized) = true; + } + float fullsize = 2 * (dragging ? get_dragging_half_size(size) : get_half_size(size)); GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_current_shader(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 854f740b9..ac83b794b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -48,7 +48,6 @@ protected: static const float MinHalfSize; static const float DraggingScaleFactor; - GLModel cube; Vec3d center; Vec3d angles; std::array color; @@ -65,6 +64,9 @@ protected: private: void render(float size, const std::array& render_color, bool picking) const; + + GLModel cube; + bool cube_initialized = false; }; public: diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 458c3233a..84282f0a8 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -199,9 +199,12 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box if (shader == nullptr) return; - shader->start_using(); - shader->set_uniform("emission_factor", 0.1); - shader->set_uniform("uniform_color", color); + if (! picking) { + shader->start_using(); + shader->set_uniform("emission_factor", 0.1); + shader->set_uniform("uniform_color", color); + } else + glsafe(::glColor4fv(color.data())); glsafe(::glPushMatrix()); glsafe(::glTranslated(m_grabbers[axis].center.x(), m_grabbers[axis].center.y(), m_grabbers[axis].center.z())); @@ -215,7 +218,8 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box m_vbo_cone.render(); glsafe(::glPopMatrix()); - shader->stop_using(); + if (! picking) + shader->stop_using(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index a1adbc95f..f72ea014d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -336,9 +336,12 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick if (shader == nullptr) return; - shader->start_using(); - shader->set_uniform("emission_factor", 0.1); - shader->set_uniform("uniform_color", color); + if (! picking) { + shader->start_using(); + shader->set_uniform("emission_factor", 0.1); + shader->set_uniform("uniform_color", color); + } else + glsafe(::glColor4fv(color.data())); glsafe(::glPushMatrix()); glsafe(::glTranslated(m_grabbers[0].center.x(), m_grabbers[0].center.y(), m_grabbers[0].center.z())); @@ -357,7 +360,8 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick m_cone.render(); glsafe(::glPopMatrix()); - shader->stop_using(); + if (! picking) + shader->stop_using(); } void GLGizmoRotate::transform_to_local(const Selection& selection) const