New selection -> Improved gizmos activation

This commit is contained in:
Enrico Turri 2018-10-16 14:56:35 +02:00
parent 561bbf5a80
commit af4570741c
4 changed files with 40 additions and 20 deletions

View file

@ -1893,7 +1893,7 @@ void GLCanvas3D::Gizmos::update_hover_state(const GLCanvas3D& canvas, const Vec2
float cnv_h = (float)canvas.get_canvas_size().get_height(); float cnv_h = (float)canvas.get_canvas_size().get_height();
float height = _get_total_overlay_height(); float height = _get_total_overlay_height();
float top_y = 0.5f * (cnv_h - height); float top_y = 0.5f * (cnv_h - height);
for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it)
{ {
if (it->second == nullptr) if (it->second == nullptr)
continue; continue;
@ -1903,8 +1903,7 @@ void GLCanvas3D::Gizmos::update_hover_state(const GLCanvas3D& canvas, const Vec2
// we currently use circular icons for gizmo, so we check the radius // we currently use circular icons for gizmo, so we check the radius
#if ENABLE_EXTENDED_SELECTION #if ENABLE_EXTENDED_SELECTION
bool no_wipe_tower = selection.is_wipe_tower() && !it->second->get_accept_wipe_tower(); if (it->second->is_activable(selection) && (it->second->get_state() != GLGizmoBase::On))
if (!no_wipe_tower && (it->second->get_state() != GLGizmoBase::On))
#else #else
if (it->second->get_state() != GLGizmoBase::On) if (it->second->get_state() != GLGizmoBase::On)
#endif // ENABLE_EXTENDED_SELECTION #endif // ENABLE_EXTENDED_SELECTION
@ -1928,7 +1927,7 @@ void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec
float cnv_h = (float)canvas.get_canvas_size().get_height(); float cnv_h = (float)canvas.get_canvas_size().get_height();
float height = _get_total_overlay_height(); float height = _get_total_overlay_height();
float top_y = 0.5f * (cnv_h - height); float top_y = 0.5f * (cnv_h - height);
for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it)
{ {
if (it->second == nullptr) if (it->second == nullptr)
continue; continue;
@ -1938,18 +1937,17 @@ void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec
// we currently use circular icons for gizmo, so we check the radius // we currently use circular icons for gizmo, so we check the radius
#if ENABLE_EXTENDED_SELECTION #if ENABLE_EXTENDED_SELECTION
bool no_wipe_tower = selection.is_wipe_tower() && !it->second->get_accept_wipe_tower(); if (it->second->is_activable(selection) && ((mouse_pos - Vec2d(OverlayOffsetX + half_tex_size, top_y + half_tex_size)).norm() < half_tex_size))
if (!no_wipe_tower && ((mouse_pos - Vec2d(OverlayOffsetX + half_tex_size, top_y + half_tex_size)).norm() < half_tex_size))
#else #else
if ((mouse_pos - Vec2d(OverlayOffsetX + half_tex_size, top_y + half_tex_size)).norm() < half_tex_size) if ((mouse_pos - Vec2d(OverlayOffsetX + half_tex_size, top_y + half_tex_size)).norm() < half_tex_size)
#endif // ENABLE_EXTENDED_SELECTION #endif // ENABLE_EXTENDED_SELECTION
{ {
if ((it->second->get_state() == GLGizmoBase::On)) if ((it->second->get_state() == GLGizmoBase::On))
{ {
it->second->set_state(GLGizmoBase::Off); it->second->set_state(GLGizmoBase::Hover);
m_current = Undefined; m_current = Undefined;
} }
else else if ((it->second->get_state() == GLGizmoBase::Hover))
{ {
it->second->set_state(GLGizmoBase::On); it->second->set_state(GLGizmoBase::On);
m_current = it->first; m_current = it->first;
@ -1960,8 +1958,27 @@ void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec
top_y += (tex_size + OverlayGapY); top_y += (tex_size + OverlayGapY);
} }
GizmosMap::iterator it = m_gizmos.find(m_current);
if ((it != m_gizmos.end()) && (it->second != nullptr) && (it->second->get_state() != GLGizmoBase::On))
it->second->set_state(GLGizmoBase::On);
} }
#if ENABLE_EXTENDED_SELECTION
void GLCanvas3D::Gizmos::update_on_off_state(const Selection& selection)
{
GizmosMap::iterator it = m_gizmos.find(m_current);
if ((it != m_gizmos.end()) && (it->second != nullptr))
{
if (!it->second->is_activable(selection))
{
it->second->set_state(GLGizmoBase::Off);
m_current = Undefined;
}
}
}
#endif // ENABLE_EXTENDED_SELECTION
void GLCanvas3D::Gizmos::reset_all_states() void GLCanvas3D::Gizmos::reset_all_states()
{ {
if (!m_enabled) if (!m_enabled)
@ -3928,6 +3945,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
else else
m_selection.add(m_hover_volume_id, !evt.ShiftDown()); m_selection.add(m_hover_volume_id, !evt.ShiftDown());
m_gizmos.update_on_off_state(m_selection);
update_gizmos_data(); update_gizmos_data();
wxGetApp().obj_manipul()->update_settings_value(m_selection); wxGetApp().obj_manipul()->update_settings_value(m_selection);
m_dirty = true; m_dirty = true;

View file

@ -552,6 +552,7 @@ private:
#if ENABLE_EXTENDED_SELECTION #if ENABLE_EXTENDED_SELECTION
void update_hover_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const Selection& selection); void update_hover_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const Selection& selection);
void update_on_off_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const Selection& selection); void update_on_off_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const Selection& selection);
void update_on_off_state(const Selection& selection);
#else #else
void update_hover_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos); void update_hover_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos);
void update_on_off_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos); void update_on_off_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos);

