Print view · Fundamentals · 7 pagesChoose "Save as PDF" as the destination in the print dialog.
Back to the docs

Mesh Morpher documentation

Fundamentals

7 pages · exported 2026-09-11 · https://meshmorpher.com/docs/studio-and-graph/fundamentals

Studio and Graph

Fundamentals

The reference for the application itself: its window, its panels, the graph editor, what travels on a wire, and how your work is saved.

This is the reference for the application itself - the window, its panels, the graph canvas, and the files it reads and writes - not for any individual node. Node behaviour is documented node by node elsewhere; these pages explain the shell everything runs inside, once, so the node pages do not have to repeat it. For a fast walkthrough instead of a reference, see Getting Started.

  • The Window - the menu bar, the main toolbar, the document tab strip, and the Welcome screen.
  • Panels - the six dockable panels, what each one shows, and how docking and layout behave.
  • Working in the Graph - navigating the canvas, the Add Node menu, comment boxes, search, the minimap, and subgraphs.
  • Nodes and Wires - reading a node card, the out-of-date rule, and the rules that govern wiring.
  • Pins and Data Types - what a pin is, and the full set of data types that travel across wires.
  • Files, Autosave and Recovery - the .mmgraph format, saving, autosave, crash recovery, and node presets.

Studio and Graph › Fundamentals

The Window

The menu bar, the toolbar, the document tabs and the welcome screen, entry by entry.

The menu bar sits at the very top of the window, above the main toolbar and the document tab strip. Four pull-down menus, in this order: File (tooltip: "File operations"), Edit (tooltip: "Edit operations"), Window (tooltip: "Switch panels") and Help (tooltip: "Help and about").

This build has no Ctrl+S, Ctrl+N or Ctrl+O. New Graph, Open and Save exist only as menu entries and toolbar buttons - no File menu entry carries a keyboard shortcut.

File menu

Three groups, in this order: Graph, Node Sharing, Application.

Entry What it does Shortcut
New Graph Creates a new, empty, untitled graph, adds it as a document tab and switches to it. Tooltip: "Create a new empty graph" none
Open... Opens an OS file picker titled "Open Mesh Morpher graph", starting in the project's Saved folder and filtered to Mesh Morpher Graph (*.mmgraph). The chosen file opens in a new document tab; tabs already open stay open. Tooltip: "Open a .mmgraph file" none
Recent Files A submenu of your last five opened or saved graphs - see below. Tooltip: "Reopen a recently opened or saved graph" none
Save... Opens an OS save dialog titled "Save Mesh Morpher graph". Always asks for a destination - there is no silent save over the current file. Tooltip: "Save the current graph" none
Import Node... Opens an OS file picker titled "Import Node Preset", starting in the user preset folder and filtered to Mesh Morpher Node (*.mmnode), then opens the Import Node Preset dialog (see Files, Autosave and Recovery). Tooltip: "Open a .mmnode file and install it or place it into the current graph." none
Exit Standalone build: closes the app window, running the unsaved-changes prompts first (see Files, Autosave and Recovery). Hosted inside the Unreal Editor: closes only the Mesh Morpher tab, never the editor. Tooltip: "Close the application" none

Opening a file that is already open in another document tab does not open a second copy - it focuses the existing tab and shows the toast Already open: {filename}. Opening one of the shipped example graphs, from anywhere including Open... or Recent Files, never opens the shipped file in place - see the Welcome screen section below.

Recent Files submenu

Recent Files lists up to five entries, newest first. Each row's label is the file's plain filename; its tooltip is the full absolute path. Clicking a row opens that file. If the file no longer exists, the app removes it from the list and shows the toast File no longer exists: {full path} - the list prunes itself rather than leaving dead entries behind. A file is added to the list both when it is opened and when it is saved, and reopening a file already in the list moves it to the top instead of duplicating it. When the list is empty, it shows a single, permanently disabled entry: No recent files.

This is the same list that fills the Welcome screen's Recent files column (see below).

Edit menu

Four groups: Selection, Clipboard, Organize, Application. Shortcuts are rebindable in Settings; the defaults are listed below.

Entry What it does Shortcut
Select All Selects every node and every comment box visible in the current graph scope. Nodes hidden inside a collapsed subgraph card are not selected. Tooltip: "Select every node and comment in the graph" Ctrl+A
Delete Deletes the selected nodes and comments in one undoable step. Deleting a collapsed subgraph card also deletes its contents. Tooltip: "Delete the selected nodes and comments" Delete (BackSpace also works; held modifier keys make no difference)
Cut Copy, then delete. Tooltip: "Cut the selected nodes" Ctrl+X
Copy Copies the selection to the OS clipboard. Copying a collapsed card also copies its contents recursively. Tooltip: "Copy the selected nodes" Ctrl+C
Paste Pastes the clipboard. From this menu entry, the paste lands near the top-left of the visible canvas rather than at the view centre (see Working in the Graph for the exact difference from Ctrl+V). Tooltip: "Paste from the clipboard" Ctrl+V
Duplicate Copies the selection and pastes it at the view centre, offset by (40, 40). Tooltip: "Duplicate the selected nodes" Ctrl+D
Add Comment With a selection, wraps it in a comment box. With nothing selected, drops a comment box at the mouse cursor, or at the view centre when the cursor is off canvas. Tooltip: "Add a comment box covering the current selection" C
Rename Graph... Opens a small window titled "Rename Graph" with the prompt "New graph name:", pre-filled with the current name. Committing sets both the document tab label and the graph's display name - which is also the default filename the Save dialog suggests, and the faint watermark drawn in the canvas's bottom-right corner. Empty or whitespace names are ignored. Tooltip: "Set the user-visible name shown on the tab and as the watermark" none
Settings... Opens the Settings window. Single instance - if it is already open, it is brought to front instead of opening a second one. Tooltip: "Open the settings panel" none

