X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmodel.hpp;h=096e1cfd3aff2738f6288a6909c557d227ed3909;hb=83ed3de28841d1eecfca39ff540e804cf6809b32;hp=62f467c4f787a6de9547f450af12197dd3e955f6;hpb=0d6efa28245acaf22383bdf398b5537d1fe33ce2;p=blank.git diff --git a/src/model.hpp b/src/model.hpp index 62f467c..096e1cf 100644 --- a/src/model.hpp +++ b/src/model.hpp @@ -22,44 +22,122 @@ public: using Indices = std::vector; public: - Positions vertices; - Colors colors; - Normals normals; - Indices 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 Update(const Buffer &) noexcept; - void Clear(); - void Reserve(int vtx_count, int idx_count); - - void CheckUpdate(); - 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; + using Colors = std::vector; + using Lights = std::vector; + using Indices = std::vector; + +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; }; @@ -81,21 +159,21 @@ public: 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 {