chore: consider specified obj containers when post processing

This commit is contained in:
Jan 2025-01-02 16:26:42 +01:00
parent a7254aa11c
commit fe5d0f79ff
No known key found for this signature in database
GPG Key ID: 44B581F78FF5C57C
21 changed files with 296 additions and 53 deletions

View File

@ -64,8 +64,9 @@ namespace zone_creator
const auto* objLoader = IObjLoader::GetObjLoaderForGame(gameId); const auto* objLoader = IObjLoader::GetObjLoaderForGame(gameId);
AssetCreatorCollection creatorCollection(*zone); AssetCreatorCollection creatorCollection(*zone);
ZoneDefinitionContext zoneDefinitionContext(*context.m_definition);
objCompiler->ConfigureCreatorCollection( objCompiler->ConfigureCreatorCollection(
creatorCollection, *zone, *context.m_definition, *context.m_asset_search_path, lookup, context.m_out_dir, context.m_cache_dir); creatorCollection, *zone, zoneDefinitionContext, *context.m_asset_search_path, lookup, context.m_out_dir, context.m_cache_dir);
objLoader->ConfigureCreatorCollection(creatorCollection, *zone, *context.m_asset_search_path, lookup); objLoader->ConfigureCreatorCollection(creatorCollection, *zone, *context.m_asset_search_path, lookup);
AssetCreationContext creationContext(zone.get(), &creatorCollection, &ignoredAssetLookup); AssetCreationContext creationContext(zone.get(), &creatorCollection, &ignoredAssetLookup);
@ -76,6 +77,8 @@ namespace zone_creator
if (!createdAsset) if (!createdAsset)
return nullptr; return nullptr;
++zoneDefinitionContext.m_asset_index_in_definition;
} }
creatorCollection.FinalizeZone(creationContext); creatorCollection.FinalizeZone(creationContext);

View File

@ -17,21 +17,23 @@ namespace
// No compilers yet // No compilers yet
} }
void ConfigurePostProcessors(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath, const fs::path& outDir) void ConfigurePostProcessors(
AssetCreatorCollection& collection, Zone& zone, const ZoneDefinitionContext& zoneDefinition, ISearchPath& searchPath, const fs::path& outDir)
{ {
auto& memory = *zone.GetMemory(); auto& memory = *zone.GetMemory();
collection.AddAssetPostProcessor(std::make_unique<ImageIwdPostProcessor<AssetImage>>(searchPath, outDir)); if (ImageIwdPostProcessor<AssetImage>::AppliesToZoneDefinition(zoneDefinition))
collection.AddAssetPostProcessor(std::make_unique<ImageIwdPostProcessor<AssetImage>>(zoneDefinition, searchPath, outDir));
} }
} // namespace } // namespace
void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection, void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const fs::path& outDir, const fs::path& outDir,
const fs::path& cacheDir) const const fs::path& cacheDir) const
{ {
ConfigurePostProcessors(collection, zone, searchPath, outDir); ConfigurePostProcessors(collection, zone, zoneDefinition, searchPath, outDir);
} }

View File

@ -9,7 +9,7 @@ namespace IW3
public: public:
void ConfigureCreatorCollection(AssetCreatorCollection& collection, void ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const std::filesystem::path& outDir, const std::filesystem::path& outDir,

View File

@ -17,21 +17,23 @@ namespace
// No compilers yet // No compilers yet
} }
void ConfigurePostProcessors(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath, const fs::path& outDir) void ConfigurePostProcessors(
AssetCreatorCollection& collection, Zone& zone, const ZoneDefinitionContext& zoneDefinition, ISearchPath& searchPath, const fs::path& outDir)
{ {
auto& memory = *zone.GetMemory(); auto& memory = *zone.GetMemory();
collection.AddAssetPostProcessor(std::make_unique<ImageIwdPostProcessor<AssetImage>>(searchPath, outDir)); if (ImageIwdPostProcessor<AssetImage>::AppliesToZoneDefinition(zoneDefinition))
collection.AddAssetPostProcessor(std::make_unique<ImageIwdPostProcessor<AssetImage>>(zoneDefinition, searchPath, outDir));
} }
} // namespace } // namespace
void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection, void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const fs::path& outDir, const fs::path& outDir,
const fs::path& cacheDir) const const fs::path& cacheDir) const
{ {
ConfigurePostProcessors(collection, zone, searchPath, outDir); ConfigurePostProcessors(collection, zone, zoneDefinition, searchPath, outDir);
} }

