FilePath TextureConverter::ConvertTexture(const TextureDescriptor &descriptor, eGPUFamily gpuFamily, bool updateAfterConversion, eConvertQuality quality) { const TextureDescriptor::Compression * compression = &descriptor.compression[gpuFamily]; FilePath outputPath; const String& outExtension = GPUFamilyDescriptor::GetCompressedFileExtension(gpuFamily, (DAVA::PixelFormat)compression->format); if(outExtension == ".pvr") { Logger::FrameworkDebug("Starting PVR (%s) conversion (%s)...", GlobalEnumMap<DAVA::PixelFormat>::Instance()->ToString(compression->format), descriptor.pathname.GetAbsolutePathname().c_str()); if(descriptor.dataSettings.GetIsNormalMap()) { outputPath = PVRConverter::Instance()->ConvertNormalMapPngToPvr(descriptor, gpuFamily, quality); } else { outputPath = PVRConverter::Instance()->ConvertPngToPvr(descriptor, gpuFamily, quality); } } else if(outExtension == ".dds") { DAVA::Logger::FrameworkDebug("Starting DXT(%s) conversion (%s)...", GlobalEnumMap<DAVA::PixelFormat>::Instance()->ToString(compression->format), descriptor.pathname.GetAbsolutePathname().c_str()); if(descriptor.IsCubeMap()) { outputPath = DXTConverter::ConvertCubemapPngToDxt(descriptor, gpuFamily); } else { outputPath = DXTConverter::ConvertPngToDxt(descriptor, gpuFamily); } } else { DVASSERT(false); } if(updateAfterConversion) { bool wasUpdated = descriptor.UpdateCrcForFormat(gpuFamily); if(wasUpdated) { // Potential problem may occur in case of multithread convertion of // one texture: Save() will dump to drive unvalid compression info // and final variant of descriptor must be dumped again after finishing // of all threads. descriptor.Save(); } } return outputPath; }