From 29be4cc9a3b2f351f53d515ce76de11855a099c1 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Sat, 28 Oct 2023 23:15:24 +0800 Subject: [PATCH] Tech ENABLE_RAYCAST_PICKING - Raytraced picking of Move, Rotate and Scale Gizmo --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 6 +++--- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 9 +++++---- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 17 +++++++++++++++++ src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 2 ++ src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 11 +++++++++++ src/slic3r/GUI/Gizmos/GLGizmoScale.hpp | 2 ++ 7 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 7638ea251d..7469c72257 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -117,7 +117,7 @@ void GLGizmoBase::Grabber::unregister_raycasters_for_picking() elements_registered_for_picking = false; } -void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, bool picking) +void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color) { GLShaderProgram* shader = wxGetApp().get_current_shader(); if (shader == nullptr) @@ -299,10 +299,10 @@ void GLGizmoBase::GizmoImguiSetNextWIndowPos(float &x, float y, int flag, float m_imgui->set_next_window_pos(x, y, flag, pivot_x, pivot_y); } -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 227e96a77b..f7c4bf2eaa 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -7,6 +7,7 @@ #include "slic3r/GUI/I18N.hpp" #include "slic3r/GUI/GLModel.hpp" #include "slic3r/GUI/MeshUtils.hpp" +#include "slic3r/GUI/SceneRaycaster.hpp" #include @@ -91,7 +92,7 @@ protected: Grabber() = default; ~Grabber(); - void render(bool hover, float size) { render(size, hover ? hover_color : color, false); } + void render(bool hover, float size) { render(size, hover ? hover_color : color); } float get_half_size(float size) const; float get_dragging_half_size(float size) const; @@ -101,7 +102,7 @@ protected: void unregister_raycasters_for_picking(); private: - void render(float size, const ColorRGBA& render_color, bool picking); + void render(float size, const ColorRGBA& render_color); static PickingModel s_cube; static PickingModel s_cone; @@ -211,7 +212,7 @@ public: int get_count() { return ++count; } std::string get_gizmo_name() { return on_get_name(); } - 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(); } protected: @@ -237,7 +238,7 @@ protected: void GizmoImguiEnd(); void GizmoImguiSetNextWIndowPos(float &x, float y, int flag, float pivot_x = 0.0f, float pivot_y = 0.0f); - 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/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index f22a856718..1925cd7fa5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -184,7 +184,7 @@ void GLGizmoMove3D::on_render() void GLGizmoMove3D::on_register_raycasters_for_picking() { - // this gizmo is rendered on top of the scene, so the raytraced picker should take it into account + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account m_parent.set_raycaster_gizmos_on_top(true); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 562bd04077..2ecb90641f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -510,6 +510,23 @@ void GLGizmoRotate3D::on_render() m_gizmos[Z].render(); } +void GLGizmoRotate3D::on_register_raycasters_for_picking() +{ + // the gizmo grabbers are 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); +} + 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 3d454de2bc..cc00409c00 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -149,6 +149,8 @@ protected: } } void on_render() override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; void on_render_input_window(float x, float y, float bottom_limit) override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index f35f1004d4..f6bbf4c523 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -255,6 +255,17 @@ void GLGizmoScale3D::on_render() render_grabbers(grabber_mean_size); } +void GLGizmoScale3D::on_register_raycasters_for_picking() +{ + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); +} + +void GLGizmoScale3D::on_unregister_raycasters_for_picking() +{ + m_parent.set_raycaster_gizmos_on_top(false); +} + void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int id_2, const ColorRGBA& color) { auto grabber_connection = [this](unsigned int id_1, unsigned int id_2) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index f1092be199..a4b5a064c1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -72,6 +72,8 @@ protected: virtual void on_start_dragging() override; virtual void on_update(const UpdateData& data) override; virtual void on_render() override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; //BBS: GUI refactor: add object manipulation virtual void on_render_input_window(float x, float y, float bottom_limit);