Picking using rectangle selection WIP
This commit is contained in:
parent
1ffc6b5e64
commit
3fea03f885
2 changed files with 81 additions and 14 deletions
|
@ -3648,14 +3648,7 @@ void GLCanvas3D::_refresh_if_shown_on_screen()
|
||||||
|
|
||||||
void GLCanvas3D::_picking_pass() const
|
void GLCanvas3D::_picking_pass() const
|
||||||
{
|
{
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
// const Vec2d& pos = m_mouse.position;
|
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
|
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
if (m_picking_enabled && !m_mouse.dragging && (m_mouse.position != Vec2d(DBL_MAX, DBL_MAX)))
|
if (m_picking_enabled && !m_mouse.dragging && (m_mouse.position != Vec2d(DBL_MAX, DBL_MAX)))
|
||||||
// if (m_picking_enabled && !m_mouse.dragging && (pos != Vec2d(DBL_MAX, DBL_MAX)))
|
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
{
|
{
|
||||||
// Render the object for picking.
|
// Render the object for picking.
|
||||||
// FIXME This cannot possibly work in a multi - sampled context as the color gets mangled by the anti - aliasing.
|
// FIXME This cannot possibly work in a multi - sampled context as the color gets mangled by the anti - aliasing.
|
||||||
|
@ -3687,16 +3680,10 @@ void GLCanvas3D::_picking_pass() const
|
||||||
|
|
||||||
GLubyte color[4] = { 0, 0, 0, 0 };
|
GLubyte color[4] = { 0, 0, 0, 0 };
|
||||||
const Size& cnv_size = get_canvas_size();
|
const Size& cnv_size = get_canvas_size();
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
bool inside = (0 <= m_mouse.position(0)) && (m_mouse.position(0) < cnv_size.get_width()) && (0 <= m_mouse.position(1)) && (m_mouse.position(1) < cnv_size.get_height());
|
bool inside = (0 <= m_mouse.position(0)) && (m_mouse.position(0) < cnv_size.get_width()) && (0 <= m_mouse.position(1)) && (m_mouse.position(1) < cnv_size.get_height());
|
||||||
// bool inside = (0 <= pos(0)) && (pos(0) < cnv_size.get_width()) && (0 <= pos(1)) && (pos(1) < cnv_size.get_height());
|
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
if (inside)
|
if (inside)
|
||||||
{
|
{
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
glsafe(::glReadPixels(m_mouse.position(0), cnv_size.get_height() - m_mouse.position(1) - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color));
|
glsafe(::glReadPixels(m_mouse.position(0), cnv_size.get_height() - m_mouse.position(1) - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color));
|
||||||
// glsafe(::glReadPixels(pos(0), cnv_size.get_height() - pos(1) - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color));
|
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
volume_id = color[0] + color[1] * 256 + color[2] * 256 * 256;
|
volume_id = color[0] + color[1] * 256 + color[2] * 256 * 256;
|
||||||
}
|
}
|
||||||
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
|
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
|
||||||
|
@ -3719,6 +3706,77 @@ void GLCanvas3D::_rectangular_selection_picking_pass() const
|
||||||
{
|
{
|
||||||
if (m_picking_enabled)
|
if (m_picking_enabled)
|
||||||
{
|
{
|
||||||
|
if (m_multisample_allowed)
|
||||||
|
glsafe(::glDisable(GL_MULTISAMPLE));
|
||||||
|
|
||||||
|
glsafe(::glDisable(GL_BLEND));
|
||||||
|
glsafe(::glEnable(GL_DEPTH_TEST));
|
||||||
|
|
||||||
|
glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
|
||||||
|
|
||||||
|
_render_volumes_for_picking();
|
||||||
|
|
||||||
|
if (m_multisample_allowed)
|
||||||
|
glsafe(::glEnable(GL_MULTISAMPLE));
|
||||||
|
|
||||||
|
int width = (int)m_rectangle_selection.get_width();
|
||||||
|
int height = (int)m_rectangle_selection.get_height();
|
||||||
|
|
||||||
|
if ((width > 0) && (height > 0))
|
||||||
|
{
|
||||||
|
int left = (int)m_rectangle_selection.get_left();
|
||||||
|
int top = get_canvas_size().get_height() - (int)m_rectangle_selection.get_top();
|
||||||
|
if ((left >= 0) && (top >= 0))
|
||||||
|
{
|
||||||
|
std::vector<std::array<unsigned char, 4>> frame(width * height);
|
||||||
|
// std::vector<GLubyte> frame(4 * width * height);
|
||||||
|
glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data()));
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
std::sort(frame.begin(), frame.end());
|
||||||
|
frame.resize(std::distance(frame.begin(), std::unique(frame.begin(), frame.end())));
|
||||||
|
if (frame.size() > 1)
|
||||||
|
{
|
||||||
|
std::cout << frame.size() - 1 << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
std::set<int> idxs;
|
||||||
|
for (int r = 0; r < height; ++r)
|
||||||
|
{
|
||||||
|
for (int c = 0; c < width; ++c)
|
||||||
|
{
|
||||||
|
int id_px = 4 * (r * width + c);
|
||||||
|
idxs.insert(frame[id_px] + frame[id_px + 1] * 256 + frame[id_px + 2] * 256 * 256);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idxs.size() > 1)
|
||||||
|
{
|
||||||
|
std::cout << idxs.size() - 1 << std::endl;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
#else
|
||||||
|
wxImage frame_image(width, height);
|
||||||
|
unsigned char* image_data = frame_image.GetData();
|
||||||
|
for (int r = 0; r < height; ++r)
|
||||||
|
{
|
||||||
|
for (int c = 0; c < width; ++c)
|
||||||
|
{
|
||||||
|
int id_px = r * width + c;
|
||||||
|
::memcpy((void*)(image_data + 3 * id_px), (const void*)&frame[4 * id_px], 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxImageHistogram frame_histogram;
|
||||||
|
unsigned long colors_count = frame_image.ComputeHistogram(frame_histogram);
|
||||||
|
if (colors_count > 1)
|
||||||
|
{
|
||||||
|
std::cout << colors_count - 1 << std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
|
|
@ -56,6 +56,15 @@ public:
|
||||||
bool is_active() const { return m_status != Off; }
|
bool is_active() const { return m_status != Off; }
|
||||||
EState get_status() const { return m_status; }
|
EState get_status() const { return m_status; }
|
||||||
|
|
||||||
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
float get_width() const { return std::abs(m_start_corner(0) - m_end_corner(0)); }
|
||||||
|
float get_height() const { return std::abs(m_start_corner(1) - m_end_corner(1)); }
|
||||||
|
float get_left() const { return std::min(m_start_corner(0), m_end_corner(0)); }
|
||||||
|
float get_right() const { return std::max(m_start_corner(0), m_end_corner(0)); }
|
||||||
|
float get_top() const { return std::max(m_start_corner(1), m_end_corner(1)); }
|
||||||
|
float get_bottom() const { return std::min(m_start_corner(1), m_end_corner(1)); }
|
||||||
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EState m_status = Off;
|
EState m_status = Off;
|
||||||
Vec2d m_start_corner;
|
Vec2d m_start_corner;
|
||||||
|
|
Loading…
Reference in a new issue