diff --git a/qglview/mainwindow.h b/qglview/mainwindow.h
index 689547f..edfda0c 100644
--- a/qglview/mainwindow.h
+++ b/qglview/mainwindow.h
@@ -74,6 +74,8 @@ private slots:
void on_spinCubemapSize_valueChanged(double val) {view->setDynamicReflectionsMapSize(val);}
void on_spinShadowmapSize_valueChanged(double val) {view->setShadowMapSize(val);}
void on_spinHaloFillAlpha_valueChanged(double val) {view->setSelectionHaloFillAlpha(val);}
+ void on_spinMotionBlurFactor_valueChanged(double val) {view->setMotionBlurFactor(val);}
+ void on_spinMotionBlurSteps_valueChanged(int val) {view->setMotionBlurSteps(val);}
//void on_spinSliderShine_valueChanged(double val) {obj->material().shine_strength = val; obj->setMaterial(obj->material(), true);}
//void on_spinSliderRough_valueChanged(double val) {obj->material().shine = val; obj->setMaterial(obj->material(), true);}
void on_pushButton_clicked() {view->removeLight(view->lightsCount() - 1); setWindowTitle(QString::number(view->lightsCount()));}
@@ -92,6 +94,7 @@ private slots:
void on_checkShadows_toggled(bool val) {view->setShadowsEnabled(val);}
void on_checkSoftShadows_toggled(bool val) {view->setSoftShadowsEnabled(val);}
void on_checkCameraOrbit_toggled(bool val) {view->setCameraOrbit(val);}
+ void on_checkMotionBlur_toggled(bool val) {view->setMotionBlurEnabled(val);}
void on_colorAmbient_colorChanged(QColor color) {view->setAmbientColor(color);}
void on_colorHalo_colorChanged(QColor color) {view->setSelectionHaloColor(color);}
void on_view_glKeyPressEvent(QKeyEvent * e);
diff --git a/qglview/mainwindow.ui b/qglview/mainwindow.ui
index 857fa44..65dec03 100644
--- a/qglview/mainwindow.ui
+++ b/qglview/mainwindow.ui
@@ -7,7 +7,7 @@
0
0
1246
- 856
+ 851
@@ -53,143 +53,217 @@
-
-
-
- FOV
+
+
+ QFormLayout::AllNonFixedFieldsGrow
-
-
- -
-
-
- 0.100000000000000
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
- 179.900000000000006
-
-
- 60.000000000000000
-
-
-
- -
-
-
- accomodation time
-
-
-
- -
-
-
- 0.000000000000000
-
-
- 256.000000000000000
-
-
- 32.000000000000000
-
-
- true
-
-
-
- -
-
-
- accomodation max speed
-
-
-
- -
-
-
- 0.010000000000000
-
-
- 1.000000000000000
-
-
- 0.100000000000000
-
-
- 3
-
-
- 0.100000000000000
-
-
- 1.000000000000000
-
-
- true
-
-
-
- -
-
-
- dynamic cubemap size
-
-
-
- -
-
-
- 16.000000000000000
-
-
- 2048.000000000000000
-
-
- 512.000000000000000
-
-
- 0
-
-
- 16.000000000000000
-
-
- 512.000000000000000
-
-
- false
-
-
-
- -
-
-
- shadowmap size
-
-
-
- -
-
-
- 16.000000000000000
-
-
- 2048.000000000000000
-
-
- 512.000000000000000
-
-
- 0
-
-
- 16.000000000000000
-
-
- 512.000000000000000
-
-
- true
-
-
+
-
+
+
+ FOV
+
+
+
+ -
+
+
+ 0.100000000000000
+
+
+ 179.900000000000006
+
+
+ 60.000000000000000
+
+
+
+ -
+
+
+ accomodation time
+
+
+
+ -
+
+
+ accomodation max speed
+
+
+
+ -
+
+
+ dynamic cubemap size
+
+
+
+ -
+
+
+ shadowmap size
+
+
+
+ -
+
+
+ motion blur factor
+
+
+
+ -
+
+
+ motion blur steps
+
+
+
+ -
+
+
+ 0.000000000000000
+
+
+ 256.000000000000000
+
+
+ 32.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+ 0.010000000000000
+
+
+ 1.000000000000000
+
+
+ 0.100000000000000
+
+
+ 3
+
+
+ 0.100000000000000
+
+
+ 1.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+ 16.000000000000000
+
+
+ 2048.000000000000000
+
+
+ 512.000000000000000
+
+
+ 0
+
+
+ 16.000000000000000
+
+
+ 512.000000000000000
+
+
+ false
+
+
+
+ -
+
+
+ 16.000000000000000
+
+
+ 2048.000000000000000
+
+
+ 512.000000000000000
+
+
+ 0
+
+
+ 16.000000000000000
+
+
+ 512.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+ 0.000000000000000
+
+
+ 10000.000000000000000
+
+
+ 1.000000000000000
+
+
+ 1
+
+
+ 0.100000000000000
+
+
+ 1.000000000000000
+
+
+ false
+
+
+
+ -
+
+
+ 1.000000000000000
+
+
+ 128.000000000000000
+
+
+ 8.000000000000000
+
+
+ 0
+
+
+ 1.000000000000000
+
+
+ 4.000000000000000
+
+
+ false
+
+
+
+
-
@@ -363,6 +437,13 @@
+ -
+
+
+ motion blur
+
+
+
-
@@ -502,6 +583,7 @@
0
+ tabWidget
@@ -561,12 +643,12 @@
setEnabled(bool)
- 92
- 580
+ 112
+ 611
- 91
- 605
+ 111
+ 632
@@ -577,12 +659,12 @@
setEnabled(bool)
- 147
- 580
+ 167
+ 611
- 143
- 630
+ 163
+ 653
@@ -593,12 +675,12 @@
setEnabled(bool)
- 106
- 705
+ 126
+ 737
- 108
- 730
+ 128
+ 758
diff --git a/qglview/qglview.cpp b/qglview/qglview.cpp
index 6a9d57a..94c7c1e 100644
--- a/qglview/qglview.cpp
+++ b/qglview/qglview.cpp
@@ -57,8 +57,11 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) {
cur_luminance = 1.;
accom_time = 16.;
accom_max_speed = 0.2;
+ m_motionBlurFactor = 1.;
+ m_motionBlurSteps = 8;
mouse_first = mouseSelect_ = accomodation_ = hoverHalo_ = selectionHalo_ = true;
- fogEnabled_ = is_init = grabMouse_ = mouseRotate_ = mouseThis_ = shaders_bind = shadows_ = shadows_soft = dynamic_reflections = hdr_ = bloom_ = msaa_ = fxaa_ = changed_ = false;
+ fogEnabled_ = is_init = grabMouse_ = mouseRotate_ = mouseThis_ = shaders_bind = m_motionBlurEnabled =
+ shadows_ = shadows_soft = dynamic_reflections = hdr_ = bloom_ = msaa_ = fxaa_ = changed_ = false;
rmode = GLObjectBase::Fill;
sel_mode = QGLView::SingleSelection;
sel_pen = QPen(Qt::black, 1, Qt::DashLine);
diff --git a/qglview/qglview.h b/qglview/qglview.h
index 1bfc562..48b4f04 100644
--- a/qglview/qglview.h
+++ b/qglview/qglview.h
@@ -80,6 +80,9 @@ class QGLView: public QGraphicsView, public QGLViewBase
Q_PROPERTY (bool accomodationEnabled READ isAccomodationEnabled WRITE setAccomodationEnabled)
Q_PROPERTY (double accomodationTime READ accomodationTime WRITE setAccomodationTime)
Q_PROPERTY (double accomodationMaxSpeed READ accomodationMaxSpeed WRITE setAccomodationMaxSpeed)
+ Q_PROPERTY (bool motionBlurEnabled READ isMotionBlurEnabled WRITE setMotionBlurEnabled)
+ Q_PROPERTY (double motionBlurFactor READ motionBlurFactor WRITE setMotionBlurFactor)
+ Q_PROPERTY (int motionBlurSteps READ motionBlurSteps WRITE setMotionBlurSteps)
Q_PROPERTY (Qt::MouseButton selectionButton READ selectionButton WRITE setSelectionButton)
Q_PROPERTY (Qt::KeyboardModifier selectionModifier READ selectionModifier WRITE setSelectionModifier)
Q_PROPERTY (SelectionMode selectionMode READ selectionMode WRITE setSelectionMode)
@@ -138,6 +141,7 @@ public:
bool isSelectionHaloEnabled() const {return selectionHalo_;}
QColor selectionHaloColor() const {return selectionHaloColor_;}
double selectionHaloFillAlpha() const {return selectionHaloFill_;}
+ bool isMotionBlurEnabled() const {return m_motionBlurEnabled;}
bool isShadowsEnabled() const {return shadows_;}
bool isSoftShadowsEnabled() const {return shadows_soft;}
bool isDynamicReflectionsEnabled() const {return dynamic_reflections;}
@@ -152,6 +156,8 @@ public:
double accomodationTime() const {return accom_time;}
double accomodationMaxSpeed() const {return accom_max_speed;}
+ double motionBlurFactor() const {return m_motionBlurFactor;}
+ int motionBlurSteps() const {return m_motionBlurSteps;}
void addObject(QGraphicsItem * o) {scene()->addItem(o);}
void addObject(QWidget * o, Qt::WindowFlags f = Qt::Widget);
@@ -256,11 +262,12 @@ private:
Qt::KeyboardModifier sel_mod;
GLRendererBase::RenderingParameters start_rp;
double lineWidth_, linearFiltering_, accom_time, accom_max_speed, cur_luminance;
- double fogDensity_, fogStart_, fogEnd_, fps_, fps_tm, hoverHaloFill_, selectionHaloFill_;
- int timer, fps_cnt, sh_id_loc, shadow_map_size, dynamic_cubemap_size;
+ double fogDensity_, fogStart_, fogEnd_, fps_, fps_tm, hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor;
+ int timer, fps_cnt, sh_id_loc, shadow_map_size, dynamic_cubemap_size, motion_blur_steps, m_motionBlurSteps;
bool is_init, fogEnabled_, lightEnabled_, grabMouse_, mouse_first, mouseRotate_, mouseSelect_, customMouseMove_;
+ bool shaders_supported, changed_, cameraOrbit_;
bool hoverHalo_, selectionHalo_, mouseThis_, shaders_bind, shadows_, shadows_soft, selecting_;
- bool shaders_supported, dynamic_reflections, hdr_, bloom_, msaa_, fxaa_, accomodation_, changed_, cameraOrbit_;
+ bool dynamic_reflections, hdr_, bloom_, msaa_, fxaa_, accomodation_, m_motionBlurEnabled;
public slots:
void setBackColor(const QColor & arg) {backColor_ = arg;}
@@ -302,6 +309,9 @@ public slots:
void setMultisamplingEnabled(const bool & arg) {msaa_ = arg;}
void setFXAAEnabled(const bool & arg) {fxaa_ = arg;}
void setAccomodationEnabled(const bool & arg) {accomodation_ = arg;}
+ void setMotionBlurEnabled(bool motionBlurEnabled) {m_motionBlurEnabled = motionBlurEnabled;}
+ void setMotionBlurFactor(double motionBlurFactor) {m_motionBlurFactor = motionBlurFactor;}
+ void setMotionBlurSteps(int motionBlurSteps) {m_motionBlurSteps = motionBlurSteps;}
void reloadShaders() {if (renderer_ != 0) renderer_->reloadShaders(); reloadThisShaders();}
void deselect() {sel_obj = 0;}
diff --git a/qglview/renderer_deferred_shading.cpp b/qglview/renderer_deferred_shading.cpp
index fa3ce31..7ad8af8 100644
--- a/qglview/renderer_deferred_shading.cpp
+++ b/qglview/renderer_deferred_shading.cpp
@@ -195,18 +195,22 @@ void RendererDeferredShading::renderScene() {
piSwap(wi, ri);
}
- fbo_out.setWriteBuffer(wi);
- glActiveTextureChannel(1);
- glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(4));
- shader_motion_blur->bind();
- shader_motion_blur->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
- shader_motion_blur->setUniformValue("dt", QVector2D(1. / fbo_out.width(), 1. / fbo_out.height()));
- shader_motion_blur->setUniformValue("t0", 0);
- shader_motion_blur->setUniformValue("ts", 1);
- glDrawQuad(shader_motion_blur);
- glActiveTextureChannel(0);
- glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(wi));
- piSwap(wi, ri);
+ if (view.isMotionBlurEnabled()) {
+ fbo_out.setWriteBuffer(wi);
+ glActiveTextureChannel(1);
+ glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(4));
+ shader_motion_blur->bind();
+ shader_motion_blur->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
+ shader_motion_blur->setUniformValue("dt", QVector2D(1. / fbo_out.width(), 1. / fbo_out.height()));
+ shader_motion_blur->setUniformValue("t0", 0);
+ shader_motion_blur->setUniformValue("ts", 1);
+ shader_motion_blur->setUniformValue("factor", GLfloat(view.motionBlurFactor()));
+ shader_motion_blur->setUniformValue("steps", view.motionBlurSteps());
+ glDrawQuad(shader_motion_blur);
+ glActiveTextureChannel(0);
+ glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(wi));
+ piSwap(wi, ri);
+ }
glReleaseShaders();
fbo_out.release();
diff --git a/qglview/shaders/motion_blur.frag b/qglview/shaders/motion_blur.frag
index 1f830fc..23e4761 100644
--- a/qglview/shaders/motion_blur.frag
+++ b/qglview/shaders/motion_blur.frag
@@ -2,13 +2,13 @@
uniform sampler2D t0, ts;
uniform vec2 dt;
-uniform float factor;
-uniform int steps = 16;
+uniform float factor = 1.;
+uniform int steps = 8;
void main(void) {
vec2 cdt = dt / steps;
vec2 ct = qgl_FragTexture.xy;
- vec3 speed = texture(ts, ct).rgb*1024;
+ vec3 speed = texture(ts, ct).rgb * 256 * factor;
int hsteps = steps / 2;
ct -= speed.xy * cdt * hsteps;
vec3 scol = vec3(0);//texture(t0, ct).rgb;