]> git.tdb.fi Git - libs/gl.git/blob - source/core/vertexformat.h
Rename VertexComponent to VertexAttribute
[libs/gl.git] / source / core / vertexformat.h
1 #ifndef MSP_GL_VERTEXFORMAT_H_
2 #define MSP_GL_VERTEXFORMAT_H_
3
4 #include <msp/core/attributes.h>
5 #include <msp/strings/lexicalcast.h>
6
7 namespace Msp {
8 namespace GL {
9
10 /** A single vertex component.  Symbolic names are provided for commonly used
11 attributes.  These are aliased with with generic attributes, so be careful when
12 picking your attribute indices. */
13 enum VertexAttribute
14 {
15         VERTEX2 = 1,
16         VERTEX3,
17         VERTEX4,
18         NORMAL3 = 10,
19         COLOR4_UBYTE = 12,
20         COLOR3_FLOAT = 14,
21         COLOR4_FLOAT,
22         TANGENT3 = 18,
23         BINORMAL3 = 22,
24         TEXCOORD1 = 32,
25         TEXCOORD2,
26         TEXCOORD3,
27         TEXCOORD4,
28         ATTRIB1 = 64,
29         ATTRIB2,
30         ATTRIB3,
31         ATTRIB4
32 };
33
34 DEPRECATED typedef VertexAttribute VertexComponent;
35
36 class VertexFormat
37 {
38 private:
39         enum { MAX_ATTRIBUTES = 15 };
40
41         unsigned char count;
42         unsigned char attributes[MAX_ATTRIBUTES];
43
44 public:
45         VertexFormat();
46         VertexFormat(VertexAttribute);
47
48         VertexFormat operator,(VertexAttribute) const;
49         VertexFormat operator,(unsigned) const;
50         bool operator==(const VertexFormat &) const;
51         bool operator!=(const VertexFormat &other) const { return !(*this==other); }
52
53         bool empty() const { return !count; }
54         const unsigned char *begin() const { return attributes; }
55         const unsigned char *end() const { return attributes+count; }
56         unsigned stride() const;
57         int offset(VertexAttribute) const;
58 };
59
60 inline VertexFormat operator,(VertexAttribute a1, VertexAttribute a2)
61 { return (VertexFormat(a1), a2); }
62
63 inline VertexFormat operator,(VertexAttribute a, unsigned i)
64 { return (VertexFormat(a), i); }
65
66 VertexAttribute make_indexed_attribute(VertexAttribute, unsigned);
67
68 DEPRECATED inline VertexAttribute make_indexed_component(VertexAttribute a, unsigned i)
69 { return make_indexed_attribute(a, i); }
70
71 inline unsigned get_attribute_semantic(unsigned char a)
72 { return a>>2; }
73
74 inline unsigned get_attribute_size(unsigned char a)
75 { return (a&3)+1; }
76
77 DEPRECATED inline unsigned get_component_type(unsigned char c)
78 { return get_attribute_semantic(c); }
79
80 DEPRECATED inline unsigned get_component_size(unsigned char c)
81 { return get_attribute_size(c); }
82
83 DEPRECATED inline unsigned get_stride(const VertexFormat &f)
84 { return f.stride(); }
85
86 void operator>>(const LexicalConverter &, VertexAttribute &);
87
88 } // namespace GL
89 } // namespace Msp
90
91 #endif