/* * * Copyright (C) 2023 Brett Terpstra * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef BLT_WITH_GRAPHICS_MODEL_H #define BLT_WITH_GRAPHICS_MODEL_H #include #include #include #include namespace blt::gfx { class model_data { public: private: std::vector vertices; std::vector uvs; std::vector normals; }; class static_dynamic_array { private: static constexpr size_t DATA_SIZE = 8; std::variant data_; size_t size_ = DATA_SIZE; public: static_dynamic_array() = default; static_dynamic_array(const static_dynamic_array& copy) = delete; static_dynamic_array(static_dynamic_array&& move) noexcept; static_dynamic_array& operator=(const static_dynamic_array& copy) = delete; static_dynamic_array& operator=(static_dynamic_array&& move) = delete; ~static_dynamic_array() { if (std::holds_alternative(data_)) delete[] std::get(data_); } }; /** * basic VAO class. */ class basic_vertex_array { private: struct vbo_t { GLuint bufferID_ = 0; GLsizeiptr size_ = 0; vbo_t(); void bind(GLint buffer_type = GL_ARRAY_BUFFER) const; void allocate(GLsizeiptr size, GLint buffer_type = GL_ARRAY_BUFFER, GLint memory_type = GL_STATIC_DRAW, void* data = nullptr); static void sub_update(GLsizeiptr offset, GLsizeiptr size, void* data, GLint buffer_type = GL_ARRAY_BUFFER); void update(GLsizeiptr size, void* data, GLint buffer_type = GL_ARRAY_BUFFER, GLint memory_type = GL_STATIC_DRAW); ~vbo_t(); }; GLuint vaoID; public: basic_vertex_array(); }; } #endif //BLT_WITH_GRAPHICS_MODEL_H