#include <vector>
#include <msp/datafile/objectloader.h>
+#include "batch_backend.h"
#include "bufferable.h"
#include "datatype.h"
#include "primitivetype.h"
class Buffer;
/**
-Stores primitive type and element indices for a single GL draw call. Data
-type for indices is automatically chosen to accommodate the largest index in
-the Batch.
+Stores primitive type and element indices for a single draw call.
-This is a pretty low-level class and mainly intended to be used by the Mesh
-class.
+Data type for indices is automatically chosen to accommodate the largest
+index, but can also be manually overridden.
+
+Batches are normally contained in a Mesh.
*/
-class Batch: public Bufferable
+class Batch: public BatchBackend, public Bufferable
{
public:
class Loader: public DataFile::ObjectLoader<Batch>
private:
PrimitiveType prim_type;
DataType index_type;
- GLenum gl_index_type;
- std::vector<UInt8> data;
+ std::vector<std::uint8_t> data;
unsigned max_index;
- bool restart;
-
- static unsigned restart_index;
public:
- Batch(PrimitiveType t);
- ~Batch();
+ Batch(PrimitiveType);
PrimitiveType get_type() const { return prim_type; }
+
+ /** Sets the data type for indices. Allowed types are UNSIGNED_SHORT and
+ UNSIGNED_INT. It's an error to specify a type which can't hold the current
+ range of index values. */
void set_index_type(DataType);
- DataType get_index_type() const { return index_type; }
- GLenum get_gl_index_type() const { return gl_index_type; }
- DEPRECATED void set_data_type(DataType t) { set_index_type(t); }
- DEPRECATED DataType get_data_type() const { return index_type; }
+ DataType get_index_type() const { return index_type; }
+ /** Appends a single index. The data type is automatically adjusted if the
+ index is too large for the current data type. */
Batch &append(unsigned);
+
Batch &append(const std::vector<unsigned> &);
+
+ /** Checks if it's possible to append another Batch with a given primitive
+ type. */
bool can_append(PrimitiveType);
+
+ /** Appends another batch. Additional indices may be inserted in order to
+ join the primitives. */
Batch &append(const Batch &);
+
private:
void append_index(unsigned);
- virtual unsigned get_data_size() const { return data.size(); }
+ virtual std::size_t get_data_size() const { return data.size(); }
virtual const void *get_data_pointer() const { return &data[0]; }
- virtual unsigned get_alignment() const { return get_index_size(); }
- unsigned get_index_size() const;
+ virtual std::size_t get_alignment() const { return get_index_size(); }
public:
- unsigned size() const { return data.size()/get_index_size(); }
+ std::size_t get_index_size() const { return get_type_size(index_type); }
+ std::size_t size() const { return data.size()/get_index_size(); }
- unsigned get_index(unsigned) const;
+ unsigned get_index(std::size_t) const;
};
} // namespace GL