git-svn-id: svn://db.shs.com.ru/libs@666 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-12-10 11:48:25 +00:00
parent 9d05dbe6da
commit 94c6536477
11 changed files with 71 additions and 56 deletions

View File

@@ -217,14 +217,10 @@ void Framebuffer::blit(int index_from, GLuint fb_to, int index_to, QRect from, Q
void Framebuffer::bind() { void Framebuffer::bind() {
if (is_changed) resize(wid, hei); if (is_changed) resize(wid, hei);
if (fbo == 0) return; if (fbo == 0) return;
//glFlush();
f->glGetIntegerv(GL_VIEWPORT, prev_view); f->glGetIntegerv(GL_VIEWPORT, prev_view);
//glClearError();
f->glBindFramebuffer(GL_FRAMEBUFFER, fbo); f->glBindFramebuffer(GL_FRAMEBUFFER, fbo);
//qDebug() << QString::number(glGetError(), 16);
setWriteBuffers(); setWriteBuffers();
f->glReadBuffer(GL_COLOR_ATTACHMENT0); f->glReadBuffer(GL_COLOR_ATTACHMENT0);
//f->glDrawBuffer(GL_COLOR_ATTACHMENT0);
f->glViewport(0, 0, wid, hei); f->glViewport(0, 0, wid, hei);
} }
@@ -232,7 +228,6 @@ void Framebuffer::bind() {
void Framebuffer::release() { void Framebuffer::release() {
is_changed = false; is_changed = false;
if (fbo == 0) return; if (fbo == 0) return;
//glFlush();
f->glBindFramebuffer(GL_FRAMEBUFFER, 0); f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
f->glViewport(prev_view[0], prev_view[1], prev_view[2], prev_view[3]); f->glViewport(prev_view[0], prev_view[1], prev_view[2], prev_view[3]);
} }
@@ -245,7 +240,7 @@ void Framebuffer::setWriteBuffer(int index) {
} }
void Framebuffer::setWriteBuffers(int * indeces, int count) { void Framebuffer::setWriteBuffers(const int * indeces, int count) {
unsetWriteBuffers(); unsetWriteBuffers();
QVector<GLenum> buffers; QVector<GLenum> buffers;
for (int i = 0; i < count; ++i) for (int i = 0; i < count; ++i)

View File

@@ -57,7 +57,8 @@ public:
void release(); void release();
void setReadBuffer(int index) {glReadBuffer(GL_COLOR_ATTACHMENT0 + index);} void setReadBuffer(int index) {glReadBuffer(GL_COLOR_ATTACHMENT0 + index);}
void setWriteBuffer(int index); void setWriteBuffer(int index);
void setWriteBuffers(int * indeces, int count); void setWriteBuffers(const int * indeces, int count);
void setWriteBuffers(const QVector<int> & indeces) {setWriteBuffers(indeces.constData(), indeces.size());}
void setWriteBuffers(); void setWriteBuffers();
void unsetWriteBuffers(); void unsetWriteBuffers();
//void setColorFormat(GLenum format) {color_format = format; is_changed = true;} //void setColorFormat(GLenum format) {color_format = format; is_changed = true;}

View File

@@ -29,7 +29,7 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
content.clear(); content.clear();
return true; return true;
} }
//qDebug() << "[QGLView] Shader" << file << "found" << (QOpenGLShader::ShaderTypeBit)(int)type << "section ..."; //qDebug() << "[QGLEngine] Shader" << file << "found" << (QOpenGLShader::ShaderTypeBit)(int)type << "section ...";
if (add_qgl) { if (add_qgl) {
switch (type) { switch (type) {
case QOpenGLShader::Fragment: case QOpenGLShader::Fragment:
@@ -48,7 +48,7 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
content.prepend(defs); content.prepend(defs);
content.prepend(qgl_common_head); content.prepend(qgl_common_head);
bool ret = prog->addShaderFromSourceCode(type, content.toLatin1()); bool ret = prog->addShaderFromSourceCode(type, content.toLatin1());
if (!ret) qDebug() << "[QGLView] Shader" << file << "Compile error:\n" << prog->log(); if (!ret) qDebug() << "[QGLEngine] Shader" << file << "Compile error:\n" << prog->log();
content.clear(); content.clear();
return ret; return ret;
} }
@@ -69,7 +69,7 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr
prog->removeAllShaders(); prog->removeAllShaders();
QFile f(file); QFile f(file);
if (!f.open(QIODevice::ReadOnly)) { if (!f.open(QIODevice::ReadOnly)) {
qDebug() << "[QGLView] Shader" << file << "Error: can`t open file!"; qDebug() << "[QGLEngine] Shader" << file << "Error: can`t open file!";
return false; return false;
} }
QTextStream ts(&f); QTextStream ts(&f);
@@ -109,10 +109,10 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr
} }
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false; if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
if (!prog->link()) { if (!prog->link()) {
qDebug() << "[QGLView] Shader" << file << "Link error:\n" << prog->log(); qDebug() << "[QGLEngine] Shader" << file << "Link error:\n" << prog->log();
return false; return false;
} }
qDebug() << "[QGLView] Shader" << file << "ok"; qDebug() << "[QGLEngine] Shader" << file << "ok";
return true; return true;
} }
@@ -131,16 +131,16 @@ bool QGLEngineShaders::loadShaders(QOpenGLShaderProgram *& prog, const QStringLi
if (type == 0) continue; if (type == 0) continue;
QFile file(f); QFile file(f);
if (!file.open(QIODevice::ReadOnly)) { if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "[QGLView] Shader" << f << "Error: can`t open file!"; qDebug() << "[QGLEngine] Shader" << f << "Error: can`t open file!";
return false; return false;
} }
cur_shader = file.readAll(); cur_shader = file.readAll();
if (!addShader(prog, type, cur_shader, f, add_qgl, defs)) return false; if (!addShader(prog, type, cur_shader, f, add_qgl, defs)) return false;
} }
if (!prog->link()) { if (!prog->link()) {
qDebug() << "[QGLView] Shader" << files << "Link error:\n" << prog->log(); qDebug() << "[QGLEngine] Shader" << files << "Link error:\n" << prog->log();
return false; return false;
} }
qDebug() << "[QGLView] Shader" << files << "ok"; qDebug() << "[QGLEngine] Shader" << files << "ok";
return true; return true;
} }

