demos/boxes/scene.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
2:56cd8111b7f7 3:41300fa6a67c
   343                         layout->addWidget(new QLabel(m_parameterNames.back()));
   343                         layout->addWidget(new QLabel(m_parameterNames.back()));
   344                         bool ok;
   344                         bool ok;
   345                         ColorEdit *colorEdit = new ColorEdit(it->toUInt(&ok, 16), m_parameterNames.size() - 1);
   345                         ColorEdit *colorEdit = new ColorEdit(it->toUInt(&ok, 16), m_parameterNames.size() - 1);
   346                         m_parameterEdits << colorEdit;
   346                         m_parameterEdits << colorEdit;
   347                         layout->addWidget(colorEdit);
   347                         layout->addWidget(colorEdit);
   348                         connect(colorEdit, SIGNAL(colorChanged(QRgb, int)), this, SLOT(setColorParameter(QRgb, int)));
   348                         connect(colorEdit, SIGNAL(colorChanged(QRgb,int)), this, SLOT(setColorParameter(QRgb,int)));
   349                         ++row;
   349                         ++row;
   350                     } else if (type == "float") {
   350                     } else if (type == "float") {
   351                         layout->addWidget(new QLabel(m_parameterNames.back()));
   351                         layout->addWidget(new QLabel(m_parameterNames.back()));
   352                         bool ok;
   352                         bool ok;
   353                         FloatEdit *floatEdit = new FloatEdit(it->toFloat(&ok), m_parameterNames.size() - 1);
   353                         FloatEdit *floatEdit = new FloatEdit(it->toFloat(&ok), m_parameterNames.size() - 1);
   354                         m_parameterEdits << floatEdit;
   354                         m_parameterEdits << floatEdit;
   355                         layout->addWidget(floatEdit);
   355                         layout->addWidget(floatEdit);
   356                         connect(floatEdit, SIGNAL(valueChanged(float, int)), this, SLOT(setFloatParameter(float, int)));
   356                         connect(floatEdit, SIGNAL(valueChanged(float,int)), this, SLOT(setFloatParameter(float,int)));
   357                         ++row;
   357                         ++row;
   358                     }
   358                     }
   359                 }
   359                 }
   360             }
   360             }
   361             file.close();
   361             file.close();
   494     m_renderOptions = new RenderOptionsDialog;
   494     m_renderOptions = new RenderOptionsDialog;
   495     m_renderOptions->move(20, 120);
   495     m_renderOptions->move(20, 120);
   496     m_renderOptions->resize(m_renderOptions->sizeHint());
   496     m_renderOptions->resize(m_renderOptions->sizeHint());
   497 
   497 
   498     connect(m_renderOptions, SIGNAL(dynamicCubemapToggled(int)), this, SLOT(toggleDynamicCubemap(int)));
   498     connect(m_renderOptions, SIGNAL(dynamicCubemapToggled(int)), this, SLOT(toggleDynamicCubemap(int)));
   499     connect(m_renderOptions, SIGNAL(colorParameterChanged(const QString &, QRgb)), this, SLOT(setColorParameter(const QString &, QRgb)));
   499     connect(m_renderOptions, SIGNAL(colorParameterChanged(QString,QRgb)), this, SLOT(setColorParameter(QString,QRgb)));
   500     connect(m_renderOptions, SIGNAL(floatParameterChanged(const QString &, float)), this, SLOT(setFloatParameter(const QString &, float)));
   500     connect(m_renderOptions, SIGNAL(floatParameterChanged(QString,float)), this, SLOT(setFloatParameter(QString,float)));
   501     connect(m_renderOptions, SIGNAL(textureChanged(int)), this, SLOT(setTexture(int)));
   501     connect(m_renderOptions, SIGNAL(textureChanged(int)), this, SLOT(setTexture(int)));
   502     connect(m_renderOptions, SIGNAL(shaderChanged(int)), this, SLOT(setShader(int)));
   502     connect(m_renderOptions, SIGNAL(shaderChanged(int)), this, SLOT(setShader(int)));
   503 
   503 
   504     m_itemDialog = new ItemDialog;
   504     m_itemDialog = new ItemDialog;
   505     connect(m_itemDialog, SIGNAL(newItemTriggered(ItemDialog::ItemType)), this, SLOT(newItem(ItemDialog::ItemType)));
   505     connect(m_itemDialog, SIGNAL(newItemTriggered(ItemDialog::ItemType)), this, SLOT(newItem(ItemDialog::ItemType)));
   550 
   550 
   551 void Scene::initGL()
   551 void Scene::initGL()
   552 {
   552 {
   553     m_box = new GLRoundedBox(0.25f, 1.0f, 10);
   553     m_box = new GLRoundedBox(0.25f, 1.0f, 10);
   554 
   554 
   555     m_vertexShader = new QGLShader(":/res/boxes/basic.vsh", QGLShader::VertexShader);
   555     m_vertexShader = new QGLShader(QGLShader::Vertex);
       
   556     m_vertexShader->compileSourceFile(QLatin1String(":/res/boxes/basic.vsh"));
   556 
   557 
   557     QStringList list;
   558     QStringList list;
   558     list << ":/res/boxes/cubemap_posx.jpg" << ":/res/boxes/cubemap_negx.jpg" << ":/res/boxes/cubemap_posy.jpg"
   559     list << ":/res/boxes/cubemap_posx.jpg" << ":/res/boxes/cubemap_negx.jpg" << ":/res/boxes/cubemap_posy.jpg"
   559          << ":/res/boxes/cubemap_negy.jpg" << ":/res/boxes/cubemap_posz.jpg" << ":/res/boxes/cubemap_negz.jpg";
   560          << ":/res/boxes/cubemap_negy.jpg" << ":/res/boxes/cubemap_posz.jpg" << ":/res/boxes/cubemap_negz.jpg";
   560     m_environment = new GLTextureCube(list, qMin(1024, m_maxTextureSize));
   561     m_environment = new GLTextureCube(list, qMin(1024, m_maxTextureSize));
   561     m_environmentShader = new QGLShader(QGLShader::FragmentShader);
   562     m_environmentShader = new QGLShader(QGLShader::Fragment);
   562     m_environmentShader->compile(environmentShaderText);
   563     m_environmentShader->compileSourceCode(environmentShaderText);
   563     m_environmentProgram = new QGLShaderProgram;
   564     m_environmentProgram = new QGLShaderProgram;
   564     m_environmentProgram->addShader(m_vertexShader);
   565     m_environmentProgram->addShader(m_vertexShader);
   565     m_environmentProgram->addShader(m_environmentShader);
   566     m_environmentProgram->addShader(m_environmentShader);
   566     m_environmentProgram->link();
   567     m_environmentProgram->link();
   567 
   568 
   614     m_currentShader = 0;
   615     m_currentShader = 0;
   615     filter = QStringList("*.fsh");
   616     filter = QStringList("*.fsh");
   616     files = QDir(":/res/boxes/").entryInfoList(filter, QDir::Files | QDir::Readable);
   617     files = QDir(":/res/boxes/").entryInfoList(filter, QDir::Files | QDir::Readable);
   617     foreach (QFileInfo file, files) {
   618     foreach (QFileInfo file, files) {
   618         QGLShaderProgram *program = new QGLShaderProgram;
   619         QGLShaderProgram *program = new QGLShaderProgram;
   619         QGLShader* shader = new QGLShader(file.absoluteFilePath(), QGLShader::FragmentShader);
   620         QGLShader* shader = new QGLShader(QGLShader::Fragment);
       
   621         shader->compileSourceFile(file.absoluteFilePath());
   620         // The program does not take ownership over the shaders, so store them in a vector so they can be deleted afterwards.
   622         // The program does not take ownership over the shaders, so store them in a vector so they can be deleted afterwards.
   621         program->addShader(m_vertexShader);
   623         program->addShader(m_vertexShader);
   622         program->addShader(shader);
   624         program->addShader(shader);
   623         if (!program->link()) {
   625         if (!program->link()) {
   624             qWarning("Failed to compile and link shader program");
   626             qWarning("Failed to compile and link shader program");
   636 
   638 
   637         m_fragmentShaders << shader;
   639         m_fragmentShaders << shader;
   638         m_programs << program;
   640         m_programs << program;
   639         m_renderOptions->addShader(file.baseName());
   641         m_renderOptions->addShader(file.baseName());
   640 
   642 
   641         program->enable();
   643         program->bind();
   642         m_cubemaps << ((program->uniformLocation("env") != -1) ? new GLRenderTargetCube(qMin(256, m_maxTextureSize)) : 0);
   644         m_cubemaps << ((program->uniformLocation("env") != -1) ? new GLRenderTargetCube(qMin(256, m_maxTextureSize)) : 0);
   643         program->disable();
   645         program->release();
   644     }
   646     }
   645 
   647 
   646     if (m_programs.size() == 0)
   648     if (m_programs.size() == 0)
   647         m_programs << new QGLShaderProgram;
   649         m_programs << new QGLShaderProgram;
   648 
   650 
   695     glScalef(20.0f, 20.0f, 20.0f);
   697     glScalef(20.0f, 20.0f, 20.0f);
   696 
   698 
   697     // Don't render the environment if the environment texture can't be set for the correct sampler.
   699     // Don't render the environment if the environment texture can't be set for the correct sampler.
   698     if (glActiveTexture) {
   700     if (glActiveTexture) {
   699         m_environment->bind();
   701         m_environment->bind();
   700         m_environmentProgram->enable();
   702         m_environmentProgram->bind();
   701         m_environmentProgram->setUniformValue("tex", GLint(0));
   703         m_environmentProgram->setUniformValue("tex", GLint(0));
   702         m_environmentProgram->setUniformValue("env", GLint(1));
   704         m_environmentProgram->setUniformValue("env", GLint(1));
   703         m_environmentProgram->setUniformValue("noise", GLint(2));
   705         m_environmentProgram->setUniformValue("noise", GLint(2));
   704         m_box->draw();
   706         m_box->draw();
   705         m_environmentProgram->disable();
   707         m_environmentProgram->release();
   706         m_environment->unbind();
   708         m_environment->unbind();
   707     }
   709     }
   708 
   710 
   709     loadMatrix(view);
   711     loadMatrix(view);
   710 
   712 
   728             if (m_dynamicCubemap && m_cubemaps[i])
   730             if (m_dynamicCubemap && m_cubemaps[i])
   729                 m_cubemaps[i]->bind();
   731                 m_cubemaps[i]->bind();
   730             else
   732             else
   731                 m_environment->bind();
   733                 m_environment->bind();
   732         }
   734         }
   733         m_programs[i]->enable();
   735         m_programs[i]->bind();
   734         m_programs[i]->setUniformValue("tex", GLint(0));
   736         m_programs[i]->setUniformValue("tex", GLint(0));
   735         m_programs[i]->setUniformValue("env", GLint(1));
   737         m_programs[i]->setUniformValue("env", GLint(1));
   736         m_programs[i]->setUniformValue("noise", GLint(2));
   738         m_programs[i]->setUniformValue("noise", GLint(2));
   737         m_programs[i]->setUniformValue("view", view);
   739         m_programs[i]->setUniformValue("view", view);
   738         m_programs[i]->setUniformValue("invView", invView);
   740         m_programs[i]->setUniformValue("invView", invView);
   739         m_box->draw();
   741         m_box->draw();
   740         m_programs[i]->disable();
   742         m_programs[i]->release();
   741 
   743 
   742         if (glActiveTexture) {
   744         if (glActiveTexture) {
   743             if (m_dynamicCubemap && m_cubemaps[i])
   745             if (m_dynamicCubemap && m_cubemaps[i])
   744                 m_cubemaps[i]->unbind();
   746                 m_cubemaps[i]->unbind();
   745             else
   747             else
   758                 m_mainCubemap->bind();
   760                 m_mainCubemap->bind();
   759             else
   761             else
   760                 m_environment->bind();
   762                 m_environment->bind();
   761         }
   763         }
   762 
   764 
   763         m_programs[m_currentShader]->enable();
   765         m_programs[m_currentShader]->bind();
   764         m_programs[m_currentShader]->setUniformValue("tex", GLint(0));
   766         m_programs[m_currentShader]->setUniformValue("tex", GLint(0));
   765         m_programs[m_currentShader]->setUniformValue("env", GLint(1));
   767         m_programs[m_currentShader]->setUniformValue("env", GLint(1));
   766         m_programs[m_currentShader]->setUniformValue("noise", GLint(2));
   768         m_programs[m_currentShader]->setUniformValue("noise", GLint(2));
   767         m_programs[m_currentShader]->setUniformValue("view", view);
   769         m_programs[m_currentShader]->setUniformValue("view", view);
   768         m_programs[m_currentShader]->setUniformValue("invView", invView);
   770         m_programs[m_currentShader]->setUniformValue("invView", invView);
   769         m_box->draw();
   771         m_box->draw();
   770         m_programs[m_currentShader]->disable();
   772         m_programs[m_currentShader]->release();
   771 
   773 
   772         if (glActiveTexture) {
   774         if (glActiveTexture) {
   773             if (m_dynamicCubemap)
   775             if (m_dynamicCubemap)
   774                 m_mainCubemap->unbind();
   776                 m_mainCubemap->unbind();
   775             else
   777             else
   868         if (0 == m_cubemaps[i])
   870         if (0 == m_cubemaps[i])
   869             continue;
   871             continue;
   870 
   872 
   871         float angle = 2.0f * PI * i / m_cubemaps.size();
   873         float angle = 2.0f * PI * i / m_cubemaps.size();
   872 
   874 
   873         center = m_trackBalls[1].rotation().rotateVector(QVector3D(cos(angle), sin(angle), 0.0f));
   875         center = m_trackBalls[1].rotation().rotatedVector(QVector3D(cos(angle), sin(angle), 0.0f));
   874 
   876 
   875         for (int face = 0; face < 6; ++face) {
   877         for (int face = 0; face < 6; ++face) {
   876             m_cubemaps[i]->begin(face);
   878             m_cubemaps[i]->begin(face);
   877 
   879 
   878             GLRenderTargetCube::getViewMatrix(mat, face);
   880             GLRenderTargetCube::getViewMatrix(mat, face);
  1044 
  1046 
  1045 void Scene::setColorParameter(const QString &name, QRgb color)
  1047 void Scene::setColorParameter(const QString &name, QRgb color)
  1046 {
  1048 {
  1047     // set the color in all programs
  1049     // set the color in all programs
  1048     foreach (QGLShaderProgram *program, m_programs) {
  1050     foreach (QGLShaderProgram *program, m_programs) {
  1049         program->enable();
  1051         program->bind();
  1050         program->setUniformValue(program->uniformLocation(name), QColor(color));
  1052         program->setUniformValue(program->uniformLocation(name), QColor(color));
  1051         program->disable();
  1053         program->release();
  1052     }
  1054     }
  1053 }
  1055 }
  1054 
  1056 
  1055 void Scene::setFloatParameter(const QString &name, float value)
  1057 void Scene::setFloatParameter(const QString &name, float value)
  1056 {
  1058 {
  1057     // set the color in all programs
  1059     // set the color in all programs
  1058     foreach (QGLShaderProgram *program, m_programs) {
  1060     foreach (QGLShaderProgram *program, m_programs) {
  1059         program->enable();
  1061         program->bind();
  1060         program->setUniformValue(program->uniformLocation(name), value);
  1062         program->setUniformValue(program->uniformLocation(name), value);
  1061         program->disable();
  1063         program->release();
  1062     }
  1064     }
  1063 }
  1065 }
  1064 
  1066 
  1065 void Scene::newItem(ItemDialog::ItemType type)
  1067 void Scene::newItem(ItemDialog::ItemType type)
  1066 {
  1068 {