class Model {
public:
+ using Position = glm::vec3;
+ using Color = glm::vec3;
+ using Normal = glm::vec3;
using Index = unsigned int;
+ using Positions = std::vector<Position>;
+ using Colors = std::vector<Color>;
+ using Normals = std::vector<Normal>;
+ using Indices = std::vector<Index>;
+
public:
- std::vector<glm::vec3> vertices;
- std::vector<glm::vec3> colors;
- std::vector<glm::vec3> normals;
- std::vector<Index> indices;
+ struct Buffer {
+
+ Positions vertices;
+ Colors colors;
+ Normals normals;
+ Indices indices;
+
+ void Clear() noexcept {
+ vertices.clear();
+ colors.clear();
+ normals.clear();
+ indices.clear();
+ }
+
+ void Reserve(size_t p, size_t i) {
+ vertices.reserve(p);
+ colors.reserve(p);
+ normals.reserve(p);
+ indices.reserve(i);
+ }
+
+ };
public:
- Model();
- ~Model();
+ Model() noexcept;
+ ~Model() noexcept;
Model(const Model &) = delete;
Model &operator =(const Model &) = delete;
- Model(Model &&);
- Model &operator =(Model &&);
+ Model(Model &&) noexcept;
+ Model &operator =(Model &&) noexcept;
- void Invalidate() { dirty = true; }
-
- void Clear();
- void Reserve(int vtx_count, int idx_count);
+ void Update(const Buffer &) noexcept;
- void Draw();
+ void Draw() const noexcept;
private:
- void Update();
+ enum Attribute {
+ ATTRIB_VERTEX,
+ ATTRIB_COLOR,
+ ATTRIB_NORMAL,
+ ATTRIB_INDEX,
+ ATTRIB_COUNT,
+ };
+
+ GLuint va;
+ GLuint handle[ATTRIB_COUNT];
+ size_t count;
+
+};
+
+
+class BlockModel {
+
+public:
+ using Position = glm::vec3;
+ using Color = glm::vec3;
+ using Light = float;
+ using Index = unsigned int;
+
+ using Positions = std::vector<Position>;
+ using Colors = std::vector<Color>;
+ using Lights = std::vector<Light>;
+ using Indices = std::vector<Index>;
+
+public:
+ struct Buffer {
+
+ Positions vertices;
+ Colors colors;
+ Lights lights;
+ Indices indices;
+
+ void Clear() noexcept {
+ vertices.clear();
+ colors.clear();
+ lights.clear();
+ indices.clear();
+ }
+
+ void Reserve(size_t p, size_t i) {
+ vertices.reserve(p);
+ colors.reserve(p);
+ lights.reserve(p);
+ indices.reserve(i);
+ }
+
+ };
+
+public:
+ BlockModel() noexcept;
+ ~BlockModel() noexcept;
+
+ BlockModel(const BlockModel &) = delete;
+ BlockModel &operator =(const Model &) = delete;
+
+ BlockModel(BlockModel &&) noexcept;
+ BlockModel &operator =(BlockModel &&) noexcept;
+
+ void Update(const Buffer &) noexcept;
+
+ void Draw() const noexcept;
private:
enum Attribute {
ATTRIB_VERTEX,
ATTRIB_COLOR,
- ATTRIB_NORMAL,
+ ATTRIB_LIGHT,
ATTRIB_INDEX,
ATTRIB_COUNT,
};
+ GLuint va;
GLuint handle[ATTRIB_COUNT];
- bool dirty;
+ size_t count;
};
class OutlineModel {
public:
+ using Position = glm::vec3;
+ using Color = glm::vec3;
using Index = unsigned short;
+ using Positions = std::vector<Position>;
+ using Colors = std::vector<Color>;
+ using Indices = std::vector<Index>;
+
public:
- std::vector<glm::vec3> vertices;
- std::vector<glm::vec3> colors;
- std::vector<Index> indices;
+ Positions vertices;
+ Colors colors;
+ Indices indices;
public:
- OutlineModel();
- ~OutlineModel();
+ OutlineModel() noexcept;
+ ~OutlineModel() noexcept;
OutlineModel(const OutlineModel &) = delete;
OutlineModel &operator =(const OutlineModel &) = delete;
- void Invalidate() { dirty = true; }
+ void Invalidate() noexcept { dirty = true; }
- void Clear();
+ void Clear() noexcept;
void Reserve(int vtx_count, int idx_count);
- void Draw();
+ void Draw() noexcept;
private:
- void Update();
+ void Update() noexcept;
private:
enum Attribute {
ATTRIB_COUNT,
};
+ GLuint va;
GLuint handle[ATTRIB_COUNT];
bool dirty;