Example of using new simple API

+ Clean up some TODOs
+ More docs
+ Disable clang-format in Mesh
This commit is contained in:
Shaun Reed 2022-11-26 12:20:44 -05:00
parent d37484d75c
commit 7f13b2d729
10 changed files with 371 additions and 330 deletions

View File

@ -179,9 +179,13 @@ configure_file(
# Add our Qt resources.qrc file to our application # Add our Qt resources.qrc file to our application
set( set(
QTK_APP_SOURCES app/main.cpp QTK_APP_SOURCES
app/examplescene.cpp app/examplescene.h app/main.cpp
app/mainwindow.cpp app/mainwindow.h app/mainwindow.ui app/examplescene.cpp
app/examplescene.h
app/mainwindow.cpp
app/mainwindow.h
app/mainwindow.ui
app/resourcemanager.h app/resourcemanager.h
src/qtkresources.h.in src/qtkresources.h.in
) )

View File

@ -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) [![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) [![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. Model loader using [Assimp](https://assimp.org/) within a Qt widget application.
You can import your own models within `app/examplescene.cpp`, inside the 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/) 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. 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 ### Source Builds
@ -132,7 +166,6 @@ Spartan with normals -
### QtkWidget in Qt Creator ### 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. 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. There is still some work to be done here, so there isn't a builtin way to add an additional view within the application.

View File

@ -44,35 +44,45 @@ ExampleScene::~ExampleScene() {
******************************************************************************/ ******************************************************************************/
void ExampleScene::init() { void ExampleScene::init() {
// Add a skybox to the scene using default cube map images and settings.
setSkybox(new Qtk::Skybox("Skybox")); 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 // Create simple shapes using MeshRenderer class and data in mesh.h
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("rightTriangle", Triangle(QTK_DRAW_ELEMENTS))); 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( mMeshes.push_back(
new Qtk::MeshRenderer("centerCube", Cube(QTK_DRAW_ELEMENTS))); 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( mMeshes.push_back(
new Qtk::MeshRenderer("leftTriangle", Triangle(QTK_DRAW_ELEMENTS))); 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.back()->setDrawType(GL_LINE_LOOP);
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("topTriangle", Triangle(QTK_DRAW_ELEMENTS))); new Qtk::MeshRenderer("topTriangle", Triangle(QTK_DRAW_ELEMENTS)));
mMeshes.back()->mTransform.setTranslation(-7.0f, 2.0f, -2.0f); mMeshes.back()->getTransform().setTranslation(-7.0f, 2.0f, -2.0f);
mMeshes.back()->mTransform.scale(0.25f); mMeshes.back()->getTransform().scale(0.25f);
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("bottomTriangle", Triangle(QTK_DRAW_ELEMENTS))); new Qtk::MeshRenderer("bottomTriangle", Triangle(QTK_DRAW_ELEMENTS)));
mMeshes.back()->mTransform.setTranslation(-7.0f, -2.0f, -2.0f); mMeshes.back()->getTransform().setTranslation(-7.0f, -2.0f, -2.0f);
mMeshes.back()->mTransform.scale(0.25f); mMeshes.back()->getTransform().scale(0.25f);
mMeshes.back()->setDrawType(GL_LINE_LOOP); mMeshes.back()->setDrawType(GL_LINE_LOOP);
// This function changes values we have allocated in a buffer, so init() after
mMeshes.back()->setColor(GREEN); mMeshes.back()->setColor(GREEN);
@ -83,31 +93,31 @@ void ExampleScene::init() {
new Qtk::Model("backpack", ":/models/backpack/backpack.obj")); new Qtk::Model("backpack", ":/models/backpack/backpack.obj"));
// Sometimes model textures need flipped in certain directions // Sometimes model textures need flipped in certain directions
mModels.back()->flipTexture("diffuse.jpg", false, true); 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.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 // Sometimes the models are very large
mModels.back()->mTransform.scale(0.0025f); mModels.back()->getTransform().scale(0.0025f);
mModels.back()->mTransform.rotate(-110.0f, 0.0f, 1.0f, 0.0f); mModels.back()->getTransform().rotate(-110.0f, 0.0f, 1.0f, 0.0f);
mModels.push_back(new Qtk::Model("lion", ":/models/lion/lion.obj")); mModels.push_back(new Qtk::Model("lion", ":/models/lion/lion.obj"));
mModels.back()->mTransform.setTranslation(-3.0f, -1.0f, -10.0f); mModels.back()->getTransform().setTranslation(-3.0f, -1.0f, -10.0f);
mModels.back()->mTransform.scale(0.15f); mModels.back()->getTransform().scale(0.15f);
mModels.push_back( mModels.push_back(
new Qtk::Model("alien", ":/models/alien-hominid/alien.obj")); new Qtk::Model("alien", ":/models/alien-hominid/alien.obj"));
mModels.back()->mTransform.setTranslation(2.0f, -1.0f, -5.0f); mModels.back()->getTransform().setTranslation(2.0f, -1.0f, -5.0f);
mModels.back()->mTransform.scale(0.15f); mModels.back()->getTransform().scale(0.15f);
mModels.push_back(new Qtk::Model("scythe", ":/models/scythe/scythe.obj")); mModels.push_back(new Qtk::Model("scythe", ":/models/scythe/scythe.obj"));
mModels.back()->mTransform.setTranslation(-6.0f, 0.0f, -10.0f); mModels.back()->getTransform().setTranslation(-6.0f, 0.0f, -10.0f);
mModels.back()->mTransform.rotate(-90.0f, 1.0f, 0.0f, 0.0f); mModels.back()->getTransform().rotate(-90.0f, 1.0f, 0.0f, 0.0f);
mModels.back()->mTransform.rotate(90.0f, 0.0f, 1.0f, 0.0f); mModels.back()->getTransform().rotate(90.0f, 0.0f, 1.0f, 0.0f);
mModels.push_back( mModels.push_back(
new Qtk::Model("masterChief", ":/models/spartan/spartan.obj")); 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. */ /* Phong lighting example on a basic cube. */
mTestPhong = new Qtk::MeshRenderer("phong", Qtk::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. // 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. // + 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. // + 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. // + We refer to the position of this object in draw() to update lighting.
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("phongLight", Triangle(QTK_DRAW_ELEMENTS))); new Qtk::MeshRenderer("phongLight", Triangle(QTK_DRAW_ELEMENTS)));
mMeshes.back()->mTransform.setTranslation(3.0f, 2.0f, -2.0f); mMeshes.back()->getTransform().setTranslation(3.0f, 2.0f, -2.0f);
mMeshes.back()->mTransform.scale(0.25f); mMeshes.back()->getTransform().scale(0.25f);
/* Example of a cube with no lighting applied */ /* Example of a cube with no lighting applied */
mMeshes.push_back(new Qtk::MeshRenderer("noLight", Cube(QTK_DRAW_ELEMENTS))); 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( mMeshes.back()->setShaders(
":/solid-perspective.vert", ":/solid-perspective.frag"); ":/solid-perspective.vert", ":/solid-perspective.frag");
mMeshes.back()->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f)); mMeshes.back()->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
@ -152,7 +162,7 @@ void ExampleScene::init() {
/* Initialize Ambient example cube */ /* Initialize Ambient example cube */
mTestAmbient = new Qtk::MeshRenderer("ambient", 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"); mTestAmbient->setShaders(":/solid-ambient.vert", ":/solid-ambient.frag");
// Changing these uniform values will alter lighting effects. // Changing these uniform values will alter lighting effects.
mTestAmbient->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f)); mTestAmbient->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
@ -163,7 +173,7 @@ void ExampleScene::init() {
/* Initialize Diffuse example cube */ /* Initialize Diffuse example cube */
mTestDiffuse = new Qtk::MeshRenderer("diffuse", 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->setShaders(":/solid-diffuse.vert", ":/solid-diffuse.frag");
mTestDiffuse->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f)); mTestDiffuse->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
mTestDiffuse->setUniform("uLightColor", QVector3D(1.0f, 1.0f, 1.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. // Diffuse lighting example light source. This is just for visual reference.
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("diffuseLight", Triangle(QTK_DRAW_ELEMENTS))); new Qtk::MeshRenderer("diffuseLight", Triangle(QTK_DRAW_ELEMENTS)));
mMeshes.back()->mTransform.setTranslation(9.0f, 2.0f, -2.0f); mMeshes.back()->getTransform().setTranslation(9.0f, 2.0f, -2.0f);
mMeshes.back()->mTransform.scale(0.25f); mMeshes.back()->getTransform().scale(0.25f);
/* Initialize Specular example cube */ /* Initialize Specular example cube */
mTestSpecular = new Qtk::MeshRenderer("specular", 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->setShaders(":/solid-specular.vert", ":/solid-specular.frag");
mTestSpecular->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f)); mTestSpecular->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
mTestSpecular->setUniform("uLightColor", QVector3D(1.0f, 1.0f, 1.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. // Specular lighting example light source. This is just for visual reference.
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("specularLight", Triangle(QTK_DRAW_ELEMENTS))); new Qtk::MeshRenderer("specularLight", Triangle(QTK_DRAW_ELEMENTS)));
mMeshes.back()->mTransform.setTranslation(11.0f, 2.0f, -2.0f); mMeshes.back()->getTransform().setTranslation(11.0f, 2.0f, -2.0f);
mMeshes.back()->mTransform.scale(0.25f); mMeshes.back()->getTransform().scale(0.25f);
/* Test basic cube with phong.vert and phong.frag shaders */ /* Test basic cube with phong.vert and phong.frag shaders */
mMeshes.push_back(new Qtk::MeshRenderer("testPhong", Cube(QTK_DRAW_ARRAYS))); 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"); mMeshes.back()->setShaders(":/phong.vert", ":/phong.frag");
// WARNING: Set color before reallocating normals. // WARNING: Set color before reallocating normals.
mMeshes.back()->setColor(QVector3D(0.0f, 0.25f, 0.0f)); mMeshes.back()->setColor(QVector3D(0.0f, 0.25f, 0.0f));
@ -217,8 +227,8 @@ void ExampleScene::init() {
// Light source for testPhong cube // Light source for testPhong cube
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("testLight", Triangle(QTK_DRAW_ELEMENTS))); new Qtk::MeshRenderer("testLight", Triangle(QTK_DRAW_ELEMENTS)));
mMeshes.back()->mTransform.setTranslation(5.0f, 1.25f, 10.0f); mMeshes.back()->getTransform().setTranslation(5.0f, 1.25f, 10.0f);
mMeshes.back()->mTransform.scale(0.25f); mMeshes.back()->getTransform().scale(0.25f);
mMeshes.back()->setDrawType(GL_LINE_LOOP); mMeshes.back()->setDrawType(GL_LINE_LOOP);
mMeshes.back()->setColor(RED); mMeshes.back()->setColor(RED);
@ -230,8 +240,8 @@ void ExampleScene::init() {
mModels.push_back(new Qtk::Model( mModels.push_back(new Qtk::Model(
"alienTest", ":/models/alien-hominid/alien.obj", ":/model-specular.vert", "alienTest", ":/models/alien-hominid/alien.obj", ":/model-specular.vert",
":/model-specular.frag")); ":/model-specular.frag"));
mModels.back()->mTransform.setTranslation(3.0f, -1.0f, 10.0f); mModels.back()->getTransform().setTranslation(3.0f, -1.0f, 10.0f);
mModels.back()->mTransform.scale(0.15f); mModels.back()->getTransform().scale(0.15f);
mModels.back()->setUniform("uMaterial.ambient", QVector3D(1.0f, 1.0f, 1.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.diffuse", QVector3D(1.0f, 1.0f, 1.0f));
mModels.back()->setUniform("uMaterial.specular", 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. // Light source for alienTest object.
mMeshes.push_back(new Qtk::MeshRenderer( mMeshes.push_back(new Qtk::MeshRenderer(
"alienTestLight", Triangle(Qtk::QTK_DRAW_ELEMENTS))); "alienTestLight", Triangle(Qtk::QTK_DRAW_ELEMENTS)));
mMeshes.back()->mTransform.setTranslation(4.0f, 1.5f, 10.0f); mMeshes.back()->getTransform().setTranslation(4.0f, 1.5f, 10.0f);
mMeshes.back()->mTransform.scale(0.25f); mMeshes.back()->getTransform().scale(0.25f);
// This function changes values we have allocated in a buffer, so init() after // This function changes values we have allocated in a buffer, so init() after
mMeshes.back()->setColor(GREEN); mMeshes.back()->setColor(GREEN);
@ -256,8 +266,8 @@ void ExampleScene::init() {
mModels.push_back(new Qtk::Model( mModels.push_back(new Qtk::Model(
"spartanTest", ":/models/spartan/spartan.obj", ":/model-normals.vert", "spartanTest", ":/models/spartan/spartan.obj", ":/model-normals.vert",
":/model-normals.frag")); ":/model-normals.frag"));
mModels.back()->mTransform.setTranslation(0.0f, -1.0f, 10.0f); mModels.back()->getTransform().setTranslation(0.0f, -1.0f, 10.0f);
mModels.back()->mTransform.scale(2.0f); mModels.back()->getTransform().scale(2.0f);
mModels.back()->setUniform("uMaterial.ambient", QVector3D(1.0f, 1.0f, 1.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.diffuse", QVector3D(1.0f, 1.0f, 1.0f));
mModels.back()->setUniform("uMaterial.specular", 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. // Light source for spartanTest object.
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("spartanTestLight", Triangle(QTK_DRAW_ELEMENTS))); new Qtk::MeshRenderer("spartanTestLight", Triangle(QTK_DRAW_ELEMENTS)));
mMeshes.back()->mTransform.setTranslation(1.0f, 1.5f, 10.0f); mMeshes.back()->getTransform().setTranslation(1.0f, 1.5f, 10.0f);
mMeshes.back()->mTransform.scale(0.25f); mMeshes.back()->getTransform().scale(0.25f);
// This function changes values we have allocated in a buffer, so init() after // This function changes values we have allocated in a buffer, so init() after
mMeshes.back()->setColor(GREEN); mMeshes.back()->setColor(GREEN);
@ -284,14 +294,14 @@ void ExampleScene::init() {
// RGB Normals cube to show normals are correct with QTK_DRAW_ARRAYS // RGB Normals cube to show normals are correct with QTK_DRAW_ARRAYS
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("rgbNormalsCubeArraysTest", Cube(QTK_DRAW_ARRAYS))); 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()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals());
// RGB Normals cube to show normals are correct with QTK_DRAW_ELEMENTS_NORMALS // RGB Normals cube to show normals are correct with QTK_DRAW_ELEMENTS_NORMALS
mMeshes.push_back(new Qtk::MeshRenderer( mMeshes.push_back(new Qtk::MeshRenderer(
"rgbNormalsCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS))); "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()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals());
@ -299,7 +309,7 @@ void ExampleScene::init() {
crateTexture.setTexture(":/crate.png"); crateTexture.setTexture(":/crate.png");
Cube cube; Cube cube;
auto * m = new MeshRenderer("Test Crate", Cube(QTK_DRAW_ARRAYS)); 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->setShaders(":/texture2d.vert", ":/texture2d.frag");
m->setTexture(crateTexture); m->setTexture(crateTexture);
m->setUniform("uTexture", 0); m->setUniform("uTexture", 0);
@ -313,7 +323,7 @@ void ExampleScene::init() {
// + This is because the same position must use different UV coordinates // + This is because the same position must use different UV coordinates
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("uvCubeArraysTest", Cube(QTK_DRAW_ARRAYS))); 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()->setShaders(":/texture2d.vert", ":/texture2d.frag");
mMeshes.back()->setTexture(crateTexture); mMeshes.back()->setTexture(crateTexture);
mMeshes.back()->setUniform("uTexture", 0); mMeshes.back()->setUniform("uTexture", 0);
@ -322,7 +332,7 @@ void ExampleScene::init() {
// Test drawing a cube with texture coordinates using glDrawElements // Test drawing a cube with texture coordinates using glDrawElements
mMeshes.push_back(new Qtk::MeshRenderer( mMeshes.push_back(new Qtk::MeshRenderer(
"uvCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS))); "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()->setTexture(":/crate.png");
mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag"); mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag");
mMeshes.back()->bindShaders(); mMeshes.back()->bindShaders();
@ -330,14 +340,14 @@ void ExampleScene::init() {
mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals());
mMeshes.back()->reallocateTexCoords(mMeshes.back()->getTexCoords(), 3); mMeshes.back()->reallocateTexCoords(mMeshes.back()->getTexCoords(), 3);
mMeshes.back()->releaseShaders(); 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 // Texturing a cube using a cube map
// + Cube map texturing works with both QTK_DRAW_ARRAYS and QTK_DRAW_ELEMENTS // + Cube map texturing works with both QTK_DRAW_ARRAYS and QTK_DRAW_ELEMENTS
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("testCubeMap", Cube(QTK_DRAW_ELEMENTS))); new Qtk::MeshRenderer("testCubeMap", Cube(QTK_DRAW_ELEMENTS)));
mMeshes.back()->mTransform.setTranslation(-3.0f, 1.0f, -2.0f); mMeshes.back()->getTransform().setTranslation(-3.0f, 1.0f, -2.0f);
mMeshes.back()->mTransform.setRotation(45.0f, 0.0f, 1.0f, 0.0f); mMeshes.back()->getTransform().setRotation(45.0f, 0.0f, 1.0f, 0.0f);
mMeshes.back()->setShaders( mMeshes.back()->setShaders(
":/texture-cubemap.vert", ":/texture-cubemap.frag"); ":/texture-cubemap.vert", ":/texture-cubemap.frag");
mMeshes.back()->setCubeMap(":/crate.png"); mMeshes.back()->setCubeMap(":/crate.png");
@ -348,28 +358,28 @@ void ExampleScene::init() {
// + Apply RGB normals shader and spin the cube for a neat effect // + Apply RGB normals shader and spin the cube for a neat effect
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("rgbNormalsCube", Cube(QTK_DRAW_ARRAYS))); 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()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals());
// RGB Normals triangle to show normals are correct with QTK_DRAW_ARRAYS // RGB Normals triangle to show normals are correct with QTK_DRAW_ARRAYS
mMeshes.push_back(new Qtk::MeshRenderer( mMeshes.push_back(new Qtk::MeshRenderer(
"rgbTriangleArraysTest", Triangle(QTK_DRAW_ARRAYS))); "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()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals());
// RGB Normals triangle to show normals are correct with QTK_DRAW_ELEMENTS // RGB Normals triangle to show normals are correct with QTK_DRAW_ELEMENTS
mMeshes.push_back(new Qtk::MeshRenderer( mMeshes.push_back(new Qtk::MeshRenderer(
"rgbTriangleElementsTest", Triangle(QTK_DRAW_ELEMENTS_NORMALS))); "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()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals()); mMeshes.back()->reallocateNormals(mMeshes.back()->getNormals());
// Test drawing triangle with glDrawArrays with texture coordinates // Test drawing triangle with glDrawArrays with texture coordinates
mMeshes.push_back( mMeshes.push_back(
new Qtk::MeshRenderer("testTriangleArraysUV", Triangle(QTK_DRAW_ARRAYS))); 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()->setShaders(":/texture2d.vert", ":/texture2d.frag");
mMeshes.back()->setTexture(":/crate.png"); mMeshes.back()->setTexture(":/crate.png");
@ -379,7 +389,7 @@ void ExampleScene::init() {
// Test drawing triangle with glDrawElements with texture coordinates // Test drawing triangle with glDrawElements with texture coordinates
mMeshes.push_back(new Qtk::MeshRenderer( mMeshes.push_back(new Qtk::MeshRenderer(
"testTriangleElementsUV", Triangle(QTK_DRAW_ELEMENTS_NORMALS))); "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()->setShaders(":/texture2d.vert", ":/texture2d.frag");
mMeshes.back()->setTexture(":/crate.png"); mMeshes.back()->setTexture(":/crate.png");
mMeshes.back()->setUniform("uTexture", 0); mMeshes.back()->setUniform("uTexture", 0);
@ -402,10 +412,10 @@ void ExampleScene::draw() {
mTestPhong->bindShaders(); mTestPhong->bindShaders();
mTestPhong->setUniform( mTestPhong->setUniform(
"uModelInverseTransposed", "uModelInverseTransposed",
mTestPhong->mTransform.toMatrix().normalMatrix()); mTestPhong->getTransform().toMatrix().normalMatrix());
mTestPhong->setUniform( mTestPhong->setUniform(
"uLightPosition", "uLightPosition",
MeshRenderer::getInstance("phongLight")->mTransform.getTranslation()); MeshRenderer::getInstance("phongLight")->getTransform().getTranslation());
mTestPhong->setUniform( mTestPhong->setUniform(
"uCameraPosition", "uCameraPosition",
ExampleScene::getCamera().getTransform().getTranslation()); ExampleScene::getCamera().getTransform().getTranslation());
@ -422,10 +432,11 @@ void ExampleScene::draw() {
mTestDiffuse->bindShaders(); mTestDiffuse->bindShaders();
mTestDiffuse->setUniform( mTestDiffuse->setUniform(
"uModelInverseTransposed", "uModelInverseTransposed",
mTestDiffuse->mTransform.toMatrix().normalMatrix()); mTestDiffuse->getTransform().toMatrix().normalMatrix());
mTestDiffuse->setUniform( mTestDiffuse->setUniform(
"uLightPosition", "uLightPosition", MeshRenderer::getInstance("diffuseLight")
MeshRenderer::getInstance("diffuseLight")->mTransform.getTranslation()); ->getTransform()
.getTranslation());
mTestDiffuse->setUniform( mTestDiffuse->setUniform(
"uCameraPosition", "uCameraPosition",
ExampleScene::getCamera().getTransform().getTranslation()); ExampleScene::getCamera().getTransform().getTranslation());
@ -435,10 +446,11 @@ void ExampleScene::draw() {
mTestSpecular->bindShaders(); mTestSpecular->bindShaders();
mTestSpecular->setUniform( mTestSpecular->setUniform(
"uModelInverseTransposed", "uModelInverseTransposed",
mTestSpecular->mTransform.toMatrix().normalMatrix()); mTestSpecular->getTransform().toMatrix().normalMatrix());
mTestSpecular->setUniform( mTestSpecular->setUniform(
"uLightPosition", "uLightPosition", MeshRenderer::getInstance("specularLight")
MeshRenderer::getInstance("specularLight")->mTransform.getTranslation()); ->getTransform()
.getTranslation());
mTestSpecular->setUniform( mTestSpecular->setUniform(
"uCameraPosition", "uCameraPosition",
ExampleScene::getCamera().getTransform().getTranslation()); ExampleScene::getCamera().getTransform().getTranslation());
@ -447,44 +459,52 @@ void ExampleScene::draw() {
} }
void ExampleScene::update() { void ExampleScene::update() {
auto position = auto mySpartan = Model::getInstance("My spartan");
MeshRenderer::getInstance("alienTestLight")->mTransform.getTranslation(); 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"); auto alien = Model::getInstance("alienTest");
alien->setUniform("uLight.position", position); alien->setUniform("uLight.position", position);
alien->setUniform( alien->setUniform(
"uCameraPosition", "uCameraPosition",
ExampleScene::getCamera().getTransform().getTranslation()); ExampleScene::getCamera().getTransform().getTranslation());
auto posMatrix = alien->mTransform.toMatrix(); auto posMatrix = alien->getTransform().toMatrix();
alien->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix()); alien->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
alien->setUniform("uMVP.model", posMatrix); alien->setUniform("uMVP.model", posMatrix);
alien->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix()); alien->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix());
alien->setUniform("uMVP.projection", ExampleScene::getProjectionMatrix()); 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") position = MeshRenderer::getInstance("spartanTestLight")
->mTransform.getTranslation(); ->getTransform()
.getTranslation();
auto spartan = Model::getInstance("spartanTest"); auto spartan = Model::getInstance("spartanTest");
spartan->setUniform("uLight.position", position); spartan->setUniform("uLight.position", position);
spartan->setUniform( spartan->setUniform(
"uCameraPosition", "uCameraPosition",
ExampleScene::getCamera().getTransform().getTranslation()); ExampleScene::getCamera().getTransform().getTranslation());
posMatrix = spartan->mTransform.toMatrix(); posMatrix = spartan->getTransform().toMatrix();
spartan->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix()); spartan->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
spartan->setUniform("uMVP.model", posMatrix); spartan->setUniform("uMVP.model", posMatrix);
spartan->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix()); spartan->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix());
spartan->setUniform("uMVP.projection", ExampleScene::getProjectionMatrix()); 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"); 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(); phong->bindShaders();
position = position =
MeshRenderer::getInstance("testLight")->mTransform.getTranslation(); MeshRenderer::getInstance("testLight")->getTransform().getTranslation();
phong->setUniform("uLight.position", position); phong->setUniform("uLight.position", position);
phong->setUniform( phong->setUniform(
"uCameraPosition", "uCameraPosition",
ExampleScene::getCamera().getTransform().getTranslation()); ExampleScene::getCamera().getTransform().getTranslation());
posMatrix = phong->mTransform.toMatrix(); posMatrix = phong->getTransform().toMatrix();
phong->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix()); phong->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
phong->setUniform("uMVP.model", posMatrix); phong->setUniform("uMVP.model", posMatrix);
phong->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix()); phong->setUniform("uMVP.view", ExampleScene::getCamera().toMatrix());
@ -492,46 +512,56 @@ void ExampleScene::update() {
phong->releaseShaders(); phong->releaseShaders();
// Rotate lighting example cubes // Rotate lighting example cubes
mTestPhong->mTransform.rotate(0.75f, 0.5f, 0.3f, 0.2f); mTestPhong->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
MeshRenderer::getInstance("noLight")->mTransform.rotate( MeshRenderer::getInstance("noLight")->getTransform().rotate(
0.75f, 0.5f, 0.3f, 0.2f); 0.75f, 0.5f, 0.3f, 0.2f);
mTestAmbient->mTransform.rotate(0.75f, 0.5f, 0.3f, 0.2f); mTestAmbient->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
mTestDiffuse->mTransform.rotate(0.75f, 0.5f, 0.3f, 0.2f); mTestDiffuse->getTransform().rotate(0.75f, 0.5f, 0.3f, 0.2f);
mTestSpecular->mTransform.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 // Examples of various translations and rotations
// Rotate in multiple directions simultaneously // Rotate in multiple directions simultaneously
MeshRenderer::getInstance("rgbNormalsCube") 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 // Pitch forward and roll sideways
MeshRenderer::getInstance("leftTriangle") 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") 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 // Move between two positions over time
static float translateX = 0.025f; static float translateX = 0.025f;
float limit = -9.0f; // Origin position.x - 2.0f float limit = -9.0f; // Origin position.x - 2.0f
float posX = float posX = MeshRenderer::getInstance("topTriangle")
MeshRenderer::getInstance("topTriangle")->mTransform.getTranslation().x(); ->getTransform()
.getTranslation()
.x();
if(posX < limit || posX > limit + 4.0f) { if(posX < limit || posX > limit + 4.0f) {
translateX = -translateX; translateX = -translateX;
} }
MeshRenderer::getInstance("topTriangle") MeshRenderer::getInstance("topTriangle")
->mTransform.translate(translateX, 0.0f, 0.0f); ->getTransform()
.translate(translateX, 0.0f, 0.0f);
MeshRenderer::getInstance("bottomTriangle") 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 // And lets rotate the triangles in two directions at once
MeshRenderer::getInstance("topTriangle") 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") 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 // And make the bottom triangle green, instead of RGB
// Rotate center cube in several directions simultaneously // Rotate center cube in several directions simultaneously
// + Not subject to gimbal lock since we are using quaternions :) // + Not subject to gimbal lock since we are using quaternions :)
MeshRenderer::getInstance("centerCube") MeshRenderer::getInstance("centerCube")
->mTransform.rotate(0.75f, 0.2f, 0.4f, 0.6f); ->getTransform()
.rotate(0.75f, 0.2f, 0.4f, 0.6f);
} }

View File

@ -1,7 +1,7 @@
/*############################################################################## /*##############################################################################
## Author: Shaun Reed ## ## Author: Shaun Reed ##
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ## ## 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 ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
##############################################################################*/ ##############################################################################*/

View File

@ -1,7 +1,7 @@
/*############################################################################## /*##############################################################################
## Author: Shaun Reed ## ## Author: Shaun Reed ##
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ## ## 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 ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
##############################################################################*/ ##############################################################################*/

View File

@ -13,6 +13,9 @@ using namespace Qtk;
Cube::Cube(DrawMode mode) { Cube::Cube(DrawMode mode) {
mDrawMode = mode; mDrawMode = mode;
switch(mode) { switch(mode) {
// The order of the following assignment values helps to visualize.
// clang-format off
// Cube data for use with glDrawArrays // Cube data for use with glDrawArrays
case QTK_DRAW_ARRAYS: case QTK_DRAW_ARRAYS:
mIndices = {/* No indices needed for glDrawArrays */}; mIndices = {/* No indices needed for glDrawArrays */};
@ -20,51 +23,76 @@ Cube::Cube(DrawMode mode) {
mNormals = {FACE_FRONT, FACE_BACK, FACE_TOP, mNormals = {FACE_FRONT, FACE_BACK, FACE_TOP,
FACE_BOTTOM, FACE_LEFT, FACE_RIGHT}; FACE_BOTTOM, FACE_LEFT, FACE_RIGHT};
mVertices = {// Face 1 (Front) // We're drawing triangles to construct the geometry of a cube.
VERTEX_FTR, VERTEX_FTL, VERTEX_FBL, VERTEX_FBL, VERTEX_FBR, // Each triangle is made up of three points.
VERTEX_FTR, // The entire cube has 12 triangles to make 6 square faces of the cube.
// Face 2 (Back) mVertices = {
VERTEX_BBR, VERTEX_BTL, VERTEX_BTR, VERTEX_BTL, VERTEX_BBR, // Face 1 (Front)
VERTEX_BBL, VERTEX_FTR, VERTEX_FTL, VERTEX_FBL,
// Face 3 (Top) VERTEX_FBL, VERTEX_FBR, VERTEX_FTR,
VERTEX_FTR, VERTEX_BTR, VERTEX_BTL, VERTEX_BTL, VERTEX_FTL, // Face 2 (Back)
VERTEX_FTR, VERTEX_BBR, VERTEX_BTL, VERTEX_BTR,
// Face 4 (Bottom) VERTEX_BTL, VERTEX_BBR, VERTEX_BBL,
VERTEX_FBR, VERTEX_FBL, VERTEX_BBL, VERTEX_BBL, VERTEX_BBR, // Face 3 (Top)
VERTEX_FBR, VERTEX_FTR, VERTEX_BTR, VERTEX_BTL,
// Face 5 (Left) VERTEX_BTL, VERTEX_FTL, VERTEX_FTR,
VERTEX_FBL, VERTEX_FTL, VERTEX_BTL, VERTEX_FBL, VERTEX_BTL, // Face 4 (Bottom)
VERTEX_BBL, VERTEX_FBR, VERTEX_FBL, VERTEX_BBL,
// Face 6 (Right) VERTEX_BBL, VERTEX_BBR, VERTEX_FBR,
VERTEX_FTR, VERTEX_FBR, VERTEX_BBR, VERTEX_BBR, VERTEX_BTR, // Face 5 (Left)
VERTEX_FTR}; 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) // Setting colors for each vertex that we defined above.
RED, GREEN, BLUE, BLUE, WHITE, RED, // These are defaults and can be overriden by the caller with setColor().
// Face 2 (Back) // The colors below are interpolated from vertex to vertex.
YELLOW, CYAN, MAGENTA, CYAN, YELLOW, BLACK, mColors = {
// Face 3 (Top) // Face 1 (Front)
RED, MAGENTA, CYAN, CYAN, GREEN, RED, RED, GREEN, BLUE,
// Face 4 (Bottom) BLUE, WHITE, RED,
WHITE, BLUE, BLACK, BLACK, YELLOW, WHITE, // Face 2 (Back)
// Face 5 (Left) YELLOW, CYAN, MAGENTA,
BLUE, GREEN, CYAN, BLUE, CYAN, BLACK, CYAN, YELLOW, BLACK,
// Face 6 (Right) // Face 3 (Top)
RED, WHITE, YELLOW, YELLOW, MAGENTA, RED}; 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) // Define texture coordinates for the cube.
UV_TOP, UV_ORIGIN, UV_RIGHT, UV_RIGHT, UV_CORNER, UV_TOP, // This defines the orientation of the texture when applied the object.
// Face 2 (Back) mTexCoords = {
UV_TOP, UV_RIGHT, UV_CORNER, UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 1 (Front)
// Face 3 (Top) UV_TOP, UV_ORIGIN, UV_RIGHT,
UV_CORNER, UV_TOP, UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_RIGHT, UV_CORNER, UV_TOP,
UV_CORNER, // Face 2 (Back)
// Face 4 (Bottom) UV_TOP, UV_RIGHT, UV_CORNER,
UV_TOP, UV_ORIGIN, UV_RIGHT, UV_RIGHT, UV_CORNER, UV_TOP, UV_RIGHT, UV_TOP, UV_ORIGIN,
// Face 5 (Left) // Face 3 (Top)
UV_TOP, UV_CORNER, UV_RIGHT, UV_TOP, UV_RIGHT, UV_ORIGIN, UV_CORNER, UV_TOP, UV_ORIGIN,
// Face 6 (Right) UV_ORIGIN, UV_RIGHT, UV_CORNER,
UV_TOP, UV_CORNER, UV_RIGHT, UV_RIGHT, UV_ORIGIN, UV_TOP}; // 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; break;
@ -81,56 +109,64 @@ Cube::Cube(DrawMode mode) {
VERTEX_FTR, VERTEX_FTL, VERTEX_FBL, VERTEX_FBR, VERTEX_FTR, VERTEX_FTL, VERTEX_FBL, VERTEX_FBR,
// 4 5 6 7 // 4 5 6 7
VERTEX_BTR, VERTEX_BTL, VERTEX_BBL, VERTEX_BBR}; VERTEX_BTR, VERTEX_BTL, VERTEX_BBL, VERTEX_BBR};
mIndices = {// Face 1 (Front)
0, 1, 2, 2, 3, 0, mIndices = {
// Face 2 (Back) // Face 1 (Front)
7, 5, 4, 5, 7, 6, 0, 1, 2, 2, 3, 0,
// Face 3 (Top) // Face 2 (Back)
0, 4, 5, 5, 1, 0, 7, 5, 4, 5, 7, 6,
// Face 4 (Bottom) // Face 3 (Top)
3, 2, 6, 6, 7, 3, 0, 4, 5, 5, 1, 0,
// Face 5 (Left) // Face 4 (Bottom)
2, 1, 5, 2, 5, 6, 3, 2, 6, 6, 7, 3,
// Face 6 (Right) // Face 5 (Left)
0, 3, 7, 7, 4, 0}; 2, 1, 5, 2, 5, 6,
// Face 6 (Right)
0, 3, 7, 7, 4, 0
};
break; break;
// Cube shape data for using normals and UVs with glDrawElements // Cube shape data for using normals and UVs with glDrawElements
case QTK_DRAW_ELEMENTS_NORMALS: case QTK_DRAW_ELEMENTS_NORMALS:
mColors = {RED, GREEN, BLUE, WHITE, YELLOW, CYAN, MAGENTA, BLACK}; mColors = {RED, GREEN, BLUE, WHITE, YELLOW, CYAN, MAGENTA, BLACK};
mVertices = {// Face 1 (Front) mVertices = {
// 0 1 2 3 // Face 1 (Front)
VERTEX_FTL, VERTEX_FBL, VERTEX_FBR, VERTEX_FTR, // 0 1 2 3
// Face 2 (Back) VERTEX_FTL, VERTEX_FBL, VERTEX_FBR, VERTEX_FTR,
// 4 5 6 7 // Face 2 (Back)
VERTEX_BTL, VERTEX_BBL, VERTEX_BBR, VERTEX_BTR, // 4 5 6 7
// Face 3 (Top) VERTEX_BTL, VERTEX_BBL, VERTEX_BBR, VERTEX_BTR,
// 8 9 10 11 // Face 3 (Top)
VERTEX_FTL, VERTEX_BTL, VERTEX_BTR, VERTEX_FTR, // 8 9 10 11
// Face 4 (Bottom) VERTEX_FTL, VERTEX_BTL, VERTEX_BTR, VERTEX_FTR,
// 12 13 14 15 // Face 4 (Bottom)
VERTEX_FBL, VERTEX_BBL, VERTEX_BBR, VERTEX_FBR, // 12 13 14 15
// Face 5 (Left) VERTEX_FBL, VERTEX_BBL, VERTEX_BBR, VERTEX_FBR,
// 16 17 18 19 // Face 5 (Left)
VERTEX_FBL, VERTEX_BBL, VERTEX_BTL, VERTEX_FTL, // 16 17 18 19
// Face 6 (Right) VERTEX_FBL, VERTEX_BBL, VERTEX_BTL, VERTEX_FTL,
// 20 21 22 23 // Face 6 (Right)
VERTEX_FBR, VERTEX_BBR, VERTEX_BTR, VERTEX_FTR}; // 20 21 22 23
VERTEX_FBR, VERTEX_BBR, VERTEX_BTR, VERTEX_FTR
};
mIndices = {// Face 1 (Front) mIndices = {
0, 1, 2, 2, 3, 0, // Face 1 (Front)
// Face 2 (Back) 0, 1, 2, 2, 3, 0,
4, 5, 6, 6, 7, 4, // Face 2 (Back)
// Face 3 (Top) 4, 5, 6, 6, 7, 4,
8, 9, 10, 10, 11, 8, // Face 3 (Top)
// Face 4 (Bottom) 8, 9, 10, 10, 11, 8,
12, 13, 14, 14, 15, 12, // 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 = { mNormals = {
VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD,
@ -143,50 +179,27 @@ Cube::Cube(DrawMode mode) {
mTexCoords = { mTexCoords = {
// Face 1 (Front) // Face 1 (Front)
UV_TOP, UV_TOP, UV_RIGHT, UV_CORNER,
UV_RIGHT, UV_RIGHT, UV_TOP, UV_ORIGIN,
UV_CORNER,
UV_RIGHT,
UV_TOP,
UV_ORIGIN,
// Face 2 (Back) // Face 2 (Back)
UV_TOP, UV_TOP, UV_RIGHT, UV_CORNER,
UV_RIGHT, UV_RIGHT, UV_TOP, UV_ORIGIN,
UV_CORNER,
UV_RIGHT,
UV_TOP,
UV_ORIGIN,
// Face 3 (Top) // Face 3 (Top)
UV_TOP, UV_TOP, UV_RIGHT, UV_CORNER,
UV_RIGHT, UV_RIGHT, UV_TOP, UV_ORIGIN,
UV_CORNER,
UV_RIGHT,
UV_TOP,
UV_ORIGIN,
// Face 4 (Bottom) // Face 4 (Bottom)
UV_TOP, UV_TOP, UV_RIGHT, UV_CORNER,
UV_RIGHT, UV_RIGHT, UV_TOP, UV_ORIGIN,
UV_CORNER,
UV_RIGHT,
UV_TOP,
UV_ORIGIN,
// Face 5 (Left) // Face 5 (Left)
UV_TOP, UV_TOP, UV_RIGHT, UV_CORNER,
UV_RIGHT, UV_RIGHT, UV_TOP, UV_ORIGIN,
UV_CORNER,
UV_RIGHT,
UV_TOP,
UV_ORIGIN,
// Face 6 (Right) // Face 6 (Right)
UV_TOP, UV_TOP, UV_RIGHT, UV_CORNER,
UV_RIGHT, UV_RIGHT, UV_TOP, UV_ORIGIN,
UV_CORNER,
UV_RIGHT,
UV_TOP,
UV_ORIGIN,
}; };
break; break;
// clang-format on
} }
} }
@ -194,6 +207,8 @@ Triangle::Triangle(DrawMode mode) {
mDrawMode = mode; mDrawMode = mode;
const QVector3D triangleTop = QVector3D(0.0f, 0.5f, 0.0f); const QVector3D triangleTop = QVector3D(0.0f, 0.5f, 0.0f);
switch(mode) { switch(mode) {
// clang-format off
case QTK_DRAW_ARRAYS: case QTK_DRAW_ARRAYS:
mIndices = {/* No indices needed for glDrawArrays */}; mIndices = {/* No indices needed for glDrawArrays */};
@ -201,29 +216,17 @@ Triangle::Triangle(DrawMode mode) {
mVertices = { mVertices = {
// Bottom face (Base of the pyramid) // Bottom face (Base of the pyramid)
VERTEX_BBL, VERTEX_BBL, VERTEX_BBR, VERTEX_FBR,
VERTEX_BBR, VERTEX_FBR, VERTEX_FBL, VERTEX_BBL,
VERTEX_FBR,
VERTEX_FBR,
VERTEX_FBL,
VERTEX_BBL,
// Front face // Front face
VERTEX_FBL, VERTEX_FBL, VERTEX_FBR, triangleTop,
VERTEX_FBR,
triangleTop,
// Back face // Back face
VERTEX_BBR, VERTEX_BBR, VERTEX_BBL, triangleTop,
VERTEX_BBL,
triangleTop,
// Left face // Left face
VERTEX_BBL, VERTEX_BBL, VERTEX_FBL, triangleTop,
VERTEX_FBL,
triangleTop,
// Right face // Right face
VERTEX_FBR, VERTEX_FBR, VERTEX_BBR, triangleTop,
VERTEX_BBR,
triangleTop,
}; };
// Find normals for each triangle of the mesh // Find normals for each triangle of the mesh
@ -238,29 +241,17 @@ Triangle::Triangle(DrawMode mode) {
mTexCoords = { mTexCoords = {
// Bottom face (Base of the pyramid) // Bottom face (Base of the pyramid)
UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_CORNER,
UV_RIGHT, UV_CORNER, UV_TOP, UV_ORIGIN,
UV_CORNER,
UV_CORNER,
UV_TOP,
UV_ORIGIN,
// Front face // Front face
UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_CORNER,
UV_RIGHT,
UV_CORNER,
// Back face // Back face
UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_CORNER,
UV_RIGHT,
UV_CORNER,
// Left face // Left face
UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_CORNER,
UV_RIGHT,
UV_CORNER,
// Right face // Right face
UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_CORNER,
UV_RIGHT,
UV_CORNER,
}; };
break; break;
@ -296,34 +287,22 @@ Triangle::Triangle(DrawMode mode) {
mVertices = { mVertices = {
// Bottom face // Bottom face
// 0 1 2 // 0 1 2
VERTEX_FBL, VERTEX_FBL, VERTEX_FBR, VERTEX_BBL,
VERTEX_FBR,
VERTEX_BBL,
// 3 4 5 // 3 4 5
VERTEX_BBR, VERTEX_BBR, VERTEX_FBR, VERTEX_BBL,
VERTEX_FBR,
VERTEX_BBL,
// Front face // Front face
// 6 7 8 // 6 7 8
VERTEX_FBL, VERTEX_FBL, VERTEX_FBR, triangleTop,
VERTEX_FBR,
triangleTop,
// Back face // Back face
// 9 10 11 // 9 10 11
VERTEX_BBR, VERTEX_BBR, VERTEX_BBL, triangleTop,
VERTEX_BBL,
triangleTop,
// Left face // Left face
// 12 13 14 // 12 13 14
VERTEX_BBL, VERTEX_BBL, VERTEX_FBL, triangleTop,
VERTEX_FBL,
triangleTop,
// Right face // Right face
// 15 16 17 // 15 16 17
VERTEX_FBR, VERTEX_FBR, VERTEX_BBR, triangleTop,
VERTEX_BBR,
triangleTop,
}; };
mIndices = { mIndices = {
@ -350,30 +329,19 @@ Triangle::Triangle(DrawMode mode) {
mTexCoords = { mTexCoords = {
// Bottom face // Bottom face
UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_TOP,
UV_RIGHT, UV_CORNER, UV_RIGHT, UV_TOP,
UV_TOP,
UV_CORNER,
UV_RIGHT,
UV_TOP,
// Front face // Front face
UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_CORNER,
UV_RIGHT,
UV_CORNER,
// Back face // Back face
UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_CORNER,
UV_RIGHT,
UV_CORNER,
// Left face // Left face
UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_CORNER,
UV_RIGHT,
UV_CORNER,
// Right face // Right face
UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_CORNER,
UV_RIGHT,
UV_CORNER,
}; };
break; break;
// clang-format on
} }
} }

View File

@ -46,21 +46,22 @@ namespace Qtk {
#define VECTOR_ONE QVector3D(1.0f, 1.0f, 1.0f) #define VECTOR_ONE QVector3D(1.0f, 1.0f, 1.0f)
#define VECTOR_ZERO QVector3D(0.0f, 0.0f, 0.0f) #define VECTOR_ZERO QVector3D(0.0f, 0.0f, 0.0f)
// clang-format off
// A series of direction vectors to represent cube face normal // A series of direction vectors to represent cube face normal
#define FACE_TOP \ #define FACE_TOP VECTOR_UP, VECTOR_UP, VECTOR_UP, \
VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_UP VECTOR_UP, VECTOR_UP, VECTOR_UP
#define FACE_BOTTOM \ #define FACE_BOTTOM VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, \
VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN
#define FACE_LEFT \ #define FACE_LEFT VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, \
VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT
#define FACE_RIGHT \ #define FACE_RIGHT VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, \
VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, \ VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT
VECTOR_RIGHT #define FACE_FRONT VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, \
#define FACE_FRONT \ VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD
VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, \ #define FACE_BACK VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, \
VECTOR_FORWARD, VECTOR_FORWARD VECTOR_BACK, VECTOR_BACK, VECTOR_BACK
#define FACE_BACK \ // clang-format on
VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK
// Colors using QVector3Ds as RGB values // Colors using QVector3Ds as RGB values
#define WHITE VECTOR_ONE #define WHITE VECTOR_ONE

View File

@ -110,7 +110,7 @@ namespace Qtk {
} }
/************************************************************************* /*************************************************************************
* Getters * Accessors
************************************************************************/ ************************************************************************/
/** /**
@ -120,6 +120,8 @@ namespace Qtk {
*/ */
static MeshRenderer * getInstance(const QString & name); static MeshRenderer * getInstance(const QString & name);
Transform3D & getTransform() { return mTransform; }
private: private:
/************************************************************************* /*************************************************************************
* Private Members * Private Members

View File

@ -29,7 +29,7 @@
namespace Qtk { 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 { struct QTKAPI ModelVertex {
QVector3D mPosition; QVector3D mPosition;
@ -199,13 +199,7 @@ namespace Qtk {
*/ */
static Model * getInstance(const char * name); static Model * getInstance(const char * name);
/************************************************************************* Transform3D & getTransform() { return mTransform; }
* Public Members
************************************************************************/
/* The position of this model in 3D space */
// TODO: Make private
Transform3D mTransform;
private: private:
/************************************************************************* /*************************************************************************
@ -246,6 +240,9 @@ namespace Qtk {
* Private Members * Private Members
************************************************************************/ ************************************************************************/
/* The position of this model in 3D space */
Transform3D mTransform;
/* Static QHash used to store and access models globally. */ /* Static QHash used to store and access models globally. */
static ModelManager mManager; static ModelManager mManager;

View File

@ -51,19 +51,31 @@ namespace Qtk {
* Accessors * 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; } [[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 * Setters
@ -118,25 +130,19 @@ namespace Qtk {
mProgram.release(); mProgram.release();
} }
/*************************************************************************
* Public Members
************************************************************************/
QOpenGLBuffer mVBO, mNBO;
QOpenGLVertexArrayObject mVAO;
Transform3D mTransform;
Shape mShape;
Texture mTexture;
const char * mName;
bool mBound;
private: private:
/************************************************************************* /*************************************************************************
* Private Members * Private Members
************************************************************************/ ************************************************************************/
QOpenGLShaderProgram mProgram; QOpenGLShaderProgram mProgram;
QOpenGLBuffer mVBO, mNBO;
QOpenGLVertexArrayObject mVAO;
Transform3D mTransform;
Shape mShape;
Texture mTexture;
const char * mName;
bool mBound;
}; };
} // namespace Qtk } // namespace Qtk