/* QGL Scene Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef GLSCENE_H #define GLSCENE_H #include "gltypes.h" class Scene: public QObject { Q_OBJECT friend class RendererBase; friend class Renderer; friend class RendererMaterial; friend class RendererService; friend class RendererSelection; friend class ObjectBase; friend class Light; friend QDataStream & operator<<(QDataStream & s, const Scene * p); friend QDataStream & operator>>(QDataStream & s, Scene *& p); public: explicit Scene(); virtual ~Scene(); enum SelectionMode { smNoSelection, smSingleSelection, smMultiSelection, }; Q_ENUMS(SelectionMode) QString name() const { return name_; } void setName(const QString & name) { name_ = name; } bool prepare(); Scene * clone(); /// Add object \"o\" to scene and take its ownership /// All materials and geometries used by \"o\" tree /// copied into this scene void addObject(ObjectBase * o); void addScene(const Scene * s); void assignFrom(const Scene * s); void clear(); void reinitAll(); int objectsCount(bool all = false); ObjectBaseList objects(bool all = false); ObjectBase * rootObject() { return root_; } void removeObject(ObjectBase * o, bool inChildren = true); void removeObject(ObjectBase & o, bool inChildren = true); void clearObjects(bool deleteAll = false); SelectionMode selectionMode() const { return sel_mode_; } void setSelectionMode(SelectionMode mode) { sel_mode_ = mode; } void selectObject(ObjectBase * o, bool add_to_selection = false); void selectObjects(ObjectBaseList ol, bool add_to_selection = false); void selectObjectsByMesh(); void selectObjectsByMaterial(); void clearSelection(); ObjectBaseList selectedObjects(bool top_only = false) const; ObjectBase * selectedObject() const; void cleanUnused(); const Box3D & boundingBox() const; QVector getMaterials() const { return materials; } Material * newMaterial(const QString & name = QString()); void removeMaterial(Material * m); void makeMaterialsUniqueNames(); void removeLight(Light * l); void dump(); void destroy(QOpenGLExtraFunctions * f); void destroyUnused(QOpenGLExtraFunctions * f); protected: void prepareTree(ObjectBase * o); void gatherSelection(); void objectsCountInternal(int * cnt, ObjectBase * where); void removeObjectInternal(ObjectBase * o, ObjectBase * where); void emitSelectionChanged(); QString uniqueName(QString n, const QSet & names); void attachObject(ObjectBase * o); Mesh * attachMesh(Mesh * mesh); void setTreeChanged(); void setTreeStructChanged(); void setMaterialsChanged() { mat_changed = true; } void setLightsChanged() { lights_changed = tree_changed = true; } void setObjectMeshChanged(ObjectBase * o); QString name_; ObjectBase * root_; bool tree_changed, mat_changed, lights_changed, destroying; bool need_reload_materials, tree_struct_changed; QVector mat_map_changed; QVector geometries, td_geometries; QVector materials; QMap> geometries_used; QMap> lights_used; QList cameras_used; QVector changed_materials; SelectionMode sel_mode_; ObjectBaseList selected_, selected_top; protected slots: signals: void __objectDeleted(ObjectBase * o); void __destroyed(); void treeChanged(); void selectionChanged(); }; QDataStream & operator<<(QDataStream & s, const Scene * p); QDataStream & operator>>(QDataStream & s, Scene *& p); #endif // GLSCENE_H