1 """Datatypes for use with L{ShaderProgram}s.
2
3 @author: Stephan Wenger
4 @date: 2012-02-29
5 """
6
7 import numpy as _np
8
9 import glitter.raw as _gl
10 from glitter.utils.dtypes import Datatype, bool8, int32, uint32, float32, float64
13 _gltype_db = {}
14 _db = {}
15
16 - def __init__(self, name, _gltype, dtype=int32, shape=1, texture=False, atomic=True):
17 self._name = name
18 self._gltype = _gltype
19 self._dtype = dtype
20 self._shape = (shape,) if not hasattr(shape, "__iter__") else tuple(shape)
21 self._texture = texture
22 self._atomic = atomic
23
24 Datatype._gltype_db[self._gltype] = self
25 Datatype._db[self._dtype, self._shape, self._texture, self._atomic] = self
26
27 @classmethod
30
32 data = _np.empty(self._shape, int32.as_numpy() if self._dtype.is_boolean() else self._dtype.as_numpy())
33 if self._dtype == int32 or self._dtype == bool8:
34 _gl.glGetUniformiv(program._id, location, _gl.cast(data.ctypes, _gl.glGetUniformiv.argtypes[-1]))
35 elif self._dtype == uint32:
36 _gl.glGetUniformuiv(program._id, location, _gl.cast(data.ctypes, _gl.glGetUniformuiv.argtypes[-1]))
37 elif self._dtype == float32:
38 _gl.glGetUniformfv(program._id, location, _gl.cast(data.ctypes, _gl.glGetUniformfv.argtypes[-1]))
39 elif self._dtype == float64:
40 _gl.glGetUniformdv(program._id, location, _gl.cast(data.ctypes, _gl.glGetUniformdv.argtypes[-1]))
41 else:
42 raise TypeError("cannot get uniform variable of type %s" % self)
43 return data.astype(self._dtype.as_numpy())
44
45 - def set_value(self, program, location, value, count):
46 dtype = int32 if self._dtype.is_boolean() else self._dtype
47 value = _np.ascontiguousarray(value, dtype.as_numpy())
48 if count == 1:
49 if value.shape != self._shape and value.shape != (count,) + self._shape:
50 raise TypeError("shapes do not match")
51 elif self._shape == (1,):
52 if value.shape != (count,) and value.shape != (count,) + self._shape:
53 raise TypeError("shapes do not match")
54 else:
55 if value.shape != (count,) + self._shape:
56 raise TypeError("shapes do not match")
57 if len(self._shape) == 1:
58 setter = getattr(_gl, "glUniform%d%sv" % (self._shape[0], dtype.charcode))
59 with program:
60 setter(location, count, _gl.cast(value.ctypes, setter.argtypes[-1]))
61 else:
62 if self._shape[0] == self._shape[1]:
63 setter = getattr(_gl, "glUniformMatrix%d%sv" % (self._shape[0], dtype.charcode))
64 else:
65 setter = getattr(_gl, "glUniformMatrix%dx%d%sv" % (self._shape[1], self._shape[0], dtype.charcode))
66 with program:
67 setter(location, count, _gl.GL_TRUE, _gl.cast(value.ctypes, setter.argtypes[-1]))
68
71
74
77
80
83
84 - def is_texture(self):
86
89
92
93 shader_float = ShaderDatatype("float", _gl.GL_FLOAT, dtype=float32)
94 shader_vec2 = ShaderDatatype("vec2", _gl.GL_FLOAT_VEC2, dtype=float32, shape=2)
95 shader_vec3 = ShaderDatatype("vec3", _gl.GL_FLOAT_VEC3, dtype=float32, shape=3)
96 shader_vec4 = ShaderDatatype("vec4", _gl.GL_FLOAT_VEC4, dtype=float32, shape=4)
97 shader_double = ShaderDatatype("double", _gl.GL_DOUBLE, dtype=float64)
98 shader_dvec2 = ShaderDatatype("dvec2", _gl.GL_DOUBLE_VEC2, dtype=float64, shape=2)
99 shader_dvec3 = ShaderDatatype("dvec3", _gl.GL_DOUBLE_VEC3, dtype=float64, shape=3)
100 shader_dvec4 = ShaderDatatype("dvec4", _gl.GL_DOUBLE_VEC4, dtype=float64, shape=4)
101 shader_int = ShaderDatatype("int", _gl.GL_INT, dtype=int32)
102 shader_ivec2 = ShaderDatatype("ivec2", _gl.GL_INT_VEC2, dtype=int32, shape=2)
103 shader_ivec3 = ShaderDatatype("ivec3", _gl.GL_INT_VEC3, dtype=int32, shape=3)
104 shader_ivec4 = ShaderDatatype("ivec4", _gl.GL_INT_VEC4, dtype=int32, shape=4)
105 shader_unsigned_int = ShaderDatatype("unsigned int", _gl.GL_UNSIGNED_INT, dtype=uint32)
106 shader_uvec2 = ShaderDatatype("uvec2", _gl.GL_UNSIGNED_INT_VEC2, dtype=uint32, shape=2)
107 shader_uvec3 = ShaderDatatype("uvec3", _gl.GL_UNSIGNED_INT_VEC3, dtype=uint32, shape=3)
108 shader_uvec4 = ShaderDatatype("uvec4", _gl.GL_UNSIGNED_INT_VEC4, dtype=uint32, shape=4)
109 shader_bool = ShaderDatatype("bool", _gl.GL_BOOL, dtype=bool8)
110 shader_bvec2 = ShaderDatatype("bvec2", _gl.GL_BOOL_VEC2, dtype=bool8, shape=2)
111 shader_bvec3 = ShaderDatatype("bvec3", _gl.GL_BOOL_VEC3, dtype=bool8, shape=3)
112 shader_bvec4 = ShaderDatatype("bvec4", _gl.GL_BOOL_VEC4, dtype=bool8, shape=4)
113 shader_mat2 = ShaderDatatype("mat2", _gl.GL_FLOAT_MAT2, dtype=float32, shape=(2, 2))
114 shader_mat3 = ShaderDatatype("mat3", _gl.GL_FLOAT_MAT3, dtype=float32, shape=(3, 3))
115 shader_mat4 = ShaderDatatype("mat4", _gl.GL_FLOAT_MAT4, dtype=float32, shape=(4, 4))
116 shader_dmat2 = ShaderDatatype("dmat2", _gl.GL_DOUBLE_MAT2, dtype=float64, shape=(2, 2))
117 shader_dmat3 = ShaderDatatype("dmat3", _gl.GL_DOUBLE_MAT3, dtype=float64, shape=(3, 3))
118 shader_dmat4 = ShaderDatatype("dmat4", _gl.GL_DOUBLE_MAT4, dtype=float64, shape=(4, 4))
119 shader_sampler1D = ShaderDatatype("sampler1D", _gl.GL_SAMPLER_1D, texture=True)
120 shader_sampler2D = ShaderDatatype("sampler2D", _gl.GL_SAMPLER_2D, texture=True)
121 shader_sampler3D = ShaderDatatype("sampler3D", _gl.GL_SAMPLER_3D, texture=True)
122 shader_samplerCube = ShaderDatatype("samplerCube", _gl.GL_SAMPLER_CUBE, texture=True)
123 shader_sampler1DShadow = ShaderDatatype("sampler1DShadow", _gl.GL_SAMPLER_1D_SHADOW, texture=True)
124 shader_sampler2DShadow = ShaderDatatype("sampler2DShadow", _gl.GL_SAMPLER_2D_SHADOW, texture=True)
125 shader_sampler1DArray = ShaderDatatype("sampler1DArray", _gl.GL_SAMPLER_1D_ARRAY, texture=True)
126 shader_sampler2DArray = ShaderDatatype("sampler2DArray", _gl.GL_SAMPLER_2D_ARRAY, texture=True)
127 shader_sampler1DArrayShadow = ShaderDatatype("sampler1DArrayShadow", _gl.GL_SAMPLER_1D_ARRAY_SHADOW, texture=True)
128 shader_sampler2DArrayShadow = ShaderDatatype("sampler2DArrayShadow", _gl.GL_SAMPLER_2D_ARRAY_SHADOW, texture=True)
129 shader_sampler2DMS = ShaderDatatype("sampler2DMS", _gl.GL_SAMPLER_2D_MULTISAMPLE, texture=True)
130 shader_sampler2DMSArray = ShaderDatatype("sampler2DMSArray", _gl.GL_SAMPLER_2D_MULTISAMPLE_ARRAY, texture=True)
131 shader_samplerCubeShadow = ShaderDatatype("samplerCubeShadow", _gl.GL_SAMPLER_CUBE_SHADOW, texture=True)
132 shader_samplerBuffer = ShaderDatatype("samplerBuffer", _gl.GL_SAMPLER_BUFFER, texture=True)
133 shader_sampler2DRect = ShaderDatatype("sampler2DRect", _gl.GL_SAMPLER_2D_RECT, texture=True)
134 shader_sampler2DRectShadow = ShaderDatatype("sampler2DRectShadow", _gl.GL_SAMPLER_2D_RECT_SHADOW, texture=True)
135 shader_isampler1D = ShaderDatatype("isampler1D", _gl.GL_INT_SAMPLER_1D, texture=True)
136 shader_isampler2D = ShaderDatatype("isampler2D", _gl.GL_INT_SAMPLER_2D, texture=True)
137 shader_isampler3D = ShaderDatatype("isampler3D", _gl.GL_INT_SAMPLER_3D, texture=True)
138 shader_isamplerCube = ShaderDatatype("isamplerCube", _gl.GL_INT_SAMPLER_CUBE, texture=True)
139 shader_isampler1DArray = ShaderDatatype("isampler1DArray", _gl.GL_INT_SAMPLER_1D_ARRAY, texture=True)
140 shader_isampler2DArray = ShaderDatatype("isampler2DArray", _gl.GL_INT_SAMPLER_2D_ARRAY, texture=True)
141 shader_isampler2DMS = ShaderDatatype("isampler2DMS", _gl.GL_INT_SAMPLER_2D_MULTISAMPLE, texture=True)
142 shader_isampler2DMSArray = ShaderDatatype("isampler2DMSArray", _gl.GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, texture=True)
143 shader_isamplerBuffer = ShaderDatatype("isamplerBuffer", _gl.GL_INT_SAMPLER_BUFFER, texture=True)
144 shader_isampler2DRect = ShaderDatatype("isampler2DRect", _gl.GL_INT_SAMPLER_2D_RECT, texture=True)
145 shader_usampler1D = ShaderDatatype("usampler1D", _gl.GL_UNSIGNED_INT_SAMPLER_1D, texture=True)
146 shader_usampler2D = ShaderDatatype("usampler2D", _gl.GL_UNSIGNED_INT_SAMPLER_2D, texture=True)
147 shader_usampler3D = ShaderDatatype("usampler3D", _gl.GL_UNSIGNED_INT_SAMPLER_3D, texture=True)
148 shader_usamplerCube = ShaderDatatype("usamplerCube", _gl.GL_UNSIGNED_INT_SAMPLER_CUBE, texture=True)
149 shader_usampler1DArray = ShaderDatatype("usampler1DArray", _gl.GL_UNSIGNED_INT_SAMPLER_1D_ARRAY, texture=True)
150 shader_usampler2DArray = ShaderDatatype("usampler2DArray", _gl.GL_UNSIGNED_INT_SAMPLER_2D_ARRAY, texture=True)
151 shader_usampler2DMS = ShaderDatatype("usampler2DMS", _gl.GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE, texture=True)
152 shader_usampler2DMSArray = ShaderDatatype("usampler2DMSArray", _gl.GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, texture=True)
153 shader_usamplerBuffer = ShaderDatatype("usamplerBuffer", _gl.GL_UNSIGNED_INT_SAMPLER_BUFFER, texture=True)
154 shader_usampler2DRect = ShaderDatatype("usampler2DRect", _gl.GL_UNSIGNED_INT_SAMPLER_2D_RECT, texture=True)
155 shader_image1D = ShaderDatatype("image1D", _gl.GL_IMAGE_1D, texture=True)
156 shader_image2D = ShaderDatatype("image2D", _gl.GL_IMAGE_2D, texture=True)
157 shader_image3D = ShaderDatatype("image3D", _gl.GL_IMAGE_3D, texture=True)
158 shader_image2DRect = ShaderDatatype("image2DRect", _gl.GL_IMAGE_2D_RECT, texture=True)
159 shader_imageCube = ShaderDatatype("imageCube", _gl.GL_IMAGE_CUBE, texture=True)
160 shader_imageBuffer = ShaderDatatype("imageBuffer", _gl.GL_IMAGE_BUFFER, texture=True)
161 shader_image1DArray = ShaderDatatype("image1DArray", _gl.GL_IMAGE_1D_ARRAY, texture=True)
162 shader_image2DArray = ShaderDatatype("image2DArray", _gl.GL_IMAGE_2D_ARRAY, texture=True)
163 shader_image2DMS = ShaderDatatype("image2DMS", _gl.GL_IMAGE_2D_MULTISAMPLE, texture=True)
164 shader_image2DMSArray = ShaderDatatype("image2DMSArray", _gl.GL_IMAGE_2D_MULTISAMPLE_ARRAY, texture=True)
165 shader_iimage1D = ShaderDatatype("iimage1D", _gl.GL_INT_IMAGE_1D, texture=True)
166 shader_iimage2D = ShaderDatatype("iimage2D", _gl.GL_INT_IMAGE_2D, texture=True)
167 shader_iimage3D = ShaderDatatype("iimage3D", _gl.GL_INT_IMAGE_3D, texture=True)
168 shader_iimage2DRect = ShaderDatatype("iimage2DRect", _gl.GL_INT_IMAGE_2D_RECT, texture=True)
169 shader_iimageCube = ShaderDatatype("iimageCube", _gl.GL_INT_IMAGE_CUBE, texture=True)
170 shader_iimageBuffer = ShaderDatatype("iimageBuffer", _gl.GL_INT_IMAGE_BUFFER, texture=True)
171 shader_iimage1DArray = ShaderDatatype("iimage1DArray", _gl.GL_INT_IMAGE_1D_ARRAY, texture=True)
172 shader_iimage2DArray = ShaderDatatype("iimage2DArray", _gl.GL_INT_IMAGE_2D_ARRAY, texture=True)
173 shader_iimage2DMS = ShaderDatatype("iimage2DMS", _gl.GL_INT_IMAGE_2D_MULTISAMPLE, texture=True)
174 shader_iimage2DMSArray = ShaderDatatype("iimage2DMSArray", _gl.GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY, texture=True)
175 shader_uimage1D = ShaderDatatype("uimage1D", _gl.GL_UNSIGNED_INT_IMAGE_1D, texture=True)
176 shader_uimage2D = ShaderDatatype("uimage2D", _gl.GL_UNSIGNED_INT_IMAGE_2D, texture=True)
177 shader_uimage3D = ShaderDatatype("uimage3D", _gl.GL_UNSIGNED_INT_IMAGE_3D, texture=True)
178 shader_uimage2DRect = ShaderDatatype("uimage2DRect", _gl.GL_UNSIGNED_INT_IMAGE_2D_RECT, texture=True)
179 shader_uimageCube = ShaderDatatype("uimageCube", _gl.GL_UNSIGNED_INT_IMAGE_CUBE, texture=True)
180 shader_uimageBuffer = ShaderDatatype("uimageBuffer", _gl.GL_UNSIGNED_INT_IMAGE_BUFFER, texture=True)
181 shader_uimage1DArray = ShaderDatatype("uimage1DArray", _gl.GL_UNSIGNED_INT_IMAGE_1D_ARRAY, texture=True)
182 shader_uimage2DArray = ShaderDatatype("uimage2DArray", _gl.GL_UNSIGNED_INT_IMAGE_2D_ARRAY, texture=True)
183 shader_uimage2DMS = ShaderDatatype("uimage2DMS", _gl.GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE, texture=True)
184 shader_uimage2DMSArray = ShaderDatatype("uimage2DMSArray", _gl.GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY, texture=True)
185 shader_atomic_uint = ShaderDatatype("atomic_uint", _gl.GL_UNSIGNED_INT_ATOMIC_COUNTER, dtype=uint32, atomic=True)
186
187 __all__ = [
188 "ShaderDatatype",
189 "shader_float",
190 "shader_vec2",
191 "shader_vec3",
192 "shader_vec4",
193 "shader_double",
194 "shader_dvec2",
195 "shader_dvec3",
196 "shader_dvec4",
197 "shader_int",
198 "shader_ivec2",
199 "shader_ivec3",
200 "shader_ivec4",
201 "shader_unsigned_int",
202 "shader_uvec2",
203 "shader_uvec3",
204 "shader_uvec4",
205 "shader_bool",
206 "shader_bvec2",
207 "shader_bvec3",
208 "shader_bvec4",
209 "shader_mat2",
210 "shader_mat3",
211 "shader_mat4",
212 "shader_dmat2",
213 "shader_dmat3",
214 "shader_dmat4",
215 "shader_sampler1D",
216 "shader_sampler2D",
217 "shader_sampler3D",
218 "shader_samplerCube",
219 "shader_sampler1DShadow",
220 "shader_sampler2DShadow",
221 "shader_sampler1DArray",
222 "shader_sampler2DArray",
223 "shader_sampler1DArrayShadow",
224 "shader_sampler2DArrayShadow",
225 "shader_sampler2DMS",
226 "shader_sampler2DMSArray",
227 "shader_samplerCubeShadow",
228 "shader_samplerBuffer",
229 "shader_sampler2DRect",
230 "shader_sampler2DRectShadow",
231 "shader_isampler1D",
232 "shader_isampler2D",
233 "shader_isampler3D",
234 "shader_isamplerCube",
235 "shader_isampler1DArray",
236 "shader_isampler2DArray",
237 "shader_isampler2DMS",
238 "shader_isampler2DMSArray",
239 "shader_isamplerBuffer",
240 "shader_isampler2DRect",
241 "shader_usampler1D",
242 "shader_usampler2D",
243 "shader_usampler3D",
244 "shader_usamplerCube",
245 "shader_usampler1DArray",
246 "shader_usampler2DArray",
247 "shader_usampler2DMS",
248 "shader_usampler2DMSArray",
249 "shader_usamplerBuffer",
250 "shader_usampler2DRect",
251 "shader_image1D",
252 "shader_image2D",
253 "shader_image3D",
254 "shader_image2DRect",
255 "shader_imageCube",
256 "shader_imageBuffer",
257 "shader_image1DArray",
258 "shader_image2DArray",
259 "shader_image2DMS",
260 "shader_image2DMSArray",
261 "shader_iimage1D",
262 "shader_iimage2D",
263 "shader_iimage3D",
264 "shader_iimage2DRect",
265 "shader_iimageCube",
266 "shader_iimageBuffer",
267 "shader_iimage1DArray",
268 "shader_iimage2DArray",
269 "shader_iimage2DMS",
270 "shader_iimage2DMSArray",
271 "shader_uimage1D",
272 "shader_uimage2D",
273 "shader_uimage3D",
274 "shader_uimage2DRect",
275 "shader_uimageCube",
276 "shader_uimageBuffer",
277 "shader_uimage1DArray",
278 "shader_uimage2DArray",
279 "shader_uimage2DMS",
280 "shader_uimage2DMSArray",
281 "shader_atomic_uint",
282 ]
283