Improved remove hovering on objects when mouse leaves 3D scene

This commit is contained in:
Enrico Turri 2018-07-30 09:09:14 +02:00
parent 4a88075334
commit bf4871d7f8

View File

@ -2697,9 +2697,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
}
else if (evt.Leaving())
{
// to remove hover when mouse goes out of this canvas
m_mouse.position = Pointf((coordf_t)pos.x, (coordf_t)pos.y);
render();
// to remove hover on objects when the mouse goes out of this canvas
m_mouse.position = Pointf(-1.0, -1.0);
m_dirty = true;
}
else if (evt.LeftDClick() && (m_hover_volume_id != -1))
m_on_double_click_callback.call();
@ -3403,20 +3403,22 @@ void GLCanvas3D::_picking_pass() const
if (m_multisample_allowed)
::glEnable(GL_MULTISAMPLE);
const Size& cnv_size = get_canvas_size();
GLubyte color[4];
::glReadPixels(pos.x, cnv_size.get_height() - pos.y - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color);
int volume_id = color[0] + color[1] * 256 + color[2] * 256 * 256;
m_hover_volume_id = -1;
int volume_id = -1;
for (GLVolume* vol : m_volumes.volumes)
{
vol->hover = false;
}
if (volume_id < (int)m_volumes.volumes.size())
GLubyte color[4] = { 0, 0, 0, 0 };
const Size& cnv_size = get_canvas_size();
bool inside = (0 <= pos.x) && (pos.x < cnv_size.get_width()) && (0 <= pos.y) && (pos.y < cnv_size.get_height());
if (inside)
{
::glReadPixels(pos.x, cnv_size.get_height() - pos.y - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color);
volume_id = color[0] + color[1] * 256 + color[2] * 256 * 256;
}
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
{
m_hover_volume_id = volume_id;
m_volumes.volumes[volume_id]->hover = true;
@ -3432,7 +3434,10 @@ void GLCanvas3D::_picking_pass() const
m_gizmos.set_hover_id(-1);
}
else
m_gizmos.set_hover_id(254 - (int)color[2]);
{
m_hover_volume_id = -1;
m_gizmos.set_hover_id(inside ? (254 - (int)color[2]) : -1);
}
// updates gizmos overlay
if (_get_first_selected_object_id() != -1)