diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2019-04-28 21:32:59 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2019-04-28 21:32:59 +0000 |
| commit | 450a6606cedbf45aa888637058af4742d5491b01 (patch) | |
| tree | 820210d82c58b39f42323f23ada328c919effe60 /TextureLoader/src/TextureUtilities.cpp | |
| parent | Updated GLTF loader to use Diligent file system functions (diff) | |
| download | DiligentTools-450a6606cedbf45aa888637058af4742d5491b01.tar.gz DiligentTools-450a6606cedbf45aa888637058af4742d5491b01.zip | |
Implemented loading textures from KTX
Diffstat (limited to 'TextureLoader/src/TextureUtilities.cpp')
| -rw-r--r-- | TextureLoader/src/TextureUtilities.cpp | 95 |
1 files changed, 58 insertions, 37 deletions
diff --git a/TextureLoader/src/TextureUtilities.cpp b/TextureLoader/src/TextureUtilities.cpp index 74bd302..7a41c7a 100644 --- a/TextureLoader/src/TextureUtilities.cpp +++ b/TextureLoader/src/TextureUtilities.cpp @@ -36,69 +36,90 @@ using namespace Diligent; namespace Diligent { -void CreateImageFromFile( const Char *FilePath, - Image **ppImage, - IDataBlob **ppDDSData) +EImageFileFormat CreateImageFromFile(const Char* FilePath, + Image** ppImage, + IDataBlob** ppRawData) { + EImageFileFormat ImgFileFormat = EImageFileFormat::unknown; try { - auto *pDotPos = strrchr(FilePath, '.'); - if (pDotPos == nullptr) - LOG_ERROR_AND_THROW("File path \"", FilePath, "\" does not contain extension"); - - auto *pExtension = pDotPos + 1; - if (*pExtension == 0) - LOG_ERROR_AND_THROW("File path \"", FilePath, "\" contains empty extension"); - - String Extension = StrToLower(pExtension); RefCntAutoPtr<BasicFileStream> pFileStream(MakeNewRCObj<BasicFileStream>()(FilePath, EFileAccessMode::Read)); if(!pFileStream->IsValid()) LOG_ERROR_AND_THROW("Failed to open image file \"", FilePath, '\"'); - if (Extension == "dds") - { - VERIFY_EXPR(ppDDSData != nullptr); - *ppDDSData = MakeNewRCObj<DataBlobImpl>()(0); - pFileStream->Read(*ppDDSData); - (*ppDDSData)->AddRef(); - } - else + RefCntAutoPtr<IDataBlob> pFileData(MakeNewRCObj<DataBlobImpl>()(0)); + pFileStream->Read(pFileData); + + ImgFileFormat = Image::GetFileFormat(reinterpret_cast<Uint8*>(pFileData->GetDataPtr()), pFileData->GetSize()); + if (ImgFileFormat == EImageFileFormat::unknown) { - ImageLoadInfo ImgLoadInfo; + LOG_WARNING_MESSAGE("Unable to derive image format from the header for file \"", FilePath, "\". Trying to analyze extension."); + + // Try to use extension to derive format + auto *pDotPos = strrchr(FilePath, '.'); + if (pDotPos == nullptr) + LOG_ERROR_AND_THROW("Unable to recognize file format: file name \"", FilePath, "\" does not contain extension"); + + auto *pExtension = pDotPos + 1; + if (*pExtension == 0) + LOG_ERROR_AND_THROW("Unable to recognize file format: file name \"", FilePath, "\" contain empty extension"); + + String Extension = StrToLower(pExtension); if (Extension == "png") - ImgLoadInfo.Format = EImageFileFormat::png; + ImgFileFormat = EImageFileFormat::png; else if (Extension == "jpeg" || Extension == "jpg") - ImgLoadInfo.Format = EImageFileFormat::jpeg; + ImgFileFormat = EImageFileFormat::jpeg; else if (Extension == "tiff" || Extension == "tif") - ImgLoadInfo.Format = EImageFileFormat::tiff; + ImgFileFormat = EImageFileFormat::tiff; + else if (Extension == "dds") + ImgFileFormat = EImageFileFormat::dds; + else if (Extension == "ktx") + ImgFileFormat = EImageFileFormat::ktx; else LOG_ERROR_AND_THROW("Unsupported file format ", Extension); + } - RefCntAutoPtr<IDataBlob> pFileData(MakeNewRCObj<DataBlobImpl>()(0)); - pFileStream->Read(pFileData); - + if (ImgFileFormat == EImageFileFormat::png || + ImgFileFormat == EImageFileFormat::jpeg || + ImgFileFormat == EImageFileFormat::tiff) + { + ImageLoadInfo ImgLoadInfo; + ImgLoadInfo.Format = ImgFileFormat; Image::CreateFromDataBlob(pFileData, ImgLoadInfo, ppImage); } + else + { + *ppRawData = pFileData.Detach(); + } } catch (std::runtime_error &err) { LOG_ERROR("Failed to create image from file: ", err.what()); } + + return ImgFileFormat; } -void CreateTextureFromFile( const Char *FilePath, - const TextureLoadInfo& TexLoadInfo, - IRenderDevice *pDevice, - ITexture **ppTexture ) +void CreateTextureFromFile(const Char* FilePath, + const TextureLoadInfo& TexLoadInfo, + IRenderDevice* pDevice, + ITexture** ppTexture ) { - RefCntAutoPtr<Image> pImage; - RefCntAutoPtr<IDataBlob> pDDSData; - CreateImageFromFile( FilePath, &pImage, &pDDSData ); + RefCntAutoPtr<Image> pImage; + RefCntAutoPtr<IDataBlob> pRawData; + auto ImgFmt = CreateImageFromFile( FilePath, &pImage, &pRawData ); - if( pImage ) + if (pImage) CreateTextureFromImage( pImage, TexLoadInfo, pDevice, ppTexture ); - else if(pDDSData) - CreateTextureFromDDS( pDDSData, TexLoadInfo, pDevice, ppTexture ); + else if (pRawData) + { + if (ImgFmt == EImageFileFormat::dds) + CreateTextureFromDDS( pRawData, TexLoadInfo, pDevice, ppTexture ); + else if (ImgFmt == EImageFileFormat::ktx) + CreateTextureFromKTX( pRawData, TexLoadInfo, pDevice, ppTexture ); + else + UNEXPECTED("Unexpected format"); + } } } |
