ue-mcp 0.4.15 → 0.4.16
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/instructions.d.ts +1 -1
- package/dist/instructions.js +2 -1
- package/dist/instructions.js.map +1 -1
- package/dist/resolve.js +15 -5
- package/dist/resolve.js.map +1 -1
- package/dist/tools/asset.js +20 -3
- package/dist/tools/asset.js.map +1 -1
- package/package.json +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +266 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +5 -0
package/dist/instructions.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SERVER_INSTRUCTIONS = "UE-MCP: Unreal Engine editor bridge (C++ plugin) \u2014 19 category tools covering 300+ actions.\n\nEvery tool takes an \"action\" parameter that selects the operation. Call project(action=\"get_status\") first.\n\n\u2550\u2550\u2550 QUICK START \u2550\u2550\u2550\n1. project(action=\"get_status\") \u2014 check if the editor is connected\n2. If not connected: editor(action=\"start_editor\") to launch UE\n3. level(action=\"get_outliner\") \u2014 see what's in the current level\n4. asset(action=\"list\") \u2014 browse project assets\n5. reflection(action=\"reflect_class\", className=\"StaticMeshActor\") \u2014 understand any UE class\n6. demo(action=\"step\", stepIndex=1) through 19 \u2014 run the Neon Shrine demo to see the bridge in action\n7. demo(action=\"cleanup\") \u2014 clean up after the demo\n\n\u2550\u2550\u2550 TOOLS & ACTIONS \u2550\u2550\u2550\n\nproject \u2014 Project status, config INI, C++ source\n get_status, set_project, get_info, read_config, search_config, list_config_tags,\n set_config, read_cpp_header, read_module, list_modules, search_cpp\n\nasset \u2014 Assets: list, search, CRUD, import, datatables, textures\n list, search, read, read_properties, duplicate, rename, move, delete, save,\n import_static_mesh, import_skeletal_mesh, import_animation, import_texture,\n read_datatable, create_datatable, reimport_datatable, list_textures,\n get_texture_info, set_texture_settings\n\nblueprint \u2014 Blueprint reading, authoring, compilation\n read, list_variables, list_functions, read_graph, create, add_variable,\n set_variable_properties, create_function, delete_function, rename_function,\n add_node, delete_node, set_node_property, connect_pins, add_component,\n compile, list_node_types, search_node_types, create_interface, add_interface,\n add_event_dispatcher, list_graphs\n\nlevel \u2014 Level actors, selection, components, volumes, lights, splines\n get_outliner, place_actor, delete_actor, get_actor_details, move_actor,\n select, get_selected, add_component, set_component_property,\n get_current, load, save, list, create,\n spawn_volume, list_volumes, set_volume_properties,\n spawn_light, set_light_properties, build_lighting,\n get_spline_info, set_spline_points\n\nmaterial \u2014 Materials, shading, and graph authoring\n read, list_parameters, set_parameter, create_instance, create,\n set_shading_model, set_base_color, connect_texture,\n add_expression, connect_expressions, connect_to_property,\n list_expressions, delete_expression, list_expression_types, recompile\n\nanimation \u2014 Anim assets, skeletons, montages, blendspaces\n read_anim_blueprint, read_montage, read_sequence, read_blendspace, list,\n create_montage, create_anim_blueprint, create_blendspace, add_notify,\n get_skeleton_info, list_sockets, list_skeletal_meshes, get_physics_asset,\n create_sequence, set_bone_keyframes, get_bone_transforms,\n set_montage_sequence, set_montage_properties\n\nlandscape \u2014 Terrain sculpting, painting, layers\n get_info, list_layers, sample, list_splines, get_component,\n sculpt, paint_layer, set_material, add_layer_info, import_heightmap\n\npcg \u2014 Procedural Content Generation graphs\n list_graphs, read_graph, read_node_settings, get_components,\n get_component_details, create_graph, add_node, connect_nodes,\n set_node_settings, remove_node, execute, add_volume\n\nfoliage \u2014 Foliage painting and types\n list_types, get_settings, sample, paint, erase, create_type, set_settings\n\nniagara \u2014 VFX systems and graph authoring\n list, get_info, spawn, set_parameter, create,\n create_emitter, add_emitter, list_emitters, set_emitter_property,\n list_modules, get_emitter_info\n\naudio \u2014 Sound assets and playback\n list, play_at_location, spawn_ambient, create_cue, create_metasound\n\nwidget \u2014 UMG widgets and editor utilities\n read_tree, get_details, set_property, list, read_animations, create,\n create_utility_widget, run_utility_widget,\n create_utility_blueprint, run_utility_blueprint\n\neditor \u2014 Console, Python, PIE, viewport, sequencer, perf, build pipeline, logs\n execute_command, execute_python, set_property, play_in_editor,\n get_runtime_value, hot_reload, undo, redo,\n get_perf_stats, run_stat, set_scalability, capture_screenshot,\n get_viewport, set_viewport, focus_on_actor,\n create_sequence, get_sequence_info, add_sequence_track, play_sequence,\n build_all, build_geometry, build_hlod, validate_assets,\n get_build_status, cook_content,\n get_log, search_log, get_message_log,\n set_dialog_policy, clear_dialog_policy, get_dialog_policy,\n list_dialogs, respond_to_dialog\n\nreflection \u2014 UE class/struct/enum reflection, gameplay tags\n reflect_class, reflect_struct, reflect_enum, list_classes,\n list_tags, create_tag\n\ngameplay \u2014 Physics, collision, navigation, input, behavior trees, AI, game framework\n set_collision_profile, set_simulate_physics, set_collision_enabled,\n set_physics_properties, rebuild_navigation, get_navmesh_info,\n project_to_nav, spawn_nav_modifier,\n create_input_action, create_input_mapping, list_input_assets,\n list_behavior_trees, get_behavior_tree_info,\n create_blackboard, create_behavior_tree,\n create_eqs_query, list_eqs_queries,\n add_perception, configure_sense,\n create_state_tree, list_state_trees, add_state_tree_component,\n create_smart_object_def, add_smart_object_component,\n create_game_mode, create_game_state, create_player_controller,\n create_player_state, create_hud, set_world_game_mode, get_framework_info\n\ngas \u2014 Gameplay Ability System\n add_asc, create_attribute_set, add_attribute,\n create_ability, set_ability_tags,\n create_effect, set_effect_modifier,\n create_cue, get_info\n\nnetworking \u2014 Replication and networking\n set_replicates, set_property_replicated, configure_net_frequency,\n set_dormancy, set_net_load_on_client, set_always_relevant,\n set_only_relevant_to_owner, configure_cull_distance,\n set_priority, set_replicate_movement, get_info\n\ndemo \u2014 Neon Shrine demo scene\n step, cleanup\n\nfeedback \u2014 Agent feedback submission\n submit\n\n\u2550\u2550\u2550 TIPS \u2550\u2550\u2550\n\u2022 Start with level(action=\"get_outliner\") or asset(action=\"list\") to discover what's in the project.\n\u2022 Use reflection(action=\"reflect_class\") to understand any UE class's properties.\n\u2022 asset(action=\"search\", query=\"/Game/Characters/*\") accepts wildcards.\n\u2022 For BP scripting: blueprint(action=\"search_node_types\") \u2192 blueprint(action=\"add_node\") \u2192 blueprint(action=\"connect_pins\").\n\u2022 editor(action=\"execute_python\") is the escape hatch for any Unreal Python API call.\n\u2022 Animation tools need a skeleton path \u2014 use animation(action=\"list_skeletal_meshes\") to find it.\n\u2022 Editor lifecycle: editor(action=\"stop_editor\") / editor(action=\"start_editor\") / editor(action=\"restart_editor\") manage the UE process.\n\u2022 editor(action=\"hot_reload\") triggers Live Coding compilation without restarting the editor.\n\u2022 editor(action=\"focus_on_actor\", actorLabel=\"MyActor\") snaps the viewport to any actor.\n\u2022 Log output: editor(action=\"get_log\", category=\"LogMCPBridge\") to see bridge-specific logs.\n\n\u2550\u2550\u2550 FEEDBACK \u2550\u2550\u2550\nIf you had to use editor(action=\"execute_python\") as a workaround because a native tool\ncouldn't handle the task, keep a mental note of what you did and why. When your task is\ncomplete, tell the user:\n \"I had to use custom Python scripts to [describe what]. Would you like to submit\n feedback to help improve ue-mcp?\"\nIf the user agrees, call feedback(action=\"submit\") with:\n \u2022 title \u2014 short, generic description of the gap (no project-specific details)\n \u2022 summary \u2014 what was attempted and why the native tool fell short\n \u2022 pythonWorkaround \u2014 the Python code that was used\n \u2022 idealTool \u2014 what tool/action should handle this natively\nThis creates a GitHub issue so the maintainers can add proper support.\n";
|
|
1
|
+
export declare const SERVER_INSTRUCTIONS = "UE-MCP: Unreal Engine editor bridge (C++ plugin) \u2014 19 category tools covering 300+ actions.\n\nEvery tool takes an \"action\" parameter that selects the operation. Call project(action=\"get_status\") first.\n\n\u2550\u2550\u2550 QUICK START \u2550\u2550\u2550\n1. project(action=\"get_status\") \u2014 check if the editor is connected\n2. If not connected: editor(action=\"start_editor\") to launch UE\n3. level(action=\"get_outliner\") \u2014 see what's in the current level\n4. asset(action=\"list\") \u2014 browse project assets\n5. reflection(action=\"reflect_class\", className=\"StaticMeshActor\") \u2014 understand any UE class\n6. demo(action=\"step\", stepIndex=1) through 19 \u2014 run the Neon Shrine demo to see the bridge in action\n7. demo(action=\"cleanup\") \u2014 clean up after the demo\n\n\u2550\u2550\u2550 TOOLS & ACTIONS \u2550\u2550\u2550\n\nproject \u2014 Project status, config INI, C++ source\n get_status, set_project, get_info, read_config, search_config, list_config_tags,\n set_config, read_cpp_header, read_module, list_modules, search_cpp\n\nasset \u2014 Assets: list, search, CRUD, import, datatables, textures\n list, search, read, read_properties, duplicate, rename, move, delete, save,\n import_static_mesh, import_skeletal_mesh, import_animation, import_texture,\n read_datatable, create_datatable, reimport_datatable, list_textures,\n get_texture_info, set_texture_settings,\n add_socket, remove_socket, list_sockets\n\nblueprint \u2014 Blueprint reading, authoring, compilation\n read, list_variables, list_functions, read_graph, create, add_variable,\n set_variable_properties, create_function, delete_function, rename_function,\n add_node, delete_node, set_node_property, connect_pins, add_component,\n compile, list_node_types, search_node_types, create_interface, add_interface,\n add_event_dispatcher, list_graphs\n\nlevel \u2014 Level actors, selection, components, volumes, lights, splines\n get_outliner, place_actor, delete_actor, get_actor_details, move_actor,\n select, get_selected, add_component, set_component_property,\n get_current, load, save, list, create,\n spawn_volume, list_volumes, set_volume_properties,\n spawn_light, set_light_properties, build_lighting,\n get_spline_info, set_spline_points\n\nmaterial \u2014 Materials, shading, and graph authoring\n read, list_parameters, set_parameter, create_instance, create,\n set_shading_model, set_base_color, connect_texture,\n add_expression, connect_expressions, connect_to_property,\n list_expressions, delete_expression, list_expression_types, recompile\n\nanimation \u2014 Anim assets, skeletons, montages, blendspaces\n read_anim_blueprint, read_montage, read_sequence, read_blendspace, list,\n create_montage, create_anim_blueprint, create_blendspace, add_notify,\n get_skeleton_info, list_sockets, list_skeletal_meshes, get_physics_asset,\n create_sequence, set_bone_keyframes, get_bone_transforms,\n set_montage_sequence, set_montage_properties\n\nlandscape \u2014 Terrain sculpting, painting, layers\n get_info, list_layers, sample, list_splines, get_component,\n sculpt, paint_layer, set_material, add_layer_info, import_heightmap\n\npcg \u2014 Procedural Content Generation graphs\n list_graphs, read_graph, read_node_settings, get_components,\n get_component_details, create_graph, add_node, connect_nodes,\n set_node_settings, remove_node, execute, add_volume\n\nfoliage \u2014 Foliage painting and types\n list_types, get_settings, sample, paint, erase, create_type, set_settings\n\nniagara \u2014 VFX systems and graph authoring\n list, get_info, spawn, set_parameter, create,\n create_emitter, add_emitter, list_emitters, set_emitter_property,\n list_modules, get_emitter_info\n\naudio \u2014 Sound assets and playback\n list, play_at_location, spawn_ambient, create_cue, create_metasound\n\nwidget \u2014 UMG widgets and editor utilities\n read_tree, get_details, set_property, list, read_animations, create,\n create_utility_widget, run_utility_widget,\n create_utility_blueprint, run_utility_blueprint\n\neditor \u2014 Console, Python, PIE, viewport, sequencer, perf, build pipeline, logs\n execute_command, execute_python, set_property, play_in_editor,\n get_runtime_value, hot_reload, undo, redo,\n get_perf_stats, run_stat, set_scalability, capture_screenshot,\n get_viewport, set_viewport, focus_on_actor,\n create_sequence, get_sequence_info, add_sequence_track, play_sequence,\n build_all, build_geometry, build_hlod, validate_assets,\n get_build_status, cook_content,\n get_log, search_log, get_message_log,\n set_dialog_policy, clear_dialog_policy, get_dialog_policy,\n list_dialogs, respond_to_dialog\n\nreflection \u2014 UE class/struct/enum reflection, gameplay tags\n reflect_class, reflect_struct, reflect_enum, list_classes,\n list_tags, create_tag\n\ngameplay \u2014 Physics, collision, navigation, input, behavior trees, AI, game framework\n set_collision_profile, set_simulate_physics, set_collision_enabled,\n set_physics_properties, rebuild_navigation, get_navmesh_info,\n project_to_nav, spawn_nav_modifier,\n create_input_action, create_input_mapping, list_input_assets,\n list_behavior_trees, get_behavior_tree_info,\n create_blackboard, create_behavior_tree,\n create_eqs_query, list_eqs_queries,\n add_perception, configure_sense,\n create_state_tree, list_state_trees, add_state_tree_component,\n create_smart_object_def, add_smart_object_component,\n create_game_mode, create_game_state, create_player_controller,\n create_player_state, create_hud, set_world_game_mode, get_framework_info\n\ngas \u2014 Gameplay Ability System\n add_asc, create_attribute_set, add_attribute,\n create_ability, set_ability_tags,\n create_effect, set_effect_modifier,\n create_cue, get_info\n\nnetworking \u2014 Replication and networking\n set_replicates, set_property_replicated, configure_net_frequency,\n set_dormancy, set_net_load_on_client, set_always_relevant,\n set_only_relevant_to_owner, configure_cull_distance,\n set_priority, set_replicate_movement, get_info\n\ndemo \u2014 Neon Shrine demo scene\n step, cleanup\n\nfeedback \u2014 Agent feedback submission\n submit\n\n\u2550\u2550\u2550 TIPS \u2550\u2550\u2550\n\u2022 Start with level(action=\"get_outliner\") or asset(action=\"list\") to discover what's in the project.\n\u2022 Use reflection(action=\"reflect_class\") to understand any UE class's properties.\n\u2022 asset(action=\"search\", query=\"/Game/Characters/*\") accepts wildcards.\n\u2022 For BP scripting: blueprint(action=\"search_node_types\") \u2192 blueprint(action=\"add_node\") \u2192 blueprint(action=\"connect_pins\").\n\u2022 editor(action=\"execute_python\") is the escape hatch for any Unreal Python API call.\n\u2022 Animation tools need a skeleton path \u2014 use animation(action=\"list_skeletal_meshes\") to find it.\n\u2022 Editor lifecycle: editor(action=\"stop_editor\") / editor(action=\"start_editor\") / editor(action=\"restart_editor\") manage the UE process.\n\u2022 editor(action=\"hot_reload\") triggers Live Coding compilation without restarting the editor.\n\u2022 editor(action=\"focus_on_actor\", actorLabel=\"MyActor\") snaps the viewport to any actor.\n\u2022 Log output: editor(action=\"get_log\", category=\"LogMCPBridge\") to see bridge-specific logs.\n\n\u2550\u2550\u2550 FEEDBACK \u2550\u2550\u2550\nIf you had to use editor(action=\"execute_python\") as a workaround because a native tool\ncouldn't handle the task, keep a mental note of what you did and why. When your task is\ncomplete, tell the user:\n \"I had to use custom Python scripts to [describe what]. Would you like to submit\n feedback to help improve ue-mcp?\"\nIf the user agrees, call feedback(action=\"submit\") with:\n \u2022 title \u2014 short, generic description of the gap (no project-specific details)\n \u2022 summary \u2014 what was attempted and why the native tool fell short\n \u2022 pythonWorkaround \u2014 the Python code that was used\n \u2022 idealTool \u2014 what tool/action should handle this natively\nThis creates a GitHub issue so the maintainers can add proper support.\n";
|
package/dist/instructions.js
CHANGED
|
@@ -21,7 +21,8 @@ asset — Assets: list, search, CRUD, import, datatables, textures
|
|
|
21
21
|
list, search, read, read_properties, duplicate, rename, move, delete, save,
|
|
22
22
|
import_static_mesh, import_skeletal_mesh, import_animation, import_texture,
|
|
23
23
|
read_datatable, create_datatable, reimport_datatable, list_textures,
|
|
24
|
-
get_texture_info, set_texture_settings
|
|
24
|
+
get_texture_info, set_texture_settings,
|
|
25
|
+
add_socket, remove_socket, list_sockets
|
|
25
26
|
|
|
26
27
|
blueprint — Blueprint reading, authoring, compilation
|
|
27
28
|
read, list_variables, list_functions, read_graph, create, add_variable,
|
package/dist/instructions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuJlC,CAAC"}
|
package/dist/resolve.js
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* implement the fix, then pushes and opens a PR. Never merges to main.
|
|
7
7
|
*/
|
|
8
8
|
import { execSync, spawn } from "node:child_process";
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as os from "node:os";
|
|
11
|
+
import * as path from "node:path";
|
|
9
12
|
const RESET = "\x1b[0m";
|
|
10
13
|
const BOLD = "\x1b[1m";
|
|
11
14
|
const DIM = "\x1b[2m";
|
|
@@ -125,20 +128,27 @@ async function resolve() {
|
|
|
125
128
|
`4. Commit your changes with a message referencing #${issueNum}`,
|
|
126
129
|
`5. Do NOT push, create PRs, or make unrelated changes`,
|
|
127
130
|
].join("\n");
|
|
128
|
-
//
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
131
|
+
// Write prompt to a temp file so shell escaping can't mangle it
|
|
132
|
+
const promptFile = path.join(os.tmpdir(), `ue-mcp-resolve-${issueNum}.md`);
|
|
133
|
+
fs.writeFileSync(promptFile, prompt);
|
|
134
|
+
const claudeArgs = ["--print", "--dangerously-skip-permissions"];
|
|
132
135
|
console.log(` ${DIM}Launching Claude Code${ciMode ? " (CI mode)" : ""}...${RESET}`);
|
|
133
136
|
console.log("");
|
|
134
137
|
const exitCode = await new Promise((resolve) => {
|
|
135
138
|
const child = spawn("claude", claudeArgs, {
|
|
136
|
-
stdio: "inherit",
|
|
139
|
+
stdio: ["pipe", "inherit", "inherit"],
|
|
137
140
|
shell: true,
|
|
138
141
|
});
|
|
142
|
+
child.stdin.write(prompt);
|
|
143
|
+
child.stdin.end();
|
|
139
144
|
child.on("exit", resolve);
|
|
140
145
|
child.on("error", () => resolve(1));
|
|
141
146
|
});
|
|
147
|
+
// Clean up
|
|
148
|
+
try {
|
|
149
|
+
fs.unlinkSync(promptFile);
|
|
150
|
+
}
|
|
151
|
+
catch { /* ignore */ }
|
|
142
152
|
console.log("");
|
|
143
153
|
if (exitCode !== 0) {
|
|
144
154
|
console.log(` ${DIM}Claude exited with code ${exitCode}. Branch ${branch} preserved.${RESET}`);
|
package/dist/resolve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/asset.js
CHANGED
|
@@ -76,7 +76,12 @@ export const assetTool = categoryTool("asset", "Asset management: list, search,
|
|
|
76
76
|
delete: bp("delete_asset"),
|
|
77
77
|
save: bp("save_asset"),
|
|
78
78
|
set_mesh_material: bp("set_mesh_material"),
|
|
79
|
-
recenter_pivot: bp("recenter_pivot")
|
|
79
|
+
recenter_pivot: bp("recenter_pivot", (p) => {
|
|
80
|
+
const paths = p.assetPaths;
|
|
81
|
+
if (paths && paths.length > 0)
|
|
82
|
+
return { assetPaths: paths };
|
|
83
|
+
return { assetPath: p.assetPath };
|
|
84
|
+
}),
|
|
80
85
|
import_static_mesh: bp("import_static_mesh"),
|
|
81
86
|
import_skeletal_mesh: bp("import_skeletal_mesh"),
|
|
82
87
|
import_animation: bp("import_animation"),
|
|
@@ -87,6 +92,9 @@ export const assetTool = categoryTool("asset", "Asset management: list, search,
|
|
|
87
92
|
list_textures: bp("list_textures"),
|
|
88
93
|
get_texture_info: bp("get_texture_info"),
|
|
89
94
|
set_texture_settings: bp("set_texture_settings"),
|
|
95
|
+
add_socket: bp("add_socket"),
|
|
96
|
+
remove_socket: bp("remove_socket"),
|
|
97
|
+
list_sockets: bp("list_sockets", (p) => ({ assetPath: p.assetPath })),
|
|
90
98
|
}, `- list: List assets in directory. Params: directory?, typeFilter?, recursive?
|
|
91
99
|
- search: Search by name/class/path. Params: query, directory?, maxResults?, searchAll? (set searchAll=true to search all content roots including plugin paths like /GASP/, not just /Game/)
|
|
92
100
|
- read: Read asset via reflection. Params: assetPath
|
|
@@ -97,7 +105,7 @@ export const assetTool = categoryTool("asset", "Asset management: list, search,
|
|
|
97
105
|
- delete: Delete asset. Params: assetPath
|
|
98
106
|
- save: Save asset(s). Params: assetPath?
|
|
99
107
|
- set_mesh_material: Assign material to static mesh slot. Params: assetPath, materialPath, slotIndex?
|
|
100
|
-
- recenter_pivot: Move static mesh pivot to geometry center. Params: assetPath
|
|
108
|
+
- recenter_pivot: Move static mesh pivot to geometry center. Params: assetPath OR assetPaths (array — first mesh sets the reference pivot for all)
|
|
101
109
|
- import_static_mesh: Import from FBX/OBJ. Params: filePath, name?, packagePath?
|
|
102
110
|
- import_skeletal_mesh: Import from FBX. Params: filePath, name?, packagePath?, skeletonPath?
|
|
103
111
|
- import_animation: Import anim from FBX. Params: filePath, name?, packagePath?, skeletonPath?
|
|
@@ -107,7 +115,10 @@ export const assetTool = categoryTool("asset", "Asset management: list, search,
|
|
|
107
115
|
- reimport_datatable: Reimport from JSON. Params: assetPath, jsonPath?, jsonString?
|
|
108
116
|
- list_textures: List textures. Params: directory?, recursive?
|
|
109
117
|
- get_texture_info: Get texture details. Params: assetPath
|
|
110
|
-
- set_texture_settings: Set texture settings. Params: assetPath, settings
|
|
118
|
+
- set_texture_settings: Set texture settings. Params: assetPath, settings
|
|
119
|
+
- add_socket: Add socket to StaticMesh or SkeletalMesh. Params: assetPath, socketName, boneName? (skeletal only), relativeLocation?, relativeRotation?, relativeScale?
|
|
120
|
+
- remove_socket: Remove socket by name. Params: assetPath, socketName
|
|
121
|
+
- list_sockets: List sockets on a mesh. Params: assetPath`, {
|
|
111
122
|
assetPath: z.string().optional().describe("Asset path"),
|
|
112
123
|
directory: z.string().optional(), query: z.string().optional(),
|
|
113
124
|
maxResults: z.number().optional(), typeFilter: z.string().optional(),
|
|
@@ -124,5 +135,11 @@ export const assetTool = categoryTool("asset", "Asset management: list, search,
|
|
|
124
135
|
jsonPath: z.string().optional(), jsonString: z.string().optional(),
|
|
125
136
|
exportName: z.string().optional(), propertyName: z.string().optional(),
|
|
126
137
|
settings: z.record(z.unknown()).optional(),
|
|
138
|
+
assetPaths: z.array(z.string()).optional().describe("Array of asset paths (for recenter_pivot batch — first mesh sets reference pivot)"),
|
|
139
|
+
socketName: z.string().optional().describe("Socket name"),
|
|
140
|
+
boneName: z.string().optional().describe("Bone name (for skeletal mesh sockets)"),
|
|
141
|
+
relativeLocation: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe("Socket relative location"),
|
|
142
|
+
relativeRotation: z.object({ pitch: z.number(), yaw: z.number(), roll: z.number() }).optional().describe("Socket relative rotation"),
|
|
143
|
+
relativeScale: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe("Socket relative scale"),
|
|
127
144
|
});
|
|
128
145
|
//# sourceMappingURL=asset.js.map
|
package/dist/tools/asset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/tools/asset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,EAAE,EAAgB,MAAM,aAAa,CAAC;AAE7D,MAAM,CAAC,MAAM,SAAS,GAAY,YAAY,CAC5C,OAAO,EACP,iFAAiF,EACjF;IACE,IAAI,EAAE;QACJ,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAW,CAAC;YACzG,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC;YACxC,MAAM,UAAU,GAAI,CAAC,CAAC,UAAiC,EAAE,WAAW,EAAE,CAAC;YACvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;YACxE,MAAM,MAAM,GAA6E,EAAE,CAAC;YAC5F,SAAS,IAAI,CAAC,CAAS;gBACrB,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBAAC,IAAI,SAAS;4BAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBAAC,CAAC;yBAClD,CAAC;wBACJ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;wBAC5D,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM;4BAAE,SAAS;wBACjD,IAAI,UAAU,IAAI,GAAG,KAAK,UAAU;4BAAE,SAAS;wBAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;oBAChM,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,MAAM,MAAM,GAA4B,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YACpJ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC9C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,UAAU,GAAG,sBAAsB,CAAC,CAAC,SAAS,IAAI,QAAQ,iEAAiE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClL,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF;IACD,MAAM,EAAE;QACN,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;YAC9C,oFAAoF;YACpF,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,UAAU,GAAI,CAAC,CAAC,UAAqB,IAAI,EAAE,CAAC;gBAClD,MAAM,UAAU,GAAmC,EAAE,CAAC;gBACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAA4B,CAAC;oBAC5G,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC9C,UAAU,CAAC,IAAI,CAAC,GAAI,GAAG,CAAC,OAA0C,CAAC,CAAC;oBACtE,CAAC;oBACD,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU;wBAAE,MAAM;gBAC7C,CAAC;gBACD,OAAO;oBACL,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;oBACpB,WAAW,EAAE,KAAK;oBAClB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC;oBACpD,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;oBACxC,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;KACF;IACD,IAAI,EAAY,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAChE,eAAe,EAAE,EAAE,CAAC,uBAAuB,CAAC;IAC5C,SAAS,EAAO,EAAE,CAAC,iBAAiB,CAAC;IACrC,MAAM,EAAU,EAAE,CAAC,cAAc,CAAC;IAClC,IAAI,EAAY,EAAE,CAAC,YAAY,CAAC;IAChC,MAAM,EAAU,EAAE,CAAC,cAAc,CAAC;IAClC,IAAI,EAAY,EAAE,CAAC,YAAY,CAAC;IAChC,iBAAiB,EAAK,EAAE,CAAC,mBAAmB,CAAC;IAC7C,cAAc,EAAQ,EAAE,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/tools/asset.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -20,6 +20,12 @@
|
|
|
20
20
|
#include "Serialization/JsonSerializer.h"
|
|
21
21
|
#include "Misc/FileHelper.h"
|
|
22
22
|
|
|
23
|
+
// Mesh sockets
|
|
24
|
+
#include "Engine/StaticMesh.h"
|
|
25
|
+
#include "Engine/StaticMeshSocket.h"
|
|
26
|
+
#include "Engine/SkeletalMesh.h"
|
|
27
|
+
#include "Engine/SkeletalMeshSocket.h"
|
|
28
|
+
|
|
23
29
|
// Import tasks
|
|
24
30
|
#include "AssetImportTask.h"
|
|
25
31
|
#include "AssetToolsModule.h"
|
|
@@ -71,6 +77,11 @@ void FAssetHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
|
71
77
|
Registry.RegisterHandler(TEXT("set_mesh_material"), &SetMeshMaterial);
|
|
72
78
|
Registry.RegisterHandler(TEXT("recenter_pivot"), &RecenterPivot);
|
|
73
79
|
|
|
80
|
+
// Socket handlers
|
|
81
|
+
Registry.RegisterHandler(TEXT("add_socket"), &AddSocket);
|
|
82
|
+
Registry.RegisterHandler(TEXT("remove_socket"), &RemoveSocket);
|
|
83
|
+
Registry.RegisterHandler(TEXT("list_sockets"), &ListSockets);
|
|
84
|
+
|
|
74
85
|
// Additional DataTable handlers
|
|
75
86
|
Registry.RegisterHandler(TEXT("create_datatable"), &CreateDataTable);
|
|
76
87
|
Registry.RegisterHandler(TEXT("read_datatable"), &ReadDataTable);
|
|
@@ -1771,3 +1782,258 @@ TSharedPtr<FJsonValue> FAssetHandlers::ReimportDataTable(const TSharedPtr<FJsonO
|
|
|
1771
1782
|
|
|
1772
1783
|
return MakeShared<FJsonValueObject>(Result);
|
|
1773
1784
|
}
|
|
1785
|
+
|
|
1786
|
+
// ─── Socket Handlers ──────────────────────────────────────────────
|
|
1787
|
+
|
|
1788
|
+
TSharedPtr<FJsonValue> FAssetHandlers::AddSocket(const TSharedPtr<FJsonObject>& Params)
|
|
1789
|
+
{
|
|
1790
|
+
FString AssetPath = Params->GetStringField(TEXT("assetPath"));
|
|
1791
|
+
FString SocketName = Params->GetStringField(TEXT("socketName"));
|
|
1792
|
+
|
|
1793
|
+
if (AssetPath.IsEmpty() || SocketName.IsEmpty())
|
|
1794
|
+
{
|
|
1795
|
+
return MakeShared<FJsonValueString>(TEXT("Error: assetPath and socketName are required"));
|
|
1796
|
+
}
|
|
1797
|
+
|
|
1798
|
+
FVector RelLoc = FVector::ZeroVector;
|
|
1799
|
+
FRotator RelRot = FRotator::ZeroRotator;
|
|
1800
|
+
FVector RelScale = FVector::OneVector;
|
|
1801
|
+
|
|
1802
|
+
if (const TSharedPtr<FJsonObject>* LocObj; Params->TryGetObjectField(TEXT("relativeLocation"), LocObj))
|
|
1803
|
+
{
|
|
1804
|
+
RelLoc.X = (*LocObj)->GetNumberField(TEXT("x"));
|
|
1805
|
+
RelLoc.Y = (*LocObj)->GetNumberField(TEXT("y"));
|
|
1806
|
+
RelLoc.Z = (*LocObj)->GetNumberField(TEXT("z"));
|
|
1807
|
+
}
|
|
1808
|
+
if (const TSharedPtr<FJsonObject>* RotObj; Params->TryGetObjectField(TEXT("relativeRotation"), RotObj))
|
|
1809
|
+
{
|
|
1810
|
+
RelRot.Pitch = (*RotObj)->GetNumberField(TEXT("pitch"));
|
|
1811
|
+
RelRot.Yaw = (*RotObj)->GetNumberField(TEXT("yaw"));
|
|
1812
|
+
RelRot.Roll = (*RotObj)->GetNumberField(TEXT("roll"));
|
|
1813
|
+
}
|
|
1814
|
+
if (const TSharedPtr<FJsonObject>* ScaleObj; Params->TryGetObjectField(TEXT("relativeScale"), ScaleObj))
|
|
1815
|
+
{
|
|
1816
|
+
RelScale.X = (*ScaleObj)->GetNumberField(TEXT("x"));
|
|
1817
|
+
RelScale.Y = (*ScaleObj)->GetNumberField(TEXT("y"));
|
|
1818
|
+
RelScale.Z = (*ScaleObj)->GetNumberField(TEXT("z"));
|
|
1819
|
+
}
|
|
1820
|
+
|
|
1821
|
+
UObject* Asset = LoadObject<UObject>(nullptr, *AssetPath);
|
|
1822
|
+
if (!Asset)
|
|
1823
|
+
{
|
|
1824
|
+
return MakeShared<FJsonValueString>(FString::Printf(TEXT("Error: could not load asset '%s'"), *AssetPath));
|
|
1825
|
+
}
|
|
1826
|
+
|
|
1827
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
1828
|
+
|
|
1829
|
+
// Try StaticMesh first
|
|
1830
|
+
if (UStaticMesh* SM = Cast<UStaticMesh>(Asset))
|
|
1831
|
+
{
|
|
1832
|
+
// Check for duplicate
|
|
1833
|
+
for (UStaticMeshSocket* Existing : SM->Sockets)
|
|
1834
|
+
{
|
|
1835
|
+
if (Existing && Existing->SocketName == FName(*SocketName))
|
|
1836
|
+
{
|
|
1837
|
+
return MakeShared<FJsonValueString>(FString::Printf(TEXT("Error: socket '%s' already exists"), *SocketName));
|
|
1838
|
+
}
|
|
1839
|
+
}
|
|
1840
|
+
|
|
1841
|
+
UStaticMeshSocket* NewSocket = NewObject<UStaticMeshSocket>(SM);
|
|
1842
|
+
NewSocket->SocketName = FName(*SocketName);
|
|
1843
|
+
NewSocket->RelativeLocation = RelLoc;
|
|
1844
|
+
NewSocket->RelativeRotation = RelRot;
|
|
1845
|
+
NewSocket->RelativeScale = RelScale;
|
|
1846
|
+
SM->Sockets.Add(NewSocket);
|
|
1847
|
+
SM->MarkPackageDirty();
|
|
1848
|
+
SM->PostEditChange();
|
|
1849
|
+
|
|
1850
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
1851
|
+
Result->SetStringField(TEXT("socketName"), SocketName);
|
|
1852
|
+
Result->SetStringField(TEXT("meshType"), TEXT("StaticMesh"));
|
|
1853
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
1854
|
+
}
|
|
1855
|
+
|
|
1856
|
+
// Try SkeletalMesh
|
|
1857
|
+
if (USkeletalMesh* SKM = Cast<USkeletalMesh>(Asset))
|
|
1858
|
+
{
|
|
1859
|
+
FString BoneName = Params->GetStringField(TEXT("boneName"));
|
|
1860
|
+
if (BoneName.IsEmpty()) BoneName = TEXT("root");
|
|
1861
|
+
|
|
1862
|
+
// Check for duplicate
|
|
1863
|
+
for (USkeletalMeshSocket* Existing : SKM->GetMeshOnlySocketList())
|
|
1864
|
+
{
|
|
1865
|
+
if (Existing && Existing->SocketName == FName(*SocketName))
|
|
1866
|
+
{
|
|
1867
|
+
return MakeShared<FJsonValueString>(FString::Printf(TEXT("Error: socket '%s' already exists"), *SocketName));
|
|
1868
|
+
}
|
|
1869
|
+
}
|
|
1870
|
+
|
|
1871
|
+
USkeletalMeshSocket* NewSocket = NewObject<USkeletalMeshSocket>(SKM);
|
|
1872
|
+
NewSocket->SocketName = FName(*SocketName);
|
|
1873
|
+
NewSocket->BoneName = FName(*BoneName);
|
|
1874
|
+
NewSocket->RelativeLocation = RelLoc;
|
|
1875
|
+
NewSocket->RelativeRotation = RelRot;
|
|
1876
|
+
NewSocket->RelativeScale = RelScale;
|
|
1877
|
+
SKM->GetMeshOnlySocketList().Add(NewSocket);
|
|
1878
|
+
SKM->MarkPackageDirty();
|
|
1879
|
+
SKM->PostEditChange();
|
|
1880
|
+
|
|
1881
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
1882
|
+
Result->SetStringField(TEXT("socketName"), SocketName);
|
|
1883
|
+
Result->SetStringField(TEXT("boneName"), BoneName);
|
|
1884
|
+
Result->SetStringField(TEXT("meshType"), TEXT("SkeletalMesh"));
|
|
1885
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
1886
|
+
}
|
|
1887
|
+
|
|
1888
|
+
return MakeShared<FJsonValueString>(FString::Printf(TEXT("Error: '%s' is not a StaticMesh or SkeletalMesh"), *AssetPath));
|
|
1889
|
+
}
|
|
1890
|
+
|
|
1891
|
+
TSharedPtr<FJsonValue> FAssetHandlers::RemoveSocket(const TSharedPtr<FJsonObject>& Params)
|
|
1892
|
+
{
|
|
1893
|
+
FString AssetPath = Params->GetStringField(TEXT("assetPath"));
|
|
1894
|
+
FString SocketName = Params->GetStringField(TEXT("socketName"));
|
|
1895
|
+
|
|
1896
|
+
if (AssetPath.IsEmpty() || SocketName.IsEmpty())
|
|
1897
|
+
{
|
|
1898
|
+
return MakeShared<FJsonValueString>(TEXT("Error: assetPath and socketName are required"));
|
|
1899
|
+
}
|
|
1900
|
+
|
|
1901
|
+
UObject* Asset = LoadObject<UObject>(nullptr, *AssetPath);
|
|
1902
|
+
if (!Asset)
|
|
1903
|
+
{
|
|
1904
|
+
return MakeShared<FJsonValueString>(FString::Printf(TEXT("Error: could not load asset '%s'"), *AssetPath));
|
|
1905
|
+
}
|
|
1906
|
+
|
|
1907
|
+
if (UStaticMesh* SM = Cast<UStaticMesh>(Asset))
|
|
1908
|
+
{
|
|
1909
|
+
for (int32 i = 0; i < SM->Sockets.Num(); ++i)
|
|
1910
|
+
{
|
|
1911
|
+
if (SM->Sockets[i] && SM->Sockets[i]->SocketName == FName(*SocketName))
|
|
1912
|
+
{
|
|
1913
|
+
SM->Sockets.RemoveAt(i);
|
|
1914
|
+
SM->MarkPackageDirty();
|
|
1915
|
+
SM->PostEditChange();
|
|
1916
|
+
|
|
1917
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
1918
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
1919
|
+
Result->SetStringField(TEXT("removed"), SocketName);
|
|
1920
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
1921
|
+
}
|
|
1922
|
+
}
|
|
1923
|
+
return MakeShared<FJsonValueString>(FString::Printf(TEXT("Error: socket '%s' not found on StaticMesh"), *SocketName));
|
|
1924
|
+
}
|
|
1925
|
+
|
|
1926
|
+
if (USkeletalMesh* SKM = Cast<USkeletalMesh>(Asset))
|
|
1927
|
+
{
|
|
1928
|
+
TArray<USkeletalMeshSocket*>& Sockets = SKM->GetMeshOnlySocketList();
|
|
1929
|
+
for (int32 i = 0; i < Sockets.Num(); ++i)
|
|
1930
|
+
{
|
|
1931
|
+
if (Sockets[i] && Sockets[i]->SocketName == FName(*SocketName))
|
|
1932
|
+
{
|
|
1933
|
+
Sockets.RemoveAt(i);
|
|
1934
|
+
SKM->MarkPackageDirty();
|
|
1935
|
+
SKM->PostEditChange();
|
|
1936
|
+
|
|
1937
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
1938
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
1939
|
+
Result->SetStringField(TEXT("removed"), SocketName);
|
|
1940
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
1941
|
+
}
|
|
1942
|
+
}
|
|
1943
|
+
return MakeShared<FJsonValueString>(FString::Printf(TEXT("Error: socket '%s' not found on SkeletalMesh"), *SocketName));
|
|
1944
|
+
}
|
|
1945
|
+
|
|
1946
|
+
return MakeShared<FJsonValueString>(FString::Printf(TEXT("Error: '%s' is not a StaticMesh or SkeletalMesh"), *AssetPath));
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1949
|
+
TSharedPtr<FJsonValue> FAssetHandlers::ListSockets(const TSharedPtr<FJsonObject>& Params)
|
|
1950
|
+
{
|
|
1951
|
+
FString AssetPath = Params->GetStringField(TEXT("assetPath"));
|
|
1952
|
+
if (AssetPath.IsEmpty())
|
|
1953
|
+
{
|
|
1954
|
+
return MakeShared<FJsonValueString>(TEXT("Error: assetPath is required"));
|
|
1955
|
+
}
|
|
1956
|
+
|
|
1957
|
+
UObject* Asset = LoadObject<UObject>(nullptr, *AssetPath);
|
|
1958
|
+
if (!Asset)
|
|
1959
|
+
{
|
|
1960
|
+
return MakeShared<FJsonValueString>(FString::Printf(TEXT("Error: could not load asset '%s'"), *AssetPath));
|
|
1961
|
+
}
|
|
1962
|
+
|
|
1963
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
1964
|
+
TArray<TSharedPtr<FJsonValue>> SocketArray;
|
|
1965
|
+
|
|
1966
|
+
if (UStaticMesh* SM = Cast<UStaticMesh>(Asset))
|
|
1967
|
+
{
|
|
1968
|
+
for (UStaticMeshSocket* Socket : SM->Sockets)
|
|
1969
|
+
{
|
|
1970
|
+
if (!Socket) continue;
|
|
1971
|
+
TSharedPtr<FJsonObject> S = MakeShared<FJsonObject>();
|
|
1972
|
+
S->SetStringField(TEXT("name"), Socket->SocketName.ToString());
|
|
1973
|
+
S->SetStringField(TEXT("tag"), Socket->Tag);
|
|
1974
|
+
|
|
1975
|
+
TSharedPtr<FJsonObject> Loc = MakeShared<FJsonObject>();
|
|
1976
|
+
Loc->SetNumberField(TEXT("x"), Socket->RelativeLocation.X);
|
|
1977
|
+
Loc->SetNumberField(TEXT("y"), Socket->RelativeLocation.Y);
|
|
1978
|
+
Loc->SetNumberField(TEXT("z"), Socket->RelativeLocation.Z);
|
|
1979
|
+
S->SetObjectField(TEXT("relativeLocation"), Loc);
|
|
1980
|
+
|
|
1981
|
+
TSharedPtr<FJsonObject> Rot = MakeShared<FJsonObject>();
|
|
1982
|
+
Rot->SetNumberField(TEXT("pitch"), Socket->RelativeRotation.Pitch);
|
|
1983
|
+
Rot->SetNumberField(TEXT("yaw"), Socket->RelativeRotation.Yaw);
|
|
1984
|
+
Rot->SetNumberField(TEXT("roll"), Socket->RelativeRotation.Roll);
|
|
1985
|
+
S->SetObjectField(TEXT("relativeRotation"), Rot);
|
|
1986
|
+
|
|
1987
|
+
TSharedPtr<FJsonObject> Scale = MakeShared<FJsonObject>();
|
|
1988
|
+
Scale->SetNumberField(TEXT("x"), Socket->RelativeScale.X);
|
|
1989
|
+
Scale->SetNumberField(TEXT("y"), Socket->RelativeScale.Y);
|
|
1990
|
+
Scale->SetNumberField(TEXT("z"), Socket->RelativeScale.Z);
|
|
1991
|
+
S->SetObjectField(TEXT("relativeScale"), Scale);
|
|
1992
|
+
|
|
1993
|
+
SocketArray.Add(MakeShared<FJsonValueObject>(S));
|
|
1994
|
+
}
|
|
1995
|
+
Result->SetStringField(TEXT("meshType"), TEXT("StaticMesh"));
|
|
1996
|
+
}
|
|
1997
|
+
else if (USkeletalMesh* SKM = Cast<USkeletalMesh>(Asset))
|
|
1998
|
+
{
|
|
1999
|
+
for (USkeletalMeshSocket* Socket : SKM->GetMeshOnlySocketList())
|
|
2000
|
+
{
|
|
2001
|
+
if (!Socket) continue;
|
|
2002
|
+
TSharedPtr<FJsonObject> S = MakeShared<FJsonObject>();
|
|
2003
|
+
S->SetStringField(TEXT("name"), Socket->SocketName.ToString());
|
|
2004
|
+
S->SetStringField(TEXT("boneName"), Socket->BoneName.ToString());
|
|
2005
|
+
|
|
2006
|
+
TSharedPtr<FJsonObject> Loc = MakeShared<FJsonObject>();
|
|
2007
|
+
Loc->SetNumberField(TEXT("x"), Socket->RelativeLocation.X);
|
|
2008
|
+
Loc->SetNumberField(TEXT("y"), Socket->RelativeLocation.Y);
|
|
2009
|
+
Loc->SetNumberField(TEXT("z"), Socket->RelativeLocation.Z);
|
|
2010
|
+
S->SetObjectField(TEXT("relativeLocation"), Loc);
|
|
2011
|
+
|
|
2012
|
+
TSharedPtr<FJsonObject> Rot = MakeShared<FJsonObject>();
|
|
2013
|
+
Rot->SetNumberField(TEXT("pitch"), Socket->RelativeRotation.Pitch);
|
|
2014
|
+
Rot->SetNumberField(TEXT("yaw"), Socket->RelativeRotation.Yaw);
|
|
2015
|
+
Rot->SetNumberField(TEXT("roll"), Socket->RelativeRotation.Roll);
|
|
2016
|
+
S->SetObjectField(TEXT("relativeRotation"), Rot);
|
|
2017
|
+
|
|
2018
|
+
TSharedPtr<FJsonObject> Scale = MakeShared<FJsonObject>();
|
|
2019
|
+
Scale->SetNumberField(TEXT("x"), Socket->RelativeScale.X);
|
|
2020
|
+
Scale->SetNumberField(TEXT("y"), Socket->RelativeScale.Y);
|
|
2021
|
+
Scale->SetNumberField(TEXT("z"), Socket->RelativeScale.Z);
|
|
2022
|
+
S->SetObjectField(TEXT("relativeScale"), Scale);
|
|
2023
|
+
|
|
2024
|
+
SocketArray.Add(MakeShared<FJsonValueObject>(S));
|
|
2025
|
+
}
|
|
2026
|
+
Result->SetStringField(TEXT("meshType"), TEXT("SkeletalMesh"));
|
|
2027
|
+
}
|
|
2028
|
+
else
|
|
2029
|
+
{
|
|
2030
|
+
return MakeShared<FJsonValueString>(FString::Printf(TEXT("Error: '%s' is not a StaticMesh or SkeletalMesh"), *AssetPath));
|
|
2031
|
+
}
|
|
2032
|
+
|
|
2033
|
+
Result->SetStringField(TEXT("assetPath"), AssetPath);
|
|
2034
|
+
Result->SetNumberField(TEXT("socketCount"), SocketArray.Num());
|
|
2035
|
+
Result->SetArrayField(TEXT("sockets"), SocketArray);
|
|
2036
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
2037
|
+
|
|
2038
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2039
|
+
}
|
|
@@ -45,4 +45,9 @@ private:
|
|
|
45
45
|
static TSharedPtr<FJsonValue> ListTextureProperties(const TSharedPtr<FJsonObject>& Params);
|
|
46
46
|
static TSharedPtr<FJsonValue> SetTextureProperties(const TSharedPtr<FJsonObject>& Params);
|
|
47
47
|
static TSharedPtr<FJsonValue> ImportTexture(const TSharedPtr<FJsonObject>& Params);
|
|
48
|
+
|
|
49
|
+
// Socket handlers
|
|
50
|
+
static TSharedPtr<FJsonValue> AddSocket(const TSharedPtr<FJsonObject>& Params);
|
|
51
|
+
static TSharedPtr<FJsonValue> RemoveSocket(const TSharedPtr<FJsonObject>& Params);
|
|
52
|
+
static TSharedPtr<FJsonValue> ListSockets(const TSharedPtr<FJsonObject>& Params);
|
|
48
53
|
};
|