#pragma once #ifndef _NB_DRAW #define _NB_DRAW #include #include #include #include <> #include #include #include #include "Buffers.h" #include "Shader.h" #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: DrawBuffer(const Shader&, VertexAttributeList, GLenum prim_type=GL_TRIANGLES); //DrawBuffer(std::initializer_list, std::initializer_list); unsigned int vertSize() const; const Shader shader() const; bool keepLocalElement() const; bool keepLocalVertex() const; unsigned int elementBufferID() const; unsigned int vertexBufferID() const; virtual void draw() const; VertexAttributeList changeVertLayout(unsigned int, VertexAttributePointer); bool keepLocalElement(bool); bool keepLocalVertex(bool); const Shader shader(const Shader&); virtual void generateEBO(const std::vector&); virtual void generateEBO(unsigned int); virtual void loadEBO(const std::vector&, unsigned int offset=0); virtual void generateVBO(const RawVec&); virtual void generateVBO(unsigned int); virtual void loadVBO(const RawVec&, unsigned int offset=0); protected: VAOManager _VAO; const GLenum _gl_primitive_type=0; virtual VertexAttributeList defaultVAO(VertexAttributeList); BufferManager _vert_data; BufferManager _elmt_data; Shader _shader; unsigned int _num_verts, _num_prims; }; class DrawInstanceBuffer : public DrawBuffer { public: DrawInstanceBuffer(const Shader&, VertexAttributeList, VertexAttributeList, GLenum primt_type=GL_TRIANGLES); unsigned int instSize() const; virtual void draw() const; VertexAttributeList changeInstanceLayout(unsigned int, VertexAttributePointer); virtual void generateIBO(const RawVec&); virtual void generateIBO(unsigned int); virtual void loadIBO(const RawVec&, unsigned int offset=0); private: virtual VertexAttributeList defaultVAO(VertexAttributeList); BufferManager _inst_data; unsigned int _num_inst; }; class Camera { }; } #endif