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()
|
GLGizmoBase::Grabber::~Grabber()
|
||||||
{
|
{
|
||||||
if (s_cube.model.is_initialized())
|
//if (s_cube.model.is_initialized())
|
||||||
s_cube.model.reset();
|
// s_cube.model.reset();
|
||||||
|
|
||||||
if (s_cone.model.is_initialized())
|
//if (s_cone.model.is_initialized())
|
||||||
s_cone.model.reset();
|
// s_cone.model.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
float GLGizmoBase::Grabber::get_half_size(float size) const
|
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;
|
double radius = (double) brim_point.head_front_radius * RenderPointScale;
|
||||||
const Transform3d center_matrix =
|
const Transform3d center_matrix =
|
||||||
view_matrix
|
instance_matrix
|
||||||
* instance_matrix
|
|
||||||
* Geometry::translation_transform(brim_point.pos.cast<double>())
|
* 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.
|
// Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
|
||||||
* instance_scaling_matrix_inverse
|
* instance_scaling_matrix_inverse
|
||||||
* q
|
* q
|
||||||
* Geometry::scale_transform(Vec3d{radius, radius, .2});
|
* 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();
|
m_cylinder.model.render();
|
||||||
|
|
||||||
if (vol->is_left_handed()) glFrontFace(GL_CCW);
|
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)
|
bool GLGizmoBrimEars::on_mouse(const wxMouseEvent& mouse_event)
|
||||||
{
|
{
|
||||||
|
if (use_grabbers(mouse_event)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// wxCoord == int --> wx/types.h
|
// wxCoord == int --> wx/types.h
|
||||||
Vec2i32 mouse_coord(mouse_event.GetX(), mouse_event.GetY());
|
Vec2i32 mouse_coord(mouse_event.GetX(), mouse_event.GetY());
|
||||||
Vec2d mouse_pos = mouse_coord.cast<double>();
|
Vec2d mouse_pos = mouse_coord.cast<double>();
|
||||||
|
|
||||||
if (mouse_event.Moving()) {
|
if (mouse_event.Moving()) {
|
||||||
gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false);
|
return gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// when control is down we allow scene pan and rotation even when clicking
|
// 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;
|
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()
|
void GLGizmoBrimEars::register_single_mesh_pick()
|
||||||
{
|
{
|
||||||
Selection &selection = m_parent.get_selection();
|
Selection &selection = m_parent.get_selection();
|
||||||
|
@ -1083,6 +1122,8 @@ ExPolygon GLGizmoBrimEars::make_polygon(BrimPoint point, const Geometry::Transfo
|
||||||
|
|
||||||
void GLGizmoBrimEars::find_single()
|
void GLGizmoBrimEars::find_single()
|
||||||
{
|
{
|
||||||
|
update_raycasters();
|
||||||
|
|
||||||
if (m_editing_cache.size() == 0) {
|
if (m_editing_cache.size() == 0) {
|
||||||
m_single_brim.clear();
|
m_single_brim.clear();
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -142,6 +142,7 @@ private:
|
||||||
void auto_generate();
|
void auto_generate();
|
||||||
void first_layer_slicer();
|
void first_layer_slicer();
|
||||||
void get_detection_radius_max();
|
void get_detection_radius_max();
|
||||||
|
void update_raycasters();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void on_set_state() override;
|
void on_set_state() override;
|
||||||
|
@ -162,6 +163,8 @@ protected:
|
||||||
virtual CommonGizmosDataID on_get_requirements() const override;
|
virtual CommonGizmosDataID on_get_requirements() const override;
|
||||||
void on_load(cereal::BinaryInputArchive& ar) override;
|
void on_load(cereal::BinaryInputArchive& ar) override;
|
||||||
void on_save(cereal::BinaryOutputArchive& ar) const 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 register_single_mesh_pick();
|
||||||
//void update_single_mesh_pick(GLVolume* v);
|
//void update_single_mesh_pick(GLVolume* v);
|
||||||
void reset_all_pick();
|
void reset_all_pick();
|
||||||
|
|
Loading…
Reference in a new issue