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
|
# 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
|
||||||
)
|
)
|
||||||
|
|
37
README.md
37
README.md
|
@ -2,7 +2,6 @@
|
||||||
[![All Builds](https://github.com/shaunrd0/qtk/actions/workflows/all-builds.yml/badge.svg)](https://github.com/shaunrd0/qtk/actions/workflows/all-builds.yml)
|
[![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.
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
|
|
@ -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 ##
|
||||||
##############################################################################*/
|
##############################################################################*/
|
||||||
|
|
354
src/mesh.cpp
354
src/mesh.cpp
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
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_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
|
||||||
|
|
|
@ -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
|
||||||
|
|
13
src/model.h
13
src/model.h
|
@ -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;
|
||||||
|
|
||||||
|
|
44
src/object.h
44
src/object.h
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue