-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007, 2009-2010 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> &);
- PrimitiveType get_type() const { return type; }
- 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