#include "datatype.h"
#include "vertexformat.h"
+#include "vertexsetup_backend.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.
+Combines vertex and instance attributes and an index buffer for a complete
+description of vertex input state.
+
+Applications normally don't need to deal with VertexSetups directly. They're
+managed by the Mesh and InstanceArray classes.
*/
-class VertexSetup
+class VertexSetup: public VertexSetupBackend
{
- friend class PipelineState;
+ friend VertexSetupBackend;
private:
enum ComponentMask
INDEX_BUFFER = 4
};
- unsigned id;
- mutable unsigned dirty;
- const VertexArray *vertex_array;
+ mutable unsigned dirty = 0;
+ const VertexArray *vertex_array = 0;
VertexFormat vertex_format;
- const VertexArray *inst_array;
+ const VertexArray *inst_array = 0;
VertexFormat inst_format;
- const Buffer *index_buffer;
- DataType index_type;
+ const Buffer *index_buffer = 0;
+ DataType index_type = UNSIGNED_SHORT;
public:
- VertexSetup();
- ~VertexSetup();
-
+ /** Sets format for vertex data. Instance attributes won't be used. The
+ format cannot be changed once set. */
void set_format(const VertexFormat &);
+
+ /** Sets formats for both vertex and instance data. The formats cannot be
+ changed once set. */
void set_format_instanced(const VertexFormat &, const VertexFormat &);
+ /** Sets the VertexArray to use as the source of vertex attribute values.
+ The array's format must match the VertexSetup's vertex format. */
void set_vertex_array(const VertexArray &);
+
+ /** Sets the VertexArray to use as the source of instance attribute values.
+ An instance format must be defined and the array's format must match it. */
void set_instance_array(const VertexArray &);
+
+ /** Sets the buffer containing index data and the type of indices. */
void set_index_buffer(const Buffer &, DataType);
+
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 bool verify_format(const VertexFormat &);
- static void require_format(const VertexFormat &, bool);
void update() const;
- void update_vertex_array(const VertexArray &, unsigned, unsigned, bool) const;
public:
void refresh() const { if(dirty) update(); }
void unload();
- void set_debug_name(const std::string &);
+ using VertexSetupBackend::set_debug_name;
};
} // namespace GL