diff --git a/src/core/core/glframebuffereffectbase.h b/src/core/core/glframebuffereffectbase.h index db89069..7f31e70 100644 --- a/src/core/core/glframebuffereffectbase.h +++ b/src/core/core/glframebuffereffectbase.h @@ -19,12 +19,13 @@ #ifndef glframebuffereffectbase_H #define glframebuffereffectbase_H -#include "glframebuffer.h" +#include "gltypes.h" +#include "parameteredobject.h" #include -class QGLENGINE_CORE_EXPORT FramebufferEffectBase { +class QGLENGINE_CORE_EXPORT FramebufferEffectBase: public ParameteredObject { friend class FramebufferMipmap; friend class Renderer; @@ -32,11 +33,12 @@ public: FramebufferEffectBase(); virtual ~FramebufferEffectBase(); - virtual void draw() = 0; + virtual QString name() const = 0; + void setEnabled(bool on) { enabled_ = on; } bool isEnabled() const { return enabled_; } - void setParameter(const QString & name, const QVariant & val) { parameters[name] = val; } - virtual QString name() const = 0; + + virtual void draw() = 0; protected: void resize(int width, int height, bool force = false); @@ -57,9 +59,9 @@ protected: static void deleteShader(QOpenGLShaderProgram *& s); private: - bool is_loaded = false, enabled_ = true; - Renderer * r = nullptr; - QHash parameters; + bool enabled_ = true; + bool is_loaded = false; + Renderer * r = nullptr; GLint wid, hei; }; diff --git a/src/core/core/measurer.cpp b/src/core/core/measurer.cpp index 4e0ca46..8f1c29b 100644 --- a/src/core/core/measurer.cpp +++ b/src/core/core/measurer.cpp @@ -18,6 +18,7 @@ #include "measurer.h" +#include #include @@ -33,6 +34,7 @@ void Measurer::begin(const QString & name) { } void Measurer::end() { + glFinish(); auto ms = et.elapsed_m(); QTextStream ts(out); ts << n << ": " << QString::number(ms, 'f', 2) << " ms\n"; diff --git a/src/core/core/parameteredobject.cpp b/src/core/core/parameteredobject.cpp new file mode 100644 index 0000000..718bbbe --- /dev/null +++ b/src/core/core/parameteredobject.cpp @@ -0,0 +1,29 @@ +/* + QGL Framebuffer effect basic + 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 . +*/ + +#include "parameteredobject.h" + + +PIValueTree ParameteredObject::parameters() const { + return params; +} + + +void ParameteredObject::setParameters(const PIValueTree & p) { + params.applyValues(p); +} diff --git a/src/core/core/parameteredobject.h b/src/core/core/parameteredobject.h new file mode 100644 index 0000000..fa46ad2 --- /dev/null +++ b/src/core/core/parameteredobject.h @@ -0,0 +1,39 @@ +/* + QGL Framebuffer effect basic + 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 parameteredobject_H +#define parameteredobject_H + +#include "qglengine_core_export.h" + +#include +#include + + +class QGLENGINE_CORE_EXPORT ParameteredObject { +public: + virtual ~ParameteredObject() {} + + PIValueTree parameters() const; + void setParameters(const PIValueTree & p); + +protected: + PIValueTree params; +}; + +#endif diff --git a/src/core/render/renderer.h b/src/core/render/renderer.h index 3517cc4..c718911 100644 --- a/src/core/render/renderer.h +++ b/src/core/render/renderer.h @@ -101,6 +101,7 @@ public: QImage getImage() const { return last_img; } void addFramebufferEffect(FramebufferEffectBase * e); void clearFramebufferEffects() { fb_effects.clear(); } + QVector framebufferEffects() const { return fb_effects; } QString getTimings() const { return timings; } QImage materialThumbnail(Material * m) { return rend_mat.materialThumbnail(m); } diff --git a/src/qglview_test/qglview_window.cpp b/src/qglview_test/qglview_window.cpp index 1326b33..2f11df0 100644 --- a/src/qglview_test/qglview_window.cpp +++ b/src/qglview_test/qglview_window.cpp @@ -27,20 +27,34 @@ #include #include #include +#include class Effect1: public FramebufferEffectBase { public: + Effect1() { + params.addChild({ + "radius", + 10, + {{PIValueTree::Attribute::minimum, 1}, {PIValueTree::Attribute::maximum, 4000}} + }); + } + ~Effect1() { deleteShader(mys); } QString name() const { return "Blur"; } void reloadShaders() { QGLEngineShaders::loadShadersMulti(mys, "test1.glsl"); } void draw() { if (!mys) return; if (!mys->isLinked()) return; + + int radius = params["radius"].value().toInt(); + auto planes = getFreePlanes(1); bindPreviousOutput(0); // bindDeferredBuffer(Renderer::dbrNormalZSolid, 1); mys->bind(); mys->setUniformValue("tex_in", 0); + mys->setUniformValue("radius", radius); + mys->setUniformValue("sum_div", (GLfloat)(radius + 1)); mys->setUniformValue("step", QVector2D(1, 0)); drawScreen(mys); @@ -71,8 +85,17 @@ QGLViewWindow::QGLViewWindow(QWidget * parent): QMainWindow(parent), Ui::QGLView view->view()->setHoverHaloEnabled(true); view->view()->setDepthStart(0.1); view->view()->setSelectionMode(Scene::smMultiSelection); - view->view()->renderer_.addFramebufferEffect(new Effect1()); + auto * e = new Effect1(); + view->view()->renderer_.addFramebufferEffect(e); + + PIValueTree params; + auto p = e->parameters(); + p.setName(Q2PIString(e->name())); + params.addChild(p); + // widgetParameters->setFullEditMode(true); + widgetParameters->setGrouping(PIValueTreeEdit::Groups); + widgetParameters->setValue(params); groupShadows->setChecked(view->view()->isFeatureEnabled(QGLView::qglShadowsEnabled)); groupEyeAccomodation->setChecked(view->view()->isFeatureEnabled(QGLView::qglEyeAccomodationEnabled)); @@ -239,6 +262,14 @@ void QGLViewWindow::view_keyEvent(Qt::Key k, Qt::KeyboardModifiers m) { } +void QGLViewWindow::on_buttonParamsApply_clicked() { + auto fbel = view->view()->renderer_.framebufferEffects(); + auto params = widgetParameters->value(); + for (auto * e: fbel) + e->setParameters(params.child(Q2PIString(e->name()))); +} + + void QGLViewWindow::on_actionArrow_triggered(bool on) { actionArrow->setChecked(true); actionMove->setChecked(false); diff --git a/src/qglview_test/qglview_window.h b/src/qglview_test/qglview_window.h index dc31c97..dcd586c 100644 --- a/src/qglview_test/qglview_window.h +++ b/src/qglview_test/qglview_window.h @@ -98,6 +98,7 @@ private slots: void view_keyEvent(Qt::Key k, Qt::KeyboardModifiers m); void on_pushButton_2_clicked() { view->view()->reloadShaders(); } + void on_buttonParamsApply_clicked(); void on_actionArrow_triggered(bool on); void on_actionMove_triggered(bool on); diff --git a/src/qglview_test/qglview_window.ui b/src/qglview_test/qglview_window.ui index 1177b29..e740164 100644 --- a/src/qglview_test/qglview_window.ui +++ b/src/qglview_test/qglview_window.ui @@ -50,7 +50,7 @@ - 0 + 2 @@ -626,6 +626,70 @@ + + + Parameters + + + + + + QFrame::NoFrame + + + true + + + + + 0 + 0 + 787 + 403 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + Qt::Vertical + + + + 20 + 414 + + + + + + + + + + + + apply + + + + + @@ -994,6 +1058,12 @@
textures_editor.h
1 + + PIValueTreeEdit + QWidget +
pivaluetree_edit.h
+ 1 +