Add brim ear raycasters
This commit is contained in:
parent
185fb3cb26
commit
fa57842a0f
3 changed files with 53 additions and 9 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue