Rectangle selection -> Min size of rectangle selection set to 1 pixel

This commit is contained in:
Enrico Turri 2019-04-29 08:31:32 +02:00
parent fdf1b8af81
commit dfe2719656

View File

@ -3751,55 +3751,52 @@ void GLCanvas3D::_rectangular_selection_picking_pass() const
if (m_multisample_allowed) if (m_multisample_allowed)
glsafe(::glEnable(GL_MULTISAMPLE)); glsafe(::glEnable(GL_MULTISAMPLE));
int width = (int)m_rectangle_selection.get_width(); int width = std::max((int)m_rectangle_selection.get_width(), 1);
int height = (int)m_rectangle_selection.get_height(); int height = std::max((int)m_rectangle_selection.get_height(), 1);
int px_count = width * height; int px_count = width * height;
if (px_count > 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))
{ {
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))
{
#define USE_PARALLEL 1 #define USE_PARALLEL 1
#if USE_PARALLEL #if USE_PARALLEL
struct Pixel struct Pixel
{
std::array<GLubyte, 4> data;
int id() const { return data[0] + (data[1] << 8) + (data[2] << 16); }
};
std::vector<Pixel> frame(px_count);
glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data()));
tbb::spin_mutex mutex;
tbb::parallel_for(tbb::blocked_range<size_t>(0, frame.size(), (size_t)width),
[this, &frame, &idxs, &mutex](const tbb::blocked_range<size_t>& range) {
for (size_t i = range.begin(); i < range.end(); ++i)
{ {
std::array<GLubyte, 4> data; int volume_id = frame[i].id();
int id() const { return data[0] + (data[1] << 8) + (data[2] << 16); } if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
};
std::vector<Pixel> frame(px_count);
glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data()));
tbb::spin_mutex mutex;
tbb::parallel_for(tbb::blocked_range<size_t>(0, frame.size(), (size_t)width),
[this, &frame, &idxs, &mutex](const tbb::blocked_range<size_t>& range) {
for (size_t i = range.begin(); i < range.end(); ++i)
{ {
int volume_id = frame[i].id(); mutex.lock();
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) idxs.insert(volume_id);
{ mutex.unlock();
mutex.lock();
idxs.insert(volume_id);
mutex.unlock();
}
} }
} }
);
#else
std::vector<GLubyte> frame(4 * px_count);
glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data()));
for (int i = 0; i < px_count; ++i)
{
int px_id = 4 * i;
int volume_id = frame[px_id] + (frame[px_id + 1] << 8) + (frame[px_id + 2] << 16);
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
idxs.insert(volume_id);
}
#endif // USE_PARALLEL
} }
);
#else
std::vector<GLubyte> frame(4 * px_count);
glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data()));
for (int i = 0; i < px_count; ++i)
{
int px_id = 4 * i;
int volume_id = frame[px_id] + (frame[px_id + 1] << 8) + (frame[px_id + 2] << 16);
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
idxs.insert(volume_id);
}
#endif // USE_PARALLEL
} }
} }