bool Texture::Load(const char *filename) { // hook for generated textures if (!memcmp(filename, "gen:", 4)) { // TODO // return false; tex_ = (LPVOID)generateTexture(filename); if (tex_) { this->filename_ = filename; } return true; } filename_ = filename; // Currently contains many Rollerball-specific workarounds. // They shouldn't really hurt anything else very much though. int len = strlen(filename); char fn[256]; strcpy(fn, filename); bool zim = false; if (!strcmp("dds", &filename[len-3])) { strcpy(&fn[len-3], "zim"); zim = true; } if (!strcmp("6TX", &filename[len-3]) || !strcmp("6tx", &filename[len-3])) { ILOG("Detected 6TX %s", filename); strcpy(&fn[len-3], "zim"); zim = true; } for (int i = 0; i < (int)strlen(fn); i++) { if (fn[i] == '\\') fn[i] = '/'; } if (fn[0] == 'm') fn[0] = 'M'; const char *name = fn; if (zim && 0 == memcmp(name, "Media/textures/", strlen("Media/textures"))) name += strlen("Media/textures/"); len = strlen(name); #if !defined(USING_GLES2) if (!strcmp("png", &name[len-3]) || !strcmp("PNG", &name[len-3])) { if (!LoadPNG(fn)) { LoadXOR(); return false; } else { return true; } } else #endif if (!strcmp("zim", &name[len-3])) { if (!LoadZIM(name)) { LoadXOR(); return false; } else { return true; } } LoadXOR(); return false; }
bool Texture::Load(const char *filename) { // hook for generated textures if (!memcmp(filename, "gen:", 4)) { int bpp, w, h; bool clamp; uint8_t *data = generateTexture(filename, bpp, w, h, clamp); if (!data) return false; glGenTextures(1, &id_); glBindTexture(GL_TEXTURE_2D, id_); if (bpp == 1) { if (gl_extensions.IsGLES) { glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); } else { glTexImage2D(GL_TEXTURE_2D, 0, 1, w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); } } else { FLOG("unsupported"); } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); delete [] data; return true; } filename_ = filename; // Currently here are a bunch of project-specific workarounds. // They shouldn't really hurt anything else very much though. size_t len = strlen(filename); char fn[1024]; strncpy(fn, filename, sizeof(fn)); fn[1023] = 0; bool zim = false; if (!strcmp("dds", &filename[len-3])) { strcpy(&fn[len-3], "zim"); zim = true; } if (!strcmp("6TX", &filename[len-3]) || !strcmp("6tx", &filename[len-3])) { ILOG("Detected 6TX %s", filename); strcpy(&fn[len-3], "zim"); zim = true; } for (int i = 0; i < (int)strlen(fn); i++) { if (fn[i] == '\\') fn[i] = '/'; } if (fn[0] == 'm') fn[0] = 'M'; const char *name = fn; if (zim && 0==memcmp(name, "Media/textures/", strlen("Media/textures"))) name += strlen("Media/textures/"); len = strlen(name); if (!strcmp("png", &name[len-3]) || !strcmp("PNG", &name[len-3])) { if (!LoadPNG(fn)) { WLOG("WARNING: Failed to load .png %s, falling back to ugly gray XOR pattern!", fn); LoadXOR(); return false; } else { return true; } } else if (!strcmp("zim", &name[len-3])) { if (LoadZIM(name)) { return true; } else { WLOG("WARNING: Failed to load .zim texture %s, falling back to ugly gray XOR pattern!", fn); LoadXOR(); return false; } } else if (!strcmp("jpg", &name[len-3]) || !strcmp("JPG", &name[len-3]) || !strcmp("jpeg", &name[len-4]) || !strcmp("JPEG", &name[len-4])) { if (!LoadJPEG(fn)) { WLOG("WARNING: Failed to load jpeg %s, falling back to ugly gray XOR pattern!", fn); LoadXOR(); return false; } else { return true; } } else if (!name || !strlen(name)) { ELOG("Failed to identify image file %s by extension", name); } else { ELOG("Cannot load a texture with an empty filename"); } LoadXOR(); return false; }