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: Collection of static mesh data for quick initialization ##
|
|
|
|
## ##
|
|
|
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
|
|
|
##############################################################################*/
|
|
|
|
#ifndef QTK_MESH_H
|
|
|
|
#define QTK_MESH_H
|
|
|
|
|
|
|
|
#include <QOpenGLWidget>
|
|
|
|
#include <QVector2D>
|
|
|
|
#include <QVector3D>
|
2022-11-19 16:00:20 -05:00
|
|
|
#include <utility>
|
2021-09-03 12:56:57 -04:00
|
|
|
|
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 {
|
|
|
|
class MeshRenderer;
|
2022-11-19 16:00:20 -05:00
|
|
|
|
2022-08-07 13:12:12 -04:00
|
|
|
class Object;
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
// Define vertices for drawing a cube using two faces (8 vertex points)
|
|
|
|
// Front Vertices
|
|
|
|
#define VERTEX_FTR QVector3D(0.5f, 0.5f, 0.5f) // 1
|
|
|
|
#define VERTEX_FTL QVector3D(-0.5f, 0.5f, 0.5f) // 2
|
|
|
|
#define VERTEX_FBL QVector3D(-0.5f, -0.5f, 0.5f) // 3
|
|
|
|
#define VERTEX_FBR QVector3D(0.5f, -0.5f, 0.5f) // 4
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
// Back Vertices
|
|
|
|
#define VERTEX_BTR QVector3D(0.5f, 0.5f, -0.5f) // 5
|
|
|
|
#define VERTEX_BTL QVector3D(-0.5f, 0.5f, -0.5f) // 6
|
|
|
|
#define VERTEX_BBL QVector3D(-0.5f, -0.5f, -0.5f) // 7
|
|
|
|
#define VERTEX_BBR QVector3D(0.5f, -0.5f, -0.5f) // 8
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
// Direction vectors
|
2021-09-03 12:56:57 -04:00
|
|
|
#define VECTOR_UP QVector3D(0.0f, 1.0f, 0.0f)
|
|
|
|
#define VECTOR_DOWN QVector3D(0.0f, -1.0f, 0.0f)
|
|
|
|
#define VECTOR_LEFT QVector3D(-1.0f, 0.0f, 0.0f)
|
|
|
|
#define VECTOR_RIGHT QVector3D(1.0f, 0.0f, 0.0f)
|
|
|
|
#define VECTOR_FORWARD QVector3D(0.0f, 0.0f, 1.0f)
|
|
|
|
#define VECTOR_BACK QVector3D(0.0f, 0.0f, -1.0f)
|
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
// Identity and zero vectors
|
|
|
|
#define VECTOR_ONE QVector3D(1.0f, 1.0f, 1.0f)
|
|
|
|
#define VECTOR_ZERO QVector3D(0.0f, 0.0f, 0.0f)
|
|
|
|
|
|
|
|
// A series of direction vectors to represent cube face normal
|
|
|
|
#define FACE_TOP \
|
|
|
|
VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_UP
|
|
|
|
#define FACE_BOTTOM \
|
|
|
|
VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN
|
|
|
|
#define FACE_LEFT \
|
|
|
|
VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT
|
|
|
|
#define FACE_RIGHT \
|
|
|
|
VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, \
|
|
|
|
VECTOR_RIGHT
|
|
|
|
#define FACE_FRONT \
|
|
|
|
VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, \
|
|
|
|
VECTOR_FORWARD, VECTOR_FORWARD
|
|
|
|
#define FACE_BACK \
|
|
|
|
VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK
|
|
|
|
|
|
|
|
// Colors using QVector3Ds as RGB values
|
|
|
|
#define WHITE VECTOR_ONE
|
|
|
|
#define BLACK VECTOR_ZERO
|
|
|
|
#define RED QVector3D(1.0f, 0.0f, 0.0f)
|
|
|
|
#define GREEN QVector3D(0.0f, 1.0f, 0.0f)
|
|
|
|
#define BLUE QVector3D(0.0f, 0.0f, 1.0f)
|
2021-09-03 12:56:57 -04:00
|
|
|
#define YELLOW QVector3D(1.0f, 1.0f, 0.0f)
|
|
|
|
#define CYAN QVector3D(0.0f, 1.0f, 1.0f)
|
|
|
|
#define MAGENTA QVector3D(1.0f, 0.0f, 1.0f)
|
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
#define UV_ORIGIN QVector2D(0.0f, 0.0f)
|
|
|
|
#define UV_TOP QVector2D(1.0f, 0.0f)
|
|
|
|
#define UV_RIGHT QVector2D(0.0f, 1.0f)
|
|
|
|
#define UV_CORNER QVector2D(1.0f, 1.0f)
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-08-07 13:12:12 -04:00
|
|
|
typedef std::vector<QVector3D> Vertices;
|
|
|
|
typedef std::vector<QVector3D> Colors;
|
|
|
|
typedef std::vector<GLuint> Indices;
|
|
|
|
typedef std::vector<QVector2D> TexCoords;
|
|
|
|
typedef std::vector<QVector3D> Normals;
|
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
enum DrawMode {
|
|
|
|
QTK_DRAW_ARRAYS,
|
|
|
|
QTK_DRAW_ELEMENTS,
|
|
|
|
QTK_DRAW_ELEMENTS_NORMALS
|
|
|
|
};
|
2022-08-07 13:12:12 -04:00
|
|
|
|
|
|
|
struct QTKAPI ShapeBase {
|
2022-11-19 16:00:20 -05:00
|
|
|
explicit ShapeBase(
|
|
|
|
DrawMode mode = QTK_DRAW_ARRAYS, Vertices v = {}, Indices i = {},
|
|
|
|
Colors c = {}, TexCoords t = {}, Normals n = {}) :
|
|
|
|
mVertices(std::move(std::move(v))),
|
|
|
|
mColors(std::move(std::move(c))), mIndices(std::move(std::move(i))),
|
|
|
|
mTexCoords(std::move(std::move(t))),
|
|
|
|
mNormals(std::move(std::move(n))) {}
|
|
|
|
|
|
|
|
[[nodiscard]] inline const Vertices & getVertices() const {
|
|
|
|
return mVertices;
|
|
|
|
}
|
|
|
|
|
|
|
|
[[nodiscard]] inline const Indices & getIndexData() const {
|
|
|
|
return mIndices;
|
|
|
|
}
|
|
|
|
|
|
|
|
[[nodiscard]] inline const Colors & getColors() const { return mColors; }
|
|
|
|
|
|
|
|
[[nodiscard]] inline const TexCoords & getTexCoords() const {
|
|
|
|
return mTexCoords;
|
|
|
|
}
|
|
|
|
|
|
|
|
[[nodiscard]] inline const Normals & getNormals() const {
|
|
|
|
return mNormals;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
DrawMode mDrawMode;
|
|
|
|
|
|
|
|
Vertices mVertices;
|
|
|
|
Colors mColors;
|
|
|
|
Indices mIndices;
|
|
|
|
TexCoords mTexCoords;
|
|
|
|
Normals mNormals;
|
2022-08-07 13:12:12 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
struct Shape : public ShapeBase {
|
2022-11-19 16:00:20 -05:00
|
|
|
friend MeshRenderer;
|
|
|
|
friend Object;
|
|
|
|
|
|
|
|
Shape() = default;
|
|
|
|
|
|
|
|
explicit Shape(const ShapeBase & rhs) : ShapeBase(rhs) {}
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
virtual inline void setVertices(const Vertices & value) {
|
|
|
|
mVertices = value;
|
|
|
|
}
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
virtual inline void setIndices(const Indices & value) {
|
|
|
|
mIndices = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual inline void setColors(const Colors & value) { mColors = value; }
|
|
|
|
|
|
|
|
virtual inline void setTexCoords(const TexCoords & value) {
|
|
|
|
mTexCoords = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual inline void setNormals(const Normals & value) {
|
|
|
|
mNormals = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual inline void setShape(const Shape & value) { *this = value; }
|
2022-08-07 13:12:12 -04:00
|
|
|
};
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-19 16:00:20 -05:00
|
|
|
// Primitives inherit from ShapeBase, does not allow setting of shape values
|
|
|
|
class QTKAPI Mesh {};
|
|
|
|
|
2022-08-07 13:12:12 -04:00
|
|
|
struct QTKAPI Cube : public ShapeBase {
|
2022-11-19 16:00:20 -05:00
|
|
|
explicit Cube(DrawMode mode = QTK_DRAW_ARRAYS);
|
2022-08-07 13:12:12 -04:00
|
|
|
};
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-08-07 13:12:12 -04:00
|
|
|
struct QTKAPI Triangle : public ShapeBase {
|
2022-11-19 16:00:20 -05:00
|
|
|
explicit Triangle(DrawMode mode = QTK_DRAW_ARRAYS);
|
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_MESH_H
|