ue-mcp 1.4.3 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/daemon/daemon.js +22 -4
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/editor-step.d.ts +13 -0
- package/dist/daemon/editor-step.js +46 -0
- package/dist/daemon/editor-step.js.map +1 -0
- package/dist/editor/dialog-guard.d.ts +9 -0
- package/dist/editor/dialog-guard.js +26 -3
- package/dist/editor/dialog-guard.js.map +1 -1
- package/dist/editor/editor-build.d.ts +16 -0
- package/dist/editor/editor-build.js +37 -1
- package/dist/editor/editor-build.js.map +1 -1
- package/dist/editor/editor-control.d.ts +7 -1
- package/dist/editor/editor-control.js +33 -2
- package/dist/editor/editor-control.js.map +1 -1
- package/dist/editor/engine-observer.d.ts +6 -0
- package/dist/editor/engine-observer.js +16 -2
- package/dist/editor/engine-observer.js.map +1 -1
- package/dist/flow/loader.js +14 -9
- package/dist/flow/loader.js.map +1 -1
- package/dist/tool-counts.json +2 -2
- package/dist/tools/material.js +1 -1
- package/dist/tools/material.js.map +1 -1
- package/dist/ue-mcp.default.yml +12 -6
- package/package.json +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/Material/MaterialHandlers.cpp +9 -5
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MaterialExpressionLookupTests.cpp +52 -0
- package/plugin/ue_mcp_bridge/UE_MCP_Bridge.uplugin +1 -1
package/dist/tool-counts.json
CHANGED
package/dist/tools/material.js
CHANGED
|
@@ -31,7 +31,7 @@ export const materialTool = categoryTool("material", "Materials: create, read, p
|
|
|
31
31
|
set_domain: specBp("mutate", "Set material domain. Required for post-process / decal / UI authoring (#299/#356).", "set_material_domain"),
|
|
32
32
|
set_base_color: specBp("mutate", "Set base color.", "set_material_base_color"),
|
|
33
33
|
connect_texture: specBp("mutate", "Connect texture to property.", "connect_texture_to_material"),
|
|
34
|
-
add_expression: specBp("mutate", "Add expression node (#318).", "add_material_expression"),
|
|
34
|
+
add_expression: specBp("mutate", "Add expression node (#318). Returns expressionIndex, the node's position as set_expression_value and set_custom_expression take it, and expressionName, its unique engine name.", "add_material_expression"),
|
|
35
35
|
connect_expressions: specBp("mutate", "Wire two expressions.", "connect_material_expressions"),
|
|
36
36
|
connect_to_property: specBp("mutate", "Wire expression to material output.", "connect_to_material_property"),
|
|
37
37
|
list_expressions: specBp("read", "List expression nodes, in the material's own stored order, which is what nodeId indexes into. Set includeInputs to include each node's input wiring (default false). Paged with cursor/limit.", "list_material_expressions"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material.js","sourceRoot":"","sources":["../../src/tools/material.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"material.js","sourceRoot":"","sources":["../../src/tools/material.ts"],"names":[],"mappings":"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"}
|
package/dist/ue-mcp.default.yml
CHANGED
|
@@ -5791,9 +5791,12 @@ tasks:
|
|
|
5791
5791
|
class_path: material.add_expression
|
|
5792
5792
|
group: material
|
|
5793
5793
|
description: >-
|
|
5794
|
-
Add expression node (#318).
|
|
5795
|
-
|
|
5796
|
-
|
|
5794
|
+
Add expression node (#318). Returns expressionIndex, the node's position
|
|
5795
|
+
as set_expression_value and set_custom_expression take it, and
|
|
5796
|
+
expressionName, its unique engine name. Params: materialPath (or path, or
|
|
5797
|
+
assetPath), expressionType, name? (or expressionName), parameterName?,
|
|
5798
|
+
group?, sortPriority?, defaultValue?, value?, channels?, positionX?,
|
|
5799
|
+
positionY?
|
|
5797
5800
|
material.connect_expressions:
|
|
5798
5801
|
class_path: material.connect_expressions
|
|
5799
5802
|
group: material
|
|
@@ -17503,7 +17506,7 @@ flows:
|
|
|
17503
17506
|
task: material.set_expression_value
|
|
17504
17507
|
options:
|
|
17505
17508
|
materialPath: /Game/Flows/Beacon/M_Pillar
|
|
17506
|
-
expressionIndex:
|
|
17509
|
+
expressionIndex: ${steps.10.expressionIndex}
|
|
17507
17510
|
value: 1
|
|
17508
17511
|
12:
|
|
17509
17512
|
task: material.connect_to_property
|
|
@@ -17521,7 +17524,7 @@ flows:
|
|
|
17521
17524
|
task: material.set_expression_value
|
|
17522
17525
|
options:
|
|
17523
17526
|
materialPath: /Game/Flows/Beacon/M_Pillar
|
|
17524
|
-
expressionIndex:
|
|
17527
|
+
expressionIndex: ${steps.13.expressionIndex}
|
|
17525
17528
|
value: 0.3
|
|
17526
17529
|
15:
|
|
17527
17530
|
task: material.connect_to_property
|
|
@@ -17572,7 +17575,7 @@ flows:
|
|
|
17572
17575
|
task: material.set_expression_value
|
|
17573
17576
|
options:
|
|
17574
17577
|
materialPath: /Game/Flows/Beacon/M_Glow
|
|
17575
|
-
expressionIndex:
|
|
17578
|
+
expressionIndex: ${steps.22.expressionIndex}
|
|
17576
17579
|
value: 50
|
|
17577
17580
|
24:
|
|
17578
17581
|
task: material.add_expression
|
|
@@ -17745,6 +17748,7 @@ flows:
|
|
|
17745
17748
|
rotation:
|
|
17746
17749
|
pitch: -25
|
|
17747
17750
|
yaw: -135
|
|
17751
|
+
roll: 0
|
|
17748
17752
|
40:
|
|
17749
17753
|
task: level.spawn_light
|
|
17750
17754
|
options:
|
|
@@ -17852,6 +17856,7 @@ flows:
|
|
|
17852
17856
|
rotation:
|
|
17853
17857
|
pitch: -90
|
|
17854
17858
|
yaw: 0
|
|
17859
|
+
roll: 0
|
|
17855
17860
|
52:
|
|
17856
17861
|
task: level.spawn_light
|
|
17857
17862
|
options:
|
|
@@ -17898,6 +17903,7 @@ flows:
|
|
|
17898
17903
|
rotation:
|
|
17899
17904
|
pitch: -15
|
|
17900
17905
|
yaw: 30
|
|
17906
|
+
roll: 0
|
|
17901
17907
|
texture_bomb:
|
|
17902
17908
|
description: >-
|
|
17903
17909
|
Build a reusable MF_TextureBomb MaterialFunction (#491). Quantises UVs
|
package/package.json
CHANGED
package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/Material/MaterialHandlers.cpp
CHANGED
|
@@ -2067,13 +2067,15 @@ TSharedPtr<FJsonValue> FMaterialHandlers::AddMaterialExpression(const TSharedPtr
|
|
|
2067
2067
|
FString SaveError;
|
|
2068
2068
|
const bool bSaved = SaveAssetPackageChecked(Material, SaveError);
|
|
2069
2069
|
|
|
2070
|
-
//
|
|
2071
|
-
|
|
2070
|
+
// The node's position, as expressionIndex: the key and type set_expression_value,
|
|
2071
|
+
// set_custom_expression and read_graph take it under. nodeId is the same index as text.
|
|
2072
|
+
const int32 NodeIndex = Material->GetExpressions().IndexOfByKey(NewExpression);
|
|
2072
2073
|
|
|
2073
2074
|
auto Result = MCPSuccess();
|
|
2074
2075
|
MCPSetCreated(Result);
|
|
2075
2076
|
Result->SetStringField(TEXT("expressionType"), ExpressionType);
|
|
2076
2077
|
Result->SetStringField(TEXT("expressionClass"), NewExpression->GetClass()->GetName());
|
|
2078
|
+
Result->SetNumberField(TEXT("expressionIndex"), NodeIndex);
|
|
2077
2079
|
Result->SetStringField(TEXT("nodeId"), FString::FromInt(NodeIndex));
|
|
2078
2080
|
Result->SetStringField(TEXT("description"), NewExpression->GetDescription());
|
|
2079
2081
|
Result->SetStringField(TEXT("materialPath"), Material->GetPathName());
|
|
@@ -3393,7 +3395,7 @@ TSharedPtr<FJsonValue> FMaterialHandlers::SetExpressionValue(const TSharedPtr<FJ
|
|
|
3393
3395
|
// Name the call that produces the index rather than only the key that is
|
|
3394
3396
|
// missing: this action has no name-based address, so a caller who does
|
|
3395
3397
|
// not already hold an index has nowhere to go from "missing parameter".
|
|
3396
|
-
return MCPError(TEXT("Missing required parameter 'expressionIndex'. This action addresses nodes by POSITION in the material's expression list and has no name form; material(list_expressions) reports that list in the same order (list_function_expressions for a MaterialFunction), and add_expression returns the new node's index as
|
|
3398
|
+
return MCPError(TEXT("Missing required parameter 'expressionIndex'. This action addresses nodes by POSITION in the material's expression list and has no name form; material(list_expressions) reports that list in the same order (list_function_expressions for a MaterialFunction), and add_expression returns the new node's index as expressionIndex."));
|
|
3397
3399
|
}
|
|
3398
3400
|
|
|
3399
3401
|
// #1138: a MaterialFunction graph (functionPath) is edited the same way.
|
|
@@ -3783,10 +3785,12 @@ UMaterialExpression* FMaterialHandlers::FindExpressionInList(TConstArrayView<TOb
|
|
|
3783
3785
|
{
|
|
3784
3786
|
if (ExpressionName.IsEmpty()) return nullptr;
|
|
3785
3787
|
|
|
3786
|
-
// Try matching by description first (most specific)
|
|
3788
|
+
// Try matching by description or by Desc first (most specific). Desc is the
|
|
3789
|
+
// name add_expression stores and list_expressions reports as `name`; a
|
|
3790
|
+
// Constant's GetDescription is its value ("Constant (1)"), never that name.
|
|
3787
3791
|
for (UMaterialExpression* Expression : Expressions)
|
|
3788
3792
|
{
|
|
3789
|
-
if (Expression && Expression->GetDescription() == ExpressionName)
|
|
3793
|
+
if (Expression && (Expression->GetDescription() == ExpressionName || Expression->Desc == ExpressionName))
|
|
3790
3794
|
{
|
|
3791
3795
|
return Expression;
|
|
3792
3796
|
}
|
package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MaterialExpressionLookupTests.cpp
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#if WITH_DEV_AUTOMATION_TESTS
|
|
2
|
+
|
|
3
|
+
#include "HandlerRegistry.h"
|
|
4
|
+
#include "Handlers/Material/MaterialHandlers.h"
|
|
5
|
+
#include "Materials/Material.h"
|
|
6
|
+
#include "Materials/MaterialExpressionConstant.h"
|
|
7
|
+
#include "Misc/AutomationTest.h"
|
|
8
|
+
#include "Misc/Guid.h"
|
|
9
|
+
#include "UObject/Package.h"
|
|
10
|
+
#include "UObject/StrongObjectPtr.h"
|
|
11
|
+
|
|
12
|
+
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
|
13
|
+
FMaterialExpressionLookupByDescTest,
|
|
14
|
+
"UE.MCP.Material.ExpressionLookup.ByDesc",
|
|
15
|
+
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
|
|
16
|
+
|
|
17
|
+
// add_expression stores its `name` in Desc, and a Constant's GetDescription is
|
|
18
|
+
// its value, so a name lookup that skips Desc cannot find what it just created.
|
|
19
|
+
bool FMaterialExpressionLookupByDescTest::RunTest(const FString& Parameters)
|
|
20
|
+
{
|
|
21
|
+
UPackage* Package = CreatePackage(*FString::Printf(TEXT("/Temp/MCPLookup_%s"), *FGuid::NewGuid().ToString(EGuidFormats::Digits)));
|
|
22
|
+
TStrongObjectPtr<UMaterial> Material(NewObject<UMaterial>(Package, TEXT("Material"), RF_Transient));
|
|
23
|
+
auto* Metallic = NewObject<UMaterialExpressionConstant>(Material.Get(), NAME_None, RF_Transient);
|
|
24
|
+
auto* Roughness = NewObject<UMaterialExpressionConstant>(Material.Get(), NAME_None, RF_Transient);
|
|
25
|
+
Metallic->Desc = TEXT("Metallic");
|
|
26
|
+
Metallic->R = 1.0f;
|
|
27
|
+
Roughness->Desc = TEXT("Roughness");
|
|
28
|
+
Roughness->R = 0.3f;
|
|
29
|
+
Material->GetExpressionCollection().AddExpression(Metallic);
|
|
30
|
+
Material->GetExpressionCollection().AddExpression(Roughness);
|
|
31
|
+
|
|
32
|
+
FMCPHandlerRegistry Registry;
|
|
33
|
+
FMaterialHandlers::RegisterHandlers(Registry);
|
|
34
|
+
auto Connect = [&](const TCHAR* Name, const TCHAR* Property) -> bool
|
|
35
|
+
{
|
|
36
|
+
auto Request = MakeShared<FJsonObject>();
|
|
37
|
+
Request->SetStringField(TEXT("materialPath"), Material->GetPathName());
|
|
38
|
+
Request->SetStringField(TEXT("expressionName"), Name);
|
|
39
|
+
Request->SetStringField(TEXT("property"), Property);
|
|
40
|
+
const auto Value = Registry.ExecuteHandler(TEXT("connect_to_material_property"), Request);
|
|
41
|
+
return Value.IsValid() && Value->Type == EJson::Object && Value->AsObject()->GetBoolField(TEXT("success"));
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
TestTrue(TEXT("Metallic connects by its name"), Connect(TEXT("Metallic"), TEXT("Metallic")));
|
|
45
|
+
TestTrue(TEXT("Roughness connects by its name"), Connect(TEXT("Roughness"), TEXT("Roughness")));
|
|
46
|
+
TestTrue(TEXT("Metallic input holds the node named Metallic"), Material->GetExpressionInputForProperty(MP_Metallic)->Expression == Metallic);
|
|
47
|
+
TestTrue(TEXT("Roughness input holds the node named Roughness"), Material->GetExpressionInputForProperty(MP_Roughness)->Expression == Roughness);
|
|
48
|
+
TestFalse(TEXT("an unknown name is refused"), Connect(TEXT("Specular"), TEXT("Specular")));
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#endif
|