Example of using new simple API
+ Clean up some TODOs + More docs + Disable clang-format in Mesh
This commit is contained in:
		
							parent
							
								
									d37484d75c
								
							
						
					
					
						commit
						7f13b2d729
					
				@ -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
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										37
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								README.md
									
									
									
									
									
								
							@ -2,7 +2,6 @@
 | 
			
		||||
[](https://github.com/shaunrd0/qtk/actions/workflows/all-builds.yml)
 | 
			
		||||
[](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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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   ##
 | 
			
		||||
##############################################################################*/
 | 
			
		||||
 | 
			
		||||
@ -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   ##
 | 
			
		||||
##############################################################################*/
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										354
									
								
								src/mesh.cpp
									
									
									
									
									
								
							
							
						
						
									
										354
									
								
								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
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										29
									
								
								src/mesh.h
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								src/model.h
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										44
									
								
								src/object.h
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user