Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}