git-svn-id: svn://db.shs.com.ru/libs@666 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -217,14 +217,10 @@ void Framebuffer::blit(int index_from, GLuint fb_to, int index_to, QRect from, Q
|
||||
void Framebuffer::bind() {
|
||||
if (is_changed) resize(wid, hei);
|
||||
if (fbo == 0) return;
|
||||
//glFlush();
|
||||
f->glGetIntegerv(GL_VIEWPORT, prev_view);
|
||||
//glClearError();
|
||||
f->glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
||||
//qDebug() << QString::number(glGetError(), 16);
|
||||
setWriteBuffers();
|
||||
f->glReadBuffer(GL_COLOR_ATTACHMENT0);
|
||||
//f->glDrawBuffer(GL_COLOR_ATTACHMENT0);
|
||||
f->glViewport(0, 0, wid, hei);
|
||||
}
|
||||
|
||||
@@ -232,7 +228,6 @@ void Framebuffer::bind() {
|
||||
void Framebuffer::release() {
|
||||
is_changed = false;
|
||||
if (fbo == 0) return;
|
||||
//glFlush();
|
||||
f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
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();
|
||||
QVector<GLenum> buffers;
|
||||
for (int i = 0; i < count; ++i)
|
||||
|
||||
@@ -57,7 +57,8 @@ public:
|
||||
void release();
|
||||
void setReadBuffer(int index) {glReadBuffer(GL_COLOR_ATTACHMENT0 + 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 unsetWriteBuffers();
|
||||
//void setColorFormat(GLenum format) {color_format = format; is_changed = true;}
|
||||
|
||||
@@ -29,7 +29,7 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
|
||||
content.clear();
|
||||
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) {
|
||||
switch (type) {
|
||||
case QOpenGLShader::Fragment:
|
||||
@@ -48,7 +48,7 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
|
||||
content.prepend(defs);
|
||||
content.prepend(qgl_common_head);
|
||||
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();
|
||||
return ret;
|
||||
}
|
||||
@@ -69,7 +69,7 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr
|
||||
prog->removeAllShaders();
|
||||
QFile f(file);
|
||||
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;
|
||||
}
|
||||
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 (!prog->link()) {
|
||||
qDebug() << "[QGLView] Shader" << file << "Link error:\n" << prog->log();
|
||||
qDebug() << "[QGLEngine] Shader" << file << "Link error:\n" << prog->log();
|
||||
return false;
|
||||
}
|
||||
qDebug() << "[QGLView] Shader" << file << "ok";
|
||||
qDebug() << "[QGLEngine] Shader" << file << "ok";
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -131,16 +131,16 @@ bool QGLEngineShaders::loadShaders(QOpenGLShaderProgram *& prog, const QStringLi
|
||||
if (type == 0) continue;
|
||||
QFile file(f);
|
||||
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;
|
||||
}
|
||||
cur_shader = file.readAll();
|
||||
if (!addShader(prog, type, cur_shader, f, add_qgl, defs)) return false;
|
||||
}
|
||||
if (!prog->link()) {
|
||||
qDebug() << "[QGLView] Shader" << files << "Link error:\n" << prog->log();
|
||||
qDebug() << "[QGLEngine] Shader" << files << "Link error:\n" << prog->log();
|
||||
return false;
|
||||
}
|
||||
qDebug() << "[QGLView] Shader" << files << "ok";
|
||||
qDebug() << "[QGLEngine] Shader" << files << "ok";
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -49,7 +49,8 @@ class QGLView: public OpenGLWindow
|
||||
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 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 fogColor READ fogColor WRITE setFogColor)
|
||||
Q_PROPERTY (bool fogEnabled READ isFogEnabled WRITE setFogEnabled)
|
||||
@@ -111,7 +112,8 @@ public:
|
||||
float FOV() const {return camera()->fov_;}
|
||||
float depthStart() const {return camera()->depth_start;}
|
||||
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;}
|
||||
|
||||
QColor ambientColor() const {return ambientColor_;}
|
||||
@@ -231,7 +233,8 @@ public slots:
|
||||
void setLineWidth(const float & arg) {lineWidth_ = arg;}
|
||||
void setFOV(const float & arg) {camera()->fov_ = 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 setFogColor(const QColor & arg) {fogColor_ = arg;}
|
||||
void setFogDensity(const float & arg) {fogDensity_ = arg;}
|
||||
|
||||
@@ -63,7 +63,7 @@ private:
|
||||
private slots:
|
||||
void on_spinFOV_valueChanged(double val) {view->view()->setFOV(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_groupHoverHalo_clicked(bool val) {view->view()->setHoverHaloEnabled(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_colorHoverHalo_colorChanged(QColor color) {view->view()->setHoverHaloColor(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_colorBack_colorChanged(QColor color) {view->view()->setBackColor(color);}
|
||||
void on_colorAmbient_colorChanged(QColor color) {view->view()->setAmbientColor(color);}
|
||||
|
||||
@@ -107,6 +107,22 @@
|
||||
</property>
|
||||
</widget>
|
||||
</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">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
@@ -175,37 +191,34 @@
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_22">
|
||||
<property name="text">
|
||||
<string>Exposure</string>
|
||||
<string>Gamma</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="SpinSlider" name="spinViewExposure">
|
||||
<widget class="SpinSlider" name="spinViewGamma">
|
||||
<property name="minimum">
|
||||
<double>0.010000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.000000000000000</double>
|
||||
<double>5.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>1.000000000000000</double>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<property name="squareScale">
|
||||
<bool>true</bool>
|
||||
<number>2</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0" colspan="2">
|
||||
<item row="7" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="checkFXAA">
|
||||
<property name="text">
|
||||
<string>FXAA</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0" colspan="2">
|
||||
<item row="8" column="0" colspan="2">
|
||||
<widget class="QGroupBox" name="groupHoverHalo">
|
||||
<property name="title">
|
||||
<string>Hover halo</string>
|
||||
@@ -260,7 +273,7 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0" colspan="2">
|
||||
<item row="9" column="0" colspan="2">
|
||||
<widget class="QGroupBox" name="groupSelectionHalo">
|
||||
<property name="title">
|
||||
<string>Selection halo</string>
|
||||
@@ -315,7 +328,7 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="0" colspan="2">
|
||||
<item row="10" column="0" colspan="2">
|
||||
<widget class="QGroupBox" name="groupCamera">
|
||||
<property name="title">
|
||||
<string>Camera</string>
|
||||
@@ -344,16 +357,13 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QDoubleSpinBox" name="spinDepthStart">
|
||||
<property name="decimals">
|
||||
<number>3</number>
|
||||
<item row="6" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="checkAutoExposure">
|
||||
<property name="text">
|
||||
<string>Auto exposure</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>1.000000000000000</double>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -377,7 +387,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>960</width>
|
||||
<width>951</width>
|
||||
<height>737</height>
|
||||
</rect>
|
||||
</property>
|
||||
@@ -1016,7 +1026,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>999</width>
|
||||
<width>990</width>
|
||||
<height>853</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
||||
@@ -68,7 +68,7 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_),
|
||||
<< ShaderPair("ssao_merge", &shader_ssao_merge)
|
||||
<< ShaderPair("dof", &shader_dof);*/
|
||||
shader_fxaa = 0;
|
||||
exposure_ = 1.;
|
||||
gamma_ = 1.;
|
||||
edit_mode = need_init_shaders = is_camera_light = true;
|
||||
}
|
||||
|
||||
@@ -160,6 +160,9 @@ void Renderer::initShaders() {
|
||||
for (int i = 0; i < 5; ++i)
|
||||
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
|
||||
}
|
||||
if (bindShader(srGeometryPass, &prog)) {
|
||||
setUniformMaps(prog);
|
||||
}
|
||||
if (bindShader(srTonemapPass, &prog)) {
|
||||
prog->setUniformValue("tex_0", 0);
|
||||
prog->setUniformValue("tex_sum", 1);
|
||||
@@ -266,17 +269,16 @@ void Renderer::renderScene() {
|
||||
glEnableDepth();
|
||||
glClearFramebuffer();
|
||||
if (bindShader(srGeometryPass, &prog)) {
|
||||
setUniformMaps(prog);
|
||||
setUniformCamera(prog, cam);
|
||||
textures_empty.bind(f, tarEmpty);
|
||||
textures_maps .bind(f, tarMaps );
|
||||
renderObjects(scene, rpSolid);
|
||||
renderObjects(scene, rpTransparent);
|
||||
}
|
||||
fbo_ds.release();
|
||||
|
||||
/// lighting passes
|
||||
fbo_ds.bindColorTextures();
|
||||
fbo_ds.bindDepthTexture(5);
|
||||
fbo_out.bind();
|
||||
//int ri = 1, wi = 0;
|
||||
typedef QPair<Renderer::ShaderRole, Light::Type> PassPair;
|
||||
@@ -293,6 +295,8 @@ void Renderer::renderScene() {
|
||||
renderQuad(prog, quad, cam);
|
||||
}
|
||||
}
|
||||
|
||||
/// blending layers
|
||||
if (bindShader(srFinalPass, &prog)) {
|
||||
fbo_out.bindColorTexture(obrSolidOmni, 0);
|
||||
fbo_out.bindColorTexture(obrSolidSpot, 1);
|
||||
@@ -302,7 +306,7 @@ void Renderer::renderScene() {
|
||||
if (tone_proc.process())
|
||||
fbo_out.bind();
|
||||
if (bindShader(srTonemapPass, &prog)) {
|
||||
prog->setUniformValue("exposure", exposure_);
|
||||
prog->setUniformValue("gamma", gamma_);
|
||||
prog->setUniformValue("frame_max", tone_proc.frameMax());
|
||||
//fbo_1x1.bindColorTexture(0, 1);
|
||||
fbo_out.bindColorTexture(obrSum, 0);
|
||||
|
||||
@@ -92,7 +92,7 @@ protected:
|
||||
void releaseShader();
|
||||
|
||||
private:
|
||||
float exposure_;
|
||||
float gamma_;
|
||||
bool edit_mode, need_init_shaders, is_camera_light, need_render_sum;
|
||||
Framebuffer fbo_ds, fbo_out;
|
||||
/*QOpenGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small;
|
||||
|
||||
@@ -142,8 +142,7 @@ void RendererSelection::renderSelection(Scene & scene) {
|
||||
//qDebug() << id_hover;
|
||||
fbo_selection.bindColorTexture(sbrSrcHover , sbrSrcHover );
|
||||
fbo_selection.bindColorTexture(sbrSrcSelect, sbrSrcSelect);
|
||||
int wind[2] = {sbrHovered, sbrSelected};
|
||||
fbo_selection.setWriteBuffers(wind, 2);
|
||||
fbo_selection.setWriteBuffers(QVector<int>() << sbrHovered << sbrSelected);
|
||||
if (!view->hoverHalo_ && !view->selectionHalo_)
|
||||
glClearFramebuffer(QColor(0,0,0,0), false);
|
||||
else {
|
||||
|
||||
@@ -33,6 +33,7 @@ TonemappingProc::TonemappingProc(Renderer * rend): QThread(), r(rend),
|
||||
timer_delim = 0;
|
||||
frame_max = cur_max = 1.;
|
||||
need_render_sum = exit_ = false;
|
||||
enabled = true;
|
||||
timer_tone = startTimer(10);
|
||||
}
|
||||
|
||||
@@ -80,7 +81,7 @@ void TonemappingProc::resize() {
|
||||
|
||||
|
||||
void TonemappingProc::timerEvent(QTimerEvent * e) {
|
||||
if (!fbo_1x1.isInit()) return;
|
||||
if (!fbo_1x1.isInit() || !enabled) return;
|
||||
if (timer_delim == 0)
|
||||
need_render_sum = true;
|
||||
timer_delim = (timer_delim + 1) % 10;
|
||||
@@ -122,6 +123,10 @@ void TonemappingProc::renderSum(Framebuffer & fbo_src, int index) {
|
||||
|
||||
void TonemappingProc::run() {
|
||||
while (!exit_) {
|
||||
if (!enabled) {
|
||||
msleep(100);
|
||||
continue;
|
||||
}
|
||||
mutex.lock();
|
||||
if (last_data.isEmpty()) {
|
||||
mutex.unlock();
|
||||
@@ -159,7 +164,7 @@ float TonemappingProc::calcHistogram(const QVector<QVector4D> & data) {
|
||||
|
||||
|
||||
bool TonemappingProc::process() {
|
||||
if (!need_render_sum) return false;
|
||||
if (!need_render_sum || !enabled) return false;
|
||||
need_render_sum = false;
|
||||
Framebuffer & fbo(fbomm.lastPlane());
|
||||
if (fbo.queriedPoints() > 0) {
|
||||
@@ -176,10 +181,6 @@ bool TonemappingProc::process() {
|
||||
|
||||
|
||||
float TonemappingProc::frameMax() {
|
||||
if (!enabled) return 1.f;
|
||||
return cur_max;
|
||||
/*mutex.lock();
|
||||
float ret = frame_max;
|
||||
mutex.unlock();
|
||||
return ret;*/
|
||||
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
class TonemappingProc: public QThread
|
||||
{
|
||||
friend class Renderer;
|
||||
friend class QGLView;
|
||||
public:
|
||||
TonemappingProc(Renderer * rend);
|
||||
virtual ~TonemappingProc();
|
||||
@@ -50,7 +51,7 @@ private:
|
||||
QVector<float> last_max;
|
||||
|
||||
float frame_max, cur_max;
|
||||
bool need_render_sum;
|
||||
bool need_render_sum, enabled;
|
||||
volatile bool exit_;
|
||||
int timer_tone, timer_delim;
|
||||
Framebuffer fbo_1x1;
|
||||
|
||||
Reference in New Issue
Block a user