Texture *Texture::create(const Common::UString &name) { ::Aurora::FileType type = ::Aurora::kFileTypeNone; ImageDecoder *image = 0; ImageDecoder *layers[6] = { 0, 0, 0, 0, 0, 0 }; TXI *txi = 0; try { txi = loadTXI(name); const bool isFileCubeMap = txi && txi->getFeatures().cube && (txi->getFeatures().fileRange == 6); if (isFileCubeMap) { // A cube map with each side a separate image file for (size_t i = 0; i < 6; i++) { const Common::UString side = name + Common::composeString(i); Common::SeekableReadStream *imageStream = ResMan.getResource(::Aurora::kResourceImage, side, &type); if (!imageStream) throw Common::Exception("No such cube side image resource \"%s\"", side.c_str()); layers[i] = loadImage(imageStream, type, txi); } image = new CubeMapCombiner(layers); } else { Common::SeekableReadStream *imageStream = ResMan.getResource(::Aurora::kResourceImage, name, &type); if (!imageStream) throw Common::Exception("No such image resource \"%s\"", name.c_str()); // PLT needs extra handling, since they're their own Texture class if (type == ::Aurora::kFileTypePLT) { delete txi; return createPLT(name, imageStream); } image = loadImage(imageStream, type, txi); } } catch (Common::Exception &e) { delete txi; delete image; for (size_t i = 0; i < ARRAYSIZE(layers); i++) delete layers[i]; e.add("Failed to create texture \"%s\" (%d)", name.c_str(), type); throw; } return new Texture(name, image, type, txi); }
Texture *Texture::create(const Common::UString &name) { ::Aurora::FileType type = ::Aurora::kFileTypeNone; ImageDecoder *image = 0; TXI *txi = 0; try { Common::SeekableReadStream *imageStream = ResMan.getResource(::Aurora::kResourceImage, name, &type); if (!imageStream) throw Common::Exception("No such image resource \"%s\"", name.c_str()); // PLT needs extra handling, since they're their own Texture class if (type == ::Aurora::kFileTypePLT) return createPLT(name, imageStream); image = loadImage(imageStream, type); txi = loadTXI(name); } catch (Common::Exception &e) { e.add("Failed to create texture \"%s\" (%d)", name.c_str(), type); throw; } return new Texture(name, image, type, txi); }