uint8_t *DirectoryAssetReader::ReadAsset(const char *path, size_t *size) { char new_path[256] = {0}; // Check if it already contains the path if (strlen(path) > strlen(path_) && 0 == memcmp(path, path_, strlen(path_))) { } else { strcpy(new_path, path_); } strcat(new_path, path); return ReadLocalFile(new_path, size); }
bool glsl_recompile(GLSLProgram *program, std::string *error_message) { struct stat vs, fs; AutoCharArrayBuf vsh_src, fsh_src; if (strlen(program->vshader_filename) > 0 && 0 == stat(program->vshader_filename, &vs)) { program->vshader_mtime = vs.st_mtime; if (!program->vshader_source) { size_t sz; vsh_src.reset((char *)ReadLocalFile(program->vshader_filename, &sz)); } } else { program->vshader_mtime = 0; } if (strlen(program->fshader_filename) > 0 && 0 == stat(program->fshader_filename, &fs)) { program->fshader_mtime = fs.st_mtime; if (!program->fshader_source) { size_t sz; fsh_src.reset((char *)ReadLocalFile(program->fshader_filename, &sz)); } } else { program->fshader_mtime = 0; } if (!program->vshader_source && !vsh_src) { size_t sz; vsh_src.reset((char *)VFSReadFile(program->vshader_filename, &sz)); } if (!program->vshader_source && !vsh_src) { ELOG("File missing: %s", program->vshader_filename); if (error_message) { *error_message = std::string("File missing: ") + program->vshader_filename; } return false; } if (!program->fshader_source && !fsh_src) { size_t sz; fsh_src.reset((char *)VFSReadFile(program->fshader_filename, &sz)); } if (!program->fshader_source && !fsh_src) { ELOG("File missing: %s", program->fshader_filename); if (error_message) { *error_message = std::string("File missing: ") + program->fshader_filename; } return false; } GLuint vsh = glCreateShader(GL_VERTEX_SHADER); const GLchar *vsh_str = program->vshader_source ? program->vshader_source : (const GLchar *)(vsh_src); if (!CompileShader(vsh_str, vsh, program->vshader_filename, error_message)) { return false; } const GLchar *fsh_str = program->fshader_source ? program->fshader_source : (const GLchar *)(fsh_src); GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER); if (!CompileShader(fsh_str, fsh, program->fshader_filename, error_message)) { glDeleteShader(vsh); return false; } GLuint prog = glCreateProgram(); glAttachShader(prog, vsh); glAttachShader(prog, fsh); glLinkProgram(prog); GLint linkStatus; glGetProgramiv(prog, GL_LINK_STATUS, &linkStatus); if (linkStatus == GL_FALSE) { GLint bufLength = 0; glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &bufLength); if (bufLength) { char* buf = new char[bufLength + 1]; // safety glGetProgramInfoLog(prog, bufLength, NULL, buf); ILOG("vsh: %i fsh: %i", vsh, fsh); ELOG("Could not link shader program (linkstatus=%i):\n %s \n", linkStatus, buf); if (error_message) { *error_message = buf; } delete [] buf; } else { ILOG("vsh: %i fsh: %i", vsh, fsh); ELOG("Could not link shader program (linkstatus=%i). No OpenGL error log was available.", linkStatus); if (error_message) { *error_message = "(no error message available)"; } } glDeleteShader(vsh); glDeleteShader(fsh); return false; } // Destroy the old program, if any. if (program->program_) { glDeleteProgram(program->program_); } program->program_ = prog; program->vsh_ = vsh; program->fsh_ = fsh; program->sampler0 = glGetUniformLocation(program->program_, "sampler0"); program->sampler1 = glGetUniformLocation(program->program_, "sampler1"); program->a_position = glGetAttribLocation(program->program_, "a_position"); program->a_color = glGetAttribLocation(program->program_, "a_color"); program->a_normal = glGetAttribLocation(program->program_, "a_normal"); program->a_texcoord0 = glGetAttribLocation(program->program_, "a_texcoord0"); program->a_texcoord1 = glGetAttribLocation(program->program_, "a_texcoord1"); program->u_worldviewproj = glGetUniformLocation(program->program_, "u_worldviewproj"); program->u_world = glGetUniformLocation(program->program_, "u_world"); program->u_viewproj = glGetUniformLocation(program->program_, "u_viewproj"); program->u_fog = glGetUniformLocation(program->program_, "u_fog"); program->u_sundir = glGetUniformLocation(program->program_, "u_sundir"); program->u_camerapos = glGetUniformLocation(program->program_, "u_camerapos"); //ILOG("Shader compilation success: %s %s", // program->vshader_filename, // program->fshader_filename); return true; }