View File

@ -9,7 +9,7 @@ namespace IW4
public: public:
void ConfigureCreatorCollection(AssetCreatorCollection& collection, void ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const std::filesystem::path& outDir, const std::filesystem::path& outDir,

View File

@ -17,21 +17,23 @@ namespace
// No compilers yet // No compilers yet
} }
void ConfigurePostProcessors(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath, const fs::path& outDir) void ConfigurePostProcessors(
AssetCreatorCollection& collection, Zone& zone, const ZoneDefinitionContext& zoneDefinition, ISearchPath& searchPath, const fs::path& outDir)
{ {
auto& memory = *zone.GetMemory(); auto& memory = *zone.GetMemory();
collection.AddAssetPostProcessor(std::make_unique<ImageIwdPostProcessor<AssetImage>>(searchPath, outDir)); if (ImageIwdPostProcessor<AssetImage>::AppliesToZoneDefinition(zoneDefinition))
collection.AddAssetPostProcessor(std::make_unique<ImageIwdPostProcessor<AssetImage>>(zoneDefinition, searchPath, outDir));
} }
} // namespace } // namespace
void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection, void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const fs::path& outDir, const fs::path& outDir,
const fs::path& cacheDir) const const fs::path& cacheDir) const
{ {
ConfigurePostProcessors(collection, zone, searchPath, outDir); ConfigurePostProcessors(collection, zone, zoneDefinition, searchPath, outDir);
} }

View File

@ -9,7 +9,7 @@ namespace IW5
public: public:
void ConfigureCreatorCollection(AssetCreatorCollection& collection, void ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const std::filesystem::path& outDir, const std::filesystem::path& outDir,

View File

@ -17,21 +17,23 @@ namespace
// No compilers yet // No compilers yet
} }
void ConfigurePostProcessors(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath, const fs::path& outDir) void ConfigurePostProcessors(
AssetCreatorCollection& collection, Zone& zone, const ZoneDefinitionContext& zoneDefinition, ISearchPath& searchPath, const fs::path& outDir)
{ {
auto& memory = *zone.GetMemory(); auto& memory = *zone.GetMemory();
collection.AddAssetPostProcessor(std::make_unique<ImageIwdPostProcessor<AssetImage>>(searchPath, outDir)); if (ImageIwdPostProcessor<AssetImage>::AppliesToZoneDefinition(zoneDefinition))
collection.AddAssetPostProcessor(std::make_unique<ImageIwdPostProcessor<AssetImage>>(zoneDefinition, searchPath, outDir));
} }
} // namespace } // namespace
void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection, void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const fs::path& outDir, const fs::path& outDir,
const fs::path& cacheDir) const const fs::path& cacheDir) const
{ {
ConfigurePostProcessors(collection, zone, searchPath, outDir); ConfigurePostProcessors(collection, zone, zoneDefinition, searchPath, outDir);
} }

View File

