2021-09-03 12:56:57 -04:00
|
|
|
/*##############################################################################
|
|
|
|
## Author: Shaun Reed ##
|
2022-03-06 11:54:05 -05:00
|
|
|
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
|
2021-09-03 12:56:57 -04:00
|
|
|
## About: Model classes for importing with Assimp ##
|
|
|
|
## From following tutorials on learnopengl.com ##
|
|
|
|
## ##
|
|
|
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
|
|
|
##############################################################################*/
|
|
|
|
#ifndef QTK_MODEL_H
|
|
|
|
#define QTK_MODEL_H
|
|
|
|
|
|
|
|
// QT
|
|
|
|
#include <QObject>
|
|
|
|
#include <QOpenGLBuffer>
|
|
|
|
#include <QOpenGLFunctions>
|
|
|
|
#include <QOpenGLShaderProgram>
|
|
|
|
#include <QOpenGLTexture>
|
|
|
|
#include <QOpenGLVertexArrayObject>
|
|
|
|
|
|
|
|
// Assimp
|
|
|
|
#include <assimp/postprocess.h>
|
|
|
|
#include <assimp/scene.h>
|
2022-11-19 16:00:20 -05:00
|
|
|
#include <assimp/Importer.hpp>
|
2021-09-03 12:56:57 -04:00
|
|
|
|
|
|
|
// QTK
|
2022-11-19 16:00:20 -05:00
|
|
|
#include <object.h>
|
2022-08-07 13:12:12 -04:00
|
|
|
#include <qtkapi.h>
|
2021-09-03 12:56:57 -04:00
|
|
|
#include <transform3D.h>
|
|
|
|
|
2022-08-07 13:12:12 -04:00
|
|
|
namespace Qtk {
|
|
|
|
struct QTKAPI ModelVertex {
|
2022-11-19 16:00:20 -05:00
|
|
|
QVector3D mPosition;
|
|
|
|
QVector3D mNormal;
|
|
|
|
QVector3D mTangent;
|
|
|
|
QVector3D mBitangent;
|
|
|
|
QVector2D mTextureCoord;
|
2022-08-07 13:12:12 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
struct QTKAPI ModelTexture {
|
2022-11-19 16:00:20 -05:00
|
|
|
GLuint mID;
|
|
|
|
QOpenGLTexture * mTexture;
|
|
|
|
std::string mType;
|
|
|
|
std::string mPath;
|
2022-08-07 13:12:12 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
class Model;
|
|
|
|
|
|
|
|
class QTKAPI ModelMesh : protected QOpenGLFunctions {
|
2022-11-19 16:00:20 -05:00
|
|
|
public:
|
|
|
|
friend Model;
|
|
|
|
typedef std::vector<ModelVertex> Vertices;
|
|
|
|
typedef std::vector<GLuint> Indices;
|
|
|
|
typedef std::vector<ModelTexture> Textures;
|
|
|
|
|
|
|
|
// Constructors, Destructors
|
|
|
|
ModelMesh(
|
|
|
|
Vertices vertices, Indices indices, Textures textures,
|
|
|
|
const char * vertexShader = ":/model-basic.vert",
|
|
|
|
const char * fragmentShader = ":/model-basic.frag") :
|
|
|
|
mProgram(new QOpenGLShaderProgram),
|
|
|
|
mVAO(new QOpenGLVertexArrayObject),
|
|
|
|
mVBO(new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer)),
|
|
|
|
mEBO(new QOpenGLBuffer(QOpenGLBuffer::IndexBuffer)),
|
|
|
|
mVertices(std::move(vertices)), mIndices(std::move(indices)),
|
|
|
|
mTextures(std::move(textures)) {
|
|
|
|
initMesh(vertexShader, fragmentShader);
|
|
|
|
}
|
|
|
|
|
|
|
|
~ModelMesh() = default;
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
private:
|
|
|
|
void initMesh(const char * vert, const char * frag);
|
|
|
|
|
|
|
|
// ModelMesh Private Members
|
|
|
|
QOpenGLBuffer *mVBO, *mEBO;
|
|
|
|
QOpenGLVertexArrayObject * mVAO;
|
|
|
|
QOpenGLShaderProgram * mProgram;
|
|
|
|
|
|
|
|
public:
|
|
|
|
inline void draw() { draw(*mProgram); }
|
|
|
|
|
|
|
|
void draw(QOpenGLShaderProgram & shader);
|
|
|
|
|
|
|
|
// ModelMesh Public Members
|
|
|
|
Vertices mVertices;
|
|
|
|
Indices mIndices;
|
|
|
|
Textures mTextures;
|
|
|
|
Transform3D mTransform;
|
|
|
|
};
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-08-07 13:12:12 -04:00
|
|
|
class QTKAPI Model : public QObject {
|
2022-11-19 16:00:20 -05:00
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
inline Model(
|
|
|
|
const char * name, const char * path,
|
|
|
|
const char * vertexShader = ":/model-basic.vert",
|
|
|
|
const char * fragmentShader = ":/model-basic.frag") :
|
|
|
|
mName(name),
|
|
|
|
mVertexShader(vertexShader), mFragmentShader(fragmentShader) {
|
|
|
|
loadModel(path);
|
|
|
|
}
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
inline ~Model() override { mManager.remove(mName); }
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
void draw();
|
|
|
|
void draw(QOpenGLShaderProgram & shader);
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
void flipTexture(
|
|
|
|
const std::string & fileName, bool flipX = false, bool flipY = true);
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
template <typename T> void setUniform(const char * location, T value) {
|
|
|
|
for(auto & mesh : mMeshes) {
|
|
|
|
mesh.mProgram->bind();
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
mesh.mProgram->setUniformValue(location, value);
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
mesh.mProgram->release();
|
|
|
|
}
|
2022-08-07 13:12:12 -04:00
|
|
|
}
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
Transform3D mTransform;
|
|
|
|
|
|
|
|
static Model * getInstance(const char * name);
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
typedef QHash<QString, Model *> ModelManager;
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
private:
|
|
|
|
static ModelManager mManager;
|
|
|
|
void loadModel(const std::string & path);
|
|
|
|
void processNode(aiNode * node, const aiScene * scene);
|
|
|
|
ModelMesh processMesh(aiMesh * mesh, const aiScene * scene);
|
|
|
|
ModelMesh::Textures loadMaterialTextures(
|
|
|
|
aiMaterial * mat, aiTextureType type, const std::string & typeName);
|
|
|
|
void sortModels();
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
// Model Private Members
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
ModelMesh::Textures mTexturesLoaded;
|
|
|
|
std::vector<ModelMesh> mMeshes;
|
|
|
|
std::string mDirectory;
|
|
|
|
const char *mVertexShader, *mFragmentShader, *mName;
|
2022-08-07 13:12:12 -04:00
|
|
|
};
|
2022-11-19 16:00:20 -05:00
|
|
|
} // namespace Qtk
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
#endif // QTK_MODEL_H
|