From b6bad7a921bf02a9dd19ccbecb1eb1d786da1333 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: Fri, 7 Sep 2018 08:37:44 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@421 a8b55f48-bf90-11e4-a774-851b48703e85 --- qglview/globject.cpp | 63 +++++++++++++++++++++++--- qglview/globject.h | 10 +++- qglview/glrendererbase.cpp | 6 +++ qglview/glrendererbase.h | 6 ++- qglview/glshaders.cpp | 1 + qglview/material_editor.ui | 11 ++++- qglview/qglview.cpp | 50 +++++++++++++++++++- qglview/qglview.h | 11 +++-- qglview/qglview_test/qglview_window.ui | 37 +++++++++------ qglview/renderer_deferred_shading.h | 4 +- qglview/renderer_simple.cpp | 2 +- qglview/renderer_simple.h | 14 +++--- 12 files changed, 174 insertions(+), 41 deletions(-) diff --git a/qglview/globject.cpp b/qglview/globject.cpp index ef0f2ca..91e8c20 100644 --- a/qglview/globject.cpp +++ b/qglview/globject.cpp @@ -40,6 +40,17 @@ GLObjectBase::GLObjectBase() { } +GLObjectBase::~GLObjectBase() { + //qDebug() << "del" << name() << view_; + if (parent_) parent_->children_.removeAll(this); + if (view_) ((QGLView*)view_)->objectDeleted(this); + foreach (GLObjectBase * c, children_) { + c->parent_ = 0; + delete c; + } +} + + GLObjectBase * GLObjectBase::clone(bool withChildren) { GLObjectBase * o = new GLObjectBase(); o->pass_ = pass_; @@ -104,16 +115,34 @@ void GLObjectBase::setView(QGLView * v) { } +void GLObjectBase::addChild(GLObjectBase * o) { + if (o == this) return; + if (o->parent_) + o->parent_->children_.removeAll(o); + children_ << o; + o->parent_ = this; + o->setView((QGLView*)view_); + o->buildTransform(); + if (view_) { + view_->collectLights(); + QList cl = o->children(true); + cl << o; + foreach (GLObjectBase * i, cl) { + emit ((QGLView*)view_)->objectAdded(i); + } + } +} + + void GLObjectBase::clearChildren(bool deleteAll) { foreach (GLObjectBase * i, children_) { - i->setView(0); + i->view_ = 0; i->parent_ = 0; + i->clearChildren(deleteAll); if (deleteAll) { - i->clearChildren(true); delete i; - } else { - i->buildTransform(); } + i->buildTransform(); } children_.clear(); if (view_) view_->collectLights(); @@ -151,6 +180,27 @@ void GLObjectBase::calculateBoundingBox() { } +void GLObjectBase::setProperty(const QString & pn, const QVariant & v) { + meta[pn] = v; +} + + +QVariant GLObjectBase::property(const QString & pn, bool * exists) const { + if (exists) *exists = meta.contains(pn); + return meta.value(pn); +} + + +bool GLObjectBase::hasProperty(const QString & pn) const { + return meta.contains(pn); +} + + +void GLObjectBase::removeProperty(const QString & pn) { + meta.remove(pn); +} + + void GLObjectBase::setTransform(const QMatrix4x4 & t) { raw_matrix = true; mat_ = t; @@ -171,7 +221,7 @@ void GLObjectBase::select() { void GLObjectBase::buildTransform() { itransform_.setToIdentity(); GLObjectBase * p = parent_; - if (p != 0) + if (p) itransform_ = p->itransform_; if (raw_matrix) { itransform_.translate(pos_); @@ -311,7 +361,7 @@ QDataStream & operator <<(QDataStream & s, const GLObjectBase * p) { << cs.chunk(5, p->cast_shadow) << cs.chunk(6, p->rec_shadow) << cs.chunk(7, p->raw_matrix) << cs.chunk(8, p->line_width) << cs.chunk(9, int(p->render_mode)) << cs.chunk(10, p->material_) << cs.chunk(11, p->pos_) << cs.chunk(12, p->angles_) << cs.chunk(13, p->scale_) << cs.chunk(14, p->mat_) << cs.chunk(15, p->vbo) << cs.chunk(16, p->children_.size()) - << cs.chunk(17, p->name_); + << cs.chunk(17, p->name_) << cs.chunk(18, p->meta); //qDebug() << "place self done"; if (p->type_ == GLObjectBase::glLight) { //qDebug() << "place light ..."; @@ -370,6 +420,7 @@ QDataStream & operator >>(QDataStream & s, GLObjectBase *& p) { case 15: if (p) p->vbo = cs.getData(); break; case 16: if (p) ccnt = cs.getData(); break; case 17: if (p) p->name_ = cs.getData(); break; + case 18: if (p) p->meta = cs.getData(); break; case 100: if (l) l->direction = cs.getData(); break; case 101: if (l) l->angle_start = cs.getData(); break; case 102: if (l) l->angle_end = cs.getData(); break; diff --git a/qglview/globject.h b/qglview/globject.h index e38aa77..9a2f3f2 100644 --- a/qglview/globject.h +++ b/qglview/globject.h @@ -40,7 +40,7 @@ public: enum RenderMode {View = 0, Point = GL_POINT, Line = GL_LINE, Fill = GL_FILL}; GLObjectBase(); - virtual ~GLObjectBase() {;} + virtual ~GLObjectBase(); virtual GLObjectBase * clone(bool withChildren = true); @@ -66,7 +66,7 @@ public: bool hasChildren() const {return children_.size() != 0;} void setView(QGLView * v); - void addChild(GLObjectBase * o) {if (o == this) return; if (o->parent_ != 0) o->parent_->children_.removeAll(o); children_ << o; o->parent_ = this; o->buildTransform(); if (view_ != 0) view_->collectLights();} + void addChild(GLObjectBase * o); void removeChild(GLObjectBase * o) {if (o == this) return; children_.removeAll(o); o->parent_ = 0; o->buildTransform(); if (view_ != 0) view_->collectLights();} void removeChild(int index) {children_[index]->parent_ = 0; children_[index]->buildTransform(); children_.removeAt(index); if (view_ != 0) view_->collectLights();} void clearChildren(bool deleteAll = false); @@ -177,6 +177,11 @@ public: void calculateBoundingBox(); + void setProperty(const QString & pn, const QVariant & v); + QVariant property(const QString & pn, bool * exists = 0) const; + bool hasProperty(const QString & pn) const; + void removeProperty(const QString & pn); + QVector3D pos_h; QVector points, puvws; QVector faces, uvws, norms; @@ -214,6 +219,7 @@ protected: GLObjectBase * parent_; QGLViewBase * view_; GLVBO vbo; + QVariantMap meta; }; diff --git a/qglview/glrendererbase.cpp b/qglview/glrendererbase.cpp index 530ca39..6a0c000 100644 --- a/qglview/glrendererbase.cpp +++ b/qglview/glrendererbase.cpp @@ -286,6 +286,12 @@ void GLRendererBase::renderSingleShadow(GLObjectBase & o, RenderingParameters & +GLRendererBase::RenderingParameters::RenderingParameters() { + shaders = 0; + cur_shader = 0; +} + + void GLRendererBase::RenderingParameters::prepare() { proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX); view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX); diff --git a/qglview/glrendererbase.h b/qglview/glrendererbase.h index 7069e76..8865084 100644 --- a/qglview/glrendererbase.h +++ b/qglview/glrendererbase.h @@ -34,8 +34,8 @@ public: virtual void prepareScene() {;} virtual void renderScene() = 0; -protected: struct RenderingParameters { + RenderingParameters(); void prepare(); void setUniform(__GLShaderProgram__ * prog); int pass; @@ -55,6 +55,9 @@ protected: __GLShaderProgram__ * cur_shader; }; + RenderingParameters rp; + +protected: virtual void setupLight(const Light & l, int inpass_index, int gl_index); virtual void setupAmbientLight(const QColor & a, bool first_pass); virtual void setupShadersLights(int lights_count); @@ -71,7 +74,6 @@ protected: void renderShadow(Light * l, __GLShaderProgram__ * prog = 0, QMatrix4x4 mat = QMatrix4x4()); void renderSingleShadow(GLObjectBase & o, RenderingParameters & rpl); - RenderingParameters rp; QGLView & view; QImage white_image, violent_image; GLuint white_image_id, violent_image_id; diff --git a/qglview/glshaders.cpp b/qglview/glshaders.cpp index 6f8d52c..9aa1ff8 100644 --- a/qglview/glshaders.cpp +++ b/qglview/glshaders.cpp @@ -158,6 +158,7 @@ void setUniformMatrices(__GLShaderProgram__ * prog, QMatrix4x4 proj, QMatrix4x4 prog->setUniformValue("qgl_ModelViewMatrix", view); prog->setUniformValue("qgl_ProjectionMatrix", proj); prog->setUniformValue("prev_ModelViewProjectioMatrix", pmvpm); + prog->setUniformValue("prev_ModelViewMatrix", prevview); prog->setUniformValue("qgl_ModelViewProjectionMatrix", mvpm); prog->setUniformValue("qgl_NormalMatrix", nm); //prog->setUniformValue("qgl_BumpMatrix", nm.); diff --git a/qglview/material_editor.ui b/qglview/material_editor.ui index 8286246..4ac23ce 100644 --- a/qglview/material_editor.ui +++ b/qglview/material_editor.ui @@ -7,7 +7,7 @@ 0 0 470 - 737 + 791 @@ -44,6 +44,9 @@ + + Qt::NoFocus + font:normal; @@ -83,6 +86,9 @@ + + Qt::NoFocus + font:normal; @@ -122,6 +128,9 @@ + + Qt::NoFocus + font:normal; diff --git a/qglview/qglview.cpp b/qglview/qglview.cpp index 9518fd9..8e48aa4 100644 --- a/qglview/qglview.cpp +++ b/qglview/qglview.cpp @@ -30,6 +30,7 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) { _w = 0; need_init_ = is_first_draw = true; objects_.is_root = true; + objects_.view_ = this; painter_ = 0; backColor_ = Qt::black; hoverHaloColor_ = QColor(195, 140, 255, 96); @@ -119,9 +120,14 @@ void QGLView::addObject(QWidget * o, Qt::WindowFlags f) { void QGLView::addObject(GLObjectBase * o) { - o->setView(this); objects_.addChild(o); + o->setView(this); collectLights(); + QList cl = o->children(true); + cl << o; + foreach (GLObjectBase * i, cl) { + emit objectAdded(i); + } if (is_init) { globMutex.lock(); o->init(); @@ -130,9 +136,30 @@ void QGLView::addObject(GLObjectBase * o) { } +void QGLView::removeObject(GLObjectBase * o, bool inChildren) { + o->setView(0); + if (inChildren) + removeObjectInternal(o, &objects_); + else + objects_.removeChild(o); + objectDeleted(o); +} + + +void QGLView::clearObjects(bool deleteAll) { + removeObject(camera_); + objects_.clearChildren(deleteAll); + addObject(camera()); + selectObject(0); + hov_obj = 0; +} + + void QGLView::selectObject(GLObjectBase * o) { - emit selectionChanged(o, sel_obj); + if (o == sel_obj) return; + GLObjectBase * pso = sel_obj; sel_obj = o; + emit selectionChanged(sel_obj, pso); } @@ -224,6 +251,7 @@ void QGLView::paintGL() { if (need_init_) initializeGL(); #endif + emit glBeforePaint(); //qDebug() << "paintGL"; //QMutexLocker ml_v(&v_mutex); glEnable(GL_CULL_FACE); @@ -473,6 +501,13 @@ void QGLView::collectLights() { } +void QGLView::objectDeleted(GLObjectBase * o) { + //qDebug() << "del" << o; + if (sel_obj == o) selectObject(0); + if (hov_obj == o) hov_obj = 0; +} + + QList QGLView::collectGraphicItems() { QList list = scene()->items(); foreach (QGraphicsItem * i, list) @@ -500,6 +535,17 @@ void QGLView::collectObjectLights(GLObjectBase * o) { } +void QGLView::removeObjectInternal(GLObjectBase * o, GLObjectBase * where) { + foreach (GLObjectBase * i, where->children_) { + if (o == i) + where->removeChild(i); + else + removeObjectInternal(o, i); + objectDeleted(i); + } +} + + void QGLView::checkCaps() { glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_anisotropic); //glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_texture_chanels); diff --git a/qglview/qglview.h b/qglview/qglview.h index 2a1d930..1c2f388 100644 --- a/qglview/qglview.h +++ b/qglview/qglview.h @@ -42,6 +42,7 @@ class QGLView: public QGraphicsView, public QGLViewBase #endif { friend class GLRendererBase; + friend class GLObjectBase; Q_OBJECT Q_PROPERTY (QColor backColor READ backColor WRITE setBackColor) Q_PROPERTY (double lineWidth READ lineWidth WRITE setLineWidth) @@ -167,9 +168,9 @@ public: void addObject(GLObjectBase * o); void addObject(GLObjectBase & o) {addObject(&o);} int objectsCount(bool all = false) {if (!all) return objects_.childCount(); int cnt = 0; objectsCountInternal(&cnt, &objects_); return cnt;} - void removeObject(GLObjectBase * o, bool inChildren = true) {if (inChildren) removeObjectInternal(o, &objects_); else objects_.removeChild(o);} + void removeObject(GLObjectBase * o, bool inChildren = true); void removeObject(GLObjectBase & o, bool inChildren = true) {removeObject(&o, inChildren);} - void clearObjects(bool deleteAll = false) {removeObject(camera_); objects_.clearChildren(deleteAll); addObject(camera()); sel_obj = hov_obj = 0;} + void clearObjects(bool deleteAll = false); QList objects(bool all = false) {return objects_.children(all);} int lightsCount() const {return lights_.size();} @@ -200,6 +201,7 @@ public: void setSelectionRectPen(const QPen & v) {sel_pen = v;} void setSelectionRectBrush(const QBrush & v) {sel_brush = v;} void selectObject(GLObjectBase * o); + GLObjectBase * selectedObject() const {return sel_obj;} GLdouble aspect, iaspect; QMatrix4x4 cur_mvpm; @@ -229,9 +231,10 @@ protected: void collectLights(); private: + void objectDeleted(GLObjectBase * o); void collectObjectLights(GLObjectBase * o); void objectsCountInternal(int * cnt, GLObjectBase * where) {++(*cnt); foreach (GLObjectBase * i, where->children_) objectsCountInternal(cnt, i);} - void removeObjectInternal(GLObjectBase * o, GLObjectBase * where) {foreach (GLObjectBase * i, where->children_) {if (o == i) where->removeChild(i); else removeObjectInternal(o, i);}} + void removeObjectInternal(GLObjectBase * o, GLObjectBase * where); void renderSingleSelection(GLObjectBase & o); //void renderSingleShadow(GLObjectBase & o); void renderHalo(const GLObjectBase * obj, const int iid, const QColor & color, const double & fill); @@ -306,6 +309,7 @@ public slots: void deselect() {sel_obj = 0;} signals: + void glBeforePaint(); void glBeginPaint(); void glPainting(); void glEndPaint(); @@ -323,6 +327,7 @@ signals: void hoverChanged(GLObjectBase * cur, GLObjectBase * prev); void selectionChanged(GLObjectBase * cur, GLObjectBase * prev); + void objectAdded(GLObjectBase * ); }; diff --git a/qglview/qglview_test/qglview_window.ui b/qglview/qglview_test/qglview_window.ui index 0999889..5de7487 100644 --- a/qglview/qglview_test/qglview_window.ui +++ b/qglview/qglview_test/qglview_window.ui @@ -7,7 +7,7 @@ 0 0 1125 - 905 + 1056 @@ -21,7 +21,16 @@ 2 - + + 0 + + + 0 + + + 0 + + 0 @@ -44,7 +53,7 @@ - 0 + 1 @@ -1066,7 +1075,7 @@ 0 0 1125 - 26 + 24 @@ -1087,7 +1096,7 @@ - + :/icons/application-exit.png:/icons/application-exit.png @@ -1096,7 +1105,7 @@ - + :/icons/document-import.png:/icons/document-import.png @@ -1108,7 +1117,7 @@ - + :/icons/document-open.png:/icons/document-open.png @@ -1120,7 +1129,7 @@ - + :/icons/document-save-all.png:/icons/document-save-all.png @@ -1132,7 +1141,7 @@ - + :/icons/document-new.png:/icons/document-new.png @@ -1144,7 +1153,7 @@ - + :/icons/document-save-.png:/icons/document-save-.png @@ -1172,13 +1181,13 @@ QGLView QWidget -
qglview.h
+
qglview.h
1
MaterialEditor QWidget -
material_editor.h
+
material_editor.h
1
@@ -1193,8 +1202,6 @@
propertyeditor.h
- - - + diff --git a/qglview/renderer_deferred_shading.h b/qglview/renderer_deferred_shading.h index 4f741b2..852cc09 100644 --- a/qglview/renderer_deferred_shading.h +++ b/qglview/renderer_deferred_shading.h @@ -29,11 +29,11 @@ public: virtual ~RendererDeferredShading(); virtual void renderScene(); - -protected: void init(int width, int height); void resize(int width, int height); void reloadShaders(); + +protected: void setupShadersTextures(GLObjectBase & object, RenderingParameters & rp); void setupShadersLights(int lights_count) {cplc = lights_count;} void setupDSLights(int pass, const QMatrix4x4 & view_matrix); diff --git a/qglview/renderer_simple.cpp b/qglview/renderer_simple.cpp index 8488bc8..aecddb3 100644 --- a/qglview/renderer_simple.cpp +++ b/qglview/renderer_simple.cpp @@ -73,7 +73,7 @@ void RendererSimple::renderScene() { glDepthMask(GL_FALSE); glDepthFunc(GL_EQUAL); } - view.camera().apply(view.aspect); + //view.camera().apply(view.aspect); rp.cam_offset_matrix = view.camera().offsetMatrix(); rp.prepare(); setupLights(l, 8); diff --git a/qglview/renderer_simple.h b/qglview/renderer_simple.h index 3a50d07..7680ecc 100644 --- a/qglview/renderer_simple.h +++ b/qglview/renderer_simple.h @@ -28,19 +28,19 @@ public: virtual ~RendererSimple() {if (shader_fxaa != 0) delete shader_fxaa;} virtual void renderScene(); - - QPoint mpos; - -protected: + virtual void reloadShaders(); virtual void init(int width, int height) {resizeFBO(width, height);} virtual void resize(int width, int height) {resizeFBO(width, height);} - virtual void reloadShaders(); + + QPoint mpos; + +protected: private: void resizeFBO(int w, int h); - GLFramebuffer fbo , fbo_c; - __GLShaderProgram__ * shader_fxaa , * shader; + GLFramebuffer fbo, fbo_c; + __GLShaderProgram__ * shader_fxaa, * shader; };