@ -9,7 +9,7 @@ namespace T5
public: public:
void ConfigureCreatorCollection(AssetCreatorCollection& collection, void ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const std::filesystem::path& outDir, const std::filesystem::path& outDir,

View File

@ -1,6 +1,7 @@
#include "ObjCompilerT6.h" #include "ObjCompilerT6.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
#include "Image/ImageIPakPostProcessor.h"
#include "Image/ImageIwdPostProcessor.h" #include "Image/ImageIwdPostProcessor.h"
#include <memory> #include <memory>
@ -17,21 +18,26 @@ namespace
// No compilers yet // No compilers yet
} }
void ConfigurePostProcessors(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath, const fs::path& outDir) void ConfigurePostProcessors(
AssetCreatorCollection& collection, Zone& zone, const ZoneDefinitionContext& zoneDefinition, ISearchPath& searchPath, const fs::path& outDir)
{ {
auto& memory = *zone.GetMemory(); auto& memory = *zone.GetMemory();
collection.AddAssetPostProcessor(std::make_unique<ImageIwdPostProcessor<AssetImage>>(searchPath, outDir)); if (ImageIPakPostProcessor<AssetImage>::AppliesToZoneDefinition(zoneDefinition))
collection.AddAssetPostProcessor(std::make_unique<ImageIPakPostProcessor<AssetImage>>(zoneDefinition, searchPath, outDir));
if (ImageIwdPostProcessor<AssetImage>::AppliesToZoneDefinition(zoneDefinition))
collection.AddAssetPostProcessor(std::make_unique<ImageIwdPostProcessor<AssetImage>>(zoneDefinition, searchPath, outDir));
} }
} // namespace } // namespace
void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection, void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const fs::path& outDir, const fs::path& outDir,
const fs::path& cacheDir) const const fs::path& cacheDir) const
{ {
ConfigurePostProcessors(collection, zone, searchPath, outDir); ConfigurePostProcessors(collection, zone, zoneDefinition, searchPath, outDir);
} }

View File

