THE PLATFORM: Windows, etc
NOMAD APP VERSION: 2.9.29
Houdini 22.0.368, Windows. Two Nomad Link Out nodes, two different pieces of geometry — only one object ever arrives in Nomad. Each send replaces the previous one.
Repro
- Drop a
Nomad Link Out, connect, Send to Nomad. Nomad acks and the node’s hiddenmeshidparm gets filled in. - Copy that node (or copy the containing object) to make a second Out node on different geometry.
- Send from both.
The copy inherited the acked meshid, so both nodes address the same Nomad object and the second send replaces the first. Nothing in the UI shows this, since meshid and geoid are hidden parms.
Confirming it — Python Shell, one line:
import hou; [print(n.path(), "| meshid:", repr(n.evalParm("meshid")), "| geoid:", repr(n.evalParm("geoid"))) for n in hou.nodeType(hou.sopNodeTypeCategory(), "nomad_link_out").instances()]
In my scene both rows printed the same meshid. Clearing the parm on both nodes fixes it immediately — _mesh_id() falls back to the path-derived UUID, which is unique per node, and Nomad’s next ack assigns each one a fresh id:
import hou; [n.parm("meshid").set("") for n in hou.nodeType(hou.sopNodeTypeCategory(), "nomad_link_out").instances()]
Cause
In python/nomad_link/nodes.py:
def _mesh_id(node):
return node.evalParm("meshid") or uuid.uuid5(ID_NAMESPACE, node.path()).hex
The path hash is unique per node, but the acked parm takes priority and copies right along with the node. _geometry_id has the same shape, so a duplicated geoid would make Nomad treat two nodes as instances of one geometry.
What I did locally
I have _mesh_id/_geometry_id check whether another Out SOP already carries the id and, if so, clear the parm and use the path hash — so it self-heals on the next send while a renamed node still keeps its Nomad object. It works, but the resolution order is arbitrary (the first of the pair to send is the one that gives up the id), so I’m not proposing it as the fix.
Clearing meshid/geoid in an OnCreated handler on the HDA seems more predictable — a duplicated node would never carry the id in the first place. Your call which way is right.
Worth noting tests/test_nodes.py can’t catch this: fake_hou.hou.nodeType returns None, so _instances() is always empty and any collision logic there is unexercised.
Great plugin otherwise — the live delta sync into a SOP network is excellent.
WIth the help of Claude
Sorry if using Ai for this kind of thing is frowned upon! I recently have switched from C4D and ZBrush over to Houdini and Nomad Sculpt! It’s AMAZING!!! Great work. I have consistent work where I need to send multiple meshes to Nomad from Houdini and ran into the geometry getting overwritten and used Claude to help troubleshoot while I was under a deadline.
Thank you!