Window menu

One group, Panels. All five entries are check-box toggles whose tick reflects whether that panel's tab is currently open. None of them has a tooltip.

Entry What it does Shortcut
Viewport Ticked when the panel is open. Clicking a ticked entry closes the tab (the layout remembers where it was); clicking an unticked entry reopens it in its remembered place. none
Graph Same toggle behaviour. none
Details Same. none
Agentic Same. none
Scene Same. none

Target Viewport is deliberately absent from this menu. It manages itself and cannot be closed - see Panels. The Window menu is the only in-app way to reopen a panel you closed, aside from three gestures that auto-foreground one: activating a tool foregrounds Details, clicking a document tab foregrounds Graph, and a viewport capture foregrounds Viewport.

Help menu

Eight entries, no section headings.

Entry What it does Shortcut
Welcome Opens the Welcome window (single instance) - see below. Tooltip: "Example graphs, recent files, and a new empty graph." none
Node Documentation Opens a resizable window titled "Node Documentation" (1180x760): a browser of every node with screenshots, pins and variables. The same window the ? button on a node card opens (see Nodes and Wires), but with no node preselected. Single instance. Tooltip: "Browse every node: screenshots, pins, and variables explained" none
AI Model Packs... Opens a window titled "AI Model Packs" (700x380) for downloading or managing the optional AI model packs. Single instance. Tooltip: "Download or manage the optional AI model packs." none
Check for Updates... Asks the update server immediately. On a newer version, a Yes/No dialog reads Version {0} is available. Open the updater?; up to date shows You're up to date (version {0}).; failure shows Update check failed: {0}. Tooltip: "Check the update server for a newer version now." none
Collect Diagnostics... Opens a resizable window titled "Collect Diagnostics" (720x620) that lists exactly what will go in before writing anything, with an Open Crash Folder button and a Create Bundle button. Single instance. Tooltip: "Gather logs, crash reports and machine details into one file you can attach to a support message. Shows you exactly what goes in first, and never includes keys, tokens or your graphs." none
Open Crash Folder Creates the crashes folder if it does not exist yet, then reveals it in the OS file browser. Tooltip: "Show the folder where crash reports and minidumps are written." none
Third-Party Notices Opens a resizable window titled "Third-Party Notices" (860x660). Single instance. Tooltip: "Licences and attributions for the software included in Mesh Morpher." none
About Mesh Morpher Opens a fixed-size window (600x470) with the app name, version, credits and links. Single instance. Tooltip: "Version and credits" none

Main toolbar

A slim toolbar directly under the menu bar, in two sections separated by a divider. No button is ever disabled, and none has a keyboard shortcut.

Button What it does Shortcut
New Same as File > New Graph. Tooltip: "Create a new empty graph" none
Open Same as File > Open.... Tooltip: "Open a .mmgraph file" none
Save Same as File > Save... - always shows the save dialog. Tooltip: "Save the current graph" none
Settings Same as Edit > Settings.... Tooltip: "Open the settings panel" none

Document tab strip

A separate row, below the toolbar, listing open .mmgraph documents - not panels.

  • The tab label is the document's display name, bold when active. An asterisk * is appended while the document has unsaved changes.
  • The active tab gets a thin accent-coloured bar underneath it.
  • Clicking a tab foregrounds the Graph panel (reopening it if it is closed), then switches documents.
  • The x close button closes that document. Tooltip: "Close this graph"
  • The + button, at the trailing end of the strip, opens a new untitled document. Tooltip: "Open a new graph in a tab"

A new tab's name is decided in this priority order: an explicit title if one was given, otherwise the graph's stored display name (from the .mmgraph file), otherwise the file's base name, otherwise Untitled-N, where N increases by one for each new untitled tab in the session.

Closing the last document does not leave you with nothing - a fresh untitled document is created automatically.

Switching tabs while a tool has unbaked edits prompts you first:

You have unsaved tool edits on the current node.

Yes - accept and bake the changes before switching.
No  - discard the changes and switch.
Cancel - stay on this tab.

A similarly shaped prompt appears when closing a document or the app instead - see Files, Autosave and Recovery.

Welcome screen

The Welcome screen opens automatically at startup, unless you have ticked Don't show this again, and it never appears when the app was launched by double-clicking a .mmgraph file. It waits behind any startup modal (such as a graphics-device warning) before appearing. Reopen it any time with Help > Welcome.

It has two columns.

Start from an example (left column) lists one scrollable button per shipped example, its title in bold and its description underneath. Every button carries the same tooltip:

"Copies the shipped example into your Starters folder and opens the copy. The original in the app's Resources folder is never touched, and clicking again gives you another fresh copy rather than reusing the one you have been working in."

Opening an example always gives you a private copy. Clicking an example closes the Welcome window, then creates and opens a fresh copy in %LOCALAPPDATA%/MeshMorpher/Starters/. Clicking the same example again does not reuse that copy - it makes another one, suffixed -2, -3, and so on.

Below the list, a Browse the example files... button is visible only when the shipped .mmgraph files are actually on disk. It is the only button in the dialog that does not close it; its tooltip: "Shows the folder holding the example graphs as ordinary .mmgraph files, so they can be read, copied or shared. It is part of the installation, so treat it as read-only - open an example from the list above to get an editable copy."

Recent files (right column) mirrors the same list as File > Recent Files. When it is empty, it reads "Nothing yet. Graphs you open or save show up here." Otherwise it lists one button per recent file - filename in bold, folder underneath, full path in the tooltip - and clicking one goes through the same self-healing path as the menu entry. A bottom button, Open other graph... (tooltip: "Browse for a .mmgraph file."), closes the dialog and opens the normal Open dialog instead.

The footer holds three controls:

Control Label What it does
Check box Don't show this again Tooltip: "Stops this screen opening at startup. Help > Welcome brings it back at any time." Persists immediately on tick, not on close. A future release with new welcome content shows the screen again once even to users who ticked it.
Button New empty graph Tooltip: "Open a new, empty graph tab." Closes the dialog and creates a new untitled document.
Button Close Closes the dialog.

Studio and Graph › Fundamentals

Panels

What each of the six panels shows, how docking and layout behave, and how to get a closed panel back.

The six panels

All six panels live under one workspace category, Panels, and none of them can be turned into a floating sidebar drawer - they can only be docked, tabbed together, or torn off into a floating window.

Panel What it shows Closable
Viewport The source 3D preview, plus up to three node-driven strips that travel with it: a side tower panel, a per-tool strip above the viewport, and a node-provided tool toolbar below it. Each strip collapses to zero size when the selected node supplies no content for it. See Viewport and Sculpt Tools for what appears inside those strips. Yes
Target Viewport A second, read-only preview pane, for comparing a result against a reference side by side. Fully automatic - see Docking below. No
Graph The node canvas for whichever document tab is active - see Working in the Graph. Yes
Details The property editor for the single selected node or comment box, or an active tool's settings. Yes
Agentic The in-app AI assistant chat. Yes
Scene The outliner: everything currently in the preview scene. Yes

Details

With nothing selected, Details reads:

Select a node to edit its properties

With exactly one comment box selected, it becomes a Comment Box editor: Text (multi-line), Color (with a Pick... button), Position (X/Y), Size (W/H), and a Delete Comment button.

A multi-selection clears the panel. With a single node selected, Details adds an Actions section of clickable node actions - this is where action nodes run, see the Introduction - plus a per-node timing readout once the node has run.

A property that is currently driven by a connected pin is locked, with this tooltip:

Driven by the "{0}" pin - disconnect it to edit this value.

Scene

