Files
integration/Plugins/UEWingman/Deprecated/Material_ReparentInstance.h

96 lines
2.9 KiB
C
Raw Normal View History

2026-03-08 22:17:14 -04:00
#pragma once
#include "CoreMinimal.h"
#include "MCPHandler.h"
2026-03-13 14:26:04 -04:00
#include "MCPAssets.h"
2026-03-08 22:17:14 -04:00
#include "MCPUtils.h"
#include "Materials/Material.h"
#include "Materials/MaterialInterface.h"
#include "Materials/MaterialInstanceConstant.h"
2026-03-12 00:44:17 -04:00
#include "Material_ReparentInstance.generated.h"
2026-03-08 22:17:14 -04:00
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
2026-03-12 00:44:17 -04:00
UCLASS()
class UMCP_Material_ReparentInstance : public UObject, public IMCPHandler
2026-03-08 22:17:14 -04:00
{
GENERATED_BODY()
public:
UPROPERTY(meta=(Description="Material Instance name or path to reparent"))
FString MaterialInstance;
UPROPERTY(meta=(Description="New parent material name or path (Material or Material Instance)"))
FString NewParent;
UPROPERTY(meta=(Optional, Description="If true, validate without applying changes"))
bool DryRun = false;
virtual FString GetDescription() const override
{
return TEXT("Change the parent material of a Material Instance. "
"Validates against circular parent chains.");
}
2026-03-10 07:17:42 -04:00
virtual void Handle(const FJsonObject* Json, FStringBuilderBase& Result) override
2026-03-08 22:17:14 -04:00
{
// Load the Material Instance
MCPAssets<UMaterialInstanceConstant> Assets;
if (!Assets.Exact(MaterialInstance).Errors(Result).ENone().ETwo().Load()) return;
UMaterialInstanceConstant* MI = Assets.Object();
2026-03-10 07:17:42 -04:00
// Load new parent (Material or MaterialInstance)
MCPAssets<UMaterialInterface> ParentAssets;
ParentAssets.NoScans();
ParentAssets.Scan<UMaterial>();
ParentAssets.Scan<UMaterialInstanceConstant>();
if (!ParentAssets.Exact(NewParent).Errors(Result).ENone().ETwo().Load()) return;
UMaterialInterface* NewParentObj = ParentAssets.Object();
// Prevent circular parenting
UMaterialInterface* Check = NewParentObj;
while (Check)
2026-03-08 22:17:14 -04:00
{
2026-03-10 07:17:42 -04:00
if (Check == MI)
2026-03-08 22:17:14 -04:00
{
2026-03-10 07:17:42 -04:00
Result.Appendf(TEXT("ERROR: Reparenting to '%s' would create a circular parent chain.\n"),
*NameOf(NewParentObj));
return;
2026-03-08 22:17:14 -04:00
}
2026-03-10 07:17:42 -04:00
UMaterialInstanceConstant* CheckMI = Cast<UMaterialInstanceConstant>(Check);
if (!CheckMI) break;
Check = CheckMI->Parent;
2026-03-08 22:17:14 -04:00
}
2026-03-10 07:17:42 -04:00
FString OldParentName = MI->Parent ? NameOf(MI->Parent) : TEXT("None");
2026-03-08 22:17:14 -04:00
2026-03-10 07:17:42 -04:00
if (DryRun)
2026-03-08 22:17:14 -04:00
{
2026-03-10 07:17:42 -04:00
Result.Appendf(TEXT("[DRY RUN] Would reparent %s: %s -> %s\n"),
*MCPUtils::FormatName(MI), *OldParentName, *NameOf(NewParentObj));
return;
2026-03-08 22:17:14 -04:00
}
2026-03-12 01:31:57 -04:00
MCPUtils::PreEdit({MI});
2026-03-10 07:17:42 -04:00
MI->Parent = NewParentObj;
2026-03-12 01:31:57 -04:00
MCPUtils::PostEdit({MI});
2026-03-10 07:17:42 -04:00
MCPUtils::SaveGenericPackage(MI);
2026-03-08 22:17:14 -04:00
2026-03-10 07:17:42 -04:00
Result.Appendf(TEXT("Reparented %s: %s -> %s\n"),
*MCPUtils::FormatName(MI), *OldParentName, *NameOf(NewParentObj));
}
2026-03-08 22:17:14 -04:00
2026-03-10 07:17:42 -04:00
private:
FString NameOf(UMaterialInterface* Obj)
{
if (UMaterial* M = Cast<UMaterial>(Obj))
return MCPUtils::FormatName(M);
if (UMaterialInstance* MI = Cast<UMaterialInstance>(Obj))
return MCPUtils::FormatName(MI);
return Obj->GetPathName();
2026-03-08 22:17:14 -04:00
}
};