From 7f13b2d72944c0b80c6e821fc62979929b09490b Mon Sep 17 00:00:00 2001 From: Shaun Reed Date: Sat, 26 Nov 2022 12:20:44 -0500 Subject: [PATCH] Example of using new simple API + Clean up some TODOs + More docs + Disable clang-format in Mesh --- CMakeLists.txt | 10 +- README.md | 37 ++++- app/examplescene.cpp | 206 ++++++++++++++----------- app/mainwindow.cpp | 2 +- app/mainwindow.h | 2 +- src/mesh.cpp | 354 ++++++++++++++++++++----------------------- src/mesh.h | 29 ++-- src/meshrenderer.h | 4 +- src/model.h | 13 +- src/object.h | 44 +++--- 10 files changed, 371 insertions(+), 330 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 75d043f..af0f0dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,9 +179,13 @@ configure_file( # Add our Qt resources.qrc file to our application set( - QTK_APP_SOURCES app/main.cpp - app/examplescene.cpp app/examplescene.h - app/mainwindow.cpp app/mainwindow.h app/mainwindow.ui + QTK_APP_SOURCES + app/main.cpp + app/examplescene.cpp + app/examplescene.h + app/mainwindow.cpp + app/mainwindow.h + app/mainwindow.ui app/resourcemanager.h src/qtkresources.h.in ) diff --git a/README.md b/README.md index 4d200ca..fe6e439 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![All Builds](https://github.com/shaunrd0/qtk/actions/workflows/all-builds.yml/badge.svg)](https://github.com/shaunrd0/qtk/actions/workflows/all-builds.yml) [![Linting](https://github.com/shaunrd0/qtk/actions/workflows/linting.yml/badge.svg)](https://github.com/shaunrd0/qtk/actions/workflows/linting.yml) -Practice project for learning about using OpenGL in Qt widget applications. Model loader using [Assimp](https://assimp.org/) within a Qt widget application. You can import your own models within `app/examplescene.cpp`, inside the @@ -12,6 +11,41 @@ happen in `ExampleScene::update()`. To get textures loading on models look into [material files](http://www.paulbourke.net/dataformats/mtl/) and see some examples in the `resources/models/` directory. +The syntax for adding shapes and models is seen in the example below. +This would result in a scene with a red cube and a miniature spartan model placed on top. + +```C++ +// From: qtk/app/examplescene.cpp + +void ExampleScene::init() { + // Add a skybox to the scene using default cube map images and settings. + setSkybox(new Qtk::Skybox("Skybox")); + + /* Create a red cube with a mini master chief on top. */ + auto * myCube = new MeshRenderer("My cube", Cube(Qtk::QTK_DRAW_ELEMENTS)); + myCube->setColor(RED); + mMeshes.push_back(myCube); + + auto mySpartan = new Model("My spartan", ":/models/spartan/spartan.obj"); + mySpartan->getTransform().setTranslation(0.0f, 0.5f, 0.0f); + mySpartan->getTransform().setScale(0.5f); + mModels.push_back(mySpartan); +} +``` + +If we want to make our spartan spin, we need to apply rotation in `update` + +```C++ +// From: qtk/app/examplescene.cpp + +void ExampleScene::update() { + auto mySpartan = Model::getInstance("My spartan"); + mySpartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f); + + auto myCube = MeshRenderer::getInstance("My cube"); + myCube->getTransform().rotate(-0.75f, 0.0f, 1.0f, 0.0f); +} +``` ### Source Builds @@ -132,7 +166,6 @@ Spartan with normals - ### QtkWidget in Qt Creator -The `QtkWidget` class is exported as a shared library for use in Qt Creator's design mode. We can add more QtkWidgets to view and render the scene from multiple perspectives. There is still some work to be done here, so there isn't a builtin way to add an additional view within the application. diff --git a/app/examplescene.cpp b/app/examplescene.cpp index f5129f0..fde4133 100644 --- a/app/examplescene.cpp +++ b/app/examplescene.cpp @@ -44,35 +44,45 @@ ExampleScene::~ExampleScene() { ******************************************************************************/ void ExampleScene::init() { + // Add a skybox to the scene using default cube map images and settings. setSkybox(new Qtk::Skybox("Skybox")); + /* Create a red cube with a mini master chief on top. */ + auto * myCube = new MeshRenderer("My cube", Cube(Qtk::QTK_DRAW_ELEMENTS)); + myCube->setColor(RED); + mMeshes.push_back(myCube); + + auto mySpartan = new Model("My spartan", ":/models/spartan/spartan.obj"); + mySpartan->getTransform().setTranslation(0.0f, 0.5f, 0.0f); + mySpartan->getTransform().setScale(0.5f); + mModels.push_back(mySpartan); + // // Create simple shapes using MeshRenderer class and data in mesh.h mMeshes.push_back( new Qtk::MeshRenderer("rightTriangle", Triangle(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(-5.0f, 0.0f, -2.0f); + mMeshes.back()->getTransform().setTranslation(-5.0f, 0.0f, -2.0f); mMeshes.push_back( new Qtk::MeshRenderer("centerCube", Cube(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(-7.0f, 0.0f, -2.0f); + mMeshes.back()->getTransform().setTranslation(-7.0f, 0.0f, -2.0f); mMeshes.push_back( new Qtk::MeshRenderer("leftTriangle", Triangle(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(-9.0f, 0.0f, -2.0f); + mMeshes.back()->getTransform().setTranslation(-9.0f, 0.0f, -2.0f); mMeshes.back()->setDrawType(GL_LINE_LOOP); mMeshes.push_back( new Qtk::MeshRenderer("topTriangle", Triangle(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(-7.0f, 2.0f, -2.0f); - mMeshes.back()->mTransform.scale(0.25f); + mMeshes.back()->getTransform().setTranslation(-7.0f, 2.0f, -2.0f); + mMeshes.back()->getTransform().scale(0.25f); mMeshes.push_back( new Qtk::MeshRenderer("bottomTriangle", Triangle(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(-7.0f, -2.0f, -2.0f); - mMeshes.back()->mTransform.scale(0.25f); + mMeshes.back()->getTransform().setTranslation(-7.0f, -2.0f, -2.0f); + mMeshes.back()->getTransform().scale(0.25f); mMeshes.back()->setDrawType(GL_LINE_LOOP); - // This function changes values we have allocated in a buffer, so init() after mMeshes.back()->setColor(GREEN); @@ -83,31 +93,31 @@ void ExampleScene::init() { new Qtk::Model("backpack", ":/models/backpack/backpack.obj")); // Sometimes model textures need flipped in certain directions mModels.back()->flipTexture("diffuse.jpg", false, true); - mModels.back()->mTransform.setTranslation(0.0f, 0.0f, -10.0f); + mModels.back()->getTransform().setTranslation(0.0f, 0.0f, -10.0f); mModels.push_back(new Qtk::Model("bird", ":/models/bird/bird.obj")); - mModels.back()->mTransform.setTranslation(2.0f, 2.0f, -10.0f); + mModels.back()->getTransform().setTranslation(2.0f, 2.0f, -10.0f); // Sometimes the models are very large - mModels.back()->mTransform.scale(0.0025f); - mModels.back()->mTransform.rotate(-110.0f, 0.0f, 1.0f, 0.0f); + mModels.back()->getTransform().scale(0.0025f); + mModels.back()->getTransform().rotate(-110.0f, 0.0f, 1.0f, 0.0f); mModels.push_back(new Qtk::Model("lion", ":/models/lion/lion.obj")); - mModels.back()->mTransform.setTranslation(-3.0f, -1.0f, -10.0f); - mModels.back()->mTransform.scale(0.15f); + mModels.back()->getTransform().setTranslation(-3.0f, -1.0f, -10.0f); + mModels.back()->getTransform().scale(0.15f); mModels.push_back( new Qtk::Model("alien", ":/models/alien-hominid/alien.obj")); - mModels.back()->mTransform.setTranslation(2.0f, -1.0f, -5.0f); - mModels.back()->mTransform.scale(0.15f); + mModels.back()->getTransform().setTranslation(2.0f, -1.0f, -5.0f); + mModels.back()->getTransform().scale(0.15f); mModels.push_back(new Qtk::Model("scythe", ":/models/scythe/scythe.obj")); - mModels.back()->mTransform.setTranslation(-6.0f, 0.0f, -10.0f); - mModels.back()->mTransform.rotate(-90.0f, 1.0f, 0.0f, 0.0f); - mModels.back()->mTransform.rotate(90.0f, 0.0f, 1.0f, 0.0f); + mModels.back()->getTransform().setTranslation(-6.0f, 0.0f, -10.0f); + mModels.back()->getTransform().rotate(-90.0f, 1.0f, 0.0f, 0.0f); + mModels.back()->getTransform().rotate(90.0f, 0.0f, 1.0f, 0.0f); mModels.push_back( new Qtk::Model("masterChief", ":/models/spartan/spartan.obj")); - mModels.back()->mTransform.setTranslation(-1.5f, 0.5f, -2.0f); + mModels.back()->getTransform().setTranslation(-1.5f, 0.5f, -2.0f); // @@ -115,7 +125,7 @@ void ExampleScene::init() { /* Phong lighting example on a basic cube. */ mTestPhong = new Qtk::MeshRenderer("phong", Qtk::Cube()); - mTestPhong->mTransform.setTranslation(3.0f, 0.0f, -2.0f); + mTestPhong->getTransform().setTranslation(3.0f, 0.0f, -2.0f); // NOTE: You no longer need to manually bind shader program to set uniforms. // + You can still bind it if you want to for performance reasons. // + Qtk will only bind / release if the shader program is not already bound. @@ -139,12 +149,12 @@ void ExampleScene::init() { // + We refer to the position of this object in draw() to update lighting. mMeshes.push_back( new Qtk::MeshRenderer("phongLight", Triangle(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(3.0f, 2.0f, -2.0f); - mMeshes.back()->mTransform.scale(0.25f); + mMeshes.back()->getTransform().setTranslation(3.0f, 2.0f, -2.0f); + mMeshes.back()->getTransform().scale(0.25f); /* Example of a cube with no lighting applied */ mMeshes.push_back(new Qtk::MeshRenderer("noLight", Cube(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, -2.0f); + mMeshes.back()->getTransform().setTranslation(5.0f, 0.0f, -2.0f); mMeshes.back()->setShaders( ":/solid-perspective.vert", ":/solid-perspective.frag"); mMeshes.back()->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f)); @@ -152,7 +162,7 @@ void ExampleScene::init() { /* Initialize Ambient example cube */ mTestAmbient = new Qtk::MeshRenderer("ambient", Cube()); - mTestAmbient->mTransform.setTranslation(7.0f, 0.0f, -2.0f); + mTestAmbient->getTransform().setTranslation(7.0f, 0.0f, -2.0f); mTestAmbient->setShaders(":/solid-ambient.vert", ":/solid-ambient.frag"); // Changing these uniform values will alter lighting effects. mTestAmbient->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f)); @@ -163,7 +173,7 @@ void ExampleScene::init() { /* Initialize Diffuse example cube */ mTestDiffuse = new Qtk::MeshRenderer("diffuse", Cube()); - mTestDiffuse->mTransform.setTranslation(9.0f, 0.0f, -2.0f); + mTestDiffuse->getTransform().setTranslation(9.0f, 0.0f, -2.0f); mTestDiffuse->setShaders(":/solid-diffuse.vert", ":/solid-diffuse.frag"); mTestDiffuse->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f)); mTestDiffuse->setUniform("uLightColor", QVector3D(1.0f, 1.0f, 1.0f)); @@ -173,12 +183,12 @@ void ExampleScene::init() { // Diffuse lighting example light source. This is just for visual reference. mMeshes.push_back( new Qtk::MeshRenderer("diffuseLight", Triangle(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(9.0f, 2.0f, -2.0f); - mMeshes.back()->mTransform.scale(0.25f); + mMeshes.back()->getTransform().setTranslation(9.0f, 2.0f, -2.0f); + mMeshes.back()->getTransform().scale(0.25f); /* Initialize Specular example cube */ mTestSpecular = new Qtk::MeshRenderer("specular", Cube()); - mTestSpecular->mTransform.setTranslation(11.0f, 0.0f, -2.0f); + mTestSpecular->getTransform().setTranslation(11.0f, 0.0f, -2.0f); mTestSpecular->setShaders(":/solid-specular.vert", ":/solid-specular.frag"); mTestSpecular->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f)); mTestSpecular->setUniform("uLightColor", QVector3D(1.0f, 1.0f, 1.0f)); @@ -190,13 +200,13 @@ void ExampleScene::init() { // Specular lighting example light source. This is just for visual reference. mMeshes.push_back( new Qtk::MeshRenderer("specularLight", Triangle(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(11.0f, 2.0f, -2.0f); - mMeshes.back()->mTransform.scale(0.25f); + mMeshes.back()->getTransform().setTranslation(11.0f, 2.0f, -2.0f); + mMeshes.back()->getTransform().scale(0.25f); /* Test basic cube with phong.vert and phong.frag shaders */ mMeshes.push_back(new Qtk::MeshRenderer("testPhong", Cube(QTK_DRAW_ARRAYS))); - mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, 10.0f); + mMeshes.back()->getTransform().setTranslation(5.0f, 0.0f, 10.0f); mMeshes.back()->setShaders(":/phong.vert", ":/phong.frag"); // WARNING: Set color before reallocating normals. mMeshes.back()->setColor(QVector3D(0.0f, 0.25f, 0.0f)); @@ -217,8 +227,8 @@ void ExampleScene::init() { // Light source for testPhong cube mMeshes.push_back( new Qtk::MeshRenderer("testLight", Triangle(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(5.0f, 1.25f, 10.0f); - mMeshes.back()->mTransform.scale(0.25f); + mMeshes.back()->getTransform().setTranslation(5.0f, 1.25f, 10.0f); + mMeshes.back()->getTransform().scale(0.25f); mMeshes.back()->setDrawType(GL_LINE_LOOP); mMeshes.back()->setColor(RED); @@ -230,8 +240,8 @@ void ExampleScene::init() { mModels.push_back(new Qtk::Model( "alienTest", ":/models/alien-hominid/alien.obj", ":/model-specular.vert", ":/model-specular.frag")); - mModels.back()->mTransform.setTranslation(3.0f, -1.0f, 10.0f); - mModels.back()->mTransform.scale(0.15f); + mModels.back()->getTransform().setTranslation(3.0f, -1.0f, 10.0f); + mModels.back()->getTransform().scale(0.15f); mModels.back()->setUniform("uMaterial.ambient", QVector3D(1.0f, 1.0f, 1.0f)); mModels.back()->setUniform("uMaterial.diffuse", QVector3D(1.0f, 1.0f, 1.0f)); mModels.back()->setUniform("uMaterial.specular", QVector3D(1.0f, 1.0f, 1.0f)); @@ -247,8 +257,8 @@ void ExampleScene::init() { // Light source for alienTest object. mMeshes.push_back(new Qtk::MeshRenderer( "alienTestLight", Triangle(Qtk::QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(4.0f, 1.5f, 10.0f); - mMeshes.back()->mTransform.scale(0.25f); + mMeshes.back()->getTransform().setTranslation(4.0f, 1.5f, 10.0f); + mMeshes.back()->getTransform().scale(0.25f); // This function changes values we have allocated in a buffer, so init() after mMeshes.back()->setColor(GREEN); @@ -256,8 +266,8 @@ void ExampleScene::init() { mModels.push_back(new Qtk::Model( "spartanTest", ":/models/spartan/spartan.obj", ":/model-normals.vert", ":/model-normals.frag")); - mModels.back()->mTransform.setTranslation(0.0f, -1.0f, 10.0f); - mModels.back()->mTransform.scale(2.0f); + mModels.back()->getTransform().setTranslation(0.0f, -1.0f, 10.0f); + mModels.back()->getTransform().scale(2.0f); mModels.back()->setUniform("uMaterial.ambient", QVector3D(1.0f, 1.0f, 1.0f)); mModels.back()->setUniform("uMaterial.diffuse", QVector3D(1.0f, 1.0f, 1.0f)); mModels.back()->setUniform("uMaterial.specular", QVector3D(1.0f, 1.0f, 1.0f)); @@ -272,8 +282,8 @@ void ExampleScene::init() { // Light source for spartanTest object. mMeshes.push_back( new Qtk::MeshRenderer("spartanTestLight", Triangle(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(1.0f, 1.5f, 10.0f); - mMeshes.back()->mTransform.scale(0.25f); + mMeshes.back()->getTransform().setTranslation(1.0f, 1.5f, 10.0f); + mMeshes.back()->getTransform().scale(0.25f); // This function changes values we have allocated in a buffer, so init() after mMeshes.back()->setColor(GREEN); @@ -284,14 +294,14 @@ void ExampleScene::init() { // RGB Normals cube to show normals are correct with QTK_DRAW_ARRAYS mMeshes.push_back( new Qtk::MeshRenderer("rgbNormalsCubeArraysTest", Cube(QTK_DRAW_ARRAYS))); - mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, 4.0f); + mMeshes.back()->getTransform().setTranslation(5.0f, 0.0f, 4.0f); mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag"); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); // RGB Normals cube to show normals are correct with QTK_DRAW_ELEMENTS_NORMALS mMeshes.push_back(new Qtk::MeshRenderer( "rgbNormalsCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS))); - mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, 2.0f); + mMeshes.back()->getTransform().setTranslation(5.0f, 0.0f, 2.0f); mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag"); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); @@ -299,7 +309,7 @@ void ExampleScene::init() { crateTexture.setTexture(":/crate.png"); Cube cube; auto * m = new MeshRenderer("Test Crate", Cube(QTK_DRAW_ARRAYS)); - m->mTransform.setTranslation(0, 0, 13); + m->getTransform().setTranslation(0, 0, 13); m->setShaders(":/texture2d.vert", ":/texture2d.frag"); m->setTexture(crateTexture); m->setUniform("uTexture", 0); @@ -313,7 +323,7 @@ void ExampleScene::init() { // + This is because the same position must use different UV coordinates mMeshes.push_back( new Qtk::MeshRenderer("uvCubeArraysTest", Cube(QTK_DRAW_ARRAYS))); - mMeshes.back()->mTransform.setTranslation(-3.0f, 0.0f, -2.0f); + mMeshes.back()->getTransform().setTranslation(-3.0f, 0.0f, -2.0f); mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag"); mMeshes.back()->setTexture(crateTexture); mMeshes.back()->setUniform("uTexture", 0); @@ -322,7 +332,7 @@ void ExampleScene::init() { // Test drawing a cube with texture coordinates using glDrawElements mMeshes.push_back(new Qtk::MeshRenderer( "uvCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS))); - mMeshes.back()->mTransform.setTranslation(-1.7f, 0.0f, -2.0f); + mMeshes.back()->getTransform().setTranslation(-1.7f, 0.0f, -2.0f); mMeshes.back()->setTexture(":/crate.png"); mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag"); mMeshes.back()->bindShaders(); @@ -330,14 +340,14 @@ void ExampleScene::init() { mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); mMeshes.back()->reallocateTexCoords(mMeshes.back()->getTexCoords(), 3); mMeshes.back()->releaseShaders(); - mMeshes.back()->mTransform.rotate(45.0f, 0.0f, 1.0f, 0.0f); + mMeshes.back()->getTransform().rotate(45.0f, 0.0f, 1.0f, 0.0f); // Texturing a cube using a cube map // + Cube map texturing works with both QTK_DRAW_ARRAYS and QTK_DRAW_ELEMENTS mMeshes.push_back( new Qtk::MeshRenderer("testCubeMap", Cube(QTK_DRAW_ELEMENTS))); - mMeshes.back()->mTransform.setTranslation(-3.0f, 1.0f, -2.0f); - mMeshes.back()->mTransform.setRotation(45.0f, 0.0f, 1.0f, 0.0f); + mMeshes.back()->getTransform().setTranslation(-3.0f, 1.0f, -2.0f); + mMeshes.back()->getTransform().setRotation(45.0f, 0.0f, 1.0f, 0.0f); mMeshes.back()->setShaders( ":/texture-cubemap.vert", ":/texture-cubemap.frag"); mMeshes.back()->setCubeMap(":/crate.png"); @@ -348,28 +358,28 @@ void ExampleScene::init() { // + Apply RGB normals shader and spin the cube for a neat effect mMeshes.push_back( new Qtk::MeshRenderer("rgbNormalsCube", Cube(QTK_DRAW_ARRAYS))); - mMeshes.back()->mTransform.setTranslation(5.0f, 2.0f, -2.0f); + mMeshes.back()->getTransform().setTranslation(5.0f, 2.0f, -2.0f); mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag"); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); // RGB Normals triangle to show normals are correct with QTK_DRAW_ARRAYS mMeshes.push_back(new Qtk::MeshRenderer( "rgbTriangleArraysTest", Triangle(QTK_DRAW_ARRAYS))); - mMeshes.back()->mTransform.setTranslation(7.0f, 0.0f, 2.0f); + mMeshes.back()->getTransform().setTranslation(7.0f, 0.0f, 2.0f); mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag"); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); // RGB Normals triangle to show normals are correct with QTK_DRAW_ELEMENTS mMeshes.push_back(new Qtk::MeshRenderer( "rgbTriangleElementsTest", Triangle(QTK_DRAW_ELEMENTS_NORMALS))); - mMeshes.back()->mTransform.setTranslation(7.0f, 0.0f, 4.0f); + mMeshes.back()->getTransform().setTranslation(7.0f, 0.0f, 4.0f); mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag"); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); // Test drawing triangle with glDrawArrays with texture coordinates mMeshes.push_back( new Qtk::MeshRenderer("testTriangleArraysUV", Triangle(QTK_DRAW_ARRAYS))); - mMeshes.back()->mTransform.setTranslation(-3.0f, 2.0f, -2.0f); + mMeshes.back()->getTransform().setTranslation(-3.0f, 2.0f, -2.0f); mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag"); mMeshes.back()->setTexture(":/crate.png"); @@ -379,7 +389,7 @@ void ExampleScene::init() { // Test drawing triangle with glDrawElements with texture coordinates mMeshes.push_back(new Qtk::MeshRenderer( "testTriangleElementsUV", Triangle(QTK_DRAW_ELEMENTS_NORMALS))); - mMeshes.back()->mTransform.setTranslation(-2.5f, 0.0f, -1.0f); + mMeshes.back()->getTransform().setTranslation(-2.5f, 0.0f, -1.0f); mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag"); mMeshes.back()->setTexture(":/crate.png"); mMeshes.back()->setUniform("uTexture", 0); @@ -402,10 +412,10 @@ void ExampleScene::draw() { mTestPhong->bindShaders(); mTestPhong->setUniform( "uModelInverseTransposed", - mTestPhong->mTransform.toMatrix().normalMatrix()); + mTestPhong->getTransform().toMatrix().normalMatrix()); mTestPhong->setUniform( "uLightPosition", - MeshRenderer::getInstance("phongLight")->mTransform.getTranslation()); + MeshRenderer::getInstance("phongLight")->getTransform().getTranslation()); mTestPhong->setUniform( "uCameraPosition", ExampleScene::getCamera().getTransform().getTranslation()); @@ -422,10 +432,11 @@ void ExampleScene::draw() { mTestDiffuse->bindShaders(); mTestDiffuse->setUniform( "uModelInverseTransposed", - mTestDiffuse->mTransform.toMatrix().normalMatrix()); + mTestDiffuse->getTransform().toMatrix().normalMatrix()); mTestDiffuse->setUniform( - "uLightPosition", - MeshRenderer::getInstance("diffuseLight")->mTransform.getTranslation()); + "uLightPosition", MeshRenderer::getInstance("diffuseLight") + ->getTransform() + .getTranslation()); mTestDiffuse->setUniform( "uCameraPosition", ExampleScene::getCamera().getTransform().getTranslation()); @@ -435,10 +446,11 @@ void ExampleScene::draw() { mTestSpecular->bindShaders(); mTestSpecular->setUniform( "uModelInverseTransposed", - mTestSpecular->mTransform.toMatrix().normalMatrix()); + mTestSpecular->getTransform().toMatrix().normalMatrix()); mTestSpecular->setUniform( - "uLightPosition", - MeshRenderer::getInstance("specularLight")->mTransform.getTranslation()); + "uLightPosition", MeshRenderer::getInstance("specularLight") + ->getTransform() + .getTranslation()); mTestSpecular->setUniform( "uCameraPosition", ExampleScene::getCamera().getTransform().getTranslation()); @@ -447,44 +459,52 @@ void ExampleScene::draw() { } void ExampleScene::update() { - auto position = - MeshRenderer::getInstance("alienTestLight")->mTransform.getTranslation(); + auto mySpartan = Model::getInstance("My spartan"); + mySpartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f); + + auto myCube = MeshRenderer::getInstance("My cube"); + myCube->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", ExampleScene::getCamera().getTransform().getTranslation()); - auto posMatrix = alien->mTransform.toMatrix(); + auto posMatrix = alien->getTransform().toMatrix(); alien->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix()); alien->setUniform("uMVP.model", posMatrix); alien->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix()); alien->setUniform("uMVP.projection", ExampleScene::getProjectionMatrix()); - alien->mTransform.rotate(0.75f, 0.0f, 1.0f, 0.0f); + alien->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f); position = MeshRenderer::getInstance("spartanTestLight") - ->mTransform.getTranslation(); + ->getTransform() + .getTranslation(); auto spartan = Model::getInstance("spartanTest"); spartan->setUniform("uLight.position", position); spartan->setUniform( "uCameraPosition", ExampleScene::getCamera().getTransform().getTranslation()); - posMatrix = spartan->mTransform.toMatrix(); + posMatrix = spartan->getTransform().toMatrix(); spartan->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix()); spartan->setUniform("uMVP.model", posMatrix); spartan->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix()); spartan->setUniform("uMVP.projection", ExampleScene::getProjectionMatrix()); - spartan->mTransform.rotate(0.75f, 0.0f, 1.0f, 0.0f); + spartan->getTransform().rotate(0.75f, 0.0f, 1.0f, 0.0f); auto phong = MeshRenderer::getInstance("testPhong"); - phong->mTransform.rotate(0.75f, 1.0f, 0.5f, 0.0f); + phong->getTransform().rotate(0.75f, 1.0f, 0.5f, 0.0f); phong->bindShaders(); position = - MeshRenderer::getInstance("testLight")->mTransform.getTranslation(); + MeshRenderer::getInstance("testLight")->getTransform().getTranslation(); phong->setUniform("uLight.position", position); phong->setUniform( "uCameraPosition", ExampleScene::getCamera().getTransform().getTranslation()); - posMatrix = phong->mTransform.toMatrix(); + posMatrix = phong->getTransform().toMatrix(); phong->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix()); phong->setUniform("uMVP.model", posMatrix); phong->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix()); @@ -492,46 +512,56 @@ void ExampleScene::update() { phong->releaseShaders(); // Rotate lighting example cubes - mTestPhong->mTransform.rotate(0.75f, 0.5f, 0.3f, 0.2f); - MeshRenderer::getInstance("noLight")->mTransform.rotate( + mTestPhong->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f); + MeshRenderer::getInstance("noLight")->getTransform().rotate( 0.75f, 0.5f, 0.3f, 0.2f); - mTestAmbient->mTransform.rotate(0.75f, 0.5f, 0.3f, 0.2f); - mTestDiffuse->mTransform.rotate(0.75f, 0.5f, 0.3f, 0.2f); - mTestSpecular->mTransform.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); // Examples of various translations and rotations // Rotate in multiple directions simultaneously MeshRenderer::getInstance("rgbNormalsCube") - ->mTransform.rotate(0.75f, 0.2f, 0.4f, 0.6f); + ->getTransform() + .rotate(0.75f, 0.2f, 0.4f, 0.6f); // Pitch forward and roll sideways MeshRenderer::getInstance("leftTriangle") - ->mTransform.rotate(0.75f, 1.0f, 0.0f, 0.0f); + ->getTransform() + .rotate(0.75f, 1.0f, 0.0f, 0.0f); MeshRenderer::getInstance("rightTriangle") - ->mTransform.rotate(0.75f, 0.0f, 0.0f, 1.0f); + ->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")->mTransform.getTranslation().x(); + float posX = MeshRenderer::getInstance("topTriangle") + ->getTransform() + .getTranslation() + .x(); if(posX < limit || posX > limit + 4.0f) { translateX = -translateX; } MeshRenderer::getInstance("topTriangle") - ->mTransform.translate(translateX, 0.0f, 0.0f); + ->getTransform() + .translate(translateX, 0.0f, 0.0f); MeshRenderer::getInstance("bottomTriangle") - ->mTransform.translate(-translateX, 0.0f, 0.0f); + ->getTransform() + .translate(-translateX, 0.0f, 0.0f); // And lets rotate the triangles in two directions at once MeshRenderer::getInstance("topTriangle") - ->mTransform.rotate(0.75f, 0.2f, 0.0f, 0.4f); + ->getTransform() + .rotate(0.75f, 0.2f, 0.0f, 0.4f); MeshRenderer::getInstance("bottomTriangle") - ->mTransform.rotate(0.75f, 0.0f, 0.2f, 0.4f); + ->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") - ->mTransform.rotate(0.75f, 0.2f, 0.4f, 0.6f); + ->getTransform() + .rotate(0.75f, 0.2f, 0.4f, 0.6f); } diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 31a889f..a7a912e 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -1,7 +1,7 @@ /*############################################################################## ## Author: Shaun Reed ## ## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ## -## About: MainWindow for creating an example Qt application using QtkWidget ## +## About: MainWindow for creating an example Qt application ## ## ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ## ##############################################################################*/ diff --git a/app/mainwindow.h b/app/mainwindow.h index 11ec7df..dc83675 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -1,7 +1,7 @@ /*############################################################################## ## Author: Shaun Reed ## ## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ## -## About: MainWindow for creating an example Qt application using QtkWidget ## +## About: MainWindow for creating an example Qt application ## ## ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ## ##############################################################################*/ diff --git a/src/mesh.cpp b/src/mesh.cpp index 2b1266e..a714582 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -13,6 +13,9 @@ using namespace Qtk; Cube::Cube(DrawMode mode) { mDrawMode = mode; switch(mode) { + // The order of the following assignment values helps to visualize. + // clang-format off + // Cube data for use with glDrawArrays case QTK_DRAW_ARRAYS: mIndices = {/* No indices needed for glDrawArrays */}; @@ -20,51 +23,76 @@ Cube::Cube(DrawMode mode) { mNormals = {FACE_FRONT, FACE_BACK, FACE_TOP, FACE_BOTTOM, FACE_LEFT, FACE_RIGHT}; - mVertices = {// Face 1 (Front) - VERTEX_FTR, VERTEX_FTL, VERTEX_FBL, VERTEX_FBL, VERTEX_FBR, - VERTEX_FTR, - // Face 2 (Back) - VERTEX_BBR, VERTEX_BTL, VERTEX_BTR, VERTEX_BTL, VERTEX_BBR, - VERTEX_BBL, - // Face 3 (Top) - VERTEX_FTR, VERTEX_BTR, VERTEX_BTL, VERTEX_BTL, VERTEX_FTL, - VERTEX_FTR, - // Face 4 (Bottom) - VERTEX_FBR, VERTEX_FBL, VERTEX_BBL, VERTEX_BBL, VERTEX_BBR, - VERTEX_FBR, - // Face 5 (Left) - VERTEX_FBL, VERTEX_FTL, VERTEX_BTL, VERTEX_FBL, VERTEX_BTL, - VERTEX_BBL, - // Face 6 (Right) - VERTEX_FTR, VERTEX_FBR, VERTEX_BBR, VERTEX_BBR, VERTEX_BTR, - VERTEX_FTR}; + // We're drawing triangles to construct the geometry of a cube. + // Each triangle is made up of three points. + // The entire cube has 12 triangles to make 6 square faces of the cube. + mVertices = { + // Face 1 (Front) + VERTEX_FTR, VERTEX_FTL, VERTEX_FBL, + VERTEX_FBL, VERTEX_FBR, VERTEX_FTR, + // Face 2 (Back) + VERTEX_BBR, VERTEX_BTL, VERTEX_BTR, + VERTEX_BTL, VERTEX_BBR, VERTEX_BBL, + // Face 3 (Top) + VERTEX_FTR, VERTEX_BTR, VERTEX_BTL, + VERTEX_BTL, VERTEX_FTL, VERTEX_FTR, + // Face 4 (Bottom) + VERTEX_FBR, VERTEX_FBL, VERTEX_BBL, + VERTEX_BBL, VERTEX_BBR, VERTEX_FBR, + // Face 5 (Left) + VERTEX_FBL, VERTEX_FTL, VERTEX_BTL, + VERTEX_FBL, VERTEX_BTL, VERTEX_BBL, + // Face 6 (Right) + VERTEX_FTR, VERTEX_FBR, VERTEX_BBR, + VERTEX_BBR, VERTEX_BTR, VERTEX_FTR + }; - mColors = {// Face 1 (Front) - RED, GREEN, BLUE, BLUE, WHITE, RED, - // Face 2 (Back) - YELLOW, CYAN, MAGENTA, CYAN, YELLOW, BLACK, - // Face 3 (Top) - RED, MAGENTA, CYAN, CYAN, GREEN, RED, - // Face 4 (Bottom) - WHITE, BLUE, BLACK, BLACK, YELLOW, WHITE, - // Face 5 (Left) - BLUE, GREEN, CYAN, BLUE, CYAN, BLACK, - // Face 6 (Right) - RED, WHITE, YELLOW, YELLOW, MAGENTA, RED}; + // Setting colors for each vertex that we defined above. + // These are defaults and can be overriden by the caller with setColor(). + // The colors below are interpolated from vertex to vertex. + mColors = { + // Face 1 (Front) + RED, GREEN, BLUE, + BLUE, WHITE, RED, + // Face 2 (Back) + YELLOW, CYAN, MAGENTA, + CYAN, YELLOW, BLACK, + // Face 3 (Top) + RED, MAGENTA, CYAN, + CYAN, GREEN, RED, + // Face 4 (Bottom) + WHITE, BLUE, BLACK, + BLACK, YELLOW, WHITE, + // Face 5 (Left) + BLUE, GREEN, CYAN, + BLUE, CYAN, BLACK, + // Face 6 (Right) + RED, WHITE, YELLOW, + YELLOW, MAGENTA, RED + }; - mTexCoords = {// Face 1 (Front) - UV_TOP, UV_ORIGIN, UV_RIGHT, UV_RIGHT, UV_CORNER, UV_TOP, - // Face 2 (Back) - UV_TOP, UV_RIGHT, UV_CORNER, UV_RIGHT, UV_TOP, UV_ORIGIN, - // Face 3 (Top) - UV_CORNER, UV_TOP, UV_ORIGIN, UV_ORIGIN, UV_RIGHT, - UV_CORNER, - // Face 4 (Bottom) - UV_TOP, UV_ORIGIN, UV_RIGHT, UV_RIGHT, UV_CORNER, UV_TOP, - // Face 5 (Left) - UV_TOP, UV_CORNER, UV_RIGHT, UV_TOP, UV_RIGHT, UV_ORIGIN, - // Face 6 (Right) - UV_TOP, UV_CORNER, UV_RIGHT, UV_RIGHT, UV_ORIGIN, UV_TOP}; + // Define texture coordinates for the cube. + // This defines the orientation of the texture when applied the object. + mTexCoords = { + // Face 1 (Front) + UV_TOP, UV_ORIGIN, UV_RIGHT, + UV_RIGHT, UV_CORNER, UV_TOP, + // Face 2 (Back) + UV_TOP, UV_RIGHT, UV_CORNER, + UV_RIGHT, UV_TOP, UV_ORIGIN, + // Face 3 (Top) + UV_CORNER, UV_TOP, UV_ORIGIN, + UV_ORIGIN, UV_RIGHT, UV_CORNER, + // Face 4 (Bottom) + UV_TOP, UV_ORIGIN, UV_RIGHT, + UV_RIGHT, UV_CORNER, UV_TOP, + // Face 5 (Left) + UV_TOP, UV_CORNER, UV_RIGHT, + UV_TOP, UV_RIGHT, UV_ORIGIN, + // Face 6 (Right) + UV_TOP, UV_CORNER, UV_RIGHT, + UV_RIGHT, UV_ORIGIN, UV_TOP + }; break; @@ -81,56 +109,64 @@ Cube::Cube(DrawMode mode) { VERTEX_FTR, VERTEX_FTL, VERTEX_FBL, VERTEX_FBR, // 4 5 6 7 VERTEX_BTR, VERTEX_BTL, VERTEX_BBL, VERTEX_BBR}; - mIndices = {// Face 1 (Front) - 0, 1, 2, 2, 3, 0, - // Face 2 (Back) - 7, 5, 4, 5, 7, 6, - // Face 3 (Top) - 0, 4, 5, 5, 1, 0, - // Face 4 (Bottom) - 3, 2, 6, 6, 7, 3, - // Face 5 (Left) - 2, 1, 5, 2, 5, 6, - // Face 6 (Right) - 0, 3, 7, 7, 4, 0}; + + mIndices = { + // Face 1 (Front) + 0, 1, 2, 2, 3, 0, + // Face 2 (Back) + 7, 5, 4, 5, 7, 6, + // Face 3 (Top) + 0, 4, 5, 5, 1, 0, + // Face 4 (Bottom) + 3, 2, 6, 6, 7, 3, + // Face 5 (Left) + 2, 1, 5, 2, 5, 6, + // Face 6 (Right) + 0, 3, 7, 7, 4, 0 + }; + break; // Cube shape data for using normals and UVs with glDrawElements case QTK_DRAW_ELEMENTS_NORMALS: mColors = {RED, GREEN, BLUE, WHITE, YELLOW, CYAN, MAGENTA, BLACK}; - mVertices = {// Face 1 (Front) - // 0 1 2 3 - VERTEX_FTL, VERTEX_FBL, VERTEX_FBR, VERTEX_FTR, - // Face 2 (Back) - // 4 5 6 7 - VERTEX_BTL, VERTEX_BBL, VERTEX_BBR, VERTEX_BTR, - // Face 3 (Top) - // 8 9 10 11 - VERTEX_FTL, VERTEX_BTL, VERTEX_BTR, VERTEX_FTR, - // Face 4 (Bottom) - // 12 13 14 15 - VERTEX_FBL, VERTEX_BBL, VERTEX_BBR, VERTEX_FBR, - // Face 5 (Left) - // 16 17 18 19 - VERTEX_FBL, VERTEX_BBL, VERTEX_BTL, VERTEX_FTL, - // Face 6 (Right) - // 20 21 22 23 - VERTEX_FBR, VERTEX_BBR, VERTEX_BTR, VERTEX_FTR}; + mVertices = { + // Face 1 (Front) + // 0 1 2 3 + VERTEX_FTL, VERTEX_FBL, VERTEX_FBR, VERTEX_FTR, + // Face 2 (Back) + // 4 5 6 7 + VERTEX_BTL, VERTEX_BBL, VERTEX_BBR, VERTEX_BTR, + // Face 3 (Top) + // 8 9 10 11 + VERTEX_FTL, VERTEX_BTL, VERTEX_BTR, VERTEX_FTR, + // Face 4 (Bottom) + // 12 13 14 15 + VERTEX_FBL, VERTEX_BBL, VERTEX_BBR, VERTEX_FBR, + // Face 5 (Left) + // 16 17 18 19 + VERTEX_FBL, VERTEX_BBL, VERTEX_BTL, VERTEX_FTL, + // Face 6 (Right) + // 20 21 22 23 + VERTEX_FBR, VERTEX_BBR, VERTEX_BTR, VERTEX_FTR + }; - mIndices = {// Face 1 (Front) - 0, 1, 2, 2, 3, 0, - // Face 2 (Back) - 4, 5, 6, 6, 7, 4, - // Face 3 (Top) - 8, 9, 10, 10, 11, 8, - // Face 4 (Bottom) - 12, 13, 14, 14, 15, 12, + mIndices = { + // Face 1 (Front) + 0, 1, 2, 2, 3, 0, + // Face 2 (Back) + 4, 5, 6, 6, 7, 4, + // Face 3 (Top) + 8, 9, 10, 10, 11, 8, + // Face 4 (Bottom) + 12, 13, 14, 14, 15, 12, + // Face 5 (Left) + 16, 17, 18, 18, 19, 16, + // Face 6 (Right) + 20, 21, 22, 22, 23, 20 + }; - // Face 5 (Left) - 16, 17, 18, 18, 19, 16, - // Face 6 (Right) - 20, 21, 22, 22, 23, 20}; mNormals = { VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, @@ -143,50 +179,27 @@ Cube::Cube(DrawMode mode) { mTexCoords = { // Face 1 (Front) - UV_TOP, - UV_RIGHT, - UV_CORNER, - UV_RIGHT, - UV_TOP, - UV_ORIGIN, + UV_TOP, UV_RIGHT, UV_CORNER, + UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 2 (Back) - UV_TOP, - UV_RIGHT, - UV_CORNER, - UV_RIGHT, - UV_TOP, - UV_ORIGIN, + UV_TOP, UV_RIGHT, UV_CORNER, + UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 3 (Top) - UV_TOP, - UV_RIGHT, - UV_CORNER, - UV_RIGHT, - UV_TOP, - UV_ORIGIN, + UV_TOP, UV_RIGHT, UV_CORNER, + UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 4 (Bottom) - UV_TOP, - UV_RIGHT, - UV_CORNER, - UV_RIGHT, - UV_TOP, - UV_ORIGIN, + UV_TOP, UV_RIGHT, UV_CORNER, + UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 5 (Left) - UV_TOP, - UV_RIGHT, - UV_CORNER, - UV_RIGHT, - UV_TOP, - UV_ORIGIN, + UV_TOP, UV_RIGHT, UV_CORNER, + UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 6 (Right) - UV_TOP, - UV_RIGHT, - UV_CORNER, - UV_RIGHT, - UV_TOP, - UV_ORIGIN, + UV_TOP, UV_RIGHT, UV_CORNER, + UV_RIGHT, UV_TOP, UV_ORIGIN, }; break; + // clang-format on } } @@ -194,6 +207,8 @@ Triangle::Triangle(DrawMode mode) { mDrawMode = mode; const QVector3D triangleTop = QVector3D(0.0f, 0.5f, 0.0f); switch(mode) { + // clang-format off + case QTK_DRAW_ARRAYS: mIndices = {/* No indices needed for glDrawArrays */}; @@ -201,29 +216,17 @@ Triangle::Triangle(DrawMode mode) { mVertices = { // Bottom face (Base of the pyramid) - VERTEX_BBL, - VERTEX_BBR, - VERTEX_FBR, - VERTEX_FBR, - VERTEX_FBL, - VERTEX_BBL, + VERTEX_BBL, VERTEX_BBR, VERTEX_FBR, + VERTEX_FBR, VERTEX_FBL, VERTEX_BBL, // Front face - VERTEX_FBL, - VERTEX_FBR, - triangleTop, + VERTEX_FBL, VERTEX_FBR, triangleTop, // Back face - VERTEX_BBR, - VERTEX_BBL, - triangleTop, + VERTEX_BBR, VERTEX_BBL, triangleTop, // Left face - VERTEX_BBL, - VERTEX_FBL, - triangleTop, + VERTEX_BBL, VERTEX_FBL, triangleTop, // Right face - VERTEX_FBR, - VERTEX_BBR, - triangleTop, + VERTEX_FBR, VERTEX_BBR, triangleTop, }; // Find normals for each triangle of the mesh @@ -238,29 +241,17 @@ Triangle::Triangle(DrawMode mode) { mTexCoords = { // Bottom face (Base of the pyramid) - UV_ORIGIN, - UV_RIGHT, - UV_CORNER, - UV_CORNER, - UV_TOP, - UV_ORIGIN, + UV_ORIGIN, UV_RIGHT, UV_CORNER, + UV_CORNER, UV_TOP, UV_ORIGIN, // Front face - UV_ORIGIN, - UV_RIGHT, - UV_CORNER, + UV_ORIGIN, UV_RIGHT, UV_CORNER, // Back face - UV_ORIGIN, - UV_RIGHT, - UV_CORNER, + UV_ORIGIN, UV_RIGHT, UV_CORNER, // Left face - UV_ORIGIN, - UV_RIGHT, - UV_CORNER, + UV_ORIGIN, UV_RIGHT, UV_CORNER, // Right face - UV_ORIGIN, - UV_RIGHT, - UV_CORNER, + UV_ORIGIN, UV_RIGHT, UV_CORNER, }; break; @@ -296,34 +287,22 @@ Triangle::Triangle(DrawMode mode) { mVertices = { // Bottom face // 0 1 2 - VERTEX_FBL, - VERTEX_FBR, - VERTEX_BBL, + VERTEX_FBL, VERTEX_FBR, VERTEX_BBL, // 3 4 5 - VERTEX_BBR, - VERTEX_FBR, - VERTEX_BBL, + VERTEX_BBR, VERTEX_FBR, VERTEX_BBL, // Front face // 6 7 8 - VERTEX_FBL, - VERTEX_FBR, - triangleTop, + VERTEX_FBL, VERTEX_FBR, triangleTop, // Back face // 9 10 11 - VERTEX_BBR, - VERTEX_BBL, - triangleTop, + VERTEX_BBR, VERTEX_BBL, triangleTop, // Left face // 12 13 14 - VERTEX_BBL, - VERTEX_FBL, - triangleTop, + VERTEX_BBL, VERTEX_FBL, triangleTop, // Right face // 15 16 17 - VERTEX_FBR, - VERTEX_BBR, - triangleTop, + VERTEX_FBR, VERTEX_BBR, triangleTop, }; mIndices = { @@ -350,30 +329,19 @@ Triangle::Triangle(DrawMode mode) { mTexCoords = { // Bottom face - UV_ORIGIN, - UV_RIGHT, - UV_TOP, - UV_CORNER, - UV_RIGHT, - UV_TOP, + UV_ORIGIN, UV_RIGHT, UV_TOP, + UV_CORNER, UV_RIGHT, UV_TOP, // Front face - UV_ORIGIN, - UV_RIGHT, - UV_CORNER, + UV_ORIGIN, UV_RIGHT, UV_CORNER, // Back face - UV_ORIGIN, - UV_RIGHT, - UV_CORNER, + UV_ORIGIN, UV_RIGHT, UV_CORNER, // Left face - UV_ORIGIN, - UV_RIGHT, - UV_CORNER, + UV_ORIGIN, UV_RIGHT, UV_CORNER, // Right face - UV_ORIGIN, - UV_RIGHT, - UV_CORNER, + UV_ORIGIN, UV_RIGHT, UV_CORNER, }; break; + // clang-format on } } diff --git a/src/mesh.h b/src/mesh.h index a669c31..14934be 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -46,21 +46,22 @@ namespace Qtk { #define VECTOR_ONE QVector3D(1.0f, 1.0f, 1.0f) #define VECTOR_ZERO QVector3D(0.0f, 0.0f, 0.0f) +// clang-format off // A series of direction vectors to represent cube face normal -#define FACE_TOP \ - VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_UP -#define FACE_BOTTOM \ - VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN -#define FACE_LEFT \ - VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT -#define FACE_RIGHT \ - VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, \ - VECTOR_RIGHT -#define FACE_FRONT \ - VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, \ - VECTOR_FORWARD, VECTOR_FORWARD -#define FACE_BACK \ - VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK +#define FACE_TOP VECTOR_UP, VECTOR_UP, VECTOR_UP, \ + VECTOR_UP, VECTOR_UP, VECTOR_UP +#define FACE_BOTTOM VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, \ + VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN +#define FACE_LEFT VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, \ + VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT +#define FACE_RIGHT VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, \ + VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT +#define FACE_FRONT VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, \ + VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD +#define FACE_BACK VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, \ + VECTOR_BACK, VECTOR_BACK, VECTOR_BACK +// clang-format on + // Colors using QVector3Ds as RGB values #define WHITE VECTOR_ONE diff --git a/src/meshrenderer.h b/src/meshrenderer.h index 4d8a876..f8a64b9 100644 --- a/src/meshrenderer.h +++ b/src/meshrenderer.h @@ -110,7 +110,7 @@ namespace Qtk { } /************************************************************************* - * Getters + * Accessors ************************************************************************/ /** @@ -120,6 +120,8 @@ namespace Qtk { */ static MeshRenderer * getInstance(const QString & name); + Transform3D & getTransform() { return mTransform; } + private: /************************************************************************* * Private Members diff --git a/src/model.h b/src/model.h index 264988b..4c654bd 100644 --- a/src/model.h +++ b/src/model.h @@ -29,7 +29,7 @@ namespace Qtk { /** - * 3D models will store this data for each vertex in geometry + * 3D models will store this data for each vertex in geometry. */ struct QTKAPI ModelVertex { QVector3D mPosition; @@ -199,13 +199,7 @@ namespace Qtk { */ static Model * getInstance(const char * name); - /************************************************************************* - * Public Members - ************************************************************************/ - - /* The position of this model in 3D space */ - // TODO: Make private - Transform3D mTransform; + Transform3D & getTransform() { return mTransform; } private: /************************************************************************* @@ -246,6 +240,9 @@ namespace Qtk { * Private Members ************************************************************************/ + /* The position of this model in 3D space */ + Transform3D mTransform; + /* Static QHash used to store and access models globally. */ static ModelManager mManager; diff --git a/src/object.h b/src/object.h index 3e5ae36..e281d40 100644 --- a/src/object.h +++ b/src/object.h @@ -51,19 +51,31 @@ namespace Qtk { * Accessors ************************************************************************/ - inline const Colors & getColors() { return mShape.mColors; } + [[nodiscard]] inline const Colors & getColors() const { + return mShape.mColors; + } - inline const Indices & getIndexData() { return mShape.mIndices; } + [[nodiscard]] inline const Indices & getIndexData() const { + return mShape.mIndices; + } - inline const Normals & getNormals() { return mShape.mNormals; } + [[nodiscard]] inline const Normals & getNormals() const { + return mShape.mNormals; + } [[nodiscard]] inline const Shape & getShape() const { return mShape; } - inline const TexCoords & getTexCoords() { return mShape.mTexCoords; } + [[nodiscard]] inline const TexCoords & getTexCoords() const { + return mShape.mTexCoords; + } - inline Texture & getTexture() { return mTexture; } + [[nodiscard]] inline const Texture & getTexture() const { + return mTexture; + } - inline const Vertices & getVertices() { return mShape.mVertices; } + [[nodiscard]] inline const Vertices & getVertices() const { + return mShape.mVertices; + } /************************************************************************* * Setters @@ -118,25 +130,19 @@ namespace Qtk { mProgram.release(); } - /************************************************************************* - * Public Members - ************************************************************************/ - - QOpenGLBuffer mVBO, mNBO; - QOpenGLVertexArrayObject mVAO; - - Transform3D mTransform; - Shape mShape; - Texture mTexture; - const char * mName; - bool mBound; - private: /************************************************************************* * Private Members ************************************************************************/ QOpenGLShaderProgram mProgram; + QOpenGLBuffer mVBO, mNBO; + QOpenGLVertexArrayObject mVAO; + Transform3D mTransform; + Shape mShape; + Texture mTexture; + const char * mName; + bool mBound; }; } // namespace Qtk