unreal-engine-mcp-server 0.4.6 → 0.5.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/.env.example +26 -0
- package/.env.production +38 -7
- package/.eslintrc.json +0 -54
- package/.eslintrc.override.json +8 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
- package/.github/copilot-instructions.md +478 -45
- package/.github/dependabot.yml +19 -0
- package/.github/labeler.yml +24 -0
- package/.github/labels.yml +70 -0
- package/.github/pull_request_template.md +42 -0
- package/.github/release-drafter.yml +148 -0
- package/.github/workflows/auto-merge.yml +38 -0
- package/.github/workflows/ci.yml +38 -0
- package/.github/workflows/dependency-review.yml +17 -0
- package/.github/workflows/gemini-issue-triage.yml +172 -0
- package/.github/workflows/greetings.yml +23 -0
- package/.github/workflows/labeler.yml +16 -0
- package/.github/workflows/links.yml +80 -0
- package/.github/workflows/pr-size-labeler.yml +137 -0
- package/.github/workflows/publish-mcp.yml +12 -7
- package/.github/workflows/release-drafter.yml +23 -0
- package/.github/workflows/release.yml +112 -0
- package/.github/workflows/semantic-pull-request.yml +35 -0
- package/.github/workflows/smoke-test.yml +36 -0
- package/.github/workflows/stale.yml +28 -0
- package/CHANGELOG.md +269 -22
- package/CONTRIBUTING.md +140 -0
- package/README.md +166 -72
- package/claude_desktop_config_example.json +7 -6
- package/dist/automation/bridge.d.ts +50 -0
- package/dist/automation/bridge.js +452 -0
- package/dist/automation/connection-manager.d.ts +23 -0
- package/dist/automation/connection-manager.js +107 -0
- package/dist/automation/handshake.d.ts +11 -0
- package/dist/automation/handshake.js +89 -0
- package/dist/automation/index.d.ts +3 -0
- package/dist/automation/index.js +3 -0
- package/dist/automation/message-handler.d.ts +12 -0
- package/dist/automation/message-handler.js +149 -0
- package/dist/automation/request-tracker.d.ts +25 -0
- package/dist/automation/request-tracker.js +98 -0
- package/dist/automation/types.d.ts +130 -0
- package/dist/automation/types.js +2 -0
- package/dist/cli.js +32 -5
- package/dist/config.d.ts +27 -0
- package/dist/config.js +60 -0
- package/dist/constants.d.ts +12 -0
- package/dist/constants.js +12 -0
- package/dist/graphql/resolvers.d.ts +268 -0
- package/dist/graphql/resolvers.js +743 -0
- package/dist/graphql/schema.d.ts +5 -0
- package/dist/graphql/schema.js +437 -0
- package/dist/graphql/server.d.ts +26 -0
- package/dist/graphql/server.js +115 -0
- package/dist/graphql/types.d.ts +7 -0
- package/dist/graphql/types.js +2 -0
- package/dist/handlers/resource-handlers.d.ts +20 -0
- package/dist/handlers/resource-handlers.js +180 -0
- package/dist/index.d.ts +31 -18
- package/dist/index.js +119 -604
- package/dist/prompts/index.js +4 -4
- package/dist/resources/actors.d.ts +17 -12
- package/dist/resources/actors.js +56 -76
- package/dist/resources/assets.d.ts +6 -14
- package/dist/resources/assets.js +115 -147
- package/dist/resources/levels.d.ts +13 -13
- package/dist/resources/levels.js +25 -34
- package/dist/server/resource-registry.d.ts +20 -0
- package/dist/server/resource-registry.js +37 -0
- package/dist/server/tool-registry.d.ts +23 -0
- package/dist/server/tool-registry.js +322 -0
- package/dist/server-setup.d.ts +21 -0
- package/dist/server-setup.js +111 -0
- package/dist/services/health-monitor.d.ts +34 -0
- package/dist/services/health-monitor.js +105 -0
- package/dist/services/metrics-server.d.ts +11 -0
- package/dist/services/metrics-server.js +105 -0
- package/dist/tools/actors.d.ts +147 -9
- package/dist/tools/actors.js +350 -311
- package/dist/tools/animation.d.ts +135 -4
- package/dist/tools/animation.js +510 -411
- package/dist/tools/assets.d.ts +117 -19
- package/dist/tools/assets.js +259 -284
- package/dist/tools/audio.d.ts +102 -42
- package/dist/tools/audio.js +272 -685
- package/dist/tools/base-tool.d.ts +17 -0
- package/dist/tools/base-tool.js +46 -0
- package/dist/tools/behavior-tree.d.ts +94 -0
- package/dist/tools/behavior-tree.js +39 -0
- package/dist/tools/blueprint/helpers.d.ts +29 -0
- package/dist/tools/blueprint/helpers.js +182 -0
- package/dist/tools/blueprint.d.ts +228 -118
- package/dist/tools/blueprint.js +685 -832
- package/dist/tools/consolidated-tool-definitions.d.ts +5475 -1627
- package/dist/tools/consolidated-tool-definitions.js +829 -482
- package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
- package/dist/tools/consolidated-tool-handlers.js +211 -1009
- package/dist/tools/debug.d.ts +143 -85
- package/dist/tools/debug.js +234 -180
- package/dist/tools/dynamic-handler-registry.d.ts +11 -0
- package/dist/tools/dynamic-handler-registry.js +101 -0
- package/dist/tools/editor.d.ts +139 -18
- package/dist/tools/editor.js +239 -244
- package/dist/tools/engine.d.ts +10 -4
- package/dist/tools/engine.js +13 -5
- package/dist/tools/environment.d.ts +36 -0
- package/dist/tools/environment.js +267 -0
- package/dist/tools/foliage.d.ts +105 -14
- package/dist/tools/foliage.js +219 -331
- package/dist/tools/handlers/actor-handlers.d.ts +3 -0
- package/dist/tools/handlers/actor-handlers.js +232 -0
- package/dist/tools/handlers/animation-handlers.d.ts +3 -0
- package/dist/tools/handlers/animation-handlers.js +185 -0
- package/dist/tools/handlers/argument-helper.d.ts +16 -0
- package/dist/tools/handlers/argument-helper.js +80 -0
- package/dist/tools/handlers/asset-handlers.d.ts +3 -0
- package/dist/tools/handlers/asset-handlers.js +496 -0
- package/dist/tools/handlers/audio-handlers.d.ts +3 -0
- package/dist/tools/handlers/audio-handlers.js +166 -0
- package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
- package/dist/tools/handlers/blueprint-handlers.js +358 -0
- package/dist/tools/handlers/common-handlers.d.ts +14 -0
- package/dist/tools/handlers/common-handlers.js +56 -0
- package/dist/tools/handlers/editor-handlers.d.ts +3 -0
- package/dist/tools/handlers/editor-handlers.js +119 -0
- package/dist/tools/handlers/effect-handlers.d.ts +3 -0
- package/dist/tools/handlers/effect-handlers.js +171 -0
- package/dist/tools/handlers/environment-handlers.d.ts +3 -0
- package/dist/tools/handlers/environment-handlers.js +170 -0
- package/dist/tools/handlers/graph-handlers.d.ts +3 -0
- package/dist/tools/handlers/graph-handlers.js +90 -0
- package/dist/tools/handlers/input-handlers.d.ts +3 -0
- package/dist/tools/handlers/input-handlers.js +21 -0
- package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
- package/dist/tools/handlers/inspect-handlers.js +383 -0
- package/dist/tools/handlers/level-handlers.d.ts +3 -0
- package/dist/tools/handlers/level-handlers.js +237 -0
- package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
- package/dist/tools/handlers/lighting-handlers.js +144 -0
- package/dist/tools/handlers/performance-handlers.d.ts +3 -0
- package/dist/tools/handlers/performance-handlers.js +130 -0
- package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
- package/dist/tools/handlers/pipeline-handlers.js +110 -0
- package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
- package/dist/tools/handlers/sequence-handlers.js +376 -0
- package/dist/tools/handlers/system-handlers.d.ts +4 -0
- package/dist/tools/handlers/system-handlers.js +506 -0
- package/dist/tools/input.d.ts +19 -0
- package/dist/tools/input.js +89 -0
- package/dist/tools/introspection.d.ts +103 -40
- package/dist/tools/introspection.js +425 -568
- package/dist/tools/landscape.d.ts +97 -36
- package/dist/tools/landscape.js +280 -409
- package/dist/tools/level.d.ts +130 -10
- package/dist/tools/level.js +639 -675
- package/dist/tools/lighting.d.ts +77 -38
- package/dist/tools/lighting.js +441 -943
- package/dist/tools/logs.d.ts +45 -0
- package/dist/tools/logs.js +210 -0
- package/dist/tools/materials.d.ts +91 -24
- package/dist/tools/materials.js +190 -118
- package/dist/tools/niagara.d.ts +149 -39
- package/dist/tools/niagara.js +232 -182
- package/dist/tools/performance.d.ts +27 -12
- package/dist/tools/performance.js +204 -122
- package/dist/tools/physics.d.ts +32 -77
- package/dist/tools/physics.js +171 -582
- package/dist/tools/property-dictionary.d.ts +13 -0
- package/dist/tools/property-dictionary.js +82 -0
- package/dist/tools/sequence.d.ts +73 -48
- package/dist/tools/sequence.js +196 -748
- package/dist/tools/tool-definition-utils.d.ts +59 -0
- package/dist/tools/tool-definition-utils.js +35 -0
- package/dist/tools/ui.d.ts +66 -34
- package/dist/tools/ui.js +134 -214
- package/dist/types/env.d.ts +0 -3
- package/dist/types/env.js +0 -7
- package/dist/types/tool-interfaces.d.ts +898 -0
- package/dist/types/tool-interfaces.js +2 -0
- package/dist/types/tool-types.d.ts +195 -11
- package/dist/types/tool-types.js +0 -4
- package/dist/unreal-bridge.d.ts +24 -131
- package/dist/unreal-bridge.js +364 -1506
- package/dist/utils/command-validator.d.ts +9 -0
- package/dist/utils/command-validator.js +67 -0
- package/dist/utils/elicitation.d.ts +1 -1
- package/dist/utils/elicitation.js +12 -15
- package/dist/utils/error-handler.d.ts +2 -51
- package/dist/utils/error-handler.js +11 -87
- package/dist/utils/ini-reader.d.ts +3 -0
- package/dist/utils/ini-reader.js +69 -0
- package/dist/utils/logger.js +9 -6
- package/dist/utils/normalize.d.ts +3 -0
- package/dist/utils/normalize.js +56 -0
- package/dist/utils/response-factory.d.ts +7 -0
- package/dist/utils/response-factory.js +33 -0
- package/dist/utils/response-validator.d.ts +3 -24
- package/dist/utils/response-validator.js +130 -81
- package/dist/utils/result-helpers.d.ts +4 -5
- package/dist/utils/result-helpers.js +15 -16
- package/dist/utils/safe-json.js +5 -11
- package/dist/utils/unreal-command-queue.d.ts +24 -0
- package/dist/utils/unreal-command-queue.js +120 -0
- package/dist/utils/validation.d.ts +0 -40
- package/dist/utils/validation.js +1 -78
- package/dist/wasm/index.d.ts +70 -0
- package/dist/wasm/index.js +535 -0
- package/docs/GraphQL-API.md +888 -0
- package/docs/Migration-Guide-v0.5.0.md +692 -0
- package/docs/Roadmap.md +53 -0
- package/docs/WebAssembly-Integration.md +628 -0
- package/docs/editor-plugin-extension.md +370 -0
- package/docs/handler-mapping.md +242 -0
- package/docs/native-automation-progress.md +128 -0
- package/docs/testing-guide.md +423 -0
- package/mcp-config-example.json +6 -6
- package/package.json +60 -27
- package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
- package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
- package/scripts/check-unreal-connection.mjs +19 -0
- package/scripts/clean-tmp.js +23 -0
- package/scripts/patch-wasm.js +26 -0
- package/scripts/run-all-tests.mjs +131 -0
- package/scripts/smoke-test.ts +94 -0
- package/scripts/sync-mcp-plugin.js +143 -0
- package/scripts/test-no-plugin-alternates.mjs +113 -0
- package/scripts/validate-server.js +46 -0
- package/scripts/verify-automation-bridge.js +200 -0
- package/server.json +57 -21
- package/src/automation/bridge.ts +558 -0
- package/src/automation/connection-manager.ts +130 -0
- package/src/automation/handshake.ts +99 -0
- package/src/automation/index.ts +2 -0
- package/src/automation/message-handler.ts +167 -0
- package/src/automation/request-tracker.ts +123 -0
- package/src/automation/types.ts +107 -0
- package/src/cli.ts +33 -6
- package/src/config.ts +73 -0
- package/src/constants.ts +12 -0
- package/src/graphql/resolvers.ts +1010 -0
- package/src/graphql/schema.ts +452 -0
- package/src/graphql/server.ts +154 -0
- package/src/graphql/types.ts +7 -0
- package/src/handlers/resource-handlers.ts +186 -0
- package/src/index.ts +152 -649
- package/src/prompts/index.ts +4 -4
- package/src/resources/actors.ts +58 -76
- package/src/resources/assets.ts +147 -134
- package/src/resources/levels.ts +28 -33
- package/src/server/resource-registry.ts +47 -0
- package/src/server/tool-registry.ts +354 -0
- package/src/server-setup.ts +148 -0
- package/src/services/health-monitor.ts +132 -0
- package/src/services/metrics-server.ts +142 -0
- package/src/tools/actors.ts +417 -322
- package/src/tools/animation.ts +671 -461
- package/src/tools/assets.ts +353 -289
- package/src/tools/audio.ts +323 -766
- package/src/tools/base-tool.ts +52 -0
- package/src/tools/behavior-tree.ts +45 -0
- package/src/tools/blueprint/helpers.ts +189 -0
- package/src/tools/blueprint.ts +787 -965
- package/src/tools/consolidated-tool-definitions.ts +993 -500
- package/src/tools/consolidated-tool-handlers.ts +272 -1122
- package/src/tools/debug.ts +292 -187
- package/src/tools/dynamic-handler-registry.ts +151 -0
- package/src/tools/editor.ts +309 -246
- package/src/tools/engine.ts +14 -3
- package/src/tools/environment.ts +287 -0
- package/src/tools/foliage.ts +314 -379
- package/src/tools/handlers/actor-handlers.ts +271 -0
- package/src/tools/handlers/animation-handlers.ts +237 -0
- package/src/tools/handlers/argument-helper.ts +142 -0
- package/src/tools/handlers/asset-handlers.ts +532 -0
- package/src/tools/handlers/audio-handlers.ts +194 -0
- package/src/tools/handlers/blueprint-handlers.ts +380 -0
- package/src/tools/handlers/common-handlers.ts +87 -0
- package/src/tools/handlers/editor-handlers.ts +123 -0
- package/src/tools/handlers/effect-handlers.ts +220 -0
- package/src/tools/handlers/environment-handlers.ts +183 -0
- package/src/tools/handlers/graph-handlers.ts +116 -0
- package/src/tools/handlers/input-handlers.ts +28 -0
- package/src/tools/handlers/inspect-handlers.ts +450 -0
- package/src/tools/handlers/level-handlers.ts +252 -0
- package/src/tools/handlers/lighting-handlers.ts +147 -0
- package/src/tools/handlers/performance-handlers.ts +132 -0
- package/src/tools/handlers/pipeline-handlers.ts +127 -0
- package/src/tools/handlers/sequence-handlers.ts +415 -0
- package/src/tools/handlers/system-handlers.ts +564 -0
- package/src/tools/input.ts +101 -0
- package/src/tools/introspection.ts +493 -584
- package/src/tools/landscape.ts +394 -489
- package/src/tools/level.ts +752 -694
- package/src/tools/lighting.ts +583 -984
- package/src/tools/logs.ts +219 -0
- package/src/tools/materials.ts +231 -121
- package/src/tools/niagara.ts +293 -168
- package/src/tools/performance.ts +320 -168
- package/src/tools/physics.ts +268 -613
- package/src/tools/property-dictionary.ts +98 -0
- package/src/tools/sequence.ts +255 -815
- package/src/tools/tool-definition-utils.ts +35 -0
- package/src/tools/ui.ts +207 -283
- package/src/types/env.ts +0 -10
- package/src/types/tool-interfaces.ts +250 -0
- package/src/types/tool-types.ts +250 -13
- package/src/unreal-bridge.ts +460 -1550
- package/src/utils/command-validator.ts +75 -0
- package/src/utils/elicitation.ts +10 -7
- package/src/utils/error-handler.ts +14 -90
- package/src/utils/ini-reader.ts +86 -0
- package/src/utils/logger.ts +8 -3
- package/src/utils/normalize.ts +60 -0
- package/src/utils/response-factory.ts +39 -0
- package/src/utils/response-validator.ts +176 -56
- package/src/utils/result-helpers.ts +21 -19
- package/src/utils/safe-json.ts +14 -11
- package/src/utils/unreal-command-queue.ts +152 -0
- package/src/utils/validation.ts +4 -1
- package/src/wasm/index.ts +838 -0
- package/test-server.mjs +100 -0
- package/tests/run-unreal-tool-tests.mjs +242 -14
- package/tests/test-animation.mjs +44 -0
- package/tests/test-asset-advanced.mjs +82 -0
- package/tests/test-asset-errors.mjs +35 -0
- package/tests/test-audio.mjs +219 -0
- package/tests/test-automation-timeouts.mjs +98 -0
- package/tests/test-behavior-tree.mjs +261 -0
- package/tests/test-blueprint-events.mjs +35 -0
- package/tests/test-blueprint-graph.mjs +79 -0
- package/tests/test-blueprint.mjs +577 -0
- package/tests/test-client-mode.mjs +86 -0
- package/tests/test-console-command.mjs +56 -0
- package/tests/test-control-actor.mjs +425 -0
- package/tests/test-control-editor.mjs +80 -0
- package/tests/test-extra-tools.mjs +38 -0
- package/tests/test-graphql.mjs +322 -0
- package/tests/test-inspect.mjs +72 -0
- package/tests/test-landscape.mjs +60 -0
- package/tests/test-manage-asset.mjs +438 -0
- package/tests/test-manage-level.mjs +70 -0
- package/tests/test-materials.mjs +356 -0
- package/tests/test-niagara.mjs +185 -0
- package/tests/test-no-inline-python.mjs +122 -0
- package/tests/test-plugin-handshake.mjs +82 -0
- package/tests/test-render.mjs +33 -0
- package/tests/test-runner.mjs +933 -0
- package/tests/test-search-assets.mjs +66 -0
- package/tests/test-sequence.mjs +68 -0
- package/tests/test-system.mjs +57 -0
- package/tests/test-wasm.mjs +193 -0
- package/tests/test-world-partition.mjs +215 -0
- package/tsconfig.json +3 -3
- package/wasm/Cargo.lock +363 -0
- package/wasm/Cargo.toml +42 -0
- package/wasm/LICENSE +21 -0
- package/wasm/README.md +253 -0
- package/wasm/src/dependency_resolver.rs +377 -0
- package/wasm/src/lib.rs +153 -0
- package/wasm/src/property_parser.rs +271 -0
- package/wasm/src/transform_math.rs +396 -0
- package/wasm/tests/integration.rs +109 -0
- package/.github/workflows/smithery-build.yml +0 -29
- package/dist/tools/build_environment_advanced.d.ts +0 -65
- package/dist/tools/build_environment_advanced.js +0 -633
- package/dist/tools/rc.d.ts +0 -110
- package/dist/tools/rc.js +0 -437
- package/dist/tools/visual.d.ts +0 -40
- package/dist/tools/visual.js +0 -282
- package/dist/utils/http.d.ts +0 -6
- package/dist/utils/http.js +0 -151
- package/dist/utils/python-output.d.ts +0 -18
- package/dist/utils/python-output.js +0 -290
- package/dist/utils/python.d.ts +0 -2
- package/dist/utils/python.js +0 -4
- package/dist/utils/stdio-redirect.d.ts +0 -2
- package/dist/utils/stdio-redirect.js +0 -20
- package/docs/unreal-tool-test-cases.md +0 -572
- package/smithery.yaml +0 -29
- package/src/tools/build_environment_advanced.ts +0 -732
- package/src/tools/rc.ts +0 -515
- package/src/tools/visual.ts +0 -281
- package/src/utils/http.ts +0 -187
- package/src/utils/python-output.ts +0 -351
- package/src/utils/python.ts +0 -3
- package/src/utils/stdio-redirect.ts +0 -18
|
@@ -1,11 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Logger } from '../utils/logger.js';
|
|
2
2
|
export class PerformanceTools {
|
|
3
3
|
bridge;
|
|
4
|
-
|
|
4
|
+
log = new Logger('PerformanceTools');
|
|
5
|
+
automationBridge;
|
|
6
|
+
constructor(bridge, automationBridge) {
|
|
5
7
|
this.bridge = bridge;
|
|
8
|
+
this.automationBridge = automationBridge;
|
|
9
|
+
}
|
|
10
|
+
setAutomationBridge(automationBridge) {
|
|
11
|
+
this.automationBridge = automationBridge;
|
|
6
12
|
}
|
|
7
|
-
// Start profiling
|
|
8
13
|
async startProfiling(params) {
|
|
14
|
+
if (this.automationBridge) {
|
|
15
|
+
try {
|
|
16
|
+
const response = await this.automationBridge.sendAutomationRequest('start_profiling', {
|
|
17
|
+
type: params.type,
|
|
18
|
+
duration: params.duration
|
|
19
|
+
});
|
|
20
|
+
if (response.success)
|
|
21
|
+
return { success: true, message: `${params.type} profiling started (bridge)` };
|
|
22
|
+
}
|
|
23
|
+
catch (_e) {
|
|
24
|
+
}
|
|
25
|
+
}
|
|
9
26
|
const commands = [];
|
|
10
27
|
switch (params.type) {
|
|
11
28
|
case 'CPU':
|
|
@@ -35,8 +52,16 @@ export class PerformanceTools {
|
|
|
35
52
|
await this.bridge.executeConsoleCommands(commands);
|
|
36
53
|
return { success: true, message: `${params.type} profiling started` };
|
|
37
54
|
}
|
|
38
|
-
// Stop profiling
|
|
39
55
|
async stopProfiling() {
|
|
56
|
+
if (this.automationBridge) {
|
|
57
|
+
try {
|
|
58
|
+
const response = await this.automationBridge.sendAutomationRequest('stop_profiling', {});
|
|
59
|
+
if (response.success)
|
|
60
|
+
return { success: true, message: 'Profiling stopped (bridge)' };
|
|
61
|
+
}
|
|
62
|
+
catch (_e) {
|
|
63
|
+
}
|
|
64
|
+
}
|
|
40
65
|
const commands = [
|
|
41
66
|
'stat stopfile',
|
|
42
67
|
'stat none'
|
|
@@ -44,19 +69,32 @@ export class PerformanceTools {
|
|
|
44
69
|
await this.bridge.executeConsoleCommands(commands);
|
|
45
70
|
return { success: true, message: 'Profiling stopped' };
|
|
46
71
|
}
|
|
47
|
-
// Show FPS
|
|
48
72
|
async showFPS(params) {
|
|
49
73
|
const startTime = Date.now();
|
|
50
|
-
|
|
74
|
+
this.log.debug('Starting showFPS with params:', params);
|
|
75
|
+
if (this.automationBridge) {
|
|
76
|
+
try {
|
|
77
|
+
const response = await this.automationBridge.sendAutomationRequest('show_fps', {
|
|
78
|
+
enabled: params.enabled,
|
|
79
|
+
verbose: params.verbose
|
|
80
|
+
});
|
|
81
|
+
if (response.success)
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
message: params.enabled ? 'FPS display enabled (bridge)' : 'FPS display disabled (bridge)',
|
|
85
|
+
fpsVisible: params.enabled
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (_e) {
|
|
89
|
+
}
|
|
90
|
+
}
|
|
51
91
|
try {
|
|
52
|
-
// Use stat fps as requested - shows FPS counter
|
|
53
|
-
// For more detailed timing info, use 'stat unit' instead
|
|
54
92
|
const command = params.enabled
|
|
55
93
|
? (params.verbose ? 'stat unit' : 'stat fps')
|
|
56
94
|
: 'stat none';
|
|
57
|
-
|
|
95
|
+
this.log.debug(`Executing command: ${command}`);
|
|
58
96
|
await this.bridge.executeConsoleCommand(command);
|
|
59
|
-
|
|
97
|
+
this.log.debug(`Command completed in ${Date.now() - startTime}ms`);
|
|
60
98
|
return {
|
|
61
99
|
success: true,
|
|
62
100
|
message: params.enabled ? 'FPS display enabled' : 'FPS display disabled',
|
|
@@ -72,17 +110,37 @@ export class PerformanceTools {
|
|
|
72
110
|
};
|
|
73
111
|
}
|
|
74
112
|
}
|
|
75
|
-
// Show performance stats
|
|
76
113
|
async showStats(params) {
|
|
114
|
+
if (this.automationBridge) {
|
|
115
|
+
try {
|
|
116
|
+
const response = await this.automationBridge.sendAutomationRequest('show_stats', {
|
|
117
|
+
category: params.category,
|
|
118
|
+
enabled: params.enabled
|
|
119
|
+
});
|
|
120
|
+
if (response.success)
|
|
121
|
+
return { success: true, message: `Stat '${params.category}' configured (bridge)` };
|
|
122
|
+
}
|
|
123
|
+
catch (_e) {
|
|
124
|
+
}
|
|
125
|
+
}
|
|
77
126
|
const command = params.enabled
|
|
78
127
|
? `stat ${params.category.toLowerCase()}`
|
|
79
128
|
: 'stat none';
|
|
80
129
|
return this.bridge.executeConsoleCommand(command);
|
|
81
130
|
}
|
|
82
|
-
// Set scalability settings using console commands
|
|
83
131
|
async setScalability(params) {
|
|
84
|
-
|
|
85
|
-
|
|
132
|
+
if (this.automationBridge) {
|
|
133
|
+
try {
|
|
134
|
+
const response = await this.automationBridge.sendAutomationRequest('set_scalability', {
|
|
135
|
+
category: params.category,
|
|
136
|
+
level: params.level
|
|
137
|
+
});
|
|
138
|
+
if (response.success)
|
|
139
|
+
return { success: true, message: `${params.category} quality set to level ${params.level} (bridge)` };
|
|
140
|
+
}
|
|
141
|
+
catch (_e) {
|
|
142
|
+
}
|
|
143
|
+
}
|
|
86
144
|
const categoryBaseMap = {
|
|
87
145
|
ViewDistance: 'ViewDistance',
|
|
88
146
|
AntiAliasing: 'AntiAliasing',
|
|
@@ -104,98 +162,35 @@ export class PerformanceTools {
|
|
|
104
162
|
};
|
|
105
163
|
}
|
|
106
164
|
const base = categoryBaseMap[params.category] || params.category;
|
|
107
|
-
// Use direct console command to set with highest priority (SetByConsole)
|
|
108
|
-
// This avoids conflicts with the scalability system
|
|
109
165
|
const setCommand = `sg.${base}Quality ${requestedLevel}`;
|
|
110
|
-
// Apply the console command directly
|
|
111
166
|
await this.bridge.executeConsoleCommand(setCommand);
|
|
112
|
-
// Skip GameUserSettings entirely to avoid any scalability triggers
|
|
113
|
-
// Console command already applied with correct priority
|
|
114
|
-
/* eslint-disable no-useless-escape */
|
|
115
|
-
const py = `
|
|
116
|
-
import unreal, json
|
|
117
|
-
result = {'success': True, 'category': '${base}', 'requested': ${requestedLevel}, 'actual': ${requestedLevel}, 'method': 'ConsoleOnly'}
|
|
118
|
-
|
|
119
|
-
# Simply verify the console variable was set correctly
|
|
120
|
-
try:
|
|
121
|
-
# Try to read the console variable directly to verify it was set
|
|
122
|
-
# This doesn't trigger any scalability system
|
|
123
|
-
import sys
|
|
124
|
-
from io import StringIO
|
|
125
|
-
|
|
126
|
-
# Capture console output
|
|
127
|
-
old_stdout = sys.stdout
|
|
128
|
-
sys.stdout = StringIO()
|
|
129
|
-
|
|
130
|
-
# Execute console command to query the value
|
|
131
|
-
try:
|
|
132
|
-
unreal.SystemLibrary.execute_console_command(None, 'sg.${base}Quality', None)
|
|
133
|
-
except:
|
|
134
|
-
pass
|
|
135
|
-
|
|
136
|
-
# Get the output
|
|
137
|
-
console_output = sys.stdout.getvalue()
|
|
138
|
-
sys.stdout = old_stdout
|
|
139
|
-
|
|
140
|
-
# Parse the output to get the actual value
|
|
141
|
-
if 'sg.${base}Quality' in console_output:
|
|
142
|
-
# Extract the value from output like 'sg.ShadowQuality = "3"'
|
|
143
|
-
import re
|
|
144
|
-
match = re.search(r'sg\.${base}Quality\\s*=\\s*"(\\d+)"', console_output)
|
|
145
|
-
if match:
|
|
146
|
-
result['actual'] = int(match.group(1))
|
|
147
|
-
result['verified'] = True
|
|
148
|
-
|
|
149
|
-
result['method'] = 'ConsoleOnly'
|
|
150
|
-
except Exception as e:
|
|
151
|
-
# Even on error, the console command was applied
|
|
152
|
-
result['method'] = 'ConsoleOnly'
|
|
153
|
-
result['note'] = str(e)
|
|
154
|
-
|
|
155
|
-
print('RESULT:' + json.dumps(result))
|
|
156
|
-
`.trim();
|
|
157
|
-
/* eslint-enable no-useless-escape */
|
|
158
|
-
// Always try to apply through Python for consistency
|
|
159
|
-
try {
|
|
160
|
-
const pyResp = await this.bridge.executePython(py);
|
|
161
|
-
const interpreted = interpretStandardResult(pyResp, {
|
|
162
|
-
successMessage: `${params.category} quality set to level ${requestedLevel}`,
|
|
163
|
-
failureMessage: `Failed to set ${params.category} quality`
|
|
164
|
-
});
|
|
165
|
-
if (interpreted.success) {
|
|
166
|
-
const actual = coerceNumber(interpreted.payload.actual) ?? requestedLevel;
|
|
167
|
-
const verified = coerceBoolean(interpreted.payload.success, true) === true && actual === requestedLevel;
|
|
168
|
-
return {
|
|
169
|
-
success: true,
|
|
170
|
-
message: interpreted.message,
|
|
171
|
-
verified,
|
|
172
|
-
readback: actual,
|
|
173
|
-
method: interpreted.payload.method || 'ConsoleOnly'
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
catch {
|
|
178
|
-
// Ignore Python errors and fall through
|
|
179
|
-
}
|
|
180
|
-
// If Python fails, the console command was still applied
|
|
181
167
|
return {
|
|
182
168
|
success: true,
|
|
183
169
|
message: `${params.category} quality set to level ${requestedLevel}`,
|
|
184
|
-
method: '
|
|
170
|
+
method: 'Console'
|
|
185
171
|
};
|
|
186
172
|
}
|
|
187
|
-
// Set resolution scale
|
|
188
173
|
async setResolutionScale(params) {
|
|
189
|
-
// Validate input
|
|
190
174
|
if (params.scale === undefined || params.scale === null || isNaN(params.scale)) {
|
|
191
175
|
return { success: false, error: 'Invalid scale parameter' };
|
|
192
176
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
177
|
+
let percentage;
|
|
178
|
+
if (params.scale >= 10) {
|
|
179
|
+
percentage = Math.round(params.scale);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
percentage = Math.round(params.scale * 100);
|
|
183
|
+
}
|
|
198
184
|
const finalPercentage = Math.max(10, Math.min(200, percentage));
|
|
185
|
+
if (this.automationBridge) {
|
|
186
|
+
try {
|
|
187
|
+
const response = await this.automationBridge.sendAutomationRequest('set_resolution_scale', { scale: finalPercentage });
|
|
188
|
+
if (response.success)
|
|
189
|
+
return { success: true, message: `Resolution scale set to ${finalPercentage}% (bridge)`, actualScale: finalPercentage / 100 };
|
|
190
|
+
}
|
|
191
|
+
catch (_e) {
|
|
192
|
+
}
|
|
193
|
+
}
|
|
199
194
|
const command = `r.ScreenPercentage ${finalPercentage}`;
|
|
200
195
|
try {
|
|
201
196
|
await this.bridge.executeConsoleCommand(command);
|
|
@@ -209,23 +204,53 @@ print('RESULT:' + json.dumps(result))
|
|
|
209
204
|
return { success: false, error: `Failed to set resolution scale: ${e}` };
|
|
210
205
|
}
|
|
211
206
|
}
|
|
212
|
-
// Enable/disable vsync
|
|
213
207
|
async setVSync(params) {
|
|
208
|
+
if (this.automationBridge) {
|
|
209
|
+
try {
|
|
210
|
+
const response = await this.automationBridge.sendAutomationRequest('set_vsync', { enabled: params.enabled });
|
|
211
|
+
if (response.success)
|
|
212
|
+
return { success: true, message: 'VSync configured (bridge)' };
|
|
213
|
+
}
|
|
214
|
+
catch (_e) {
|
|
215
|
+
}
|
|
216
|
+
}
|
|
214
217
|
const command = `r.VSync ${params.enabled ? 1 : 0}`;
|
|
215
218
|
return this.bridge.executeConsoleCommand(command);
|
|
216
219
|
}
|
|
217
|
-
// Set frame rate limit
|
|
218
220
|
async setFrameRateLimit(params) {
|
|
221
|
+
if (this.automationBridge) {
|
|
222
|
+
try {
|
|
223
|
+
const response = await this.automationBridge.sendAutomationRequest('set_frame_rate_limit', { maxFPS: params.maxFPS });
|
|
224
|
+
if (response.success)
|
|
225
|
+
return { success: true, message: 'Max FPS set (bridge)' };
|
|
226
|
+
}
|
|
227
|
+
catch (_e) {
|
|
228
|
+
}
|
|
229
|
+
}
|
|
219
230
|
const command = `t.MaxFPS ${params.maxFPS}`;
|
|
220
231
|
return this.bridge.executeConsoleCommand(command);
|
|
221
232
|
}
|
|
222
|
-
// Enable GPU timing
|
|
223
233
|
async enableGPUTiming(params) {
|
|
224
234
|
const command = `r.GPUStatsEnabled ${params.enabled ? 1 : 0}`;
|
|
225
235
|
return this.bridge.executeConsoleCommand(command);
|
|
226
236
|
}
|
|
227
|
-
// Memory report
|
|
228
237
|
async generateMemoryReport(params) {
|
|
238
|
+
if (this.automationBridge) {
|
|
239
|
+
try {
|
|
240
|
+
const response = await this.automationBridge.sendAutomationRequest('generate_memory_report', {
|
|
241
|
+
detailed: params.detailed ?? false,
|
|
242
|
+
outputPath: params.outputPath
|
|
243
|
+
});
|
|
244
|
+
if (response.success) {
|
|
245
|
+
return { success: true, message: response.message || 'Memory report generated' };
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
if (params.outputPath) {
|
|
250
|
+
return { success: false, error: `Failed to generate memory report: ${error instanceof Error ? error.message : String(error)}` };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
229
254
|
const commands = [];
|
|
230
255
|
if (params.detailed) {
|
|
231
256
|
commands.push('memreport -full');
|
|
@@ -234,43 +259,67 @@ print('RESULT:' + json.dumps(result))
|
|
|
234
259
|
commands.push('memreport');
|
|
235
260
|
}
|
|
236
261
|
if (params.outputPath) {
|
|
237
|
-
|
|
262
|
+
throw new Error('Saving memreport to a file requires Automation Bridge support');
|
|
238
263
|
}
|
|
239
264
|
await this.bridge.executeConsoleCommands(commands);
|
|
240
265
|
return { success: true, message: 'Memory report generated' };
|
|
241
266
|
}
|
|
242
|
-
// Texture streaming
|
|
243
267
|
async configureTextureStreaming(params) {
|
|
268
|
+
if (this.automationBridge) {
|
|
269
|
+
try {
|
|
270
|
+
const response = await this.automationBridge.sendAutomationRequest('configure_texture_streaming', {
|
|
271
|
+
enabled: params.enabled,
|
|
272
|
+
poolSize: params.poolSize,
|
|
273
|
+
boostPlayerLocation: params.boostPlayerLocation
|
|
274
|
+
});
|
|
275
|
+
if (response.success)
|
|
276
|
+
return { success: true, message: response.message || 'Texture streaming configured (bridge)' };
|
|
277
|
+
}
|
|
278
|
+
catch (_error) {
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (params.boostPlayerLocation && !this.automationBridge) {
|
|
282
|
+
throw new Error('Boosting player location for streaming requires Automation Bridge support');
|
|
283
|
+
}
|
|
244
284
|
const commands = [];
|
|
245
285
|
commands.push(`r.TextureStreaming ${params.enabled ? 1 : 0}`);
|
|
246
286
|
if (params.poolSize !== undefined) {
|
|
247
287
|
commands.push(`r.Streaming.PoolSize ${params.poolSize}`);
|
|
248
288
|
}
|
|
249
|
-
if (params.boostPlayerLocation !== undefined) {
|
|
250
|
-
commands.push(`r.Streaming.UseFixedPoolSize ${params.boostPlayerLocation ? 1 : 0}`);
|
|
251
|
-
}
|
|
252
289
|
await this.bridge.executeConsoleCommands(commands);
|
|
253
290
|
return { success: true, message: 'Texture streaming configured' };
|
|
254
291
|
}
|
|
255
|
-
// LOD settings
|
|
256
292
|
async configureLOD(params) {
|
|
293
|
+
if (this.automationBridge) {
|
|
294
|
+
try {
|
|
295
|
+
const response = await this.automationBridge.sendAutomationRequest('configure_lod', {
|
|
296
|
+
forceLOD: params.forceLOD,
|
|
297
|
+
lodBias: params.lodBias
|
|
298
|
+
});
|
|
299
|
+
if (params.distanceScale !== undefined) {
|
|
300
|
+
await this.bridge.executeConsoleCommand(`r.StaticMeshLODDistanceScale ${params.distanceScale}`);
|
|
301
|
+
await this.bridge.executeConsoleCommand(`r.SkeletalMeshLODDistanceScale ${params.distanceScale}`);
|
|
302
|
+
}
|
|
303
|
+
if (response.success)
|
|
304
|
+
return { success: true, message: 'LOD settings configured' };
|
|
305
|
+
}
|
|
306
|
+
catch (_e) {
|
|
307
|
+
}
|
|
308
|
+
}
|
|
257
309
|
const commands = [];
|
|
258
310
|
if (params.forceLOD !== undefined) {
|
|
259
311
|
commands.push(`r.ForceLOD ${params.forceLOD}`);
|
|
260
312
|
}
|
|
261
313
|
if (params.lodBias !== undefined) {
|
|
262
|
-
// Skeletal mesh LOD bias is an integer bias value
|
|
263
314
|
commands.push(`r.SkeletalMeshLODBias ${params.lodBias}`);
|
|
264
315
|
}
|
|
265
316
|
if (params.distanceScale !== undefined) {
|
|
266
|
-
// Apply distance scale to both static and skeletal meshes
|
|
267
317
|
commands.push(`r.StaticMeshLODDistanceScale ${params.distanceScale}`);
|
|
268
318
|
commands.push(`r.SkeletalMeshLODDistanceScale ${params.distanceScale}`);
|
|
269
319
|
}
|
|
270
320
|
await this.bridge.executeConsoleCommands(commands);
|
|
271
321
|
return { success: true, message: 'LOD settings configured' };
|
|
272
322
|
}
|
|
273
|
-
// Apply a baseline performance profile (explicit CVar enforcement)
|
|
274
323
|
async applyBaselinePerformanceSettings(params) {
|
|
275
324
|
const p = {
|
|
276
325
|
distanceScale: params?.distanceScale ?? 1.0,
|
|
@@ -290,32 +339,52 @@ print('RESULT:' + json.dumps(result))
|
|
|
290
339
|
await this.bridge.executeConsoleCommands(commands);
|
|
291
340
|
return { success: true, message: 'Baseline performance settings applied', params: p };
|
|
292
341
|
}
|
|
293
|
-
// Draw call optimization
|
|
294
342
|
async optimizeDrawCalls(params) {
|
|
343
|
+
if (params.mergeActors) {
|
|
344
|
+
if (this.automationBridge) {
|
|
345
|
+
try {
|
|
346
|
+
const actors = Array.isArray(params.actors)
|
|
347
|
+
? params.actors.filter((name) => typeof name === 'string' && name.length > 0)
|
|
348
|
+
: undefined;
|
|
349
|
+
if (!actors || actors.length < 2) {
|
|
350
|
+
return {
|
|
351
|
+
success: false,
|
|
352
|
+
error: 'Merge actors requires an "actors" array with at least 2 valid actor names.'
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
const payload = {
|
|
356
|
+
enableInstancing: params.enableInstancing,
|
|
357
|
+
enableBatching: params.enableBatching,
|
|
358
|
+
mergeActors: params.mergeActors,
|
|
359
|
+
actors: actors
|
|
360
|
+
};
|
|
361
|
+
const response = await this.automationBridge.sendAutomationRequest('merge_actors', payload);
|
|
362
|
+
return response.success
|
|
363
|
+
? { success: true, message: response.message || 'Actors merged for optimization' }
|
|
364
|
+
: { success: false, error: response.message || response.error || 'Failed to merge actors' };
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
return { success: false, error: `Failed to merge actors: ${error instanceof Error ? error.message : String(error)}` };
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
throw new Error('Actor merging requires Automation Bridge support');
|
|
371
|
+
}
|
|
295
372
|
const commands = [];
|
|
296
373
|
if (params.enableInstancing !== undefined) {
|
|
297
374
|
commands.push(`r.MeshDrawCommands.DynamicInstancing ${params.enableInstancing ? 1 : 0}`);
|
|
298
375
|
}
|
|
299
|
-
// Avoid using r.RHICmdBypass; it's a low-level debug toggle and not suitable for general batching control
|
|
300
|
-
if (params.mergeActors) {
|
|
301
|
-
commands.push('MergeActors');
|
|
302
|
-
}
|
|
303
376
|
await this.bridge.executeConsoleCommands(commands);
|
|
304
377
|
return { success: true, message: 'Draw call optimization configured' };
|
|
305
378
|
}
|
|
306
|
-
// Occlusion culling
|
|
307
379
|
async configureOcclusionCulling(params) {
|
|
308
380
|
const commands = [];
|
|
309
|
-
// Enable/disable HZB occlusion (boolean)
|
|
310
381
|
commands.push(`r.HZBOcclusion ${params.enabled ? 1 : 0}`);
|
|
311
|
-
// Optional freeze rendering toggle
|
|
312
382
|
if (params.freezeRendering !== undefined) {
|
|
313
383
|
commands.push(`FreezeRendering ${params.freezeRendering ? 1 : 0}`);
|
|
314
384
|
}
|
|
315
385
|
await this.bridge.executeConsoleCommands(commands);
|
|
316
386
|
return { success: true, message: 'Occlusion culling configured' };
|
|
317
387
|
}
|
|
318
|
-
// Shader compilation
|
|
319
388
|
async optimizeShaders(params) {
|
|
320
389
|
const commands = [];
|
|
321
390
|
if (params.compileOnDemand !== undefined) {
|
|
@@ -330,8 +399,26 @@ print('RESULT:' + json.dumps(result))
|
|
|
330
399
|
await this.bridge.executeConsoleCommands(commands);
|
|
331
400
|
return { success: true, message: 'Shader optimization configured' };
|
|
332
401
|
}
|
|
333
|
-
// Nanite settings
|
|
334
402
|
async configureNanite(params) {
|
|
403
|
+
if (this.automationBridge) {
|
|
404
|
+
try {
|
|
405
|
+
const response = await this.automationBridge.sendAutomationRequest('configure_nanite', {
|
|
406
|
+
enabled: params.enabled,
|
|
407
|
+
maxPixelsPerEdge: params.maxPixelsPerEdge,
|
|
408
|
+
streamingPoolSize: params.streamingPoolSize
|
|
409
|
+
});
|
|
410
|
+
if (params.maxPixelsPerEdge !== undefined) {
|
|
411
|
+
await this.bridge.executeConsoleCommand(`r.Nanite.MaxPixelsPerEdge ${params.maxPixelsPerEdge}`);
|
|
412
|
+
}
|
|
413
|
+
if (params.streamingPoolSize !== undefined) {
|
|
414
|
+
await this.bridge.executeConsoleCommand(`r.Nanite.StreamingPoolSize ${params.streamingPoolSize}`);
|
|
415
|
+
}
|
|
416
|
+
if (response.success)
|
|
417
|
+
return { success: true, message: 'Nanite configured' };
|
|
418
|
+
}
|
|
419
|
+
catch (_e) {
|
|
420
|
+
}
|
|
421
|
+
}
|
|
335
422
|
const commands = [];
|
|
336
423
|
commands.push(`r.Nanite ${params.enabled ? 1 : 0}`);
|
|
337
424
|
if (params.maxPixelsPerEdge !== undefined) {
|
|
@@ -343,7 +430,6 @@ print('RESULT:' + json.dumps(result))
|
|
|
343
430
|
await this.bridge.executeConsoleCommands(commands);
|
|
344
431
|
return { success: true, message: 'Nanite configured' };
|
|
345
432
|
}
|
|
346
|
-
// World Partition streaming
|
|
347
433
|
async configureWorldPartition(params) {
|
|
348
434
|
const commands = [];
|
|
349
435
|
commands.push(`wp.Runtime.EnableStreaming ${params.enabled ? 1 : 0}`);
|
|
@@ -356,14 +442,10 @@ print('RESULT:' + json.dumps(result))
|
|
|
356
442
|
await this.bridge.executeConsoleCommands(commands);
|
|
357
443
|
return { success: true, message: 'World Partition configured' };
|
|
358
444
|
}
|
|
359
|
-
// Benchmark
|
|
360
445
|
async runBenchmark(params) {
|
|
361
446
|
const duration = params.duration || 60;
|
|
362
|
-
// Start recording and GPU profiling
|
|
363
447
|
await this.bridge.executeConsoleCommands(['stat startfile', 'profilegpu']);
|
|
364
|
-
// Wait for the requested duration
|
|
365
448
|
await new Promise(resolve => setTimeout(resolve, duration * 1000));
|
|
366
|
-
// Stop recording and clear stats
|
|
367
449
|
await this.bridge.executeConsoleCommands(['stat stopfile', 'stat none']);
|
|
368
450
|
return { success: true, message: `Benchmark completed for ${duration} seconds` };
|
|
369
451
|
}
|
package/dist/tools/physics.d.ts
CHANGED
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import { UnrealBridge } from '../unreal-bridge.js';
|
|
2
|
+
import { AutomationBridge } from '../automation/index.js';
|
|
2
3
|
export declare class PhysicsTools {
|
|
3
4
|
private bridge;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*/
|
|
5
|
+
private automationBridge?;
|
|
6
|
+
constructor(bridge: UnrealBridge, automationBridge?: AutomationBridge | undefined);
|
|
7
|
+
setAutomationBridge(automationBridge?: AutomationBridge): void;
|
|
8
8
|
private findValidSkeletalMesh;
|
|
9
|
-
/**
|
|
10
|
-
* Setup Ragdoll Physics
|
|
11
|
-
* NOTE: Requires a valid skeletal mesh to create physics asset
|
|
12
|
-
* @param skeletonPath - Path to an existing skeletal mesh asset (required)
|
|
13
|
-
* @param physicsAssetName - Name for the new physics asset
|
|
14
|
-
* @param savePath - Directory to save the asset (default: /Game/Physics)
|
|
15
|
-
*/
|
|
16
9
|
setupRagdoll(params: {
|
|
17
10
|
skeletonPath: string;
|
|
18
11
|
physicsAssetName: string;
|
|
@@ -27,35 +20,7 @@ export declare class PhysicsTools {
|
|
|
27
20
|
twist?: number;
|
|
28
21
|
};
|
|
29
22
|
}>;
|
|
30
|
-
}): Promise<
|
|
31
|
-
success: true;
|
|
32
|
-
message: string;
|
|
33
|
-
path: string;
|
|
34
|
-
existingAsset?: boolean;
|
|
35
|
-
warnings?: string[];
|
|
36
|
-
details?: string[];
|
|
37
|
-
} | {
|
|
38
|
-
success: boolean;
|
|
39
|
-
message: string;
|
|
40
|
-
error: string | undefined;
|
|
41
|
-
warnings?: undefined;
|
|
42
|
-
details?: undefined;
|
|
43
|
-
} | {
|
|
44
|
-
success: false;
|
|
45
|
-
message: string;
|
|
46
|
-
error: string;
|
|
47
|
-
warnings: string[] | undefined;
|
|
48
|
-
details: string[] | undefined;
|
|
49
|
-
} | {
|
|
50
|
-
success: boolean;
|
|
51
|
-
error: string;
|
|
52
|
-
message?: undefined;
|
|
53
|
-
warnings?: undefined;
|
|
54
|
-
details?: undefined;
|
|
55
|
-
}>;
|
|
56
|
-
/**
|
|
57
|
-
* Create Physics Constraint
|
|
58
|
-
*/
|
|
23
|
+
}): Promise<any>;
|
|
59
24
|
createConstraint(params: {
|
|
60
25
|
name: string;
|
|
61
26
|
actor1: string;
|
|
@@ -78,9 +43,6 @@ export declare class PhysicsTools {
|
|
|
78
43
|
error: string;
|
|
79
44
|
message?: undefined;
|
|
80
45
|
}>;
|
|
81
|
-
/**
|
|
82
|
-
* Setup Chaos Destruction
|
|
83
|
-
*/
|
|
84
46
|
setupDestruction(params: {
|
|
85
47
|
meshPath: string;
|
|
86
48
|
destructionName: string;
|
|
@@ -103,9 +65,6 @@ export declare class PhysicsTools {
|
|
|
103
65
|
message?: undefined;
|
|
104
66
|
path?: undefined;
|
|
105
67
|
}>;
|
|
106
|
-
/**
|
|
107
|
-
* Configure Vehicle Physics
|
|
108
|
-
*/
|
|
109
68
|
configureVehicle(params: {
|
|
110
69
|
vehicleName: string;
|
|
111
70
|
vehicleType: 'Car' | 'Bike' | 'Tank' | 'Aircraft';
|
|
@@ -125,46 +84,27 @@ export declare class PhysicsTools {
|
|
|
125
84
|
gears: number[];
|
|
126
85
|
finalDriveRatio: number;
|
|
127
86
|
};
|
|
87
|
+
pluginDependencies?: string[];
|
|
128
88
|
}): Promise<{
|
|
129
89
|
success: boolean;
|
|
90
|
+
error: string;
|
|
91
|
+
missingPlugins: string[];
|
|
130
92
|
message: string;
|
|
131
|
-
|
|
93
|
+
warnings?: undefined;
|
|
132
94
|
} | {
|
|
133
95
|
success: boolean;
|
|
134
|
-
|
|
135
|
-
|
|
96
|
+
message: string;
|
|
97
|
+
warnings: string[];
|
|
98
|
+
error?: undefined;
|
|
99
|
+
missingPlugins?: undefined;
|
|
136
100
|
}>;
|
|
137
|
-
/**
|
|
138
|
-
* Apply Force or Impulse to Actor
|
|
139
|
-
*/
|
|
140
101
|
applyForce(params: {
|
|
141
102
|
actorName: string;
|
|
142
103
|
forceType: 'Force' | 'Impulse' | 'Velocity' | 'Torque';
|
|
143
104
|
vector: [number, number, number];
|
|
144
105
|
boneName?: string;
|
|
145
106
|
isLocal?: boolean;
|
|
146
|
-
}): Promise<
|
|
147
|
-
success: boolean;
|
|
148
|
-
message: string;
|
|
149
|
-
availableActors: string[] | undefined;
|
|
150
|
-
details: string[] | undefined;
|
|
151
|
-
error?: undefined;
|
|
152
|
-
} | {
|
|
153
|
-
success: boolean;
|
|
154
|
-
error: string;
|
|
155
|
-
availableActors: string[] | undefined;
|
|
156
|
-
details: string[] | undefined;
|
|
157
|
-
message?: undefined;
|
|
158
|
-
} | {
|
|
159
|
-
success: boolean;
|
|
160
|
-
error: string;
|
|
161
|
-
message?: undefined;
|
|
162
|
-
availableActors?: undefined;
|
|
163
|
-
details?: undefined;
|
|
164
|
-
}>;
|
|
165
|
-
/**
|
|
166
|
-
* Configure Cloth Simulation
|
|
167
|
-
*/
|
|
107
|
+
}): Promise<any>;
|
|
168
108
|
setupCloth(params: {
|
|
169
109
|
meshName: string;
|
|
170
110
|
clothPreset: 'Silk' | 'Leather' | 'Denim' | 'Rubber' | 'Custom';
|
|
@@ -185,9 +125,6 @@ export declare class PhysicsTools {
|
|
|
185
125
|
error: string;
|
|
186
126
|
message?: undefined;
|
|
187
127
|
}>;
|
|
188
|
-
/**
|
|
189
|
-
* Create Fluid Simulation (Niagara-based)
|
|
190
|
-
*/
|
|
191
128
|
createFluidSimulation(params: {
|
|
192
129
|
name: string;
|
|
193
130
|
fluidType: 'Water' | 'Smoke' | 'Fire' | 'Lava' | 'Custom';
|
|
@@ -209,5 +146,23 @@ export declare class PhysicsTools {
|
|
|
209
146
|
error: string;
|
|
210
147
|
message?: undefined;
|
|
211
148
|
}>;
|
|
149
|
+
setupPhysicsSimulation(params: {
|
|
150
|
+
meshPath?: string;
|
|
151
|
+
skeletonPath?: string;
|
|
152
|
+
physicsAssetName?: string;
|
|
153
|
+
savePath?: string;
|
|
154
|
+
}): Promise<{
|
|
155
|
+
success: boolean;
|
|
156
|
+
message: string;
|
|
157
|
+
error: string | undefined;
|
|
158
|
+
} | {
|
|
159
|
+
success: boolean;
|
|
160
|
+
message: string;
|
|
161
|
+
error?: undefined;
|
|
162
|
+
} | {
|
|
163
|
+
success: boolean;
|
|
164
|
+
error: string;
|
|
165
|
+
message?: undefined;
|
|
166
|
+
}>;
|
|
212
167
|
}
|
|
213
168
|
//# sourceMappingURL=physics.d.ts.map
|