// Copyright Epic Games, Inc. All Rights Reserved. #include "ClothingSystemEditorInterfaceModule.h" #include "ClothingAssetFactoryInterface.h" #include "Containers/Array.h" #include "Features/IModularFeatures.h" #include "HAL/IConsoleManager.h" #include "HAL/Platform.h" #include "Modules/ModuleManager.h" #include "SimulationEditorExtender.h" #include "UObject/Class.h" IMPLEMENT_MODULE(FClothingSystemEditorInterfaceModule, ClothingSystemEditorInterface); namespace UE::Private { static FString DefaultClothingAssetFactory = TEXT("ClothingAssetFactory"); // UClothingAssetFactory is the default provider static TAutoConsoleVariable CVarDefaultClothingAssetFactoryClass( TEXT("p.Cloth.DefaultClothingAssetFactoryClass"), DefaultClothingAssetFactory, TEXT("The class name of the default clothing asset factory."), ECVF_Default); } const FName FClothingSystemEditorInterfaceModule::ExtenderFeatureName(TEXT("ClothingSimulationEditorExtender")); FClothingSystemEditorInterfaceModule::FClothingSystemEditorInterfaceModule() { } void FClothingSystemEditorInterfaceModule::StartupModule() { } void FClothingSystemEditorInterfaceModule::ShutdownModule() { } UClothingAssetFactoryBase* FClothingSystemEditorInterfaceModule::GetClothingAssetFactory() { TArray Providers = IModularFeatures::Get().GetModularFeatureImplementations(IClothingAssetFactoryProvider::FeatureName); UClothingAssetFactoryBase* ClothingAssetFactory = nullptr; for (IClothingAssetFactoryProvider* const Provider : Providers) { if (Provider) { if (UClothingAssetFactoryBase* const Factory = Provider->GetFactory()) { if (Factory->GetClass()->GetName() == UE::Private::CVarDefaultClothingAssetFactoryClass.GetValueOnAnyThread()) { ClothingAssetFactory = Factory; } } } } return ClothingAssetFactory; } TArray FClothingSystemEditorInterfaceModule::GetClothingAssetFactories() { const TArray Providers = IModularFeatures::Get().GetModularFeatureImplementations(IClothingAssetFactoryProvider::FeatureName); TArray ClothingAssetFactories; for (IClothingAssetFactoryProvider* const Provider : Providers) { if (Provider) { if (UClothingAssetFactoryBase* const Factory = Provider->GetFactory()) { ClothingAssetFactories.Emplace(Factory); } } } return ClothingAssetFactories; } ISimulationEditorExtender* FClothingSystemEditorInterfaceModule::GetSimulationEditorExtender(FName InSimulationClassName) { TArray Extenders = IModularFeatures::Get().GetModularFeatureImplementations(ExtenderFeatureName); for(ISimulationEditorExtender* Extender : Extenders) { UClass* SupportedClass = Extender->GetSupportedSimulationFactoryClass(); if(SupportedClass && SupportedClass->GetFName() == InSimulationClassName) { return Extender; } } return nullptr; }