]> git.localhorst.tv Git - tacos.git/blob - src/graphics/gl_traits.hpp
isolate some GL stuff
[tacos.git] / src / graphics / gl_traits.hpp
1 #ifndef TACOS_GRAPHICS_GL_TRAITS_HPP_
2 #define TACOS_GRAPHICS_GL_TRAITS_HPP_
3
4 #include <GL/glew.h>
5 #include <glm/glm.hpp>
6
7
8 namespace tacos {
9
10 template<class T>
11 struct gl_traits {
12
13         /// number of components per generic attribute
14         /// must be 1, 2, 3, 4
15         // static constexpr GLint size;
16
17         /// component type
18         /// accepted values are:
19         ///   GL_BYTE, GL_UNSIGNED_BYTE,
20         ///   GL_SHORT, GL_UNSIGNED_SHORT,
21         ///   GL_INT, GL_UNSIGNED_INT,
22         ///   GL_HALF_FLOAT, GL_FLOAT, GL_DOUBLE,
23         ///   GL_FIXED, GL_INT_2_10_10_10_REV, GL_UNSIGNED_INT_2_10_10_10_REV
24         // static constexpr GLenum type;
25
26 };
27
28
29 // basic types
30
31 template<> struct gl_traits<signed char> {
32         static constexpr GLint size = 1;
33         static constexpr GLenum type = GL_BYTE;
34 };
35
36 template<> struct gl_traits<unsigned char> {
37         static constexpr GLint size = 1;
38         static constexpr GLenum type = GL_UNSIGNED_BYTE;
39 };
40
41 template<> struct gl_traits<short> {
42         static constexpr GLint size = 1;
43         static constexpr GLenum type = GL_SHORT;
44 };
45
46 template<> struct gl_traits<unsigned short> {
47         static constexpr GLint size = 1;
48         static constexpr GLenum type = GL_UNSIGNED_SHORT;
49 };
50
51 template<> struct gl_traits<int> {
52         static constexpr GLint size = 1;
53         static constexpr GLenum type = GL_INT;
54 };
55
56 template<> struct gl_traits<unsigned int> {
57         static constexpr GLint size = 1;
58         static constexpr GLenum type = GL_UNSIGNED_INT;
59 };
60
61 template<> struct gl_traits<float> {
62         static constexpr GLint size = 1;
63         static constexpr GLenum type = GL_FLOAT;
64 };
65
66 template<> struct gl_traits<double> {
67         static constexpr GLint size = 1;
68         static constexpr GLenum type = GL_DOUBLE;
69 };
70
71 // composite types
72
73 template<>
74 template<class T, glm::precision P>
75 struct gl_traits<glm::tvec1<T, P>> {
76         static constexpr GLint size = 1;
77         static constexpr GLenum type = gl_traits<T>::type;
78 };
79 template<class T, glm::precision P>
80 constexpr GLint gl_traits<glm::tvec1<T, P>>::size;
81 template<class T, glm::precision P>
82 constexpr GLenum gl_traits<glm::tvec1<T, P>>::type;
83
84 template<>
85 template<class T, glm::precision P>
86 struct gl_traits<glm::tvec2<T, P>> {
87         static constexpr GLint size = 2;
88         static constexpr GLenum type = gl_traits<T>::type;
89 };
90 template<class T, glm::precision P>
91 constexpr GLint gl_traits<glm::tvec2<T, P>>::size;
92 template<class T, glm::precision P>
93 constexpr GLenum gl_traits<glm::tvec2<T, P>>::type;
94
95 template<>
96 template<class T, glm::precision P>
97 struct gl_traits<glm::tvec3<T, P>> {
98         static constexpr GLint size = 3;
99         static constexpr GLenum type = gl_traits<T>::type;
100 };
101 template<class T, glm::precision P>
102 constexpr GLint gl_traits<glm::tvec3<T, P>>::size;
103 template<class T, glm::precision P>
104 constexpr GLenum gl_traits<glm::tvec3<T, P>>::type;
105
106 template<>
107 template<class T, glm::precision P>
108 struct gl_traits<glm::tvec4<T, P>> {
109         static constexpr GLint size = 4;
110         static constexpr GLenum type = gl_traits<T>::type;
111 };
112 template<class T, glm::precision P>
113 constexpr GLint gl_traits<glm::tvec4<T, P>>::size;
114 template<class T, glm::precision P>
115 constexpr GLenum gl_traits<glm::tvec4<T, P>>::type;
116
117 }
118
119 #endif