X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fbatch.h;h=1fc225210f739a457278b7e5f6ba3ba87e62b4da;hb=3efe3bab1c8290bd49a957ebec0ad97e58a35fcf;hp=1e0b4c4703e74b09602575b6f3fa206bfc746bdf;hpb=be6ffe96ecb4707599fe1a6f620c348760213d46;p=libs%2Fgl.git diff --git a/source/core/batch.h b/source/core/batch.h index 1e0b4c47..1fc22521 100644 --- a/source/core/batch.h +++ b/source/core/batch.h @@ -14,12 +14,12 @@ namespace GL { 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 BatchBackend, public Bufferable { @@ -39,24 +39,38 @@ private: unsigned max_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; } + /** 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 &); + + /** 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 std::size_t get_data_size() const { return data.size(); } virtual const void *get_data_pointer() const { return &data[0]; } virtual std::size_t get_alignment() const { return get_index_size(); } - std::size_t get_index_size() const; public: + 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(std::size_t) const;