#ifndef BUFFER_HPP #define BUFFER_HPP #include "open_engine/ref_scope.hpp" #include #include #include namespace OpenEngine { enum class ShaderDataType { Float = 0, Float2, Float3, Float4, Mat3, Mat4, Int, Int2, Int3, Int4, Bool }; uint32_t shaderDataTypeSize(ShaderDataType type); struct BufferLayoutElement { std::string name; ShaderDataType type; uint32_t size; uint32_t offset; bool normalized; BufferLayoutElement() {}; BufferLayoutElement(ShaderDataType type, const std::string& name, bool normalized = false) : name(name), type(type), size(shaderDataTypeSize(type)), offset(0), normalized(normalized) { }; uint32_t GetComponentCount() const; }; class BufferLayout { public: BufferLayout() {}; BufferLayout(const std::initializer_list& elements) : elements(elements) { CalculateOffsetsAndStride(); }; inline uint32_t GetStride() const { return stride; }; inline const std::vector& GetElements() const { return elements; }; std::vector::iterator begin() { return elements.begin(); }; std::vector::iterator end() { return elements.end(); }; std::vector::const_iterator begin() const { return elements.begin(); }; std::vector::const_iterator end() const { return elements.end(); }; private: void CalculateOffsetsAndStride(); std::vector elements; uint32_t stride = 0; }; class VertexBuffer { public: virtual ~VertexBuffer() = default; virtual void SetData(const void* data, uint32_t size) = 0; virtual void Bind() const = 0; virtual void UnBind() const = 0; virtual const BufferLayout& GetLayout() const = 0; virtual void SetLayout(const BufferLayout& layout) = 0; static Ref Create(uint32_t size); static Ref Create(float* vertices, uint32_t size); }; class IndexBuffer { public: virtual ~IndexBuffer() = default; virtual void Bind() const = 0; virtual void UnBind() const = 0; virtual uint32_t GetCount() const = 0; virtual uint32_t GetID() const = 0; static Ref Create(const uint32_t* indices, uint32_t count); }; } #endif // BUFFER_HPP