]> git.sesse.net Git - movit/blobdiff - util.cpp
Keep FBOs around in EffectChain again.
[movit] / util.cpp
index a1bc2fd3e868c8aa2e6a948237e5608ff11b491b..1e66c30b573e51ef419146d5149c32ed9e53e7d3 100644 (file)
--- a/util.cpp
+++ b/util.cpp
@@ -9,7 +9,19 @@
 #include "init.h"
 #include "util.h"
 
-extern std::string *movit_data_directory;
+#if defined(__DARWIN__)
+#include <OpenGL/OpenGL.h>
+#elif defined(WIN32)
+#include <GL/wglew.h>
+#else
+#include <GL/glxew.h>
+#endif
+
+using namespace std;
+
+namespace movit {
+
+extern string *movit_data_directory;
 
 void hsv2rgb(float h, float s, float v, float *r, float *g, float *b)
 {
@@ -67,9 +79,9 @@ void hsv2rgb_normalized(float h, float s, float v, float *r, float *g, float *b)
        }
 }
 
-std::string read_file(const std::string &filename)
+string read_file(const string &filename)
 {
-       const std::string full_pathname = *movit_data_directory + "/" + filename;
+       const string full_pathname = *movit_data_directory + "/" + filename;
 
        static char buf[131072];
        FILE *fp = fopen(full_pathname.c_str(), "r");
@@ -81,10 +93,10 @@ std::string read_file(const std::string &filename)
        int len = fread(buf, 1, sizeof(buf), fp);
        fclose(fp);
 
-       return std::string(buf, len);
+       return string(buf, len);
 }
 
-GLuint compile_shader(const std::string &shader_src, GLenum type)
+GLuint compile_shader(const string &shader_src, GLenum type)
 {
        GLuint obj = glCreateShader(type);
        const GLchar* source[] = { shader_src.data() };
@@ -97,7 +109,7 @@ GLuint compile_shader(const std::string &shader_src, GLenum type)
        glGetShaderInfoLog(obj, log_length, &log_length, info_log);
        info_log[log_length] = 0; 
        if (strlen(info_log) > 0) {
-               printf("shader compile log: %s\n", info_log);
+               fprintf(stderr, "Shader compile log: %s\n", info_log);
        }
 
        GLint status;
@@ -117,7 +129,7 @@ void print_3x3_matrix(const Eigen::Matrix3d& m)
        printf("\n");
 }
 
-std::string output_glsl_mat3(const std::string &name, const Eigen::Matrix3d &m)
+string output_glsl_mat3(const string &name, const Eigen::Matrix3d &m)
 {
        char buf[1024];
        sprintf(buf,
@@ -173,3 +185,71 @@ void combine_two_samples(float w1, float w2, float *offset, float *total_weight,
        assert(*offset >= 0.0f);
        assert(*offset <= 1.0f);
 }
+
+GLuint fill_vertex_attribute(GLuint glsl_program_num, const string &attribute_name, GLint size, GLenum type, GLsizeiptr data_size, const GLvoid *data)
+{
+       int attrib = glGetAttribLocation(glsl_program_num, attribute_name.c_str());
+       if (attrib == -1) {
+               return -1;
+       }
+
+       GLuint vbo;
+       glGenBuffers(1, &vbo);
+       check_error();
+       glBindBuffer(GL_ARRAY_BUFFER, vbo);
+       check_error();
+       glBufferData(GL_ARRAY_BUFFER, data_size, data, GL_STATIC_DRAW);
+       check_error();
+       glEnableVertexAttribArray(attrib);
+       check_error();
+       glVertexAttribPointer(attrib, size, type, GL_FALSE, 0, BUFFER_OFFSET(0));
+       check_error();
+       glBindBuffer(GL_ARRAY_BUFFER, 0);
+       check_error();
+
+       return vbo;
+}
+
+void cleanup_vertex_attribute(GLuint glsl_program_num, const string &attribute_name, GLuint vbo)
+{
+       int attrib = glGetAttribLocation(glsl_program_num, attribute_name.c_str());
+       if (attrib == -1) {
+               return;
+       }
+
+       glDisableVertexAttribArray(attrib);
+       check_error();
+       glDeleteBuffers(1, &vbo);
+       check_error();
+}
+
+unsigned div_round_up(unsigned a, unsigned b)
+{
+       return (a + b - 1) / b;
+}
+
+// Algorithm from http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2.
+unsigned next_power_of_two(unsigned v)
+{
+       v--;
+       v |= v >> 1;
+       v |= v >> 2;
+       v |= v >> 4;
+       v |= v >> 8;
+       v |= v >> 16;
+       v++;
+       return v;
+}
+
+void *get_gl_context_identifier()
+{
+#if defined(__DARWIN__)
+       return (void *)CGLGetCurrentContext();
+#elif defined(WIN32)
+       return (void *)wglGetCurrentContext();
+#else
+       return (void *)glXGetCurrentContext();
+#endif
+}
+
+}  // namespace movit