9 void hsv2rgb(float h, float s, float v, float *r, float *g, float *b)
15 float hp = (h * 180.0 / M_PI) / 60.0;
16 float x = c * (1 - fabs(fmod(hp, 2.0f) - 1.0f));
18 if (hp >= 0 && hp < 1) {
22 } else if (hp >= 1 && hp < 2) {
26 } else if (hp >= 2 && hp < 3) {
30 } else if (hp >= 3 && hp < 4) {
34 } else if (hp >= 4 && hp < 5) {
50 void hsv2rgb_normalized(float h, float s, float v, float *r, float *g, float *b)
52 float ref_r, ref_g, ref_b;
53 hsv2rgb(h, s, v, r, g, b);
54 hsv2rgb(h, 0.0f, v, &ref_r, &ref_g, &ref_b);
55 float lum = 0.2126 * *r + 0.7152 * *g + 0.0722 * *b;
56 float ref_lum = 0.2126 * ref_r + 0.7152 * ref_g + 0.0722 * ref_b;
58 float fac = ref_lum / lum;
65 std::string read_file(const std::string &filename)
67 static char buf[131072];
68 FILE *fp = fopen(filename.c_str(), "r");
70 perror(filename.c_str());
74 int len = fread(buf, 1, sizeof(buf), fp);
77 return std::string(buf, len);
80 GLuint compile_shader(const std::string &shader_src, GLenum type)
82 GLuint obj = glCreateShader(type);
83 const GLchar* source[] = { shader_src.data() };
84 const GLint length[] = { (GLint)shader_src.size() };
85 glShaderSource(obj, 1, source, length);
88 GLchar info_log[4096];
89 GLsizei log_length = sizeof(info_log) - 1;
90 glGetShaderInfoLog(obj, log_length, &log_length, info_log);
91 info_log[log_length] = 0;
92 if (strlen(info_log) > 0) {
93 printf("shader compile log: %s\n", info_log);
97 glGetShaderiv(obj, GL_COMPILE_STATUS, &status);
98 if (status == GL_FALSE) {
105 void print_3x3_matrix(const Eigen::Matrix3d& m)
107 printf("%6.4f %6.4f %6.4f\n", m(0,0), m(0,1), m(0,2));
108 printf("%6.4f %6.4f %6.4f\n", m(1,0), m(1,1), m(1,2));
109 printf("%6.4f %6.4f %6.4f\n", m(2,0), m(2,1), m(2,2));
113 std::string output_glsl_mat3(const std::string &name, const Eigen::Matrix3d &m)
117 "const mat3 %s = mat3(\n"
118 " %.8f, %.8f, %.8f,\n"
119 " %.8f, %.8f, %.8f,\n"
120 " %.8f, %.8f, %.8f);\n\n",
122 m(0,0), m(1,0), m(2,0),
123 m(0,1), m(1,1), m(2,1),
124 m(0,2), m(1,2), m(2,2));
128 void combine_two_samples(float w1, float w2, float *offset, float *total_weight)
130 assert(w1 * w2 >= 0.0f); // Should not have differing signs.
131 if (fabs(w1 + w2) < 1e-6) {
133 *total_weight = 0.0f;
135 *offset = w2 / (w1 + w2);
136 *total_weight = w1 + w2;
138 assert(*offset >= 0.0f);
139 assert(*offset <= 1.0f);