]> git.tdb.fi Git - libs/gl.git/blobdiff - source/batch.h
Drop Id tags and copyright notices from files
[libs/gl.git] / source / batch.h
index 9b2072de1f13d6f56e819a759fa3a1f6b3623491..4d2520a19629e830609d555163c4eca836e67443 100644 (file)
@@ -1,48 +1,82 @@
-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #ifndef MSP_GL_BATCH_H_
 #define MSP_GL_BATCH_H_
 
 #include <vector>
-#include <msp/datafile/loader.h>
+#include <msp/datafile/objectloader.h>
+#include "datatype.h"
 #include "primitivetype.h"
-#include "types.h"
 
 namespace Msp {
 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.
+
+This is a pretty low-level class and mainly intended to be used by the Mesh
+class.
+*/
 class Batch
 {
 public:
-       class Loader: public DataFile::Loader
+       class Loader: public DataFile::ObjectLoader<Batch>
        {
        public:
                Loader(Batch &);
        private:
-               Batch &batch;
-
-               void indices(const std::vector<uint> &);
+               void indices(const std::vector<unsigned> &);
        };
 
 private:
-       PrimitiveType type;
-       std::vector<uint> indices;
-       uint min_index;
-       uint max_index;
+       PrimitiveType prim_type;
+       DataType data_type;
+       std::vector<unsigned char> data;
+       unsigned min_index;
+       unsigned max_index;
+       bool restart;
+       Buffer *ibuf;
+       unsigned ibuf_offset;
+       Batch *next_in_ibuf;
+       Batch *prev_in_ibuf;
+       mutable bool dirty;
+
+       static unsigned restart_index;
 
 public:
        Batch(PrimitiveType t);
-       Batch &append(uint);
-       void append(const std::vector<uint> &);
-       unsigned size() const { return indices.size(); }
-       const std::vector<uint> &get_indices() const { return indices; }
+       ~Batch();
+
+       PrimitiveType get_type() const { return prim_type; }
+       void set_data_type(DataType);
+       DataType get_data_type() const { return data_type; }
+       void use_index_buffer(Buffer *, Batch * = 0);
+       Batch &append(unsigned);
+       void append(const std::vector<unsigned> &);
+       void append(const Batch &);
+       unsigned size() const { return data.size()/get_index_size(); }
+       unsigned get_index(unsigned) const;
        void draw() const;
-       void draw_with_buffer(unsigned) const;
+
+private:
+       unsigned get_index_size() const;
+
+       template<typename T>
+       void append_index(T);
+
+       template<typename T, typename U>
+       void expand_data();
+
+       template<typename T, typename U>
+       void shrink_data();
+
+       template<typename T, typename U>
+       U convert(T) const;
+
+       void unlink_from_ibuf();
+       void update_ibuf_offsets();
 };
 
 } // namespace GL