X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fvertexsetup.h;fp=source%2Fcore%2Fvertexsetup.h;h=bae4c5f36c2245d194eacc6b08b1df25658dade7;hp=0000000000000000000000000000000000000000;hb=7aaec9a70b8d7733429bec043f8e33e02956f266;hpb=bec07999d95b76f4b47cffcc564d0cd0afc0435e diff --git a/source/core/vertexsetup.h b/source/core/vertexsetup.h new file mode 100644 index 00000000..bae4c5f3 --- /dev/null +++ b/source/core/vertexsetup.h @@ -0,0 +1,62 @@ +#ifndef MSP_GL_VERTEXSETUP_H_ +#define MSP_GL_VERTEXSETUP_H_ + +#include "bindable.h" +#include "vertexformat.h" + +namespace Msp { +namespace GL { + +class VertexArray; + +/** +Combines a VertexArray with an index buffer. This wraps OpenGL's vertex array +objects. Intended for internal use. +*/ +class VertexSetup: public Bindable +{ +private: + enum ComponentMask + { + VERTEX_ARRAY = 1, + INSTANCE_ARRAY = 2, + INDEX_BUFFER = 4, + UNUSED_ATTRIBS = 8, + ATTRIB_SHIFT = 4 + }; + + unsigned id; + mutable unsigned dirty; + const VertexArray *vertex_array; + VertexFormat vertex_format; + const VertexArray *inst_array; + VertexFormat inst_format; + const Buffer *index_buffer; + +public: + VertexSetup(); + ~VertexSetup(); + + void set_vertex_array(const VertexArray &); + void set_instance_array(const VertexArray *); + void set_index_buffer(const Buffer &); + void refresh(); + const VertexArray *get_vertex_array() const { return vertex_array; } + const VertexArray *get_instance_array() const { return inst_array; } + const Buffer *get_index_buffer() const { return index_buffer; } + +private: + static unsigned get_attribs(const VertexFormat &); + static unsigned get_update_mask(unsigned, const VertexFormat &, const VertexArray &); + void update(unsigned) const; + void update_vertex_array(const VertexArray &, unsigned, unsigned, bool) const; + +public: + void bind() const; + static void unbind(); +}; + +} // namespace GL +} // namespace Msp + +#endif