… | |
… | |
285 | |
285 | |
286 | struct uniform_1f_i : uniform_f_i<1, str_float> { |
286 | struct uniform_1f_i : uniform_f_i<1, str_float> { |
287 | void set (GLfloat v) |
287 | void set (GLfloat v) |
288 | { |
288 | { |
289 | data[0] = v; |
289 | data[0] = v; |
|
|
290 | |
|
|
291 | GLint loc = location (); |
|
|
292 | if (loc >= 0) // workaround for buggy drivers |
290 | glUniform1fvARB (location(), 1, data); |
293 | glUniform1fvARB (loc, 1, data); |
291 | } |
294 | } |
292 | }; |
295 | }; |
293 | |
296 | |
294 | struct uniform_2f_i : uniform_f_i<2, str_vec2> { |
297 | struct uniform_2f_i : uniform_f_i<2, str_vec2> { |
295 | void set (GLfloat x, GLfloat y) |
298 | void set (GLfloat x, GLfloat y) |
296 | { |
299 | { |
297 | data[0] = x; |
300 | data[0] = x; |
298 | data[1] = y; |
301 | data[1] = y; |
|
|
302 | |
|
|
303 | GLint loc = location (); |
|
|
304 | if (loc >= 0) // workaround for buggy drivers |
299 | glUniform2fvARB (location(), 2, data); |
305 | glUniform2fvARB (loc, 1, data); |
300 | } |
306 | } |
301 | |
307 | |
302 | void set (const vec2 &v) { set (v.x, v.y); } |
308 | void set (const vec2 &v) { set (v.x, v.y); } |
303 | }; |
309 | }; |
304 | |
310 | |
… | |
… | |
306 | void set (GLfloat x, GLfloat y, GLfloat z) |
312 | void set (GLfloat x, GLfloat y, GLfloat z) |
307 | { |
313 | { |
308 | data[0] = x; |
314 | data[0] = x; |
309 | data[1] = y; |
315 | data[1] = y; |
310 | data[2] = z; |
316 | data[2] = z; |
|
|
317 | |
|
|
318 | GLint loc = location (); |
|
|
319 | if (loc >= 0) // workaround for buggy drivers |
311 | glUniform3fvARB (location(), 3, data); |
320 | glUniform3fvARB (loc, 1, data); |
312 | } |
321 | } |
313 | |
322 | |
314 | void set (const vec3 &v) { set (v.x, v.y, v.z); } |
323 | void set (const vec3 &v) { set (v.x, v.y, v.z); } |
315 | }; |
324 | }; |
316 | |
325 | |
… | |
… | |
320 | data[0] = x; |
329 | data[0] = x; |
321 | data[1] = y; |
330 | data[1] = y; |
322 | data[2] = z; |
331 | data[2] = z; |
323 | data[3] = w; |
332 | data[3] = w; |
324 | |
333 | |
|
|
334 | GLint loc = location (); |
|
|
335 | if (loc >= 0) // workaround for buggy drivers |
325 | glUniform4fvARB (location(), 4, data); |
336 | glUniform4fvARB (loc, 1, data); |
326 | } |
337 | } |
327 | |
338 | |
328 | void set (const vec4 &v) { set (v.x, v.y, v.z, v.w); } |
339 | void set (const vec4 &v) { set (v.x, v.y, v.z, v.w); } |
329 | }; |
340 | }; |
330 | |
341 | |
331 | struct uniform_matrix_2f_i : uniform_f_i< 4, str_mat2> |
342 | struct uniform_matrix_2f_i : uniform_f_i< 4, str_mat2> |
332 | { |
343 | { |
333 | void set (const GLfloat d[4]) |
344 | void set (const GLfloat d[4]) |
334 | { |
345 | { |
335 | memcpy (data, d, 4 * sizeof (GLfloat)); |
346 | memcpy (data, d, 4 * sizeof (GLfloat)); |
|
|
347 | |
|
|
348 | GLint loc = location (); |
|
|
349 | if (loc >= 0) // workaround for buggy drivers |
336 | glUniformMatrix2fvARB (location (), 4, 0, data); |
350 | glUniformMatrix2fvARB (loc, 1, 0, data); |
337 | } |
351 | } |
338 | }; |
352 | }; |
339 | |
353 | |
340 | struct uniform_matrix_3f_i : uniform_f_i< 9, str_mat3> |
354 | struct uniform_matrix_3f_i : uniform_f_i< 9, str_mat3> |
341 | { |
355 | { |
342 | void set (const GLfloat d[9]) |
356 | void set (const GLfloat d[9]) |
343 | { |
357 | { |
344 | memcpy (data, d, 9 * sizeof (GLfloat)); |
358 | memcpy (data, d, 9 * sizeof (GLfloat)); |
|
|
359 | |
|
|
360 | GLint loc = location (); |
|
|
361 | if (loc >= 0) // workaround for buggy drivers |
345 | glUniformMatrix3fvARB (location (), 9, 0, data); |
362 | glUniformMatrix3fvARB (loc, 1, 0, data); |
346 | } |
363 | } |
347 | }; |
364 | }; |
348 | |
365 | |
349 | struct uniform_matrix_4f_i : uniform_f_i<16, str_mat4> |
366 | struct uniform_matrix_4f_i : uniform_f_i<16, str_mat4> |
350 | { |
367 | { |
351 | void set (const gl::matrix &m) |
368 | void set (const gl::matrix &m) |
352 | { |
369 | { |
353 | memcpy (data, m.data, 16 * sizeof (GLfloat)); |
370 | memcpy (data, m.data, 16 * sizeof (GLfloat)); |
|
|
371 | |
|
|
372 | GLint loc = location (); |
|
|
373 | if (loc >= 0) // workaround for buggy drivers |
354 | glUniformMatrix4fvARB (location (), 16, 0, data); |
374 | glUniformMatrix4fvARB (loc, 1, 0, data); |
355 | } |
375 | } |
356 | }; |
376 | }; |
357 | |
377 | |
358 | template<class var_i> |
378 | template<class var_i> |
359 | struct var_ref : ref<var_i> |
379 | struct var_ref : ref<var_i> |