From 9d05dbe6da5f033bff70aeb0635b7bd55d047abc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Tue, 10 Dec 2019 10:22:09 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@665 a8b55f48-bf90-11e4-a774-851b48703e85 --- qglengine/core/glmesh.cpp | 50 ++++++++++++++--- qglengine/core/glmesh.h | 9 +++- qglengine/core/gltypes.h | 6 +++ qglengine/core/glvertexobject.cpp | 1 + qglengine/core/glvertexobject.h | 7 ++- qglengine/formats/loader_assimp.cpp | 2 +- qglengine/globject.cpp | 65 +++++++++++------------ qglengine/globject.h | 21 +++----- qglengine/glrendererbase.cpp | 1 - qglengine/glscene.cpp | 45 ++++++++-------- qglengine/glscene.h | 10 ++-- qglengine/mouse_controller.cpp | 2 +- qglengine/qglview.cpp | 4 +- qglengine/qglview.h | 2 +- qglengine/qglview_test/qglview_window.cpp | 2 +- qglengine/renderer.cpp | 21 ++++---- qglengine/renderer.h | 9 +--- qglengine/renderer_base.cpp | 2 +- qglengine/renderer_base.h | 2 +- qglengine/renderer_selection.cpp | 38 +++++++------ qglengine/renderer_service.cpp | 2 +- qglengine/widgets/materials_editor.cpp | 4 +- qglengine/widgets/object_editor.cpp | 8 +-- qglengine/widgets/scene_tree.cpp | 10 ++-- 24 files changed, 186 insertions(+), 137 deletions(-) diff --git a/qglengine/core/glmesh.cpp b/qglengine/core/glmesh.cpp index 1bba0ef..8340b14 100644 --- a/qglengine/core/glmesh.cpp +++ b/qglengine/core/glmesh.cpp @@ -30,7 +30,7 @@ Mesh::Mesh(GLenum geom_type_): geom_type(geom_type_), buffer_geom(GL_ARRAY_BUFFER, GL_STATIC_DRAW), buffer_ind (GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW) { hash_ = 0; - changed = hash_changed = objects_changed = selected_changed = true; + changed = hash_changed = true; //qDebug() << "Mesh, now" << ++_count; } @@ -189,14 +189,14 @@ void Mesh::draw(QOpenGLExtraFunctions * f, int count, int type) { void Mesh::clear() { - vertices_.clear(); - normals_.clear(); - tangents_.clear(); + vertices_ .clear(); + normals_ .clear(); + tangents_ .clear(); bitangents_.clear(); - texcoords_.clear(); - triangles_.clear(); - lines_.clear(); - data_.clear(); + texcoords_ .clear(); + triangles_ .clear(); + lines_ .clear(); + data_ .clear(); changed = hash_changed = true; } @@ -232,6 +232,40 @@ uint Mesh::hash() const { } +bool Mesh::isObjectsChanged(int type) const { + return (const_cast(this))->vaoByType(type)->isObjectsChanged(); +} + + +bool Mesh::isSelectionChanged(int type) const { + return (const_cast(this))->vaoByType(type)->isSelectionChanged(); +} + + +void Mesh::setObjectsChanged(int type, bool yes) { + vaoByType(type)->setObjectsChanged(yes); +} + + +void Mesh::setSelectionChanged(int type, bool yes) { + vaoByType(type)->setSelectionChanged(yes); +} + + +void Mesh::setAllObjectsChanged(bool yes) { + QMapIterator it(vao_map); + while (it.hasNext()) + it.next().value()->setObjectsChanged(yes); +} + + +void Mesh::setAllSelectionChanged(bool yes) { + QMapIterator it(vao_map); + while (it.hasNext()) + it.next().value()->setSelectionChanged(yes); +} + + void Mesh::translatePoints(const QVector3D & dp) { QMatrix4x4 m; m.translate(dp); diff --git a/qglengine/core/glmesh.h b/qglengine/core/glmesh.h index 89c49ce..4f4cfcd 100644 --- a/qglengine/core/glmesh.h +++ b/qglengine/core/glmesh.h @@ -54,6 +54,13 @@ public: bool isEmpty() const {return vertices_.isEmpty();} uint hash() const; + bool isObjectsChanged (int type = 0) const; + bool isSelectionChanged (int type = 0) const; + void setObjectsChanged (int type = 0, bool yes = true); + void setSelectionChanged(int type = 0, bool yes = true); + void setAllObjectsChanged (bool yes = true); + void setAllSelectionChanged(bool yes = true); + QVector & vertices () {changed = hash_changed = true; return vertices_;} QVector & normals () {changed = hash_changed = true; return normals_;} QVector & texcoords() {changed = hash_changed = true; return texcoords_;} @@ -92,7 +99,7 @@ private: mutable uint hash_; mutable bool hash_changed; int vert_count; - bool changed, objects_changed, selected_changed; + bool changed; }; diff --git a/qglengine/core/gltypes.h b/qglengine/core/gltypes.h index f3c3dda..f047d15 100644 --- a/qglengine/core/gltypes.h +++ b/qglengine/core/gltypes.h @@ -185,6 +185,12 @@ class RendererMaterial; class RendererService; class RendererSelection; +enum RenderPass { + rpSolid, + rpTransparent, +}; + +typedef QList ObjectBaseList; struct Box3D { GLfloat x; diff --git a/qglengine/core/glvertexobject.cpp b/qglengine/core/glvertexobject.cpp index b400900..38c5bfd 100644 --- a/qglengine/core/glvertexobject.cpp +++ b/qglengine/core/glvertexobject.cpp @@ -28,6 +28,7 @@ VertexObject::VertexObject(): buffer_sel (GL_ARRAY_BUFFER, GL_STREAM_DRAW) { vao_ = 0; buffers_binded = false; + objects_changed = selected_changed = true; } diff --git a/qglengine/core/glvertexobject.h b/qglengine/core/glvertexobject.h index af3f1ab..a471ad1 100644 --- a/qglengine/core/glvertexobject.h +++ b/qglengine/core/glvertexobject.h @@ -46,12 +46,17 @@ public: GLuint ID() const {return vao_;} bool isInit() const {return vao_ != 0;} + bool isObjectsChanged() const {return objects_changed;} + bool isSelectionChanged() const {return selected_changed;} + void setObjectsChanged(bool yes = true) {objects_changed = yes;} + void setSelectionChanged(bool yes = true) {selected_changed = yes;} + private: void loadBuffer(QOpenGLExtraFunctions * f, Buffer & buf, const void * data, int size); GLuint vao_; Buffer buffer_obj, buffer_sel; - bool buffers_binded; + bool buffers_binded, objects_changed, selected_changed; }; diff --git a/qglengine/formats/loader_assimp.cpp b/qglengine/formats/loader_assimp.cpp index 084c0c8..38214c4 100644 --- a/qglengine/formats/loader_assimp.cpp +++ b/qglengine/formats/loader_assimp.cpp @@ -161,7 +161,7 @@ Scene * loadScene(const QString & filepath) { ObjectBase * root = assimpObject(ais->mRootNode, meshes, light_by_name, out_lights); if (!root) return 0; - QList rcl = root->children(true); + ObjectBaseList rcl = root->children(true); foreach (ObjectBase * c, rcl) { foreach (Light * l, out_lights) { if (c->name() == (l->name() + ".Target")) { diff --git a/qglengine/globject.cpp b/qglengine/globject.cpp index c833535..1e4f192 100644 --- a/qglengine/globject.cpp +++ b/qglengine/globject.cpp @@ -26,10 +26,10 @@ static int _count = 0; ObjectBase::ObjectBase(Mesh * geom, Material * mat) { type_ = glMesh; render_mode = View; - pass_ = Solid; + prev_pass = rpSolid; parent_ = nullptr; color_ = Qt::white; - is_root = is_init = is_tex_loaded = selected_ = false; + is_root = is_init = selected_ = false; visible_ = accept_fog = accept_light = cast_shadow = rec_shadow = select_ = true; line_width = -1.; id_ = 0; @@ -61,7 +61,7 @@ ObjectBase::~ObjectBase() { ObjectBase * ObjectBase::clone(bool withChildren) { ObjectBase * o = new ObjectBase(); - o->pass_ = pass_; + o->prev_pass = prev_pass; o->is_init = false; o->accept_light = accept_light; o->accept_fog = accept_fog; @@ -102,6 +102,15 @@ void ObjectBase::init() { } +RenderPass ObjectBase::pass() const { + RenderPass ret = rpSolid; + if (material_) + if (material_->hasTransparency()) + ret = rpTransparent; + return ret; +} + + void ObjectBase::setScene(Scene * v) { scene_ = v; foreach (ObjectBase * c, children_) @@ -118,7 +127,7 @@ void ObjectBase::addChild(ObjectBase * o) { o->setScene(scene_); o->buildTransform(); /*if (scene_) { - QList cl = o->children(true); + ObjectBaseList cl = o->children(true); cl << o; //foreach (ObjectBase * i, cl) { // emit view_->objectAdded(i); @@ -187,9 +196,9 @@ const ObjectBase * ObjectBase::child(const QString & name) const { } -QList ObjectBase::children(bool all_) { +ObjectBaseList ObjectBase::children(bool all_) { if (!all_) return children_; - QList cl; + ObjectBaseList cl; addChildren(cl, this); return cl; } @@ -239,7 +248,7 @@ void ObjectBase::setTransform(const Transform & t) { } -void ObjectBase::addChildren(QList & list, ObjectBase * where) { +void ObjectBase::addChildren(ObjectBaseList & list, ObjectBase * where) { foreach (ObjectBase * i, where->children_) { list << i; addChildren(list, i); @@ -247,14 +256,6 @@ void ObjectBase::addChildren(QList & list, ObjectBase * where) { } -void ObjectBase::loadTextures(bool with_children) { - if (with_children) - foreach (ObjectBase * i, children_) i->loadTextures(); - is_tex_loaded = true; - checkPass(); -} - - void ObjectBase::calculateBoundingBox() { bound = Box3D(); if (mesh_) { @@ -349,9 +350,7 @@ void ObjectBase::setMaterial(Material * m, bool with_children) { material_ = m; if (with_children) foreach (ObjectBase * i, children_) i->setMaterial(m, true); - checkPass(); - is_tex_loaded = false; - setMeshChanged(); + setObjectsChanged(); if (scene_) scene_->mat_changed = true; } @@ -360,14 +359,14 @@ void ObjectBase::setColor(QColor c, bool with_children) { color_ = c; if (with_children) foreach (ObjectBase * i, children_) i->setColor(c, true); - setMeshChanged(); + setObjectsChanged(); } void ObjectBase::setMesh(Mesh * v) { mesh_ = v; setSceneTreeChanged(); - setMeshChanged(); + setObjectsChanged(); } @@ -385,7 +384,7 @@ void ObjectBase::buildTransform() { //qDebug() << name_ << itransform_; foreach (ObjectBase * i, children_) i->buildTransform(); - setMeshChanged(); + setObjectsChanged(); } @@ -400,26 +399,26 @@ void ObjectBase::localTransform(QMatrix4x4 & m) { } -void ObjectBase::checkPass() { - pass_ = Solid; - if (material_) { - if (material_->hasTransparency()) - pass_ = Transparent; - } -} - - void ObjectBase::setSceneTreeChanged() { if (scene_) { scene_->setTreeChanged(); scene_->setTreeStructChanged(); } - setMeshChanged(); + setObjectsChanged(); } -void ObjectBase::setMeshChanged() { - if (mesh_) mesh_->objects_changed = true; +void ObjectBase::setObjectsChanged() { + int p = pass(); + if (mesh_) { + mesh_->setObjectsChanged (p, true); + mesh_->setSelectionChanged(p, true); + if (prev_pass != p) { + mesh_->setObjectsChanged (prev_pass, true); + mesh_->setSelectionChanged(prev_pass, true); + } + } + prev_pass = p; } diff --git a/qglengine/globject.h b/qglengine/globject.h index 7ad84b8..6754235 100644 --- a/qglengine/globject.h +++ b/qglengine/globject.h @@ -38,7 +38,6 @@ class ObjectBase friend QDataStream & operator >>(QDataStream & s, Scene *& p); public: enum Type {glMesh, glLight, glCamera, glParticlesSystem}; - enum Pass {Solid, Transparent, Reflection, User}; enum RenderMode {View = 0, Point = GL_POINT, Line = GL_LINE, Fill = GL_FILL}; explicit ObjectBase(Mesh * geom = 0, Material * mat = 0); @@ -49,12 +48,11 @@ public: QString name() const {return name_;} void setName(const QString & name) {name_ = name;} - //virtual GLuint hList() {return list;} virtual void init(); virtual void update() {} bool isInit() const {return is_init;} - bool isTexturesLoaded() const {return is_tex_loaded;} Type type() const {return type_;} + RenderPass pass() const; RenderMode renderMode() const {return render_mode;} void setRenderMode(RenderMode mode) {render_mode = mode;} @@ -77,7 +75,7 @@ public: ObjectBase * child(const QString & name); const ObjectBase * child(int index) const; const ObjectBase * child(const QString & name) const; - QList children(bool all_ = false); + ObjectBaseList children(bool all_ = false); bool isVisible(bool check_parents = false) const; bool isHidden(bool check_parents = false) const {return !isVisible(check_parents);} @@ -196,19 +194,16 @@ public: protected: virtual void transformChanged() {} - void addChildren(QList & list, ObjectBase * where); - void loadTextures(bool with_children = false); - //void deleteTextures() {foreach (GLuint i, textures) currentQGLView->deleteTexture(i); textures.clear();} + void addChildren(ObjectBaseList & list, ObjectBase * where); void buildTransform(); void initInternal(); - void checkPass(); void setSceneTreeChanged(); - void setMeshChanged(); + void setObjectsChanged(); virtual void localTransform(QMatrix4x4 & m); QMatrix4x4 worldMatrix(QMatrix4x4 parent) const; - int pass_; // Pass - bool is_init, is_tex_loaded, accept_light, accept_fog, /*write_depth_,*/ visible_, cast_shadow, rec_shadow, select_, selected_, raw_matrix; + int prev_pass; // Pass + bool is_init, accept_light, accept_fog, visible_, cast_shadow, rec_shadow, select_, selected_, raw_matrix; bool is_root, selected_aim; float line_width; QColor color_; @@ -217,7 +212,7 @@ protected: RenderMode render_mode; Box3D bound; Transform trans; - QList children_; + ObjectBaseList children_; QMatrix4x4 itransform_, mat_; QString name_; GLenum blend_src, blend_dest; @@ -309,6 +304,6 @@ inline T globject_cast(const ObjectBase * object) {return reinterpret_cast(ob QDataStream & operator <<(QDataStream & s, const ObjectBase * p); QDataStream & operator >>(QDataStream & s, ObjectBase *& p); -inline QList light2objectList(const QList & v) {QList ret; foreach (Light*i, v) ret << (ObjectBase*)i; return ret;} +inline ObjectBaseList light2objectList(const QList & v) {ObjectBaseList ret; foreach (Light*i, v) ret << (ObjectBase*)i; return ret;} #endif // GLOBJECT_H diff --git a/qglengine/glrendererbase.cpp b/qglengine/glrendererbase.cpp index 3c75192..39abb73 100644 --- a/qglengine/glrendererbase.cpp +++ b/qglengine/glrendererbase.cpp @@ -221,7 +221,6 @@ void GLRendererBase::renderShadow(Light * l, QOpenGLShaderProgram * prog, QMatri l->dir1 = cam.direction() - rdir;*/ //qDebug() << rdir << l->dir0 << l->dir1; RenderingParameters rpl; - rpl.pass = ObjectBase::Solid; rpl.shaders = prog; rpl.textures = rpl.light = rpl.fog = false; //rpl.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX); diff --git a/qglengine/glscene.cpp b/qglengine/glscene.cpp index eae2cbc..0759a42 100644 --- a/qglengine/glscene.cpp +++ b/qglengine/glscene.cpp @@ -52,7 +52,7 @@ Scene * Scene::clone() { void Scene::addObject(ObjectBase * o) { - QList aol = o->children(true); + ObjectBaseList aol = o->children(true); attachObject(o); foreach (ObjectBase * c, aol) attachObject(c); @@ -125,7 +125,7 @@ void Scene::emitSelectionChanged() { selected_top << po; } foreach (Mesh * m, geometries) - m->selected_changed = true; + m->setAllSelectionChanged(true); selectionChanged(); } @@ -188,7 +188,7 @@ void Scene::selectObject(ObjectBase * o, bool add_to_selection) { } -void Scene::selectObjects(QList ol, bool add_to_selection) { +void Scene::selectObjects(ObjectBaseList ol, bool add_to_selection) { if (!add_to_selection || (sel_mode_ == smSingleSelection)) clearSelection(); foreach (ObjectBase * o, ol) { if (!o) continue; @@ -200,12 +200,12 @@ void Scene::selectObjects(QList ol, bool add_to_selection) { void Scene::selectObjectsByMesh() { - QList csl = selected_; + ObjectBaseList csl = selected_; QSet sml; foreach (ObjectBase * o, csl) if (o->mesh()) sml << o->mesh(); - QList ol = root_->children(true); + ObjectBaseList ol = root_->children(true); foreach (ObjectBase * o, ol) { if (sml.contains(o->mesh())) o->setSelected(true); @@ -216,12 +216,12 @@ void Scene::selectObjectsByMesh() { void Scene::selectObjectsByMaterial() { - QList csl = selected_; + ObjectBaseList csl = selected_; QSet sml; foreach (ObjectBase * o, csl) if (o->material()) sml << o->material(); - QList ol = root_->children(true); + ObjectBaseList ol = root_->children(true); foreach (ObjectBase * o, ol) { if (sml.contains(o->material())) o->setSelected(true); @@ -234,7 +234,7 @@ void Scene::selectObjectsByMaterial() { void Scene::clearSelection() { selected_.clear(); selected_top.clear(); - QList ol = root_->children(true); + ObjectBaseList ol = root_->children(true); foreach (ObjectBase * o, ol) { o->selected_ = o->selected_aim = false; } @@ -242,7 +242,7 @@ void Scene::clearSelection() { } -QList Scene::selectedObjects(bool top_only) const { +ObjectBaseList Scene::selectedObjects(bool top_only) const { return top_only ? selected_top : selected_; } @@ -269,7 +269,7 @@ Material * Scene::newMaterial() { void Scene::removeMaterial(Material * m) { if (!m || !materials.contains(m)) return; - QList ol = root_->children(true); + ObjectBaseList ol = root_->children(true); foreach (ObjectBase * o, ol) if (o->material_ == m) o->setMaterial(0); @@ -289,7 +289,7 @@ void Scene::makeMaterialsUniqueNames() { } -QList Scene::objects(bool all) { +ObjectBaseList Scene::objects(bool all) { return root_->children(all); } @@ -308,7 +308,7 @@ void Scene::dump() { void Scene::gatherSelection() { selected_.clear(); - QList ol = root_->children(true); + ObjectBaseList ol = root_->children(true); foreach (ObjectBase * o, ol) if (o->selected_) selected_ << o; @@ -367,8 +367,10 @@ void Scene::attachObject(ObjectBase * o) { void Scene::setTreeChanged() { if (destroying) return; tree_changed = true; - foreach (Mesh * m, geometries) - m->selected_changed = true; + foreach (Mesh * m, geometries) { + m->setAllObjectsChanged(true); + m->setAllSelectionChanged(true); + } gatherSelection(); } @@ -379,7 +381,7 @@ void Scene::setTreeStructChanged() { void Scene::setObjectMeshChanged(ObjectBase * o) { - if (o) o->setMeshChanged(); + if (o) o->setObjectsChanged(); } @@ -393,8 +395,8 @@ void Scene::prepareTree(ObjectBase * o) { } break; case ObjectBase::glMesh: if (co->mesh()) { - geometries_used[co->mesh()] << co; - co->mesh()->objects_changed = co->mesh()->selected_changed = true; + geometries_used[co->pass()][co->mesh()] << co; + co->setObjectsChanged(); } break; default: break; @@ -413,7 +415,7 @@ bool Scene::prepare() { } } - QList aol; + ObjectBaseList aol; if (!tree_changed && !mat_changed) return false; aol = root_->children(true); if (tree_changed) { @@ -423,7 +425,8 @@ bool Scene::prepare() { tree_struct_changed = false; QMetaObject::invokeMethod(this, "treeChanged", Qt::QueuedConnection); } - geometries_used.clear(); + geometries_used[rpSolid ].clear(); + geometries_used[rpTransparent].clear(); lights_used.clear(); prepareTree(root_); } @@ -450,7 +453,7 @@ QDataStream & operator <<(QDataStream & s, const Scene * p) { ChunkStream cs; //qDebug() << "place" << p->name() << "..."; QVector geom_ind, mat_ind; - QList cl = p->root_->children(true); + ObjectBaseList cl = p->root_->children(true); geom_ind.reserve(cl.size()); mat_ind.reserve(cl.size()); foreach (ObjectBase * c, cl) { @@ -484,7 +487,7 @@ QDataStream & operator >>(QDataStream & s, Scene *& p) { } } p->makeMaterialsUniqueNames(); - QList cl = p->root_->children(true); + ObjectBaseList cl = p->root_->children(true); int cnt = qMin(qMin(cl.size(), geom_ind.size()), mat_ind.size()); for (int i = 0; i < cnt; ++i) { ObjectBase * c(cl[i]); diff --git a/qglengine/glscene.h b/qglengine/glscene.h index 6becf08..3df3520 100644 --- a/qglengine/glscene.h +++ b/qglengine/glscene.h @@ -62,7 +62,7 @@ public: void assignFrom(const Scene * s); int objectsCount(bool all = false); - QList objects(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); @@ -71,11 +71,11 @@ public: SelectionMode selectionMode() const {return sel_mode_;} void setSelectionMode(SelectionMode mode) {sel_mode_ = mode;} void selectObject(ObjectBase * o, bool add_to_selection = false); - void selectObjects(QList ol, bool add_to_selection = false); + void selectObjects(ObjectBaseList ol, bool add_to_selection = false); void selectObjectsByMesh(); void selectObjectsByMaterial(); void clearSelection(); - QList selectedObjects(bool top_only = false) const; + ObjectBaseList selectedObjects(bool top_only = false) const; ObjectBase * selectedObject() const; const Box3D & boundingBox() const; @@ -115,12 +115,12 @@ protected: QVector geometries; QVector materials; - QMap > geometries_used; + QMap> geometries_used; // [pass][mesh] = ObjectBaseList QMap> lights_used; // by Light::Type QVector changed_materials; SelectionMode sel_mode_; - QList selected_, selected_top; + ObjectBaseList selected_, selected_top; protected slots: diff --git a/qglengine/mouse_controller.cpp b/qglengine/mouse_controller.cpp index 7d8431f..ec8b202 100644 --- a/qglengine/mouse_controller.cpp +++ b/qglengine/mouse_controller.cpp @@ -107,7 +107,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) { QPoint cpos = e->pos(); if (cur_action != RendererService::haNoAction && (e->buttons() == Qt::LeftButton)) { RendererService & rs(view->renderer_.rend_service); - QList objects = view->scene_->selectedObjects(true); + ObjectBaseList objects = view->scene_->selectedObjects(true); QVector axis; switch (cur_action) { case RendererService::haMove: diff --git a/qglengine/qglview.cpp b/qglengine/qglview.cpp index 37af806..9a5bca7 100644 --- a/qglengine/qglview.cpp +++ b/qglengine/qglview.cpp @@ -124,7 +124,7 @@ void QGLView::start(float freq) { QList QGLView::selectedLights() const { QList ret; - QList sol = scene_->selectedObjects(); + ObjectBaseList sol = scene_->selectedObjects(); foreach (ObjectBase * o, sol) if (o->type() == ObjectBase::glLight) ret << (Light*)o; @@ -134,7 +134,7 @@ QList QGLView::selectedLights() const { QList QGLView::selectedCameras() const { QList ret; - QList sol = scene_->selectedObjects(); + ObjectBaseList sol = scene_->selectedObjects(); foreach (ObjectBase * o, sol) if (o->type() == ObjectBase::glCamera) ret << (Camera*)o; diff --git a/qglengine/qglview.h b/qglengine/qglview.h index f217947..6e638bb 100644 --- a/qglengine/qglview.h +++ b/qglengine/qglview.h @@ -151,7 +151,7 @@ public: void selectObject(ObjectBase * o, bool add_to_selection = false) {scene_->selectObject(o, add_to_selection);} void clearSelection() {scene_->clearSelection();} - QList selectedObjects(bool top_only = false) const {return scene_->selectedObjects(top_only);} + ObjectBaseList selectedObjects(bool top_only = false) const {return scene_->selectedObjects(top_only);} QList selectedLights() const; QList selectedCameras() const; ObjectBase * selectedObject() const {return scene_->selectedObject();} diff --git a/qglengine/qglview_test/qglview_window.cpp b/qglengine/qglview_test/qglview_window.cpp index 0829c30..8ce0b1d 100644 --- a/qglengine/qglview_test/qglview_window.cpp +++ b/qglengine/qglview_test/qglview_window.cpp @@ -254,7 +254,7 @@ void QGLViewWindow::on_pushButton_clicked() { void QGLViewWindow::on_pushButton_3_clicked() { - /*QList ol = view->view()->objects(true); + /*ObjectBaseList ol = view->view()->objects(true); qDebug() << ol.size(); foreach (ObjectBase * i, ol) { //i->VBO().rebuffer(); diff --git a/qglengine/renderer.cpp b/qglengine/renderer.cpp index 38da100..2a1399c 100644 --- a/qglengine/renderer.cpp +++ b/qglengine/renderer.cpp @@ -172,7 +172,7 @@ void Renderer::releaseShader() { } -void Renderer::fillObjectsBuffer(const QList & ol, RenderPass pass) { +void Renderer::fillObjectsBuffer(const ObjectBaseList & ol, RenderPass pass) { cur_objects_.resize(ol.size()); for (int i = 0; i < ol.size(); ++i) { Object & so(cur_objects_[i]); @@ -195,23 +195,26 @@ void Renderer::fillObjectsBuffer(const QList & ol, RenderPass pass void Renderer::renderObjects(Scene & scene, RenderPass pass) { QOpenGLExtraFunctions * f = view; - QMapIterator > it(scene.geometries_used); + QMapIterator it(scene.geometries_used[pass]); bool emit_pos_change = false; while (it.hasNext()) { it.next(); Mesh * mesh = it.key(); - if (mesh->objects_changed) { - mesh->objects_changed = false; + if (mesh->isObjectsChanged(pass)) { + mesh->setObjectsChanged(pass, false); emit_pos_change = true; fillObjectsBuffer(it.value(), pass); - mesh->loadObjects(f, cur_objects_); + //qDebug() << "loadObjects" << pass << cur_objects_.size(); + mesh->loadObjects(f, cur_objects_, pass); } - if (mesh->selected_changed && edit_mode) { - mesh->selected_changed = false; + if (mesh->isSelectionChanged(pass) && edit_mode) { + mesh->setSelectionChanged(pass, false); fillSelectionsBuffer(rend_selection.cur_selections_, it.value()); - mesh->loadSelections(f, rend_selection.cur_selections_); + //qDebug() << "fillSelectionsBuffer" << pass << rend_selection.cur_selections_.size(); + mesh->loadSelections(f, rend_selection.cur_selections_, pass); } - mesh->draw(f, it.value().size()); + //qDebug() << "draw" << pass << it.value().size(); + mesh->draw(f, it.value().size(), pass); } if (emit_pos_change) emit view->objectsPositionChanged(); } diff --git a/qglengine/renderer.h b/qglengine/renderer.h index 9bd632e..b72c981 100644 --- a/qglengine/renderer.h +++ b/qglengine/renderer.h @@ -34,13 +34,6 @@ class Renderer: public RendererBase { friend class RendererService; friend class RendererSelection; friend class TonemappingProc; - enum RenderPass { - rpSolid, - rpTransparent, - rpSelection, - rpShadow, - rpNoProc, - }; enum ShaderRole { // Selection srSelectionFill, @@ -89,7 +82,7 @@ public: void recreateMaterialThumbnails(bool force_all = false) {rend_mat.recreateMaterialThumbnails(force_all);} protected: - void fillObjectsBuffer(const QList & ol, RenderPass pass); + void fillObjectsBuffer(const ObjectBaseList & ol, RenderPass pass); void reloadObjects(); void renderObjects(Scene & scene, RenderPass pass); diff --git a/qglengine/renderer_base.cpp b/qglengine/renderer_base.cpp index 969bca6..5a0adfd 100644 --- a/qglengine/renderer_base.cpp +++ b/qglengine/renderer_base.cpp @@ -123,7 +123,7 @@ void RendererBase::setUniformViewCorners(QOpenGLShaderProgram * prog, Camera * c } -void RendererBase::fillSelectionsBuffer(QVector & buffer, const QList & ol) { +void RendererBase::fillSelectionsBuffer(QVector & buffer, const ObjectBaseList & ol) { buffer.resize(ol.size()); for (int i = 0; i < ol.size(); ++i) { buffer[i] = (ol[i]->isSelected(true) ? 1 : 0); diff --git a/qglengine/renderer_base.h b/qglengine/renderer_base.h index e449ec2..0019d91 100644 --- a/qglengine/renderer_base.h +++ b/qglengine/renderer_base.h @@ -36,7 +36,7 @@ protected: void setUniformMaps (QOpenGLShaderProgram * prog); void setUniformCamera (QOpenGLShaderProgram * prog, Camera * cam, bool matrices = true, QSize viewport = QSize()); void setUniformViewCorners(QOpenGLShaderProgram * prog, Camera * cam, QSize viewport = QSize()); - void fillSelectionsBuffer(QVector & buffer, const QList & ol); + void fillSelectionsBuffer(QVector & buffer, const ObjectBaseList & ol); void fillSelectionsBuffer(QVector & buffer, bool yes, int size); void reloadMaterials(Scene & scene); void reloadLightsParameters(const QMap> & lights); diff --git a/qglengine/renderer_selection.cpp b/qglengine/renderer_selection.cpp index fe343f2..1073dc6 100644 --- a/qglengine/renderer_selection.cpp +++ b/qglengine/renderer_selection.cpp @@ -58,23 +58,26 @@ void RendererSelection::resize(int width, int height) { void RendererSelection::generateObjectsID(Scene & scene) { ids.clear(); aim_ids.clear(); - QMapIterator > it(scene.geometries_used); - while (it.hasNext()) { - it.next(); - foreach (ObjectBase * o, it.value()) { - uint id = qHash(o); - ids[id] = o; - o->id_ = id; + QList passes = scene.geometries_used.keys(); + foreach (int p, passes) { + QMapIterator it(scene.geometries_used[p]); + while (it.hasNext()) { + it.next(); + foreach (ObjectBase * o, it.value()) { + uint id = qHash(o); + ids[id] = o; + o->id_ = id; + } } - } - QMapIterator> lit(scene.lights_used); - while (lit.hasNext()) { - lit.next(); - foreach (ObjectBase * o, lit.value()) { - uint id = qHash(o); - ids[id] = o; - aim_ids[id + 1] = o; - o->id_ = id; + QMapIterator> lit(scene.lights_used); + while (lit.hasNext()) { + lit.next(); + foreach (ObjectBase * o, lit.value()) { + uint id = qHash(o); + ids[id] = o; + aim_ids[id + 1] = o; + o->id_ = id; + } } } } @@ -121,7 +124,8 @@ void RendererSelection::renderSelection(Scene & scene) { glEnableDepth(); glClearFramebuffer(QColor(0,0,0,0)); r->setUniformCamera(prog, view->camera()); - r->renderObjects(scene, Renderer::rpSelection); + r->renderObjects(scene, rpSolid); + r->renderObjects(scene, rpTransparent); view->glClear(GL_DEPTH_BUFFER_BIT); RendererService & rs(r->rend_service); diff --git a/qglengine/renderer_service.cpp b/qglengine/renderer_service.cpp index b0ec725..792aecf 100644 --- a/qglengine/renderer_service.cpp +++ b/qglengine/renderer_service.cpp @@ -237,7 +237,7 @@ void RendererService::fillHandleObjects(QVector3D center, HandleMesh ids[], cons bool RendererService::calculateCenter() { - QList sol = r->view->scene()->selectedObjects(true); + ObjectBaseList sol = r->view->scene()->selectedObjects(true); if (sol.isEmpty()) return false; selection_center = sol[0]->worldPos(); if (sol.size() > 1) { diff --git a/qglengine/widgets/materials_editor.cpp b/qglengine/widgets/materials_editor.cpp index ae29604..19592e2 100644 --- a/qglengine/widgets/materials_editor.cpp +++ b/qglengine/widgets/materials_editor.cpp @@ -172,7 +172,7 @@ void MaterialsEditor::on_buttonDelete_clicked() { void MaterialsEditor::on_buttonAssign_clicked() { if (!view) return; Material * m = currentMaterial(); - QList ol = view->selectedObjects(); + ObjectBaseList ol = view->selectedObjects(); foreach (ObjectBase * o, ol) o->setMaterial(m, true); } @@ -180,7 +180,7 @@ void MaterialsEditor::on_buttonAssign_clicked() { void MaterialsEditor::on_buttonUnset_clicked() { if (!view) return; - QList ol = view->selectedObjects(); + ObjectBaseList ol = view->selectedObjects(); foreach (ObjectBase * o, ol) o->setMaterial(0, true); } diff --git a/qglengine/widgets/object_editor.cpp b/qglengine/widgets/object_editor.cpp index c3a4a46..595f301 100644 --- a/qglengine/widgets/object_editor.cpp +++ b/qglengine/widgets/object_editor.cpp @@ -91,7 +91,7 @@ void ObjectEditor::selectionChanged() { } ui->widgetMain->setEnabled(false); if (!view) return; - QList sol = view->selectedObjects(true); + ObjectBaseList sol = view->selectedObjects(true); if (sol.isEmpty()) { ui->labelTitle->setText(tr("[No selected]")); return; @@ -188,7 +188,7 @@ void ObjectEditor::on_comboLightType_currentIndexChanged(int index) { void ObjectEditor::on_buttonColor_colorChanged(const QColor & v) { if (!view || !active) return; - QList sol = view->selectedObjects(); + ObjectBaseList sol = view->selectedObjects(); foreach (ObjectBase * o, sol) o->setColor(v); QList sll = view->selectedLights(); @@ -199,7 +199,7 @@ void ObjectEditor::on_buttonColor_colorChanged(const QColor & v) { void ObjectEditor::spinChanged(double v) { if (!view || !active) return; - QList sol = view->selectedObjects(true); + ObjectBaseList sol = view->selectedObjects(true); QObject * s = sender(); foreach (ObjectBase * o, sol) { if (s == ui->spinPosX ) o->setPosX (v); @@ -249,7 +249,7 @@ void ObjectEditor::spinCameraChanged(double v) { void ObjectEditor::checkChanged(bool v) { if (!view || !active) return; - QList sol = view->selectedObjects(); + ObjectBaseList sol = view->selectedObjects(); QList scl = view->selectedCameras(); QObject * s = sender(); foreach (ObjectBase * o, sol) { diff --git a/qglengine/widgets/scene_tree.cpp b/qglengine/widgets/scene_tree.cpp index 44dcdef..7c5d7c3 100644 --- a/qglengine/widgets/scene_tree.cpp +++ b/qglengine/widgets/scene_tree.cpp @@ -266,7 +266,7 @@ void SceneTree::treeObjects_selectionCnahged() { if (block_tree || !view) return; block_tree = true; view->scene()->clearSelection(); - QList sol; + ObjectBaseList sol; QList til = ui->treeObjects->selectedItems(); foreach (QTreeWidgetItem * i, til) sol << itemObject(i); @@ -361,7 +361,7 @@ void SceneTree::on_actionAdd_camera_triggered() { void SceneTree::on_actionClone_triggered() { if (!view) return; QList sil = ui->treeObjects->selectedItems(); - QList col; + ObjectBaseList col; foreach (QTreeWidgetItem * i, sil) { ObjectBase * o = itemObject(i); if (!o) continue; @@ -375,7 +375,7 @@ void SceneTree::on_actionClone_triggered() { void SceneTree::on_actionGroup_triggered() { if (!view) return; - QList sol = view->scene()->selectedObjects(true); + ObjectBaseList sol = view->scene()->selectedObjects(true); ObjectBase * cp = sol[0]->parent(); ObjectBase * nr = new ObjectBase(); cp->addChild(nr); @@ -387,7 +387,7 @@ void SceneTree::on_actionGroup_triggered() { void SceneTree::on_actionSelect_parent_triggered() { if (!view) return; - QList sol = view->scene()->selectedObjects(true); + ObjectBaseList sol = view->scene()->selectedObjects(true); QSet nsl; foreach (ObjectBase * o, sol) { ObjectBase * po = o->parent(); @@ -424,7 +424,7 @@ void SceneTree::focusObjects() { if (!view) return; if (!view->camera()) return; Box3D bb; - QList ol = view->selectedObjects(); + ObjectBaseList ol = view->selectedObjects(); foreach (ObjectBase * o, ol) { o->calculateBoundingBox(); bb |= o->boundingBox();