Refactor
This commit is contained in:
parent
0f372f71f4
commit
99b4f9355b
|
@ -22,7 +22,7 @@ Be sure to take note of the Qt6 installation directory, as we will need it to co
|
|||
|
||||
Once Qt6 is installed, to build and run `qtk` on Ubuntu -
|
||||
```bash
|
||||
sudo apt update -y && sudo apt install freeglut3-dev libassimp-dev cmake build-essential git
|
||||
sudo apt update -y && sudo apt install libassimp-dev cmake build-essential git
|
||||
git clone https://gitlab.com/shaunrd0/qtk
|
||||
cmake -DCMAKE_PREFIX_PATH=$HOME/Qt/6.3.1/gcc_64 -S qtk/ -B qtk/build/ && cmake --build qtk/build/ -j $(nproc --ignore=2) --target qtk-main
|
||||
./qtk/build/qtk-main
|
||||
|
|
|
@ -63,12 +63,11 @@ void ExampleScene::init()
|
|||
mTestPhong->mNBO.create();
|
||||
mTestPhong->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
||||
mTestPhong->mNBO.bind();
|
||||
mTestPhong->mNBO.allocate(mTestPhong->normals().data(),
|
||||
mTestPhong->normals().size()
|
||||
* sizeof(mTestPhong->normals()[0]));
|
||||
mTestPhong->mNBO.allocate(mTestPhong->getNormals().data(),
|
||||
mTestPhong->getNormals().size()
|
||||
* sizeof(mTestPhong->getNormals()[0]));
|
||||
mTestPhong->mProgram.enableAttributeArray(1);
|
||||
mTestPhong->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
mTestPhong->mProgram.setAttributeBuffer(1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
||||
mTestPhong->mNBO.release();
|
||||
mTestPhong->mVAO.release();
|
||||
mTestPhong->mProgram.release();
|
||||
|
@ -88,9 +87,9 @@ void ExampleScene::init()
|
|||
mTestAmbient->mNBO.create();
|
||||
mTestAmbient->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
||||
mTestAmbient->mNBO.bind();
|
||||
mTestAmbient->mNBO.allocate(mTestAmbient->normals().data(),
|
||||
mTestAmbient->normals().size()
|
||||
* sizeof(mTestAmbient->normals()[0]));
|
||||
mTestAmbient->mNBO.allocate(mTestAmbient->getNormals().data(),
|
||||
mTestAmbient->getNormals().size()
|
||||
* sizeof(mTestAmbient->getNormals()[0]));
|
||||
mTestAmbient->mProgram.enableAttributeArray(1);
|
||||
mTestAmbient->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
@ -112,9 +111,9 @@ void ExampleScene::init()
|
|||
mTestDiffuse->mNBO.create();
|
||||
mTestDiffuse->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
||||
mTestDiffuse->mNBO.bind();
|
||||
mTestDiffuse->mNBO.allocate(mTestDiffuse->normals().data(),
|
||||
mTestDiffuse->normals().size()
|
||||
* sizeof(mTestDiffuse->normals()[0]));
|
||||
mTestDiffuse->mNBO.allocate(mTestDiffuse->getNormals().data(),
|
||||
mTestDiffuse->getNormals().size()
|
||||
* sizeof(mTestDiffuse->getNormals()[0]));
|
||||
mTestDiffuse->mProgram.enableAttributeArray(1);
|
||||
mTestDiffuse->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
@ -138,9 +137,9 @@ void ExampleScene::init()
|
|||
mTestSpecular->mNBO.create();
|
||||
mTestSpecular->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
||||
mTestSpecular->mNBO.bind();
|
||||
mTestSpecular->mNBO.allocate(mTestSpecular->normals().data(),
|
||||
mTestSpecular->normals().size()
|
||||
* sizeof(mTestSpecular->normals()[0]));
|
||||
mTestSpecular->mNBO.allocate(mTestSpecular->getNormals().data(),
|
||||
mTestSpecular->getNormals().size()
|
||||
* sizeof(mTestSpecular->getNormals()[0]));
|
||||
mTestSpecular->mProgram.enableAttributeArray(1);
|
||||
mTestSpecular->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
@ -261,9 +260,9 @@ void ExampleScene::init()
|
|||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
||||
mMeshes.back()->getNormals().size()
|
||||
* sizeof(mMeshes.back()->getNormals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
@ -330,9 +329,9 @@ void ExampleScene::init()
|
|||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
||||
mMeshes.back()->getNormals().size()
|
||||
* sizeof(mMeshes.back()->getNormals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
@ -352,9 +351,9 @@ void ExampleScene::init()
|
|||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
||||
mMeshes.back()->getNormals().size()
|
||||
* sizeof(mMeshes.back()->getNormals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
@ -374,19 +373,16 @@ void ExampleScene::init()
|
|||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->setTexture(Texture::initTexture2D(":/crate.png"));
|
||||
mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
||||
mMeshes.back()->setUniform("uTexture", 0);
|
||||
mMeshes.back()->texture().bind();
|
||||
|
||||
mMeshes.back()->texture().release();
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.destroy();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.texCoords().data(),
|
||||
mMeshes.back()->mShape.texCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.texCoords()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.getTexCoords().data(),
|
||||
mMeshes.back()->mShape.getTexCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
2, sizeof(QVector2D));
|
||||
|
@ -405,13 +401,13 @@ void ExampleScene::init()
|
|||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->texCoords().data(),
|
||||
mMeshes.back()->texCoords().size()
|
||||
* sizeof(mMeshes.back()->texCoords()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->getTexCoords().data(),
|
||||
mMeshes.back()->getTexCoords().size()
|
||||
* sizeof(mMeshes.back()->getTexCoords()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
mMeshes.back()->setTexture(Texture::initTexture2D(":/crate.png"));
|
||||
mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
||||
|
||||
mMeshes.back()->mProgram.setUniformValue("uTexture", 0);
|
||||
mMeshes.back()->mProgram.release();
|
||||
|
@ -429,16 +425,16 @@ void ExampleScene::init()
|
|||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->setTexture(Texture::initCubeMap(":/crate.png"));
|
||||
mMeshes.back()->setTexture(OpenGLTextureFactory::initCubeMap(":/crate.png"));
|
||||
mMeshes.back()->setUniform("uTexture", 0);
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.destroy();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.texCoords().data(),
|
||||
mMeshes.back()->mShape.texCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.texCoords()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.getTexCoords().data(),
|
||||
mMeshes.back()->mShape.getTexCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
2, sizeof(QVector2D));
|
||||
|
@ -458,9 +454,9 @@ void ExampleScene::init()
|
|||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
||||
mMeshes.back()->getNormals().size()
|
||||
* sizeof(mMeshes.back()->getNormals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
@ -480,9 +476,9 @@ void ExampleScene::init()
|
|||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
||||
mMeshes.back()->getNormals().size()
|
||||
* sizeof(mMeshes.back()->getNormals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
@ -502,9 +498,9 @@ void ExampleScene::init()
|
|||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->normals().data(),
|
||||
mMeshes.back()->normals().size()
|
||||
* sizeof(mMeshes.back()->normals()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
||||
mMeshes.back()->getNormals().size()
|
||||
* sizeof(mMeshes.back()->getNormals()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
3, sizeof(QVector3D));
|
||||
|
@ -520,19 +516,16 @@ void ExampleScene::init()
|
|||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->setTexture(Texture::initTexture2D(":/crate.png"));
|
||||
mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
||||
mMeshes.back()->setUniform("uTexture", 0);
|
||||
mMeshes.back()->texture().bind();
|
||||
|
||||
mMeshes.back()->texture().release();
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.destroy();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.texCoords().data(),
|
||||
mMeshes.back()->mShape.texCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.texCoords()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.getTexCoords().data(),
|
||||
mMeshes.back()->mShape.getTexCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
2, sizeof(QVector2D));
|
||||
|
@ -549,19 +542,16 @@ void ExampleScene::init()
|
|||
mMeshes.back()->init();
|
||||
mMeshes.back()->mProgram.bind();
|
||||
|
||||
mMeshes.back()->setTexture(Texture::initTexture2D(":/crate.png"));
|
||||
mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
||||
mMeshes.back()->setUniform("uTexture", 0);
|
||||
mMeshes.back()->texture().bind();
|
||||
|
||||
mMeshes.back()->texture().release();
|
||||
|
||||
mMeshes.back()->mVAO.bind();
|
||||
mMeshes.back()->mNBO.destroy();
|
||||
mMeshes.back()->mNBO.create();
|
||||
mMeshes.back()->mNBO.bind();
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.texCoords().data(),
|
||||
mMeshes.back()->mShape.texCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.texCoords()[0]));
|
||||
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.getTexCoords().data(),
|
||||
mMeshes.back()->mShape.getTexCoords().size()
|
||||
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
||||
mMeshes.back()->mProgram.enableAttributeArray(1);
|
||||
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
||||
2, sizeof(QVector2D));
|
||||
|
@ -604,20 +594,24 @@ void ExampleScene::draw()
|
|||
{
|
||||
Scene::draw();
|
||||
|
||||
for (const auto & model : mModels) model->draw();
|
||||
|
||||
for (const auto & mesh : mMeshes) mesh->draw();
|
||||
|
||||
mTestPhong->mProgram.bind();
|
||||
mTestPhong->setUniform("uModelInverseTransposed",
|
||||
mTestPhong->mTransform.toMatrix().normalMatrix());
|
||||
mTestPhong->setUniform(
|
||||
"uLightPosition",
|
||||
MeshRenderer::getInstance("phongLight")->mTransform.translation());
|
||||
MeshRenderer::getInstance("phongLight")->mTransform.getTranslation());
|
||||
mTestPhong->setUniform("uCameraPosition",
|
||||
ExampleScene::Camera().transform().translation());
|
||||
ExampleScene::Camera().transform().getTranslation());
|
||||
mTestPhong->mProgram.release();
|
||||
mTestPhong->draw();
|
||||
|
||||
mTestAmbient->mProgram.bind();
|
||||
mTestAmbient->setUniform("uCameraPosition",
|
||||
ExampleScene::Camera().transform().translation());
|
||||
ExampleScene::Camera().transform().getTranslation());
|
||||
mTestAmbient->mProgram.release();
|
||||
mTestAmbient->draw();
|
||||
|
||||
|
@ -626,8 +620,9 @@ void ExampleScene::draw()
|
|||
mTestDiffuse->mTransform.toMatrix().normalMatrix());
|
||||
mTestDiffuse->setUniform(
|
||||
"uLightPosition",
|
||||
MeshRenderer::getInstance("diffuseLight")->mTransform.translation());
|
||||
mTestDiffuse->setUniform("uCameraPosition", ExampleScene::Camera().transform().translation());
|
||||
MeshRenderer::getInstance("diffuseLight")->mTransform.getTranslation());
|
||||
mTestDiffuse->setUniform("uCameraPosition",
|
||||
ExampleScene::Camera().transform().getTranslation());
|
||||
mTestDiffuse->mProgram.release();
|
||||
mTestDiffuse->draw();
|
||||
|
||||
|
@ -637,19 +632,21 @@ void ExampleScene::draw()
|
|||
mTestSpecular->mTransform.toMatrix().normalMatrix());
|
||||
mTestSpecular->setUniform(
|
||||
"uLightPosition",
|
||||
MeshRenderer::getInstance("specularLight")->mTransform.translation());
|
||||
mTestSpecular->setUniform("uCameraPosition", ExampleScene::Camera().transform().translation());
|
||||
MeshRenderer::getInstance("specularLight")->mTransform.getTranslation());
|
||||
mTestSpecular->setUniform("uCameraPosition",
|
||||
ExampleScene::Camera().transform().getTranslation());
|
||||
mTestSpecular->mProgram.release();
|
||||
mTestSpecular->draw();
|
||||
}
|
||||
|
||||
void ExampleScene::update()
|
||||
{
|
||||
auto position = MeshRenderer::getInstance("alienTestLight")->mTransform.translation();
|
||||
auto position = MeshRenderer::getInstance(
|
||||
"alienTestLight")->mTransform.getTranslation();
|
||||
Model::getInstance("alienTest")->setUniform(
|
||||
"uLight.position", position);
|
||||
Model::getInstance("alienTest")->setUniform(
|
||||
"uCameraPosition", ExampleScene::Camera().transform().translation());
|
||||
"uCameraPosition", ExampleScene::Camera().transform().getTranslation());
|
||||
auto posMatrix = Model::getInstance("alienTest")->mTransform.toMatrix();
|
||||
Model::getInstance("alienTest")->setUniform(
|
||||
"uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||
|
@ -661,11 +658,12 @@ void ExampleScene::update()
|
|||
"uMVP.projection", ExampleScene::Projection());
|
||||
Model::getInstance("alienTest")->mTransform.rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
||||
|
||||
position = MeshRenderer::getInstance("spartanTestLight")->mTransform.translation();
|
||||
position = MeshRenderer::getInstance(
|
||||
"spartanTestLight")->mTransform.getTranslation();
|
||||
Model::getInstance("spartanTest")->setUniform(
|
||||
"uLight.position", position);
|
||||
Model::getInstance("spartanTest")->setUniform(
|
||||
"uCameraPosition", ExampleScene::Camera().transform().translation());
|
||||
"uCameraPosition", ExampleScene::Camera().transform().getTranslation());
|
||||
posMatrix = Model::getInstance("spartanTest")->mTransform.toMatrix();
|
||||
Model::getInstance("spartanTest")->setUniform(
|
||||
"uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||
|
@ -682,11 +680,11 @@ void ExampleScene::update()
|
|||
MeshRenderer::getInstance("testPhong")->mTransform.rotate(
|
||||
0.75f, 1.0f, 0.5f, 0.0f);
|
||||
MeshRenderer::getInstance("testPhong")->mProgram.bind();
|
||||
position = MeshRenderer::getInstance("testLight")->mTransform.translation();
|
||||
position = MeshRenderer::getInstance("testLight")->mTransform.getTranslation();
|
||||
MeshRenderer::getInstance("testPhong")->setUniform(
|
||||
"uLight.position", position);
|
||||
MeshRenderer::getInstance("testPhong")->setUniform(
|
||||
"uCameraPosition", ExampleScene::Camera().transform().translation());
|
||||
"uCameraPosition", ExampleScene::Camera().transform().getTranslation());
|
||||
posMatrix = MeshRenderer::getInstance("testPhong")->mTransform.toMatrix();
|
||||
MeshRenderer::getInstance("testPhong")->setUniform(
|
||||
"uMVP.normalMatrix", posMatrix.normalMatrix());
|
||||
|
@ -722,7 +720,7 @@ void ExampleScene::update()
|
|||
static float translateX = 0.025f;
|
||||
float limit = -9.0f; // Origin position.x - 2.0f
|
||||
float posX =
|
||||
MeshRenderer::getInstance("topTriangle")->mTransform.translation().x();
|
||||
MeshRenderer::getInstance("topTriangle")->mTransform.getTranslation().x();
|
||||
if (posX < limit || posX > limit + 4.0f) {
|
||||
translateX = -translateX;
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
#include <qtkwidget.h>
|
||||
#include <mainwindow.h>
|
||||
#include <QSurfaceFormat>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
|
|
|
@ -24,8 +24,8 @@ const QMatrix4x4 & Camera3D::toMatrix()
|
|||
{
|
||||
mWorld.setToIdentity();
|
||||
// Qt6 renamed QMatrix4x4::conjugate() to conjugated()
|
||||
mWorld.rotate(mTransform.rotation().conjugated());
|
||||
mWorld.translate(-mTransform.translation());
|
||||
mWorld.rotate(mTransform.getRotation().conjugated());
|
||||
mWorld.translate(-mTransform.getTranslation());
|
||||
return mWorld;
|
||||
}
|
||||
|
||||
|
|
|
@ -22,21 +22,21 @@ namespace Qtk {
|
|||
static const QVector3D LocalUp;
|
||||
static const QVector3D LocalRight;
|
||||
|
||||
// Accessors
|
||||
inline Transform3D & transform() { return mTransform;}
|
||||
inline const QVector3D & translation() const
|
||||
{ return mTransform.translation();}
|
||||
inline const QQuaternion & rotation() const
|
||||
{ return mTransform.rotation();}
|
||||
const QMatrix4x4 & toMatrix();
|
||||
// Accessors
|
||||
inline Transform3D & transform() { return mTransform;}
|
||||
inline const QVector3D & translation() const
|
||||
{ return mTransform.getTranslation();}
|
||||
inline const QQuaternion & rotation() const
|
||||
{ return mTransform.getRotation();}
|
||||
const QMatrix4x4 & toMatrix();
|
||||
|
||||
// Queries
|
||||
inline QVector3D forward() const
|
||||
{ return mTransform.rotation().rotatedVector(LocalForward);}
|
||||
inline QVector3D right() const
|
||||
{ return mTransform.rotation().rotatedVector(LocalRight);}
|
||||
inline QVector3D up() const
|
||||
{ return mTransform.rotation().rotatedVector(LocalUp);}
|
||||
// Queries
|
||||
inline QVector3D forward() const
|
||||
{ return mTransform.getRotation().rotatedVector(LocalForward);}
|
||||
inline QVector3D right() const
|
||||
{ return mTransform.getRotation().rotatedVector(LocalRight);}
|
||||
inline QVector3D up() const
|
||||
{ return mTransform.getRotation().rotatedVector(LocalUp);}
|
||||
|
||||
private:
|
||||
Transform3D mTransform;
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
/*##############################################################################
|
||||
## Author: Shaun Reed ##
|
||||
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
||||
## About: Main window for Qt6 OpenGL widget application ##
|
||||
## ##
|
||||
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||
##############################################################################*/
|
||||
#ifndef QTK_MAINWIDGET_H
|
||||
#define QTK_MAINWIDGET_H
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <QMatrix4x4>
|
||||
#include <QOpenGLDebugLogger>
|
||||
#include <QOpenGLFunctions>
|
||||
#include <QOpenGLWidget>
|
||||
|
||||
#define QTK_DEBUG
|
||||
|
||||
class MeshRenderer;
|
||||
class Model;
|
||||
class Object;
|
||||
class Scene;
|
||||
class Skybox;
|
||||
class OpenGLTextureFactory;
|
||||
|
||||
class MainWidget : public QOpenGLWidget,
|
||||
protected QOpenGLFunctions {
|
||||
Q_OBJECT;
|
||||
|
||||
public:
|
||||
// Constructors
|
||||
MainWidget();
|
||||
explicit MainWidget(QWidget *parent);
|
||||
explicit MainWidget(const QSurfaceFormat &format);
|
||||
~MainWidget() override;
|
||||
|
||||
private:
|
||||
void teardownGL();
|
||||
void initObjects();
|
||||
|
||||
public:
|
||||
// Inherited virtual Members
|
||||
void paintGL() override;
|
||||
void initializeGL() override;
|
||||
void resizeGL(int width, int height) override;
|
||||
|
||||
protected slots:
|
||||
void update();
|
||||
void messageLogged(const QOpenGLDebugMessage &msg);
|
||||
|
||||
// Protected Helpers
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
void keyReleaseEvent(QKeyEvent *event);
|
||||
void mousePressEvent(QMouseEvent *event);
|
||||
void mouseReleaseEvent(QMouseEvent *event);
|
||||
|
||||
private:
|
||||
// Private helpers
|
||||
void initializeWidget();
|
||||
void printContextInformation();
|
||||
void updateCameraInput();
|
||||
|
||||
Scene * mScene;
|
||||
Object * mObject;
|
||||
|
||||
QOpenGLDebugLogger * mDebugLogger;
|
||||
};
|
||||
|
||||
#endif // QTK_MAINWIDGET_H
|
10
src/mesh.h
10
src/mesh.h
|
@ -87,11 +87,11 @@ namespace Qtk {
|
|||
: mVertices(v), mColors(c), mIndices(i), mTexCoords(t), mNormals(n)
|
||||
{}
|
||||
|
||||
inline const Vertices & vertices() const { return mVertices;}
|
||||
inline const Indices & indices() const { return mIndices;}
|
||||
inline const Colors & colors() const { return mColors;}
|
||||
inline const TexCoords & texCoords() const { return mTexCoords;}
|
||||
inline const Normals & normals() const { return mNormals;}
|
||||
inline const Vertices & getVertices() const { return mVertices;}
|
||||
inline const Indices & getIndexData() const { return mIndices;}
|
||||
inline const Colors & getColors() const { return mColors;}
|
||||
inline const TexCoords & getTexCoords() const { return mTexCoords;}
|
||||
inline const Normals & getNormals() const { return mNormals;}
|
||||
|
||||
protected:
|
||||
DrawMode mDrawMode;
|
||||
|
|
|
@ -68,9 +68,9 @@ void MeshRenderer::init()
|
|||
|
||||
// Combine position and color data into one vector, allowing us to use one VBO
|
||||
Vertices combined;
|
||||
combined.reserve(vertices().size() + colors().size());
|
||||
combined.insert(combined.end(), vertices().begin(), vertices().end());
|
||||
combined.insert(combined.end(), colors().begin(), colors().end());
|
||||
combined.reserve(getVertices().size() + getColors().size());
|
||||
combined.insert(combined.end(), getVertices().begin(), getVertices().end());
|
||||
combined.insert(combined.end(), getColors().begin(), getColors().end());
|
||||
|
||||
mVBO.allocate(combined.data(),
|
||||
combined.size() * sizeof(combined[0]));
|
||||
|
@ -82,7 +82,7 @@ void MeshRenderer::init()
|
|||
// Enable color attribute, setting offset to total size of vertices()
|
||||
mProgram.enableAttributeArray(1);
|
||||
mProgram.setAttributeBuffer(1, GL_FLOAT,
|
||||
vertices().size() * sizeof(vertices()[0]),
|
||||
getVertices().size() * sizeof(getVertices()[0]),
|
||||
3, sizeof(QVector3D));
|
||||
|
||||
mVBO.release();
|
||||
|
@ -104,7 +104,7 @@ void MeshRenderer::draw()
|
|||
setUniformMVP();
|
||||
|
||||
if (mShape.mDrawMode == QTK_DRAW_ARRAYS) {
|
||||
glDrawArrays(mDrawType, 0, vertices().size());
|
||||
glDrawArrays(mDrawType, 0, getVertices().size());
|
||||
}
|
||||
else if (mShape.mDrawMode == QTK_DRAW_ELEMENTS
|
||||
|| mShape.mDrawMode == QTK_DRAW_ELEMENTS_NORMALS) {
|
||||
|
@ -137,12 +137,12 @@ void MeshRenderer::setUniformMVP(const char * model, const char * view,
|
|||
void MeshRenderer::setColor(const QVector3D & color)
|
||||
{
|
||||
if (mShape.mColors.empty()) {
|
||||
for (const auto & vertex : mShape.vertices()) {
|
||||
for (const auto & vertex : mShape.getVertices()) {
|
||||
mShape.mColors.push_back(color);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (int i = 0; i < mShape.colors().size(); i++) {
|
||||
for (int i = 0; i < mShape.getColors().size(); i++) {
|
||||
mShape.mColors[i] = color;
|
||||
}
|
||||
}
|
||||
|
@ -150,7 +150,7 @@ void MeshRenderer::setColor(const QVector3D & color)
|
|||
|
||||
void MeshRenderer::setTexture(const char * path)
|
||||
{
|
||||
mTexture = new QOpenGLTexture(*Texture::initImage(path));
|
||||
mTexture = new QOpenGLTexture(*OpenGLTextureFactory::initImage(path));
|
||||
mHasTexture = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
#include <object.h>
|
||||
#include <qtkapi.h>
|
||||
|
||||
#include <utility>
|
||||
|
||||
|
||||
namespace Qtk {
|
||||
class QTKAPI MeshRenderer : public Object {
|
||||
|
@ -19,14 +21,14 @@ namespace Qtk {
|
|||
// Delegate constructors
|
||||
MeshRenderer(const char * name, Vertices vertices, Indices indices,
|
||||
DrawMode mode=QTK_DRAW_ARRAYS)
|
||||
: MeshRenderer(name, ShapeBase(mode, vertices, indices))
|
||||
: MeshRenderer(name, ShapeBase(mode, std::move(vertices), std::move(indices)))
|
||||
{}
|
||||
MeshRenderer(const char * name)
|
||||
: MeshRenderer(name, Cube(QTK_DRAW_ELEMENTS))
|
||||
{}
|
||||
// Constructor
|
||||
MeshRenderer(const char * name, const ShapeBase &shape);
|
||||
~MeshRenderer();
|
||||
explicit MeshRenderer(const char * name)
|
||||
: MeshRenderer(name, Cube(QTK_DRAW_ELEMENTS))
|
||||
{}
|
||||
// Constructor
|
||||
MeshRenderer(const char * name, const ShapeBase &shape);
|
||||
~MeshRenderer();
|
||||
|
||||
// Retrieve a mesh by name stored within a static QHash
|
||||
static MeshRenderer * getInstance(const QString & name);
|
||||
|
|
|
@ -175,7 +175,7 @@ void Model::flipTexture(const std::string & fileName, bool flipX, bool flipY)
|
|||
texture.mTexture->destroy();
|
||||
texture.mTexture->create();
|
||||
texture.mTexture->setData(
|
||||
*Texture::initImage(fullPath.c_str(), flipX, flipY));
|
||||
*OpenGLTextureFactory::initImage(fullPath.c_str(), flipX, flipY));
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
|
@ -388,7 +388,7 @@ ModelMesh::Textures Model::loadMaterialTextures(
|
|||
// If the texture has not yet been loaded
|
||||
if (!skip) {
|
||||
ModelTexture texture;
|
||||
texture.mTexture = Texture::initTexture2D(
|
||||
texture.mTexture = OpenGLTextureFactory::initTexture2D(
|
||||
std::string(mDirectory + '/' + fileName.C_Str()).c_str(),
|
||||
false, false);
|
||||
texture.mID = texture.mTexture->textureId();
|
||||
|
@ -412,8 +412,8 @@ void Model::sortModels()
|
|||
auto cameraDistance = [&cameraPos](const ModelMesh &a, const ModelMesh &b)
|
||||
{
|
||||
// Sort by the first vertex position, since all transforms will be the same
|
||||
return (cameraPos.translation().distanceToPoint(a.mVertices[0].mPosition))
|
||||
< (cameraPos.translation().distanceToPoint(b.mVertices[0].mPosition));
|
||||
return (cameraPos.getTranslation().distanceToPoint(a.mVertices[0].mPosition))
|
||||
< (cameraPos.getTranslation().distanceToPoint(b.mVertices[0].mPosition));
|
||||
};
|
||||
std::sort(mMeshes.begin(), mMeshes.end(), cameraDistance);
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
// QTK
|
||||
#include <qtkapi.h>
|
||||
#include <transform3D.h>
|
||||
#include <object.h>
|
||||
|
||||
namespace Qtk {
|
||||
struct QTKAPI ModelVertex {
|
||||
|
|
23
src/object.h
23
src/object.h
|
@ -33,19 +33,24 @@ namespace Qtk {
|
|||
|
||||
~Object() {}
|
||||
|
||||
inline const Vertices & vertices() { return mShape.mVertices;}
|
||||
inline const Indices & indices() { return mShape.mIndices;}
|
||||
inline const Colors & colors() { return mShape.mColors;}
|
||||
inline const TexCoords & texCoords() { return mShape.mTexCoords;}
|
||||
inline const Normals & normals() { return mShape.mNormals;}
|
||||
inline QOpenGLTexture & texture() const { return *mTexture;}
|
||||
// Look to MeshRenderer for wrapped texture functionality
|
||||
// + Object only exposes a QOpenGLTexture object with no wrapped features
|
||||
inline QOpenGLTexture & texture() const { return *mTexture;}
|
||||
// These custom types are wrapped for Qtk
|
||||
inline const Colors & getColors() { return mShape.mColors;}
|
||||
inline const Indices & getIndexData() { return mShape.mIndices;}
|
||||
inline const Normals & getNormals() { return mShape.mNormals;}
|
||||
inline const Shape & getShape() { return mShape;}
|
||||
inline const TexCoords & getTexCoords() { return mShape.mTexCoords;}
|
||||
inline const Vertices & getVertices() { return mShape.mVertices;}
|
||||
|
||||
virtual inline void setVertices(const Vertices & value) { mShape.mVertices = value;}
|
||||
virtual inline void setIndices(const Indices & value) { mShape.mIndices = value;}
|
||||
virtual inline void setColors(const Colors & value) { mShape.mColors = value;}
|
||||
virtual inline void setTexCoords(const TexCoords & value) { mShape.mTexCoords = value;}
|
||||
virtual inline void setIndices(const Indices & value) { mShape.mIndices = value;}
|
||||
virtual inline void setNormals(const Normals & value) { mShape.mNormals = value;}
|
||||
virtual inline void setShape(const Shape & value) { mShape = value;}
|
||||
virtual inline void setTexCoords(const TexCoords & value) { mShape.mTexCoords = value;}
|
||||
virtual inline void setVertices(const Vertices & value) { mShape.mVertices = value;}
|
||||
// To set mTexture use the accessor and QOpenGLTexture API
|
||||
|
||||
QOpenGLBuffer mVBO, mNBO;
|
||||
QOpenGLVertexArrayObject mVAO;
|
||||
|
|
|
@ -16,11 +16,11 @@ Skybox::Skybox(std::string right, std::string top, std::string front,
|
|||
std::string left, std::string bottom, std::string back,
|
||||
const std::string & name)
|
||||
: mVBO(QOpenGLBuffer::VertexBuffer),
|
||||
mVertices(Cube(QTK_DRAW_ELEMENTS).vertices()),
|
||||
mIndices(Cube(QTK_DRAW_ELEMENTS).indices())
|
||||
mVertices(Cube(QTK_DRAW_ELEMENTS).getVertices()),
|
||||
mIndices(Cube(QTK_DRAW_ELEMENTS).getIndexData())
|
||||
{
|
||||
init();
|
||||
mCubeMap = Texture::initCubeMap(
|
||||
mCubeMap = OpenGLTextureFactory::initCubeMap(
|
||||
QImage(right.c_str()).mirrored(), QImage(top.c_str()),
|
||||
QImage(front.c_str()), QImage(left.c_str()),
|
||||
QImage(bottom.c_str()), QImage(back.c_str()));
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
using namespace Qtk;
|
||||
|
||||
QImage * Texture::initImage(const char * image, bool flipX, bool flipY)
|
||||
QImage * OpenGLTextureFactory::initImage(const char * image, bool flipX, bool flipY)
|
||||
{
|
||||
// Qt6 limits loaded images to 256MB by default
|
||||
QImageReader::setAllocationLimit(512);
|
||||
|
@ -27,8 +27,8 @@ QImage * Texture::initImage(const char * image, bool flipX, bool flipY)
|
|||
return loadedImage;
|
||||
}
|
||||
|
||||
QOpenGLTexture * Texture::initTexture2D(const char * texture,
|
||||
bool flipX, bool flipY)
|
||||
QOpenGLTexture * OpenGLTextureFactory::initTexture2D(const char * texture,
|
||||
bool flipX, bool flipY)
|
||||
{
|
||||
QImage * image = initImage(texture, flipX, flipY);
|
||||
auto newTexture = new QOpenGLTexture(QOpenGLTexture::Target2D);
|
||||
|
@ -40,14 +40,14 @@ QOpenGLTexture * Texture::initTexture2D(const char * texture,
|
|||
return newTexture;
|
||||
}
|
||||
|
||||
QOpenGLTexture * Texture::initCubeMap(const char * tile)
|
||||
QOpenGLTexture * OpenGLTextureFactory::initCubeMap(const char * tile)
|
||||
{
|
||||
return initCubeMap(QImage(tile), QImage(tile),
|
||||
QImage(tile), QImage(tile),
|
||||
QImage(tile), QImage(tile));
|
||||
}
|
||||
|
||||
QOpenGLTexture * Texture::initCubeMap(
|
||||
QOpenGLTexture * OpenGLTextureFactory::initCubeMap(
|
||||
const char * right, const char * top,
|
||||
const char * front, const char * left,
|
||||
const char * bottom, const char * back)
|
||||
|
@ -57,7 +57,7 @@ QOpenGLTexture * Texture::initCubeMap(
|
|||
QImage(bottom), QImage(back));
|
||||
}
|
||||
|
||||
QOpenGLTexture * Texture::initCubeMap(
|
||||
QOpenGLTexture * OpenGLTextureFactory::initCubeMap(
|
||||
QImage right, QImage top,
|
||||
QImage front, QImage left,
|
||||
QImage bottom, QImage back)
|
||||
|
|
|
@ -14,9 +14,9 @@
|
|||
#include <qtkapi.h>
|
||||
|
||||
namespace Qtk {
|
||||
class QTKAPI Texture {
|
||||
class QTKAPI OpenGLTextureFactory {
|
||||
public:
|
||||
~Texture() {}
|
||||
~OpenGLTextureFactory() {}
|
||||
|
||||
// QImage
|
||||
static QImage * initImage(const char * image,
|
||||
|
@ -38,7 +38,7 @@ namespace Qtk {
|
|||
|
||||
private:
|
||||
// Private ctor to prevent creating instances of this class
|
||||
Texture() {}
|
||||
OpenGLTextureFactory() {}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -91,17 +91,17 @@ const QMatrix4x4 & Transform3D::toMatrix()
|
|||
* Queries
|
||||
******************************************************************************/
|
||||
|
||||
QVector3D Transform3D::forward() const
|
||||
QVector3D Transform3D::getForward() const
|
||||
{
|
||||
return mRotation.rotatedVector(LocalForward);
|
||||
}
|
||||
|
||||
QVector3D Transform3D::up() const
|
||||
QVector3D Transform3D::getUp() const
|
||||
{
|
||||
return mRotation.rotatedVector(LocalUp);
|
||||
}
|
||||
|
||||
QVector3D Transform3D::right() const
|
||||
QVector3D Transform3D::getRight() const
|
||||
{
|
||||
return mRotation.rotatedVector(LocalRight);
|
||||
}
|
||||
|
@ -116,16 +116,16 @@ namespace Qtk {
|
|||
QDebug operator<<(QDebug dbg, const Transform3D & transform)
|
||||
{
|
||||
dbg << "Transform3D\n{\n";
|
||||
dbg << "Position: <" << transform.translation().x() << ", "
|
||||
<< transform.translation().y() << ", "
|
||||
<< transform.translation().z() << ">\n";
|
||||
dbg << "Scale: <" << transform.scale().x() << ", "
|
||||
<< transform.scale().y() << ", "
|
||||
<< transform.scale().z() << ">\n";
|
||||
dbg << "Rotation: <" << transform.rotation().x() << ", "
|
||||
<< transform.rotation().y() << ", "
|
||||
<< transform.rotation().z() << " | " <<
|
||||
transform.rotation().scalar() << ">\n}";
|
||||
dbg << "Position: <" << transform.getTranslation().x() << ", "
|
||||
<< transform.getTranslation().y() << ", "
|
||||
<< transform.getTranslation().z() << ">\n";
|
||||
dbg << "Scale: <" << transform.getScale().x() << ", "
|
||||
<< transform.getScale().y() << ", "
|
||||
<< transform.getScale().z() << ">\n";
|
||||
dbg << "Rotation: <" << transform.getRotation().x() << ", "
|
||||
<< transform.getRotation().y() << ", "
|
||||
<< transform.getRotation().z() << " | " <<
|
||||
transform.getRotation().scalar() << ">\n}";
|
||||
return dbg;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -82,14 +82,14 @@ namespace Qtk {
|
|||
//
|
||||
// Accessors
|
||||
|
||||
inline const QVector3D & translation() const { return mTranslation;}
|
||||
inline const QVector3D & scale() const { return mScale; }
|
||||
inline const QQuaternion & rotation() const { return mRotation; }
|
||||
inline const QVector3D & getTranslation() const { return mTranslation;}
|
||||
inline const QVector3D & getScale() const { return mScale; }
|
||||
inline const QQuaternion & getRotation() const { return mRotation; }
|
||||
const QMatrix4x4 & toMatrix();
|
||||
|
||||
QVector3D forward() const;
|
||||
QVector3D up() const;
|
||||
QVector3D right() const;
|
||||
QVector3D getForward() const;
|
||||
QVector3D getUp() const;
|
||||
QVector3D getRight() const;
|
||||
|
||||
static const QVector3D LocalForward, LocalUp, LocalRight;
|
||||
|
||||
|
|
Loading…
Reference in New Issue