Add brim ear raycasters

This commit is contained in:
Noisyfox 2025-02-17 15:23:40 +08:00
parent 185fb3cb26
commit fa57842a0f
3 changed files with 53 additions and 9 deletions

View file

@ -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

View file

@ -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<double>())
// 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<double>();
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;

View file

@ -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();