Dependencies check in debug mode

Some common resources can depend on each other - this checks that the requirements are consistent
This commit is contained in:
Lukas Matena 2020-04-06 08:06:07 +02:00
parent 3db3a61520
commit 7e797eaaf8
2 changed files with 33 additions and 7 deletions

View file

@ -43,11 +43,24 @@ SelectionInfo* CommonGizmosDataPool::selection_info()
} }
#ifndef NDEBUG #ifndef NDEBUG
// Check the required resources one by one and return true if all
// dependencies are met.
bool CommonGizmosDataPool::check_dependencies(CommonGizmosDataID required) const bool CommonGizmosDataPool::check_dependencies(CommonGizmosDataID required) const
{ {
// This should iterate over currently required data. Each of them should // This should iterate over currently required data. Each of them should
// be asked about its dependencies and it must check that all dependencies // be asked about its dependencies and it must check that all dependencies
// are also in required and before the current one. // are also in required and before the current one.
for (auto& [id, data] : m_data) {
// in case we don't use this, the deps are irrelevant
if (! (int(required) & int(CommonGizmosDataID(id))))
continue;
CommonGizmosDataID deps = data->get_dependencies();
assert(int(deps) == (int(deps) & int(required)));
}
return true; return true;
} }
#endif // NDEBUG #endif // NDEBUG
@ -57,7 +70,7 @@ bool CommonGizmosDataPool::check_dependencies(CommonGizmosDataID required) const
void SelectionInfo::on_update() void SelectionInfo::on_update()
{ {
const Selection& selection = m_common->get_canvas()->get_selection(); const Selection& selection = get_pool()->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
@ -71,7 +84,7 @@ void SelectionInfo::on_release()
int SelectionInfo::get_active_instance() int SelectionInfo::get_active_instance()
{ {
const Selection& selection = m_common->get_canvas()->get_selection(); const Selection& selection = get_pool()->get_canvas()->get_selection();
return selection.get_instance_idx(); return selection.get_instance_idx();
} }
@ -81,9 +94,9 @@ int SelectionInfo::get_active_instance()
void InstancesHider::on_update() void InstancesHider::on_update()
{ {
const ModelObject* mo = m_common->selection_info()->model_object(); const ModelObject* mo = get_pool()->selection_info()->model_object();
int active_inst = m_common->selection_info()->get_active_instance(); int active_inst = get_pool()->selection_info()->get_active_instance();
GLCanvas3D* canvas = m_common->get_canvas(); GLCanvas3D* canvas = get_pool()->get_canvas();
if (mo && active_inst != -1) { if (mo && active_inst != -1) {
canvas->toggle_model_objects_visibility(false); canvas->toggle_model_objects_visibility(false);
@ -95,7 +108,7 @@ void InstancesHider::on_update()
void InstancesHider::on_release() void InstancesHider::on_release()
{ {
m_common->get_canvas()->toggle_model_objects_visibility(true); get_pool()->get_canvas()->toggle_model_objects_visibility(true);
} }

View file

@ -85,13 +85,22 @@ public:
// Returns whether the resource is currently maintained. // Returns whether the resource is currently maintained.
bool is_valid() const { return m_is_valid; } bool is_valid() const { return m_is_valid; }
#ifndef NDEBUG
// Return a bitmask of all resources that this one relies on.
// The dependent resource must have higher ID than the one
// it depends on.
virtual CommonGizmosDataID get_dependencies() const { return CommonGizmosDataID::None; }
#endif // NDEBUG
protected: protected:
CommonGizmosDataPool* m_common = nullptr;
virtual void on_release() = 0; virtual void on_release() = 0;
virtual void on_update() = 0; virtual void on_update() = 0;
CommonGizmosDataPool* get_pool() const { return m_common; }
private: private:
bool m_is_valid = false; bool m_is_valid = false;
CommonGizmosDataPool* m_common = nullptr;
}; };
@ -125,6 +134,10 @@ class InstancesHider : public CommonGizmosDataBase
public: public:
explicit InstancesHider(CommonGizmosDataPool* cgdp) explicit InstancesHider(CommonGizmosDataPool* cgdp)
: CommonGizmosDataBase(cgdp) {} : CommonGizmosDataBase(cgdp) {}
#ifndef NDEBUG
CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; }
#endif // NDEBUG
protected: protected:
void on_update() override; void on_update() override;
void on_release() override; void on_release() override;