Compare commits
	
		
			3 Commits
		
	
	
		
			310f337f57
			...
			58013ad571
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 58013ad571 | |||
| fb9c320633 | |||
| c5e21bd731 | 
@ -22,18 +22,7 @@ ExampleScene::~ExampleScene() = default;
 | 
			
		||||
 | 
			
		||||
void ExampleScene::init()
 | 
			
		||||
{
 | 
			
		||||
  setSkybox(new Qtk::Skybox(":/textures/skybox/right.png",
 | 
			
		||||
                            ":/textures/skybox/top.png",
 | 
			
		||||
                            ":/textures/skybox/front.png",
 | 
			
		||||
                            ":/textures/skybox/left.png",
 | 
			
		||||
                            ":/textures/skybox/bottom.png",
 | 
			
		||||
                            ":/textures/skybox/back.png",
 | 
			
		||||
                            "Skybox"));
 | 
			
		||||
 | 
			
		||||
  std::string spartanPath = QTK_EXAMPLE_SOURCE_DIR;
 | 
			
		||||
  spartanPath += "/../resources/models/spartan/spartan.obj";
 | 
			
		||||
  auto spartan = addObject(new Model("spartan", spartanPath.c_str()));
 | 
			
		||||
  spartan->getTransform().setTranslation(-4.0f, 0.0f, 0.0f);
 | 
			
		||||
  setSkybox(new Qtk::Skybox);
 | 
			
		||||
 | 
			
		||||
  auto mesh = addObject(
 | 
			
		||||
      new Qtk::MeshRenderer("rightTriangle", Triangle(QTK_DRAW_ELEMENTS)));
 | 
			
		||||
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 3.8 MiB  | 
@ -1,6 +1,5 @@
 | 
			
		||||
<RCC>
 | 
			
		||||
    <qresource prefix="/textures">
 | 
			
		||||
        <file alias="plaster.png">images/plaster.png</file>
 | 
			
		||||
        <file alias="crate.png">images/crate.png</file>
 | 
			
		||||
        <file alias="stone.png">images/stone.png</file>
 | 
			
		||||
        <file alias="wood.png">images/wood.png</file>
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,5 @@
 | 
			
		||||
<RCC>
 | 
			
		||||
    <qresource prefix="/textures">
 | 
			
		||||
        <file alias="plaster.png">images/plaster.png</file>
 | 
			
		||||
        <file alias="crate.png">images/crate.png</file>
 | 
			
		||||
        <file alias="stone.png">images/stone.png</file>
 | 
			
		||||
        <file alias="wood.png">images/wood.png</file>
 | 
			
		||||
 | 
			
		||||
@ -62,7 +62,7 @@ MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent)
 | 
			
		||||
  ui_->menuView->addAction(ui_->qtk__TreeView->toggleViewAction());
 | 
			
		||||
 | 
			
		||||
  // Set the window icon used for Qtk.
 | 
			
		||||
  setWindowIcon(Qtk::getIcon());
 | 
			
		||||
  setWindowIcon(getIcon());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MainWindow::~MainWindow()
 | 
			
		||||
 | 
			
		||||
