This repository has been archived on 2020-09-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
libs/qglengine/glscene.h

147 lines
4.2 KiB
C++

/*
GLObjectBase & Light
Copyright (C) 2020 Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GLSCENE_H
#define GLSCENE_H
#include "gltypes.h"
class Scene: public QObject {
Q_OBJECT
friend class QGLView;
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();
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<Material*> 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<QString> & 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<bool> mat_map_changed;
QVector<Mesh*> geometries, td_geometries;
QVector<Material*> materials;
QMap<int, QMap<Mesh*, ObjectBaseList>> geometries_used; // [pass][mesh] = ObjectBaseList
QMap<int, QList<Light*>> lights_used; // by Light::Type
QList<Camera*> cameras_used;
QVector<Material*> changed_materials;
SelectionMode sel_mode_;
ObjectBaseList selected_, selected_top;
protected slots:
signals:
void __objectDeleted(ObjectBase * o);
void __destroyed();
void treeChanged();
//void treeStructChanged();
void selectionChanged();
};
QDataStream & operator <<(QDataStream & s, const Scene * p);
QDataStream & operator >>(QDataStream & s, Scene *& p);
#endif // GLSCENE_H