1 
2 module dglsl.type;
3 
4 import std.traits;
5 
6 public import gl3n.linalg : Vector, Matrix;
7 
8 import dglsl.sampler;
9 
10 
11 alias vec2  = Vector!(float, 2);
12 alias ivec2 = Vector!(int,   2);
13 alias uvec2 = Vector!(uint,  2);
14 alias bvec2 = Vector!(ubyte,  2); // this should be bool?
15 alias vec3  = Vector!(float, 3);
16 alias ivec3 = Vector!(int,   3);
17 alias uvec3 = Vector!(uint,  3);
18 alias bvec3 = Vector!(ubyte,  3); // this should be bool?
19 alias vec4  = Vector!(float, 4);
20 alias ivec4 = Vector!(int,   4);
21 alias uvec4 = Vector!(uint,  4);
22 alias bvec4 = Vector!(ubyte,  4); // this should be bool?
23 
24 alias mat2x2 = Matrix!(float, 2, 2);
25 alias mat2x3 = Matrix!(float, 2, 3);
26 alias mat2x4 = Matrix!(float, 2, 4);
27 alias mat3x2 = Matrix!(float, 3, 2);
28 alias mat3x3 = Matrix!(float, 3, 3);
29 alias mat3x4 = Matrix!(float, 3, 4);
30 alias mat4x2 = Matrix!(float, 4, 2);
31 alias mat4x3 = Matrix!(float, 4, 3);
32 alias mat4x4 = Matrix!(float, 4, 4);
33 alias mat2 = mat2x2;
34 alias mat3 = mat3x3;
35 alias mat4 = mat4x4;
36 
37 string glslType(T)() {
38     static if (is(T == vec2)) return "vec2";
39     else static if (is(T == vec3)) return "vec3";
40     else static if (is(T == vec4)) return "vec4";
41     else static if (is(T == ivec2)) return "ivec2";
42     else static if (is(T == ivec3)) return "ivec3";
43     else static if (is(T == ivec4)) return "ivec4";
44     else static if (is(T == uvec2)) return "uvec2";
45     else static if (is(T == uvec3)) return "uvec3";
46     else static if (is(T == uvec4)) return "uvec4";
47     else static if (is(T == bvec2)) return "bvec2";
48     else static if (is(T == bvec3)) return "bvec3";
49     else static if (is(T == bvec4)) return "bvec4";
50     else static if (is(T == mat2x2)) return "mat2x2";
51     else static if (is(T == mat2x3)) return "mat2x3";
52     else static if (is(T == mat2x4)) return "mat2x4";
53     else static if (is(T == mat3x2)) return "mat3x2";
54     else static if (is(T == mat3x3)) return "mat3x3";
55     else static if (is(T == mat3x4)) return "mat3x4";
56     else static if (is(T == mat4x2)) return "mat4x2";
57     else static if (is(T == mat4x3)) return "mat4x3";
58     else static if (is(T == mat4x4)) return "mat4x4";
59     else static if (is(T == sampler1D)) return "sampler1D";
60     else static if (is(T == sampler2D)) return "sampler2D";
61     else static if (is(T == sampler3D)) return "sampler3D";
62     else static if (is(T == samplerCube)) return "samplerCube";
63     else static if (is(T == sampler2DRect)) return "sampler2DRect";
64     else static if (is(T == sampler1DShadow)) return "sampler1DShadow";
65     else static if (is(T == sampler2DShadow)) return "sampler2DShadow";
66     else static if (is(T == samplerCubeShadow)) return "samplerCubeShadow";
67     else static if (is(T == sampler2DRectShadow)) return "sampler2DRectShadow";
68     else static if (is(T == sampler1DArray)) return "sampler1DArray";
69     else static if (is(T == sampler2DArray)) return "sampler2DArray";
70     else static if (is(T == sampler1DArrayShadow)) return "sampler1DArrayShadow";
71     else static if (is(T == sampler2DArrayShadow)) return "sampler2DArrayShadow";
72     else static if (is(T == samplerBuffer)) return "samplerBuffer";
73     else static if (is(T == sampler2DMS)) return "sampler2DMS";
74     else static if (is(T == sampler2DMSArray)) return "sampler2DMSArray";
75     else static if (is(T == isampler1D)) return "isampler1D";
76     else static if (is(T == isampler2D)) return "isampler2D";
77     else static if (is(T == isampler3D)) return "isampler3D";
78     else static if (is(T == isamplerCube)) return "isamplerCube";
79     else static if (is(T == isampler2DRect)) return "isampler2DRect";
80     else static if (is(T == isampler1DArray)) return "isampler1DArray";
81     else static if (is(T == isampler2DArray)) return "isampler2DArray";
82     else static if (is(T == isamplerBuffer)) return "isamplerBuffer";
83     else static if (is(T == isampler2DMS)) return "isampler2DMS";
84     else static if (is(T == isampler2DMSArray)) return "isampler2DMSArray";
85     else static if (is(T == usampler1D)) return "usampler1D";
86     else static if (is(T == usampler2D)) return "usampler2D";
87     else static if (is(T == usampler3D)) return "usampler3D";
88     else static if (is(T == usamplerCube)) return "usamplerCube";
89     else static if (is(T == usampler2DRect)) return "usampler2DRect";
90     else static if (is(T == usampler1DArray)) return "usampler1DArray";
91     else static if (is(T == usampler2DArray)) return "usampler2DArray";
92     else static if (is(T == usamplerBuffer)) return "usamplerBuffer";
93     else static if (is(T == usampler2DMS)) return "usampler2DMS";
94     else static if (is(T == usampler2DMSArray)) return "usampler2DMSArray";
95     else return T.stringof;
96 }
97 
98 unittest {
99     assert(glslType!vec2 == "vec2");
100     assert(glslType!vec3 == "vec3");
101     assert(glslType!vec4 == "vec4");
102     assert(glslType!ivec2 == "ivec2");
103     assert(glslType!bvec3 == "bvec3");
104     assert(glslType!uvec4 == "uvec4");
105 
106     assert(glslType!mat2 == "mat2x2");
107     assert(glslType!mat3 == "mat3x3");
108     assert(glslType!mat4 == "mat4x4");
109     assert(glslType!mat2x2 == "mat2x2");
110     assert(glslType!mat2x3 == "mat2x3");
111     assert(glslType!mat2x4 == "mat2x4");
112     assert(glslType!mat2x3 == "mat2x3");
113     assert(glslType!mat3x3 == "mat3x3");
114     assert(glslType!mat4x3 == "mat4x3");
115 
116     assert(glslType!int == "int");
117     assert(glslType!uint == "uint");
118     assert(glslType!bool == "bool");
119 }
120