Columns: a visibility check box, Object (the object's name plus a role line), and an Isolate button. The header strip reads {N} object(s) and carries a Show All button.

Roles: Edit target, Target pane, Reference (view only), Animation (view only), Extra (view only).

When the list is empty:

No objects in the preview.

The preview shows the mesh pins of the node selected in the graph. Select a node that carries a mesh to populate this list.

When it is not empty, a footer reads:

Rows come from the selected graph node's mesh pins, so this list changes with the graph selection. Tools edit the "Edit target" row only.

Other exact strings:

Element Tooltip
Visibility check box Show or hide this object in the preview viewport.
Visibility check box, locked This is the mesh the active tool is editing, so it cannot be hidden. Close or accept the tool first.
Isolate / Exit (label flips) Show only this object. Press again to restore the previous visibility of every object.
Show All Leave isolate mode and make every object visible.

Visibility and isolate state reset every time the active document tab changes - they belong to the document, not to the app as a whole.

Docking

The panel area is a real dock area: panels can be resized, reordered, docked anywhere, tabbed together, and torn off into floating windows, in the packaged app and inside the editor alike.

Default arrangement: left column is Viewport, with Target Viewport as a closed second stack beside it; right column is Graph on top (70%) over a stack of Details / Agentic / Scene below (30%), with Details foregrounded.

Layout is remembered. The dock layout is written to MMAppLayout.json and flushed on window close, window deactivate (alt-tab) and window move. A saved layout that fails to parse falls back to the built-in default. Window position, size and maximised state are remembered too, though not while the window is minimised, and a saved size below 320x240 is rejected on the next launch. When Mesh Morpher is hosted inside the Unreal Editor, window geometry is not persisted.

Closing a panel does not destroy its state. Every panel wraps an existing widget, so closing its tab destroys only the tab shell - the panel and everything in it survives, and reopening it shows it exactly as you left it. Reopen a closed panel from the Window menu. Nothing reopens a closed panel on a passive event such as selecting a node - only three explicit gestures do: activating a tool foregrounds Details, clicking a document tab foregrounds Graph, and a viewport capture foregrounds Viewport. Floating panel windows are destroyed only on a real app or tab close, never on alt-tab.

Target Viewport manages itself. It opens by itself whenever the selected node has a "Secondary" preview mesh input pin - connected or not - or explicitly asks for it, and it removes itself when the selection changes to a node that does not. It starts empty until something is wired in, on purpose, so it does not pop open and shut while you make the connection. It has no close button, cannot be closed by middle-click, the tab-well menu or Ctrl+W, and does not appear in the Window menu at all.

There is no command to reset the layout back to the default arrangement. If your panels end up somewhere inconvenient, redock them by hand.

Studio and Graph › Fundamentals

Working in the Graph

Moving around the canvas, adding nodes, commenting, searching, and collapsing work into subgraphs.

Canvas navigation

Gesture Result
Middle-mouse drag Pan
Right-mouse drag Pan (once the drag passes the OS drag threshold)
Right-mouse click on empty canvas Opens the Add Node menu at that point
Left-drag on empty canvas Marquee-selects every node and comment box that intersects the box. Hold Ctrl or Shift to add to the current selection.
Left-click on empty canvas (no drag) Clears the selection
Mouse wheel Zoom, one discrete step per notch, centred on the cursor
F Frame the selection if there is one, otherwise frame the whole graph
Ctrl+F Opens the Find panel - see below
Double-click a wire Inserts a Reroute knot on it, splitting the wire in two, in one undo step
Double-click a subgraph card Steps into it
Esc Closes the Find panel if it is open; otherwise steps out one subgraph level

Zoom ladder: the wheel steps through a fixed set of levels rather than a smooth range: 0.10, 0.15, 0.25, 0.375, 0.50, 0.625, 0.75, 0.825, 0.875, 0.925, 0.95, 0.975, 1.00, 1.125, 1.25, 1.50, 1.75, 2.00.

Framing never magnifies past 1:1. Pressing F snaps its target zoom down to the nearest level on that same ladder and caps it at 1.00, so framing a small selection never zooms in past actual size. Comments are only included in the frame when you frame the whole graph, not when you frame a selection.

The Add Node menu

Right-click empty canvas, or drop a wire onto empty canvas, to open it. Its header reads Add Node normally, or Compatible with {0} when it was opened by dropping a wire, where {0} is the pin category you dragged from (one of struct, float, int, bool, object, string, name, text, enum, byte, real, double, int64, vector3, wildcard, texture2d or generate_settings).

How search matches: typing in the search field filters live. A node matches if your text appears, case-insensitively, in its displayed title, its short name, its raw class name, its category path (so typing a category name surfaces everything under it - see the category map in the Introduction), or its tooltip. An installed node preset (see Files, Autosave and Recovery) matches on its title, author, category or description instead.

Below the search field: an Add Comment entry; an Insert Simulation Template submenu of ready-made cloth, garment and flesh setups, shown only when simulation nodes are enabled for this install and you did not open the menu by dropping a wire; an Installed Nodes submenu listing every node preset installed on this machine, shown only when at least one is installed (and never offered in wire-drop mode, because a preset's pin surface is not known without placing it); and finally the full node catalogue, a nested tree built from each node's category path, sorted alphabetically, with every category collapsible.

Compatible-with filtering: when you drag a wire out and drop it on empty canvas, only nodes that have at least one pin of the opposite direction whose category is compatible with the pin you dragged from are listed - including the schema's scalar-override coercion exception, and, for struct pins, only nodes whose pin names the same struct type. The picker never offers a node the connection would then refuse, and never refuses one the connection would have accepted.

Auto-wiring: picking a node this way wires it in the same gesture. The graph tries an exact struct-shape match first - so dragging from a Mesh pin prefers offering a Mesh pin over a Selection pin on the new node - then falls back to a category-only match.

Comment boxes

Create one with C, Edit > Add Comment, the Add Node menu's Add Comment entry, or a node's right-click Add Comment Around Selection (see Nodes and Wires). A new box is titled Comment, coloured from the theme's info colour, and sized at least 60x40 free-standing (80x80 once you start resizing it).

Double-click the title bar to rename it in place. Drag anywhere on the body to move the box - this also moves every node it encloses. Drag an edge or corner to resize it. Right-clicking a comment does nothing special - the click falls through to the canvas, so pan and Add Node still work; text, colour, position, size and a Delete Comment button all live in the Details panel instead.

Comments live only at the top level of a graph - they are not drawn inside a subgraph card.

Find panel

Open it with Ctrl+F. It floats over the top-right of the canvas, with a field hinting Find node by title, class or comment; your previous query is pre-selected when you reopen it.

Press Enter in the field to jump to the best hit (not whatever the list happens to have selected); press Down to move focus into the results list instead. Esc closes the panel from the field, the list or the canvas. Each result row shows the node's title with its class name underneath, plus (in subgraph) when the node lives inside a collapsed card. The status line reads No matching nodes, or {0} of {1} nodes, and the list is capped at 50 results.

Clicking or entering a result selects that node, steps into any subgraph cards needed to reach it, and frames it - the panel stays open afterwards so you can try the next hit. Typing in the field never affects the canvas itself, so searching for a node named "Cone" cannot accidentally create a comment box.

Minimap

Bottom-right corner of the canvas, with a toggle button underneath labelled Hide Map or Show Map depending on its state. Tooltip: "Show or hide the graph overview map. Remembered between sessions." It is visible by default, and the setting is remembered between sessions.

It draws every node and comment as a small box (never smaller than 2 px), the selected node outlined, and a rectangle showing the current view. Click or drag on the map to jump the canvas there; right-click, middle-click and the wheel are swallowed so they never reach the canvas underneath, and a double-click is routed to the same jump rather than being able to split a wire beneath the map. The toggle button never takes keyboard focus, so clicking it does not steal focus from the canvas.

Copy, paste and duplicate

Ctrl+C or Edit > Copy copies the selection to the OS clipboard in an internal format, carrying every selected node's properties and pin bytes, the wires between them, and any selected comments. Copying a collapsed subgraph card copies its contents recursively. Only wires whose both ends are inside the selection are copied, and a selection larger than 512 MB is refused silently (logged, not shown).

Paste accepts either that internal format or a shared text envelope (from Copy as Shareable Text - see Nodes and Wires); if the clipboard holds a shared envelope, pasting opens the Import Node Preset dialog instead of placing nodes directly. A clipboard the app does not recognise shows the toast Paste failed / The clipboard does not contain a MeshMorpher node selection or a shared node's text.

Pasting from the menu is not the same as pasting with the keyboard. Edit > Paste always lands the pasted nodes near the top-left of the visible canvas, at a fixed graph position. Pressing Ctrl+V instead pastes at the view centre.

Ctrl+D or Edit > Duplicate copies the selection and pastes it at the view centre, offset by (40, 40) - duplicates appear in the middle of the view rather than beside the original.

Subgraphs

Collapsing: select nodes and right-click Collapse to Subgraph (or Collapse {N} Nodes to Subgraph). Wires that cross the boundary become pins on the new card; nothing already inside is rewired, and this is the only way to create a meaningful subgraph card - there is no equivalent entry in the Add Node menu.

Entering: double-click the card, or right-click it and choose Edit Subgraph Contents. Only that card's contents are drawn while you are inside it, your selection is cleared, and the editor restores that subgraph's own last pan and zoom rather than reframing.

Breadcrumb: a small bar at the top-left of the canvas reads GraphName > Card > Card, with every crumb except the current one a clickable button (tooltip: "Go back to this level."). The root crumb uses the graph's display name, or "Graph" if it has none; a card whose node has been deleted shows "Subgraph". The bar is entirely absent at the top level of the graph.

Leaving: press Esc, or click a breadcrumb - either way, the card you just stepped out of is left selected.

Promoted pins: right-click an interior pin's connector and choose Promote to Subgraph Pin to add a connector for it on the card, with or without a wire attached - see Nodes and Wires for the full set of pin-menu entries.

Nodes you create while inside a card - from the picker, a paste, a drop, or an Agentic tool - are adopted into that card even though the tools themselves always add at the top level first; you never lose track of something you just placed.

Deleting a subgraph card deletes its contents. It is still one undo step, so Ctrl+Z restores everything, but there is no separate "delete card only" option.

Copying a card copies its contents the same way. Select All, marquee-select and Frame all operate only on the subgraph scope you are currently viewing, never reaching into cards you have not entered.

Studio and Graph › Fundamentals

Nodes and Wires

The node card and its message strip, the rule that keeps an out-of-date result, and every reason a connection is refused.

The node card

The title bar is coloured by the node's category, may carry a small class icon, and shows the node's title - ellipsised if it is too long to fit, with the full title in its tooltip.

A small round ? button sits in the top-right corner of the title bar. Its tooltip: "View node documentation". Clicking it opens the Node Documentation window (see The Window) on that specific node's page.

The message strip is a coloured footer across the bottom of the card, visible only when the node has a message or a stale output to report. It has four severities: None, Info, Warning and Error, each with its own strip colour from the app's theme. The strip text always ellipsises to one line; the strip itself is the hover target, and its tooltip carries the full message.

The out-of-date rule, in full

When an input to a node changes after that node has already produced a result, Mesh Morpher does not throw the old result away. The message strip shows:

Inputs changed - re-run to update

in the warning colour, even though nothing has actually gone wrong. Hovering it shows the full tooltip:

This node's '{0}' output was computed from earlier input and is now out of date. It has been kept rather than overwritten - re-run the node to update it.

where {0} is the name of the affected output pin, or a comma-joined list if more than one pin is affected.

What this means in practice: the node's previous output is kept exactly as it was computed, not silently replaced by the new, unprocessed input. Press the node's own button under Details > Actions to recompute it and clear the flag.

The out-of-date flag is transient - it is never written into the .mmgraph file. See Files, Autosave and Recovery for what the file does and does not store.

Wiring rules

Connections are always stored output to input - see Pins and Data Types.

Rule What happens
A node cannot be wired to itself Rejected. Logged: "Cannot wire a node to itself."
The dragged-from pin must be an output Rejected. Logged: "Source pin must be an output."
The dropped-on pin must be an input Rejected. Logged: "Target pin must be an input."
The two pins' categories must be compatible (or the target must allow scalar-override coercion) Rejected. Logged: "Pin types {0} and {1} are incompatible."
Two struct pins must carry the same struct type Rejected. Logged: "Struct pins carry different types ({0} vs {1})."
The new wire must not create a cycle Rejected. Logged: "Connection would introduce a cycle."
A connection is rejected Silent in the UI - the reason is written to the log only, and nothing is added to the undo history.
A second wire is dropped on an input pin that only accepts one connection The previous wire is disconnected automatically and the new one takes its place, in the same undo step.
You Ctrl+drag from a connector that already has a wire This moves the wire instead of making a new one (see below), rather than starting a fresh connection.

Ctrl+drag to move a wire: holding Ctrl and dragging from a wired connector picks up the far end of that wire instead of starting a new one. Nothing is broken until you release: the new connection is made first and the old one removed second, so dropping somewhere the connection is rejected leaves the original wire intact. Dropping back onto the pin you grabbed is a no-op. Dropping on empty canvas cancels the move without opening the Add Node menu, so the move can never accidentally duplicate the link. Because the gesture is decided the moment you press the mouse button, releasing Ctrl partway through cannot turn it into something destructive. The undo entry is labelled Move Link.

Dropping a wire on empty canvas instead opens the Add Node menu filtered to compatible nodes and auto-wires whatever you pick - see Working in the Graph.

Right-click a pin

Section Entry Tooltip
Subgraph Interface (only while editing inside a subgraph card) Promote to Subgraph Pin Put this pin on the subgraph card as a connector, with or without a wire. No wire is changed.
Keep as Subgraph Pin (shown instead once a boundary wire already created the connector) Keep this connector on the subgraph card even after the wire is broken.
Remove from Subgraph Pins Take this connector off the subgraph card. No wire is touched. Greyed out while a wire still crosses the boundary, with the tooltip "Cannot remove: a wire still crosses the subgraph boundary here, and the card's connector is the only place it can be drawn. Break the wire first."
Break Connection (only when the pin has wires) Break link to {NodeTitle . PinName} - one entry per wire Break this single connection
Break All Pin Links (only when the pin has more than one wire) Break every connection on this pin

If a pin has no wires and cannot be promoted to a subgraph pin, right-clicking it falls through to the canvas menu instead of showing an empty one.

Right-click a node

Right-clicking a node that is not already selected selects it first. The menu's title is the node's own title, or {N} Nodes when several are selected.

Section Entry Tooltip Notes
(title) Copy Copy the selected node(s) to the clipboard. Hidden on an unavailable-class placeholder
Cut Copy the selected node(s) and remove them. Hidden on a placeholder
Duplicate Create a copy of the selected node(s). Hidden on a placeholder
Delete Remove the selected node(s) from the graph. Always available
Connections Break All Links Disconnect every wire into and out of the selected node(s). Disabled when the selection has no connections; whole section hidden on a placeholder
Wrangle Add Classic Mesh Setup Declares the classic Mesh/Mask/Reference/Weights layout in one click - the same action as the pin editor's own button. Only offered while this node has declared nothing yet. Only on a Wrangle node that has declared no parameters and no outputs yet
Subgraph Collapse to Subgraph / Collapse {N} Nodes to Subgraph Group the selected node(s) into one named card. Wires that cross the boundary become pins on the card; nothing is rewired, and Expand puts everything back exactly as it was. Offered even for a placeholder
Edit Subgraph Contents Show only this card's contents. Use the breadcrumb at the top left to come back. Only on a subgraph card
Expand Subgraph Put this card's nodes back into the graph and remove the card. Only on a subgraph card
Share Copy as Shareable Text Copy the selected node(s) to the clipboard as text anyone can paste into their own graph - a forum post, a chat message, an email. Minimal metadata; use "Export Node Preset..." for a file with a title and description. Hidden on a placeholder
Export Node Preset... Save the selected node(s) to a .mmnode file, with a title, author and description you fill in. Hidden on a placeholder
Save to My Presets... Install the selected node(s) into your local preset library, so they show up in the "Installed Nodes" section of the Add Node menu on this machine. Hidden on a placeholder
Organise Add Comment Around Selection Wrap the selected node(s) in a comment box.
Frame Selection Pan and zoom to fit the selected node(s).
Help View Documentation Open this node's reference page. Same target as the ? button on the card

A node whose class this build cannot resolve is locked to select, inspect and delete only - Copy, Cut, Duplicate, Connections and Share are all left off its menu (this is the first of the two placeholder states below).

Two placeholder states

A node whose type this build does not have

When a saved graph references a node class this build cannot resolve, it loads as a placeholder instead of being dropped. Its title reads {LeafClassName} (unavailable), or plainly Unavailable Node if even the class name is missing, coloured a desaturated grey rather than error red. Its tooltip:

This node's type is not available in this build: {ClassPath}

Its settings, pin layout and connections have been preserved exactly and will be written back unchanged when you save, so nothing is lost. The node cannot run, and its properties cannot be edited, until a build that provides the type opens the file.

This usually means the graph was made with a newer version, or with a feature that is not present here.

A node whose settings could not be restored

If a node's saved settings cannot be read back, it is badged red instead, with the tooltip: "This node's settings could not be restored from the saved file. Re-pick the source file or re-apply the node's settings."

Studio and Graph › Fundamentals

Pins and Data Types

Every kind of value a wire can carry, from meshes and DNA to weight maps and plain numbers.

What a pin is

A pin is a single typed connector on a node - an input, on the node's input side, or an output, on its output side. Connections are always stored output to input: the graph auto-orients a new wire based on which end is the output and which is the input, so it does not matter which pin you actually drag from. Most input pins accept a single wire, and dropping a second one replaces the first, though a few are declared to accept more than one - see Nodes and Wires for the full wiring rules.

A pin's category is what decides whether it can be wired to another pin at all. Drag a wire out into empty space and the Add Node menu that opens is filtered to nodes with a compatible pin, with its header reading Compatible with {0} - see Working in the Graph.

Pin types

The table below covers every data type currently used by a pin in the library. Counts are pin totals across the whole node library in the current build, not a fixed catalogue - they rise as nodes are added.

Mesh and geometry

Type Pins What it carries Nodes that carry it
Mesh 247 A mesh: its vertices, triangles and their attributes. Apply AI Mesh Data, Apply Animation Frame, Auto-Rig, Auto-Skin
Mesh List 4 An ordered list of meshes, for nodes that work across more than one at a time. Create DNA, Generate LODs, Get Mesh Array Element, Mesh Array From Directory
Streaming Geometry Cache 11 A mesh that changes over time as a streamed cache, rather than a single static mesh. Apply Deltas to Geometry Cache, Export Geometry Cache to Alembic, Export Geometry Cache to USD, Export to Geometry Cache
Deltas 3 A set of per-vertex offsets, such as a sculpt result, kept separately from a full mesh. Apply Deltas (Topo Match), Get Deltas, Sculpt Mesh
Voxel Settings 4 The shared settings for a voxel operation. Density To Mesh, Generate Settings, Paint, Sculpt Density
Transform 3 A position, rotation and scale. Apply Rigid Transform, Find Plane, Rigid Fit

Character types

Type Pins What it carries Nodes that carry it
DNA 52 A MetaHuman DNA definition - the rig, mesh and expression data read from or written to a .dna file. Bake DNA Geometry, Create DNA, Create DNA From Skeletal Mesh, DNA To Mesh
Animation 11 An animation clip. Apply Animation Frame, Delta Mush Animation (Experimental), Load Animation (FBX), Load Animation Sequence
Bone Selection 8 A named selection of skeleton bones. Fit Skeleton, Get DNA Expression, Get DNA RBF Pose, Paint Skin Weights
Landmarks 17 A set of named points on a mesh surface, used to align or fit it against another mesh. Auto Face Landmarks, Invert Landmarks, Landmarks to RBF Points, Save Landmarks
RBF Points 3 The control points that drive an RBF (radial basis function) deformer. Landmarks to RBF Points, RBF Deformer

Maps, textures and assets

Type Pins What it carries Nodes that carry it
Weight Map 36 A per-vertex value spread across the mesh, such as a mask or a blend weight. Blend, Delta Mush (Experimental), Fix Intersections, Get Attribute
Texture 1 An image. Texture Sampler
Asset 20 A reference to an engine asset. Body Pose Detection, Convert To Static Mesh, Create Material from Textures, Export to Texture Asset

Asset pins mostly belong to the editor-only nodes described in the Introduction, which read or write Unreal Engine assets: an engine asset has nowhere to live in Studio, which has no project underneath it.

Plain value types

Type Pins What it carries Nodes that carry it
Number 784 A floating-point value. Fix Intersections, Generate LODs, Guided Delta Mush, Remesh
Whole Number 118 An integer value. Fix Intersections, Generate LODs, Guided Delta Mush, OpenSubdiv
Choice 17 One of a fixed set of named options - an enum. Branch, Cellular Distance, Cellular Return, Compare Op
True/False 2 A boolean. Mesh Health, Validate DNA
Text 2 A text value. Generate LODs, List Morph Targets
Any 2 A wildcard that accepts any type. Reroute is the only node that uses it, so a wire can be split without narrowing what it carries. Reroute

Number covers what the schema internally calls float and double, and Whole Number covers int, int32 and int64 - those are implementation details, not labels you will see in the app itself.

Studio and Graph › Fundamentals

Files, Autosave and Recovery

What a .mmgraph holds, why opening one never runs anything, how autosave protects you, and how node presets are shared.

The .mmgraph document

A graph is saved as a .mmgraph file (file-dialog filter: Mesh Morpher Graph (*.mmgraph)). The current format is version 6; the loader also reads version 5 and upgrades it in memory, but always writes version 6 back out, and files older than version 5 will not load at all.

What is stored in it:

  • the graph's stable internal ID
  • the graph's display name - the same name set by Edit > Rename Graph... (see The Window), which is why the tab label and the Save dialog's suggested filename both survive a reopen
  • graph variables
  • comment boxes: id, text, position, size and colour
  • every node: its class, its id, its canvas position, and its full property data (compressed since format version 6)
  • every connection
  • every pin's byte payload - meshes, textures and other bulk data live inside the document itself, addressed by a table of contents at the end of the file so large pins can be loaded lazily rather than all at once

What is deliberately not stored:

  • the file's own path on disk, and whether the document has unsaved changes - both are decided fresh each time the file is opened
  • a node's message, its severity, and its out-of-date badge - these describe your current editing session, not the saved document (see Nodes and Wires)
  • undo history
  • selection, pan, zoom, and which subgraph card you were inside
  • runtime objects a node builds for itself, such as a decoded texture or a dynamic material - these are rebuilt when the file is opened
  • app-level settings such as panel layout, window geometry, recent files, theme and minimap visibility - see the table at the end of this page

Opening a document never runs a node, reads an external file, or writes a pin. Loading a graph is contractually a restore, never a recompute. It must never write a pin's payload, mark the graph dirty, or trigger a render; and it must never read an external source file such as your FBX or PNG - re-reading the source is your job, via an explicit action button on the node. The app holds a flag for the whole duration of a load, so that an accidental violation trips a loud internal error rather than silently changing a saved result. There is one narrow exception: a Load Texture From File node caches its own source bytes, so the rule still holds for it, and only a graph saved before that cache existed falls back to reading the file from disk.

A node whose class this build cannot resolve is not dropped when the file loads - it is preserved as the placeholder described in Nodes and Wires, holding its original class and property bytes exactly, and writes them back unchanged the next time you save.

Save behaviour

Save always asks for a destination. There is no quick-save that writes silently over the current file.

Saving to a different file from the one the document came from gives the graph a new internal ID, so the old file and the new one never fight over the same autosave slot. The Save dialog's suggested filename follows the graph's display name, not its on-disk filename - so renaming a graph and then saving suggests the new name - but saving into a path with a different base name does not rename the graph back. On success you see the toast Saved {filename}; on failure, Save failed: {error}.

Unsaved-changes prompts

Closing a document tab, or the app, with unsaved changes:

"{name}" has unsaved changes.

Yes - save before closing.
No  - close and discard the changes.
Cancel - keep it open.

Closing the app while a tool has unbaked edits:

You have unsaved tool edits on the current node.

Yes - accept and bake the changes before closing.
No  - discard the changes.
Cancel - keep the app open.

Switching document tabs with unbaked tool edits shows a similarly shaped prompt with different wording - see The Window.

If the document already has a file on disk, Yes writes straight to it with no further dialog; a document that has never been saved goes through the normal Save dialog instead, and the window only actually closes once the graph is clean. A save that fails never lets the close proceed. Once every open tab has been resolved this way, any leftover autosave sidecars and scratch files for those documents are swept up, so nothing can resurrect itself on the next launch.

Autosave

Mesh Morpher autosaves every 300 seconds (5 minutes) by default, checked every 30 seconds; the interval is controlled by the console variable mm.AutosaveIntervalSeconds ("Seconds between autosave passes over dirty graphs. 0 disables autosave."). Every document with unsaved changes is snapshotted on each pass; a clean document has its snapshot deleted instead. A document whose mesh is mid brush-stroke is skipped for that one pass only - other open documents are still protected.

Where snapshots go:

  • a document that has been saved at least once: <its path>.autosave, next to the real file (for example MyGraph.mmgraph.autosave)
  • a document that has never been saved: %LOCALAPPDATA%/MeshMorpher/Autosave/<GraphId>.mmgraph.autosave

Every autosave write is atomic - written to a temp file, then swapped in - so an interrupted write can never corrupt the last good snapshot.

If autosave fails, you are told, not just logged. The message appears once per destination: Autosave failed for "{file}" ({reason}). This graph is NOT protected against a crash - save it somewhere writable.

Nothing is written from inside a crash handler by design - what survives a crash is only the last periodic snapshot that made it to disk.

The restore prompt on open

If a file's autosave sidecar is newer than the file itself, opening it asks first, in a dialog titled "Restore Autosave":

An autosave of "{filename}" is newer than the file itself (likely from an interrupted session).

Yes - open the autosave (Save afterwards to keep it).
No  - open the file as last saved.

Yes opens the autosave content but keeps the real file as the document's home, and leaves the document dirty so you have to consciously Save to keep the recovered work. No back-dates the sidecar rather than deleting it - your autosaved bytes are kept on disk, but the prompt will not reappear on every future open. If the autosave cannot be staged for opening at all, the last saved version opens instead, with the toast "The autosave could not be prepared for opening, so the last saved version was opened instead. The autosave file has been left untouched."

Separately, unsaved pin edits are recovered from a per-graph scratch file: if any are found for a graph you are opening, a dialog titled "Recover Unsaved Edits" asks: {N} unsaved pin edit(s) from a previous session were found for this graph. Recover them?

At launch, after a crash

Documents that had never been saved when a previous session crashed are restored automatically into new tabs, with the toast Restored {N} unsaved graph(s) from autosave. A snapshot that cannot be read is not deleted - it is renamed with an .unreadable suffix and reported: {N} autosave snapshot(s) could not be read and were set aside as '.unreadable' in the Autosave folder. They are kept in case they can be salvaged, and will not be retried.

Node presets (.mmnode)

A .mmnode file is one or more nodes exported out of a graph, with a title, author, category, tags and description you fill in - file-dialog filter Mesh Morpher Node (*.mmnode). It uses its own file signature, deliberately distinct from a graph's, so opening the wrong file type gives a clear error rather than a confusing one.

Exporting

From a node's right-click menu (see Nodes and Wires): Export Node Preset... writes a file, Save to My Presets... installs straight into your local library. Both open the same dialog, with fields for Title (pre-filled with the node's title, or {N} Nodes for a multi-selection), Author (pre-filled with your OS user name), Category / Tags, and a multi-line Description. A live summary line reads {N} node(s), {bytes} bytes, or Cannot export: {reason} if the selection cannot be exported at all.

Exporting to a file opens an OS save dialog titled "Export Node Preset", defaulting to {Title}.mmnode; on success it toasts Exported / {Title} -> {path}. Installing to your library checks for an existing preset with the same identity first, and if one exists, offers Replace, Keep Both or Cancel, noting: "Either choice only affects My Presets. Any node you already placed from the current install is an independent copy in its own graph and is not touched."

Importing

Four routes, all ending at the same Import Node Preset dialog:

  1. File > Import Node...
  2. Drag a single .mmnode file onto the app window or onto the graph canvas
  3. Paste a shared text envelope with Ctrl+V
  4. Settings > Nodes > Import...

The dialog shows the preset's title, author, description, category and tags, what it contains (Contains: {N} node(s) - {friendly class names}), and a short file fingerprint. If the preset carries a Python script, it shows this warning:

"This preset contains a Python script. Nothing runs when you install or place it - scripts only ever run when you press Run. Read the script before you run it, the same way you would a downloaded file. Settings > Scripting can disable scripting entirely on this machine."

And this note always appears at the bottom of the dialog:

"Placing a node embeds a complete copy in your graph. Uninstalling later never changes graphs you have already saved, and a .mmgraph you share opens correctly for people who do not have this preset installed."

Two buttons decide what happens: Install ("Add this preset to My Presets, so it shows up in the Add Node menu on this machine.") and Add to This Graph Only ("Place this preset's node(s) here without installing anything." - disabled when there is no graph open to place it into).

Managing installed presets

Settings > Nodes lists everything installed, with Import... and Refresh buttons, and a per-preset Uninstall. Uninstall is disabled for presets that shipped with the app, with the tooltip "This preset shipped with the app and cannot be uninstalled."; for anything you installed yourself, its tooltip reads "Remove this preset from My Presets. Graphs you already placed it into are not affected." Confirming shows:

Uninstall "{Title}"?

This removes it from My Presets and the Add Node menu. Any graph you already placed it into keeps its own independent copy and is not affected.

Uninstalling a preset never changes a graph you already used it in. Placing a node from a preset always embeds a full, independent copy in that graph - the graph does not keep referring back to the installed preset afterwards.

The shipped presets live inside the app's own install; your own live at %LOCALAPPDATA%/MeshMorpher/NodePresets/ - you can drop a downloaded .mmnode there by hand, and subfolders are scanned recursively.

Where settings and user files live

Location Holds
%LOCALAPPDATA%/MeshMorpher/MMAppLayout.json Window position, size and maximised state; UI scale; the serialised dock layout; undo limits; the theme palette; and Recent Files (max 5). A pre-July-2026 copy under <exe>/Config/MMAppLayout.json is still read as a fallback, but all writes go to the path above.
%LOCALAPPDATA%/MeshMorpher/MMWelcome.json Whether the Welcome screen shows at startup, plus a content-revision stamp
%LOCALAPPDATA%/MeshMorpher/MMSimulationSettings.json Whether simulation nodes are shown
GameUserSettings.ini, section [MeshMorpher.GraphEditor] Minimap visibility (bShowMinimap)
%LOCALAPPDATA%/MeshMorpher/Starters/ Your editable copies of the shipped examples
%LOCALAPPDATA%/MeshMorpher/Autosave/ Crash snapshots of documents that had never been saved
%LOCALAPPDATA%/MeshMorpher/NodePresets/ Your installed .mmnode presets