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 { |