InstancesHider implementation

Any gizmo can now ask for hiding all but the active instance by returning proper value from on_get_requirements
This commit is contained in:
Lukas Matena 2020-04-03 18:04:37 +02:00
parent 593e7a1546
commit 3db3a61520
3 changed files with 48 additions and 9 deletions

View file

@ -14,7 +14,7 @@ CommonGizmosDataPool::CommonGizmosDataPool(GLCanvas3D* canvas)
{ {
using c = CommonGizmosDataID; using c = CommonGizmosDataID;
m_data[c::SelectionInfo].reset( new SelectionInfo(this)); m_data[c::SelectionInfo].reset( new SelectionInfo(this));
//m_data[c::InstancesHider].reset( new InstancesHider(this)); m_data[c::InstancesHider].reset( new InstancesHider(this));
//m_data[c::HollowedMesh].reset( new HollowedMesh(this)); //m_data[c::HollowedMesh].reset( new HollowedMesh(this));
//m_data[c::ClippingPlaneWrapper].reset(new ClippingPlaneWrapper(this)); //m_data[c::ClippingPlaneWrapper].reset(new ClippingPlaneWrapper(this));
//m_data[c::SupportsClipper].reset( new SupportsClipper(this)); //m_data[c::SupportsClipper].reset( new SupportsClipper(this));
@ -27,8 +27,10 @@ void CommonGizmosDataPool::update(CommonGizmosDataID required)
for (auto& [id, data] : m_data) { for (auto& [id, data] : m_data) {
if (int(required) & int(CommonGizmosDataID(id))) if (int(required) & int(CommonGizmosDataID(id)))
data->update(); data->update();
else if (data->is_valid()) else
data->release(); if (data->is_valid())
data->release();
} }
} }
@ -36,6 +38,7 @@ void CommonGizmosDataPool::update(CommonGizmosDataID required)
SelectionInfo* CommonGizmosDataPool::selection_info() SelectionInfo* CommonGizmosDataPool::selection_info()
{ {
SelectionInfo* sel_info = dynamic_cast<SelectionInfo*>(m_data[CommonGizmosDataID::SelectionInfo].get()); SelectionInfo* sel_info = dynamic_cast<SelectionInfo*>(m_data[CommonGizmosDataID::SelectionInfo].get());
assert(sel_info->is_valid());
return sel_info; return sel_info;
} }
@ -54,7 +57,7 @@ bool CommonGizmosDataPool::check_dependencies(CommonGizmosDataID required) const
void SelectionInfo::on_update() void SelectionInfo::on_update()
{ {
Selection selection = m_common->get_canvas()->get_selection(); const Selection& selection = m_common->get_canvas()->get_selection();
if (selection.is_single_full_instance()) if (selection.is_single_full_instance())
m_model_object = selection.get_model()->objects[selection.get_object_idx()]; m_model_object = selection.get_model()->objects[selection.get_object_idx()];
else else
@ -66,5 +69,36 @@ void SelectionInfo::on_release()
m_model_object = nullptr; m_model_object = nullptr;
} }
int SelectionInfo::get_active_instance()
{
const Selection& selection = m_common->get_canvas()->get_selection();
return selection.get_instance_idx();
}
void InstancesHider::on_update()
{
const ModelObject* mo = m_common->selection_info()->model_object();
int active_inst = m_common->selection_info()->get_active_instance();
GLCanvas3D* canvas = m_common->get_canvas();
if (mo && active_inst != -1) {
canvas->toggle_model_objects_visibility(false);
canvas->toggle_model_objects_visibility(true, mo, active_inst);
}
else
canvas->toggle_model_objects_visibility(true);
}
void InstancesHider::on_release()
{
m_common->get_canvas()->toggle_model_objects_visibility(true);
}
} // namespace GUI } // namespace GUI
} // namespace Slic3r } // namespace Slic3r

View file

@ -119,19 +119,21 @@ private:
int m_active_inst = -1; int m_active_inst = -1;
}; };
/*
class InstancesHider : public CommonGizmosDataBase class InstancesHider : public CommonGizmosDataBase
{ {
public: public:
explicit InstancesHider(CommonGizmosDataPool* cgdp) explicit InstancesHider(CommonGizmosDataPool* cgdp)
: CommonGizmosDataBase(cgdp) {} : CommonGizmosDataBase(cgdp) {}
void update(bool required) override; protected:
void on_update() override;
void on_release() override;
}; };
/*
class HollowedMesh : public CommonGizmosDataBase class HollowedMesh : public CommonGizmosDataBase

View file

@ -1196,10 +1196,13 @@ void GLGizmosManager::activate_gizmo(EType type)
return; // gizmo refused to be turned off, do nothing. return; // gizmo refused to be turned off, do nothing.
} }
m_current = type;
m_common_gizmos_data->update(get_current()
? get_current()->get_requirements()
: CommonGizmosDataID(0));
if (type != Undefined) if (type != Undefined)
m_gizmos[type]->set_state(GLGizmoBase::On); m_gizmos[type]->set_state(GLGizmoBase::On);
m_current = type;
} }