void ShaderPrivate:: compile(void) { if(m_shader_ready) { return; } //now do the GL work, create a name and compile the source code: assert(m_name == 0); m_shader_ready = true; m_name = glCreateShader(m_shader_type); const char *sourceString[1]; sourceString[0] = m_source_code.c_str(); glShaderSource(m_name, //shader handle 1, //number strings sourceString, //array of strings NULL); //lengths of each string or NULL implies each is 0-terminated glCompileShader(m_name); GLint logSize(0), shaderOK; std::vector<char> raw_log; //get shader compile status and log length. glGetShaderiv(m_name, GL_COMPILE_STATUS, &shaderOK); glGetShaderiv(m_name, GL_INFO_LOG_LENGTH, &logSize); //retrieve the compile log string, eh gross. raw_log.resize(logSize+2,'\0'); glGetShaderInfoLog(m_name, //shader handle logSize+1, //maximum size of string NULL, //GLint* return length of string &raw_log[0]); //char* to write log to. m_compile_log = &raw_log[0]; m_compile_success = (shaderOK == GL_TRUE); if(!m_compile_success) { std::ostringstream oo; oo << "bad_shader_" << m_name << ".glsl"; std::ofstream eek(oo.str().c_str()); eek << m_source_code << "\n\n" << m_compile_log; } }
static void bar(void *db) { eek(s); }