]> git.tdb.fi Git - libs/gl.git/blob - source/core/vertexsetup.h
Use friend declarations to access OpenGL IDs of objects
[libs/gl.git] / source / core / vertexsetup.h
1 #ifndef MSP_GL_VERTEXSETUP_H_
2 #define MSP_GL_VERTEXSETUP_H_
3
4 #include "datatype.h"
5 #include "vertexformat.h"
6
7 namespace Msp {
8 namespace GL {
9
10 class Buffer;
11 class VertexArray;
12
13 /**
14 Combines a VertexArray with an index buffer.  This wraps OpenGL's vertex array
15 objects.  Intended for internal use.
16 */
17 class VertexSetup
18 {
19         friend class PipelineState;
20
21 private:
22         enum ComponentMask
23         {
24                 VERTEX_ARRAY = 1,
25                 INSTANCE_ARRAY = 2,
26                 INDEX_BUFFER = 4
27         };
28
29         unsigned id;
30         mutable unsigned dirty;
31         const VertexArray *vertex_array;
32         VertexFormat vertex_format;
33         const VertexArray *inst_array;
34         VertexFormat inst_format;
35         const Buffer *index_buffer;
36         DataType index_type;
37
38 public:
39         VertexSetup();
40         ~VertexSetup();
41
42         void set_format(const VertexFormat &);
43         void set_format_instanced(const VertexFormat &, const VertexFormat &);
44
45         void set_vertex_array(const VertexArray &);
46         void set_instance_array(const VertexArray &);
47         void set_index_buffer(const Buffer &, DataType);
48         const VertexArray *get_vertex_array() const { return vertex_array; }
49         const VertexArray *get_instance_array() const { return inst_array; }
50         const Buffer *get_index_buffer() const { return index_buffer; }
51         DataType get_index_type() const { return index_type; }
52
53 private:
54         static bool verify_format(const VertexFormat &);
55         static void require_format(const VertexFormat &);
56         void update() const;
57         void update_vertex_array(const VertexArray &, unsigned, unsigned, bool) const;
58
59 public:
60         void refresh() const { if(dirty) update(); }
61
62         void unload();
63
64         void set_debug_name(const std::string &);
65 };
66
67 } // namespace GL
68 } // namespace Msp
69
70 #endif