diff --git a/src/ObjImage/Image/ImageFormat.cpp b/src/ObjImage/Image/ImageFormat.cpp index 6f2ace41..83bb9369 100644 --- a/src/ObjImage/Image/ImageFormat.cpp +++ b/src/ObjImage/Image/ImageFormat.cpp @@ -1,7 +1,37 @@ #include "ImageFormat.h" +#include + +namespace +{ + const char* IMAGE_FORMAT_NAMES[]{ + "R8_G8_B8", + "B8_G8_R8_X8", + "R8_G8_B8_A8", + "B8_G8_R8_A8", + "A8", + "R16_G16_B16_A16_FLOAT", + "R8", + "R8_A8", + "BC1", + "BC2", + "BC3", + "BC4", + "BC5", + }; + static_assert(std::extent_v == static_cast(image::ImageFormatId::MAX)); +} // namespace + namespace image { + const char* GetImageFormatName(ImageFormatId id) + { + if (id < ImageFormatId::MAX) + return IMAGE_FORMAT_NAMES[static_cast(id)]; + + return "unknown"; + } + ImageFormat::ImageFormat(const ImageFormatId id, const oat::D3DFORMAT d3dFormat, const oat::DXGI_FORMAT dxgiFormat) : m_id(id), m_d3d_format(d3dFormat), diff --git a/src/ObjImage/Image/ImageFormat.h b/src/ObjImage/Image/ImageFormat.h index 57de0b5b..dceb84ee 100644 --- a/src/ObjImage/Image/ImageFormat.h +++ b/src/ObjImage/Image/ImageFormat.h @@ -8,9 +8,8 @@ namespace image { - enum class ImageFormatId + enum class ImageFormatId : std::uint8_t { - UNKNOWN = -1, R8_G8_B8, B8_G8_R8_X8, R8_G8_B8_A8, @@ -25,10 +24,13 @@ namespace image BC4, BC5, - MAX + MAX, + UNKNOWN }; - enum class ImageFormatType + const char* GetImageFormatName(ImageFormatId id); + + enum class ImageFormatType : std::uint8_t { UNKNOWN, UNSIGNED, diff --git a/src/ObjWriting/Game/IW3/Image/ImageDumperIW3.cpp b/src/ObjWriting/Game/IW3/Image/ImageDumperIW3.cpp index 1d9b2572..0dc6804c 100644 --- a/src/ObjWriting/Game/IW3/Image/ImageDumperIW3.cpp +++ b/src/ObjWriting/Game/IW3/Image/ImageDumperIW3.cpp @@ -69,10 +69,10 @@ namespace image { switch (ObjWriting::Configuration.ImageOutputFormat) { - case ObjWriting::Configuration_t::ImageOutputFormat_e::DDS: + case ImageOutputFormat_e::DDS: m_writer = std::make_unique(); break; - case ObjWriting::Configuration_t::ImageOutputFormat_e::IWI: + case ImageOutputFormat_e::IWI: m_writer = std::make_unique(); break; default: @@ -89,6 +89,15 @@ namespace image if (!texture) return; + if (!m_writer->SupportsImageFormat(texture->GetFormat())) + { + con::warn("Not dumping image {} as {} does not support the image format {}", + image->name, + GetImageOutputFormatName(ObjWriting::Configuration.ImageOutputFormat), + GetImageFormatName(texture->GetFormat()->GetId())); + return; + } + const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset.m_name, m_writer->GetFileExtension())); if (!assetFile) diff --git a/src/ObjWriting/Game/IW4/Image/ImageDumperIW4.cpp b/src/ObjWriting/Game/IW4/Image/ImageDumperIW4.cpp index bf85f7e6..95fd2874 100644 --- a/src/ObjWriting/Game/IW4/Image/ImageDumperIW4.cpp +++ b/src/ObjWriting/Game/IW4/Image/ImageDumperIW4.cpp @@ -65,10 +65,10 @@ namespace image { switch (ObjWriting::Configuration.ImageOutputFormat) { - case ObjWriting::Configuration_t::ImageOutputFormat_e::DDS: + case ImageOutputFormat_e::DDS: m_writer = std::make_unique(); break; - case ObjWriting::Configuration_t::ImageOutputFormat_e::IWI: + case ImageOutputFormat_e::IWI: m_writer = std::make_unique(); break; default: @@ -85,6 +85,15 @@ namespace image if (!texture) return; + if (!m_writer->SupportsImageFormat(texture->GetFormat())) + { + con::warn("Not dumping image {} as {} does not support the image format {}", + image->name, + GetImageOutputFormatName(ObjWriting::Configuration.ImageOutputFormat), + GetImageFormatName(texture->GetFormat()->GetId())); + return; + } + const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset.m_name, m_writer->GetFileExtension())); if (!assetFile) diff --git a/src/ObjWriting/Game/IW5/Image/ImageDumperIW5.cpp b/src/ObjWriting/Game/IW5/Image/ImageDumperIW5.cpp index 123208f5..d5bb5fe6 100644 --- a/src/ObjWriting/Game/IW5/Image/ImageDumperIW5.cpp +++ b/src/ObjWriting/Game/IW5/Image/ImageDumperIW5.cpp @@ -66,10 +66,10 @@ namespace image { switch (ObjWriting::Configuration.ImageOutputFormat) { - case ObjWriting::Configuration_t::ImageOutputFormat_e::DDS: + case ImageOutputFormat_e::DDS: m_writer = std::make_unique(); break; - case ObjWriting::Configuration_t::ImageOutputFormat_e::IWI: + case ImageOutputFormat_e::IWI: m_writer = std::make_unique(); break; default: @@ -86,6 +86,15 @@ namespace image if (!texture) return; + if (!m_writer->SupportsImageFormat(texture->GetFormat())) + { + con::warn("Not dumping image {} as {} does not support the image format {}", + image->name, + GetImageOutputFormatName(ObjWriting::Configuration.ImageOutputFormat), + GetImageFormatName(texture->GetFormat()->GetId())); + return; + } + const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset.m_name, m_writer->GetFileExtension())); if (!assetFile) diff --git a/src/ObjWriting/Game/T5/Image/ImageDumperT5.cpp b/src/ObjWriting/Game/T5/Image/ImageDumperT5.cpp index e541e579..6f419868 100644 --- a/src/ObjWriting/Game/T5/Image/ImageDumperT5.cpp +++ b/src/ObjWriting/Game/T5/Image/ImageDumperT5.cpp @@ -65,10 +65,10 @@ namespace image { switch (ObjWriting::Configuration.ImageOutputFormat) { - case ObjWriting::Configuration_t::ImageOutputFormat_e::DDS: + case ImageOutputFormat_e::DDS: m_writer = std::make_unique(); break; - case ObjWriting::Configuration_t::ImageOutputFormat_e::IWI: + case ImageOutputFormat_e::IWI: m_writer = std::make_unique(); break; default: @@ -85,6 +85,15 @@ namespace image if (!texture) return; + if (!m_writer->SupportsImageFormat(texture->GetFormat())) + { + con::warn("Not dumping image {} as {} does not support the image format {}", + image->name, + GetImageOutputFormatName(ObjWriting::Configuration.ImageOutputFormat), + GetImageFormatName(texture->GetFormat()->GetId())); + return; + } + const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset.m_name, m_writer->GetFileExtension())); if (!assetFile) diff --git a/src/ObjWriting/Game/T6/Image/ImageDumperT6.cpp b/src/ObjWriting/Game/T6/Image/ImageDumperT6.cpp index 7ac1557a..b107dfbb 100644 --- a/src/ObjWriting/Game/T6/Image/ImageDumperT6.cpp +++ b/src/ObjWriting/Game/T6/Image/ImageDumperT6.cpp @@ -83,10 +83,10 @@ namespace image { switch (ObjWriting::Configuration.ImageOutputFormat) { - case ObjWriting::Configuration_t::ImageOutputFormat_e::DDS: + case ImageOutputFormat_e::DDS: m_writer = std::make_unique(); break; - case ObjWriting::Configuration_t::ImageOutputFormat_e::IWI: + case ImageOutputFormat_e::IWI: m_writer = std::make_unique(); break; default: @@ -103,6 +103,15 @@ namespace image if (!texture) return; + if (!m_writer->SupportsImageFormat(texture->GetFormat())) + { + con::warn("Not dumping image {} as {} does not support the image format {}", + image->name, + GetImageOutputFormatName(ObjWriting::Configuration.ImageOutputFormat), + GetImageFormatName(texture->GetFormat()->GetId())); + return; + } + const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset.m_name, m_writer->GetFileExtension())); if (!assetFile) diff --git a/src/ObjWriting/ObjWriting.cpp b/src/ObjWriting/ObjWriting.cpp index 8ecffa1b..7262b956 100644 --- a/src/ObjWriting/ObjWriting.cpp +++ b/src/ObjWriting/ObjWriting.cpp @@ -1,7 +1,26 @@ #include "ObjWriting.h" +#include + +namespace +{ + const char* IMAGE_OUTPUT_FORMAT_NAME[]{ + "DDS", + "IWI", + }; + static_assert(std::extent_v == static_cast(ImageOutputFormat_e::COUNT)); +} // namespace + ObjWriting::Configuration_t ObjWriting::Configuration; +const char* GetImageOutputFormatName(ImageOutputFormat_e imageOutputFormat) +{ + if (imageOutputFormat < ImageOutputFormat_e::COUNT) + return IMAGE_OUTPUT_FORMAT_NAME[static_cast(imageOutputFormat)]; + + return "unknown"; +} + bool ObjWriting::ShouldHandleAssetType(const asset_type_t assetType) { if (assetType < 0) diff --git a/src/ObjWriting/ObjWriting.h b/src/ObjWriting/ObjWriting.h index 200ddab7..28e9f365 100644 --- a/src/ObjWriting/ObjWriting.h +++ b/src/ObjWriting/ObjWriting.h @@ -5,27 +5,31 @@ #include +enum class ImageOutputFormat_e +{ + DDS, + IWI, + + COUNT +}; + +const char* GetImageOutputFormatName(ImageOutputFormat_e imageOutputFormat); + +enum class ModelOutputFormat_e +{ + XMODEL_EXPORT, + XMODEL_BIN, + OBJ, + GLTF, + GLB +}; + class ObjWriting { public: static class Configuration_t { public: - enum class ImageOutputFormat_e - { - DDS, - IWI - }; - - enum class ModelOutputFormat_e - { - XMODEL_EXPORT, - XMODEL_BIN, - OBJ, - GLTF, - GLB - }; - std::vector AssetTypesToHandleBitfield; ImageOutputFormat_e ImageOutputFormat = ImageOutputFormat_e::DDS; diff --git a/src/ObjWriting/XModel/XModelDumper.cpp.template b/src/ObjWriting/XModel/XModelDumper.cpp.template index 9b0b1bba..434750af 100644 --- a/src/ObjWriting/XModel/XModelDumper.cpp.template +++ b/src/ObjWriting/XModel/XModelDumper.cpp.template @@ -553,8 +553,8 @@ namespace bool CanOmitDefaultArmature() { - return ObjWriting::Configuration.ModelOutputFormat != ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_EXPORT - && ObjWriting::Configuration.ModelOutputFormat != ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_BIN; + return ObjWriting::Configuration.ModelOutputFormat != ModelOutputFormat_e::XMODEL_EXPORT + && ObjWriting::Configuration.ModelOutputFormat != ModelOutputFormat_e::XMODEL_BIN; } void PopulateXModelWriter(XModelCommon& out, const AssetDumpingContext& context, const unsigned lod, const XModel& model) @@ -666,25 +666,25 @@ namespace switch (ObjWriting::Configuration.ModelOutputFormat) { - case ObjWriting::Configuration_t::ModelOutputFormat_e::OBJ: + case ModelOutputFormat_e::OBJ: DumpObjLod(common, context, asset, currentLod); if (currentLod == 0u) DumpObjMtl(common, context, asset); break; - case ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_EXPORT: + case ModelOutputFormat_e::XMODEL_EXPORT: DumpXModelExportLod(common, context, asset, currentLod); break; - case ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_BIN: + case ModelOutputFormat_e::XMODEL_BIN: DumpXModelBinLod(common, context, asset, currentLod); break; - case ObjWriting::Configuration_t::ModelOutputFormat_e::GLTF: + case ModelOutputFormat_e::GLTF: DumpGltfLod(common, context, asset, currentLod, ".gltf"); break; - case ObjWriting::Configuration_t::ModelOutputFormat_e::GLB: + case ModelOutputFormat_e::GLB: DumpGltfLod(common, context, asset, currentLod, ".glb"); break; @@ -699,15 +699,15 @@ namespace { switch (ObjWriting::Configuration.ModelOutputFormat) { - case ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_EXPORT: + case ModelOutputFormat_e::XMODEL_EXPORT: return ".xmodel_export"; - case ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_BIN: + case ModelOutputFormat_e::XMODEL_BIN: return ".xmodel_bin"; - case ObjWriting::Configuration_t::ModelOutputFormat_e::OBJ: + case ModelOutputFormat_e::OBJ: return ".obj"; - case ObjWriting::Configuration_t::ModelOutputFormat_e::GLTF: + case ModelOutputFormat_e::GLTF: return ".gltf"; - case ObjWriting::Configuration_t::ModelOutputFormat_e::GLB: + case ModelOutputFormat_e::GLB: return ".glb"; default: assert(false); diff --git a/src/Unlinking/UnlinkerArgs.cpp b/src/Unlinking/UnlinkerArgs.cpp index f857265e..18ea2d53 100644 --- a/src/Unlinking/UnlinkerArgs.cpp +++ b/src/Unlinking/UnlinkerArgs.cpp @@ -184,13 +184,13 @@ bool UnlinkerArgs::SetImageDumpingMode() const if (specifiedValue == "dds") { - ObjWriting::Configuration.ImageOutputFormat = ObjWriting::Configuration_t::ImageOutputFormat_e::DDS; + ObjWriting::Configuration.ImageOutputFormat = ImageOutputFormat_e::DDS; return true; } if (specifiedValue == "iwi") { - ObjWriting::Configuration.ImageOutputFormat = ObjWriting::Configuration_t::ImageOutputFormat_e::IWI; + ObjWriting::Configuration.ImageOutputFormat = ImageOutputFormat_e::IWI; return true; } @@ -206,31 +206,31 @@ bool UnlinkerArgs::SetModelDumpingMode() const if (specifiedValue == "xmodel_export") { - ObjWriting::Configuration.ModelOutputFormat = ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_EXPORT; + ObjWriting::Configuration.ModelOutputFormat = ModelOutputFormat_e::XMODEL_EXPORT; return true; } if (specifiedValue == "xmodel_bin") { - ObjWriting::Configuration.ModelOutputFormat = ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_BIN; + ObjWriting::Configuration.ModelOutputFormat = ModelOutputFormat_e::XMODEL_BIN; return true; } if (specifiedValue == "obj") { - ObjWriting::Configuration.ModelOutputFormat = ObjWriting::Configuration_t::ModelOutputFormat_e::OBJ; + ObjWriting::Configuration.ModelOutputFormat = ModelOutputFormat_e::OBJ; return true; } if (specifiedValue == "gltf") { - ObjWriting::Configuration.ModelOutputFormat = ObjWriting::Configuration_t::ModelOutputFormat_e::GLTF; + ObjWriting::Configuration.ModelOutputFormat = ModelOutputFormat_e::GLTF; return true; } if (specifiedValue == "glb") { - ObjWriting::Configuration.ModelOutputFormat = ObjWriting::Configuration_t::ModelOutputFormat_e::GLB; + ObjWriting::Configuration.ModelOutputFormat = ModelOutputFormat_e::GLB; return true; }