# `IModelNode`

> Contract 2.0.0 · package sha256 `a857eca95b35921109faf997094bb4192f12527d9d0fcd4be7e97f06425bad6e` · generated from `configurator-runtime.d.ts` by `services/onsite-scripter/scripts/build-contract-docs.mjs`; edit the source, not this file.

Interface · `import type { IModelNode } from '@holostep-configurators/runtime-client/contract';` · stable · since 2.0.0 · section 21. Stored data (vendored; replaces @holo/interfaces)

Stored GLB node. Fields not declared pass through, as on every node ([`IConfiguratorNode`](IConfiguratorNode.md)). `dek`, `encryption` and
`keyRef` never appear in any output; [`plainGlbUrl`](IModelNode.plainGlbUrl.md) and [`plainOptGlbUrl`](IModelNode.plainOptGlbUrl.md) are input-only.

## Members

| Member | Kind | Summary |
| --- | --- | --- |
| <a id="type"></a>[`type`](IModelNode.type.md) | property | Always 'ModelNode'. |
| <a id="glburl"></a>[`glbUrl`](IModelNode.glbUrl.md) | property | The GLB (or `.holo`). |
| <a id="optglburl"></a>[`optGlbUrl?`](IModelNode.optGlbUrl.md) | property | The optimized twin the runtime prefers when present. |
| <a id="plainglburl"></a>[`plainGlbUrl?`](IModelNode.plainGlbUrl.md) | property | Input-only: the public twin the runtime draws when the `.holo` fails to fetch, decrypt or parse ('asset-degraded'). |
| <a id="plainoptglburl"></a>[`plainOptGlbUrl?`](IModelNode.plainOptGlbUrl.md) | property | Input-only: the twin of `optGlbUrl`, drawn and resolved as `plainGlbUrl` is. |
| <a id="encrypted"></a>[`encrypted?`](IModelNode.encrypted.md) | property | True for an encrypted (`.holo`) asset. |
| <a id="position"></a>[`position`](IModelNode.position.md) | property | Metres, in world space (or the parent model's, with `space: 'parent'`). |
| <a id="rotation"></a>[`rotation`](IModelNode.rotation.md) | property | Euler XYZ, radians (stored format, unchanged). |
| <a id="scale"></a>[`scale`](IModelNode.scale.md) | property | 1 on each axis is the authored size. |
| <a id="defaultnodeid"></a>[`defaultNodeId?`](IModelNode.defaultNodeId.md) | property | The `nodeId` of its selected child; placed, and checked when [`applyPatch`](Writer.applyPatch.md) writes it, as [`IGroupNode.defaultNodeId`](IGroupNode.defaultNodeId.md) (spec section 6.9, ID10). |
| <a id="globalmateriallist"></a>[`globalMaterialList?`](IModelNode.globalMaterialList.md) | property | Which of its meshes global-material groups dress. |
| <a id="magneticplanes"></a>[`magneticPlanes?`](IModelNode.magneticPlanes.md) | property | Its connector-plane configs (spec section 6.12). |
| <a id="space"></a>[`space?`](IModelNode.space.md) | property · labs | 'parent': position, rotation and scale are local to the nearest ModelNode ancestor, so the child moves, hides and disposes with it. |
| <a id="tryon"></a>[`tryOn?`](IModelNode.tryOn.md) | property · labs | The node's try-on rig record, which Holostep's rig pipeline writes and the runtime only reads: `kind` is the body part the rig fits, and `approved` is set once a rig passed review, with `format`, the rig file's format… |
| <a id="tryonurl"></a>[`tryOnUrl?`](IModelNode.tryOnUrl.md) | property · labs | The approved rig's GLB (`tryOn`). |
| <a id="tryoncandidateurl"></a>[`tryOnCandidateUrl?`](IModelNode.tryOnCandidateUrl.md) | property · labs | A candidate rig awaiting review. |

Inherited from [`IConfiguratorNode`](IConfiguratorNode.md): [`_id`](IConfiguratorNode._id.md), [`nodeId`](IConfiguratorNode.nodeId.md), [`label`](IConfiguratorNode.label.md), [`order`](IConfiguratorNode.order.md), [`enabled`](IConfiguratorNode.enabled.md), [`expanded`](IConfiguratorNode.expanded.md), [`createdAt`](IConfiguratorNode.createdAt.md), [`updatedAt`](IConfiguratorNode.updatedAt.md), [`children`](IConfiguratorNode.children.md), [`thumbnailUrl`](IConfiguratorNode.thumbnailUrl.md), [`attributes`](IConfiguratorNode.attributes.md).

## Declaration

```ts
export interface IModelNode extends IConfiguratorNode {
  type: 'ModelNode';
  glbUrl: string;
  optGlbUrl?: string;
  plainGlbUrl?: string;
  plainOptGlbUrl?: string;
  encrypted?: boolean;
  position: Point3;
  rotation: Point3;
  scale: Point3;
  defaultNodeId?: string;
  globalMaterialList?: IGlobalMaterialListEntry[];
  magneticPlanes?: IMagneticPlaneConfig[];
  space?: 'world' | 'parent';
  tryOn?: {
    kind: TryOnKind;
    approved?: {
      format: number;
    };
  };
  tryOnUrl?: string;
  tryOnCandidateUrl?: string;
}
```

## Generic-API test (spec 3.1)

| Rule | Result |
| --- | --- |
| 1. Neutral name | pass: `IModelNode` names no product |
| 2. A precedent | not recorded: no ledger row (coverage.json) names this member or its owner |
| 3. Two apps, or labs | not recorded: no ledger row names this member or its owner |
| 4. The cheaper fix first | not recorded per member (Appendix B decides it per need) |