@ -132,6 +132,11 @@ class MainWindow : public QMainWindow
 | 
			
		||||
     */
 | 
			
		||||
    void setScene(Qtk::Scene * scene);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return Default icon to use for Qtk desktop application.
 | 
			
		||||
     */
 | 
			
		||||
    static QIcon getIcon() { return QIcon(":/icons/icon.png"); }
 | 
			
		||||
 | 
			
		||||
  public slots:
 | 
			
		||||
    /**
 | 
			
		||||
     * Trigger a refresh for widgets related to a scene that has been updated.
 | 
			
		||||
 | 
			
		||||
@ -426,6 +426,7 @@ void QtkScene::draw()
 | 
			
		||||
  // WARNING: We must call the base class draw() function first.
 | 
			
		||||
  // + This will handle rendering core scene components like the Skybox.
 | 
			
		||||
  Scene::draw();
 | 
			
		||||
  const QVector3D cameraPosition = getCamera().getTransform().getTranslation();
 | 
			
		||||
 | 
			
		||||
  mTestPhong->bindShaders();
 | 
			
		||||
  mTestPhong->setUniform("uModelInverseTransposed",
 | 
			
		||||
@ -433,14 +434,12 @@ void QtkScene::draw()
 | 
			
		||||
  mTestPhong->setUniform(
 | 
			
		||||
      "uLightPosition",
 | 
			
		||||
      MeshRenderer::getInstance("phongLight")->getTransform().getTranslation());
 | 
			
		||||
  mTestPhong->setUniform("uCameraPosition",
 | 
			
		||||
                         QtkScene::getCamera().getTransform().getTranslation());
 | 
			
		||||
  mTestPhong->setUniform("uCameraPosition", cameraPosition);
 | 
			
		||||
  mTestPhong->releaseShaders();
 | 
			
		||||
  mTestPhong->draw();
 | 
			
		||||
 | 
			
		||||
  mTestAmbient->bindShaders();
 | 
			
		||||
  mTestAmbient->setUniform(
 | 
			
		||||
      "uCameraPosition", QtkScene::getCamera().getTransform().getTranslation());
 | 
			
		||||
  mTestAmbient->setUniform("uCameraPosition", cameraPosition);
 | 
			
		||||
  mTestAmbient->releaseShaders();
 | 
			
		||||
  mTestAmbient->draw();
 | 
			
		||||
 | 
			
		||||
@ -452,8 +451,7 @@ void QtkScene::draw()
 | 
			
		||||
                           MeshRenderer::getInstance("diffuseLight")
 | 
			
		||||
                               ->getTransform()
 | 
			
		||||
                               .getTranslation());
 | 
			
		||||
  mTestDiffuse->setUniform(
 | 
			
		||||
      "uCameraPosition", QtkScene::getCamera().getTransform().getTranslation());
 | 
			
		||||
  mTestDiffuse->setUniform("uCameraPosition", cameraPosition);
 | 
			
		||||
  mTestDiffuse->releaseShaders();
 | 
			
		||||
  mTestDiffuse->draw();
 | 
			
		||||
 | 
			
		||||
@ -465,67 +463,82 @@ void QtkScene::draw()
 | 
			
		||||
                            MeshRenderer::getInstance("specularLight")
 | 
			
		||||
                                ->getTransform()
 | 
			
		||||
                                .getTranslation());
 | 
			
		||||
  mTestSpecular->setUniform(
 | 
			
		||||
      "uCameraPosition", QtkScene::getCamera().getTransform().getTranslation());
 | 
			
		||||
  mTestSpecular->setUniform("uCameraPosition", cameraPosition);
 | 
			
		||||
  mTestSpecular->releaseShaders();
 | 
			
		||||
  mTestSpecular->draw();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QtkScene::update()
 | 
			
		||||
{
 | 
			
		||||
  auto mySpartan = Model::getInstance("My spartan");
 | 
			
		||||
  mySpartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
 | 
			
		||||
  auto getModel = Model::getInstance;
 | 
			
		||||
  const QVector3D cameraPosition = getCamera().getTransform().getTranslation();
 | 
			
		||||
 | 
			
		||||
  auto myCube = MeshRenderer::getInstance("My cube");
 | 
			
		||||
  myCube->getTransform().rotate(-0.75f, 0.0f, 1.0f, 0.0f);
 | 
			
		||||
  // Models may have failed to load, so we should check before accessing.
 | 
			
		||||
  if (auto mySpartan = getModel("My spartan"); mySpartan) {
 | 
			
		||||
    mySpartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  auto position = MeshRenderer::getInstance("alienTestLight")
 | 
			
		||||
                      ->getTransform()
 | 
			
		||||
                      .getTranslation();
 | 
			
		||||
  auto alien = Model::getInstance("alienTest");
 | 
			
		||||
  alien->setUniform("uLight.position", position);
 | 
			
		||||
  alien->setUniform("uCameraPosition",
 | 
			
		||||
                    QtkScene::getCamera().getTransform().getTranslation());
 | 
			
		||||
  auto posMatrix = alien->getTransform().toMatrix();
 | 
			
		||||
  alien->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
 | 
			
		||||
  alien->setUniform("uMVP.model", posMatrix);
 | 
			
		||||
  alien->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
 | 
			
		||||
  alien->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
 | 
			
		||||
  alien->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
 | 
			
		||||
  if (auto myCube = getModel("My cube"); myCube) {
 | 
			
		||||
    myCube->getTransform().rotate(-0.75f, 0.0f, 1.0f, 0.0f);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  position = MeshRenderer::getInstance("spartanTestLight")
 | 
			
		||||
                 ->getTransform()
 | 
			
		||||
                 .getTranslation();
 | 
			
		||||
  auto spartan = Model::getInstance("spartanTest");
 | 
			
		||||
  spartan->setUniform("uLight.position", position);
 | 
			
		||||
  spartan->setUniform("uCameraPosition",
 | 
			
		||||
                      QtkScene::getCamera().getTransform().getTranslation());
 | 
			
		||||
  posMatrix = spartan->getTransform().toMatrix();
 | 
			
		||||
  spartan->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
 | 
			
		||||
  spartan->setUniform("uMVP.model", posMatrix);
 | 
			
		||||
  spartan->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
 | 
			
		||||
  spartan->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
 | 
			
		||||
  spartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
 | 
			
		||||
  // Helper lambda to set the light position used by GLSL shaders on the model.
 | 
			
		||||
  // TODO: This could be a helper function on the Model class.
 | 
			
		||||
  auto setLightPosition = [](const std::string & lightName, Model * model) {
 | 
			
		||||
    if (auto light = Model::getInstance(lightName.c_str()); light) {
 | 
			
		||||
      QVector3D position = light->getTransform().getTranslation();
 | 
			
		||||
      model->setUniform("uLight.position", position);
 | 
			
		||||
    } else {
 | 
			
		||||
      qDebug() << "[QtkScene] Failed to set light position: "
 | 
			
		||||
               << lightName.c_str();
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  auto phong = MeshRenderer::getInstance("testPhong");
 | 
			
		||||
  phong->getTransform().rotate(0.75f, 1.0f, 0.5f, 0.0f);
 | 
			
		||||
  phong->bindShaders();
 | 
			
		||||
  position =
 | 
			
		||||
      MeshRenderer::getInstance("testLight")->getTransform().getTranslation();
 | 
			
		||||
  phong->setUniform("uLight.position", position);
 | 
			
		||||
  phong->setUniform("uCameraPosition",
 | 
			
		||||
                    QtkScene::getCamera().getTransform().getTranslation());
 | 
			
		||||
  posMatrix = phong->getTransform().toMatrix();
 | 
			
		||||
  phong->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
 | 
			
		||||
  phong->setUniform("uMVP.model", posMatrix);
 | 
			
		||||
  phong->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
 | 
			
		||||
  phong->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
 | 
			
		||||
  phong->releaseShaders();
 | 
			
		||||
  QMatrix4x4 posMatrix;
 | 
			
		||||
  if (auto alien = getModel("alienTest"); alien) {
 | 
			
		||||
    setLightPosition("alienTestLight", alien);
 | 
			
		||||
 | 
			
		||||
    alien->setUniform("uCameraPosition", cameraPosition);
 | 
			
		||||
    posMatrix = alien->getTransform().toMatrix();
 | 
			
		||||
    alien->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
 | 
			
		||||
    alien->setUniform("uMVP.model", posMatrix);
 | 
			
		||||
    alien->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
 | 
			
		||||
    alien->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
 | 
			
		||||
    alien->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (auto spartan = getModel("spartanTest"); spartan) {
 | 
			
		||||
    setLightPosition("spartanTestLight", spartan);
 | 
			
		||||
 | 
			
		||||
    spartan->setUniform("uCameraPosition", cameraPosition);
 | 
			
		||||
    posMatrix = spartan->getTransform().toMatrix();
 | 
			
		||||
    spartan->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
 | 
			
		||||
    spartan->setUniform("uMVP.model", posMatrix);
 | 
			
		||||
    spartan->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
 | 
			
		||||
    spartan->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
 | 
			
		||||
    spartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (auto phong = getModel("testPhong"); phong) {
 | 
			
		||||
    setLightPosition("testLight", phong);
 | 
			
		||||
 | 
			
		||||
    phong->getTransform().rotate(0.75f, 1.0f, 0.5f, 0.0f);
 | 
			
		||||
    phong->bindShaders();
 | 
			
		||||
    phong->setUniform("uCameraPosition", cameraPosition);
 | 
			
		||||
    posMatrix = phong->getTransform().toMatrix();
 | 
			
		||||
    phong->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
 | 
			
		||||
    phong->setUniform("uMVP.model", posMatrix);
 | 
			
		||||
    phong->setUniform("uMVP.view", QtkScene::getCamera().toMatrix());
 | 
			
		||||
    phong->setUniform("uMVP.projection", QtkScene::getProjectionMatrix());
 | 
			
		||||
    phong->releaseShaders();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // MeshRenderers are lower level opengl objects baked into the source code.
 | 
			
		||||
  auto getMesh = MeshRenderer::getInstance;
 | 
			
		||||
 | 
			
		||||
  // Rotate lighting example cubes
 | 
			
		||||
  mTestPhong->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
 | 
			
		||||
  MeshRenderer::getInstance("noLight")->getTransform().rotate(
 | 
			
		||||
      0.75f, 0.5f, 0.3f, 0.2f);
 | 
			
		||||
  getMesh("noLight")->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
 | 
			
		||||
  mTestAmbient->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
 | 
			
		||||
  mTestDiffuse->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
 | 
			
		||||
  mTestSpecular->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
 | 
			
		||||
@ -533,46 +546,27 @@ void QtkScene::update()
 | 
			
		||||
  // Examples of various translations and rotations
 | 
			
		||||
 | 
			
		||||
  // Rotate in multiple directions simultaneously
 | 
			
		||||
  MeshRenderer::getInstance("rgbNormalsCube")
 | 
			
		||||
      ->getTransform()
 | 
			
		||||
      .rotate(0.75f, 0.2f, 0.4f, 0.6f);
 | 
			
		||||
  getMesh("rgbNormalsCube")->getTransform().rotate(0.75f, 0.2f, 0.4f, 0.6f);
 | 
			
		||||
 | 
			
		||||
  // Pitch forward and roll sideways
 | 
			
		||||
  MeshRenderer::getInstance("leftTriangle")
 | 
			
		||||
      ->getTransform()
 | 
			
		||||
      .rotate(0.75f, 1.0f, 0.0f, 0.0f);
 | 
			
		||||
  MeshRenderer::getInstance("rightTriangle")
 | 
			
		||||
      ->getTransform()
 | 
			
		||||
      .rotate(0.75f, 0.0f, 0.0f, 1.0f);
 | 
			
		||||
  getMesh("leftTriangle")->getTransform().rotate(0.75f, 1.0f, 0.0f, 0.0f);
 | 
			
		||||
  getMesh("rightTriangle")->getTransform().rotate(0.75f, 0.0f, 0.0f, 1.0f);
 | 
			
		||||
 | 
			
		||||
  // Move between two positions over time
 | 
			
		||||
  static float translateX = 0.025f;
 | 
			
		||||
  float limit = -9.0f;  // Origin position.x - 2.0f
 | 
			
		||||
  float posX = MeshRenderer::getInstance("topTriangle")
 | 
			
		||||
                   ->getTransform()
 | 
			
		||||
                   .getTranslation()
 | 
			
		||||
                   .x();
 | 
			
		||||
  float posX = getMesh("topTriangle")->getTransform().getTranslation().x();
 | 
			
		||||
  if (posX < limit || posX > limit + 4.0f) {
 | 
			
		||||
    translateX = -translateX;
 | 
			
		||||
  }
 | 
			
		||||
  MeshRenderer::getInstance("topTriangle")
 | 
			
		||||
      ->getTransform()
 | 
			
		||||
      .translate(translateX, 0.0f, 0.0f);
 | 
			
		||||
  MeshRenderer::getInstance("bottomTriangle")
 | 
			
		||||
      ->getTransform()
 | 
			
		||||
      .translate(-translateX, 0.0f, 0.0f);
 | 
			
		||||
  getMesh("topTriangle")->getTransform().translate(translateX, 0.0f, 0.0f);
 | 
			
		||||
  getMesh("bottomTriangle")->getTransform().translate(-translateX, 0.0f, 0.0f);
 | 
			
		||||
  // And lets rotate the triangles in two directions at once
 | 
			
		||||
  MeshRenderer::getInstance("topTriangle")
 | 
			
		||||
      ->getTransform()
 | 
			
		||||
      .rotate(0.75f, 0.2f, 0.0f, 0.4f);
 | 
			
		||||
  MeshRenderer::getInstance("bottomTriangle")
 | 
			
		||||
      ->getTransform()
 | 
			
		||||
      .rotate(0.75f, 0.0f, 0.2f, 0.4f);
 | 
			
		||||
  getMesh("topTriangle")->getTransform().rotate(0.75f, 0.2f, 0.0f, 0.4f);
 | 
			
		||||
  getMesh("bottomTriangle")->getTransform().rotate(0.75f, 0.0f, 0.2f, 0.4f);
 | 
			
		||||
  // And make the bottom triangle green, instead of RGB
 | 
			
		||||
 | 
			
		||||
  // Rotate center cube in several directions simultaneously
 | 
			
		||||
  // + Not subject to gimbal lock since we are using quaternions :)
 | 
			
		||||
  MeshRenderer::getInstance("centerCube")
 | 
			
		||||
      ->getTransform()
 | 
			
		||||
      .rotate(0.75f, 0.2f, 0.4f, 0.6f);
 | 
			
		||||
  getMesh("centerCube")->getTransform().rotate(0.75f, 0.2f, 0.4f, 0.6f);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -67,7 +67,7 @@ QString WidgetPlugin::whatsThis() const
 | 
			
		||||
 | 
			
		||||
QIcon WidgetPlugin::icon() const
 | 
			
		||||
{
 | 
			
		||||
  return Qtk::getIcon();
 | 
			
		||||
  return QIcon(":/icons/icon.png");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool WidgetPlugin::isContainer() const
 | 
			
		||||
 | 
			
		||||
@ -121,9 +121,7 @@ void MeshRenderer::draw()
 | 
			
		||||
  bindShaders();
 | 
			
		||||
  mVAO.bind();
 | 
			
		||||
 | 
			
		||||
  if (mTexture.hasTexture()) {
 | 
			
		||||
    mTexture.getOpenGLTexture().bind();
 | 
			
		||||
  }
 | 
			
		||||
  mTexture.bind();
 | 
			
		||||
 | 
			
		||||
  // TODO: Automate uniforms some other way
 | 
			
		||||
  setUniformMVP();
 | 
			
		||||
@ -138,9 +136,7 @@ void MeshRenderer::draw()
 | 
			
		||||
                   mShape.mIndices.data());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (mTexture.hasTexture()) {
 | 
			
		||||
    mTexture.getOpenGLTexture().release();
 | 
			
		||||
  }
 | 
			
		||||
  mTexture.bind();
 | 
			
		||||
 | 
			
		||||
  mVAO.release();
 | 
			
		||||
  releaseShaders();
 | 
			
		||||
 | 
			
		||||
@ -43,14 +43,6 @@ namespace Qtk
 | 
			
		||||
    }
 | 
			
		||||
    return widget;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return Default icon to use for Qtk desktop application.
 | 
			
		||||
   */
 | 
			
		||||
  static QIcon getIcon()
 | 
			
		||||
  {
 | 
			
		||||
    return QIcon(":/icons/icon.png");
 | 
			
		||||
  }
 | 
			
		||||
}  // namespace Qtk
 | 
			
		||||
 | 
			
		||||
