--- /dev/null
+#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<VertexSetup>
+{
+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