chore: implement obj loading skeleton with localize asset

This commit is contained in:
Jan
2024-12-23 22:55:58 +01:00
parent 673db0592f
commit c524cb007a
64 changed files with 1238 additions and 1038 deletions

View File

@ -79,7 +79,7 @@ XAssetInfoGeneric* AssetCreationContext::AddAssetGeneric(GenericAssetRegistratio
return addedAsset;
}
XAssetInfoGeneric* AssetCreationContext::LoadDefaultAssetDependency(const asset_type_t assetType, const std::string& assetName) const
XAssetInfoGeneric* AssetCreationContext::LoadDefaultAssetDependency(const asset_type_t assetType, const std::string& assetName)
{
const auto result = m_creators->CreateDefaultAsset(assetType, assetName, *this);
if (result.HasTakenAction() && !result.HasFailed())

View File

@ -39,6 +39,13 @@ public:
return static_cast<XAssetInfo<typename AssetType::Type>*>(AddAssetGeneric(std::move(registration)));
}
template<typename AssetType> XAssetInfo<typename AssetType::Type>* AddAsset(std::string assetName, typename AssetType::Type* asset)
{
static_assert(std::is_base_of_v<IAssetBase, AssetType>);
return static_cast<XAssetInfo<typename AssetType::Type>*>(AddAssetGeneric(AssetRegistration<AssetType>(std::move(assetName), asset)));
}
XAssetInfoGeneric* AddAssetGeneric(GenericAssetRegistration registration) const;
template<typename AssetType> XAssetInfo<typename AssetType::Type>* LoadDependency(const std::string& assetName)
@ -76,7 +83,7 @@ public:
}
private:
[[nodiscard]] XAssetInfoGeneric* LoadDefaultAssetDependency(asset_type_t assetType, const std::string& assetName) const;
[[nodiscard]] XAssetInfoGeneric* LoadDefaultAssetDependency(asset_type_t assetType, const std::string& assetName);
Zone* m_zone;
const AssetCreatorCollection* m_creators;

View File

@ -44,15 +44,13 @@ AssetCreationResult AssetCreatorCollection::CreateAsset(const asset_type_t asset
return AssetCreationResult::NoAction();
}
AssetCreationResult
AssetCreatorCollection::CreateDefaultAsset(const asset_type_t assetType, const std::string& assetName, const AssetCreationContext& context) const
AssetCreationResult AssetCreatorCollection::CreateDefaultAsset(const asset_type_t assetType, const std::string& assetName, AssetCreationContext& context) const
{
assert(assetType >= 0 && static_cast<unsigned>(assetType) < m_default_asset_creators_by_type.size());
if (assetType >= 0 && static_cast<unsigned>(assetType) < m_default_asset_creators_by_type.size() && m_default_asset_creators_by_type[assetType])
{
auto defaultAsset = m_default_asset_creators_by_type[assetType]->CreateDefaultAsset(assetName);
return AssetCreationResult::Success(context.AddAssetGeneric(std::move(defaultAsset)));
return m_default_asset_creators_by_type[assetType]->CreateDefaultAsset(assetName, context);
}
return AssetCreationResult::NoAction();

View File

@ -22,7 +22,7 @@ public:
void AddDefaultAssetCreator(std::unique_ptr<IDefaultAssetCreator> defaultAssetCreator);
AssetCreationResult CreateAsset(asset_type_t assetType, const std::string& assetName, AssetCreationContext& context) const;
AssetCreationResult CreateDefaultAsset(asset_type_t assetType, const std::string& assetName, const AssetCreationContext& context) const;
AssetCreationResult CreateDefaultAsset(asset_type_t assetType, const std::string& assetName, AssetCreationContext& context) const;
void FinalizeZone(AssetCreationContext& context) const;
private:

View File

@ -0,0 +1,46 @@
#pragma once
#include "Asset/IAssetCreator.h"
#include "Pool/GlobalAssetPool.h"
template<typename AssetType> class GlobalAssetPoolsLoader : public AssetCreator<AssetType>
{
public:
static_assert(std::is_base_of_v<IAssetBase, AssetType>);
GlobalAssetPoolsLoader(Zone& zone)
: m_zone(zone)
{
}
AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override
{
auto* existingAsset = GlobalAssetPool<typename AssetType::Type>::GetAssetByName(assetName);
if (!existingAsset)
return AssetCreationResult::Failure();
AssetRegistration<AssetType> registration(assetName, existingAsset->Asset());
for (const auto* dependency : existingAsset->m_dependencies)
{
auto* newDependency = context.LoadDependencyGeneric(dependency->m_type, dependency->m_name);
if (newDependency)
registration.AddDependency(newDependency);
else
return AssetCreationResult::Failure();
}
for (const auto& indirectAssetReference : existingAsset->m_indirect_asset_references)
registration.AddIndirectAssetReference(context.LoadIndirectAssetReferenceGeneric(indirectAssetReference.m_type, indirectAssetReference.m_name));
// Make sure any used script string is available in the created zone
// The replacement of the scr_string_t values will be done upon writing
for (const auto scrString : existingAsset->m_used_script_strings)
m_zone.m_script_strings.AddOrGetScriptString(existingAsset->m_zone->m_script_strings.CValue(scrString));
return AssetCreationResult::Success(context.AddAsset(std::move(registration)));
}
private:
Zone& m_zone;
};

View File

@ -15,6 +15,11 @@ AssetCreationResult AssetCreationResult::NoAction()
return AssetCreationResult(false, nullptr);
}
bool AssetCreationResult::HasBeenSuccessful() const
{
return m_taken_action && m_asset_info != nullptr;
}
bool AssetCreationResult::HasTakenAction() const
{
return m_taken_action;

View File

@ -17,6 +17,7 @@ public:
static AssetCreationResult Failure();
static AssetCreationResult NoAction();
[[nodiscard]] bool HasBeenSuccessful() const;
[[nodiscard]] bool HasTakenAction() const;
[[nodiscard]] bool HasFailed() const;
[[nodiscard]] XAssetInfoGeneric* GetAssetInfo() const;

View File

@ -1,16 +1,15 @@
#pragma once
#include "AssetCreationContext.h"
#include "AssetRegistration.h"
#include "Game/IAsset.h"
#include "Utils/MemoryManager.h"
#include "IAssetCreator.h"
#include "Zone/ZoneTypes.h"
#include <string>
#include <type_traits>
class GenericAssetRegistration;
template<typename AssetType> class AssetRegistration;
class AssetCreationResult;
class AssetCreationContext;
class IDefaultAssetCreator
{
@ -23,7 +22,7 @@ public:
IDefaultAssetCreator& operator=(IDefaultAssetCreator&& other) noexcept = default;
[[nodiscard]] virtual asset_type_t GetHandlingAssetType() const = 0;
virtual GenericAssetRegistration CreateDefaultAsset(const std::string& assetName) const = 0;
virtual AssetCreationResult CreateDefaultAsset(const std::string& assetName, AssetCreationContext& context) const = 0;
};
template<typename AssetType> class DefaultAssetCreator : public IDefaultAssetCreator
@ -35,12 +34,4 @@ public:
{
return AssetType::EnumEntry;
}
GenericAssetRegistration CreateDefaultAsset(const std::string& assetName) const override
{
return CreateDefaultAssetInternal(assetName);
}
protected:
virtual AssetRegistration<typename AssetType::Type> CreateDefaultAssetInternal(const std::string& assetName) const = 0;
};