GLuint cResourceManager::requestTexture(TexID id)
{
std::string path(texturePaths.at(id));
if (textureCache.find(id) == textureCache.end())
{
if (PHYSFS_exists(path.c_str()))
{
auto file = std::unique_ptr<PHYSFS_File, int(*)(PHYSFS_File *)>(PHYSFS_openRead(path.c_str()), PHYSFS_close);
if (file == nullptr)
errmgr->throwErr(__FILE__, __func__, __LINE__, PHYSFS_getLastError());
PHYSFS_sint64 img_size = PHYSFS_fileLength(file.get());
std::unique_ptr<PHYSFS_sint64> img_data(new PHYSFS_sint64[img_size]);
PHYSFS_sint64 length_read = PHYSFS_read(file.get(), img_data.get(), 1, img_size);
if (length_read != img_size)
errmgr->throwErr(__FILE__, __func__, __LINE__, "length_read != img_size");
auto rw = std::unique_ptr<SDL_RWops, void(*)(SDL_RWops *)>(SDL_RWFromMem(img_data.get(), img_size), SDL_FreeRW);
std::unique_ptr<SDL_Surface, void(*)(SDL_Surface *)> surf(IMG_Load_RW(rw.get(), 0), SDL_FreeSurface);
GLuint texture = sdlSurf2OpenGLtex(surf);
textureCache.emplace(id, texture);
textureCount.emplace(id, 0);
}
else
errmgr->throwErr(__FILE__, __func__, __LINE__, "Texture " + utils::toString(int(id)) + " @ " + texturePaths.at(id));
}
textureCount.at(id)++;
return textureCache.at(id);
}
R0x1aW50IGNSZXNvdXJjZU1hbmFnZXI6OnJlcXVlc3RUZXh0dXJlKFRleElEIGlkKQp7CglzdGQ6OnN0cmluZyBwYXRoKHRleHR1cmVQYXRocy5hdChpZCkpOwoKCWlmICh0ZXh0dXJlQ2FjaGUuZmluZChpZCkgPT0gdGV4dHVyZUNhY2hlLmVuZCgpKQoJewoJCWlmIChQSFlTRlNfZXhpc3RzKHBhdGguY19zdHIoKSkpCgkJewoJCQlhdXRvIGZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8UEhZU0ZTX0ZpbGUsIGludCgqKShQSFlTRlNfRmlsZSAqKT4oUEhZU0ZTX29wZW5SZWFkKHBhdGguY19zdHIoKSksIFBIWVNGU19jbG9zZSk7CgkJCWlmIChmaWxlID09IG51bGxwdHIpCgkJCQllcnJtZ3ItPnRocm93RXJyKF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18sIFBIWVNGU19nZXRMYXN0RXJyb3IoKSk7CgoKCQkJUEhZU0ZTX3NpbnQ2NCBpbWdfc2l6ZSA9IFBIWVNGU19maWxlTGVuZ3RoKGZpbGUuZ2V0KCkpOwoJCQlzdGQ6OnVuaXF1ZV9wdHI8UEhZU0ZTX3NpbnQ2ND4gaW1nX2RhdGEobmV3IFBIWVNGU19zaW50NjRbaW1nX3NpemVdKTsKCQkJUEhZU0ZTX3NpbnQ2NCBsZW5ndGhfcmVhZCA9IFBIWVNGU19yZWFkKGZpbGUuZ2V0KCksIGltZ19kYXRhLmdldCgpLCAxLCBpbWdfc2l6ZSk7CgoJCQlpZiAobGVuZ3RoX3JlYWQgIT0gaW1nX3NpemUpCgkJCQllcnJtZ3ItPnRocm93RXJyKF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18sICJsZW5ndGhfcmVhZCAhPSBpbWdfc2l6ZSIpOwoKCQkJYXV0byBydyA9IHN0ZDo6dW5pcXVlX3B0cjxTRExfUldvcHMsIHZvaWQoKikoU0RMX1JXb3BzICopPihTRExfUldGcm9tTWVtKGltZ19kYXRhLmdldCgpLCBpbWdfc2l6ZSksIFNETF9GcmVlUlcpOwoJCQlzdGQ6OnVuaXF1ZV9wdHI8U0RMX1N1cmZhY2UsIHZvaWQoKikoU0RMX1N1cmZhY2UgKik+IHN1cmYoSU1HX0xvYWRfUlcocncuZ2V0KCksIDApLCBTRExfRnJlZVN1cmZhY2UpOwoKCQkJR0x1aW50IHRleHR1cmUgPSBzZGxTdXJmMk9wZW5HTHRleChzdXJmKTsKCQkJdGV4dHVyZUNhY2hlLmVtcGxhY2UoaWQsIHRleHR1cmUpOwoJCQl0ZXh0dXJlQ291bnQuZW1wbGFjZShpZCwgMCk7CgkJfQoJCWVsc2UKCQkJZXJybWdyLT50aHJvd0VycihfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fLCAiVGV4dHVyZSAiICsgdXRpbHM6OnRvU3RyaW5nKGludChpZCkpICsgIiBAICIgKyB0ZXh0dXJlUGF0aHMuYXQoaWQpKTsKCX0KCgl0ZXh0dXJlQ291bnQuYXQoaWQpKys7CglyZXR1cm4gdGV4dHVyZUNhY2hlLmF0KGlkKTsKfQ==