From fa57842a0fe600a16a2f88dd4fe6ef4d8cf88a7d Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Mon, 17 Feb 2025 15:23:40 +0800 Subject: [PATCH] Add brim ear raycasters --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 8 ++-- src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp | 51 ++++++++++++++++++++--- src/slic3r/GUI/Gizmos/GLGizmoBrimEars.hpp | 3 ++ 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 97875ee606..089dd1d454 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -74,11 +74,11 @@ PickingModel GLGizmoBase::Grabber::s_cone; GLGizmoBase::Grabber::~Grabber() { - if (s_cube.model.is_initialized()) - s_cube.model.reset(); + //if (s_cube.model.is_initialized()) + // s_cube.model.reset(); - if (s_cone.model.is_initialized()) - s_cone.model.reset(); + //if (s_cone.model.is_initialized()) + // s_cone.model.reset(); } float GLGizmoBase::Grabber::get_half_size(float size) const diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp index 41a3d0eaef..d25b568b7d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp @@ -162,14 +162,16 @@ void GLGizmoBrimEars::render_points(const Selection &selection) double radius = (double) brim_point.head_front_radius * RenderPointScale; const Transform3d center_matrix = - view_matrix - * instance_matrix + instance_matrix * Geometry::translation_transform(brim_point.pos.cast()) // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. * instance_scaling_matrix_inverse * q * Geometry::scale_transform(Vec3d{radius, radius, .2}); - shader->set_uniform("view_model_matrix", center_matrix); + if (i < m_grabbers.size()) { + m_grabbers[i].raycasters[0]->set_transform(center_matrix); + } + shader->set_uniform("view_model_matrix", view_matrix * center_matrix); m_cylinder.model.render(); if (vol->is_left_handed()) glFrontFace(GL_CCW); @@ -263,13 +265,16 @@ void GLGizmoBrimEars::data_changed(bool is_serializing) bool GLGizmoBrimEars::on_mouse(const wxMouseEvent& mouse_event) { + if (use_grabbers(mouse_event)) { + return true; + } + // wxCoord == int --> wx/types.h Vec2i32 mouse_coord(mouse_event.GetX(), mouse_event.GetY()); Vec2d mouse_pos = mouse_coord.cast(); if (mouse_event.Moving()) { - gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false); - return false; + return gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false); } // when control is down we allow scene pan and rotation even when clicking @@ -1026,6 +1031,40 @@ bool GLGizmoBrimEars::add_point_to_cache(Vec3f pos, float head_radius, bool sele return true; } + +void GLGizmoBrimEars::on_register_raycasters_for_picking() { + update_raycasters(); +} + +void GLGizmoBrimEars::on_unregister_raycasters_for_picking() +{ + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo); + m_grabbers.clear(); +} + +void GLGizmoBrimEars::update_raycasters() +{ + // Remove extra raycasters + if (m_editing_cache.size() < m_grabbers.size()) { + for (auto it = m_grabbers.begin() + m_editing_cache.size(); it != m_grabbers.end(); ++it) { + if (it->picking_id >= 0) { + it->unregister_raycasters_for_picking(); + } + } + m_grabbers.erase(m_grabbers.begin() + m_editing_cache.size(), m_grabbers.end()); + } else if (m_editing_cache.size() > m_grabbers.size()) { + auto remaining = m_editing_cache.size() - m_grabbers.size(); + while (remaining > 0) { + const auto id = m_grabbers.size(); + auto& g = m_grabbers.emplace_back(); + g.register_raycasters_for_picking(id); + g.raycasters[0] = m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, id, + *m_cylinder.mesh_raycaster, Transform3d::Identity()); + remaining--; + } + } +} + void GLGizmoBrimEars::register_single_mesh_pick() { Selection &selection = m_parent.get_selection(); @@ -1083,6 +1122,8 @@ ExPolygon GLGizmoBrimEars::make_polygon(BrimPoint point, const Geometry::Transfo void GLGizmoBrimEars::find_single() { + update_raycasters(); + if (m_editing_cache.size() == 0) { m_single_brim.clear(); return; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.hpp index 585ce83eac..e316861dbd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBrimEars.hpp @@ -142,6 +142,7 @@ private: void auto_generate(); void first_layer_slicer(); void get_detection_radius_max(); + void update_raycasters(); protected: void on_set_state() override; @@ -162,6 +163,8 @@ protected: virtual CommonGizmosDataID on_get_requirements() const override; void on_load(cereal::BinaryInputArchive& ar) override; void on_save(cereal::BinaryOutputArchive& ar) const override; + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; void register_single_mesh_pick(); //void update_single_mesh_pick(GLVolume* v); void reset_all_pick();