View File

@@ -49,7 +49,8 @@ class QGLView: public OpenGLWindow
Q_PROPERTY (float lineWidth READ lineWidth WRITE setLineWidth) Q_PROPERTY (float lineWidth READ lineWidth WRITE setLineWidth)
Q_PROPERTY (float FOV READ FOV WRITE setFOV) Q_PROPERTY (float FOV READ FOV WRITE setFOV)
Q_PROPERTY (float depthStart READ depthStart WRITE setDepthStart) Q_PROPERTY (float depthStart READ depthStart WRITE setDepthStart)
Q_PROPERTY (float exposure READ exposure WRITE setExposure) Q_PROPERTY (float gamma READ gamma WRITE setGamma)
Q_PROPERTY (bool autoExposure READ autoExposure WRITE setAutoExposure)
Q_PROPERTY (QColor ambientColor READ ambientColor WRITE setAmbientColor) Q_PROPERTY (QColor ambientColor READ ambientColor WRITE setAmbientColor)
Q_PROPERTY (QColor fogColor READ fogColor WRITE setFogColor) Q_PROPERTY (QColor fogColor READ fogColor WRITE setFogColor)
Q_PROPERTY (bool fogEnabled READ isFogEnabled WRITE setFogEnabled) Q_PROPERTY (bool fogEnabled READ isFogEnabled WRITE setFogEnabled)
@@ -111,7 +112,8 @@ public:
float FOV() const {return camera()->fov_;} float FOV() const {return camera()->fov_;}
float depthStart() const {return camera()->depth_start;} float depthStart() const {return camera()->depth_start;}
float currentFPS() const {return fps_;} float currentFPS() const {return fps_;}
float exposure() const {return renderer_.exposure_;} float gamma() const {return renderer_.gamma_;}
bool autoExposure() const {return renderer_.tone_proc.enabled;}
int maxAnisotropicLevel() const {return max_anisotropic;} int maxAnisotropicLevel() const {return max_anisotropic;}
QColor ambientColor() const {return ambientColor_;} QColor ambientColor() const {return ambientColor_;}
@@ -231,7 +233,8 @@ public slots:
void setLineWidth(const float & arg) {lineWidth_ = arg;} void setLineWidth(const float & arg) {lineWidth_ = arg;}
void setFOV(const float & arg) {camera()->fov_ = arg;} void setFOV(const float & arg) {camera()->fov_ = arg;}
void setDepthStart(const float & arg) {camera()->depth_start = arg;} void setDepthStart(const float & arg) {camera()->depth_start = arg;}
void setExposure(const float & arg) {renderer_.exposure_ = arg;} void setGamma(const float & arg) {renderer_.gamma_ = arg;}
void setAutoExposure(bool arg) {renderer_.tone_proc.enabled = arg;}
void setAmbientColor(const QColor & arg) {ambientColor_ = arg;} void setAmbientColor(const QColor & arg) {ambientColor_ = arg;}
void setFogColor(const QColor & arg) {fogColor_ = arg;} void setFogColor(const QColor & arg) {fogColor_ = arg;}
void setFogDensity(const float & arg) {fogDensity_ = arg;} void setFogDensity(const float & arg) {fogDensity_ = arg;}

