Cut improvements/ bug fixing:
* Wrong position of grabber is fixed * OSX specific: ObjectList: Fixed update of the info items after cut * Show info line, when Cut plane is invisible + Fixed non-Win build: added missed include
This commit is contained in:
parent
3a21f156c0
commit
2880704de9
@ -2,6 +2,7 @@
|
|||||||
#define slic3r_ObjectID_hpp_
|
#define slic3r_ObjectID_hpp_
|
||||||
|
|
||||||
#include <cereal/access.hpp>
|
#include <cereal/access.hpp>
|
||||||
|
#include <cereal/types/base_class.hpp>
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
|
@ -568,6 +568,42 @@ bool GLGizmoCut3D::render_reset_button(const std::string& label_id, const std::s
|
|||||||
return revert;
|
return revert;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLGizmoCut3D::render_cut_plane_line()
|
||||||
|
{
|
||||||
|
if (cut_line_processing())
|
||||||
|
return;
|
||||||
|
|
||||||
|
glsafe(::glEnable(GL_DEPTH_TEST));
|
||||||
|
glsafe(::glClear(GL_DEPTH_BUFFER_BIT));
|
||||||
|
|
||||||
|
const Camera& camera = wxGetApp().plater()->get_camera();
|
||||||
|
|
||||||
|
Vec3d unit_dir = m_rotation_m * Vec3d::UnitZ();
|
||||||
|
unit_dir.normalize();
|
||||||
|
|
||||||
|
Vec3d camera_dir = camera.get_dir_forward();
|
||||||
|
camera_dir.normalize();
|
||||||
|
|
||||||
|
if (std::abs(unit_dir.dot(camera_dir)) <= 0.025) {
|
||||||
|
GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat");
|
||||||
|
if (shader) {
|
||||||
|
m_circle.reset();
|
||||||
|
init_from_circle(m_circle, m_radius * 1.25);
|
||||||
|
|
||||||
|
const Transform3d view_model_matrix = camera.get_view_matrix() * translation_transform(m_plane_center) * m_rotation_m;
|
||||||
|
|
||||||
|
shader->start_using();
|
||||||
|
shader->set_uniform("projection_matrix", camera.get_projection_matrix());
|
||||||
|
shader->set_uniform("view_model_matrix", view_model_matrix);
|
||||||
|
shader->set_uniform("width", 0.1f);
|
||||||
|
|
||||||
|
m_circle.render();
|
||||||
|
|
||||||
|
shader->stop_using();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GLGizmoCut3D::render_cut_plane()
|
void GLGizmoCut3D::render_cut_plane()
|
||||||
{
|
{
|
||||||
if (cut_line_processing())
|
if (cut_line_processing())
|
||||||
@ -986,7 +1022,7 @@ bool GLGizmoCut3D::on_is_activable() const
|
|||||||
|
|
||||||
// This is assumed in GLCanvas3D::do_rotate, do not change this
|
// This is assumed in GLCanvas3D::do_rotate, do not change this
|
||||||
// without updating that function too.
|
// without updating that function too.
|
||||||
return selection.is_single_full_instance() && !is_dowel_object;
|
return selection.is_single_full_instance() && !is_dowel_object && !m_parent.is_layers_editing_enabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GLGizmoCut3D::on_is_selectable() const
|
bool GLGizmoCut3D::on_is_selectable() const
|
||||||
@ -1153,7 +1189,15 @@ void GLGizmoCut3D::on_stop_dragging()
|
|||||||
|
|
||||||
void GLGizmoCut3D::set_center_pos(const Vec3d& center_pos, bool force/* = false*/)
|
void GLGizmoCut3D::set_center_pos(const Vec3d& center_pos, bool force/* = false*/)
|
||||||
{
|
{
|
||||||
if (force || transformed_bounding_box(true).contains(center_pos)) {
|
bool can_set_center_pos = force || transformed_bounding_box(true).contains(center_pos);
|
||||||
|
if (!can_set_center_pos) {
|
||||||
|
const double old_dist = (m_bb_center - m_plane_center).norm();
|
||||||
|
const double new_dist = (m_bb_center - center_pos).norm();
|
||||||
|
// check if forcing is reasonable
|
||||||
|
if ( new_dist < old_dist)
|
||||||
|
can_set_center_pos = true;
|
||||||
|
}
|
||||||
|
if (can_set_center_pos) {
|
||||||
m_plane_center = center_pos;
|
m_plane_center = center_pos;
|
||||||
m_center_offset = m_plane_center - m_bb_center;
|
m_center_offset = m_plane_center - m_bb_center;
|
||||||
}
|
}
|
||||||
@ -1178,17 +1222,20 @@ BoundingBoxf3 GLGizmoCut3D::transformed_bounding_box(bool revert_move /*= false*
|
|||||||
// #ysFIXME !!!
|
// #ysFIXME !!!
|
||||||
BoundingBoxf3 ret;
|
BoundingBoxf3 ret;
|
||||||
|
|
||||||
const ModelObject* mo = m_c->selection_info()->model_object();
|
const CommonGizmosDataObjects::SelectionInfo* sel_info = m_c->selection_info();
|
||||||
|
if (!sel_info)
|
||||||
|
return ret;
|
||||||
|
const ModelObject* mo = sel_info->model_object();
|
||||||
if (!mo)
|
if (!mo)
|
||||||
return ret;
|
return ret;
|
||||||
const int instance_idx = m_c->selection_info()->get_active_instance();
|
const int instance_idx = sel_info->get_active_instance();
|
||||||
if (instance_idx < 0)
|
if (instance_idx < 0)
|
||||||
return ret;
|
return ret;
|
||||||
const ModelInstance* mi = mo->instances[instance_idx];
|
const ModelInstance* mi = mo->instances[instance_idx];
|
||||||
|
|
||||||
const Vec3d& instance_offset = mi->get_offset();
|
const Vec3d& instance_offset = mi->get_offset();
|
||||||
Vec3d cut_center_offset = m_plane_center - instance_offset;
|
Vec3d cut_center_offset = m_plane_center - instance_offset;
|
||||||
cut_center_offset[Z] -= m_c->selection_info()->get_sla_shift();
|
cut_center_offset[Z] -= sel_info->get_sla_shift();
|
||||||
|
|
||||||
const auto move = assemble_transform(-cut_center_offset);
|
const auto move = assemble_transform(-cut_center_offset);
|
||||||
const auto move2 = assemble_transform(m_plane_center);
|
const auto move2 = assemble_transform(m_plane_center);
|
||||||
@ -1330,6 +1377,8 @@ void GLGizmoCut3D::on_render()
|
|||||||
|
|
||||||
render_cut_line();
|
render_cut_line();
|
||||||
|
|
||||||
|
render_cut_plane_line();
|
||||||
|
|
||||||
m_selection_rectangle.render(m_parent);
|
m_selection_rectangle.render(m_parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1935,7 +1984,7 @@ void GLGizmoCut3D::clear_selection()
|
|||||||
void GLGizmoCut3D::reset_connectors()
|
void GLGizmoCut3D::reset_connectors()
|
||||||
{
|
{
|
||||||
m_c->selection_info()->model_object()->cut_connectors.clear();
|
m_c->selection_info()->model_object()->cut_connectors.clear();
|
||||||
update_model_object();
|
update_raycasters_for_picking();
|
||||||
clear_selection();
|
clear_selection();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1960,17 +2009,6 @@ void GLGizmoCut3D::update_connector_shape()
|
|||||||
m_connector_mesh = TriangleMesh(its);
|
m_connector_mesh = TriangleMesh(its);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoCut3D::update_model_object()
|
|
||||||
{
|
|
||||||
const ModelObjectPtrs& mos = wxGetApp().model().objects;
|
|
||||||
ModelObject* mo = m_c->selection_info()->model_object();
|
|
||||||
wxGetApp().obj_list()->update_info_items(std::find(mos.begin(), mos.end(), mo) - mos.begin());
|
|
||||||
|
|
||||||
m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS));
|
|
||||||
|
|
||||||
update_raycasters_for_picking();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GLGizmoCut3D::cut_line_processing() const
|
bool GLGizmoCut3D::cut_line_processing() const
|
||||||
{
|
{
|
||||||
return m_line_beg != Vec3d::Zero();
|
return m_line_beg != Vec3d::Zero();
|
||||||
@ -2053,7 +2091,7 @@ bool GLGizmoCut3D::add_connector(CutConnectors& connectors, const Vec2d& mouse_p
|
|||||||
m_selected.push_back(true);
|
m_selected.push_back(true);
|
||||||
m_selected_count = 1;
|
m_selected_count = 1;
|
||||||
assert(m_selected.size() == connectors.size());
|
assert(m_selected.size() == connectors.size());
|
||||||
update_model_object();
|
update_raycasters_for_picking();
|
||||||
m_parent.set_as_dirty();
|
m_parent.set_as_dirty();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -2084,7 +2122,7 @@ bool GLGizmoCut3D::delete_selected_connectors(CutConnectors& connectors)
|
|||||||
m_selected_count = 0;
|
m_selected_count = 0;
|
||||||
|
|
||||||
assert(m_selected.size() == connectors.size());
|
assert(m_selected.size() == connectors.size());
|
||||||
update_model_object();
|
update_raycasters_for_picking();
|
||||||
m_parent.set_as_dirty();
|
m_parent.set_as_dirty();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -237,6 +237,7 @@ private:
|
|||||||
void render_grabber_connection(const ColorRGBA& color, Transform3d view_matrix);
|
void render_grabber_connection(const ColorRGBA& color, Transform3d view_matrix);
|
||||||
void render_cut_plane_grabbers();
|
void render_cut_plane_grabbers();
|
||||||
void render_cut_line();
|
void render_cut_line();
|
||||||
|
void render_cut_plane_line();
|
||||||
void perform_cut(const Selection&selection);
|
void perform_cut(const Selection&selection);
|
||||||
void set_center_pos(const Vec3d¢er_pos, bool force = false);
|
void set_center_pos(const Vec3d¢er_pos, bool force = false);
|
||||||
bool update_bb();
|
bool update_bb();
|
||||||
@ -248,7 +249,6 @@ private:
|
|||||||
void init_connector_shapes();
|
void init_connector_shapes();
|
||||||
void update_connector_shape();
|
void update_connector_shape();
|
||||||
void validate_connector_settings();
|
void validate_connector_settings();
|
||||||
void update_model_object();
|
|
||||||
bool process_cut_line(SLAGizmoEventType action, const Vec2d& mouse_position);
|
bool process_cut_line(SLAGizmoEventType action, const Vec2d& mouse_position);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -34,6 +34,14 @@ void ObjectDataViewModelNode::init_container()
|
|||||||
#endif //__WXGTK__
|
#endif //__WXGTK__
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjectDataViewModelNode::invalidate_container()
|
||||||
|
{
|
||||||
|
#ifndef __WXGTK__
|
||||||
|
if (this->GetChildCount() == 0)
|
||||||
|
this->m_container = false;
|
||||||
|
#endif //__WXGTK__
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr char LayerRootIcon[] = "edit_layers_all";
|
static constexpr char LayerRootIcon[] = "edit_layers_all";
|
||||||
static constexpr char LayerIcon[] = "edit_layers_some";
|
static constexpr char LayerIcon[] = "edit_layers_some";
|
||||||
static constexpr char WarningIcon[] = "exclamation";
|
static constexpr char WarningIcon[] = "exclamation";
|
||||||
@ -724,10 +732,7 @@ wxDataViewItem ObjectDataViewModel::Delete(const wxDataViewItem &item)
|
|||||||
delete node_parent;
|
delete node_parent;
|
||||||
ret_item = wxDataViewItem(obj_node);
|
ret_item = wxDataViewItem(obj_node);
|
||||||
|
|
||||||
#ifndef __WXGTK__
|
obj_node->invalidate_container();
|
||||||
if (obj_node->GetChildCount() == 0)
|
|
||||||
obj_node->m_container = false;
|
|
||||||
#endif //__WXGTK__
|
|
||||||
ItemDeleted(ret_item, wxDataViewItem(node_parent));
|
ItemDeleted(ret_item, wxDataViewItem(node_parent));
|
||||||
return ret_item;
|
return ret_item;
|
||||||
}
|
}
|
||||||
@ -743,10 +748,7 @@ wxDataViewItem ObjectDataViewModel::Delete(const wxDataViewItem &item)
|
|||||||
delete node_parent;
|
delete node_parent;
|
||||||
ret_item = wxDataViewItem(obj_node);
|
ret_item = wxDataViewItem(obj_node);
|
||||||
|
|
||||||
#ifndef __WXGTK__
|
obj_node->invalidate_container();
|
||||||
if (obj_node->GetChildCount() == 0)
|
|
||||||
obj_node->m_container = false;
|
|
||||||
#endif //__WXGTK__
|
|
||||||
ItemDeleted(ret_item, wxDataViewItem(node_parent));
|
ItemDeleted(ret_item, wxDataViewItem(node_parent));
|
||||||
return ret_item;
|
return ret_item;
|
||||||
}
|
}
|
||||||
@ -768,10 +770,7 @@ wxDataViewItem ObjectDataViewModel::Delete(const wxDataViewItem &item)
|
|||||||
node_parent->m_volumes_cnt = 0;
|
node_parent->m_volumes_cnt = 0;
|
||||||
delete last_child_node;
|
delete last_child_node;
|
||||||
|
|
||||||
#ifndef __WXGTK__
|
node_parent->invalidate_container();
|
||||||
if (node_parent->GetChildCount() == 0)
|
|
||||||
node_parent->m_container = false;
|
|
||||||
#endif //__WXGTK__
|
|
||||||
ItemDeleted(parent, wxDataViewItem(last_child_node));
|
ItemDeleted(parent, wxDataViewItem(last_child_node));
|
||||||
|
|
||||||
wxCommandEvent event(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED);
|
wxCommandEvent event(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED);
|
||||||
@ -806,10 +805,7 @@ wxDataViewItem ObjectDataViewModel::Delete(const wxDataViewItem &item)
|
|||||||
|
|
||||||
// set m_containet to FALSE if parent has no child
|
// set m_containet to FALSE if parent has no child
|
||||||
if (node_parent) {
|
if (node_parent) {
|
||||||
#ifndef __WXGTK__
|
node_parent->invalidate_container();
|
||||||
if (node_parent->GetChildCount() == 0)
|
|
||||||
node_parent->m_container = false;
|
|
||||||
#endif //__WXGTK__
|
|
||||||
ret_item = parent;
|
ret_item = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -851,10 +847,7 @@ wxDataViewItem ObjectDataViewModel::DeleteLastInstance(const wxDataViewItem &par
|
|||||||
parent_node->set_printable_icon(last_inst_printable);
|
parent_node->set_printable_icon(last_inst_printable);
|
||||||
ItemDeleted(parent_item, inst_root_item);
|
ItemDeleted(parent_item, inst_root_item);
|
||||||
ItemChanged(parent_item);
|
ItemChanged(parent_item);
|
||||||
#ifndef __WXGTK__
|
parent_node->invalidate_container();
|
||||||
if (parent_node->GetChildCount() == 0)
|
|
||||||
parent_node->m_container = false;
|
|
||||||
#endif //__WXGTK__
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update object_node printable property
|
// update object_node printable property
|
||||||
@ -899,10 +892,7 @@ void ObjectDataViewModel::DeleteChildren(wxDataViewItem& parent)
|
|||||||
ItemDeleted(parent, item);
|
ItemDeleted(parent, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set m_containet to FALSE if parent has no child
|
root->invalidate_container();
|
||||||
#ifndef __WXGTK__
|
|
||||||
root->m_container = false;
|
|
||||||
#endif //__WXGTK__
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectDataViewModel::DeleteVolumeChildren(wxDataViewItem& parent)
|
void ObjectDataViewModel::DeleteVolumeChildren(wxDataViewItem& parent)
|
||||||
@ -932,11 +922,7 @@ void ObjectDataViewModel::DeleteVolumeChildren(wxDataViewItem& parent)
|
|||||||
ItemDeleted(parent, item);
|
ItemDeleted(parent, item);
|
||||||
}
|
}
|
||||||
root->m_volumes_cnt = 0;
|
root->m_volumes_cnt = 0;
|
||||||
|
root->invalidate_container();
|
||||||
// set m_containet to FALSE if parent has no child
|
|
||||||
#ifndef __WXGTK__
|
|
||||||
root->m_container = false;
|
|
||||||
#endif //__WXGTK__
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectDataViewModel::DeleteSettings(const wxDataViewItem& parent)
|
void ObjectDataViewModel::DeleteSettings(const wxDataViewItem& parent)
|
||||||
|
@ -128,6 +128,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void init_container();
|
void init_container();
|
||||||
|
void invalidate_container();
|
||||||
|
|
||||||
bool IsContainer() const
|
bool IsContainer() const
|
||||||
{
|
{
|
||||||
return m_container;
|
return m_container;
|
||||||
|
@ -4470,7 +4470,10 @@ void Plater::priv::on_action_split_volumes(SimpleEvent&)
|
|||||||
|
|
||||||
void Plater::priv::on_action_layersediting(SimpleEvent&)
|
void Plater::priv::on_action_layersediting(SimpleEvent&)
|
||||||
{
|
{
|
||||||
view3D->enable_layers_editing(!view3D->is_layers_editing_enabled());
|
const bool enable_layersediting = !view3D->is_layers_editing_enabled();
|
||||||
|
view3D->enable_layers_editing(enable_layersediting);
|
||||||
|
if (enable_layersediting)
|
||||||
|
view3D->get_canvas3d()->reset_all_gizmos();
|
||||||
notification_manager->set_move_from_overlay(view3D->is_layers_editing_enabled());
|
notification_manager->set_move_from_overlay(view3D->is_layers_editing_enabled());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4513,7 +4516,7 @@ void Plater::priv::on_right_click(RBtnEvent& evt)
|
|||||||
selection.is_single_full_object() ||
|
selection.is_single_full_object() ||
|
||||||
selection.is_multiple_full_instance();
|
selection.is_multiple_full_instance();
|
||||||
#if ENABLE_WORLD_COORDINATE
|
#if ENABLE_WORLD_COORDINATE
|
||||||
const bool is_part = selection.is_single_volume_or_modifier();
|
const bool is_part = selection.is_single_volume_or_modifier() && ! selection.is_any_connector();
|
||||||
#else
|
#else
|
||||||
const bool is_part = selection.is_single_volume() || selection.is_single_modifier();
|
const bool is_part = selection.is_single_volume() || selection.is_single_modifier();
|
||||||
#endif // ENABLE_WORLD_COORDINATE
|
#endif // ENABLE_WORLD_COORDINATE
|
||||||
|
Loading…
Reference in New Issue
Block a user