]> git.tdb.fi Git - libs/gl.git/blob - source/core/vertexarray.h
Eliminate the polymorphic Uniform class hierarchy
[libs/gl.git] / source / core / vertexarray.h
1 #ifndef MSP_GL_VERTEXARRAY_H_
2 #define MSP_GL_VERTEXARRAY_H_
3
4 #include <climits>
5 #include <vector>
6 #include <msp/core/refptr.h>
7 #include <msp/datafile/loader.h>
8 #include "bufferable.h"
9 #include "datatype.h"
10 #include "primitivetype.h"
11 #include "vertexarraybuilder.h"
12 #include "vertexformat.h"
13
14 namespace Msp {
15 namespace GL {
16
17 class Buffer;
18
19 /**
20 Stores vertex data.
21
22 The array's contents can be modified with the append and modify methods.  To
23 obtain the location of an individual component within the vertex, use
24 VertexFormat::offset.
25
26 A higher-level interface for filling in vertex data is available in the
27 VertexArrayBuilder class.
28 */
29 class VertexArray: public Bufferable
30 {
31 public:
32         class Loader: public DataFile::Loader, public VertexArrayBuilder
33         {
34         public:
35                 Loader(VertexArray &);
36         };
37
38 private:
39         VertexFormat format;
40         std::vector<char> data;
41         unsigned stride;
42
43         VertexArray(const VertexArray &);
44         VertexArray &operator=(const VertexArray &);
45 public:
46         VertexArray();
47
48         /// Construct a VertexArray and set its format.
49         VertexArray(const VertexFormat &);
50
51         /// Sets the format of the VertexArray.
52         void set_format(const VertexFormat &);
53
54         const VertexFormat &get_format() const { return format; }
55
56         /// Clears all vertices from the array.
57         void clear();
58
59         /// Reserve space for vertices.
60         void reserve(unsigned);
61
62         /// Append a new vertex at the end of the array and return its location.
63         char *append();
64
65         /// Returns the location of a vertex for modification.
66         char *modify(unsigned);
67 private:
68         virtual unsigned get_data_size() const;
69         virtual const void *get_data_pointer() const { return &data[0]; }
70
71 public:
72         unsigned size() const { return data.size()/stride; }
73         const std::vector<char> &get_data() const { return data; }
74         const char *operator[](unsigned i) const { return &data[0]+i*stride; }
75 };
76
77 } // namespace GL
78 } // namespace Msp
79
80 #endif