View File

@@ -63,7 +63,7 @@ private:
private slots: private slots:
void on_spinFOV_valueChanged(double val) {view->view()->setFOV(val);} void on_spinFOV_valueChanged(double val) {view->view()->setFOV(val);}
void on_spinDepthStart_valueChanged(double val) {view->view()->setDepthStart(val);} void on_spinDepthStart_valueChanged(double val) {view->view()->setDepthStart(val);}
void on_spinViewExposure_valueChanged(double val) {view->view()->setExposure(val);} void on_spinViewGamma_valueChanged(double val) {view->view()->setGamma(val);}
void on_comboViewRenderMode_currentIndexChanged(int val) {static int modes[] = {GL_POINT, GL_LINE, GL_FILL}; view->view()->setRenderMode((ObjectBase::RenderMode)modes[val]);} void on_comboViewRenderMode_currentIndexChanged(int val) {static int modes[] = {GL_POINT, GL_LINE, GL_FILL}; view->view()->setRenderMode((ObjectBase::RenderMode)modes[val]);}
void on_groupHoverHalo_clicked(bool val) {view->view()->setHoverHaloEnabled(val);} void on_groupHoverHalo_clicked(bool val) {view->view()->setHoverHaloEnabled(val);}
void on_groupSelectionHalo_clicked(bool val) {view->view()->setSelectionHaloEnabled(val);} void on_groupSelectionHalo_clicked(bool val) {view->view()->setSelectionHaloEnabled(val);}
@@ -71,6 +71,7 @@ private slots:
void on_spinSelectionHaloFill_valueChanged(double val) {view->view()->setSelectionHaloFillAlpha(val);} void on_spinSelectionHaloFill_valueChanged(double val) {view->view()->setSelectionHaloFillAlpha(val);}
void on_colorHoverHalo_colorChanged(QColor color) {view->view()->setHoverHaloColor(color);} void on_colorHoverHalo_colorChanged(QColor color) {view->view()->setHoverHaloColor(color);}
void on_colorSelectionHalo_colorChanged(QColor color) {view->view()->setSelectionHaloColor(color);} void on_colorSelectionHalo_colorChanged(QColor color) {view->view()->setSelectionHaloColor(color);}
void on_checkAutoExposure_toggled(bool val) {view->view()->setAutoExposure(val);}
void on_checkFXAA_clicked(bool val) {view->view()->setFeature(QGLView::qglFXAA, val);} void on_checkFXAA_clicked(bool val) {view->view()->setFeature(QGLView::qglFXAA, val);}
void on_colorBack_colorChanged(QColor color) {view->view()->setBackColor(color);} void on_colorBack_colorChanged(QColor color) {view->view()->setBackColor(color);}
void on_colorAmbient_colorChanged(QColor color) {view->view()->setAmbientColor(color);} void on_colorAmbient_colorChanged(QColor color) {view->view()->setAmbientColor(color);}

