chore: use templating for image dumper

This commit is contained in:
Jan Laupetin
2026-05-17 12:07:02 +02:00
parent 18dec9d2f2
commit e6aa66e0f0
16 changed files with 129 additions and 551 deletions
@@ -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 <algorithm>
#include <cassert>
#include <format>
using namespace T5;
using namespace image;
namespace
{
std::unique_ptr<Texture> 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<oat::D3DFORMAT>(loadDef.format));
textureLoader.HasMipMaps(!(loadDef.flags & image::iwi13::IMG_FLAG_NOMIPMAPS));
return textureLoader.LoadTexture(loadDef.data);
}
std::unique_ptr<Texture> 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<Texture> 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<DdsWriter>();
break;
case ImageOutputFormat_e::IWI:
m_writer = std::make_unique<iwi13::IwiWriter>();
break;
default:
assert(false);
m_writer = nullptr;
break;
}
}
void DumperT5::DumpAsset(AssetDumpingContext& context, const XAssetInfo<AssetImage::Type>& 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
@@ -1,22 +0,0 @@
#pragma once
#include "Dumping/AbstractAssetDumper.h"
#include "Game/T5/T5.h"
#include "Image/ImageWriter.h"
#include <memory>
namespace image
{
class DumperT5 final : public AbstractAssetDumper<T5::AssetImage>
{
public:
DumperT5();
protected:
void DumpAsset(AssetDumpingContext& context, const XAssetInfo<T5::AssetImage::Type>& asset) override;
private:
std::unique_ptr<ImageWriter> m_writer;
};
} // namespace image
+1 -1
View File
@@ -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"