#pragma once #ifndef _NB_DRAW #define _NB_DRAW #include #include #include #include #include #include "Buffers.h" #include "Shader.h" namespace NB{ class DrawWarning : public std::runtime_error { public: DrawWarning(const std::string&); }; uint8_t GLSLTypeSize(GLenum); uint8_t GLSLPrimitiveVertexSize(GLenum, unsigned int num_prims=1); template std::vector rawDataVector(const std::vector& vec) { unsigned int num_bytes = vec.size() * sizeof(T); std::vector ret(num_bytes); memcpy(ret.data(), vec.data(), num_bytes); return ret; } struct VertexAttributePointer { int32_t offset; GLsizei stride = -1; }; struct VertexAttribute { const GLint GLSLSize; const GLenum GLSLType; const GLboolean GLSLNormalization; VertexAttributePointer ptr; }; class DrawBuffer { public: DrawBuffer(std::vector, const Shader&); //DrawBuffer(std::initializer_list, std::initializer_list); unsigned int vertSize() const; std::vector getLayout() const; const Shader shader() const; bool keepLocalElement() const; bool keepLocalVertex() const; unsigned int elementBufferID() const; unsigned int vertexBufferID() const; virtual void draw() const; bool keepLocalElement(bool); bool keepLocalVertex(bool); const Shader shader(const Shader&); virtual std::vector setLayout(); virtual std::vector setLayout(std::vector); virtual void generateElementBuffer(std::vector, GLenum gl_primitive_type=GL_TRIANGLES); virtual void generateElementBuffer(unsigned int, GLenum gl_primitive_type=GL_TRIANGLES); virtual void generateVertexBuffer(std::vector); virtual void generateVertexBuffer(unsigned int); virtual void loadElementBuffer(const std::vector&, unsigned int offset=0, GLenum gl_primitive_type=GL_TRIANGLES); virtual void loadVertexBuffer(const std::vector&, unsigned int offset=0); protected: std::vector _vertex_attributes; BufferManager _vert_data; BufferManager _elmt_data; Shader _shader; unsigned int _num_verts, _num_prims, _VAO; GLenum _gl_primitive_type; }; } #endif