View File

@@ -107,6 +107,22 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="spinDepthStart">
<property name="decimals">
<number>3</number>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
<property name="stepType">
<enum>QAbstractSpinBox::AdaptiveDecimalStepType</enum>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
@@ -175,37 +191,34 @@
<item row="5" column="0"> <item row="5" column="0">
<widget class="QLabel" name="label_22"> <widget class="QLabel" name="label_22">
<property name="text"> <property name="text">
<string>Exposure</string> <string>Gamma</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1"> <item row="5" column="1">
<widget class="SpinSlider" name="spinViewExposure"> <widget class="SpinSlider" name="spinViewGamma">
<property name="minimum"> <property name="minimum">
<double>0.010000000000000</double> <double>0.010000000000000</double>
</property> </property>
<property name="maximum"> <property name="maximum">
<double>99.000000000000000</double> <double>5.000000000000000</double>
</property> </property>
<property name="value"> <property name="value">
<double>1.000000000000000</double> <double>1.000000000000000</double>
</property> </property>
<property name="decimals"> <property name="decimals">
<number>3</number> <number>2</number>
</property>
<property name="squareScale">
<bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0" colspan="2"> <item row="7" column="0" colspan="2">
<widget class="QCheckBox" name="checkFXAA"> <widget class="QCheckBox" name="checkFXAA">
<property name="text"> <property name="text">
<string>FXAA</string> <string>FXAA</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="0" colspan="2"> <item row="8" column="0" colspan="2">
<widget class="QGroupBox" name="groupHoverHalo"> <widget class="QGroupBox" name="groupHoverHalo">
<property name="title"> <property name="title">
<string>Hover halo</string> <string>Hover halo</string>
@@ -260,7 +273,7 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="8" column="0" colspan="2"> <item row="9" column="0" colspan="2">
<widget class="QGroupBox" name="groupSelectionHalo"> <widget class="QGroupBox" name="groupSelectionHalo">
<property name="title"> <property name="title">
<string>Selection halo</string> <string>Selection halo</string>
@@ -315,7 +328,7 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="9" column="0" colspan="2"> <item row="10" column="0" colspan="2">
<widget class="QGroupBox" name="groupCamera"> <widget class="QGroupBox" name="groupCamera">
<property name="title"> <property name="title">
<string>Camera</string> <string>Camera</string>
@@ -344,16 +357,13 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="6" column="0" colspan="2">
<widget class="QDoubleSpinBox" name="spinDepthStart"> <widget class="QCheckBox" name="checkAutoExposure">
<property name="decimals"> <property name="text">
<number>3</number> <string>Auto exposure</string>
</property> </property>
<property name="maximum"> <property name="checked">
<double>999999999.000000000000000</double> <bool>true</bool>
</property>
<property name="value">
<double>1.000000000000000</double>
</property> </property>
</widget> </widget>
</item> </item>
@@ -377,7 +387,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>960</width> <width>951</width>
<height>737</height> <height>737</height>
</rect> </rect>
</property> </property>
@@ -1016,7 +1026,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>999</width> <width>990</width>
<height>853</height> <height>853</height>
</rect> </rect>
</property> </property>

View File

