/
Team8
/
kittycad
Обзор
Документация
Войти
/
Team8
/
kittycad
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/data/c3dobject.h
173 строки
8 KB
levovix
fix: icons are now embeded into binary
07 янв 2026, 19:47
07 янв 2026, 19:47
48fb22d
Код
Авторство
О чём код?
#pragma once #include <concepts> #include "typedefs.h" #include "serialization.h" namespace VSN { class SceneSegment; } class QPainter; class QWidget; class Tool; namespace data { struct Document; SERGEN_INCLUDE("data/document.h") struct Sketch; SERGEN_INCLUDE("data/sketch/sketch.h") struct GripPoint; SERGEN_INCLUDE("data/sketch/contours.h") struct DrawContext { QPainter* p; std::function<QScreenPoint2(WorldPoint3)> point_worldToQScreen; }; struct C3dObject : ISerializable { IMPLEMENTS_ISerializable(auto) C3dObject() = default; ~C3dObject(); // зависимые от этого объекта объекты, // которые будут автоматически перестраиваться при изменении этого объекта // todo: составлять автоматически с использование trace. Массив можно оставить тут в качестве кеша на случай если кому-то понадобится. Сохранять это точно не нужно std::vector<ptr<C3dObject>> usedBy{}; // основной объект-контейнер для этого объекта. // неявно входит в usedBy // должен явно входить в usedBy если объект следует уничтожать вместе ptr<C3dObject> m_parent{}; // todo: не сохранять ptr<data::Document> document{} DONT_DUMP; bool visible{true}; std::string m_name{}; VSN::SceneSegment* visual{} DONT_SERIALIZE; Tool* tool{} DONT_SERIALIZE; bool m_propertyChanged{true} DONT_SERIALIZE; bool m_dependencyChanged{} DONT_SERIALIZE; bool m_visualChanged{true} DONT_SERIALIZE; // перестраивает геометрию (MbCurve / MbSolid) объекта с нуля. // для объектов сборок следует использовать оптимизации если m_dependencyChanged == false // вызывается когда m_propertyChanged == true virtual void updateFromParams(); // перестраивает объект, считая что все зависимости-объекты изменились, а сам объект при этом - возможно нет // выполняется с большим приоритетом чем updateFromParams // (при этом выполняется либо updateFromDependencies либо updateFromParams, никогда - оба) // для ослеживания того, какие объекты изменились, можно перегрузить markDependencyChanged // вызывается когда m_propertyChanged != true и m_dependencyChanged == true virtual void updateFromDependencies(); // перестраивает полигональный кеш объекта, либо просто перемещает его для объектов сборок // должна вызываться из buildGeometry и/или rebuildGeometry и не должна вызываться извне // вызывается когда m_visualChanged == true и visible == true virtual void buildVisual(); // позволяет рисовать напрямую в DocumentView::m_overlay (z-буфер пока отсутствует) // результат отрисовки не кешируется в отличии от display // вызывается при либых изменениях любых объектов / движении камеры, гарантированно через некоторое время ПОСЛЕ display virtual void draw(DrawContext& ctx); // рисует объект вместе со всеми его детьми, рекурсивно virtual void drawTree(DrawContext& ctx); // обращаю внимание, в деструкторе вызывается deleteVisual строго для C3dObject // если вы перегружаете deleteVisual, перегрузите и деструктор, // и будте готовы что deleteVisual вызовется несколько раз. // добро пожаловать в деструкторы в C++ virtual void deleteVisual(); virtual std::string_view iconName() const; virtual Tool* newTool(QWidget* parent); Tool* getOrCreateTool(QWidget* parent); void deleteTool(); // принимаем всё по ref чтобы не возникало проблем с временными или новосозданными объектами virtual ref<data::C3dObject> parent(); // возвращает nullptr если у объекта нет родителя или он пренадлежит документу напрямую virtual int childCount(); virtual ref<data::C3dObject> childAt(int i); // кидает out_of_range если индекс за границами 0..<childCount virtual int childIndex(ref<C3dObject> const& child); // возвращает -1 если child не является ребёнком этого объекта virtual void setParent(ref<C3dObject> const& parent); virtual void removeChild(ref<C3dObject> const& child); virtual void addChild(ref<C3dObject> const& child); // todo: virtual void addJig(ref<C3dObject> const&); virtual bool removeUsageFrom(ref<C3dObject> const& usedObj); // должен возвращать true если текущий объект следует удалить // удаляет объект с корнями и всеми зависимыми от него объектами static void destroy(ref<C3dObject> const& obj, int maxLeftRefcount = 1); void setVisible(bool v); virtual void onVisibleChanged(); std::string name() const; void setName(std::string&& v); // пометить что изменилось какое-либо из полей этой структуры // todo: (возможно даже с битмаской какое именно) virtual void markPropertyChanged(); // пометить что MbSolid или MbCurve для этого тела стоит обновить (но не перестроить) virtual void markDependencyChanged(ref<C3dObject> cause); // пометить что SceneSegment для этого тела стоит пересчитать virtual void markVisualChanged(); }; } void addTemporary(ptr<data::Document> document, ptr<data::C3dObject> child); SERGEN_IGNORE template<std::derived_from<data::C3dObject> T> requires (!requires (ptr<data::Document> doc) { _create_disable<T>(doc); }) ref<T> create(ptr<data::Document> doc) { ref<T> result = std::make_shared<T>(); // result->m_name = result->typeNameHumanReadable(); // todo: выставлять уникальное имя (с номером для повторяющихся объектов) result->document = doc; addTemporary(doc, std::static_pointer_cast<data::C3dObject>(result)); return result; } namespace data { template<typename Range> requires std::ranges::range<Range> bool generic_remove_child(data::C3dObject* parent, Range& range, ref<data::C3dObject> const& child) { auto it = std::ranges::find(range, child.get(), [](auto const& x) { return x.get(); }); if (it != range.end()) { range.erase(it); if (!child->m_parent.expired() && child->m_parent.lock().get() == parent) { child->m_parent.reset(); } return true; } return false; } } SERGEN_IGNORE_END