e57a562f870da38f93a07243caf801fa11d48b58
[movit] / effect_util.cpp
1 #include <GL/glew.h>
2 #include <Eigen/Core>
3 #include <stddef.h>
4 #include <string>
5 #include "util.h"
6
7 GLint get_uniform_location(GLuint glsl_program_num, const std::string &prefix, const std::string &key)
8 {
9         std::string name = prefix + "_" + key;
10         return glGetUniformLocation(glsl_program_num, name.c_str());
11 }
12
13 void set_uniform_int(GLuint glsl_program_num, const std::string &prefix, const std::string &key, int value)
14 {
15         GLint location = get_uniform_location(glsl_program_num, prefix, key);
16         if (location == -1) {
17                 return;
18         }
19         check_error();
20         glUniform1i(location, value);
21         check_error();
22 }
23
24 void set_uniform_float(GLuint glsl_program_num, const std::string &prefix, const std::string &key, float value)
25 {
26         GLint location = get_uniform_location(glsl_program_num, prefix, key);
27         if (location == -1) {
28                 return;
29         }
30         check_error();
31         glUniform1f(location, value);
32         check_error();
33 }
34
35 void set_uniform_vec2(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values)
36 {
37         GLint location = get_uniform_location(glsl_program_num, prefix, key);
38         if (location == -1) {
39                 return;
40         }
41         check_error();
42         glUniform2fv(location, 1, values);
43         check_error();
44 }
45
46 void set_uniform_vec3(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values)
47 {
48         GLint location = get_uniform_location(glsl_program_num, prefix, key);
49         if (location == -1) {
50                 return;
51         }
52         check_error();
53         glUniform3fv(location, 1, values);
54         check_error();
55 }
56
57 void set_uniform_vec4(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values)
58 {
59         GLint location = get_uniform_location(glsl_program_num, prefix, key);
60         if (location == -1) {
61                 return;
62         }
63         check_error();
64         glUniform4fv(location, 1, values);
65         check_error();
66 }
67
68 void set_uniform_vec4_array(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values, size_t num_values)
69 {
70         GLint location = get_uniform_location(glsl_program_num, prefix, key);
71         if (location == -1) {
72                 return;
73         }
74         check_error();
75         glUniform4fv(location, num_values, values);
76         check_error();
77 }
78
79 void set_uniform_mat3(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const Eigen::Matrix3d& matrix)
80 {
81         GLint location = get_uniform_location(glsl_program_num, prefix, key);
82         if (location == -1) {
83                 return;
84         }
85         check_error();
86
87         // Convert to float (GLSL has no double matrices).
88         float matrixf[9];
89         for (unsigned y = 0; y < 3; ++y) {
90                 for (unsigned x = 0; x < 3; ++x) {
91                         matrixf[y + x * 3] = matrix(y, x);
92                 }
93         }
94
95         glUniformMatrix3fv(location, 1, GL_FALSE, matrixf);
96         check_error();
97 }