@@ -68,7 +68,7 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_),
<< ShaderPair("ssao_merge", &shader_ssao_merge) << ShaderPair("ssao_merge", &shader_ssao_merge)
<< ShaderPair("dof", &shader_dof);*/ << ShaderPair("dof", &shader_dof);*/
shader_fxaa = 0; shader_fxaa = 0;
exposure_ = 1.; gamma_ = 1.;
edit_mode = need_init_shaders = is_camera_light = true; edit_mode = need_init_shaders = is_camera_light = true;
} }
@@ -160,6 +160,9 @@ void Renderer::initShaders() {
for (int i = 0; i < 5; ++i) for (int i = 0; i < 5; ++i)
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i); prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
} }
if (bindShader(srGeometryPass, &prog)) {
setUniformMaps(prog);
}
if (bindShader(srTonemapPass, &prog)) { if (bindShader(srTonemapPass, &prog)) {
prog->setUniformValue("tex_0", 0); prog->setUniformValue("tex_0", 0);
prog->setUniformValue("tex_sum", 1); prog->setUniformValue("tex_sum", 1);
@@ -266,17 +269,16 @@ void Renderer::renderScene() {
glEnableDepth(); glEnableDepth();
glClearFramebuffer(); glClearFramebuffer();
if (bindShader(srGeometryPass, &prog)) { if (bindShader(srGeometryPass, &prog)) {
setUniformMaps(prog);
setUniformCamera(prog, cam); setUniformCamera(prog, cam);
textures_empty.bind(f, tarEmpty); textures_empty.bind(f, tarEmpty);
textures_maps .bind(f, tarMaps ); textures_maps .bind(f, tarMaps );
renderObjects(scene, rpSolid); renderObjects(scene, rpSolid);
renderObjects(scene, rpTransparent);
} }
fbo_ds.release(); fbo_ds.release();
/// lighting passes /// lighting passes
fbo_ds.bindColorTextures(); fbo_ds.bindColorTextures();
fbo_ds.bindDepthTexture(5);
fbo_out.bind(); fbo_out.bind();
//int ri = 1, wi = 0; //int ri = 1, wi = 0;
typedef QPair<Renderer::ShaderRole, Light::Type> PassPair; typedef QPair<Renderer::ShaderRole, Light::Type> PassPair;
@@ -293,6 +295,8 @@ void Renderer::renderScene() {
renderQuad(prog, quad, cam); renderQuad(prog, quad, cam);
} }
} }
/// blending layers
if (bindShader(srFinalPass, &prog)) { if (bindShader(srFinalPass, &prog)) {
fbo_out.bindColorTexture(obrSolidOmni, 0); fbo_out.bindColorTexture(obrSolidOmni, 0);
fbo_out.bindColorTexture(obrSolidSpot, 1); fbo_out.bindColorTexture(obrSolidSpot, 1);
@@ -302,7 +306,7 @@ void Renderer::renderScene() {
if (tone_proc.process()) if (tone_proc.process())
fbo_out.bind(); fbo_out.bind();
if (bindShader(srTonemapPass, &prog)) { if (bindShader(srTonemapPass, &prog)) {
prog->setUniformValue("exposure", exposure_); prog->setUniformValue("gamma", gamma_);
prog->setUniformValue("frame_max", tone_proc.frameMax()); prog->setUniformValue("frame_max", tone_proc.frameMax());
//fbo_1x1.bindColorTexture(0, 1); //fbo_1x1.bindColorTexture(0, 1);
fbo_out.bindColorTexture(obrSum, 0); fbo_out.bindColorTexture(obrSum, 0);

View File

@@ -92,7 +92,7 @@ protected:
void releaseShader(); void releaseShader();
private: private:
float exposure_; float gamma_;
bool edit_mode, need_init_shaders, is_camera_light, need_render_sum; bool edit_mode, need_init_shaders, is_camera_light, need_render_sum;
Framebuffer fbo_ds, fbo_out; Framebuffer fbo_ds, fbo_out;
/*QOpenGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small; /*QOpenGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small;

View File

@@ -142,8 +142,7 @@ void RendererSelection::renderSelection(Scene & scene) {
//qDebug() << id_hover; //qDebug() << id_hover;
fbo_selection.bindColorTexture(sbrSrcHover , sbrSrcHover ); fbo_selection.bindColorTexture(sbrSrcHover , sbrSrcHover );
fbo_selection.bindColorTexture(sbrSrcSelect, sbrSrcSelect); fbo_selection.bindColorTexture(sbrSrcSelect, sbrSrcSelect);
int wind[2] = {sbrHovered, sbrSelected}; fbo_selection.setWriteBuffers(QVector<int>() << sbrHovered << sbrSelected);
fbo_selection.setWriteBuffers(wind, 2);
if (!view->hoverHalo_ && !view->selectionHalo_) if (!view->hoverHalo_ && !view->selectionHalo_)
glClearFramebuffer(QColor(0,0,0,0), false); glClearFramebuffer(QColor(0,0,0,0), false);
else { else {

View File

@@ -33,6 +33,7 @@ TonemappingProc::TonemappingProc(Renderer * rend): QThread(), r(rend),
timer_delim = 0; timer_delim = 0;
frame_max = cur_max = 1.; frame_max = cur_max = 1.;
need_render_sum = exit_ = false; need_render_sum = exit_ = false;
enabled = true;
timer_tone = startTimer(10); timer_tone = startTimer(10);
} }
@@ -80,7 +81,7 @@ void TonemappingProc::resize() {
void TonemappingProc::timerEvent(QTimerEvent * e) { void TonemappingProc::timerEvent(QTimerEvent * e) {
if (!fbo_1x1.isInit()) return; if (!fbo_1x1.isInit() || !enabled) return;
if (timer_delim == 0) if (timer_delim == 0)
need_render_sum = true; need_render_sum = true;
timer_delim = (timer_delim + 1) % 10; timer_delim = (timer_delim + 1) % 10;
@@ -122,6 +123,10 @@ void TonemappingProc::renderSum(Framebuffer & fbo_src, int index) {
void TonemappingProc::run() { void TonemappingProc::run() {
while (!exit_) { while (!exit_) {
if (!enabled) {
msleep(100);
continue;
}
mutex.lock(); mutex.lock();
if (last_data.isEmpty()) { if (last_data.isEmpty()) {
mutex.unlock(); mutex.unlock();
@@ -159,7 +164,7 @@ float TonemappingProc::calcHistogram(const QVector<QVector4D> & data) {
bool TonemappingProc::process() { bool TonemappingProc::process() {
if (!need_render_sum) return false; if (!need_render_sum || !enabled) return false;
need_render_sum = false; need_render_sum = false;
Framebuffer & fbo(fbomm.lastPlane()); Framebuffer & fbo(fbomm.lastPlane());
if (fbo.queriedPoints() > 0) { if (fbo.queriedPoints() > 0) {
@@ -176,10 +181,6 @@ bool TonemappingProc::process() {
float TonemappingProc::frameMax() { float TonemappingProc::frameMax() {
if (!enabled) return 1.f;
return cur_max; return cur_max;
/*mutex.lock();
float ret = frame_max;
mutex.unlock();
return ret;*/
} }

View File

@@ -26,6 +26,7 @@
class TonemappingProc: public QThread class TonemappingProc: public QThread
{ {
friend class Renderer; friend class Renderer;
friend class QGLView;
public: public:
TonemappingProc(Renderer * rend); TonemappingProc(Renderer * rend);
virtual ~TonemappingProc(); virtual ~TonemappingProc();
@@ -50,7 +51,7 @@ private:
QVector<float> last_max; QVector<float> last_max;
float frame_max, cur_max; float frame_max, cur_max;
bool need_render_sum; bool need_render_sum, enabled;
volatile bool exit_; volatile bool exit_;
int timer_tone, timer_delim; int timer_tone, timer_delim;
Framebuffer fbo_1x1; Framebuffer fbo_1x1;