#endif  // QTK_QTKAPI_H
 | 
			
		||||
 | 
			
		||||
@ -17,9 +17,28 @@ using namespace Qtk;
 | 
			
		||||
 * Constructors / Destructors
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
 | 
			
		||||
Skybox::Skybox(QOpenGLTexture * cubeMap, const std::string & name)
 | 
			
		||||
Skybox::Skybox(const std::string & name) :
 | 
			
		||||
    mVBO(QOpenGLBuffer::VertexBuffer),
 | 
			
		||||
    mVertices(Cube(QTK_DRAW_ELEMENTS).getVertices()),
 | 
			
		||||
    mIndices(Cube(QTK_DRAW_ELEMENTS).getIndexData())
 | 
			
		||||
{
 | 
			
		||||
  mTexture.setTexture(cubeMap);
 | 
			
		||||
  QImage image({1024, 1024}, QImage::Format_RGBA8888);
 | 
			
		||||
  image.fill(Qt::darkGray);
 | 
			
		||||
  mTexture.setCubeMap(image, image, image, image, image, image);
 | 
			
		||||
  init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Skybox::Skybox(QOpenGLTexture * cubeMap, const std::string & name) :
 | 
			
		||||
    mVBO(QOpenGLBuffer::VertexBuffer),
 | 
			
		||||
    mVertices(Cube(QTK_DRAW_ELEMENTS).getVertices()),
 | 
			
		||||
    mIndices(Cube(QTK_DRAW_ELEMENTS).getIndexData())
 | 
			
		||||
{
 | 
			
		||||
  if (cubeMap == Q_NULLPTR) {
 | 
			
		||||
    qDebug()
 | 
			
		||||
        << "[Qtk] Failed to set cubemap for skybox with null QOpenGLTexture.";
 | 
			
		||||
  } else {
 | 
			
		||||
    mTexture.setTexture(cubeMap);
 | 
			
		||||
  }
 | 
			
		||||
  init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -34,13 +53,13 @@ Skybox::Skybox(const std::string & right,
 | 
			
		||||
    mVertices(Cube(QTK_DRAW_ELEMENTS).getVertices()),
 | 
			
		||||
    mIndices(Cube(QTK_DRAW_ELEMENTS).getIndexData())
 | 
			
		||||
{
 | 
			
		||||
  init();
 | 
			
		||||
  mTexture.setCubeMap(QImage(right.c_str()).mirrored(),
 | 
			
		||||
                      QImage(top.c_str()),
 | 
			
		||||
                      QImage(front.c_str()),
 | 
			
		||||
                      QImage(left.c_str()),
 | 
			
		||||
                      QImage(bottom.c_str()),
 | 
			
		||||
                      QImage(back.c_str()));
 | 
			
		||||
  init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*******************************************************************************
 | 
			
		||||
@ -54,7 +73,7 @@ void Skybox::draw()
 | 
			
		||||
 | 
			
		||||
  mVAO.bind();
 | 
			
		||||
  mProgram.bind();
 | 
			
		||||
  mTexture.getOpenGLTexture().bind();
 | 
			
		||||
  mTexture.bind();
 | 
			
		||||
 | 
			
		||||
  mProgram.setUniformValue("uProjectionMatrix", Scene::getProjectionMatrix());
 | 
			
		||||
  mProgram.setUniformValue("uViewMatrix", Scene::getCamera().toMatrix());
 | 
			
		||||
@ -62,7 +81,7 @@ void Skybox::draw()
 | 
			
		||||
  glDrawElements(
 | 
			
		||||
      GL_TRIANGLES, mIndices.size(), GL_UNSIGNED_INT, mIndices.data());
 | 
			
		||||
 | 
			
		||||
  mTexture.getOpenGLTexture().bind();
 | 
			
		||||
  mTexture.bind();
 | 
			
		||||
  mProgram.release();
 | 
			
		||||
  mVAO.release();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,12 @@ namespace Qtk
 | 
			
		||||
       * Constructors / Destructors
 | 
			
		||||
       ************************************************************************/
 | 
			
		||||
 | 
			
		||||
      // Delegate this constructor to use default skybox images
 | 
			
		||||
      /**
 | 
			
		||||
       * Construct a skybox with a default texture.
 | 
			
		||||
       *
 | 
			
		||||
       * @param name The objectName to use for the Skybox.
 | 
			
		||||
       */
 | 
			
		||||
      explicit Skybox(const std::string & name = "Skybox");
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Construct a skybox with an existing QOpenGLTexture.
 | 
			
		||||
 | 
			
		||||
@ -8,6 +8,7 @@
 | 
			
		||||
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include <QImageReader>
 | 
			
		||||
#include <QPainter>
 | 
			
		||||
 | 
			
		||||
#include "texture.h"
 | 
			
		||||
 | 
			
		||||
@ -65,6 +66,22 @@ QOpenGLTexture * OpenGLTextureFactory::initCubeMap(const char * right,
 | 
			
		||||
                     QImage(back));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QImage OpenGLTextureFactory::defaultTexture()
 | 
			
		||||
{
 | 
			
		||||
  QImage image({256, 256}, QImage::Format_RGBA8888);
 | 
			
		||||
  image.fill(Qt::lightGray);
 | 
			
		||||
 | 
			
		||||
  // Draw a red '?' to the center of the image.
 | 
			
		||||
  QPainter painter(&image);
 | 
			
		||||
  painter.setRenderHint(QPainter::Antialiasing);
 | 
			
		||||
  painter.setPen(Qt::red);
 | 
			
		||||
  painter.setFont({"Helvetica", 100, QFont::Bold});
 | 
			
		||||
  constexpr QRect rect(0, 0, 256, 256);
 | 
			
		||||
  painter.drawText(rect, Qt::AlignCenter, "?");
 | 
			
		||||
 | 
			
		||||
  return image;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QOpenGLTexture * OpenGLTextureFactory::initCubeMap(const QImage & right,
 | 
			
		||||
                                                   const QImage & top,
 | 
			
		||||
                                                   const QImage & front,
 | 
			
		||||
@ -87,9 +104,9 @@ QOpenGLTexture * OpenGLTextureFactory::initCubeMap(const QImage & right,
 | 
			
		||||
      QOpenGLTexture::CubeMapNegativeZ};
 | 
			
		||||
  int i = 0;
 | 
			
		||||
  for (const auto & face : faces) {
 | 
			
		||||
    QImage faceImage(faceTextures[i]);
 | 
			
		||||
    QImage & faceImage = faceTextures[i];
 | 
			
		||||
    if (faceImage.isNull()) {
 | 
			
		||||
      qDebug() << "Error loading cube map image\n";
 | 
			
		||||
      qDebug() << "[libqtk] Error loading cube map image\n";
 | 
			
		||||
      faceImage = defaultTexture();
 | 
			
		||||
    }
 | 
			
		||||
    faceImage = faceImage.convertToFormat(QImage::Format_RGBA8888);
 | 
			
		||||
 | 
			
		||||
@ -145,13 +145,7 @@ namespace Qtk
 | 
			
		||||
                                          const char * back);
 | 
			
		||||
 | 
			
		||||
      /// The texture used in place of a missing texture.
 | 
			
		||||
      static QImage defaultTexture()
 | 
			
		||||
      {
 | 
			
		||||
        // Use plaster for default texture if image fails to load.
 | 
			
		||||
        // This prevents segfaults when loading a texture that doesn't exist.
 | 
			
		||||
        // TODO: Replace with a '?' texture to indicate missing texture.
 | 
			
		||||
        return QImage(":/textures/plaster.png");
 | 
			
		||||
      }
 | 
			
		||||
      static QImage defaultTexture();
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
      // Private ctor to prevent creating instances of this class
 | 
			
		||||
@ -223,6 +217,20 @@ namespace Qtk
 | 
			
		||||
        return mOpenGLTexture != Q_NULLPTR;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Bind the OpenGL texture if it exists, avoiding segmentation faults.
 | 
			
		||||
       */
 | 
			
		||||
      bool bind() const
 | 
			
		||||
      {
 | 
			
		||||
        if (hasTexture()) {
 | 
			
		||||
          // TODO: It would be nice to warn here but some objects may not have
 | 
			
		||||
          // a texture. Factor Texture out of those objects so we don't bind.
 | 
			
		||||
          mOpenGLTexture->bind();
 | 
			
		||||
          return true;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /*************************************************************************
 | 
			
		||||
       * Accessors
 | 
			
		||||
       ************************************************************************/
 | 
			
		||||
@ -306,12 +314,12 @@ namespace Qtk
 | 
			
		||||
      /**
 | 
			
		||||
       * Sets this Texture to be a cube map with provided sides.
 | 
			
		||||
       *
 | 
			
		||||
       * @param right Path to texture to use for right cube map side.
 | 
			
		||||
       * @param top Path to texture to use for top cube map side.
 | 
			
		||||
       * @param front Path to texture to use for front cube map side.
 | 
			
		||||
       * @param left Path to texture to use for left cube map side.
 | 
			
		||||
       * @param bottom Path to texture to use for bottom cube map side.
 | 
			
		||||
       * @param back Path to texture to use for back cube map side.
 | 
			
		||||
       * @param right QImage texture to use for right cube map side.
 | 
			
		||||
       * @param top QImage texture to use for top cube map side.
 | 
			
		||||
       * @param front QImage texture to use for front cube map side.
 | 
			
		||||
       * @param left QImage texture to use for left cube map side.
 | 
			
		||||
       * @param bottom QImage texture to use for bottom cube map side.
 | 
			
		||||
       * @param back QImage texture to use for back cube map side.
 | 
			
		||||
       */
 | 
			
		||||
      virtual inline void setCubeMap(const QImage & right,
 | 
			
		||||
                                     const QImage & top,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user