]> git.sesse.net Git - movit/blobdiff - util.cpp
Use VAOs to bind the VBOs.
[movit] / util.cpp
index 6b1de53cc35b52af8094a65a97e442aba43f81f8..b86e3f77c9d4842fdea43cfbfe025bc786a2fa1c 100644 (file)
--- a/util.cpp
+++ b/util.cpp
@@ -2,6 +2,7 @@
 #include <assert.h>
 #include <math.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <Eigen/Core>
 
@@ -10,6 +11,8 @@
 
 using namespace std;
 
+namespace movit {
+
 extern string *movit_data_directory;
 
 void hsv2rgb(float h, float s, float v, float *r, float *g, float *b)
@@ -98,7 +101,7 @@ GLuint compile_shader(const 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;
@@ -174,3 +177,42 @@ 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();
+}
+
+}  // namespace movit