Make Input an abstract base class, and move the current functionality into FlatInput...
[movit] / util.cpp
1 #define GL_GLEXT_PROTOTYPES 1
2
3 #include <stdio.h>
4 #include <assert.h>
5
6 #include <GL/gl.h>
7 #include <GL/glext.h>
8
9 #include <math.h>
10 #include "util.h"
11
12 void hsv2rgb(float h, float s, float v, float *r, float *g, float *b)
13 {
14         if (h < 0.0f) {
15                 h += 2.0f * M_PI;
16         }
17         float c = v * s;
18         float hp = (h * 180.0 / M_PI) / 60.0;
19         float x = c * (1 - fabs(fmod(hp, 2.0f) - 1.0f));
20
21         if (hp >= 0 && hp < 1) {
22                 *r = c;
23                 *g = x;
24                 *b = 0.0f;
25         } else if (hp >= 1 && hp < 2) {
26                 *r = x;
27                 *g = c;
28                 *b = 0.0f;
29         } else if (hp >= 2 && hp < 3) {
30                 *r = 0.0f;
31                 *g = c;
32                 *b = x;
33         } else if (hp >= 3 && hp < 4) {
34                 *r = 0.0f;
35                 *g = x;
36                 *b = c;
37         } else if (hp >= 4 && hp < 5) {
38                 *r = x;
39                 *g = 0.0f;
40                 *b = c;
41         } else {
42                 *r = c;
43                 *g = 0.0f;
44                 *b = x;
45         }
46
47         float m = v - c;
48         *r += m;
49         *g += m;
50         *b += m;
51 }
52
53 std::string read_file(const std::string &filename)
54 {
55         static char buf[131072];
56         FILE *fp = fopen(filename.c_str(), "r");
57         if (fp == NULL) {
58                 perror(filename.c_str());
59                 exit(1);
60         }
61
62         int len = fread(buf, 1, sizeof(buf), fp);
63         fclose(fp);
64
65         return std::string(buf, len);
66 }
67
68 GLuint compile_shader(const std::string &shader_src, GLenum type)
69 {
70         GLuint obj = glCreateShader(type);
71         const GLchar* source[] = { shader_src.data() };
72         const GLint length[] = { (GLint)shader_src.size() };
73         glShaderSource(obj, 1, source, length);
74         glCompileShader(obj);
75
76         GLchar info_log[4096];
77         GLsizei log_length = sizeof(info_log) - 1;
78         glGetShaderInfoLog(obj, log_length, &log_length, info_log);
79         info_log[log_length] = 0; 
80         printf("shader compile log: %s\n", info_log);
81
82         GLint status;
83         glGetShaderiv(obj, GL_COMPILE_STATUS, &status);
84         if (status == GL_FALSE) {
85                 exit(1);
86         }
87
88         return obj;
89 }
90
91 void multiply_3x3_matrices(const Matrix3x3 a, const Matrix3x3 b, Matrix3x3 result)
92 {
93         result[0] = a[0] * b[0] + a[3] * b[1] + a[6] * b[2];
94         result[1] = a[1] * b[0] + a[4] * b[1] + a[7] * b[2];
95         result[2] = a[2] * b[0] + a[5] * b[1] + a[8] * b[2];
96
97         result[3] = a[0] * b[3] + a[3] * b[4] + a[6] * b[5];
98         result[4] = a[1] * b[3] + a[4] * b[4] + a[7] * b[5];
99         result[5] = a[2] * b[3] + a[5] * b[4] + a[8] * b[5];
100
101         result[6] = a[0] * b[6] + a[3] * b[7] + a[6] * b[8];
102         result[7] = a[1] * b[6] + a[4] * b[7] + a[7] * b[8];
103         result[8] = a[2] * b[6] + a[5] * b[7] + a[8] * b[8];
104 }
105
106 void invert_3x3_matrix(const Matrix3x3 m, Matrix3x3 result)
107 {
108         double inv_det = 1.0 / (
109                 m[6] * m[1] * m[5] - m[6] * m[2] * m[4] -
110                 m[3] * m[1] * m[8] + m[3] * m[2] * m[7] +
111                 m[0] * m[4] * m[8] - m[0] * m[5] * m[7]);
112
113         result[0] = inv_det * (m[4] * m[8] - m[5] * m[7]);
114         result[1] = inv_det * (m[2] * m[7] - m[1] * m[8]);
115         result[2] = inv_det * (m[1] * m[5] - m[2] * m[4]);
116
117         result[3] = inv_det * (m[6] * m[5] - m[3] * m[8]);
118         result[4] = inv_det * (m[0] * m[8] - m[6] * m[2]);
119         result[5] = inv_det * (m[3] * m[2] - m[0] * m[5]);
120
121         result[6] = inv_det * (m[3] * m[7] - m[6] * m[4]);
122         result[7] = inv_det * (m[6] * m[1] - m[0] * m[7]);
123         result[8] = inv_det * (m[0] * m[4] - m[3] * m[1]);
124 }
125
126 void print_3x3_matrix(const Matrix3x3 m)
127 {
128         printf("%6.4f %6.4f %6.4f\n", m[0], m[3], m[6]);
129         printf("%6.4f %6.4f %6.4f\n", m[1], m[4], m[7]);
130         printf("%6.4f %6.4f %6.4f\n", m[2], m[5], m[8]);
131         printf("\n");
132 }