Rectangle selection -> Min size of rectangle selection set to 1 pixel
This commit is contained in:
parent
fdf1b8af81
commit
dfe2719656
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user