diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index eb629c5c6..5f7422bba 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -68,7 +68,11 @@ void GLGizmoBase::Grabber::unregister_raycasters_for_picking() } #endif // ENABLE_RAYCAST_PICKING +#if ENABLE_RAYCAST_PICKING +void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color) +#else void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, bool picking) +#endif // ENABLE_RAYCAST_PICKING { #if ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* shader = wxGetApp().get_current_shader(); @@ -316,10 +320,10 @@ bool GLGizmoBase::update_items_state() } #if ENABLE_RAYCAST_PICKING -void GLGizmoBase::register_grabbers_for_picking() +void GLGizmoBase::register_grabbers_for_picking(bool use_group_id) { for (size_t i = 0; i < m_grabbers.size(); ++i) { - m_grabbers[i].register_raycasters_for_picking(i); + m_grabbers[i].register_raycasters_for_picking(use_group_id ? m_group_id : i); } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 87fbaa6a4..aa930bbae 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -8,6 +8,7 @@ #include "slic3r/GUI/GLModel.hpp" #if ENABLE_RAYCAST_PICKING #include "slic3r/GUI/MeshUtils.hpp" +#include "slic3r/GUI/SceneRaycaster.hpp" #endif // ENABLE_RAYCAST_PICKING #include @@ -77,10 +78,12 @@ protected: Grabber() = default; ~Grabber(); +#if ENABLE_RAYCAST_PICKING + void render(bool hover, float size) { render(size, hover ? complementary(color) : color); } +#else void render(bool hover, float size) { render(size, hover ? complementary(color) : color, false); } -#if !ENABLE_RAYCAST_PICKING void render_for_picking(float size) { render(size, color, true); } -#endif // !ENABLE_RAYCAST_PICKING +#endif // ENABLE_RAYCAST_PICKING float get_half_size(float size) const; float get_dragging_half_size(float size) const; @@ -91,7 +94,11 @@ protected: #endif // ENABLE_RAYCAST_PICKING private: +#if ENABLE_RAYCAST_PICKING + void render(float size, const ColorRGBA& render_color); +#else void render(float size, const ColorRGBA& render_color, bool picking); +#endif // ENABLE_RAYCAST_PICKING #if ENABLE_RAYCAST_PICKING static PickingModel s_cube; @@ -200,7 +207,7 @@ public: virtual bool on_mouse(const wxMouseEvent &mouse_event) { return false; } #if ENABLE_RAYCAST_PICKING - void register_raycasters_for_picking() { register_grabbers_for_picking(); on_register_raycasters_for_picking(); } + void register_raycasters_for_picking(bool use_group_id = false) { register_grabbers_for_picking(use_group_id); on_register_raycasters_for_picking(); } void unregister_raycasters_for_picking() { unregister_grabbers_for_picking(); on_unregister_raycasters_for_picking(); } #endif // ENABLE_RAYCAST_PICKING @@ -229,7 +236,7 @@ protected: virtual void on_render_input_window(float x, float y, float bottom_limit) {} #if ENABLE_RAYCAST_PICKING - void register_grabbers_for_picking(); + void register_grabbers_for_picking(bool use_group_id = false); void unregister_grabbers_for_picking(); virtual void on_register_raycasters_for_picking() {} virtual void on_unregister_raycasters_for_picking() {} diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 8838e13ec..1aa44d2df 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -882,6 +882,25 @@ void GLGizmoRotate3D::on_render() m_gizmos[Z].render(); } +#if ENABLE_RAYCAST_PICKING +void GLGizmoRotate3D::on_register_raycasters_for_picking() +{ + // this gizmo is rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); + for (GLGizmoRotate& g : m_gizmos) { + g.register_raycasters_for_picking(true); + } +} + +void GLGizmoRotate3D::on_unregister_raycasters_for_picking() +{ + for (GLGizmoRotate& g : m_gizmos) { + g.unregister_raycasters_for_picking(); + } + m_parent.set_raycaster_gizmos_on_top(false); +} +#endif // ENABLE_RAYCAST_PICKING + GLGizmoRotate3D::RotoptimzeWindow::RotoptimzeWindow(ImGuiWrapper * imgui, State & state, const Alignment &alignment) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index b97526718..daf8283ff 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -6,6 +6,7 @@ namespace Slic3r { namespace GUI { class Selection; + class GLGizmoRotate : public GLGizmoBase { static const float Offset; @@ -84,6 +85,7 @@ public: /// Return True when use the information otherwise False. bool on_mouse(const wxMouseEvent &mouse_event) override; void dragging(const UpdateData &data); + protected: bool on_init() override; std::string on_get_name() const override { return ""; } @@ -177,13 +179,16 @@ protected: void on_dragging(const UpdateData &data) override; void on_render() override; -#if !ENABLE_RAYCAST_PICKING +#if ENABLE_RAYCAST_PICKING + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; +#else void on_render_for_picking() override { for (GLGizmoRotate& g : m_gizmos) { g.render_for_picking(); } } -#endif // !ENABLE_RAYCAST_PICKING +#endif // ENABLE_RAYCAST_PICKING void on_render_input_window(float x, float y, float bottom_limit) override;