Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <realtime_urdf_filter/shader_wrapper.h>
00032 #include <iostream>
00033 #include <stdlib.h>
00034 #include <string.h>
00035 #include <resource_retriever/retriever.h>
00036 #include <GL/glu.h>
00037
00038 namespace realtime_urdf_filter
00039 {
00040
00041 template <int L1, int L2>
00042 ShaderWrapper ShaderWrapper::fromSource (GLchar const * (&v_source) [L1], GLchar const * (&f_source) [L2])
00043 {
00044 return ShaderWrapper (v_source, f_source);
00045 }
00046
00047
00048 ShaderWrapper ShaderWrapper::fromFiles (const std::string vertex_file, const std::string fragment_file)
00049 {
00050 return fromFiles (vertex_file.c_str (), fragment_file.c_str ());
00051 }
00052 ShaderWrapper ShaderWrapper::fromFiles (const char* vertex_file, const char* fragment_file)
00053 {
00054 std::string v_source = load_text_file (vertex_file);
00055 std::string f_source = load_text_file (fragment_file);
00056
00057 const GLchar* vs[1] = {v_source.c_str () };
00058 const GLchar* fs[1] = {f_source.c_str () };
00059 return ShaderWrapper (vs, fs);
00060 }
00061
00062
00063 ShaderWrapper::~ShaderWrapper()
00064 {
00065 glDeleteProgram (prog);
00066 glDeleteShader (vertex_shader);
00067 glDeleteShader (fragment_shader);
00068 }
00069
00070
00071 ShaderWrapper::operator GLuint ()
00072 {
00073 return prog;
00074 }
00075
00076
00077 void ShaderWrapper::operator() ()
00078 {
00079 glUseProgram (prog);
00080 }
00081
00082
00083 void ShaderWrapper::SetUniformVal1i(std::string name, GLint val)
00084 {
00085 glUniform1i(glGetUniformLocation(prog, name.c_str()), val);
00086 }
00087
00088
00089 void ShaderWrapper::SetUniformVal1f(std::string name, GLfloat val)
00090 {
00091 glUniform1f(glGetUniformLocation(prog, name.c_str()), val);
00092 }
00093
00094
00095 template <int L1, int L2>
00096 ShaderWrapper::ShaderWrapper (GLchar const * (&v_source) [L1], GLchar const * (&f_source) [L2])
00097 {
00098
00099 vertex_shader = compile (GL_VERTEX_SHADER, v_source);
00100 fragment_shader = compile (GL_FRAGMENT_SHADER, f_source);
00101
00102 prog = glCreateProgram();
00103 glAttachShader (prog, vertex_shader);
00104 glAttachShader (prog, fragment_shader);
00105 glLinkProgram (prog);
00106
00107 GLenum error = glGetError();
00108 if(error != GL_NO_ERROR)
00109 throw std::logic_error (std::string("GL ERROR while creating shaders:").append((const char*)gluErrorString(error)));
00110 }
00111
00112
00113 template <int L>
00114 GLuint ShaderWrapper::compile (GLuint type, char const * (&shader_source) [L])
00115 {
00116 GLuint shader = glCreateShader (type);
00117 glShaderSource (shader, L, shader_source, NULL);
00118 glCompileShader (shader);
00119
00120 GLint compiled = GL_TRUE;
00121 glGetShaderiv (shader, GL_COMPILE_STATUS, &compiled);
00122 if (!compiled)
00123 {
00124 for (unsigned int i = 0; i < L; ++i)
00125 std::cerr << shader_source[i] << std::endl;
00126 GLint length = 0;
00127 glGetShaderiv (shader, GL_INFO_LOG_LENGTH, &length);
00128 std::string log (length, ' ');
00129 glGetShaderInfoLog (shader, length, &length, &log[0]);
00130 if (type == GL_VERTEX_SHADER)
00131 throw std::logic_error (std::string("compiling vertex shader :").append(log));
00132 else if (type == GL_FRAGMENT_SHADER)
00133 throw std::logic_error (std::string("compiling fragment shader :").append(log));
00134 return -1;
00135 }
00136 return shader;
00137 }
00138
00139
00140 std::string ShaderWrapper::load_text_file (std::string file_name)
00141 {
00142 resource_retriever::Retriever retriever;
00143 resource_retriever::MemoryResource res;
00144 try
00145 {
00146 res = retriever.get(file_name);
00147 }
00148 catch (resource_retriever::Exception& e)
00149 {
00150 throw std::logic_error (std::string("could not open shader file: ").append(file_name));
00151 return "";
00152 }
00153
00154 char* buf = (char*) malloc (sizeof(char) * (res.size + 1));
00155 memcpy (buf, res.data.get(), res.size);
00156 buf[res.size] = 0;
00157
00158 return std::string (buf);
00159
00160
00161
00162
00163
00164 }
00165
00166 }
00167
00168