@ -9,7 +9,7 @@ namespace T6
public: public:
void ConfigureCreatorCollection(AssetCreatorCollection& collection, void ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const std::filesystem::path& outDir, const std::filesystem::path& outDir,

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "Asset/AssetCreatorCollection.h" #include "Asset/AssetCreatorCollection.h"
#include "Asset/ZoneDefinitionContext.h"
#include "Gdt/IGdtQueryable.h" #include "Gdt/IGdtQueryable.h"
#include "SearchPath/ISearchPath.h" #include "SearchPath/ISearchPath.h"
#include "Zone/Definition/ZoneDefinition.h" #include "Zone/Definition/ZoneDefinition.h"
@ -22,7 +23,7 @@ public:
virtual void ConfigureCreatorCollection(AssetCreatorCollection& collection, virtual void ConfigureCreatorCollection(AssetCreatorCollection& collection,
Zone& zone, Zone& zone,
const ZoneDefinition& zoneDefinition, const ZoneDefinitionContext& zoneDefinition,
ISearchPath& searchPath, ISearchPath& searchPath,
IGdtQueryable& gdt, IGdtQueryable& gdt,
const std::filesystem::path& outDir, const std::filesystem::path& outDir,

View File

@ -3,15 +3,39 @@
#include <format> #include <format>
#include <iostream> #include <iostream>
void IPakCreator::AddImage(std::string imageName) IPakToCreate::IPakToCreate(std::string name)
: m_name(std::move(name))
{
}
void IPakToCreate::AddImage(std::string imageName)
{ {
m_image_names.emplace_back(std::move(imageName)); m_image_names.emplace_back(std::move(imageName));
} }
void IPakCreator::Finalize(ISearchPath& searchPath, const std::filesystem::path& outPath) void IPakToCreate::Build(ISearchPath& searchPath, const std::filesystem::path& outPath)
{ {
std::cout << std::format("Creating ipak with {} entries:\n", m_image_names.size()); std::cout << std::format("Creating ipak {} with {} entries:\n", m_name, m_image_names.size());
for (const auto& imageName : m_image_names) for (const auto& imageName : m_image_names)
std::cout << std::format(" {}\n", imageName); std::cout << std::format(" {}\n", imageName);
} }
IPakToCreate* IPakCreator::GetOrAddIPak(const std::string& ipakName)
{
const auto existingIPak = m_ipak_lookup.find(ipakName);
if (existingIPak != m_ipak_lookup.end())
return existingIPak->second;
auto newIPak = std::make_unique<IPakToCreate>(ipakName);
auto* result = newIPak.get();
m_ipaks.emplace_back(std::move(newIPak));
return result;
}
void IPakCreator::Finalize(ISearchPath& searchPath, const std::filesystem::path& outPath)
{
for (const auto& ipakToCreate : m_ipaks)
ipakToCreate->Build(searchPath, outPath);
}

View File

@ -4,13 +4,30 @@
#include "SearchPath/ISearchPath.h" #include "SearchPath/ISearchPath.h"
#include <filesystem> #include <filesystem>
#include <memory>
#include <string>
#include <unordered_map>
class IPakToCreate
{
public:
explicit IPakToCreate(std::string name);
void AddImage(std::string imageName);
void Build(ISearchPath& searchPath, const std::filesystem::path& outPath);
private:
std::string m_name;
std::vector<std::string> m_image_names;
};
class IPakCreator : public IZoneAssetLoaderState class IPakCreator : public IZoneAssetLoaderState
{ {
public: public:
void AddImage(std::string imageName); IPakToCreate* GetOrAddIPak(const std::string& ipakName);
void Finalize(ISearchPath& searchPath, const std::filesystem::path& outPath); void Finalize(ISearchPath& searchPath, const std::filesystem::path& outPath);
private: private:
std::vector<std::string> m_image_names; std::unordered_map<std::string, IPakToCreate*> m_ipak_lookup;
std::vector<std::unique_ptr<IPakToCreate>> m_ipaks;
}; };

View File

@ -4,19 +4,68 @@
#include <format> #include <format>
AbstractImageIPakPostProcessor::AbstractImageIPakPostProcessor(ISearchPath& searchPath, const std::filesystem::path& outDir) AbstractImageIPakPostProcessor::AbstractImageIPakPostProcessor(const ZoneDefinitionContext& zoneDefinition,
: m_search_path(searchPath), ISearchPath& searchPath,
m_out_dir(outDir) const std::filesystem::path& outDir)
: m_zone_definition(zoneDefinition),
m_search_path(searchPath),
m_out_dir(outDir),
m_initialized(false),
m_obj_container_index(0u),
m_current_ipak(nullptr),
m_current_ipak_start_index(0u),
m_current_ipak_end_index(0u)
{ {
} }
bool AbstractImageIPakPostProcessor::AppliesToZoneDefinition(const ZoneDefinitionContext& zoneDefinition)
{
for (const auto& objContainer : zoneDefinition.m_zone_definition.m_obj_containers)
{
if (objContainer.m_type == ZoneDefinitionObjContainerType::IPAK)
return true;
}
return false;
}
void AbstractImageIPakPostProcessor::FindNextObjContainer(AssetCreationContext& context)
{
const auto objContainerCount = m_zone_definition.m_zone_definition.m_obj_containers.size();
while (m_obj_container_index < objContainerCount)
{
const auto& objContainer = m_zone_definition.m_zone_definition.m_obj_containers[m_obj_container_index++];
if (objContainer.m_type != ZoneDefinitionObjContainerType::IPAK)
continue;
auto* ipakCreator = context.GetZoneAssetLoaderState<IPakCreator>();
m_current_ipak = ipakCreator->GetOrAddIPak(objContainer.m_name);
m_current_ipak_start_index = objContainer.m_asset_start;
m_current_ipak_end_index = objContainer.m_asset_end;
return;
}
m_current_ipak = nullptr;
}
void AbstractImageIPakPostProcessor::PostProcessAsset(XAssetInfoGeneric& assetInfo, AssetCreationContext& context) void AbstractImageIPakPostProcessor::PostProcessAsset(XAssetInfoGeneric& assetInfo, AssetCreationContext& context)
{ {
if (assetInfo.m_name.empty() || assetInfo.m_name[0] == ',') if (assetInfo.m_name.empty() || assetInfo.m_name[0] == ',')
return; return;
auto* ipakCreator = context.GetZoneAssetLoaderState<IPakCreator>(); // Initialize on first image occurance
ipakCreator->AddImage(assetInfo.m_name); if (!m_initialized)
{
FindNextObjContainer(context);
m_initialized = true;
}
while (m_current_ipak && m_zone_definition.m_asset_index_in_definition >= m_current_ipak_end_index)
FindNextObjContainer(context);
if (m_current_ipak && m_zone_definition.m_asset_index_in_definition <= m_current_ipak_start_index)
m_current_ipak->AddImage(assetInfo.m_name);
} }
void AbstractImageIPakPostProcessor::FinalizeZone(AssetCreationContext& context) void AbstractImageIPakPostProcessor::FinalizeZone(AssetCreationContext& context)

View File

@ -1,20 +1,33 @@
#pragma once #pragma once
#include "Asset/IAssetPostProcessor.h" #include "Asset/IAssetPostProcessor.h"
#include "Asset/ZoneDefinitionContext.h"
#include "Image/IPak/IPakCreator.h"
#include <filesystem> #include <filesystem>
class AbstractImageIPakPostProcessor : public IAssetPostProcessor class AbstractImageIPakPostProcessor : public IAssetPostProcessor
{ {
public: public:
AbstractImageIPakPostProcessor(ISearchPath& searchPath, const std::filesystem::path& outDir); AbstractImageIPakPostProcessor(const ZoneDefinitionContext& zoneDefinition, ISearchPath& searchPath, const std::filesystem::path& outDir);
static bool AppliesToZoneDefinition(const ZoneDefinitionContext& zoneDefinition);
void PostProcessAsset(XAssetInfoGeneric& assetInfo, AssetCreationContext& context) override; void PostProcessAsset(XAssetInfoGeneric& assetInfo, AssetCreationContext& context) override;
void FinalizeZone(AssetCreationContext& context) override; void FinalizeZone(AssetCreationContext& context) override;
private: private:
void FindNextObjContainer(AssetCreationContext& context);
const ZoneDefinitionContext& m_zone_definition;
ISearchPath& m_search_path; ISearchPath& m_search_path;
const std::filesystem::path& m_out_dir; const std::filesystem::path& m_out_dir;
bool m_initialized;
unsigned m_obj_container_index;
IPakToCreate* m_current_ipak;
unsigned m_current_ipak_start_index;
unsigned m_current_ipak_end_index;
}; };
template<typename AssetType> class ImageIPakPostProcessor final : public AbstractImageIPakPostProcessor template<typename AssetType> class ImageIPakPostProcessor final : public AbstractImageIPakPostProcessor
@ -22,8 +35,8 @@ template<typename AssetType> class ImageIPakPostProcessor final : public Abstrac
public: public:
static_assert(std::is_base_of_v<IAssetBase, AssetType>); static_assert(std::is_base_of_v<IAssetBase, AssetType>);
ImageIPakPostProcessor(ISearchPath& searchPath, const std::filesystem::path& outDir) ImageIPakPostProcessor(const ZoneDefinitionContext& zoneDefinition, ISearchPath& searchPath, const std::filesystem::path& outDir)
: AbstractImageIPakPostProcessor(searchPath, outDir) : AbstractImageIPakPostProcessor(zoneDefinition, searchPath, outDir)
{ {
} }

View File

@ -3,20 +3,70 @@
#include "Iwd/IwdCreator.h" #include "Iwd/IwdCreator.h"
#include <format> #include <format>
#include <iostream>
AbstractImageIwdPostProcessor::AbstractImageIwdPostProcessor(ISearchPath& searchPath, const std::filesystem::path& outDir) AbstractImageIwdPostProcessor::AbstractImageIwdPostProcessor(const ZoneDefinitionContext& zoneDefinition,
: m_search_path(searchPath), ISearchPath& searchPath,
m_out_dir(outDir) const std::filesystem::path& outDir)
: m_zone_definition(zoneDefinition),
m_search_path(searchPath),
m_out_dir(outDir),
m_initialized(false),
m_obj_container_index(0u),
m_current_iwd(nullptr),
m_current_iwd_start_index(0u),
m_current_iwd_end_index(0u)
{ {
} }
bool AbstractImageIwdPostProcessor::AppliesToZoneDefinition(const ZoneDefinitionContext& zoneDefinition)
{
for (const auto& objContainer : zoneDefinition.m_zone_definition.m_obj_containers)
{
if (objContainer.m_type == ZoneDefinitionObjContainerType::IWD)
return true;
}
return false;
}
void AbstractImageIwdPostProcessor::FindNextObjContainer(AssetCreationContext& context)
{
const auto objContainerCount = m_zone_definition.m_zone_definition.m_obj_containers.size();
while (m_obj_container_index < objContainerCount)
{
const auto& objContainer = m_zone_definition.m_zone_definition.m_obj_containers[m_obj_container_index++];
if (objContainer.m_type != ZoneDefinitionObjContainerType::IWD)
continue;
auto* iwdCreator = context.GetZoneAssetLoaderState<IwdCreator>();
m_current_iwd = iwdCreator->GetOrAddIwd(objContainer.m_name);
m_current_iwd_start_index = objContainer.m_asset_start;
m_current_iwd_end_index = objContainer.m_asset_end;
return;
}
m_current_iwd = nullptr;
}
void AbstractImageIwdPostProcessor::PostProcessAsset(XAssetInfoGeneric& assetInfo, AssetCreationContext& context) void AbstractImageIwdPostProcessor::PostProcessAsset(XAssetInfoGeneric& assetInfo, AssetCreationContext& context)
{ {
if (assetInfo.m_name.empty() || assetInfo.m_name[0] == ',') if (assetInfo.m_name.empty() || assetInfo.m_name[0] == ',')
return; return;
auto* iwdCreator = context.GetZoneAssetLoaderState<IwdCreator>(); // Initialize on first image occurance
iwdCreator->AddFile(std::format("images/{}.iwi", assetInfo.m_name)); if (!m_initialized)
{
FindNextObjContainer(context);
m_initialized = true;
}
while (m_current_iwd && m_zone_definition.m_asset_index_in_definition >= m_current_iwd_end_index)
FindNextObjContainer(context);
if (m_current_iwd && m_zone_definition.m_asset_index_in_definition <= m_current_iwd_start_index)
m_current_iwd->AddFile(std::format("images/{}.iwi", assetInfo.m_name));
} }
void AbstractImageIwdPostProcessor::FinalizeZone(AssetCreationContext& context) void AbstractImageIwdPostProcessor::FinalizeZone(AssetCreationContext& context)

View File

@ -1,20 +1,33 @@
#pragma once #pragma once
#include "Asset/IAssetPostProcessor.h" #include "Asset/IAssetPostProcessor.h"
#include "Asset/ZoneDefinitionContext.h"
#include "Iwd/IwdCreator.h"
#include <filesystem> #include <filesystem>
class AbstractImageIwdPostProcessor : public IAssetPostProcessor class AbstractImageIwdPostProcessor : public IAssetPostProcessor
{ {
public: public:
AbstractImageIwdPostProcessor(ISearchPath& searchPath, const std::filesystem::path& outDir); AbstractImageIwdPostProcessor(const ZoneDefinitionContext& zoneDefinition, ISearchPath& searchPath, const std::filesystem::path& outDir);
static bool AppliesToZoneDefinition(const ZoneDefinitionContext& zoneDefinition);
void PostProcessAsset(XAssetInfoGeneric& assetInfo, AssetCreationContext& context) override; void PostProcessAsset(XAssetInfoGeneric& assetInfo, AssetCreationContext& context) override;
void FinalizeZone(AssetCreationContext& context) override; void FinalizeZone(AssetCreationContext& context) override;
private: private:
void FindNextObjContainer(AssetCreationContext& context);
const ZoneDefinitionContext& m_zone_definition;
ISearchPath& m_search_path; ISearchPath& m_search_path;
const std::filesystem::path& m_out_dir; const std::filesystem::path& m_out_dir;
bool m_initialized;
unsigned m_obj_container_index;
IwdToCreate* m_current_iwd;
unsigned m_current_iwd_start_index;
unsigned m_current_iwd_end_index;
}; };
template<typename AssetType> class ImageIwdPostProcessor final : public AbstractImageIwdPostProcessor template<typename AssetType> class ImageIwdPostProcessor final : public AbstractImageIwdPostProcessor
@ -22,8 +35,8 @@ template<typename AssetType> class ImageIwdPostProcessor final : public Abstract
public: public:
static_assert(std::is_base_of_v<IAssetBase, AssetType>); static_assert(std::is_base_of_v<IAssetBase, AssetType>);
ImageIwdPostProcessor(ISearchPath& searchPath, const std::filesystem::path& outDir) ImageIwdPostProcessor(const ZoneDefinitionContext& zoneDefinition, ISearchPath& searchPath, const std::filesystem::path& outDir)
: AbstractImageIwdPostProcessor(searchPath, outDir) : AbstractImageIwdPostProcessor(zoneDefinition, searchPath, outDir)
{ {
} }

View File

@ -1,17 +1,43 @@
#include "IwdCreator.h" #include "IwdCreator.h"
#include "Utils/FileToZlibWrapper.h"
#include <format> #include <format>
#include <iostream> #include <iostream>
void IwdCreator::AddFile(std::string filePath) IwdToCreate::IwdToCreate(std::string name)
: m_name(std::move(name))
{
}
void IwdToCreate::AddFile(std::string filePath)
{ {
m_file_paths.emplace_back(std::move(filePath)); m_file_paths.emplace_back(std::move(filePath));
} }
void IwdCreator::Finalize(ISearchPath& searchPath, const std::filesystem::path& outPath) void IwdToCreate::Build(ISearchPath& searchPath, const std::filesystem::path& outPath)
{ {
std::cout << std::format("Creating iwd with {} entries:\n", m_file_paths.size()); std::cout << std::format("Creating iwd {} with {} entries:\n", m_name, m_file_paths.size());
for (const auto& filePath : m_file_paths) for (const auto& filePath : m_file_paths)
std::cout << std::format(" {}\n", filePath); std::cout << std::format(" {}\n", filePath);
} }
IwdToCreate* IwdCreator::GetOrAddIwd(const std::string& iwdName)
{
const auto existingIwd = m_iwd_lookup.find(iwdName);
if (existingIwd != m_iwd_lookup.end())
return existingIwd->second;
auto newIwd = std::make_unique<IwdToCreate>(iwdName);
auto* result = newIwd.get();
m_iwds.emplace_back(std::move(newIwd));
return result;
}
void IwdCreator::Finalize(ISearchPath& searchPath, const std::filesystem::path& outPath)
{
for (const auto& iwdToCreate : m_iwds)
iwdToCreate->Build(searchPath, outPath);
}

View File

@ -4,13 +4,30 @@
#include "SearchPath/ISearchPath.h" #include "SearchPath/ISearchPath.h"
#include <filesystem> #include <filesystem>
#include <memory>
#include <string>
#include <unordered_map>
class IwdToCreate
{
public:
explicit IwdToCreate(std::string name);
void AddFile(std::string filePath);
void Build(ISearchPath& searchPath, const std::filesystem::path& outPath);
private:
std::string m_name;
std::vector<std::string> m_file_paths;
};
class IwdCreator : public IZoneAssetLoaderState class IwdCreator : public IZoneAssetLoaderState
{ {
public: public:
void AddFile(std::string filePath); IwdToCreate* GetOrAddIwd(const std::string& iwdName);
void Finalize(ISearchPath& searchPath, const std::filesystem::path& outPath); void Finalize(ISearchPath& searchPath, const std::filesystem::path& outPath);
private: private:
std::vector<std::string> m_file_paths; std::unordered_map<std::string, IwdToCreate*> m_iwd_lookup;
std::vector<std::unique_ptr<IwdToCreate>> m_iwds;
}; };

View File

@ -0,0 +1,16 @@
#pragma once
#include "Zone/Definition/ZoneDefinition.h"
class ZoneDefinitionContext
{
public:
ZoneDefinitionContext(const ZoneDefinition& zoneDefinition)
: m_zone_definition(zoneDefinition),
m_asset_index_in_definition(0u)
{
}
const ZoneDefinition& m_zone_definition;
unsigned m_asset_index_in_definition;
};