Skip to content

OpenUSD: intent-subtype live bindings + server-delivered asset content - #17

Merged
marcschier merged 4 commits into
openusd-robotics-e2efrom
openusd-asset-delivery
Jul 17, 2026
Merged

OpenUSD: intent-subtype live bindings + server-delivered asset content#17
marcschier merged 4 commits into
openusd-robotics-e2efrom
openusd-asset-delivery

Conversation

@marcschier

@marcschier marcschier commented Jul 16, 2026

Copy link
Copy Markdown
Owner

Summary

Reference impl (both example servers + the connector bridge) for the OpenUSD Bindings companion model, kept in sync with opcua-drafts PR #14: the intent-subtype live-binding model (§5.4) and the optional server-delivered USD asset content (§5.15). A server that does not expose Assets remains conformant.

Live-binding split (§5.4)

  • Servers create the concrete binding subtype per intent — the <Binding> placeholder child is retyped to OpenUsd{Telemetry,Alarm,History,Command}BindingType — and set intent-specific members (AlarmAspect, Command*) via the subtype factories; the removed IntentProfile enum is no longer written.
  • Connector matches the four binding subtype NodeIds and derives the intent from the instance TypeDefinition (was: reading the IntentProfile property). The internal OpenUsdIntentProfile discriminator + downstream subscribe/command/history logic are unchanged.

Asset content delivery (§5.15)

  • Applications/OpenUsdShared/UsdAssetDelivery.cs (linked into both servers) — read-only Part 5 FileState serving helper. OpenUsdAssetType subtypes FileType, so the asset node itself is the file: the handlers wire onto the asset node and the connector streams each asset directly via its own Open/Read/Close (no File child).
  • OpenUsdConnector.Assets.cs — enumerate stage.Assets, stream each layer, verify Digest (fail-closed), cache with path sanitization; --fetch-assets writes a self-contained stage.usda.
  • Regenerated Opc.Ua.OpenUsdBinding NodeSet copied into both servers' Model/.

Validation

  • OpenUSD e2e 27/27 on net10.0.
  • Bridge + both servers build clean on net10.0 + net48 (0 warnings / 0 errors; warnings-as-errors).

Stacked on openusd-robotics-e2e. Companion spec: opcua-drafts PR #14.

…aming)

Serve the artist-authored USD asset closure (root layer + component
references) through the OPC UA address space so a generic connector can
enumerate, stream, verify, cache, and compose a self-contained local
stage with no external asset setup, then live-update as before. Servers
that do not expose Assets remain conformant (external resolution).

- OpenUsdShared/UsdAssetDelivery.cs: read-only Part 5 FileState serving
  helper (Open/Read/Close/GetPosition/SetPosition over byte[], bounded
  handles); AttachStageAssets materializes the stage Assets folder with
  one OpenUsdAssetType (+ SHA-256 Digest) per served layer.
- Pump + Robotics servers: embed their USD assets and serve the stage
  closure (Plant/pump/remote-pump; Cell/robot/tool).
- Connector: OpenUsdConnector.Assets.cs enumerates stage.Assets, streams
  each layer via Part 5, verifies Digest (fail-closed), and caches with
  path sanitization; --fetch-assets writes a self-contained stage.usda.
- Regenerated OpenUsdBinding NodeSet in both servers' Model/.
- e2e: ServedAssetsAreFetchedVerifiedAndCached (pump + robotics).
…et FileType (PR #14 review)

Sync the C# reference impl to the updated companion NodeSet:

Live-binding split (spec 5.4):
- Servers create the concrete binding subtype per intent (retype the
  <Binding> placeholder child to OpenUsd{Telemetry,Alarm,History,Command}
  BindingType) and set intent-specific members via the subtype factories;
  the removed IntentProfile enum is no longer written.
- Connector matches the four binding subtype NodeIds and derives the intent
  from the instance TypeDefinition (was: reading the IntentProfile property);
  the internal OpenUsdIntentProfile discriminator + downstream logic are kept.

Asset content delivery (spec 5.15): OpenUsdAssetType now subtypes Part 5
FileType, so the asset node itself is the file — UsdAssetDelivery wires the
read-only Open/Read/Close handlers onto the asset node, and the connector
streams each asset directly (no File child).

- Regenerated OpenUsdBinding NodeSet copied into both servers' Model/.
- Verified: OpenUsd e2e 27/27 (net10.0); bridge + both servers build clean
  on net10.0 and net48.
@marcschier marcschier changed the title OpenUSD: optional server-delivered USD asset content (Part 5 FileType streaming) OpenUSD: intent-subtype live bindings + server-delivered asset content Jul 16, 2026
…s (PR #14 review)

Sync impl to the renamed OpenUsdValueChangeBindingType (was Telemetry) and the
now-Mandatory command members: OpenUsdModel + connector use ValueChangeBindingTypeId;
both servers default CreateBinding to ObjectTypes.OpenUsdValueChangeBindingType.
Copied regenerated NodeSet into both servers' Model/.

Verified: OpenUSD e2e 27/27 (net10.0); bridge + both servers build clean on net10.0 + net48.
Code-review audit fixes:
- Connector Convert now applies the spec 5.8 conversion offset
  (target = Scale * converted + Offset); BindingInfo gains Offset, read from
  the binding node (default 0.0). No behavior change on the examples (offset=0).
- Fix stale comments referencing the removed OpenUsdTelemetryBindingType name
  (-> OpenUsdValueChangeBindingType).
- Re-copied the regenerated OpenUsdBinding NodeSet (Model Version 0.2.0) into
  both servers' Model/.

Verified: OpenUSD e2e 27/27 (net10.0); bridge + both servers clean on net10.0 + net48.
@marcschier
marcschier merged commit d89de22 into openusd-robotics-e2e Jul 17, 2026
@marcschier
marcschier deleted the openusd-asset-delivery branch July 17, 2026 07:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant