// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once #include "IAssetFactory.h" #include "../JsonAsset.h" #include "Engine/Content/AssetInfo.h" /// /// The Json assets factory base class. /// /// class FLAXENGINE_API JsonAssetFactoryBase : public IAssetFactory { protected: virtual JsonAssetBase* Create(const AssetInfo& info) = 0; public: // [IAssetFactory] Asset* New(const AssetInfo& info) override { return Create(info); } Asset* NewVirtual(const AssetInfo& info) override { return Create(info); } }; /// /// The Json assets factory. /// /// template class JsonAssetFactory : public JsonAssetFactoryBase { protected: // [JsonAssetFactoryBase] JsonAssetBase* Create(const AssetInfo& info) override { ScriptingObjectSpawnParams params(info.ID, T::TypeInitializer); return ::New(params, &info); } }; #define REGISTER_JSON_ASSET(type, typeName, supportsVirtualAssets) \ const String type::TypeName = TEXT(typeName); \ class CONCAT_MACROS(Factory, type) : public JsonAssetFactory \ { \ public: \ CONCAT_MACROS(Factory, type)() { IAssetFactory::Get().Add(type::TypeName, this); } \ ~CONCAT_MACROS(Factory, type)() { IAssetFactory::Get().Remove(type::TypeName); } \ bool SupportsVirtualAssets() const override { return supportsVirtualAssets; } \ }; \ static CONCAT_MACROS(Factory, type) CONCAT_MACROS(CFactory, type)