ShaderObject *ShaderManager::getShaderObject(const Common::UString &name, const Common::UString &source, ShaderType type) { _shaderMutex.lock(); ShaderObject *shaderObject = 0; //ShaderObject *shaderObject = (ShaderObject *)(_shaderObjectMap[filename.c_str()]); std::map<Common::UString, Shader::ShaderObject *>::iterator it = _shaderObjectMap.find(name); if (it != _shaderObjectMap.end()) { _shaderMutex.unlock(); return it->second; } shaderObject = new ShaderObject; shaderObject->type = type; shaderObject->glid = 0; shaderObject->shaderString = source; status("shader %s loaded", name.c_str()); _shaderObjectMap.insert(std::pair<Common::UString, ShaderObject *>(name, shaderObject)); _shaderMutex.unlock(); parseShaderVariables(source, shaderObject->variablesSelf); genShaderVariableList(shaderObject, shaderObject->variablesCombined); if (shaderObject->type == SHADER_VERTEX) { shaderObject->id = _counterVID++; // Post decrement intentional. } else { shaderObject->id = _counterFID++; // Post decrement intentional. } return shaderObject; }
ShaderObject *ShaderManager::getShaderObject(const Common::UString &name, const Common::UString &source, ShaderType type) { ShaderObject *shaderObject = 0; //ShaderObject *shaderObject = (ShaderObject *)(_shaderObjectMap[filename.c_str()]); std::map<Common::UString, Shader::ShaderObject *>::iterator it = _shaderObjectMap.find(name); if (it != _shaderObjectMap.end()) { return it->second; } shaderObject = new ShaderObject; shaderObject->type = type; shaderObject->glid = glCreateShader(shaderObject->type == SHADER_VERTEX ? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER); const char *text = source.c_str(); glShaderSource(shaderObject->glid, 1, (const GLchar **)(&text), 0); glCompileShader(shaderObject->glid); status("shader %s loaded", name.c_str()); GLint gl_status; glGetShaderiv(shaderObject->glid, GL_COMPILE_STATUS, &gl_status); if (gl_status == GL_FALSE) { GLsizei logolength; char logorama[4096]; glGetShaderInfoLog(shaderObject->glid, 4095, &logolength, logorama); error("shader compile failure! shader %s, Driver output:\n", logorama); delete shaderObject; } else { _shaderObjectMap.insert(std::pair<Common::UString, ShaderObject *>(name, shaderObject)); parseShaderVariables(source, shaderObject->variablesSelf); genShaderVariableList(shaderObject, shaderObject->variablesCombined); if (shaderObject->type == SHADER_VERTEX) { shaderObject->id = _counterVID++; // Post decrement intentional. } else { shaderObject->id = _counterFID++; // Post decrement intentional. } } return shaderObject; }