From e6aa66e0f070bb77f9251a7340a6dcbeaebcb7cc Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Sun, 17 May 2026 12:07:02 +0200 Subject: [PATCH] chore: use templating for image dumper --- .../Game/IW3/Image/ImageDumperIW3.cpp | 109 ------------------ .../Game/IW3/Image/ImageDumperIW3.h | 22 ---- src/ObjWriting/Game/IW3/ObjWriterIW3.cpp | 2 +- .../Game/IW4/Image/ImageDumperIW4.cpp | 105 ----------------- .../Game/IW4/Image/ImageDumperIW4.h | 22 ---- src/ObjWriting/Game/IW4/ObjWriterIW4.cpp | 2 +- .../Game/IW5/Image/ImageDumperIW5.cpp | 106 ----------------- .../Game/IW5/Image/ImageDumperIW5.h | 22 ---- src/ObjWriting/Game/IW5/ObjWriterIW5.cpp | 2 +- .../Game/T5/Image/ImageDumperT5.cpp | 105 ----------------- src/ObjWriting/Game/T5/Image/ImageDumperT5.h | 22 ---- src/ObjWriting/Game/T5/ObjWriterT5.cpp | 2 +- src/ObjWriting/Game/T6/Image/ImageDumperT6.h | 22 ---- src/ObjWriting/Game/T6/ObjWriterT6.cpp | 2 +- .../ImageDumper.cpp.template} | 101 ++++++++++++++-- src/ObjWriting/Image/ImageDumper.h.template | 34 ++++++ 16 files changed, 129 insertions(+), 551 deletions(-) delete mode 100644 src/ObjWriting/Game/IW3/Image/ImageDumperIW3.cpp delete mode 100644 src/ObjWriting/Game/IW3/Image/ImageDumperIW3.h delete mode 100644 src/ObjWriting/Game/IW4/Image/ImageDumperIW4.cpp delete mode 100644 src/ObjWriting/Game/IW4/Image/ImageDumperIW4.h delete mode 100644 src/ObjWriting/Game/IW5/Image/ImageDumperIW5.cpp delete mode 100644 src/ObjWriting/Game/IW5/Image/ImageDumperIW5.h delete mode 100644 src/ObjWriting/Game/T5/Image/ImageDumperT5.cpp delete mode 100644 src/ObjWriting/Game/T5/Image/ImageDumperT5.h delete mode 100644 src/ObjWriting/Game/T6/Image/ImageDumperT6.h rename src/ObjWriting/{Game/T6/Image/ImageDumperT6.cpp => Image/ImageDumper.cpp.template} (61%) create mode 100644 src/ObjWriting/Image/ImageDumper.h.template diff --git a/src/ObjWriting/Game/IW3/Image/ImageDumperIW3.cpp b/src/ObjWriting/Game/IW3/Image/ImageDumperIW3.cpp deleted file mode 100644 index 0dc6804c..00000000 --- a/src/ObjWriting/Game/IW3/Image/ImageDumperIW3.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "ImageDumperIW3.h" - -#include "Image/DdsWriter.h" -#include "Image/Dx9TextureLoader.h" -#include "Image/ImageCommon.h" -#include "Image/IwiLoader.h" -#include "Image/IwiTypes.h" -#include "Image/IwiWriter6.h" -#include "Image/Texture.h" -#include "ObjWriting.h" -#include "SearchPath/ISearchPath.h" -#include "Utils/Logging/Log.h" - -#include -#include -#include - -using namespace IW3; -using namespace image; - -namespace -{ - std::unique_ptr LoadImageFromLoadDef(const GfxImage& image) - { - Dx9TextureLoader textureLoader; - - const auto& loadDef = *image.texture.loadDef; - textureLoader.Width(loadDef.dimensions[0]).Height(loadDef.dimensions[1]).Depth(loadDef.dimensions[2]); - - if (loadDef.flags & image::iwi6::IMG_FLAG_VOLMAP) - textureLoader.Type(TextureType::T_3D); - else if (loadDef.flags & image::iwi6::IMG_FLAG_CUBEMAP) - textureLoader.Type(TextureType::T_CUBE); - else - textureLoader.Type(TextureType::T_2D); - - textureLoader.Format(static_cast(loadDef.format)); - textureLoader.HasMipMaps(!(loadDef.flags & image::iwi6::IMG_FLAG_NOMIPMAPS)); - return textureLoader.LoadTexture(loadDef.data); - } - - std::unique_ptr LoadImageFromIwi(const GfxImage& image, ISearchPath& searchPath) - { - const auto imageFileName = image::GetFileNameForAsset(image.name, ".iwi"); - const auto filePathImage = searchPath.Open(imageFileName); - if (!filePathImage.IsOpen()) - { - con::error("Could not find data for image \"{}\"", image.name); - return nullptr; - } - - auto loadResult = image::LoadIwi(*filePathImage.m_stream); - return loadResult ? std::move(loadResult->m_texture) : nullptr; - } - - std::unique_ptr LoadImageData(ISearchPath& searchPath, const GfxImage& image) - { - if (image.texture.loadDef && image.texture.loadDef->resourceSize > 0) - return LoadImageFromLoadDef(image); - - return LoadImageFromIwi(image, searchPath); - } -} // namespace - -namespace image -{ - DumperIW3::DumperIW3() - : AbstractAssetDumper() - { - switch (ObjWriting::Configuration.ImageOutputFormat) - { - case ImageOutputFormat_e::DDS: - m_writer = std::make_unique(); - break; - case ImageOutputFormat_e::IWI: - m_writer = std::make_unique(); - break; - default: - assert(false); - m_writer = nullptr; - break; - } - } - - void DumperIW3::DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) - { - const auto* image = asset.Asset(); - const auto texture = LoadImageData(context.m_obj_search_path, *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) - return; - - auto& stream = *assetFile; - m_writer->DumpImage(stream, texture.get()); - } -} // namespace image diff --git a/src/ObjWriting/Game/IW3/Image/ImageDumperIW3.h b/src/ObjWriting/Game/IW3/Image/ImageDumperIW3.h deleted file mode 100644 index 05e0224a..00000000 --- a/src/ObjWriting/Game/IW3/Image/ImageDumperIW3.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "Dumping/AbstractAssetDumper.h" -#include "Game/IW3/IW3.h" -#include "Image/ImageWriter.h" - -#include - -namespace image -{ - class DumperIW3 final : public AbstractAssetDumper - { - public: - DumperIW3(); - - protected: - void DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) override; - - private: - std::unique_ptr m_writer; - }; -} // namespace image diff --git a/src/ObjWriting/Game/IW3/ObjWriterIW3.cpp b/src/ObjWriting/Game/IW3/ObjWriterIW3.cpp index b1dd5eac..6d1d6346 100644 --- a/src/ObjWriting/Game/IW3/ObjWriterIW3.cpp +++ b/src/ObjWriting/Game/IW3/ObjWriterIW3.cpp @@ -1,9 +1,9 @@ #include "ObjWriterIW3.h" +#include "Game/IW3/Image/ImageDumperIW3.h" #include "Game/IW3/Material/MaterialJsonDumperIW3.h" #include "Game/IW3/Techset/TechsetDumperIW3.h" #include "Game/IW3/XModel/XModelDumperIW3.h" -#include "Image/ImageDumperIW3.h" #include "LightDef/LightDefDumperIW3.h" #include "Localize/LocalizeDumperIW3.h" #include "Maps/MapEntsDumperIW3.h" diff --git a/src/ObjWriting/Game/IW4/Image/ImageDumperIW4.cpp b/src/ObjWriting/Game/IW4/Image/ImageDumperIW4.cpp deleted file mode 100644 index 95fd2874..00000000 --- a/src/ObjWriting/Game/IW4/Image/ImageDumperIW4.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "ImageDumperIW4.h" - -#include "Image/DdsWriter.h" -#include "Image/Dx9TextureLoader.h" -#include "Image/ImageCommon.h" -#include "Image/IwiLoader.h" -#include "Image/IwiWriter8.h" -#include "ObjWriting.h" -#include "Utils/Logging/Log.h" - -#include -#include -#include - -using namespace IW4; -using namespace image; - -namespace -{ - std::unique_ptr LoadImageFromLoadDef(const GfxImage& image) - { - Dx9TextureLoader textureLoader; - - const auto& loadDef = *image.texture.loadDef; - textureLoader.Width(image.width).Height(image.height).Depth(image.depth); - - if ((loadDef.flags & image::iwi8::IMG_FLAG_MAPTYPE_MASK) == image::iwi8::IMG_FLAG_MAPTYPE_3D) - textureLoader.Type(TextureType::T_3D); - else if ((loadDef.flags & image::iwi8::IMG_FLAG_MAPTYPE_MASK) == image::iwi8::IMG_FLAG_MAPTYPE_CUBE) - textureLoader.Type(TextureType::T_CUBE); - else - textureLoader.Type(TextureType::T_2D); - - textureLoader.Format(static_cast(loadDef.format)); - textureLoader.HasMipMaps(!(loadDef.flags & image::iwi8::IMG_FLAG_NOMIPMAPS)); - return textureLoader.LoadTexture(loadDef.data); - } - - std::unique_ptr LoadImageFromIwi(const GfxImage& image, ISearchPath& searchPath) - { - const auto imageFileName = image::GetFileNameForAsset(image.name, ".iwi"); - const auto filePathImage = searchPath.Open(imageFileName); - if (!filePathImage.IsOpen()) - { - con::error("Could not find data for image \"{}\"", image.name); - return nullptr; - } - - auto loadResult = image::LoadIwi(*filePathImage.m_stream); - return loadResult ? std::move(loadResult->m_texture) : nullptr; - } - - std::unique_ptr LoadImageData(ISearchPath& searchPath, const GfxImage& image) - { - if (image.texture.loadDef && image.texture.loadDef->resourceSize > 0) - return LoadImageFromLoadDef(image); - - return LoadImageFromIwi(image, searchPath); - } -} // namespace - -namespace image -{ - DumperIW4::DumperIW4() - { - switch (ObjWriting::Configuration.ImageOutputFormat) - { - case ImageOutputFormat_e::DDS: - m_writer = std::make_unique(); - break; - case ImageOutputFormat_e::IWI: - m_writer = std::make_unique(); - break; - default: - assert(false); - m_writer = nullptr; - break; - } - } - - void DumperIW4::DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) - { - const auto* image = asset.Asset(); - const auto texture = LoadImageData(context.m_obj_search_path, *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) - return; - - auto& stream = *assetFile; - m_writer->DumpImage(stream, texture.get()); - } -} // namespace image diff --git a/src/ObjWriting/Game/IW4/Image/ImageDumperIW4.h b/src/ObjWriting/Game/IW4/Image/ImageDumperIW4.h deleted file mode 100644 index eb92d015..00000000 --- a/src/ObjWriting/Game/IW4/Image/ImageDumperIW4.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "Dumping/AbstractAssetDumper.h" -#include "Game/IW4/IW4.h" -#include "Image/ImageWriter.h" - -#include - -namespace image -{ - class DumperIW4 final : public AbstractAssetDumper - { - public: - DumperIW4(); - - protected: - void DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) override; - - private: - std::unique_ptr m_writer; - }; -} // namespace image diff --git a/src/ObjWriting/Game/IW4/ObjWriterIW4.cpp b/src/ObjWriting/Game/IW4/ObjWriterIW4.cpp index 6004d5ea..de74377c 100644 --- a/src/ObjWriting/Game/IW4/ObjWriterIW4.cpp +++ b/src/ObjWriting/Game/IW4/ObjWriterIW4.cpp @@ -1,11 +1,11 @@ #include "ObjWriterIW4.h" +#include "Game/IW4/Image/ImageDumperIW4.h" #include "Game/IW4/Material/MaterialJsonDumperIW4.h" #include "Game/IW4/Techset/PixelShaderDumperIW4.h" #include "Game/IW4/Techset/TechsetDumperIW4.h" #include "Game/IW4/Techset/VertexShaderDumperIW4.h" #include "Game/IW4/XModel/XModelDumperIW4.h" -#include "Image/ImageDumperIW4.h" #include "Leaderboard/LeaderboardJsonDumperIW4.h" #include "LightDef/LightDefDumperIW4.h" #include "Localize/LocalizeDumperIW4.h" diff --git a/src/ObjWriting/Game/IW5/Image/ImageDumperIW5.cpp b/src/ObjWriting/Game/IW5/Image/ImageDumperIW5.cpp deleted file mode 100644 index d5bb5fe6..00000000 --- a/src/ObjWriting/Game/IW5/Image/ImageDumperIW5.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include "ImageDumperIW5.h" - -#include "Image/DdsWriter.h" -#include "Image/Dx9TextureLoader.h" -#include "Image/ImageCommon.h" -#include "Image/IwiLoader.h" -#include "Image/IwiWriter8.h" -#include "ObjWriting.h" -#include "Utils/Logging/Log.h" - -#include -#include -#include - -using namespace IW5; -using namespace image; - -namespace -{ - std::unique_ptr LoadImageFromLoadDef(const GfxImage& image) - { - Dx9TextureLoader textureLoader; - - const auto& loadDef = *image.texture.loadDef; - - textureLoader.Width(image.width).Height(image.height).Depth(image.depth); - - if ((loadDef.flags & image::iwi8::IMG_FLAG_MAPTYPE_MASK) == image::iwi8::IMG_FLAG_MAPTYPE_3D) - textureLoader.Type(TextureType::T_3D); - else if ((loadDef.flags & image::iwi8::IMG_FLAG_MAPTYPE_MASK) == image::iwi8::IMG_FLAG_MAPTYPE_CUBE) - textureLoader.Type(TextureType::T_CUBE); - else - textureLoader.Type(TextureType::T_2D); - - textureLoader.Format(static_cast(loadDef.format)); - textureLoader.HasMipMaps(!(loadDef.flags & image::iwi8::IMG_FLAG_NOMIPMAPS)); - return textureLoader.LoadTexture(loadDef.data); - } - - std::unique_ptr LoadImageFromIwi(const GfxImage& image, ISearchPath& searchPath) - { - const auto imageFileName = image::GetFileNameForAsset(image.name, ".iwi"); - const auto filePathImage = searchPath.Open(imageFileName); - if (!filePathImage.IsOpen()) - { - con::error("Could not find data for image \"{}\"", image.name); - return nullptr; - } - - auto loadResult = image::LoadIwi(*filePathImage.m_stream); - return loadResult ? std::move(loadResult->m_texture) : nullptr; - } - - std::unique_ptr LoadImageData(ISearchPath& searchPath, const GfxImage& image) - { - if (image.texture.loadDef && image.texture.loadDef->resourceSize > 0) - return LoadImageFromLoadDef(image); - - return LoadImageFromIwi(image, searchPath); - } -} // namespace - -namespace image -{ - DumperIW5::DumperIW5() - { - switch (ObjWriting::Configuration.ImageOutputFormat) - { - case ImageOutputFormat_e::DDS: - m_writer = std::make_unique(); - break; - case ImageOutputFormat_e::IWI: - m_writer = std::make_unique(); - break; - default: - assert(false); - m_writer = nullptr; - break; - } - } - - void DumperIW5::DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) - { - const auto* image = asset.Asset(); - const auto texture = LoadImageData(context.m_obj_search_path, *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) - return; - - auto& stream = *assetFile; - m_writer->DumpImage(stream, texture.get()); - } -} // namespace image diff --git a/src/ObjWriting/Game/IW5/Image/ImageDumperIW5.h b/src/ObjWriting/Game/IW5/Image/ImageDumperIW5.h deleted file mode 100644 index 4d481d3f..00000000 --- a/src/ObjWriting/Game/IW5/Image/ImageDumperIW5.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "Dumping/AbstractAssetDumper.h" -#include "Game/IW5/IW5.h" -#include "Image/ImageWriter.h" - -#include - -namespace image -{ - class DumperIW5 final : public AbstractAssetDumper - { - public: - DumperIW5(); - - protected: - void DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) override; - - private: - std::unique_ptr m_writer; - }; -} // namespace image diff --git a/src/ObjWriting/Game/IW5/ObjWriterIW5.cpp b/src/ObjWriting/Game/IW5/ObjWriterIW5.cpp index db308f2f..544b75bb 100644 --- a/src/ObjWriting/Game/IW5/ObjWriterIW5.cpp +++ b/src/ObjWriting/Game/IW5/ObjWriterIW5.cpp @@ -1,11 +1,11 @@ #include "ObjWriterIW5.h" +#include "Game/IW5/Image/ImageDumperIW5.h" #include "Game/IW5/Material/MaterialJsonDumperIW5.h" #include "Game/IW5/Techset/PixelShaderDumperIW5.h" #include "Game/IW5/Techset/TechsetDumperIW5.h" #include "Game/IW5/Techset/VertexShaderDumperIW5.h" #include "Game/IW5/XModel/XModelDumperIW5.h" -#include "Image/ImageDumperIW5.h" #include "Leaderboard/LeaderboardJsonDumperIW5.h" #include "LightDef/LightDefDumperIW5.h" #include "Localize/LocalizeDumperIW5.h" diff --git a/src/ObjWriting/Game/T5/Image/ImageDumperT5.cpp b/src/ObjWriting/Game/T5/Image/ImageDumperT5.cpp deleted file mode 100644 index 6f419868..00000000 --- a/src/ObjWriting/Game/T5/Image/ImageDumperT5.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "ImageDumperT5.h" - -#include "Image/DdsWriter.h" -#include "Image/Dx9TextureLoader.h" -#include "Image/ImageCommon.h" -#include "Image/IwiLoader.h" -#include "Image/IwiWriter13.h" -#include "ObjWriting.h" -#include "Utils/Logging/Log.h" - -#include -#include -#include - -using namespace T5; -using namespace image; - -namespace -{ - std::unique_ptr LoadImageFromLoadDef(const GfxImage& image) - { - Dx9TextureLoader textureLoader; - - const auto& loadDef = *image.texture.loadDef; - textureLoader.Width(image.width).Height(image.height).Depth(image.depth); - - if (loadDef.flags & image::iwi13::IMG_FLAG_VOLMAP) - textureLoader.Type(TextureType::T_3D); - else if (loadDef.flags & image::iwi13::IMG_FLAG_CUBEMAP) - textureLoader.Type(TextureType::T_CUBE); - else - textureLoader.Type(TextureType::T_2D); - - textureLoader.Format(static_cast(loadDef.format)); - textureLoader.HasMipMaps(!(loadDef.flags & image::iwi13::IMG_FLAG_NOMIPMAPS)); - return textureLoader.LoadTexture(loadDef.data); - } - - std::unique_ptr LoadImageFromIwi(const GfxImage& image, ISearchPath& searchPath) - { - const auto imageFileName = image::GetFileNameForAsset(image.name, ".iwi"); - const auto filePathImage = searchPath.Open(imageFileName); - if (!filePathImage.IsOpen()) - { - con::error("Could not find data for image \"{}\"", image.name); - return nullptr; - } - - auto loadResult = image::LoadIwi(*filePathImage.m_stream); - return loadResult ? std::move(loadResult->m_texture) : nullptr; - } - - std::unique_ptr LoadImageData(ISearchPath& searchPath, const GfxImage& image) - { - if (image.texture.loadDef && image.texture.loadDef->resourceSize > 0) - return LoadImageFromLoadDef(image); - - return LoadImageFromIwi(image, searchPath); - } -} // namespace - -namespace image -{ - DumperT5::DumperT5() - { - switch (ObjWriting::Configuration.ImageOutputFormat) - { - case ImageOutputFormat_e::DDS: - m_writer = std::make_unique(); - break; - case ImageOutputFormat_e::IWI: - m_writer = std::make_unique(); - break; - default: - assert(false); - m_writer = nullptr; - break; - } - } - - void DumperT5::DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) - { - const auto* image = asset.Asset(); - const auto texture = LoadImageData(context.m_obj_search_path, *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) - return; - - auto& stream = *assetFile; - m_writer->DumpImage(stream, texture.get()); - } -} // namespace image diff --git a/src/ObjWriting/Game/T5/Image/ImageDumperT5.h b/src/ObjWriting/Game/T5/Image/ImageDumperT5.h deleted file mode 100644 index 6f8e2d65..00000000 --- a/src/ObjWriting/Game/T5/Image/ImageDumperT5.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "Dumping/AbstractAssetDumper.h" -#include "Game/T5/T5.h" -#include "Image/ImageWriter.h" - -#include - -namespace image -{ - class DumperT5 final : public AbstractAssetDumper - { - public: - DumperT5(); - - protected: - void DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) override; - - private: - std::unique_ptr m_writer; - }; -} // namespace image diff --git a/src/ObjWriting/Game/T5/ObjWriterT5.cpp b/src/ObjWriting/Game/T5/ObjWriterT5.cpp index 9250df8a..b0d348dc 100644 --- a/src/ObjWriting/Game/T5/ObjWriterT5.cpp +++ b/src/ObjWriting/Game/T5/ObjWriterT5.cpp @@ -1,9 +1,9 @@ #include "ObjWriterT5.h" +#include "Game/T5/Image/ImageDumperT5.h" #include "Game/T5/Material/MaterialJsonDumperT5.h" #include "Game/T5/Techset/TechsetDumperT5.h" #include "Game/T5/XModel/XModelDumperT5.h" -#include "Image/ImageDumperT5.h" #include "LightDef/LightDefDumperT5.h" #include "Localize/LocalizeDumperT5.h" #include "PhysPreset/PhysPresetInfoStringDumperT5.h" diff --git a/src/ObjWriting/Game/T6/Image/ImageDumperT6.h b/src/ObjWriting/Game/T6/Image/ImageDumperT6.h deleted file mode 100644 index 683658c5..00000000 --- a/src/ObjWriting/Game/T6/Image/ImageDumperT6.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "Dumping/AbstractAssetDumper.h" -#include "Game/T6/T6.h" -#include "Image/ImageWriter.h" - -#include - -namespace image -{ - class DumperT6 final : public AbstractAssetDumper - { - public: - DumperT6(); - - protected: - void DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) override; - - private: - std::unique_ptr m_writer; - }; -} // namespace image diff --git a/src/ObjWriting/Game/T6/ObjWriterT6.cpp b/src/ObjWriting/Game/T6/ObjWriterT6.cpp index aa3cb9b1..f99ef780 100644 --- a/src/ObjWriting/Game/T6/ObjWriterT6.cpp +++ b/src/ObjWriting/Game/T6/ObjWriterT6.cpp @@ -1,10 +1,10 @@ #include "ObjWriterT6.h" #include "FontIcon/FontIconDumperT6.h" +#include "Game/T6/Image/ImageDumperT6.h" #include "Game/T6/Material/MaterialJsonDumperT6.h" #include "Game/T6/Techset/TechsetDumperT6.h" #include "Game/T6/XModel/XModelDumperT6.h" -#include "Image/ImageDumperT6.h" #include "Leaderboard/LeaderboardJsonDumperT6.h" #include "LightDef/LightDefDumperT6.h" #include "Localize/LocalizeDumperT6.h" diff --git a/src/ObjWriting/Game/T6/Image/ImageDumperT6.cpp b/src/ObjWriting/Image/ImageDumper.cpp.template similarity index 61% rename from src/ObjWriting/Game/T6/Image/ImageDumperT6.cpp rename to src/ObjWriting/Image/ImageDumper.cpp.template index b107dfbb..5fbaf830 100644 --- a/src/ObjWriting/Game/T6/Image/ImageDumperT6.cpp +++ b/src/ObjWriting/Image/ImageDumper.cpp.template @@ -1,11 +1,64 @@ -#include "ImageDumperT6.h" +#options GAME (IW3, IW4, IW5, T5, T6) + +#filename "Game/" + GAME + "/Image/ImageDumper" + GAME + ".cpp" + +#set DUMPER_HEADER "\"ImageDumper" + GAME + ".h\"" + +#if GAME == "IW3" +#define FEATURE_IW3 +#define DX9 +#define IWI6 +#elif GAME == "IW4" +#define FEATURE_IW4 +#define DX9 +#define IWI8 +#elif GAME == "IW5" +#define FEATURE_IW5 +#define DX9 +#define IWI8 +#elif GAME == "T5" +#define FEATURE_T5 +#define DX9 +#define IWI13 +#elif GAME == "T6" +#define FEATURE_T6 +#define DX11 +#define IWI27 +#endif + +// This file was templated. +// See ImageDumper.cpp.template. +// Do not modify, changes will be lost. + +#include DUMPER_HEADER + +#ifdef DX9 +#include "Image/Dx9TextureLoader.h" +#else +#include "Image/Dx12TextureLoader.h" +#endif + +#ifdef FEATURE_T6 +#include "ObjContainer/IPak/IPak.h" +#endif + +#if defined(IWI6) +#include "Image/IwiWriter6.h" +#define IWI_NS iwi6 +#elif defined(IWI8) +#include "Image/IwiWriter8.h" +#define IWI_NS iwi8 +#elif defined(IWI13) +#include "Image/IwiWriter13.h" +#define IWI_NS iwi13 +#elif defined(IWI27) +#include "Image/IwiWriter27.h" +#define IWI_NS iwi27 +#endif #include "Image/DdsWriter.h" -#include "Image/Dx12TextureLoader.h" #include "Image/ImageCommon.h" #include "Image/IwiLoader.h" -#include "Image/IwiWriter27.h" -#include "ObjContainer/IPak/IPak.h" #include "ObjWriting.h" #include "Utils/Logging/Log.h" @@ -13,32 +66,55 @@ #include #include -using namespace T6; +using namespace GAME; using namespace image; namespace { std::unique_ptr LoadImageFromLoadDef(const GfxImage& image) { +#ifdef DX9 + Dx9TextureLoader textureLoader; +#else Dx12TextureLoader textureLoader; +#endif const auto& loadDef = *image.texture.loadDef; +#ifdef FEATURE_IW3 + textureLoader.Width(loadDef.dimensions[0]).Height(loadDef.dimensions[1]).Depth(loadDef.dimensions[2]); +#else textureLoader.Width(image.width).Height(image.height).Depth(image.depth); +#endif - if (loadDef.flags & image::iwi27::IMG_FLAG_VOLMAP) +#if defined(IWI8) + if ((loadDef.flags & image::IWI_NS::IMG_FLAG_MAPTYPE_MASK) == image::IWI_NS::IMG_FLAG_MAPTYPE_3D) textureLoader.Type(TextureType::T_3D); - else if (loadDef.flags & image::iwi27::IMG_FLAG_CUBEMAP) + else if ((loadDef.flags & image::IWI_NS::IMG_FLAG_MAPTYPE_MASK) == image::IWI_NS::IMG_FLAG_MAPTYPE_CUBE) textureLoader.Type(TextureType::T_CUBE); else textureLoader.Type(TextureType::T_2D); +#else + if (loadDef.flags & image::IWI_NS::IMG_FLAG_VOLMAP) + textureLoader.Type(TextureType::T_3D); + else if (loadDef.flags & image::IWI_NS::IMG_FLAG_CUBEMAP) + textureLoader.Type(TextureType::T_CUBE); + else + textureLoader.Type(TextureType::T_2D); +#endif +#ifdef DX9 + textureLoader.Format(static_cast(loadDef.format)); +#else textureLoader.Format(static_cast(loadDef.format)); - textureLoader.HasMipMaps(!(loadDef.flags & image::iwi27::IMG_FLAG_NOMIPMAPS)); +#endif + textureLoader.HasMipMaps(!(loadDef.flags & image::IWI_NS::IMG_FLAG_NOMIPMAPS)); + return textureLoader.LoadTexture(loadDef.data); } std::unique_ptr LoadImageFromIwi(const GfxImage& image, ISearchPath& searchPath) { +#ifdef FEATURE_T6 if (image.streamedPartCount > 0) { for (auto* ipak : IIPak::Repository) @@ -55,6 +131,7 @@ namespace } } } +#endif const auto imageFileName = image::GetFileNameForAsset(image.name, ".iwi"); const auto filePathImage = searchPath.Open(imageFileName); @@ -77,9 +154,11 @@ namespace } } // namespace +#set CLASS_NAME "Dumper" + GAME + namespace image { - DumperT6::DumperT6() + CLASS_NAME::CLASS_NAME() { switch (ObjWriting::Configuration.ImageOutputFormat) { @@ -87,7 +166,7 @@ namespace image m_writer = std::make_unique(); break; case ImageOutputFormat_e::IWI: - m_writer = std::make_unique(); + m_writer = std::make_unique(); break; default: assert(false); @@ -96,7 +175,7 @@ namespace image } } - void DumperT6::DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) + void CLASS_NAME::DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) { const auto* image = asset.Asset(); const auto texture = LoadImageData(context.m_obj_search_path, *image); diff --git a/src/ObjWriting/Image/ImageDumper.h.template b/src/ObjWriting/Image/ImageDumper.h.template new file mode 100644 index 00000000..1b8d14a3 --- /dev/null +++ b/src/ObjWriting/Image/ImageDumper.h.template @@ -0,0 +1,34 @@ +#options GAME(IW3, IW4, IW5, T5, T6) + +#filename "Game/" + GAME + "/Image/ImageDumper" + GAME + ".h" + +#set GAME_HEADER "\"Game/" + GAME + "/" + GAME + ".h\"" + +// This file was templated. +// See ImageDumper.h.template. +// Do not modify, changes will be lost. + +#pragma once + +#include "Dumping/AbstractAssetDumper.h" +#include GAME_HEADER +#include "Image/ImageWriter.h" + +#include + +#set CLASS_NAME "Dumper" + GAME + +namespace image +{ + class CLASS_NAME final : public AbstractAssetDumper + { + public: + CLASS_NAME(); + + protected: + void DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) override; + + private: + std::unique_ptr m_writer; + }; +} // namespace image