ue-mcp 1.2.4 → 1.3.0
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/README.md +4 -3
- package/dist/action-class.js +56 -3
- package/dist/action-class.js.map +1 -1
- package/dist/bridge-timeouts.d.ts +64 -0
- package/dist/bridge-timeouts.js +118 -0
- package/dist/bridge-timeouts.js.map +1 -0
- package/dist/bridge.js +10 -2
- package/dist/bridge.js.map +1 -1
- package/dist/editor-control.d.ts +72 -5
- package/dist/editor-control.js +164 -140
- package/dist/editor-control.js.map +1 -1
- package/dist/editor-target.d.ts +55 -1
- package/dist/editor-target.js +107 -10
- package/dist/editor-target.js.map +1 -1
- package/dist/engine-observer.d.ts +59 -5
- package/dist/engine-observer.js +249 -29
- package/dist/engine-observer.js.map +1 -1
- package/dist/engine-root.d.ts +91 -0
- package/dist/engine-root.js +448 -0
- package/dist/engine-root.js.map +1 -0
- package/dist/epic-enrich.js +16 -1
- package/dist/epic-enrich.js.map +1 -1
- package/dist/feedback-cli.js +4 -0
- package/dist/feedback-cli.js.map +1 -1
- package/dist/feedback-deferred.d.ts +9 -0
- package/dist/feedback-deferred.js +2 -0
- package/dist/feedback-deferred.js.map +1 -1
- package/dist/feedback-fallback.d.ts +99 -0
- package/dist/feedback-fallback.js +173 -0
- package/dist/feedback-fallback.js.map +1 -0
- package/dist/flow/write-methods.js +20 -0
- package/dist/flow/write-methods.js.map +1 -1
- package/dist/lean-context.js +8 -3
- package/dist/lean-context.js.map +1 -1
- package/dist/locking.js +11 -2
- package/dist/locking.js.map +1 -1
- package/dist/project.d.ts +11 -0
- package/dist/project.js +23 -2
- package/dist/project.js.map +1 -1
- package/dist/python-gate.d.ts +95 -0
- package/dist/python-gate.js +175 -0
- package/dist/python-gate.js.map +1 -0
- package/dist/tool-counts.json +16 -16
- package/dist/tools/animation.js +288 -24
- package/dist/tools/animation.js.map +1 -1
- package/dist/tools/asset.js +79 -14
- package/dist/tools/asset.js.map +1 -1
- package/dist/tools/audio.js +59 -5
- package/dist/tools/audio.js.map +1 -1
- package/dist/tools/blueprint.js +29 -12
- package/dist/tools/blueprint.js.map +1 -1
- package/dist/tools/chooser.js +4 -1
- package/dist/tools/chooser.js.map +1 -1
- package/dist/tools/editor.js +81 -43
- package/dist/tools/editor.js.map +1 -1
- package/dist/tools/feedback.js +214 -48
- package/dist/tools/feedback.js.map +1 -1
- package/dist/tools/foliage.js +27 -1
- package/dist/tools/foliage.js.map +1 -1
- package/dist/tools/gameplay.js +38 -11
- package/dist/tools/gameplay.js.map +1 -1
- package/dist/tools/gas.js +17 -5
- package/dist/tools/gas.js.map +1 -1
- package/dist/tools/landscape.js +22 -7
- package/dist/tools/landscape.js.map +1 -1
- package/dist/tools/level.js +322 -51
- package/dist/tools/level.js.map +1 -1
- package/dist/tools/material.js +10 -4
- package/dist/tools/material.js.map +1 -1
- package/dist/tools/niagara.js +3 -2
- package/dist/tools/niagara.js.map +1 -1
- package/dist/tools/pcg.js +6 -5
- package/dist/tools/pcg.js.map +1 -1
- package/dist/tools/project.js +47 -20
- package/dist/tools/project.js.map +1 -1
- package/dist/types.d.ts +21 -0
- package/dist/types.js +46 -3
- package/dist/types.js.map +1 -1
- package/dist/ue-mcp.default.yml +493 -125
- package/package.json +2 -2
- package/plugin/ue_mcp_bridge/NATIVE_RUNTIME_VISIBILITY.md +53 -0
- package/plugin/ue_mcp_bridge/NATIVE_STATIC_MESH_USAGE_PROGRESS.md +115 -0
- package/plugin/ue_mcp_bridge/README_MassHandlers.md +97 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +14 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +21 -4
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +9 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerJsonProperty.h +395 -69
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +79 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +25 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRig.cpp +3 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRigSequencer.cpp +3061 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRetargeterAuthoring.cpp +961 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRigAuthoring.cpp +900 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Pose.cpp +769 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp +44 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_SkeletalLive.cpp +217 -11
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_StateMachine.cpp +551 -24
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Validation.cpp +735 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +352 -73
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +8 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkProperties.cpp +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.cpp +503 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.h +21 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkUpsert.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Enum.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.cpp +902 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.h +33 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Import.cpp +478 -134
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Mesh.cpp +5 -5
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.cpp +933 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.h +35 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Redirectors.cpp +478 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_RenderTarget.cpp +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Sockets.cpp +4 -4
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Struct.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Subobject.cpp +319 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers_SoundCue.cpp +3 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +482 -35
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +10 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.cpp +502 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.h +43 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Functions.cpp +89 -7
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Graph.cpp +17 -51
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Internal.h +107 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Properties.cpp +10 -10
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Search.cpp +648 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +5 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.cpp +252 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.h +10 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +252 -41
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +4 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_Build.cpp +250 -27
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIE.cpp +303 -125
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIERuntime.cpp +73 -50
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_RuntimeVisibility.cpp +757 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +11 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.h +3 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers_Batch.cpp +419 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +39 -161
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +66 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BTAuthoring.cpp +1323 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BehaviorTree.cpp +1211 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +2 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.h +60 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers_Runtime.cpp +363 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/HandlerEditorState.h +84 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +1288 -36
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +3 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers_Sculpt.cpp +41 -16
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +959 -213
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +66 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_BatchWrite.cpp +1571 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Convert.cpp +316 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Inspection.cpp +280 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection.cpp +666 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection_Internal.h +63 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Lights.cpp +43 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_MultiLevel.cpp +13 -47
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_PostProcess.cpp +527 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Query.cpp +1169 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Refresh.cpp +723 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Save.cpp +325 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Spatial.cpp +360 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Trace.cpp +178 -58
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Transient.cpp +337 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Volumes.cpp +25 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartition.cpp +10 -9
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartitionSettings.cpp +686 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.cpp +467 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.h +22 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +452 -175
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +5 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers_Build.cpp +597 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +17 -15
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +38 -168
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +39 -30
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +392 -78
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.h +2 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers_Internal.h +83 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.cpp +200 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.h +15 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +19 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/StateTreeHandlers.cpp +31 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +307 -69
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.h +84 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Extraction.cpp +8 -41
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Properties.cpp +33 -52
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/ActorSelectorTests.cpp +344 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationControlRigTimelineTests.cpp +60 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationPoseTests.cpp +115 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetBulkReadTests.cpp +177 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetDeleteGuardTests.cpp +276 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPathResolutionTests.cpp +243 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPropertyPersistTests.cpp +213 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetSubobjectTests.cpp +235 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AutomationRunnerTests.cpp +72 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeAuthoringTests.cpp +526 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeNodeTests.cpp +334 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BlueprintHandlerSurfaceTests.cpp +362 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BridgeProtocolTests.cpp +14 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/CollisionQueryTests.cpp +288 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/DataTableRowWriteTests.cpp +453 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/EditorFunctionCallTests.cpp +223 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/FoliageBatchTests.cpp +147 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GameThreadGateTests.cpp +82 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GasLiveAttributeTests.cpp +183 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LandscapeSampleTests.cpp +119 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelBatchWriteTests.cpp +176 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelComponentTreeInstanceCountTests.cpp +189 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelConvertBrushesTests.cpp +100 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelInstanceProjectionTests.cpp +265 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelPostProcessOverrideTests.cpp +258 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelQueryComponentsTests.cpp +195 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelRefreshTests.cpp +142 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelSaveReportTests.cpp +125 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelScriptHandlersTests.cpp +42 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelStaticMeshUsageTests.cpp +412 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTraceWorldScopeTests.cpp +133 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTransientActorTests.cpp +205 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelWorldPartitionSettingsTests.cpp +168 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTestTypes.h +51 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTests.cpp +379 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MaterialBuildTests.cpp +238 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshBooleanTests.cpp +170 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshGeometryTests.cpp +116 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageSaveExtensionTests.cpp +161 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageWriteGuardTests.cpp +253 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/RuntimeVisibilityTests.cpp +143 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerHandlerTests.cpp +660 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerScrubTests.cpp +50 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SkeletonDiffTests.cpp +685 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/WidgetBlueprintResolveTests.cpp +145 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +80 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerFunctionCall.h +509 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerQuery.h +407 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerUtils.h +1008 -77
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +87 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/MCPEngineStatus.cpp +152 -14
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/Tests/MCPEngineStatusTests.cpp +65 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Public/MCPEngineStatus.h +32 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/UE_MCP_BridgeStatus.Build.cs +2 -0
- package/skills/ue-mcp-animation/SKILL.md +154 -0
- package/skills/ue-mcp-blueprint/SKILL.md +71 -0
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
#include "EdGraph/EdGraphPin.h"
|
|
8
8
|
#include "Engine/SimpleConstructionScript.h"
|
|
9
9
|
#include "Engine/SCS_Node.h"
|
|
10
|
+
#include "Animation/Skeleton.h"
|
|
11
|
+
#include "Engine/SkeletalMesh.h"
|
|
12
|
+
#include "ReferenceSkeleton.h"
|
|
10
13
|
|
|
11
14
|
// ── Structural extraction helpers ────────────────────────────────────────────
|
|
12
15
|
namespace
|
|
@@ -91,6 +94,68 @@ namespace
|
|
|
91
94
|
for (const FString& S : In) Out.Add(MakeShared<FJsonValueString>(S));
|
|
92
95
|
return Out;
|
|
93
96
|
}
|
|
97
|
+
|
|
98
|
+
struct FVirtualBoneDiffRecord
|
|
99
|
+
{
|
|
100
|
+
FName Name;
|
|
101
|
+
FName Source;
|
|
102
|
+
FName Target;
|
|
103
|
+
|
|
104
|
+
bool operator==(const FVirtualBoneDiffRecord& Other) const
|
|
105
|
+
{
|
|
106
|
+
return Name == Other.Name && Source == Other.Source && Target == Other.Target;
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
bool VirtualBoneRecordLess(const FVirtualBoneDiffRecord& A, const FVirtualBoneDiffRecord& B)
|
|
111
|
+
{
|
|
112
|
+
if (A.Name != B.Name) return A.Name.ToString() < B.Name.ToString();
|
|
113
|
+
if (A.Source != B.Source) return A.Source.ToString() < B.Source.ToString();
|
|
114
|
+
return A.Target.ToString() < B.Target.ToString();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
TArray<FVirtualBoneDiffRecord> CollectVirtualBones(const USkeleton* Skeleton)
|
|
118
|
+
{
|
|
119
|
+
TArray<FVirtualBoneDiffRecord> Out;
|
|
120
|
+
if (!Skeleton)
|
|
121
|
+
{
|
|
122
|
+
return Out;
|
|
123
|
+
}
|
|
124
|
+
Out.Reserve(Skeleton->GetVirtualBones().Num());
|
|
125
|
+
for (const FVirtualBone& Bone : Skeleton->GetVirtualBones())
|
|
126
|
+
{
|
|
127
|
+
Out.Add({
|
|
128
|
+
Bone.VirtualBoneName,
|
|
129
|
+
Bone.SourceBoneName,
|
|
130
|
+
Bone.TargetBoneName
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
Out.Sort(VirtualBoneRecordLess);
|
|
134
|
+
return Out;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
TArray<TSharedPtr<FJsonValue>> VirtualBonesToJson(const TArray<FVirtualBoneDiffRecord>& In)
|
|
138
|
+
{
|
|
139
|
+
TArray<TSharedPtr<FJsonValue>> Out;
|
|
140
|
+
Out.Reserve(In.Num());
|
|
141
|
+
for (const FVirtualBoneDiffRecord& Bone : In)
|
|
142
|
+
{
|
|
143
|
+
TSharedPtr<FJsonObject> Obj = MakeShared<FJsonObject>();
|
|
144
|
+
Obj->SetStringField(TEXT("name"), Bone.Name.ToString());
|
|
145
|
+
Obj->SetStringField(TEXT("sourceBone"), Bone.Source.ToString());
|
|
146
|
+
Obj->SetStringField(TEXT("targetBone"), Bone.Target.ToString());
|
|
147
|
+
Out.Add(MakeShared<FJsonValueObject>(Obj));
|
|
148
|
+
}
|
|
149
|
+
return Out;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
FName RawParentName(const TArray<FMeshBoneInfo>& Bones, int32 BoneIndex)
|
|
153
|
+
{
|
|
154
|
+
const int32 ParentIndex = Bones[BoneIndex].ParentIndex;
|
|
155
|
+
if (ParentIndex == INDEX_NONE) return NAME_None;
|
|
156
|
+
if (Bones.IsValidIndex(ParentIndex)) return Bones[ParentIndex].Name;
|
|
157
|
+
return FName(*FString::Printf(TEXT("<invalid:%d>"), ParentIndex));
|
|
158
|
+
}
|
|
94
159
|
}
|
|
95
160
|
|
|
96
161
|
void FDiffHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
@@ -309,6 +374,187 @@ TSharedPtr<FJsonValue> FDiffHandlers::DiffBlueprint(const TSharedPtr<FJsonObject
|
|
|
309
374
|
return MCPResult(Result);
|
|
310
375
|
}
|
|
311
376
|
|
|
377
|
+
TSharedPtr<FJsonValue> FDiffHandlers::DiffSkeleton(const TSharedPtr<FJsonObject>& Params)
|
|
378
|
+
{
|
|
379
|
+
FString PathA;
|
|
380
|
+
if (TSharedPtr<FJsonValue> Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), PathA)) return Err;
|
|
381
|
+
FString PathB;
|
|
382
|
+
if (TSharedPtr<FJsonValue> Err = RequireString(Params, TEXT("otherPath"), PathB)) return Err;
|
|
383
|
+
|
|
384
|
+
UObject* AssetA = LoadAssetByPath<UObject>(PathA);
|
|
385
|
+
if (!AssetA) return MCPError(FString::Printf(TEXT("Asset not found: %s"), *PathA));
|
|
386
|
+
const bool bSkeletonAssets = AssetA->GetClass() == USkeleton::StaticClass();
|
|
387
|
+
const bool bSkeletalMeshAssets = AssetA->GetClass() == USkeletalMesh::StaticClass();
|
|
388
|
+
if (!bSkeletonAssets && !bSkeletalMeshAssets)
|
|
389
|
+
{
|
|
390
|
+
return MCPError(FString::Printf(
|
|
391
|
+
TEXT("Asset at '%s' must be exactly a Skeleton or SkeletalMesh; found '%s'"),
|
|
392
|
+
*PathA, *AssetA->GetClass()->GetName()));
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
UObject* AssetB = LoadAssetByPath<UObject>(PathB);
|
|
396
|
+
if (!AssetB) return MCPError(FString::Printf(TEXT("Asset not found: %s"), *PathB));
|
|
397
|
+
if (AssetB->GetClass() != AssetA->GetClass())
|
|
398
|
+
{
|
|
399
|
+
return MCPError(FString::Printf(
|
|
400
|
+
TEXT("Asset at '%s' must be exactly a %s to match the first asset; found '%s'"),
|
|
401
|
+
*PathB, *AssetA->GetClass()->GetName(), *AssetB->GetClass()->GetName()));
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const USkeleton* SkeletonAssetA = bSkeletonAssets ? CastChecked<USkeleton>(AssetA) : nullptr;
|
|
405
|
+
const USkeleton* SkeletonAssetB = bSkeletonAssets ? CastChecked<USkeleton>(AssetB) : nullptr;
|
|
406
|
+
const USkeletalMesh* SkeletalMeshA = bSkeletalMeshAssets ? CastChecked<USkeletalMesh>(AssetA) : nullptr;
|
|
407
|
+
const USkeletalMesh* SkeletalMeshB = bSkeletalMeshAssets ? CastChecked<USkeletalMesh>(AssetB) : nullptr;
|
|
408
|
+
const FReferenceSkeleton& ReferenceA = bSkeletonAssets
|
|
409
|
+
? SkeletonAssetA->GetReferenceSkeleton()
|
|
410
|
+
: SkeletalMeshA->GetRefSkeleton();
|
|
411
|
+
const FReferenceSkeleton& ReferenceB = bSkeletonAssets
|
|
412
|
+
? SkeletonAssetB->GetReferenceSkeleton()
|
|
413
|
+
: SkeletalMeshB->GetRefSkeleton();
|
|
414
|
+
const USkeleton* PolicySkeletonA = bSkeletonAssets ? SkeletonAssetA : SkeletalMeshA->GetSkeleton();
|
|
415
|
+
const USkeleton* PolicySkeletonB = bSkeletonAssets ? SkeletonAssetB : SkeletalMeshB->GetSkeleton();
|
|
416
|
+
const TArray<FMeshBoneInfo>& RawA = ReferenceA.GetRawRefBoneInfo();
|
|
417
|
+
const TArray<FMeshBoneInfo>& RawB = ReferenceB.GetRawRefBoneInfo();
|
|
418
|
+
|
|
419
|
+
TMap<FName, FName> ParentByBoneA;
|
|
420
|
+
TMap<FName, FName> ParentByBoneB;
|
|
421
|
+
TMap<FName, int32> IndexByBoneA;
|
|
422
|
+
TMap<FName, int32> IndexByBoneB;
|
|
423
|
+
for (int32 Index = 0; Index < RawA.Num(); ++Index)
|
|
424
|
+
{
|
|
425
|
+
ParentByBoneA.Add(RawA[Index].Name, RawParentName(RawA, Index));
|
|
426
|
+
IndexByBoneA.Add(RawA[Index].Name, Index);
|
|
427
|
+
}
|
|
428
|
+
for (int32 Index = 0; Index < RawB.Num(); ++Index)
|
|
429
|
+
{
|
|
430
|
+
ParentByBoneB.Add(RawB[Index].Name, RawParentName(RawB, Index));
|
|
431
|
+
IndexByBoneB.Add(RawB[Index].Name, Index);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
TArray<FString> RawBonesAdded;
|
|
435
|
+
TArray<FString> RawBonesRemoved;
|
|
436
|
+
TArray<FName> SharedRawBones;
|
|
437
|
+
for (const TPair<FName, FName>& Bone : ParentByBoneB)
|
|
438
|
+
{
|
|
439
|
+
if (!ParentByBoneA.Contains(Bone.Key)) RawBonesAdded.Add(Bone.Key.ToString());
|
|
440
|
+
}
|
|
441
|
+
for (const TPair<FName, FName>& Bone : ParentByBoneA)
|
|
442
|
+
{
|
|
443
|
+
if (ParentByBoneB.Contains(Bone.Key)) SharedRawBones.Add(Bone.Key);
|
|
444
|
+
else RawBonesRemoved.Add(Bone.Key.ToString());
|
|
445
|
+
}
|
|
446
|
+
RawBonesAdded.Sort();
|
|
447
|
+
RawBonesRemoved.Sort();
|
|
448
|
+
SharedRawBones.Sort([](const FName& Left, const FName& Right)
|
|
449
|
+
{
|
|
450
|
+
return Left.ToString() < Right.ToString();
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
TArray<TSharedPtr<FJsonValue>> Reparented;
|
|
454
|
+
TArray<TSharedPtr<FJsonValue>> RawBoneIndexChanges;
|
|
455
|
+
bool bSharedParentsMatch = true;
|
|
456
|
+
for (const FName& BoneName : SharedRawBones)
|
|
457
|
+
{
|
|
458
|
+
const FName ParentA = ParentByBoneA.FindChecked(BoneName);
|
|
459
|
+
const FName ParentB = ParentByBoneB.FindChecked(BoneName);
|
|
460
|
+
if (ParentA != ParentB)
|
|
461
|
+
{
|
|
462
|
+
bSharedParentsMatch = false;
|
|
463
|
+
TSharedPtr<FJsonObject> Delta = MakeShared<FJsonObject>();
|
|
464
|
+
Delta->SetStringField(TEXT("bone"), BoneName.ToString());
|
|
465
|
+
Delta->SetStringField(TEXT("fromParent"), ParentA.ToString());
|
|
466
|
+
Delta->SetStringField(TEXT("toParent"), ParentB.ToString());
|
|
467
|
+
Reparented.Add(MakeShared<FJsonValueObject>(Delta));
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
const int32 IndexA = IndexByBoneA.FindChecked(BoneName);
|
|
471
|
+
const int32 IndexB = IndexByBoneB.FindChecked(BoneName);
|
|
472
|
+
if (IndexA != IndexB)
|
|
473
|
+
{
|
|
474
|
+
TSharedPtr<FJsonObject> Delta = MakeShared<FJsonObject>();
|
|
475
|
+
Delta->SetStringField(TEXT("bone"), BoneName.ToString());
|
|
476
|
+
Delta->SetNumberField(TEXT("fromIndex"), IndexA);
|
|
477
|
+
Delta->SetNumberField(TEXT("toIndex"), IndexB);
|
|
478
|
+
RawBoneIndexChanges.Add(MakeShared<FJsonValueObject>(Delta));
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
const TArray<FVirtualBoneDiffRecord> VirtualA = CollectVirtualBones(PolicySkeletonA);
|
|
483
|
+
const TArray<FVirtualBoneDiffRecord> VirtualB = CollectVirtualBones(PolicySkeletonB);
|
|
484
|
+
TArray<FVirtualBoneDiffRecord> VirtualBonesAdded;
|
|
485
|
+
TArray<FVirtualBoneDiffRecord> VirtualBonesRemoved;
|
|
486
|
+
for (const FVirtualBoneDiffRecord& Bone : VirtualB)
|
|
487
|
+
{
|
|
488
|
+
if (!VirtualA.Contains(Bone)) VirtualBonesAdded.Add(Bone);
|
|
489
|
+
}
|
|
490
|
+
for (const FVirtualBoneDiffRecord& Bone : VirtualA)
|
|
491
|
+
{
|
|
492
|
+
if (!VirtualB.Contains(Bone)) VirtualBonesRemoved.Add(Bone);
|
|
493
|
+
}
|
|
494
|
+
VirtualBonesAdded.Sort(VirtualBoneRecordLess);
|
|
495
|
+
VirtualBonesRemoved.Sort(VirtualBoneRecordLess);
|
|
496
|
+
|
|
497
|
+
const bool bSameRawRoot = RawA.Num() > 0
|
|
498
|
+
&& RawB.Num() > 0
|
|
499
|
+
&& RawA[0].ParentIndex == INDEX_NONE
|
|
500
|
+
&& RawB[0].ParentIndex == INDEX_NONE
|
|
501
|
+
&& RawA[0].Name == RawB[0].Name;
|
|
502
|
+
const bool bHierarchyCompatible = bSameRawRoot && bSharedParentsMatch;
|
|
503
|
+
const bool bEditorCompatible = PolicySkeletonA
|
|
504
|
+
&& PolicySkeletonB
|
|
505
|
+
&& (PolicySkeletonA == PolicySkeletonB
|
|
506
|
+
|| PolicySkeletonA->IsCompatibleForEditor(PolicySkeletonB)
|
|
507
|
+
|| PolicySkeletonB->IsCompatibleForEditor(PolicySkeletonA));
|
|
508
|
+
const int32 ChangeCount = RawBonesAdded.Num()
|
|
509
|
+
+ RawBonesRemoved.Num()
|
|
510
|
+
+ Reparented.Num()
|
|
511
|
+
+ RawBoneIndexChanges.Num()
|
|
512
|
+
+ VirtualBonesAdded.Num()
|
|
513
|
+
+ VirtualBonesRemoved.Num();
|
|
514
|
+
|
|
515
|
+
TSharedPtr<FJsonObject> Result = MCPSuccess();
|
|
516
|
+
const FString AssetType = bSkeletonAssets ? TEXT("Skeleton") : TEXT("SkeletalMesh");
|
|
517
|
+
Result->SetStringField(TEXT("assetType"), AssetType);
|
|
518
|
+
Result->SetStringField(TEXT("from"), PathA);
|
|
519
|
+
Result->SetStringField(TEXT("to"), PathB);
|
|
520
|
+
Result->SetNumberField(TEXT("boneCountFrom"), ReferenceA.GetNum());
|
|
521
|
+
Result->SetNumberField(TEXT("boneCountTo"), ReferenceB.GetNum());
|
|
522
|
+
Result->SetNumberField(TEXT("rawBoneCountFrom"), RawA.Num());
|
|
523
|
+
Result->SetNumberField(TEXT("rawBoneCountTo"), RawB.Num());
|
|
524
|
+
Result->SetNumberField(TEXT("virtualBoneCountFrom"), VirtualA.Num());
|
|
525
|
+
Result->SetNumberField(TEXT("virtualBoneCountTo"), VirtualB.Num());
|
|
526
|
+
Result->SetStringField(TEXT("virtualBoneSourceFrom"), GetPathNameSafe(PolicySkeletonA));
|
|
527
|
+
Result->SetStringField(TEXT("virtualBoneSourceTo"), GetPathNameSafe(PolicySkeletonB));
|
|
528
|
+
Result->SetNumberField(TEXT("sharedRawBoneCount"), SharedRawBones.Num());
|
|
529
|
+
Result->SetArrayField(TEXT("rawBonesAdded"), StringsToJson(RawBonesAdded));
|
|
530
|
+
Result->SetArrayField(TEXT("rawBonesRemoved"), StringsToJson(RawBonesRemoved));
|
|
531
|
+
Result->SetArrayField(TEXT("reparented"), Reparented);
|
|
532
|
+
Result->SetArrayField(TEXT("rawBoneIndexChanges"), RawBoneIndexChanges);
|
|
533
|
+
Result->SetArrayField(TEXT("virtualBonesAdded"), VirtualBonesToJson(VirtualBonesAdded));
|
|
534
|
+
Result->SetArrayField(TEXT("virtualBonesRemoved"), VirtualBonesToJson(VirtualBonesRemoved));
|
|
535
|
+
Result->SetBoolField(TEXT("editorCompatible"), bEditorCompatible);
|
|
536
|
+
Result->SetBoolField(TEXT("hierarchyCompatible"), bHierarchyCompatible);
|
|
537
|
+
Result->SetBoolField(TEXT("referencePoseCompared"), false);
|
|
538
|
+
Result->SetBoolField(TEXT("exportNamesCompared"), false);
|
|
539
|
+
Result->SetStringField(
|
|
540
|
+
TEXT("structureScope"),
|
|
541
|
+
TEXT("raw bone names, parent names, raw indices, and declared virtual bones; excludes reference-pose transforms and export names"));
|
|
542
|
+
Result->SetNumberField(TEXT("changeCount"), ChangeCount);
|
|
543
|
+
Result->SetBoolField(TEXT("structurallyIdentical"), ChangeCount == 0);
|
|
544
|
+
Result->SetBoolField(TEXT("identical"), ChangeCount == 0);
|
|
545
|
+
Result->SetStringField(TEXT("summary"), ChangeCount == 0
|
|
546
|
+
? FString::Printf(
|
|
547
|
+
TEXT("%s structures are identical: %d final, %d raw, %d declared virtual"),
|
|
548
|
+
*AssetType, ReferenceA.GetNum(), RawA.Num(), VirtualA.Num())
|
|
549
|
+
: FString::Printf(
|
|
550
|
+
TEXT("%s delta: %d change(s), final %d -> %d, raw %d -> %d, declared virtual %d -> %d"),
|
|
551
|
+
*AssetType, ChangeCount,
|
|
552
|
+
ReferenceA.GetNum(), ReferenceB.GetNum(),
|
|
553
|
+
RawA.Num(), RawB.Num(), VirtualA.Num(), VirtualB.Num()));
|
|
554
|
+
|
|
555
|
+
return MCPResult(Result);
|
|
556
|
+
}
|
|
557
|
+
|
|
312
558
|
TSharedPtr<FJsonValue> FDiffHandlers::DiffAsset(const TSharedPtr<FJsonObject>& Params)
|
|
313
559
|
{
|
|
314
560
|
FString PathA;
|
|
@@ -320,8 +566,13 @@ TSharedPtr<FJsonValue> FDiffHandlers::DiffAsset(const TSharedPtr<FJsonObject>& P
|
|
|
320
566
|
{
|
|
321
567
|
return DiffBlueprint(Params);
|
|
322
568
|
}
|
|
569
|
+
if (Asset->GetClass() == USkeleton::StaticClass()
|
|
570
|
+
|| Asset->GetClass() == USkeletalMesh::StaticClass())
|
|
571
|
+
{
|
|
572
|
+
return DiffSkeleton(Params);
|
|
573
|
+
}
|
|
323
574
|
return MCPError(FString::Printf(
|
|
324
|
-
TEXT("Diffing '%s' assets is not supported yet. Blueprint diffing
|
|
575
|
+
TEXT("Diffing '%s' assets is not supported yet. Blueprint, Skeleton, and SkeletalMesh diffing are available now; StateTree and other graph assets are staged follow-ups."),
|
|
325
576
|
*Asset->GetClass()->GetName()));
|
|
326
577
|
}
|
|
327
578
|
return MCPError(FString::Printf(TEXT("Asset not found: %s"), *PathA));
|
|
@@ -30,7 +30,15 @@ private:
|
|
|
30
30
|
// otherPath (compare/B). Reports changes as A -> B.
|
|
31
31
|
static TSharedPtr<FJsonValue> DiffBlueprint(const TSharedPtr<FJsonObject>& Params);
|
|
32
32
|
|
|
33
|
-
//
|
|
34
|
-
//
|
|
33
|
+
// Diff two exact USkeleton or USkeletalMesh assets without emitting full
|
|
34
|
+
// bone dumps. Compares raw bone names, parent names, raw indices, and
|
|
35
|
+
// declared virtual-bone records. Reference-pose transforms, export names,
|
|
36
|
+
// sockets, retarget sources, and other metadata are outside this structural
|
|
37
|
+
// diff. Both inputs must have the same exact asset class.
|
|
38
|
+
static TSharedPtr<FJsonValue> DiffSkeleton(const TSharedPtr<FJsonObject>& Params);
|
|
39
|
+
|
|
40
|
+
// Type-routing entry point. Blueprints, Skeletons, and SkeletalMeshes
|
|
41
|
+
// delegate to their respective semantic diff handlers; unsupported classes
|
|
42
|
+
// fail clearly.
|
|
35
43
|
static TSharedPtr<FJsonValue> DiffAsset(const TSharedPtr<FJsonObject>& Params);
|
|
36
44
|
};
|