diff --git a/CMakeLists.txt b/CMakeLists.txt index 97ef03b..9797af6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,10 +31,7 @@ endif() set(SOURCES app/main.cpp) qt6_add_big_resources(SOURCES resources.qrc) -add_executable( - qtk # Executable name - ${SOURCES} # Executable source code -) +add_executable(qtk ${SOURCES}) ################################################################################ # External Libraries diff --git a/app/main.cpp b/app/main.cpp index 15f56c9..8aec92f 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -9,8 +9,8 @@ #include #include -#include #include +#include int main(int argc, char *argv[]) diff --git a/src/camera3d.cpp b/src/camera3d.cpp index fde5e22..b261a56 100644 --- a/src/camera3d.cpp +++ b/src/camera3d.cpp @@ -23,8 +23,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; } diff --git a/src/camera3d.h b/src/camera3d.h index 632b883..4b965bc 100644 --- a/src/camera3d.h +++ b/src/camera3d.h @@ -24,18 +24,18 @@ public: // Accessors inline Transform3D & transform() { return mTransform;} inline const QVector3D & translation() const - { return mTransform.translation();} + { return mTransform.getTranslation();} inline const QQuaternion & rotation() const - { return mTransform.rotation();} + { return mTransform.getRotation();} const QMatrix4x4 & toMatrix(); // Queries inline QVector3D forward() const - { return mTransform.rotation().rotatedVector(LocalForward);} + { return mTransform.getRotation().rotatedVector(LocalForward);} inline QVector3D right() const - { return mTransform.rotation().rotatedVector(LocalRight);} + { return mTransform.getRotation().rotatedVector(LocalRight);} inline QVector3D up() const - { return mTransform.rotation().rotatedVector(LocalUp);} + { return mTransform.getRotation().rotatedVector(LocalUp);} private: Transform3D mTransform; diff --git a/src/mainwidget.cpp b/src/mainwidget.cpp index e1a82cf..3555b69 100644 --- a/src/mainwidget.cpp +++ b/src/mainwidget.cpp @@ -62,8 +62,8 @@ void MainWidget::initObjects() // The Object class only stores basic QOpenGL* members and shape data // + Within mainwidget, mObject serves as a basic QOpenGL example mObject = new Object("testObject"); - mObject->setVertices(Cube(QTK_DRAW_ELEMENTS).vertices()); - mObject->setIndices(Cube(QTK_DRAW_ELEMENTS).indices()); + mObject->setVertices(Cube(QTK_DRAW_ELEMENTS).getVertices()); + mObject->setIndices(Cube(QTK_DRAW_ELEMENTS).getIndexData()); mObject->mProgram.create(); mObject->mProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/solid-ambient.vert"); @@ -79,13 +79,15 @@ void MainWidget::initObjects() mObject->mVBO.setUsagePattern(QOpenGLBuffer::StaticDraw); mObject->mVBO.bind(); - mObject->mVBO.allocate(mObject->vertices().data(), - mObject->vertices().size() - * sizeof(mObject->vertices()[0])); + mObject->mVBO.allocate( + mObject->getVertices().data(), + mObject->getVertices().size() * sizeof(mObject->getVertices()[0]) + ); mObject->mProgram.enableAttributeArray(0); - mObject->mProgram.setAttributeBuffer(0, GL_FLOAT, 0, - 3, sizeof(mObject->vertices()[0])); + mObject->mProgram.setAttributeBuffer( + 0, GL_FLOAT, 0, 3, sizeof(mObject->getVertices()[0]) + ); mObject->mProgram.setUniformValue("uColor", QVector3D(1.0f, 0.0f, 0.0f)); mObject->mProgram.setUniformValue("uLightColor", WHITE); mObject->mProgram.setUniformValue("uAmbientStrength", 0.75f); @@ -116,8 +118,8 @@ void MainWidget::paintGL() mObject->mProgram.setUniformValue("uModel", mObject->mTransform.toMatrix()); mObject->mProgram.setUniformValue("uView", Scene::Camera().toMatrix()); mObject->mProgram.setUniformValue("uProjection", Scene::Projection()); - glDrawElements(GL_TRIANGLES, mObject->indices().size(), - GL_UNSIGNED_INT, mObject->indices().data()); + glDrawElements(GL_TRIANGLES, mObject->getIndexData().size(), + GL_UNSIGNED_INT, mObject->getIndexData().data()); mObject->mVAO.release(); mObject->mProgram.release(); } diff --git a/src/mainwidget.h b/src/mainwidget.h index ff00232..8fc0ddf 100644 --- a/src/mainwidget.h +++ b/src/mainwidget.h @@ -22,7 +22,7 @@ class Model; class Object; class Scene; class Skybox; -class Texture; +class OpenGLTextureFactory; class MainWidget : public QOpenGLWidget, protected QOpenGLFunctions { diff --git a/src/mesh.h b/src/mesh.h index 49db0c2..ca84d91 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -86,11 +86,11 @@ struct ShapeBase { : 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; diff --git a/src/meshrenderer.cpp b/src/meshrenderer.cpp index f18849a..7d2270b 100644 --- a/src/meshrenderer.cpp +++ b/src/meshrenderer.cpp @@ -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; } diff --git a/src/meshrenderer.h b/src/meshrenderer.h index 609492b..d51618f 100644 --- a/src/meshrenderer.h +++ b/src/meshrenderer.h @@ -11,15 +11,17 @@ #include #include +#include + class MeshRenderer : public Object { public: // 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) + explicit MeshRenderer(const char * name) : MeshRenderer(name, Cube(QTK_DRAW_ELEMENTS)) {} // Constructor diff --git a/src/model.cpp b/src/model.cpp index 4772350..f2260eb 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -173,7 +173,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; } } @@ -383,7 +383,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(); @@ -407,8 +407,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); } diff --git a/src/model.h b/src/model.h index 47c5124..89da513 100644 --- a/src/model.h +++ b/src/model.h @@ -24,6 +24,7 @@ // QTK #include +#include struct ModelVertex { diff --git a/src/object.h b/src/object.h index c48b62e..e344f62 100644 --- a/src/object.h +++ b/src/object.h @@ -32,19 +32,24 @@ public: ~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;} + // 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; diff --git a/src/scene.cpp b/src/scene.cpp index 17929f4..2a99731 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -64,12 +64,11 @@ void Scene::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(); @@ -89,9 +88,9 @@ void Scene::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)); @@ -113,9 +112,9 @@ void Scene::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)); @@ -139,9 +138,9 @@ void Scene::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)); @@ -241,8 +240,7 @@ void Scene::init() // Test basic cube with phong.vert and phong.frag shaders - mMeshes.push_back( - new MeshRenderer("testLight", Triangle(QTK_DRAW_ELEMENTS))); + mMeshes.push_back(new MeshRenderer("testLight", Triangle(QTK_DRAW_ELEMENTS))); mMeshes.back()->mTransform.setTranslation(5.0f, 1.25f, 10.0f); mMeshes.back()->mTransform.scale(0.25f); mMeshes.back()->setDrawType(GL_LINE_LOOP); @@ -250,8 +248,7 @@ void Scene::init() mMeshes.back()->setColor(GREEN); mMeshes.back()->init(); - mMeshes.push_back( - new MeshRenderer("testPhong", Cube(QTK_DRAW_ARRAYS))); + mMeshes.push_back(new MeshRenderer("testPhong", Cube(QTK_DRAW_ARRAYS))); mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, 10.0f); mMeshes.back()->setShaders(":/phong.vert", ":/phong.frag"); mMeshes.back()->setColor(QVector3D(0.0f, 0.25f, 0.0f)); @@ -262,9 +259,9 @@ void Scene::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)); @@ -294,8 +291,7 @@ void Scene::init() new MeshRenderer("rightTriangle", Triangle(QTK_DRAW_ELEMENTS))); mMeshes.back()->mTransform.setTranslation(-5.0f, 0.0f, -2.0f); - mMeshes.push_back( - new MeshRenderer("centerCube", Cube(QTK_DRAW_ELEMENTS))); + mMeshes.push_back(new MeshRenderer("centerCube", Cube(QTK_DRAW_ELEMENTS))); mMeshes.back()->mTransform.setTranslation(-7.0f, 0.0f, -2.0f); mMeshes.push_back( @@ -331,9 +327,9 @@ void Scene::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)); @@ -344,7 +340,8 @@ void Scene::init() // RGB Normals cube to show normals are correct with QTK_DRAW_ELEMENTS_NORMALS mMeshes.push_back( - new MeshRenderer("rgbNormalsCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS))); + new MeshRenderer("rgbNormalsCubeElementsTest", + Cube(QTK_DRAW_ELEMENTS_NORMALS))); mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, 2.0f); mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag"); mMeshes.back()->init(); @@ -353,9 +350,9 @@ void Scene::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)); @@ -375,19 +372,16 @@ void Scene::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)); @@ -406,13 +400,13 @@ void Scene::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(); @@ -430,16 +424,16 @@ void Scene::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)); @@ -449,8 +443,7 @@ void Scene::init() // Create a cube with custom shaders // + Apply RGB normals shader and spin the cube for a neat effect - mMeshes.push_back( - new MeshRenderer("rgbNormalsCube", Cube(QTK_DRAW_ARRAYS))); + mMeshes.push_back(new MeshRenderer("rgbNormalsCube", Cube(QTK_DRAW_ARRAYS))); mMeshes.back()->mTransform.setTranslation(5.0f, 2.0f, -2.0f); mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag"); mMeshes.back()->init(); @@ -459,9 +452,9 @@ void Scene::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)); @@ -481,9 +474,9 @@ void Scene::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)); @@ -503,9 +496,9 @@ void Scene::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)); @@ -521,19 +514,16 @@ void Scene::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)); @@ -550,19 +540,16 @@ void Scene::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)); @@ -605,24 +592,24 @@ void Scene::draw() { mSkybox.draw(); - for (auto & model : mModels) model->draw(); + for (const auto & model : mModels) model->draw(); - for (const auto &mesh : mMeshes) mesh->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", - Scene::Camera().transform().translation()); + Scene::Camera().transform().getTranslation()); mTestPhong->mProgram.release(); mTestPhong->draw(); mTestAmbient->mProgram.bind(); mTestAmbient->setUniform("uCameraPosition", - Scene::Camera().transform().translation()); + Scene::Camera().transform().getTranslation()); mTestAmbient->mProgram.release(); mTestAmbient->draw(); @@ -631,8 +618,9 @@ void Scene::draw() mTestDiffuse->mTransform.toMatrix().normalMatrix()); mTestDiffuse->setUniform( "uLightPosition", - MeshRenderer::getInstance("diffuseLight")->mTransform.translation()); - mTestDiffuse->setUniform("uCameraPosition", Scene::Camera().transform().translation()); + MeshRenderer::getInstance("diffuseLight")->mTransform.getTranslation()); + mTestDiffuse->setUniform("uCameraPosition", + Scene::Camera().transform().getTranslation()); mTestDiffuse->mProgram.release(); mTestDiffuse->draw(); @@ -642,19 +630,21 @@ void Scene::draw() mTestSpecular->mTransform.toMatrix().normalMatrix()); mTestSpecular->setUniform( "uLightPosition", - MeshRenderer::getInstance("specularLight")->mTransform.translation()); - mTestSpecular->setUniform("uCameraPosition", Scene::Camera().transform().translation()); + MeshRenderer::getInstance("specularLight")->mTransform.getTranslation()); + mTestSpecular->setUniform("uCameraPosition", + Scene::Camera().transform().getTranslation()); mTestSpecular->mProgram.release(); mTestSpecular->draw(); } void Scene::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", Scene::Camera().transform().translation()); + "uCameraPosition", Scene::Camera().transform().getTranslation()); auto posMatrix = Model::getInstance("alienTest")->mTransform.toMatrix(); Model::getInstance("alienTest")->setUniform( "uMVP.normalMatrix", posMatrix.normalMatrix()); @@ -666,11 +656,12 @@ void Scene::update() "uMVP.projection", Scene::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", Scene::Camera().transform().translation()); + "uCameraPosition", Scene::Camera().transform().getTranslation()); posMatrix = Model::getInstance("spartanTest")->mTransform.toMatrix(); Model::getInstance("spartanTest")->setUniform( "uMVP.normalMatrix", posMatrix.normalMatrix()); @@ -687,11 +678,11 @@ void Scene::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", Scene::Camera().transform().translation()); + "uCameraPosition", Scene::Camera().transform().getTranslation()); posMatrix = MeshRenderer::getInstance("testPhong")->mTransform.toMatrix(); MeshRenderer::getInstance("testPhong")->setUniform( "uMVP.normalMatrix", posMatrix.normalMatrix()); @@ -727,7 +718,7 @@ void Scene::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; } diff --git a/src/skybox.cpp b/src/skybox.cpp index 87aa163..3b6ed23 100644 --- a/src/skybox.cpp +++ b/src/skybox.cpp @@ -15,13 +15,13 @@ Skybox::Skybox(std::string right, std::string top, std::string front, std::string left, std::string bottom, std::string back, const std::string & name) - : 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()))), 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();} Skybox::Skybox(std::string name) diff --git a/src/texture.cpp b/src/texture.cpp index 3b7cb39..65df2e3 100644 --- a/src/texture.cpp +++ b/src/texture.cpp @@ -11,8 +11,7 @@ #include - -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); @@ -26,8 +25,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); @@ -39,14 +38,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) @@ -56,7 +55,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) diff --git a/src/texture.h b/src/texture.h index bf41dbf..6e27522 100644 --- a/src/texture.h +++ b/src/texture.h @@ -12,9 +12,9 @@ #include -class Texture { +class OpenGLTextureFactory { public: - ~Texture() {} + ~OpenGLTextureFactory() {} // QImage static QImage * initImage(const char * image, @@ -36,7 +36,7 @@ public: private: // Private ctor to prevent creating instances of this class - Texture() {} + OpenGLTextureFactory() {} }; #endif // QTOPENGL_TEXTURE_H diff --git a/src/transform3D.cpp b/src/transform3D.cpp index 7fc4b50..a94971e 100644 --- a/src/transform3D.cpp +++ b/src/transform3D.cpp @@ -90,17 +90,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); } @@ -113,16 +113,16 @@ QVector3D Transform3D::right() const 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; } diff --git a/src/transform3D.h b/src/transform3D.h index 2ce6c74..2bb3949 100644 --- a/src/transform3D.h +++ b/src/transform3D.h @@ -77,14 +77,14 @@ public: // // 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;