#pragma once #ifndef _NB_DRAW #define _NB_DRAW #include #include #include #include #include #include "Buffers.h" #include "Shader.h" #include "VAOManager.hpp" #define THROW_DRAW_ERROR(msg) throw DrawError(msg, __FILE__, __LINE__); namespace NB{ class DrawError : public std::runtime_error { public: DrawError(const std::string&, const std::string& file="", int line=-1); }; uint8_t VerticesFromPrimitives(GLenum, unsigned int num_prims=1); uint8_t PrimitivesFromVertices(GLenum, unsigned int); void copyVertexAttribute(const VertexAttribute&, VertexAttribute&); class DrawBuffer { public: typedef std::shared_ptr BufferManagerPointer; DrawBuffer(VertexAttributeList, GLenum prim_type=GL_TRIANGLES); //DrawBuffer(std::initializer_list, std::initializer_list); unsigned int vertSize() const; const std::shared_ptr shader() const; unsigned int elementBufferID() const; unsigned int vertexBufferID() const; virtual void draw() const; RawVec vertAttrData(unsigned int); VertexAttributeList changeVertLayout(unsigned int, VertexAttributePointer); RawVec vertAttrData(unsigned int, const RawVec&); virtual void elementData(const std::vector&); virtual void elementData(unsigned int); virtual void elementData(const std::vector&, unsigned int offset); virtual void vertexData(const RawVec&); virtual void vertexData(unsigned int num_verts); virtual void vertexData(const RawVec&, unsigned int offset); BufferManagerPointer _vert_data; BufferManagerPointer _elmt_data; VAOManager _VAO; const GLenum _gl_primitive_type=0; virtual VertexAttributeList defaultVAO(VertexAttributeList); unsigned int _num_verts, _num_prims; protected: }; class DrawInstanceBuffer : public DrawBuffer { public: DrawInstanceBuffer(VertexAttributeList, VertexAttributeList, GLenum primt_type=GL_TRIANGLES); unsigned int instSize() const; unsigned int instanceBufferID() const; virtual void draw() const override; VertexAttributeList changeInstanceLayout(unsigned int, VertexAttributePointer); virtual void instanceData(const RawVec&); virtual void instanceData(unsigned int); virtual void instanceData(const RawVec&, unsigned int offset); BufferManagerPointer _inst_data; virtual VertexAttributeList defaultVAO(VertexAttributeList); unsigned int _num_inst; protected: }; } #endif