More MCP refactors

This commit is contained in:
2026-03-08 01:47:15 -05:00
parent 4befd070db
commit 0fe0cfa1c2
22 changed files with 661 additions and 777 deletions

View File

@@ -92,13 +92,8 @@ public:
}
// Check if asset already exists
FString FullAssetPath = PackagePath / Name;
if (UMCPAssetFinder::FindAsset(UMaterial::StaticClass(), Name) || UMCPAssetFinder::FindAsset(UMaterial::StaticClass(), FullAssetPath))
{
return MCPUtils::MakeErrorJson(Result, FString::Printf(
TEXT("Material '%s' already exists. Use a different name or delete the existing asset first."),
*Name));
}
MCPAssets<UMaterial> ExistCheck;
if (!ExistCheck.Exact(Name).Errors(Result).EAny().Info()) return;
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: Creating Material '%s' in '%s'"), *Name, *PackagePath);
@@ -197,8 +192,6 @@ public:
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: Created Material '%s' (saved: %s)"),
*Name, bSaved ? TEXT("true") : TEXT("false"));
Result->SetBoolField(TEXT("success"), true);
Result->SetStringField(TEXT("name"), Name);
Result->SetStringField(TEXT("path"), MaterialObj->GetPathName());
Result->SetStringField(TEXT("domain"), DomainToString(MaterialObj->MaterialDomain));
Result->SetStringField(TEXT("blendMode"), BlendModeToString(MaterialObj->BlendMode));
@@ -240,8 +233,9 @@ public:
}
// Load material
UMaterial* MaterialObj = UMCPAssetFinder::LoadAsset<UMaterial>(Material, Result);
if (!MaterialObj) return;
MCPAssets<UMaterial> Assets;
if (!Assets.Exact(Material).Errors(Result).ENone().ETwo().Load()) return;
UMaterial* MaterialObj = Assets.Object();
FString OldValue;
FString NewValue;
@@ -490,9 +484,7 @@ public:
DryRun ? TEXT("[DRY RUN] ") : TEXT(""),
*Property, *Material, *OldValue, *NewValue);
Result->SetBoolField(TEXT("success"), true);
Result->SetStringField(TEXT("material"), MaterialObj->GetName());
Result->SetStringField(TEXT("property"), Property);
Result->SetStringField(TEXT("oldValue"), OldValue);
Result->SetStringField(TEXT("newValue"), NewValue);
Result->SetBoolField(TEXT("dryRun"), DryRun);
@@ -593,15 +585,17 @@ public:
{
return MCPUtils::MakeErrorJson(Result, TEXT("Specify either 'material' or 'materialFunction', not both"));
}
MatFunc = UMCPAssetFinder::LoadAsset<UMaterialFunction>(MaterialFunction, Result);
if (!MatFunc) return;
MCPAssets<UMaterialFunction> MFAssets;
if (!MFAssets.Exact(MaterialFunction).Errors(Result).ENone().ETwo().Load()) return;
MatFunc = MFAssets.Object();
Owner = MatFunc;
AssetDisplayName = MatFunc->GetName();
}
else
{
MaterialObj = UMCPAssetFinder::LoadAsset<UMaterial>(Material, Result);
if (!MaterialObj) return;
MCPAssets<UMaterial> MatAssets;
if (!MatAssets.Exact(Material).Errors(Result).ENone().ETwo().Load()) return;
MaterialObj = MatAssets.Object();
Owner = MaterialObj;
AssetDisplayName = MaterialObj->GetName();
}
@@ -611,12 +605,8 @@ public:
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: [DRY RUN] Would add expression '%s' to '%s' at (%d, %d)"),
*ExpressionClass, *AssetDisplayName, PosX, PosY);
Result->SetBoolField(TEXT("success"), true);
Result->SetBoolField(TEXT("dryRun"), true);
Result->SetStringField(TEXT("material"), AssetDisplayName);
Result->SetStringField(TEXT("expressionClass"), ExpressionClass);
Result->SetNumberField(TEXT("posX"), PosX);
Result->SetNumberField(TEXT("posY"), PosY);
return;
}
@@ -687,12 +677,8 @@ public:
// Serialize the expression details
TSharedPtr<FJsonObject> ExprDetails = MCPUtils::SerializeMaterialExpression(NewExpr);
Result->SetBoolField(TEXT("success"), true);
Result->SetStringField(TEXT("material"), AssetDisplayName);
Result->SetStringField(TEXT("expressionClass"), ExpressionClass);
Result->SetStringField(TEXT("nodeId"), NodeGuid);
Result->SetNumberField(TEXT("posX"), PosX);
Result->SetNumberField(TEXT("posY"), PosY);
if (ExprDetails.IsValid())
{
Result->SetObjectField(TEXT("expression"), ExprDetails);
@@ -742,14 +728,16 @@ public:
if (!MaterialFunction.IsEmpty())
{
MatFunc = UMCPAssetFinder::LoadAsset<UMaterialFunction>(MaterialFunction, Result);
if (!MatFunc) return;
MCPAssets<UMaterialFunction> MFAssets;
if (!MFAssets.Exact(MaterialFunction).Errors(Result).ENone().ETwo().Load()) return;
MatFunc = MFAssets.Object();
AssetDisplayName = MatFunc->GetName();
}
else
{
MaterialObj = UMCPAssetFinder::LoadAsset<UMaterial>(Material, Result);
if (!MaterialObj) return;
MCPAssets<UMaterial> MatAssets;
if (!MatAssets.Exact(Material).Errors(Result).ENone().ETwo().Load()) return;
MaterialObj = MatAssets.Object();
AssetDisplayName = MaterialObj->GetName();
}
@@ -792,10 +780,8 @@ public:
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: [DRY RUN] Would delete expression '%s' (nodeId: %s) from '%s'"),
*DeletedExprClass, *Node, *AssetDisplayName);
Result->SetBoolField(TEXT("success"), true);
Result->SetBoolField(TEXT("dryRun"), true);
Result->SetStringField(TEXT("material"), AssetDisplayName);
Result->SetStringField(TEXT("deletedNode"), Node);
Result->SetStringField(TEXT("deletedNodeTitle"), DeletedNodeTitle);
Result->SetStringField(TEXT("deletedExpressionClass"), DeletedExprClass);
return;
@@ -827,9 +813,7 @@ public:
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: Deleted expression '%s' (nodeId: %s) from '%s' (saved: %s)"),
*DeletedExprClass, *Node, *AssetDisplayName, bSaved ? TEXT("true") : TEXT("false"));
Result->SetBoolField(TEXT("success"), true);
Result->SetStringField(TEXT("material"), AssetDisplayName);
Result->SetStringField(TEXT("deletedNode"), Node);
Result->SetStringField(TEXT("deletedNodeTitle"), DeletedNodeTitle);
Result->SetStringField(TEXT("deletedExpressionClass"), DeletedExprClass);
Result->SetBoolField(TEXT("saved"), bSaved);
@@ -886,14 +870,16 @@ public:
if (!MaterialFunction.IsEmpty())
{
MatFunc = UMCPAssetFinder::LoadAsset<UMaterialFunction>(MaterialFunction, Result);
if (!MatFunc) return;
MCPAssets<UMaterialFunction> MFAssets;
if (!MFAssets.Exact(MaterialFunction).Errors(Result).ENone().ETwo().Load()) return;
MatFunc = MFAssets.Object();
AssetDisplayName = MatFunc->GetName();
}
else
{
MaterialObj = UMCPAssetFinder::LoadAsset<UMaterial>(Material, Result);
if (!MaterialObj) return;
MCPAssets<UMaterial> MatAssets;
if (!MatAssets.Exact(Material).Errors(Result).ENone().ETwo().Load()) return;
MaterialObj = MatAssets.Object();
AssetDisplayName = MaterialObj->GetName();
}
@@ -967,9 +953,7 @@ public:
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: [DRY RUN] Would connect %s.%s -> %s.%s in '%s'"),
*SourceNode, *SourcePinName, *TargetNode, *TargetPinName, *AssetDisplayName);
Result->SetBoolField(TEXT("success"), true);
Result->SetBoolField(TEXT("dryRun"), true);
Result->SetBoolField(TEXT("connected"), false);
Result->SetStringField(TEXT("material"), AssetDisplayName);
return;
}
@@ -986,8 +970,6 @@ public:
bool bConnected = Schema->TryCreateConnection(SourcePin, TargetPin);
Result->SetBoolField(TEXT("success"), bConnected);
Result->SetBoolField(TEXT("connected"), bConnected);
Result->SetStringField(TEXT("material"), AssetDisplayName);
if (!bConnected)
@@ -1050,14 +1032,16 @@ public:
if (!MaterialFunction.IsEmpty())
{
MatFunc = UMCPAssetFinder::LoadAsset<UMaterialFunction>(MaterialFunction, Result);
if (!MatFunc) return;
MCPAssets<UMaterialFunction> MFAssets;
if (!MFAssets.Exact(MaterialFunction).Errors(Result).ENone().ETwo().Load()) return;
MatFunc = MFAssets.Object();
AssetDisplayName = MatFunc->GetName();
}
else
{
MaterialObj = UMCPAssetFinder::LoadAsset<UMaterial>(Material, Result);
if (!MaterialObj) return;
MCPAssets<UMaterial> MatAssets;
if (!MatAssets.Exact(Material).Errors(Result).ENone().ETwo().Load()) return;
MaterialObj = MatAssets.Object();
AssetDisplayName = MaterialObj->GetName();
}
@@ -1109,11 +1093,8 @@ public:
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: [DRY RUN] Would disconnect pin '%s' on node '%s' in '%s' (%d links)"),
*PinName, *Node, *AssetDisplayName, BrokenCount);
Result->SetBoolField(TEXT("success"), true);
Result->SetBoolField(TEXT("dryRun"), true);
Result->SetStringField(TEXT("material"), AssetDisplayName);
Result->SetStringField(TEXT("nodeId"), Node);
Result->SetStringField(TEXT("pinName"), PinName);
Result->SetNumberField(TEXT("brokenLinkCount"), BrokenCount);
return;
}
@@ -1131,10 +1112,7 @@ public:
// Save
bool bSaved = MaterialObj ? MCPUtils::SaveMaterialPackage(MaterialObj) : MCPUtils::SaveGenericPackage(MatFunc);
Result->SetBoolField(TEXT("success"), true);
Result->SetStringField(TEXT("material"), AssetDisplayName);
Result->SetStringField(TEXT("nodeId"), Node);
Result->SetStringField(TEXT("pinName"), PinName);
Result->SetNumberField(TEXT("brokenLinkCount"), BrokenCount);
Result->SetBoolField(TEXT("saved"), bSaved);
}
@@ -1184,14 +1162,16 @@ public:
if (!MaterialFunction.IsEmpty())
{
MatFunc = UMCPAssetFinder::LoadAsset<UMaterialFunction>(MaterialFunction, Result);
if (!MatFunc) return;
MCPAssets<UMaterialFunction> MFAssets;
if (!MFAssets.Exact(MaterialFunction).Errors(Result).ENone().ETwo().Load()) return;
MatFunc = MFAssets.Object();
AssetDisplayName = MatFunc->GetName();
}
else
{
MaterialObj = UMCPAssetFinder::LoadAsset<UMaterial>(Material, Result);
if (!MaterialObj) return;
MCPAssets<UMaterial> MatAssets;
if (!MatAssets.Exact(Material).Errors(Result).ENone().ETwo().Load()) return;
MaterialObj = MatAssets.Object();
AssetDisplayName = MaterialObj->GetName();
}
@@ -1414,9 +1394,7 @@ public:
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: Set expression value on node '%s' (%s) in '%s': %s"),
*Node, *ExprType, *AssetDisplayName, *NewValueStr);
Result->SetBoolField(TEXT("success"), true);
Result->SetStringField(TEXT("material"), AssetDisplayName);
Result->SetStringField(TEXT("nodeId"), Node);
Result->SetStringField(TEXT("expressionType"), ExprType);
Result->SetStringField(TEXT("newValue"), NewValueStr);
Result->SetBoolField(TEXT("saved"), bSaved);
@@ -1470,14 +1448,16 @@ public:
if (!MaterialFunction.IsEmpty())
{
MatFunc = UMCPAssetFinder::LoadAsset<UMaterialFunction>(MaterialFunction, Result);
if (!MatFunc) return;
MCPAssets<UMaterialFunction> MFAssets;
if (!MFAssets.Exact(MaterialFunction).Errors(Result).ENone().ETwo().Load()) return;
MatFunc = MFAssets.Object();
AssetDisplayName = MatFunc->GetName();
}
else
{
MaterialObj = UMCPAssetFinder::LoadAsset<UMaterial>(Material, Result);
if (!MaterialObj) return;
MCPAssets<UMaterial> MatAssets;
if (!MatAssets.Exact(Material).Errors(Result).ENone().ETwo().Load()) return;
MaterialObj = MatAssets.Object();
AssetDisplayName = MaterialObj->GetName();
}
@@ -1510,12 +1490,8 @@ public:
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: [DRY RUN] Would move node '%s' to (%d, %d) in '%s'"),
*Node, PosX, PosY, *AssetDisplayName);
Result->SetBoolField(TEXT("success"), true);
Result->SetBoolField(TEXT("dryRun"), true);
Result->SetStringField(TEXT("material"), AssetDisplayName);
Result->SetStringField(TEXT("nodeId"), Node);
Result->SetNumberField(TEXT("posX"), PosX);
Result->SetNumberField(TEXT("posY"), PosY);
return;
}
@@ -1540,11 +1516,7 @@ public:
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: Moved node '%s' to (%d, %d) in '%s' (saved: %s)"),
*Node, PosX, PosY, *AssetDisplayName, bSaved ? TEXT("true") : TEXT("false"));
Result->SetBoolField(TEXT("success"), true);
Result->SetStringField(TEXT("material"), AssetDisplayName);
Result->SetStringField(TEXT("nodeId"), Node);
Result->SetNumberField(TEXT("posX"), PosX);
Result->SetNumberField(TEXT("posY"), PosY);
Result->SetBoolField(TEXT("saved"), bSaved);
}
};
@@ -1581,13 +1553,8 @@ public:
}
// Check if asset already exists
FString FullAssetPath = PackagePath / Name;
if (UMCPAssetFinder::FindAsset(UMaterialFunction::StaticClass(), Name) || UMCPAssetFinder::FindAsset(UMaterialFunction::StaticClass(), FullAssetPath))
{
return MCPUtils::MakeErrorJson(Result, FString::Printf(
TEXT("Material Function '%s' already exists. Use a different name or delete the existing asset first."),
*Name));
}
MCPAssets<UMaterialFunction> ExistCheck;
if (!ExistCheck.Exact(Name).Errors(Result).EAny().Info()) return;
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: Creating Material Function '%s' in '%s'"), *Name, *PackagePath);
@@ -1620,13 +1587,7 @@ public:
UE_LOG(LogTemp, Display, TEXT("BlueprintMCP: Created Material Function '%s' (saved: %s)"),
*Name, bSaved ? TEXT("true") : TEXT("false"));
Result->SetBoolField(TEXT("success"), true);
Result->SetStringField(TEXT("name"), Name);
Result->SetStringField(TEXT("path"), MF->GetPathName());
if (!Description.IsEmpty())
{
Result->SetStringField(TEXT("description"), Description);
}
Result->SetBoolField(TEXT("saved"), bSaved);
}
};