diff --git a/qglview/glframebuffer.cpp b/qglview/glframebuffer.cpp index 9578f0b..57004a4 100644 --- a/qglview/glframebuffer.cpp +++ b/qglview/glframebuffer.cpp @@ -90,7 +90,7 @@ void GLFramebuffer::bind() { if (is_changed) resize(wid, hei); if (fbo == 0) return; initializeOpenGLFunctions(); - glFlush(); + //glFlush(); glGetIntegerv(GL_VIEWPORT, prev_view); //glClearError(); glBindFramebuffer(GL_FRAMEBUFFER, fbo); @@ -108,7 +108,7 @@ void GLFramebuffer::bind() { void GLFramebuffer::release() { is_changed = false; if (fbo == 0) return; - glFlush(); + //glFlush(); glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(prev_view[0], prev_view[1], prev_view[2], prev_view[3]); } diff --git a/qglview/glshaders.cpp b/qglview/glshaders.cpp index 083e272..151e77b 100644 --- a/qglview/glshaders.cpp +++ b/qglview/glshaders.cpp @@ -115,7 +115,7 @@ QString loadShaderFile(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType ty all.insert(ip + 1, qgl_uniform); } prog->addShaderFromSourceCode(type, all); - //qDebug() << "********" << all; +// qDebug() << "********" << all; return all; } @@ -127,7 +127,7 @@ bool loadShaders(QOpenGLShaderProgram * prog, const QString & name, const QStrin //qDebug() << "[QGLView] Shader \"" + name + "\" load shaders from" << d.absolutePath(); sl = d.entryInfoList(QStringList(name + ".geom"), QDir::Files | QDir::NoDotAndDotDot); foreach (const QFileInfo & i, sl) { - qDebug() << "[QGLView] Shader \"" + name + "\" add geometry shader:" << i.fileName(); + //qDebug() << "[QGLView] Shader \"" + name + "\" add geometry shader:" << i.fileName(); loadShaderFile(prog, QOpenGLShader::Geometry, i.absoluteFilePath()); } sl = d.entryInfoList(QStringList(name + ".vert"), QDir::Files | QDir::NoDotAndDotDot); diff --git a/qglview/gltypes.cpp b/qglview/gltypes.cpp index 9120259..98b2dcc 100644 --- a/qglview/gltypes.cpp +++ b/qglview/gltypes.cpp @@ -62,11 +62,42 @@ void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x, locc = prog ? prog->attributeLocation("view_corner") : 0; glBegin(GL_QUADS); QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions(); - if (prog) {glFuncs->glVertexAttrib3f(loc, 1.f, 1.f, 1.f);} glColor3f(1.f, 1.f, 1.f); - if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[0]); glFuncs->glVertexAttrib2f(loct, 0.f, 0.f); glFuncs->glVertexAttrib2f(locv, x, y);} glTexCoord2f(0.f, 0.f); glVertex2f(x, y); - if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[1]); glFuncs->glVertexAttrib2f(loct, 1.f, 0.f); glFuncs->glVertexAttrib2f(locv, x + w, y);} glTexCoord2f(1.f, 0.f); glVertex2f(x + w, y); - if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[2]); glFuncs->glVertexAttrib2f(loct, 1.f, 1.f); glFuncs->glVertexAttrib2f(locv, x + w, y + h);} glTexCoord2f(1.f, 1.f); glVertex2f(x + w, y + h); - if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[3]); glFuncs->glVertexAttrib2f(loct, 0.f, 1.f); glFuncs->glVertexAttrib2f(locv, x, y + h);} glTexCoord2f(0.f, 1.f); glVertex2f(x, y + h); + if (prog) { + glFuncs->glVertexAttrib3f(loc, 1.f, 1.f, 1.f); + } + glColor3f(1.f, 1.f, 1.f); + if (prog) { + if (corner_dirs) + prog->setAttributeValue(locc, corner_dirs[0]); + glFuncs->glVertexAttrib2f(loct, 0.f, 0.f); + glFuncs->glVertexAttrib2f(locv, x, y); + } + glTexCoord2f(0.f, 0.f); + glVertex2f(x, y); + if (prog) { + if (corner_dirs) + prog->setAttributeValue(locc, corner_dirs[1]); + glFuncs->glVertexAttrib2f(loct, 1.f, 0.f); + glFuncs->glVertexAttrib2f(locv, x + w, y); + } + glTexCoord2f(1.f, 0.f); + glVertex2f(x + w, y); + if (prog) { + if (corner_dirs) + prog->setAttributeValue(locc, corner_dirs[2]); + glFuncs->glVertexAttrib2f(loct, 1.f, 1.f); + glFuncs->glVertexAttrib2f(locv, x + w, y + h); + } + glTexCoord2f(1.f, 1.f); + glVertex2f(x + w, y + h); + if (prog) { + if (corner_dirs) + prog->setAttributeValue(locc, corner_dirs[3]); + glFuncs->glVertexAttrib2f(loct, 0.f, 1.f); + glFuncs->glVertexAttrib2f(locv, x, y + h); + } + glTexCoord2f(0.f, 1.f); + glVertex2f(x, y + h); glEnd(); } diff --git a/qglview/glwidget.cpp b/qglview/glwidget.cpp index f8f3c2e..17d99c4 100644 --- a/qglview/glwidget.cpp +++ b/qglview/glwidget.cpp @@ -1,5 +1,6 @@ #include "glwidget.h" -#include "qglview.h" +#include "renderer_simple.h" +#include "renderer_deferred_shading.h" #include @@ -22,22 +23,22 @@ QColor GLWidget::backColor() const { } -float GLWidget::lineWidth() const { +qreal GLWidget::lineWidth() const { return view_->lineWidth(); } -float GLWidget::FOV() const { +qreal GLWidget::FOV() const { return view_->FOV(); } -float GLWidget::depthStart() const { +qreal GLWidget::depthStart() const { return view_->depthStart(); } -float GLWidget::depthEnd() const { +qreal GLWidget::depthEnd() const { return view_->depthEnd(); } @@ -83,7 +84,7 @@ QColor GLWidget::hoverHaloColor() const { } -float GLWidget::hoverHaloFillAlpha() const { +qreal GLWidget::hoverHaloFillAlpha() const { return view_->hoverHaloFillAlpha(); } @@ -98,18 +99,22 @@ QColor GLWidget::selectionHaloColor() const { } -float GLWidget::selectionHaloFillAlpha() const { +qreal GLWidget::selectionHaloFillAlpha() const { return view_->selectionHaloFillAlpha(); } void GLWidget::stop() { - return view_->stop(); + view_->stop(); } -void GLWidget::start(float freq) { - return view_->start(freq); +void GLWidget::start(float freq, GLRendererBase * r) { + if (r == nullptr) r = new RendererSimple(view_); + GLRendererBase * pr = nullptr; + view_->setRenderer(r, &pr); + if (pr != nullptr) delete pr; + view_->start(freq); } @@ -118,22 +123,22 @@ void GLWidget::setBackColor(const QColor & c) { } -void GLWidget::setLineWidth(const float & arg) { +void GLWidget::setLineWidth(const qreal & arg) { view_->setLineWidth(arg); } -void GLWidget::setFOV(const float & arg) { +void GLWidget::setFOV(const qreal & arg) { view_->setFOV(arg); } -void GLWidget::setDepthStart(const float & arg) { +void GLWidget::setDepthStart(const qreal & arg) { view_->setDepthStart(arg); } -void GLWidget::setDepthEnd(const float & arg) { +void GLWidget::setDepthEnd(const qreal & arg) { view_->setDepthEnd(arg); } @@ -178,7 +183,7 @@ void GLWidget::setHoverHaloColor(const QColor & arg) { } -void GLWidget::setHoverHaloFillAlpha(const float & arg) { +void GLWidget::setHoverHaloFillAlpha(const qreal & arg) { view_->setHoverHaloFillAlpha(arg); } @@ -193,7 +198,7 @@ void GLWidget::setSelectionHaloColor(const QColor & arg) { } -void GLWidget::setSelectionHaloFillAlpha(const float & arg) { +void GLWidget::setSelectionHaloFillAlpha(const qreal & arg) { view_->setSelectionHaloFillAlpha(arg); } diff --git a/qglview/glwidget.h b/qglview/glwidget.h index e256e47..2ab2550 100644 --- a/qglview/glwidget.h +++ b/qglview/glwidget.h @@ -5,15 +5,16 @@ class QGLView; +class GLRendererBase; class GLWidget : public QWidget { Q_OBJECT Q_PROPERTY (QColor backColor READ backColor WRITE setBackColor) - Q_PROPERTY (float lineWidth READ lineWidth WRITE setLineWidth) - Q_PROPERTY (float FOV READ FOV WRITE setFOV) - Q_PROPERTY (float depthStart READ depthStart WRITE setDepthStart) - Q_PROPERTY (float depthEnd READ depthEnd WRITE setDepthEnd) + Q_PROPERTY (qreal lineWidth READ lineWidth WRITE setLineWidth) + Q_PROPERTY (qreal FOV READ FOV WRITE setFOV) + Q_PROPERTY (qreal depthStart READ depthStart WRITE setDepthStart) + Q_PROPERTY (qreal depthEnd READ depthEnd WRITE setDepthEnd) Q_PROPERTY (QColor ambientColor READ ambientColor WRITE setAmbientColor) Q_PROPERTY (bool grabMouse READ isGrabMouseEnabled WRITE setGrabMouseEnabled) Q_PROPERTY (bool mouseRotate READ isMouseRotateEnabled WRITE setMouseRotateEnabled) @@ -21,19 +22,19 @@ class GLWidget : public QWidget Q_PROPERTY (bool cameraOrbit READ isCameraOrbit WRITE setCameraOrbit) Q_PROPERTY (bool hoverHalo READ isHoverHaloEnabled WRITE setHoverHaloEnabled) Q_PROPERTY (QColor hoverHaloColor READ hoverHaloColor WRITE setHoverHaloColor) - Q_PROPERTY (float hoverHaloFillAlpha READ hoverHaloFillAlpha WRITE setHoverHaloFillAlpha) + Q_PROPERTY (qreal hoverHaloFillAlpha READ hoverHaloFillAlpha WRITE setHoverHaloFillAlpha) Q_PROPERTY (bool selectionHalo READ isSelectionHaloEnabled WRITE setSelectionHaloEnabled) Q_PROPERTY (QColor selectionHaloColor READ selectionHaloColor WRITE setSelectionHaloColor) - Q_PROPERTY (float selectionHaloFillAlpha READ selectionHaloFillAlpha WRITE setSelectionHaloFillAlpha) + Q_PROPERTY (qreal selectionHaloFillAlpha READ selectionHaloFillAlpha WRITE setSelectionHaloFillAlpha) public: explicit GLWidget(QWidget *parent = nullptr); QGLView * view() {return view_;} QColor backColor() const; - float lineWidth() const; - float FOV() const; - float depthStart() const; - float depthEnd() const; + qreal lineWidth() const; + qreal FOV() const; + qreal depthStart() const; + qreal depthEnd() const; QColor ambientColor() const; bool isLightEnabled() const; bool isGrabMouseEnabled() const; @@ -42,19 +43,19 @@ public: bool isCameraOrbit() const; bool isHoverHaloEnabled() const; QColor hoverHaloColor() const; - float hoverHaloFillAlpha() const; + qreal hoverHaloFillAlpha() const; bool isSelectionHaloEnabled() const; QColor selectionHaloColor() const; - float selectionHaloFillAlpha() const; + qreal selectionHaloFillAlpha() const; public slots: void stop(); - void start(float freq = 60.); + void start(float freq = 60.0, GLRendererBase * r = nullptr); void setBackColor(const QColor & c); - void setLineWidth(const float & arg); - void setFOV(const float & arg); - void setDepthStart(const float & arg); - void setDepthEnd(const float & arg); + void setLineWidth(const qreal & arg); + void setFOV(const qreal & arg); + void setDepthStart(const qreal & arg); + void setDepthEnd(const qreal & arg); void setAmbientColor(const QColor & arg); void setLightEnabled(const bool & arg); void setGrabMouseEnabled(const bool & arg); @@ -63,10 +64,10 @@ public slots: void setCameraOrbit(const bool & arg); void setHoverHaloEnabled(const bool & arg); void setHoverHaloColor(const QColor & arg); - void setHoverHaloFillAlpha(const float & arg); + void setHoverHaloFillAlpha(const qreal & arg); void setSelectionHaloEnabled(const bool & arg); void setSelectionHaloColor(const QColor & arg); - void setSelectionHaloFillAlpha(const float & arg); + void setSelectionHaloFillAlpha(const qreal & arg); private slots: void viewDoubleClicked(); diff --git a/qglview/plugin/qglviewplugin.cpp b/qglview/plugin/qglviewplugin.cpp index ef529c7..d20f2f2 100644 --- a/qglview/plugin/qglviewplugin.cpp +++ b/qglview/plugin/qglviewplugin.cpp @@ -1,6 +1,8 @@ #include "glwidget.h" #include "qglviewplugin.h" #include +#include "glprimitives.h" +#include "qglview.h" QGLViewPlugin::QGLViewPlugin(QObject * parent): QObject(parent) { @@ -25,7 +27,29 @@ bool QGLViewPlugin::isInitialized() const { QWidget * QGLViewPlugin::createWidget(QWidget * parent) { GLWidget * w = new GLWidget(parent); - //if (m_initialized) w->start(); + if (m_initialized) { + auto axis = new GLObjectBase(); + GLObjectBase * obj; + float al = 1.; + obj = new GLPrimitiveLine(QVector3D(0, 0, -al), QVector3D(0, 0, al)); + obj->material().color_diffuse = Qt::darkBlue; obj->setAcceptLight(false); + obj->setSelectable(false); + axis->addChild(obj); + obj = new GLPrimitiveLine(QVector3D(-al, 0, 0), QVector3D(al, 0, 0)); + obj->material().color_diffuse = Qt::darkRed; obj->setAcceptLight(false); + obj->setSelectable(false); + axis->addChild(obj); + obj = new GLPrimitiveLine(QVector3D(0, -al, 0), QVector3D(0, al, 0)); + obj->material().color_diffuse = Qt::darkGreen; obj->setAcceptLight(false); + obj->setSelectable(false); + axis->addChild(obj); + w->view()->addObject(axis); + auto cam_light = new Light(); + cam_light->intensity = 0.5; + cam_light->setName("Camera_Light"); + w->view()->camera()->addChild(cam_light); + w->start(); + } return w; } diff --git a/qglview/qglview.cpp b/qglview/qglview.cpp index ca09604..ac184a8 100644 --- a/qglview/qglview.cpp +++ b/qglview/qglview.cpp @@ -35,7 +35,7 @@ QGLView::QGLView(): OpenGLWindow(), fbo_selection(3) { need_init_ = is_first_draw = true; objects_.is_root = true; objects_.view_ = this; - backColor_ = Qt::black; + backColor_ = Qt::darkGray; hoverHaloColor_ = QColor(195, 140, 255, 96); selectionHaloColor_ = QColor(175, 255, 140); ambientColor_ = QColor(10, 10, 10); @@ -86,13 +86,14 @@ QGLView::QGLView(): OpenGLWindow(), fbo_selection(3) { setFeature(qglDepthOfFieldFocus, 1.); setFeature(qglDepthOfFieldDiaphragm, 8.); mouse_first = mouseSelect_ = hoverHalo_ = selectionHalo_ = true; - fogEnabled_ = is_init = grabMouse_ = mouseRotate_ = shaders_bind = changed_ = false; + mouseRotate_ = true; + fogEnabled_ = is_init = grabMouse_ = shaders_bind = changed_ = false; rmode = GLObjectBase::Fill; sel_mode = QGLView::SingleSelection; // sel_pen = QPen(Qt::black, 1, Qt::DashLine); // sel_brush = QBrush(QColor(170, 100, 255, 120)); - camera()->setAim(QVector3D(0,0,5.5)); - camera()->setPos(QVector3D(10, 5, 5.5)); + camera()->setAim(QVector3D()); + camera()->setPos(QVector3D(2, 2, 2)); camera()->setName("Camera"); addObject(camera()); emit cameraPosChanged(camera()->pos()); diff --git a/qglview/renderer_deferred_shading.cpp b/qglview/renderer_deferred_shading.cpp index 9d6d2bd..a3aa070 100644 --- a/qglview/renderer_deferred_shading.cpp +++ b/qglview/renderer_deferred_shading.cpp @@ -146,6 +146,12 @@ void RendererDeferredShading::renderScene() { l->shadow_map.release(); } } +// glUseProgram(0); +//// fbo_g.bindColorTextures(); +// glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(0)); +// glActiveTexture(GL_TEXTURE0); +// glDrawQuad(); +// return; glResetAllTransforms(); glSetLightEnabled(false); @@ -180,9 +186,9 @@ void RendererDeferredShading::renderScene() { //QVector lpos; //qDebug() << view_matrix; shader_ds_1->setUniformValue("t_pp", 6); - //qDebug() << "render in" << passes << "passes (" << lights_per_pass << ")"; int passes = (view.lightsCount() - 1) / lights_per_pass + 1; if (passes < 1) passes = 1; + //qDebug() << "render in" << passes << "passes (" << lights_per_pass << ")"; int wi, ri; for (int l = 0; l < passes; ++l) { wi = 1 - l % 2;