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-24 22:26:53 +00: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-24 22:26:53 +00:00
|
|
|
|
2022-08-07 13:12:12 -04:00
|
|
|
class Object;
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-24 22:26:53 +00: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-24 22:26:53 +00: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-24 22:26:53 +00: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-24 22:26:53 +00: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)
|
|
|
|
|
2022-11-26 18:24:38 +00:00
|
|
|
// clang-format off
|
2022-11-24 22:26:53 +00:00
|
|
|
// A series of direction vectors to represent cube face normal
|
2022-11-26 18:24:38 +00:00
|
|
|
#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
|
|
|
|
// clang-format on
|
|
|
|
|
2022-11-24 22:26:53 +00:00
|
|
|
|
|
|
|
// 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-24 22:26:53 +00: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-11-24 22:26:53 +00:00
|
|
|
// TODO: Vertices.getData(); Vertices.getStride();
|
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-26 18:24:38 +00:00
|
|
|
/**
|
|
|
|
* The OpenGL draw mode to initialize QTK shape data for.
|
|
|
|
* Different draw modes require different organization of data.
|
|
|
|
* This enum allows us to predefine simple geometry for different draw modes.
|
|
|
|
*/
|
2022-11-24 22:26:53 +00:00
|
|
|
enum DrawMode {
|
|
|
|
QTK_DRAW_ARRAYS,
|
|
|
|
QTK_DRAW_ELEMENTS,
|
|
|
|
QTK_DRAW_ELEMENTS_NORMALS
|
|
|
|
};
|
2022-08-07 13:12:12 -04:00
|
|
|
|
2022-11-26 18:24:38 +00:00
|
|
|
/**
|
|
|
|
* Base class for all simple shape objects.
|
|
|
|
*/
|
2022-08-07 13:12:12 -04:00
|
|
|
struct QTKAPI ShapeBase {
|
2022-11-26 18:24:38 +00:00
|
|
|
public:
|
|
|
|
/*************************************************************************
|
|
|
|
* Constructors / Destructors
|
|
|
|
************************************************************************/
|
|
|
|
|
2022-11-24 22:26:53 +00:00
|
|
|
explicit ShapeBase(
|
|
|
|
DrawMode mode = QTK_DRAW_ARRAYS, Vertices v = {}, Indices i = {},
|
|
|
|
Colors c = {}, TexCoords t = {}, Normals n = {}) :
|
|
|
|
mDrawMode(mode),
|
|
|
|
mVertices(std::move(v)), mColors(std::move(c)),
|
|
|
|
mIndices(std::move(i)), mTexCoords(std::move(t)),
|
|
|
|
mNormals(std::move(n)) {}
|
|
|
|
|
2022-11-26 18:24:38 +00:00
|
|
|
/*************************************************************************
|
|
|
|
* Accessors
|
|
|
|
************************************************************************/
|
|
|
|
|
2022-11-24 22:26:53 +00:00
|
|
|
[[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;
|
|
|
|
}
|
|
|
|
|
|
|
|
[[nodiscard]] inline size_t getTexCoordsStride() const {
|
|
|
|
return mTexCoords.size() * sizeof(mTexCoords[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
2022-11-26 18:24:38 +00:00
|
|
|
/*************************************************************************
|
|
|
|
* Protected Members
|
|
|
|
************************************************************************/
|
|
|
|
|
2022-11-24 22:26:53 +00:00
|
|
|
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-26 18:24:38 +00:00
|
|
|
public:
|
|
|
|
/*************************************************************************
|
|
|
|
* Typedefs
|
|
|
|
************************************************************************/
|
|
|
|
|
2022-11-24 22:26:53 +00:00
|
|
|
friend MeshRenderer;
|
|
|
|
friend Object;
|
|
|
|
|
2022-11-26 18:24:38 +00:00
|
|
|
/*************************************************************************
|
|
|
|
* Constructors / Destructors
|
|
|
|
************************************************************************/
|
|
|
|
|
2022-11-24 22:26:53 +00:00
|
|
|
Shape() = default;
|
|
|
|
|
|
|
|
explicit Shape(const ShapeBase & rhs) : ShapeBase(rhs) {}
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-26 18:24:38 +00:00
|
|
|
/*************************************************************************
|
|
|
|
* Setters
|
|
|
|
************************************************************************/
|
|
|
|
|
2022-11-24 22:26:53 +00:00
|
|
|
virtual inline void setVertices(const Vertices & value) {
|
|
|
|
mVertices = value;
|
|
|
|
}
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-24 22:26:53 +00: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-26 18:24:38 +00:00
|
|
|
/* Primitives inherit from ShapeBase, doesn't allow setting shape values. */
|
2022-11-24 22:26:53 +00:00
|
|
|
class QTKAPI Mesh {};
|
|
|
|
|
2022-11-26 18:24:38 +00:00
|
|
|
/* Simple Cube shape. */
|
2022-08-07 13:12:12 -04:00
|
|
|
struct QTKAPI Cube : public ShapeBase {
|
2022-11-24 22:26:53 +00: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-11-26 18:24:38 +00:00
|
|
|
/* Simple Triangle shape. */
|
2022-08-07 13:12:12 -04:00
|
|
|
struct QTKAPI Triangle : public ShapeBase {
|
2022-11-24 22:26:53 +00:00
|
|
|
explicit Triangle(DrawMode mode = QTK_DRAW_ARRAYS);
|
2022-08-07 13:12:12 -04:00
|
|
|
};
|
2022-11-24 22:26:53 +00:00
|
|
|
} // namespace Qtk
|
2021-09-03 12:56:57 -04:00
|
|
|
|
2022-11-24 22:26:53 +00:00
|
|
|
#endif // QTK_MESH_H
|