View file

@ -219,9 +219,6 @@ GLGizmoBase::GLGizmoBase(GLCanvas3D& parent)
: m_parent(parent) : m_parent(parent)
, m_group_id(-1) , m_group_id(-1)
, m_state(Off) , m_state(Off)
#if ENABLE_EXTENDED_SELECTION
, m_accept_wipe_tower(false)
#endif // ENABLE_EXTENDED_SELECTION
, m_hover_id(-1) , m_hover_id(-1)
, m_dragging(false) , m_dragging(false)
{ {
@ -1216,10 +1213,6 @@ bool GLGizmoMove3D::on_init()
m_grabbers.push_back(Grabber()); m_grabbers.push_back(Grabber());
} }
#if ENABLE_EXTENDED_SELECTION
m_accept_wipe_tower = true;
#endif // ENABLE_EXTENDED_SELECTION
return true; return true;
} }

View file

@ -59,9 +59,6 @@ protected:
int m_group_id; int m_group_id;
EState m_state; EState m_state;
#if ENABLE_EXTENDED_SELECTION
bool m_accept_wipe_tower;
#endif // ENABLE_EXTENDED_SELECTION
// textures are assumed to be square and all with the same size in pixels, no internal check is done // textures are assumed to be square and all with the same size in pixels, no internal check is done
GLTexture m_textures[Num_States]; GLTexture m_textures[Num_States];
int m_hover_id; int m_hover_id;
@ -84,8 +81,7 @@ public:
void set_state(EState state) { m_state = state; on_set_state(); } void set_state(EState state) { m_state = state; on_set_state(); }
#if ENABLE_EXTENDED_SELECTION #if ENABLE_EXTENDED_SELECTION
bool get_accept_wipe_tower() { return m_accept_wipe_tower; } bool is_activable(const GLCanvas3D::Selection& selection) const { return on_is_activable(selection); }
void set_accept_wipe_tower(bool accept) { m_accept_wipe_tower = accept; }
#endif // ENABLE_EXTENDED_SELECTION #endif // ENABLE_EXTENDED_SELECTION
unsigned int get_texture_id() const { return m_textures[m_state].get_id(); } unsigned int get_texture_id() const { return m_textures[m_state].get_id(); }
@ -125,6 +121,9 @@ protected:
virtual bool on_init() = 0; virtual bool on_init() = 0;
virtual void on_set_state() {} virtual void on_set_state() {}
virtual void on_set_hover_id() {} virtual void on_set_hover_id() {}
#if ENABLE_EXTENDED_SELECTION
virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return true; }
#endif // ENABLE_EXTENDED_SELECTION
virtual void on_enable_grabber(unsigned int id) {} virtual void on_enable_grabber(unsigned int id) {}
virtual void on_disable_grabber(unsigned int id) {} virtual void on_disable_grabber(unsigned int id) {}
#if ENABLE_EXTENDED_SELECTION #if ENABLE_EXTENDED_SELECTION
@ -249,6 +248,9 @@ protected:
m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1); m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1);
} }
} }
#if ENABLE_EXTENDED_SELECTION
virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return !selection.is_wipe_tower(); }
#endif // ENABLE_EXTENDED_SELECTION
virtual void on_enable_grabber(unsigned int id) virtual void on_enable_grabber(unsigned int id)
{ {
if ((0 <= id) && (id < 3)) if ((0 <= id) && (id < 3))
@ -327,6 +329,9 @@ public:
protected: protected:
virtual bool on_init(); virtual bool on_init();
#if ENABLE_EXTENDED_SELECTION
virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return !selection.is_wipe_tower(); }
#endif // ENABLE_EXTENDED_SELECTION
#if ENABLE_EXTENDED_SELECTION #if ENABLE_EXTENDED_SELECTION
virtual void on_start_dragging(const GLCanvas3D::Selection& selection); virtual void on_start_dragging(const GLCanvas3D::Selection& selection);
#else #else
@ -449,6 +454,9 @@ public:
protected: protected:
virtual bool on_init(); virtual bool on_init();
#if ENABLE_EXTENDED_SELECTION
virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return selection.is_single_full_instance(); }
#endif // ENABLE_EXTENDED_SELECTION
#if ENABLE_EXTENDED_SELECTION #if ENABLE_EXTENDED_SELECTION
virtual void on_start_dragging(const GLCanvas3D::Selection& selection); virtual void on_start_dragging(const GLCanvas3D::Selection& selection);
#else #else