]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/batch.h
Check the flat qualifier from the correct member
[libs/gl.git] / source / core / batch.h
index 6f7e43d61be4e0ca0078e37c2032ab4c006de5b6..2ac2c43c17f1eeb26c75626c2efd4064bf3d4880 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <vector>
 #include <msp/datafile/objectloader.h>
+#include "batch_backend.h"
 #include "bufferable.h"
 #include "datatype.h"
 #include "primitivetype.h"
@@ -13,14 +14,14 @@ 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 Bufferable
+class Batch: public BatchBackend, public Bufferable
 {
 public:
        class Loader: public DataFile::ObjectLoader<Batch>
@@ -29,40 +30,58 @@ public:
                Loader(Batch &);
        private:
                void indices(const std::vector<unsigned> &);
+               void patch_size(unsigned);
        };
 
 private:
        PrimitiveType prim_type;
-       GLenum gl_prim_type;
        DataType index_type;
-       GLenum gl_index_type;
        std::vector<std::uint8_t> data;
-       unsigned max_index;
+       unsigned max_index = 0;
+       unsigned patch_size = 3;
 
 public:
-       Batch(PrimitiveType t);
-       ~Batch();
+       Batch(PrimitiveType);
 
        PrimitiveType get_type() const { return prim_type; }
-       GLenum get_gl_primitive_type() const { return gl_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; }
 
+       /** Sets the number of control points per patch.  Only available if the
+       primitive type is PATCHES. */
+       void set_patch_size(unsigned);
+
+       unsigned get_patch_size() const { return patch_size; }
+
+       /** 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