Merge remote-tracking branch 'origin/master' into tm_sla_supports_backend

This commit is contained in:
tamasmeszaros 2018-11-30 14:28:27 +01:00
commit 761a8fcc95
9 changed files with 63 additions and 115 deletions

View File

@ -13,8 +13,6 @@
//============= //=============
#define ENABLE_1_42_0 1 #define ENABLE_1_42_0 1
// Add double click on gizmo grabbers to reset transformation components to their default value
#define ENABLE_GIZMOS_RESET (1 && ENABLE_1_42_0)
// Uses a unique opengl context // Uses a unique opengl context
#define ENABLE_USE_UNIQUE_GLCONTEXT (1 && ENABLE_1_42_0) #define ENABLE_USE_UNIQUE_GLCONTEXT (1 && ENABLE_1_42_0)
// Disable synchronization of unselected instances // Disable synchronization of unselected instances

View File

@ -67,7 +67,7 @@ void Bed_2D::repaint()
shift(1) - (cbb.max(1) - GetSize().GetHeight())); shift(1) - (cbb.max(1) - GetSize().GetHeight()));
// draw bed fill // draw bed fill
dc.SetBrush(wxBrush(wxColour(255, 255, 255), wxSOLID)); dc.SetBrush(wxBrush(wxColour(255, 255, 255), wxBRUSHSTYLE_SOLID));
wxPointList pt_list; wxPointList pt_list;
for (auto pt: m_bed_shape) for (auto pt: m_bed_shape)
{ {
@ -87,7 +87,7 @@ void Bed_2D::repaint()
} }
polylines = intersection_pl(polylines, bed_polygon); polylines = intersection_pl(polylines, bed_polygon);
dc.SetPen(wxPen(wxColour(230, 230, 230), 1, wxSOLID)); dc.SetPen(wxPen(wxColour(230, 230, 230), 1, wxPENSTYLE_SOLID));
for (auto pl : polylines) for (auto pl : polylines)
{ {
for (size_t i = 0; i < pl.points.size()-1; i++) { for (size_t i = 0; i < pl.points.size()-1; i++) {
@ -98,8 +98,8 @@ void Bed_2D::repaint()
} }
// draw bed contour // draw bed contour
dc.SetPen(wxPen(wxColour(0, 0, 0), 1, wxSOLID)); dc.SetPen(wxPen(wxColour(0, 0, 0), 1, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxTRANSPARENT)); dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT));
dc.DrawPolygon(&pt_list, 0, 0); dc.DrawPolygon(&pt_list, 0, 0);
auto origin_px = to_pixels(Vec2d(0, 0)); auto origin_px = to_pixels(Vec2d(0, 0));
@ -108,7 +108,7 @@ void Bed_2D::repaint()
auto axes_len = 50; auto axes_len = 50;
auto arrow_len = 6; auto arrow_len = 6;
auto arrow_angle = Geometry::deg2rad(45.0); auto arrow_angle = Geometry::deg2rad(45.0);
dc.SetPen(wxPen(wxColour(255, 0, 0), 2, wxSOLID)); // red dc.SetPen(wxPen(wxColour(255, 0, 0), 2, wxPENSTYLE_SOLID)); // red
auto x_end = Vec2d(origin_px(0) + axes_len, origin_px(1)); auto x_end = Vec2d(origin_px(0) + axes_len, origin_px(1));
dc.DrawLine(wxPoint(origin_px(0), origin_px(1)), wxPoint(x_end(0), x_end(1))); dc.DrawLine(wxPoint(origin_px(0), origin_px(1)), wxPoint(x_end(0), x_end(1)));
for (auto angle : { -arrow_angle, arrow_angle }) { for (auto angle : { -arrow_angle, arrow_angle }) {
@ -116,7 +116,7 @@ void Bed_2D::repaint()
dc.DrawLine(wxPoint(x_end(0), x_end(1)), wxPoint(end(0), end(1))); dc.DrawLine(wxPoint(x_end(0), x_end(1)), wxPoint(end(0), end(1)));
} }
dc.SetPen(wxPen(wxColour(0, 255, 0), 2, wxSOLID)); // green dc.SetPen(wxPen(wxColour(0, 255, 0), 2, wxPENSTYLE_SOLID)); // green
auto y_end = Vec2d(origin_px(0), origin_px(1) - axes_len); auto y_end = Vec2d(origin_px(0), origin_px(1) - axes_len);
dc.DrawLine(wxPoint(origin_px(0), origin_px(1)), wxPoint(y_end(0), y_end(1))); dc.DrawLine(wxPoint(origin_px(0), origin_px(1)), wxPoint(y_end(0), y_end(1)));
for (auto angle : { -arrow_angle, arrow_angle }) { for (auto angle : { -arrow_angle, arrow_angle }) {
@ -125,13 +125,13 @@ void Bed_2D::repaint()
} }
// draw origin // draw origin
dc.SetPen(wxPen(wxColour(0, 0, 0), 1, wxSOLID)); dc.SetPen(wxPen(wxColour(0, 0, 0), 1, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxSOLID)); dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_SOLID));
dc.DrawCircle(origin_px(0), origin_px(1), 3); dc.DrawCircle(origin_px(0), origin_px(1), 3);
static const auto origin_label = wxString("(0,0)"); static const auto origin_label = wxString("(0,0)");
dc.SetTextForeground(wxColour(0, 0, 0)); dc.SetTextForeground(wxColour(0, 0, 0));
dc.SetFont(wxFont(10, wxDEFAULT, wxNORMAL, wxNORMAL)); dc.SetFont(wxFont(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL));
auto extent = dc.GetTextExtent(origin_label); auto extent = dc.GetTextExtent(origin_label);
const auto origin_label_x = origin_px(0) <= cw / 2 ? origin_px(0) + 1 : origin_px(0) - 1 - extent.GetWidth(); const auto origin_label_x = origin_px(0) <= cw / 2 ? origin_px(0) + 1 : origin_px(0) - 1 - extent.GetWidth();
const auto origin_label_y = origin_px(1) <= ch / 2 ? origin_px(1) + 1 : origin_px(1) - 1 - extent.GetHeight(); const auto origin_label_y = origin_px(1) <= ch / 2 ? origin_px(1) + 1 : origin_px(1) - 1 - extent.GetHeight();
@ -140,8 +140,8 @@ void Bed_2D::repaint()
// draw current position // draw current position
if (m_pos!= Vec2d(0, 0)) { if (m_pos!= Vec2d(0, 0)) {
auto pos_px = to_pixels(m_pos); auto pos_px = to_pixels(m_pos);
dc.SetPen(wxPen(wxColour(200, 0, 0), 2, wxSOLID)); dc.SetPen(wxPen(wxColour(200, 0, 0), 2, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(wxColour(200, 0, 0), wxTRANSPARENT)); dc.SetBrush(wxBrush(wxColour(200, 0, 0), wxBRUSHSTYLE_TRANSPARENT));
dc.DrawCircle(pos_px(0), pos_px(1), 5); dc.DrawCircle(pos_px(0), pos_px(1), 5);
dc.DrawLine(pos_px(0) - 15, pos_px(1), pos_px(0) + 15, pos_px(1)); dc.DrawLine(pos_px(0) - 15, pos_px(1), pos_px(0) + 15, pos_px(1));

View File

@ -28,6 +28,7 @@ public:
Bed_2D(wxWindow* parent) Bed_2D(wxWindow* parent)
{ {
Create(parent, wxID_ANY, wxDefaultPosition, wxSize(250, -1), wxTAB_TRAVERSAL); Create(parent, wxID_ANY, wxDefaultPosition, wxSize(250, -1), wxTAB_TRAVERSAL);
SetBackgroundStyle(wxBG_STYLE_PAINT); // to avoid assert message after wxAutoBufferedPaintDC
// m_user_drawn_background = $^O ne 'darwin'; // m_user_drawn_background = $^O ne 'darwin';
#ifdef __APPLE__ #ifdef __APPLE__
m_user_drawn_background = false; m_user_drawn_background = false;

View File

@ -128,6 +128,7 @@ public:
Field(const ConfigOptionDef& opt, const t_config_option_key& id) : m_opt(opt), m_opt_id(id) {}; Field(const ConfigOptionDef& opt, const t_config_option_key& id) : m_opt(opt), m_opt_id(id) {};
Field(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : m_parent(parent), m_opt(opt), m_opt_id(id) {}; Field(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : m_parent(parent), m_opt(opt), m_opt_id(id) {};
virtual ~Field() {}
/// If you don't know what you are getting back, check both methods for nullptr. /// If you don't know what you are getting back, check both methods for nullptr.
virtual wxSizer* getSizer() { return nullptr; } virtual wxSizer* getSizer() { return nullptr; }

View File

@ -1043,13 +1043,11 @@ GLCanvas3D::Mouse::Drag::Drag()
GLCanvas3D::Mouse::Mouse() GLCanvas3D::Mouse::Mouse()
: dragging(false) : dragging(false)
, left_down(false)
, position(DBL_MAX, DBL_MAX) , position(DBL_MAX, DBL_MAX)
#if ENABLE_GIZMOS_ON_TOP #if ENABLE_GIZMOS_ON_TOP
, scene_position(DBL_MAX, DBL_MAX, DBL_MAX) , scene_position(DBL_MAX, DBL_MAX, DBL_MAX)
#endif // ENABLE_GIZMOS_ON_TOP #endif // ENABLE_GIZMOS_ON_TOP
#if ENABLE_GIZMOS_RESET
, ignore_up_event(false)
#endif // ENABLE_GIZMOS_RESET
{ {
} }
@ -1467,7 +1465,7 @@ void GLCanvas3D::Selection::translate(const Vec3d& displacement)
(*m_volumes)[i]->set_instance_offset(m_cache.volumes_data[i].get_instance_position() + displacement); (*m_volumes)[i]->set_instance_offset(m_cache.volumes_data[i].get_instance_position() + displacement);
else if (m_mode == Volume) else if (m_mode == Volume)
{ {
Vec3d local_displacement = m_cache.volumes_data[i].get_instance_rotation_matrix().inverse() * displacement; Vec3d local_displacement = (m_cache.volumes_data[i].get_instance_rotation_matrix() * m_cache.volumes_data[i].get_instance_scale_matrix()).inverse() * displacement;
(*m_volumes)[i]->set_volume_offset(m_cache.volumes_data[i].get_volume_position() + local_displacement); (*m_volumes)[i]->set_volume_offset(m_cache.volumes_data[i].get_volume_position() + local_displacement);
} }
#else #else
@ -2420,7 +2418,7 @@ void GLCanvas3D::Selection::_ensure_on_bed()
} }
#endif // ENABLE_ENSURE_ON_BED_WHILE_SCALING #endif // ENABLE_ENSURE_ON_BED_WHILE_SCALING
const float GLCanvas3D::Gizmos::OverlayTexturesScale = 0.75f; const float GLCanvas3D::Gizmos::OverlayTexturesScale = 1.0f;
const float GLCanvas3D::Gizmos::OverlayOffsetX = 10.0f * OverlayTexturesScale; const float GLCanvas3D::Gizmos::OverlayOffsetX = 10.0f * OverlayTexturesScale;
const float GLCanvas3D::Gizmos::OverlayGapY = 5.0f * OverlayTexturesScale; const float GLCanvas3D::Gizmos::OverlayGapY = 5.0f * OverlayTexturesScale;
@ -2691,18 +2689,6 @@ void GLCanvas3D::Gizmos::update(const Linef3& mouse_ray, bool shift_down, const
curr->update(GLGizmoBase::UpdateData(mouse_ray, mouse_pos, shift_down)); curr->update(GLGizmoBase::UpdateData(mouse_ray, mouse_pos, shift_down));
} }
#if ENABLE_GIZMOS_RESET
void GLCanvas3D::Gizmos::process_double_click()
{
if (!m_enabled)
return;
GLGizmoBase* curr = _get_current();
if (curr != nullptr)
curr->process_double_click();
}
#endif // ENABLE_GIZMOS_RESET
GLCanvas3D::Gizmos::EType GLCanvas3D::Gizmos::get_current_type() const GLCanvas3D::Gizmos::EType GLCanvas3D::Gizmos::get_current_type() const
{ {
return m_current; return m_current;
@ -2978,7 +2964,8 @@ float GLCanvas3D::Gizmos::_get_total_overlay_height() const
{ {
if (it->first == SlaSupports && wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA) if (it->first == SlaSupports && wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA)
continue; continue;
height += (float)it->second->get_textures_size() + OverlayGapY;
height += (float)it->second->get_textures_size() * OverlayTexturesScale + OverlayGapY;
} }
return height - OverlayGapY; return height - OverlayGapY;
@ -4546,40 +4533,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
m_toolbar_action_running = true; m_toolbar_action_running = true;
m_toolbar.do_action((unsigned int)toolbar_contains_mouse); m_toolbar.do_action((unsigned int)toolbar_contains_mouse);
} }
#if ENABLE_GIZMOS_RESET
else if (evt.LeftDClick() && m_gizmos.grabber_contains_mouse())
{
m_mouse.ignore_up_event = true;
m_gizmos.process_double_click();
switch (m_gizmos.get_current_type())
{
case Gizmos::Scale:
{
m_selection.scale(m_gizmos.get_scale(), false);
do_scale();
wxGetApp().obj_manipul()->update_settings_value(m_selection);
m_dirty = true;
break;
}
#if !ENABLE_WORLD_ROTATIONS
case Gizmos::Rotate:
{
m_selection.rotate(m_gizmos.get_rotation(), false);
do_rotate();
wxGetApp().obj_manipul()->update_settings_value(m_selection);
m_dirty = true;
break;
}
#endif // !ENABLE_WORLD_ROTATIONS
default:
{
break;
}
}
}
#endif // ENABLE_GIZMOS_RESET
else if (evt.LeftDown() || evt.RightDown()) else if (evt.LeftDown() || evt.RightDown())
{ {
m_mouse.left_down = evt.LeftDown();
// If user pressed left or right button we first check whether this happened // If user pressed left or right button we first check whether this happened
// on a volume or not. // on a volume or not.
m_layers_editing.state = LayersEditing::Unknown; m_layers_editing.state = LayersEditing::Unknown;
@ -4610,9 +4567,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
if (evt.LeftDown()) if (evt.LeftDown())
{ {
m_gizmos.delete_current_grabber(true); m_gizmos.delete_current_grabber(true);
#if ENABLE_GIZMOS_RESET
m_mouse.ignore_up_event = true;
#endif // ENABLE_GIZMOS_RESET
m_dirty = true; m_dirty = true;
} }
} }
@ -4646,6 +4600,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
{ {
m_toolbar_action_running = true; m_toolbar_action_running = true;
m_toolbar.do_action((unsigned int)toolbar_contains_mouse); m_toolbar.do_action((unsigned int)toolbar_contains_mouse);
m_mouse.left_down = false;
} }
else else
{ {
@ -4664,7 +4619,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
m_selection.remove(m_hover_volume_id); m_selection.remove(m_hover_volume_id);
else else
{ {
bool add_as_single = !already_selected && !evt.ShiftDown(); bool add_as_single = !already_selected && !shift_down;
m_selection.add(m_hover_volume_id, add_as_single); m_selection.add(m_hover_volume_id, add_as_single);
} }
@ -4871,11 +4826,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
else if (evt.LeftUp() && !m_mouse.dragging && (m_hover_volume_id == -1) && !gizmos_overlay_contains_mouse && !m_gizmos.is_dragging() && !is_layers_editing_enabled()) else if (evt.LeftUp() && !m_mouse.dragging && (m_hover_volume_id == -1) && !gizmos_overlay_contains_mouse && !m_gizmos.is_dragging() && !is_layers_editing_enabled())
{ {
// deselect and propagate event through callback // deselect and propagate event through callback
#if ENABLE_GIZMOS_RESET
if (!m_mouse.ignore_up_event && m_picking_enabled && !m_toolbar_action_running)
#else
if (m_picking_enabled && !m_toolbar_action_running) if (m_picking_enabled && !m_toolbar_action_running)
#endif // ENABLE_GIZMOS_RESET
{ {
m_selection.clear(); m_selection.clear();
m_selection.set_mode(Selection::Instance); m_selection.set_mode(Selection::Instance);
@ -4883,10 +4834,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT));
_update_gizmos_data(); _update_gizmos_data();
} }
#if ENABLE_GIZMOS_RESET
else if (m_mouse.ignore_up_event)
m_mouse.ignore_up_event = false;
#endif // ENABLE_GIZMOS_RESET
} }
else if (evt.LeftUp() && m_gizmos.is_dragging()) else if (evt.LeftUp() && m_gizmos.is_dragging())
{ {
@ -4930,6 +4877,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
m_mouse.set_start_position_3D_as_invalid(); m_mouse.set_start_position_3D_as_invalid();
m_mouse.set_start_position_2D_as_invalid(); m_mouse.set_start_position_2D_as_invalid();
m_mouse.dragging = false; m_mouse.dragging = false;
m_mouse.left_down = false;
m_toolbar_action_running = false; m_toolbar_action_running = false;
m_dirty = true; m_dirty = true;
@ -5612,7 +5560,7 @@ void GLCanvas3D::_picking_pass() const
{ {
const Vec2d& pos = m_mouse.position; const Vec2d& pos = m_mouse.position;
if (m_picking_enabled && !m_mouse.dragging && (pos != Vec2d(DBL_MAX, DBL_MAX))) if (m_picking_enabled && !m_mouse.dragging && !m_mouse.left_down && (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.

View File

@ -323,14 +323,12 @@ class GLCanvas3D
}; };
bool dragging; bool dragging;
bool left_down;
Vec2d position; Vec2d position;
#if ENABLE_GIZMOS_ON_TOP #if ENABLE_GIZMOS_ON_TOP
Vec3d scene_position; Vec3d scene_position;
#endif // ENABLE_GIZMOS_ON_TOP #endif // ENABLE_GIZMOS_ON_TOP
Drag drag; Drag drag;
#if ENABLE_GIZMOS_RESET
bool ignore_up_event;
#endif // ENABLE_GIZMOS_RESET
Mouse(); Mouse();
@ -519,6 +517,8 @@ public:
const IndicesList& get_volume_idxs() const { return m_list; } const IndicesList& get_volume_idxs() const { return m_list; }
const GLVolume* get_volume(unsigned int volume_idx) const; const GLVolume* get_volume(unsigned int volume_idx) const;
const ObjectIdxsToInstanceIdxsMap& get_content() const { return m_cache.content; }
unsigned int volumes_count() const { return (unsigned int)m_list.size(); } unsigned int volumes_count() const { return (unsigned int)m_list.size(); }
const BoundingBoxf3& get_bounding_box() const; const BoundingBoxf3& get_bounding_box() const;
@ -629,9 +629,6 @@ private:
bool overlay_contains_mouse(const GLCanvas3D& canvas, const Vec2d& mouse_pos) const; bool overlay_contains_mouse(const GLCanvas3D& canvas, const Vec2d& mouse_pos) const;
bool grabber_contains_mouse() const; bool grabber_contains_mouse() const;
void update(const Linef3& mouse_ray, bool shift_down, const Point* mouse_pos = nullptr); void update(const Linef3& mouse_ray, bool shift_down, const Point* mouse_pos = nullptr);
#if ENABLE_GIZMOS_RESET
void process_double_click();
#endif // ENABLE_GIZMOS_RESET
Rect get_reset_rect_viewport(const GLCanvas3D& canvas) const; Rect get_reset_rect_viewport(const GLCanvas3D& canvas) const;
EType get_current_type() const; EType get_current_type() const;

View File

@ -829,14 +829,6 @@ void GLGizmoScale3D::on_update(const UpdateData& data)
do_scale_uniform(data); do_scale_uniform(data);
} }
#if ENABLE_GIZMOS_RESET
void GLGizmoScale3D::on_process_double_click()
{
if (m_hover_id >= 6)
m_scale = Vec3d::Ones();
}
#endif // ENABLE_GIZMOS_RESET
void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const
{ {
bool single_instance = selection.is_single_full_instance(); bool single_instance = selection.is_single_full_instance();
@ -1352,7 +1344,7 @@ bool GLGizmoFlatten::on_init()
std::string GLGizmoFlatten::on_get_name() const std::string GLGizmoFlatten::on_get_name() const
{ {
return L("Flatten"); return L("Place on face");
} }
bool GLGizmoFlatten::on_is_activable(const GLCanvas3D::Selection& selection) const bool GLGizmoFlatten::on_is_activable(const GLCanvas3D::Selection& selection) const

View File

@ -136,10 +136,6 @@ public:
void update(const UpdateData& data); void update(const UpdateData& data);
#if ENABLE_GIZMOS_RESET
void process_double_click() { on_process_double_click(); }
#endif // ENABLE_GIZMOS_RESET
void render(const GLCanvas3D::Selection& selection) const { on_render(selection); } void render(const GLCanvas3D::Selection& selection) const { on_render(selection); }
void render_for_picking(const GLCanvas3D::Selection& selection) const { on_render_for_picking(selection); } void render_for_picking(const GLCanvas3D::Selection& selection) const { on_render_for_picking(selection); }
@ -163,9 +159,6 @@ protected:
virtual void on_start_dragging(const GLCanvas3D::Selection& selection) {} virtual void on_start_dragging(const GLCanvas3D::Selection& selection) {}
virtual void on_stop_dragging() {} virtual void on_stop_dragging() {}
virtual void on_update(const UpdateData& data) = 0; virtual void on_update(const UpdateData& data) = 0;
#if ENABLE_GIZMOS_RESET
virtual void on_process_double_click() {}
#endif // ENABLE_GIZMOS_RESET
virtual void on_render(const GLCanvas3D::Selection& selection) const = 0; virtual void on_render(const GLCanvas3D::Selection& selection) const = 0;
virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const = 0; virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const = 0;
@ -225,11 +218,6 @@ protected:
virtual std::string on_get_name() const { return ""; } virtual std::string on_get_name() const { return ""; }
virtual void on_start_dragging(const GLCanvas3D::Selection& selection); virtual void on_start_dragging(const GLCanvas3D::Selection& selection);
virtual void on_update(const UpdateData& data); virtual void on_update(const UpdateData& data);
#if ENABLE_GIZMOS_RESET
#if !ENABLE_WORLD_ROTATIONS
virtual void on_process_double_click() { m_angle = 0.0; }
#endif // !ENABLE_WORLD_ROTATIONS
#endif // ENABLE_GIZMOS_RESET
virtual void on_render(const GLCanvas3D::Selection& selection) const; virtual void on_render(const GLCanvas3D::Selection& selection) const;
virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const;
@ -294,15 +282,6 @@ protected:
g.update(data); g.update(data);
} }
} }
#if ENABLE_GIZMOS_RESET
#if !ENABLE_WORLD_ROTATIONS
virtual void on_process_double_click()
{
if (m_hover_id != -1)
m_gizmos[m_hover_id].process_double_click();
}
#endif // !ENABLE_WORLD_ROTATIONS
#endif // ENABLE_GIZMOS_RESET
virtual void on_render(const GLCanvas3D::Selection& selection) const; virtual void on_render(const GLCanvas3D::Selection& selection) const;
virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const
{ {
@ -346,9 +325,6 @@ protected:
virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return !selection.is_wipe_tower(); } virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return !selection.is_wipe_tower(); }
virtual void on_start_dragging(const GLCanvas3D::Selection& selection); virtual void on_start_dragging(const GLCanvas3D::Selection& selection);
virtual void on_update(const UpdateData& data); virtual void on_update(const UpdateData& data);
#if ENABLE_GIZMOS_RESET
virtual void on_process_double_click();
#endif // ENABLE_GIZMOS_RESET
virtual void on_render(const GLCanvas3D::Selection& selection) const; virtual void on_render(const GLCanvas3D::Selection& selection) const;
virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const;

View File

@ -1358,6 +1358,41 @@ void ObjectList::update_selections()
sels.Add(m_objects_model->GetItemByInstanceId(selection.get_object_idx(), idx)); sels.Add(m_objects_model->GetItemByInstanceId(selection.get_object_idx(), idx));
} }
} }
else if (selection.is_mixed())
{
auto& objects_content_list = selection.get_content();
for (auto idx : selection.get_volume_idxs()) {
const auto gl_vol = selection.get_volume(idx);
const auto& glv_obj_idx = gl_vol->object_idx();
const auto& glv_ins_idx = gl_vol->instance_idx();
bool is_selected = false;
for (auto obj_ins : objects_content_list) {
if (obj_ins.first == glv_obj_idx) {
if (obj_ins.second.find(glv_ins_idx) != obj_ins.second.end()) {
if (glv_ins_idx == 0 && (*m_objects)[glv_obj_idx]->instances.size() == 1)
sels.Add(m_objects_model->GetItemById(glv_obj_idx));
else
sels.Add(m_objects_model->GetItemByInstanceId(glv_obj_idx, glv_ins_idx));
is_selected = true;
break;
}
}
}
if (is_selected)
continue;
const auto& glv_vol_idx = gl_vol->volume_idx();
if (glv_vol_idx == 0 && (*m_objects)[glv_obj_idx]->volumes.size() == 1)
sels.Add(m_objects_model->GetItemById(glv_obj_idx));
else
sels.Add(m_objects_model->GetItemByVolumeId(glv_obj_idx, glv_vol_idx));
}
}
select_items(sels); select_items(sels);
} }