@skenora/runtime 0.1.2

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.
Files changed (270) hide show
  1. package/README.md +92 -0
  2. package/dist/core/built-in-runtime-capabilities.d.ts +21 -0
  3. package/dist/core/built-in-runtime-capabilities.d.ts.map +1 -0
  4. package/dist/core/built-in-runtime-capabilities.js +175 -0
  5. package/dist/core/built-in-runtime-capabilities.js.map +1 -0
  6. package/dist/core/runtime-capability-registry.d.ts +90 -0
  7. package/dist/core/runtime-capability-registry.d.ts.map +1 -0
  8. package/dist/core/runtime-capability-registry.js +42 -0
  9. package/dist/core/runtime-capability-registry.js.map +1 -0
  10. package/dist/core/runtime-document-coordinator.d.ts +28 -0
  11. package/dist/core/runtime-document-coordinator.d.ts.map +1 -0
  12. package/dist/core/runtime-document-coordinator.js +124 -0
  13. package/dist/core/runtime-document-coordinator.js.map +1 -0
  14. package/dist/core/runtime-events.d.ts +43 -0
  15. package/dist/core/runtime-events.d.ts.map +1 -0
  16. package/dist/core/runtime-events.js +2 -0
  17. package/dist/core/runtime-events.js.map +1 -0
  18. package/dist/core/runtime-session.d.ts +93 -0
  19. package/dist/core/runtime-session.d.ts.map +1 -0
  20. package/dist/core/runtime-session.js +1344 -0
  21. package/dist/core/runtime-session.js.map +1 -0
  22. package/dist/editor-tools/camera-path-editing-controller.d.ts +36 -0
  23. package/dist/editor-tools/camera-path-editing-controller.d.ts.map +1 -0
  24. package/dist/editor-tools/camera-path-editing-controller.js +212 -0
  25. package/dist/editor-tools/camera-path-editing-controller.js.map +1 -0
  26. package/dist/editor-tools/camera-path-visualizer.d.ts +28 -0
  27. package/dist/editor-tools/camera-path-visualizer.d.ts.map +1 -0
  28. package/dist/editor-tools/camera-path-visualizer.js +151 -0
  29. package/dist/editor-tools/camera-path-visualizer.js.map +1 -0
  30. package/dist/editor-tools/drop-preview-controller.d.ts +34 -0
  31. package/dist/editor-tools/drop-preview-controller.d.ts.map +1 -0
  32. package/dist/editor-tools/drop-preview-controller.js +209 -0
  33. package/dist/editor-tools/drop-preview-controller.js.map +1 -0
  34. package/dist/editor-tools/grid-helper.d.ts +18 -0
  35. package/dist/editor-tools/grid-helper.d.ts.map +1 -0
  36. package/dist/editor-tools/grid-helper.js +27 -0
  37. package/dist/editor-tools/grid-helper.js.map +1 -0
  38. package/dist/editor-tools/light-editing-controller.d.ts +25 -0
  39. package/dist/editor-tools/light-editing-controller.d.ts.map +1 -0
  40. package/dist/editor-tools/light-editing-controller.js +207 -0
  41. package/dist/editor-tools/light-editing-controller.js.map +1 -0
  42. package/dist/editor-tools/node-operations.d.ts +51 -0
  43. package/dist/editor-tools/node-operations.d.ts.map +1 -0
  44. package/dist/editor-tools/node-operations.js +182 -0
  45. package/dist/editor-tools/node-operations.js.map +1 -0
  46. package/dist/editor-tools/selection-controller.d.ts +44 -0
  47. package/dist/editor-tools/selection-controller.d.ts.map +1 -0
  48. package/dist/editor-tools/selection-controller.js +299 -0
  49. package/dist/editor-tools/selection-controller.js.map +1 -0
  50. package/dist/editor-tools/shape-drawing-controller.d.ts +45 -0
  51. package/dist/editor-tools/shape-drawing-controller.d.ts.map +1 -0
  52. package/dist/editor-tools/shape-drawing-controller.js +205 -0
  53. package/dist/editor-tools/shape-drawing-controller.js.map +1 -0
  54. package/dist/editor-tools/shape-editing-controller.d.ts +40 -0
  55. package/dist/editor-tools/shape-editing-controller.d.ts.map +1 -0
  56. package/dist/editor-tools/shape-editing-controller.js +340 -0
  57. package/dist/editor-tools/shape-editing-controller.js.map +1 -0
  58. package/dist/editor.d.ts +12 -0
  59. package/dist/editor.d.ts.map +1 -0
  60. package/dist/editor.js +12 -0
  61. package/dist/editor.js.map +1 -0
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +2 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/inspection/node-tools.d.ts +51 -0
  67. package/dist/inspection/node-tools.d.ts.map +1 -0
  68. package/dist/inspection/node-tools.js +282 -0
  69. package/dist/inspection/node-tools.js.map +1 -0
  70. package/dist/interaction/runtime-third-person-controller.d.ts +24 -0
  71. package/dist/interaction/runtime-third-person-controller.d.ts.map +1 -0
  72. package/dist/interaction/runtime-third-person-controller.js +71 -0
  73. package/dist/interaction/runtime-third-person-controller.js.map +1 -0
  74. package/dist/interaction/third-person-controller.d.ts +61 -0
  75. package/dist/interaction/third-person-controller.d.ts.map +1 -0
  76. package/dist/interaction/third-person-controller.js +400 -0
  77. package/dist/interaction/third-person-controller.js.map +1 -0
  78. package/dist/interaction.d.ts +3 -0
  79. package/dist/interaction.d.ts.map +1 -0
  80. package/dist/interaction.js +3 -0
  81. package/dist/interaction.js.map +1 -0
  82. package/dist/presentation/scene-renderer.d.ts +75 -0
  83. package/dist/presentation/scene-renderer.d.ts.map +1 -0
  84. package/dist/presentation/scene-renderer.js +324 -0
  85. package/dist/presentation/scene-renderer.js.map +1 -0
  86. package/dist/presentation/viewport-controller.d.ts +13 -0
  87. package/dist/presentation/viewport-controller.d.ts.map +1 -0
  88. package/dist/presentation/viewport-controller.js +186 -0
  89. package/dist/presentation/viewport-controller.js.map +1 -0
  90. package/dist/projection/annotation-projector.d.ts +28 -0
  91. package/dist/projection/annotation-projector.d.ts.map +1 -0
  92. package/dist/projection/annotation-projector.js +98 -0
  93. package/dist/projection/annotation-projector.js.map +1 -0
  94. package/dist/projection/built-in-entity-projectors.d.ts +7 -0
  95. package/dist/projection/built-in-entity-projectors.d.ts.map +1 -0
  96. package/dist/projection/built-in-entity-projectors.js +75 -0
  97. package/dist/projection/built-in-entity-projectors.js.map +1 -0
  98. package/dist/projection/camera-entity-factory.d.ts +9 -0
  99. package/dist/projection/camera-entity-factory.d.ts.map +1 -0
  100. package/dist/projection/camera-entity-factory.js +93 -0
  101. package/dist/projection/camera-entity-factory.js.map +1 -0
  102. package/dist/projection/document-applier.d.ts +38 -0
  103. package/dist/projection/document-applier.d.ts.map +1 -0
  104. package/dist/projection/document-applier.js +219 -0
  105. package/dist/projection/document-applier.js.map +1 -0
  106. package/dist/projection/entity-projection-registry.d.ts +56 -0
  107. package/dist/projection/entity-projection-registry.d.ts.map +1 -0
  108. package/dist/projection/entity-projection-registry.js +121 -0
  109. package/dist/projection/entity-projection-registry.js.map +1 -0
  110. package/dist/projection/model-importer.d.ts +41 -0
  111. package/dist/projection/model-importer.d.ts.map +1 -0
  112. package/dist/projection/model-importer.js +469 -0
  113. package/dist/projection/model-importer.js.map +1 -0
  114. package/dist/projection/particle-capability.d.ts +5 -0
  115. package/dist/projection/particle-capability.d.ts.map +1 -0
  116. package/dist/projection/particle-capability.js +2 -0
  117. package/dist/projection/particle-capability.js.map +1 -0
  118. package/dist/projection/particle-factory.d.ts +18 -0
  119. package/dist/projection/particle-factory.d.ts.map +1 -0
  120. package/dist/projection/particle-factory.js +313 -0
  121. package/dist/projection/particle-factory.js.map +1 -0
  122. package/dist/projection/primitive-factory.d.ts +5 -0
  123. package/dist/projection/primitive-factory.d.ts.map +1 -0
  124. package/dist/projection/primitive-factory.js +55 -0
  125. package/dist/projection/primitive-factory.js.map +1 -0
  126. package/dist/projection/procedural-factory.d.ts +6 -0
  127. package/dist/projection/procedural-factory.d.ts.map +1 -0
  128. package/dist/projection/procedural-factory.js +34 -0
  129. package/dist/projection/procedural-factory.js.map +1 -0
  130. package/dist/projection/runtime-projection-state.d.ts +19 -0
  131. package/dist/projection/runtime-projection-state.d.ts.map +1 -0
  132. package/dist/projection/runtime-projection-state.js +58 -0
  133. package/dist/projection/runtime-projection-state.js.map +1 -0
  134. package/dist/projection/shape-factory.d.ts +5 -0
  135. package/dist/projection/shape-factory.d.ts.map +1 -0
  136. package/dist/projection/shape-factory.js +101 -0
  137. package/dist/projection/shape-factory.js.map +1 -0
  138. package/dist/projection-entry.d.ts +10 -0
  139. package/dist/projection-entry.d.ts.map +1 -0
  140. package/dist/projection-entry.js +8 -0
  141. package/dist/projection-entry.js.map +1 -0
  142. package/dist/simulation/fixed-step-scheduler.d.ts +13 -0
  143. package/dist/simulation/fixed-step-scheduler.d.ts.map +1 -0
  144. package/dist/simulation/fixed-step-scheduler.js +45 -0
  145. package/dist/simulation/fixed-step-scheduler.js.map +1 -0
  146. package/dist/simulation/simulation-runtime-model.d.ts +24 -0
  147. package/dist/simulation/simulation-runtime-model.d.ts.map +1 -0
  148. package/dist/simulation/simulation-runtime-model.js +63 -0
  149. package/dist/simulation/simulation-runtime-model.js.map +1 -0
  150. package/dist/simulation/simulation-wgsl.d.ts +3 -0
  151. package/dist/simulation/simulation-wgsl.d.ts.map +1 -0
  152. package/dist/simulation/simulation-wgsl.js +294 -0
  153. package/dist/simulation/simulation-wgsl.js.map +1 -0
  154. package/dist/simulation/webgpu-simulation-renderer.d.ts +67 -0
  155. package/dist/simulation/webgpu-simulation-renderer.d.ts.map +1 -0
  156. package/dist/simulation/webgpu-simulation-renderer.js +504 -0
  157. package/dist/simulation/webgpu-simulation-renderer.js.map +1 -0
  158. package/dist/simulation/webgpu-types.d.ts +90 -0
  159. package/dist/simulation/webgpu-types.d.ts.map +1 -0
  160. package/dist/simulation/webgpu-types.js +10 -0
  161. package/dist/simulation/webgpu-types.js.map +1 -0
  162. package/dist/simulation.d.ts +4 -0
  163. package/dist/simulation.d.ts.map +1 -0
  164. package/dist/simulation.js +4 -0
  165. package/dist/simulation.js.map +1 -0
  166. package/dist/systems/animation-controller.d.ts +52 -0
  167. package/dist/systems/animation-controller.d.ts.map +1 -0
  168. package/dist/systems/animation-controller.js +146 -0
  169. package/dist/systems/animation-controller.js.map +1 -0
  170. package/dist/systems/camera-controller.d.ts +41 -0
  171. package/dist/systems/camera-controller.d.ts.map +1 -0
  172. package/dist/systems/camera-controller.js +207 -0
  173. package/dist/systems/camera-controller.js.map +1 -0
  174. package/dist/systems/camera-path-controller.d.ts +39 -0
  175. package/dist/systems/camera-path-controller.d.ts.map +1 -0
  176. package/dist/systems/camera-path-controller.js +287 -0
  177. package/dist/systems/camera-path-controller.js.map +1 -0
  178. package/dist/systems/environment-controller.d.ts +18 -0
  179. package/dist/systems/environment-controller.d.ts.map +1 -0
  180. package/dist/systems/environment-controller.js +251 -0
  181. package/dist/systems/environment-controller.js.map +1 -0
  182. package/dist/systems/environment-texture.d.ts +7 -0
  183. package/dist/systems/environment-texture.d.ts.map +1 -0
  184. package/dist/systems/environment-texture.js +57 -0
  185. package/dist/systems/environment-texture.js.map +1 -0
  186. package/dist/systems/fog-controller.d.ts +12 -0
  187. package/dist/systems/fog-controller.d.ts.map +1 -0
  188. package/dist/systems/fog-controller.js +60 -0
  189. package/dist/systems/fog-controller.js.map +1 -0
  190. package/dist/systems/generated-texture-cache.d.ts +33 -0
  191. package/dist/systems/generated-texture-cache.d.ts.map +1 -0
  192. package/dist/systems/generated-texture-cache.js +101 -0
  193. package/dist/systems/generated-texture-cache.js.map +1 -0
  194. package/dist/systems/glass-transmission-controller.d.ts +21 -0
  195. package/dist/systems/glass-transmission-controller.d.ts.map +1 -0
  196. package/dist/systems/glass-transmission-controller.js +119 -0
  197. package/dist/systems/glass-transmission-controller.js.map +1 -0
  198. package/dist/systems/gpu-program-cache.d.ts +19 -0
  199. package/dist/systems/gpu-program-cache.d.ts.map +1 -0
  200. package/dist/systems/gpu-program-cache.js +95 -0
  201. package/dist/systems/gpu-program-cache.js.map +1 -0
  202. package/dist/systems/ground-controller.d.ts +14 -0
  203. package/dist/systems/ground-controller.d.ts.map +1 -0
  204. package/dist/systems/ground-controller.js +121 -0
  205. package/dist/systems/ground-controller.js.map +1 -0
  206. package/dist/systems/lighting-controller.d.ts +23 -0
  207. package/dist/systems/lighting-controller.d.ts.map +1 -0
  208. package/dist/systems/lighting-controller.js +204 -0
  209. package/dist/systems/lighting-controller.js.map +1 -0
  210. package/dist/systems/material-animation-controller.d.ts +26 -0
  211. package/dist/systems/material-animation-controller.d.ts.map +1 -0
  212. package/dist/systems/material-animation-controller.js +221 -0
  213. package/dist/systems/material-animation-controller.js.map +1 -0
  214. package/dist/systems/material-binding-resolver.d.ts +16 -0
  215. package/dist/systems/material-binding-resolver.d.ts.map +1 -0
  216. package/dist/systems/material-binding-resolver.js +54 -0
  217. package/dist/systems/material-binding-resolver.js.map +1 -0
  218. package/dist/systems/material-controller.d.ts +29 -0
  219. package/dist/systems/material-controller.d.ts.map +1 -0
  220. package/dist/systems/material-controller.js +233 -0
  221. package/dist/systems/material-controller.js.map +1 -0
  222. package/dist/systems/material-preparation.d.ts +9 -0
  223. package/dist/systems/material-preparation.d.ts.map +1 -0
  224. package/dist/systems/material-preparation.js +51 -0
  225. package/dist/systems/material-preparation.js.map +1 -0
  226. package/dist/systems/material-slots.d.ts +18 -0
  227. package/dist/systems/material-slots.d.ts.map +1 -0
  228. package/dist/systems/material-slots.js +78 -0
  229. package/dist/systems/material-slots.js.map +1 -0
  230. package/dist/systems/owned-material-controller.d.ts +20 -0
  231. package/dist/systems/owned-material-controller.d.ts.map +1 -0
  232. package/dist/systems/owned-material-controller.js +611 -0
  233. package/dist/systems/owned-material-controller.js.map +1 -0
  234. package/dist/systems/pbr-material.d.ts +22 -0
  235. package/dist/systems/pbr-material.d.ts.map +1 -0
  236. package/dist/systems/pbr-material.js +358 -0
  237. package/dist/systems/pbr-material.js.map +1 -0
  238. package/dist/systems/post-process-controller.d.ts +17 -0
  239. package/dist/systems/post-process-controller.d.ts.map +1 -0
  240. package/dist/systems/post-process-controller.js +246 -0
  241. package/dist/systems/post-process-controller.js.map +1 -0
  242. package/dist/systems/runtime-clock.d.ts +9 -0
  243. package/dist/systems/runtime-clock.d.ts.map +1 -0
  244. package/dist/systems/runtime-clock.js +25 -0
  245. package/dist/systems/runtime-clock.js.map +1 -0
  246. package/dist/systems/skybox-controller.d.ts +15 -0
  247. package/dist/systems/skybox-controller.d.ts.map +1 -0
  248. package/dist/systems/skybox-controller.js +282 -0
  249. package/dist/systems/skybox-controller.js.map +1 -0
  250. package/dist/systems/sprite-sheet-controller.d.ts +52 -0
  251. package/dist/systems/sprite-sheet-controller.d.ts.map +1 -0
  252. package/dist/systems/sprite-sheet-controller.js +187 -0
  253. package/dist/systems/sprite-sheet-controller.js.map +1 -0
  254. package/dist/systems/surface-effect-plugin.d.ts +26 -0
  255. package/dist/systems/surface-effect-plugin.d.ts.map +1 -0
  256. package/dist/systems/surface-effect-plugin.js +204 -0
  257. package/dist/systems/surface-effect-plugin.js.map +1 -0
  258. package/dist/systems/surface-program-plugin.d.ts +29 -0
  259. package/dist/systems/surface-program-plugin.d.ts.map +1 -0
  260. package/dist/systems/surface-program-plugin.js +139 -0
  261. package/dist/systems/surface-program-plugin.js.map +1 -0
  262. package/dist/systems/texture-animation-controller.d.ts +18 -0
  263. package/dist/systems/texture-animation-controller.d.ts.map +1 -0
  264. package/dist/systems/texture-animation-controller.js +147 -0
  265. package/dist/systems/texture-animation-controller.js.map +1 -0
  266. package/dist/systems/weather-controller.d.ts +16 -0
  267. package/dist/systems/weather-controller.d.ts.map +1 -0
  268. package/dist/systems/weather-controller.js +205 -0
  269. package/dist/systems/weather-controller.js.map +1 -0
  270. package/package.json +63 -0
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # @skenora/runtime
2
+
3
+ Babylon.js presentation and projection for validated Skenora SceneDocuments.
4
+
5
+ > This package is not currently published to npm; the install command below is
6
+ > intended release syntax. The procedural V1 sections describe current
7
+ > repository source and are not covered by the 2026-08-28 package/browser
8
+ > evidence.
9
+
10
+ ```bash
11
+ pnpm add @skenora/runtime
12
+ ```
13
+
14
+ Entry points are intentionally separated:
15
+
16
+ | Import | Purpose |
17
+ | ------------------------------ | ----------------------------------------------------- |
18
+ | `@skenora/runtime` | stable read-only `SceneRenderer` facade |
19
+ | `@skenora/runtime/projection` | `RuntimeSession`, capabilities, plugins |
20
+ | `@skenora/runtime/editor` | selection, gizmo, drawing, path, and inspection tools |
21
+ | `@skenora/runtime/interaction` | third-person controllers |
22
+ | `@skenora/runtime/simulation` | optional owned WebGPU compute/fullscreen renderer |
23
+
24
+ Runtime state is a disposable projection. Persisted changes belong in
25
+ SceneDocument commands, not Babylon nodes. Hosts must dispose sessions and any
26
+ resource scopes they create. Runtime lifecycle additions use `RuntimePlugin`;
27
+ `RuntimeExtension` remains as a compatibility alias. Domain contributions such
28
+ as resource providers, entity projectors, and Flow nodes keep their specialized
29
+ registries.
30
+
31
+ glTF sidecar buffers and images normally use scoped Blob URLs. In an
32
+ opaque-origin host where the browser creates `blob:null/...` URLs, Runtime
33
+ converts only those dependencies to `data:` URLs so sandboxed directory imports
34
+ remain loadable without network or XHR access. Data URL fallback increases the
35
+ temporary encoded payload, so prefer GLB for large models used in opaque-origin
36
+ hosts.
37
+
38
+ Owned materials opt in through `creation: { version: 1, family: "pbr" }` and
39
+ explicit entity/slot bindings. Runtime stages textures and surface programs,
40
+ then activates replacements and restores borrowed assignments on unbind. Legacy
41
+ overrides keep their existing path. Material policy limits instances, textures,
42
+ preparation waiting and active parameter animation writers.
43
+
44
+ The projection entry exports `RUNTIME_MATERIAL_ANIMATIONS_CAPABILITY`. Its
45
+ `play(materialId, animationId, { signal })`, pause/resume/stop/reset and state
46
+ operations address material-local typed tracks. Material and texture animations
47
+ share active render time; material updates and document disposal cancel runs.
48
+ The runtime publishes `runtime.material.preparation`,
49
+ `runtime.material.animation` and `runtime.quality.changed` data events.
50
+
51
+ Runtime also exposes `getBackendSnapshot()`, `probe()`, and
52
+ `getGpuProgramCacheSnapshot()`. Probe returns healthy only after a real scene
53
+ render and pixel readback. Material programs use a versioned trusted GLSL
54
+ emitter, a bounded Runtime-owned structural cache, and
55
+ `runtime.gpu-program.preparation` reports. The default scene path still runs
56
+ Babylon WebGL.
57
+
58
+ The separate `./simulation` entry owns a raw WebGPU adapter/device, Canvas
59
+ context, pipelines, two stable storage buffers, fixed-step clock, explicit
60
+ probe readback, resize/reset, device-loss handling, and disposal. It never
61
+ exposes the device and never coexists with Babylon inside one Example load.
62
+
63
+ ```ts
64
+ import { WebGpuSimulationRenderer } from "@skenora/runtime/simulation";
65
+
66
+ const simulation = await WebGpuSimulationRenderer.create({ canvas, program });
67
+ console.log(simulation.snapshot());
68
+ const probe = await simulation.probe(); // explicit readback only
69
+ simulation.dispose();
70
+ ```
71
+
72
+ This entry is a Renderer Lab capability, not SceneDocument persistence. Hosts
73
+ without WebGPU receive `WebGpuSimulationUnsupportedError` and must use the
74
+ manifest fallback rather than claiming a WebGL compute equivalent.
75
+
76
+ Bounded gradient, rim and dissolve effects keep shader source internal. Dissolve
77
+ version 1 accepts opaque main-pass cutout only and rejects shadow/depth/glow
78
+ auxiliary passes and runtime transparency/highlight overrides. Availability is
79
+ not shader readiness, and readiness is not visual approval. Bounded lifecycle
80
+ tests, development-package consumption and WebGL2 rendering passed on 2026-08-28.
81
+ This is not a cross-device or arbitrary-asset guarantee.
82
+
83
+ Procedural geometry and material programs are separate V1 capabilities.
84
+ `procedural` entities compile through `@skenora/procedural` into session-owned
85
+ meshes. An owned PBR `program` is lowered from typed intermediate data to
86
+ trusted internal GLSL with uniform parameters. Capability availability reports
87
+ their current graph and geometry limits. These additions are not covered by
88
+ the 2026-08-28 verification snapshot until a new verification run is
89
+ explicitly authorized and recorded.
90
+
91
+ See the [repository](https://github.com/zhangjiadi225/skenora); the current
92
+ working-tree guides are `docs/RUNTIME.md` and `docs/PROCEDURAL_AI.md`.
@@ -0,0 +1,21 @@
1
+ import type { Material } from "@babylonjs/core/Materials/material";
2
+ import type { Node } from "@babylonjs/core/node";
3
+ import type { MaterialRuntimeProperty } from "@skenora/contracts";
4
+ import type { RuntimeNodeEffects } from "../inspection/node-tools.js";
5
+ import type { AnimationController } from "../systems/animation-controller.js";
6
+ import type { CameraPathController } from "../systems/camera-path-controller.js";
7
+ import type { TextureAnimationController } from "../systems/texture-animation-controller.js";
8
+ import type { RuntimeAnimationCapability, RuntimeCameraCapability, RuntimeMaterialCapability, RuntimeNodeCapability, RuntimeParticleCapability, RuntimeTextureAnimationCapability } from "./runtime-capability-registry.js";
9
+ export declare function createRuntimeNodeCapability(resolveNode: (entityId: string) => Node | null, effects: RuntimeNodeEffects): RuntimeNodeCapability;
10
+ export declare function createRuntimeMaterialCapability(getMaterial: (materialId: string) => Material | null, setProperty: (materialId: string, property: MaterialRuntimeProperty, value: unknown) => void): RuntimeMaterialCapability;
11
+ export interface RuntimeCameraCapabilityHandlers {
12
+ frame(entityIds?: readonly string[]): void;
13
+ activateEntity(entityId: string, controls?: boolean): boolean;
14
+ restoreViewport(): void;
15
+ getPaths(): CameraPathController | null;
16
+ }
17
+ export declare function createRuntimeCameraCapability(handlers: RuntimeCameraCapabilityHandlers): RuntimeCameraCapability;
18
+ export declare function createRuntimeAnimationCapability(animations: AnimationController, nodes: RuntimeNodeCapability): RuntimeAnimationCapability;
19
+ export declare function createRuntimeParticleCapability(setRunning: (entityId: string, running: boolean) => boolean): RuntimeParticleCapability;
20
+ export declare function createRuntimeTextureAnimationCapability(controller: TextureAnimationController): RuntimeTextureAnimationCapability;
21
+ //# sourceMappingURL=built-in-runtime-capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-in-runtime-capabilities.d.ts","sourceRoot":"","sources":["../../src/core/built-in-runtime-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAKnE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EACV,uBAAuB,EAExB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAC1F,OAAO,KAAK,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,iCAAiC,EAClC,MAAM,+BAA+B,CAAC;AAEvC,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,EAC9C,OAAO,EAAE,kBAAkB,GAC1B,qBAAqB,CAyEvB;AAED,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,QAAQ,GAAG,IAAI,EACpD,WAAW,EAAE,CACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,uBAAuB,EACjC,KAAK,EAAE,OAAO,KACX,IAAI,GACR,yBAAyB,CAE3B;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3C,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9D,eAAe,IAAI,IAAI,CAAC;IACxB,QAAQ,IAAI,oBAAoB,GAAG,IAAI,CAAC;CACzC;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,+BAA+B,GACxC,uBAAuB,CAkBzB;AAED,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,mBAAmB,EAC/B,KAAK,EAAE,qBAAqB,GAC3B,0BAA0B,CA6B5B;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,GAC1D,yBAAyB,CAE3B;AAED,wBAAgB,uCAAuC,CACrD,UAAU,EAAE,0BAA0B,GACrC,iCAAiC,CAKnC"}
@@ -0,0 +1,175 @@
1
+ import { Color3 } from "@babylonjs/core/Maths/math.color";
2
+ import { Quaternion } from "@babylonjs/core/Maths/math.vector";
3
+ import { isTransformNode, readAuthoredGroupState, setNodeEnabled, setNodeVisible, } from "../projection/model-importer.js";
4
+ export function createRuntimeNodeCapability(resolveNode, effects) {
5
+ const requireNode = (entityId) => {
6
+ const node = resolveNode(entityId);
7
+ if (!node)
8
+ throw new Error(`Entity not found: ${entityId}`);
9
+ return node;
10
+ };
11
+ return {
12
+ get: resolveNode,
13
+ require: requireNode,
14
+ getState: (entityId) => {
15
+ const node = resolveNode(entityId);
16
+ if (!node)
17
+ return null;
18
+ const transform = isTransformNode(node)
19
+ ? {
20
+ position: toVectorValue(node.position),
21
+ rotation: toVectorValue(node.rotation),
22
+ scaling: toVectorValue(node.scaling),
23
+ ...(node.rotationQuaternion
24
+ ? {
25
+ rotationQuaternion: {
26
+ x: node.rotationQuaternion.x,
27
+ y: node.rotationQuaternion.y,
28
+ z: node.rotationQuaternion.z,
29
+ w: node.rotationQuaternion.w,
30
+ },
31
+ }
32
+ : {}),
33
+ }
34
+ : undefined;
35
+ return {
36
+ id: entityId,
37
+ enabled: readAuthoredGroupState(node)?.enabled ?? node.isEnabled(),
38
+ visible: readAuthoredGroupState(node)?.visible ??
39
+ (isAbstractMesh(node)
40
+ ? node.visibility > 0
41
+ : node.getChildMeshes(false).some((mesh) => mesh.visibility > 0)),
42
+ ...(transform ? { transform } : {}),
43
+ };
44
+ },
45
+ setEnabled: (entityId, enabled) => {
46
+ setNodeEnabled(requireNode(entityId), enabled);
47
+ },
48
+ setVisible: (entityId, visible) => {
49
+ const node = requireNode(entityId);
50
+ if (readAuthoredGroupState(node)) {
51
+ setNodeVisible(node, visible);
52
+ return;
53
+ }
54
+ if (isAbstractMesh(node))
55
+ node.visibility = visible ? 1 : 0;
56
+ for (const mesh of node.getChildMeshes(false)) {
57
+ mesh.visibility = visible ? 1 : 0;
58
+ }
59
+ },
60
+ setTransform: (entityId, transform) => {
61
+ const node = resolveNode(entityId);
62
+ if (!isTransformNode(node)) {
63
+ throw new Error(`Transformable entity not found: ${entityId}`);
64
+ }
65
+ applyTransformUpdate(node, transform);
66
+ },
67
+ setTransparent: (entityId, alpha) => {
68
+ const node = requireNode(entityId);
69
+ if (alpha === null)
70
+ effects.clearTransparent(node);
71
+ else
72
+ effects.setTransparent(node, alpha);
73
+ },
74
+ setOutline: (entityId, color) => {
75
+ const node = requireNode(entityId);
76
+ if (color === null)
77
+ effects.clearOutline(node);
78
+ else
79
+ effects.setOutline(node, Color3.FromHexString(color));
80
+ },
81
+ };
82
+ }
83
+ export function createRuntimeMaterialCapability(getMaterial, setProperty) {
84
+ return { get: getMaterial, setProperty };
85
+ }
86
+ export function createRuntimeCameraCapability(handlers) {
87
+ const requirePaths = () => {
88
+ const paths = handlers.getPaths();
89
+ if (!paths)
90
+ throw new Error("Camera path controller is not ready");
91
+ return paths;
92
+ };
93
+ return {
94
+ frame: (entityIds) => handlers.frame(entityIds),
95
+ activateEntity: (entityId, controls) => handlers.activateEntity(entityId, controls),
96
+ restoreViewport: () => handlers.restoreViewport(),
97
+ playPath: (pathId, options) => requirePaths().play(pathId, options),
98
+ pausePath: () => requirePaths().pause(),
99
+ resumePath: () => requirePaths().resume(),
100
+ stopPath: () => requirePaths().stop(),
101
+ getPathState: () => requirePaths().state,
102
+ subscribePath: (listener) => requirePaths().subscribe(listener),
103
+ };
104
+ }
105
+ export function createRuntimeAnimationCapability(animations, nodes) {
106
+ return {
107
+ play: (entityId, animation, observer = {}) => {
108
+ const root = nodes.require(entityId);
109
+ const groups = animations
110
+ .list(root)
111
+ .filter((group) => !animation || group.name === animation);
112
+ if (animation && groups.length === 0) {
113
+ throw new Error(`Animation not found for entity ${entityId}: ${animation}`);
114
+ }
115
+ for (const group of groups) {
116
+ observer.started?.(group.name);
117
+ group.onAnimationGroupEndObservable.addOnce(() => observer.completed?.(group.name));
118
+ group.start(false);
119
+ }
120
+ return groups.map((group) => group.name);
121
+ },
122
+ stop: (entityId, animation) => {
123
+ const root = nodes.require(entityId);
124
+ animations.stop({
125
+ root,
126
+ ...(animation ? { name: animation } : {}),
127
+ });
128
+ },
129
+ };
130
+ }
131
+ export function createRuntimeParticleCapability(setRunning) {
132
+ return { setRunning };
133
+ }
134
+ export function createRuntimeTextureAnimationCapability(controller) {
135
+ return {
136
+ play: (animationId, options) => controller.play(animationId, options),
137
+ stop: (animationId) => controller.stop(animationId),
138
+ };
139
+ }
140
+ function applyTransformUpdate(node, update) {
141
+ assignVector(node.position, update.position, "position");
142
+ assignVector(node.scaling, update.scaling, "scaling");
143
+ if (update.rotation) {
144
+ node.rotationQuaternion = null;
145
+ assignVector(node.rotation, update.rotation, "rotation");
146
+ }
147
+ if (update.rotationQuaternion === null) {
148
+ node.rotationQuaternion = null;
149
+ }
150
+ else if (update.rotationQuaternion) {
151
+ const current = node.rotationQuaternion ?? Quaternion.Identity();
152
+ node.rotationQuaternion = new Quaternion(finiteOrCurrent(update.rotationQuaternion.x, current.x, "quaternion.x"), finiteOrCurrent(update.rotationQuaternion.y, current.y, "quaternion.y"), finiteOrCurrent(update.rotationQuaternion.z, current.z, "quaternion.z"), finiteOrCurrent(update.rotationQuaternion.w, current.w, "quaternion.w"));
153
+ }
154
+ }
155
+ function assignVector(target, update, label) {
156
+ if (!update)
157
+ return;
158
+ target.x = finiteOrCurrent(update.x, target.x, `${label}.x`);
159
+ target.y = finiteOrCurrent(update.y, target.y, `${label}.y`);
160
+ target.z = finiteOrCurrent(update.z, target.z, `${label}.z`);
161
+ }
162
+ function finiteOrCurrent(value, current, label) {
163
+ if (value === undefined)
164
+ return current;
165
+ if (!Number.isFinite(value))
166
+ throw new Error(`${label} must be finite`);
167
+ return value;
168
+ }
169
+ function isAbstractMesh(node) {
170
+ return "visibility" in node && "getBoundingInfo" in node;
171
+ }
172
+ function toVectorValue(value) {
173
+ return { x: value.x, y: value.y, z: value.z };
174
+ }
175
+ //# sourceMappingURL=built-in-runtime-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-in-runtime-capabilities.js","sourceRoot":"","sources":["../../src/core/built-in-runtime-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import type { Material } from "@babylonjs/core/Materials/material";
2
+ import type { Node } from "@babylonjs/core/node";
3
+ import type { MaterialRuntimeProperty, MaterialAnimationPlayOptions, MaterialAnimationResult, MaterialAnimationState, TransformUpdate } from "@skenora/contracts";
4
+ import type { CameraPathPlaybackOptions, CameraPathPlaybackState } from "../systems/camera-path-controller.js";
5
+ export declare const RUNTIME_NODES_CAPABILITY = "runtime.nodes";
6
+ export declare const RUNTIME_MATERIALS_CAPABILITY = "runtime.materials";
7
+ export declare const RUNTIME_MATERIAL_ANIMATIONS_CAPABILITY = "runtime.material-animations";
8
+ export declare const RUNTIME_CAMERA_CAPABILITY = "runtime.camera";
9
+ export declare const RUNTIME_ANIMATIONS_CAPABILITY = "runtime.animations";
10
+ export declare const RUNTIME_PARTICLES_CAPABILITY = "runtime.particles";
11
+ export declare const RUNTIME_TEXTURE_ANIMATIONS_CAPABILITY = "runtime.texture-animations";
12
+ export interface RuntimeEntityState {
13
+ id: string;
14
+ enabled: boolean;
15
+ visible: boolean;
16
+ transform?: TransformUpdate;
17
+ }
18
+ export interface RuntimeNodeCapability {
19
+ get(entityId: string): Node | null;
20
+ require(entityId: string): Node;
21
+ getState(entityId: string): RuntimeEntityState | null;
22
+ setEnabled(entityId: string, enabled: boolean): void;
23
+ setVisible(entityId: string, visible: boolean): void;
24
+ setTransform(entityId: string, transform: TransformUpdate): void;
25
+ setTransparent(entityId: string, alpha: number | null): void;
26
+ setOutline(entityId: string, color: string | null): void;
27
+ }
28
+ export interface RuntimeMaterialCapability {
29
+ get(materialId: string): Material | null;
30
+ setProperty(materialId: string, property: MaterialRuntimeProperty, value: unknown): void;
31
+ }
32
+ export interface RuntimeMaterialAnimationCapability {
33
+ play(materialId: string, animationId: string, options?: MaterialAnimationPlayOptions): Promise<MaterialAnimationResult>;
34
+ pause(materialId: string, animationId: string): boolean;
35
+ resume(materialId: string, animationId: string): boolean;
36
+ stop(materialId: string, animationId: string): void;
37
+ reset(materialId: string, animationId: string): void;
38
+ getState(materialId: string, animationId: string): MaterialAnimationState | null;
39
+ }
40
+ export interface RuntimeCameraCapability {
41
+ frame(entityIds?: readonly string[]): void;
42
+ activateEntity(entityId: string, controls?: boolean): boolean;
43
+ restoreViewport(): void;
44
+ playPath(pathId: string, options?: CameraPathPlaybackOptions): Promise<void>;
45
+ pausePath(): boolean;
46
+ resumePath(): boolean;
47
+ stopPath(): void;
48
+ getPathState(): CameraPathPlaybackState;
49
+ subscribePath(listener: (state: CameraPathPlaybackState) => void): () => void;
50
+ }
51
+ export interface RuntimeAnimationObserver {
52
+ started?(animation: string): void;
53
+ completed?(animation: string): void;
54
+ }
55
+ export interface RuntimeAnimationCapability {
56
+ play(entityId: string, animation?: string | null, observer?: RuntimeAnimationObserver): readonly string[];
57
+ stop(entityId: string, animation?: string | null): void;
58
+ }
59
+ export interface RuntimeParticleCapability {
60
+ setRunning(entityId: string, running: boolean): boolean;
61
+ }
62
+ export interface RuntimeTextureAnimationCapability {
63
+ play(animationId: string, options?: {
64
+ signal?: AbortSignal;
65
+ }): Promise<void>;
66
+ stop(animationId: string): void;
67
+ }
68
+ /**
69
+ * Open capability map. Runtime extensions may augment this interface through
70
+ * TypeScript module augmentation and register their own named capabilities.
71
+ */
72
+ export interface RuntimeCapabilityMap {
73
+ [RUNTIME_NODES_CAPABILITY]: RuntimeNodeCapability;
74
+ [RUNTIME_MATERIALS_CAPABILITY]: RuntimeMaterialCapability;
75
+ [RUNTIME_MATERIAL_ANIMATIONS_CAPABILITY]: RuntimeMaterialAnimationCapability;
76
+ [RUNTIME_CAMERA_CAPABILITY]: RuntimeCameraCapability;
77
+ [RUNTIME_ANIMATIONS_CAPABILITY]: RuntimeAnimationCapability;
78
+ [RUNTIME_PARTICLES_CAPABILITY]: RuntimeParticleCapability;
79
+ [RUNTIME_TEXTURE_ANIMATIONS_CAPABILITY]: RuntimeTextureAnimationCapability;
80
+ }
81
+ export declare class RuntimeCapabilityRegistry {
82
+ #private;
83
+ register<TKey extends keyof RuntimeCapabilityMap>(id: TKey, capability: RuntimeCapabilityMap[TKey]): () => void;
84
+ replace<TKey extends keyof RuntimeCapabilityMap>(id: TKey, capability: RuntimeCapabilityMap[TKey]): RuntimeCapabilityMap[TKey] | null;
85
+ get<TKey extends keyof RuntimeCapabilityMap>(id: TKey): RuntimeCapabilityMap[TKey] | null;
86
+ require<TKey extends keyof RuntimeCapabilityMap>(id: TKey): RuntimeCapabilityMap[TKey];
87
+ has(id: keyof RuntimeCapabilityMap): boolean;
88
+ clear(): void;
89
+ }
90
+ //# sourceMappingURL=runtime-capability-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-capability-registry.d.ts","sourceRoot":"","sources":["../../src/core/runtime-capability-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EACV,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,EACtB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,mCAAmC,CAAC;AAE3C,eAAO,MAAM,wBAAwB,kBAAkB,CAAC;AACxD,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAChE,eAAO,MAAM,sCAAsC,gCACpB,CAAC;AAChC,eAAO,MAAM,yBAAyB,mBAAmB,CAAC;AAC1D,eAAO,MAAM,6BAA6B,uBAAuB,CAAC;AAClE,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAChE,eAAO,MAAM,qCAAqC,+BACpB,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAAC;IACtD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACrD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACrD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;IACjE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;IACzC,WAAW,CACT,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,uBAAuB,EACjC,KAAK,EAAE,OAAO,GACb,IAAI,CAAC;CACT;AAED,MAAM,WAAW,kCAAkC;IACjD,IAAI,CACF,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACxD,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACzD,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpD,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACrD,QAAQ,CACN,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,sBAAsB,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3C,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9D,eAAe,IAAI,IAAI,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,SAAS,IAAI,OAAO,CAAC;IACrB,UAAU,IAAI,OAAO,CAAC;IACtB,QAAQ,IAAI,IAAI,CAAC;IACjB,YAAY,IAAI,uBAAuB,CAAC;IACxC,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC/E;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CACF,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,QAAQ,CAAC,EAAE,wBAAwB,GAClC,SAAS,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;CACzD;AAED,MAAM,WAAW,iCAAiC;IAChD,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,CAAC,wBAAwB,CAAC,EAAE,qBAAqB,CAAC;IAClD,CAAC,4BAA4B,CAAC,EAAE,yBAAyB,CAAC;IAC1D,CAAC,sCAAsC,CAAC,EAAE,kCAAkC,CAAC;IAC7E,CAAC,yBAAyB,CAAC,EAAE,uBAAuB,CAAC;IACrD,CAAC,6BAA6B,CAAC,EAAE,0BAA0B,CAAC;IAC5D,CAAC,4BAA4B,CAAC,EAAE,yBAAyB,CAAC;IAC1D,CAAC,qCAAqC,CAAC,EAAE,iCAAiC,CAAC;CAC5E;AAED,qBAAa,yBAAyB;;IAGpC,QAAQ,CAAC,IAAI,SAAS,MAAM,oBAAoB,EAC9C,EAAE,EAAE,IAAI,EACR,UAAU,EAAE,oBAAoB,CAAC,IAAI,CAAC,GACrC,MAAM,IAAI;IAYb,OAAO,CAAC,IAAI,SAAS,MAAM,oBAAoB,EAC7C,EAAE,EAAE,IAAI,EACR,UAAU,EAAE,oBAAoB,CAAC,IAAI,CAAC,GACrC,oBAAoB,CAAC,IAAI,CAAC,GAAG,IAAI;IAMpC,GAAG,CAAC,IAAI,SAAS,MAAM,oBAAoB,EACzC,EAAE,EAAE,IAAI,GACP,oBAAoB,CAAC,IAAI,CAAC,GAAG,IAAI;IAMpC,OAAO,CAAC,IAAI,SAAS,MAAM,oBAAoB,EAC7C,EAAE,EAAE,IAAI,GACP,oBAAoB,CAAC,IAAI,CAAC;IAQ7B,GAAG,CAAC,EAAE,EAAE,MAAM,oBAAoB,GAAG,OAAO;IAI5C,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,42 @@
1
+ export const RUNTIME_NODES_CAPABILITY = "runtime.nodes";
2
+ export const RUNTIME_MATERIALS_CAPABILITY = "runtime.materials";
3
+ export const RUNTIME_MATERIAL_ANIMATIONS_CAPABILITY = "runtime.material-animations";
4
+ export const RUNTIME_CAMERA_CAPABILITY = "runtime.camera";
5
+ export const RUNTIME_ANIMATIONS_CAPABILITY = "runtime.animations";
6
+ export const RUNTIME_PARTICLES_CAPABILITY = "runtime.particles";
7
+ export const RUNTIME_TEXTURE_ANIMATIONS_CAPABILITY = "runtime.texture-animations";
8
+ export class RuntimeCapabilityRegistry {
9
+ #entries = new Map();
10
+ register(id, capability) {
11
+ if (this.#entries.has(id)) {
12
+ throw new Error(`Runtime capability is already registered: ${String(id)}`);
13
+ }
14
+ this.#entries.set(id, capability);
15
+ return () => {
16
+ if (this.#entries.get(id) === capability)
17
+ this.#entries.delete(id);
18
+ };
19
+ }
20
+ replace(id, capability) {
21
+ const previous = this.get(id);
22
+ this.#entries.set(id, capability);
23
+ return previous;
24
+ }
25
+ get(id) {
26
+ return (this.#entries.get(id) ?? null);
27
+ }
28
+ require(id) {
29
+ const capability = this.get(id);
30
+ if (!capability) {
31
+ throw new Error(`Runtime capability is unavailable: ${String(id)}`);
32
+ }
33
+ return capability;
34
+ }
35
+ has(id) {
36
+ return this.#entries.has(id);
37
+ }
38
+ clear() {
39
+ this.#entries.clear();
40
+ }
41
+ }
42
+ //# sourceMappingURL=runtime-capability-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-capability-registry.js","sourceRoot":"","sources":["../../src/core/runtime-capability-registry.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AACxD,MAAM,CAAC,MAAM,4BAA4B,GAAG,mBAAmB,CAAC;AAChE,MAAM,CAAC,MAAM,sCAAsC,GACjD,6BAA6B,CAAC;AAChC,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;AAC1D,MAAM,CAAC,MAAM,6BAA6B,GAAG,oBAAoB,CAAC;AAClE,MAAM,CAAC,MAAM,4BAA4B,GAAG,mBAAmB,CAAC;AAChE,MAAM,CAAC,MAAM,qCAAqC,GAChD,4BAA4B,CAAC;AA8F/B,MAAM,OAAO,yBAAyB;IAC3B,QAAQ,GAAG,IAAI,GAAG,EAAuC,CAAC;IAEnE,QAAQ,CACN,EAAQ,EACR,UAAsC;QAEtC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,6CAA6C,MAAM,CAAC,EAAE,CAAC,EAAE,CAC1D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,UAAU;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CACL,EAAQ,EACR,UAAsC;QAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAClC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,GAAG,CACD,EAAQ;QAER,OAAO,CACJ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAA4C,IAAI,IAAI,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,CACL,EAAQ;QAER,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,GAAG,CAAC,EAA8B;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ import { type SceneDocumentData } from "@skenora/contracts";
2
+ import type { EventPublisher } from "@skenora/events";
3
+ import type { ResourceResolver } from "@skenora/resources";
4
+ import type { RuntimeEventMap } from "./runtime-events.js";
5
+ export interface LoadDocumentOptions {
6
+ signal?: AbortSignal;
7
+ /** Strict rolls the complete projection back; best-effort keeps valid models. */
8
+ modelLoadPolicy?: "strict" | "best-effort";
9
+ }
10
+ export interface RuntimeDocumentProjectionContext {
11
+ readonly signal?: AbortSignal;
12
+ readonly modelLoadPolicy: NonNullable<LoadDocumentOptions["modelLoadPolicy"]>;
13
+ isCurrent(): boolean;
14
+ }
15
+ export type RuntimeDocumentProjector = (document: Readonly<SceneDocumentData>, resources: ResourceResolver, context: RuntimeDocumentProjectionContext) => Promise<boolean>;
16
+ /**
17
+ * Owns document load generations, validation, lifecycle events, and rollback.
18
+ * The injected projector owns only Babylon projection details.
19
+ */
20
+ export declare class RuntimeDocumentCoordinator {
21
+ #private;
22
+ constructor(events: EventPublisher<RuntimeEventMap>, resetProjection: () => void, project: RuntimeDocumentProjector, preflight?: (document: Readonly<SceneDocumentData>) => void);
23
+ /** Advances only after valid input is accepted; invalid replacement leaves it unchanged. */
24
+ get generation(): number;
25
+ load(input: Readonly<SceneDocumentData>, resources: ResourceResolver, options?: LoadDocumentOptions): Promise<void>;
26
+ dispose(): void;
27
+ }
28
+ //# sourceMappingURL=runtime-document-coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-document-coordinator.d.ts","sourceRoot":"","sources":["../../src/core/runtime-document-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,iFAAiF;IACjF,eAAe,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;CAC5C;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC9E,SAAS,IAAI,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACrC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,gCAAgC,KACtC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;;GAGG;AACH,qBAAa,0BAA0B;;gBAYnC,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,EACvC,eAAe,EAAE,MAAM,IAAI,EAC3B,OAAO,EAAE,wBAAwB,EACjC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,KAAK,IAAI;IAQ7D,4FAA4F;IAC5F,IAAI,UAAU,IAAI,MAAM,CAEvB;IAEK,IAAI,CACR,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAClC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC;IA6ChB,OAAO,IAAI,IAAI;CAsEhB"}
@@ -0,0 +1,124 @@
1
+ import { assertSceneDocument, normalizeSceneDocument, } from "@skenora/contracts";
2
+ /**
3
+ * Owns document load generations, validation, lifecycle events, and rollback.
4
+ * The injected projector owns only Babylon projection details.
5
+ */
6
+ export class RuntimeDocumentCoordinator {
7
+ #events;
8
+ #resetProjection;
9
+ #project;
10
+ #preflight;
11
+ #tail = Promise.resolve();
12
+ #generation = 0;
13
+ #active = null;
14
+ #disposed = false;
15
+ constructor(events, resetProjection, project, preflight) {
16
+ this.#events = events;
17
+ this.#resetProjection = resetProjection;
18
+ this.#project = project;
19
+ this.#preflight = preflight;
20
+ }
21
+ /** Advances only after valid input is accepted; invalid replacement leaves it unchanged. */
22
+ get generation() {
23
+ return this.#generation;
24
+ }
25
+ async load(input, resources, options = {}) {
26
+ this.#assertActive();
27
+ throwIfAborted(options.signal);
28
+ let document;
29
+ try {
30
+ const normalized = normalizeSceneDocument(structuredClone(input));
31
+ assertSceneDocument(normalized);
32
+ this.#preflight?.(normalized);
33
+ document = normalized;
34
+ }
35
+ catch (error) {
36
+ this.#events.publish("runtime.error", { error, operation: "validateDocument" }, { source: "runtime" });
37
+ throw error;
38
+ }
39
+ const generation = ++this.#generation;
40
+ this.#active?.abort();
41
+ const lifetime = new AbortController();
42
+ this.#active = lifetime;
43
+ const abort = () => lifetime.abort();
44
+ options.signal?.addEventListener("abort", abort, { once: true });
45
+ if (options.signal?.aborted)
46
+ abort();
47
+ const operation = this.#tail
48
+ .catch(() => undefined)
49
+ .then(() => this.#run(document, resources, { ...options, signal: lifetime.signal }, generation));
50
+ this.#tail = operation;
51
+ try {
52
+ await operation;
53
+ }
54
+ finally {
55
+ options.signal?.removeEventListener("abort", abort);
56
+ if (this.#active === lifetime)
57
+ this.#active = null;
58
+ }
59
+ }
60
+ dispose() {
61
+ if (this.#disposed)
62
+ return;
63
+ this.#disposed = true;
64
+ this.#generation += 1;
65
+ this.#active?.abort();
66
+ this.#active = null;
67
+ }
68
+ async #run(document, resources, options, generation) {
69
+ const isCurrent = () => !this.#disposed && generation === this.#generation;
70
+ if (!isCurrent())
71
+ return;
72
+ this.#events.publish("runtime.loading", { loading: true }, { source: "runtime" });
73
+ try {
74
+ throwIfAborted(options.signal);
75
+ this.#resetProjection();
76
+ const completed = await this.#project(document, resources, {
77
+ ...(options.signal ? { signal: options.signal } : {}),
78
+ modelLoadPolicy: options.modelLoadPolicy ?? "strict",
79
+ isCurrent,
80
+ });
81
+ if (!completed || !isCurrent())
82
+ return;
83
+ this.#events.publish("runtime.document.applied", { documentId: document.id }, { source: "runtime" });
84
+ }
85
+ catch (error) {
86
+ if (!isCurrent())
87
+ return;
88
+ let failure = error;
89
+ try {
90
+ this.#resetProjection();
91
+ }
92
+ catch (cleanupError) {
93
+ failure = new AggregateError([error, cleanupError], "Runtime load failed and projection cleanup was incomplete");
94
+ }
95
+ if (isAbortError(error) && failure === error)
96
+ throw error;
97
+ this.#events.publish("runtime.error", { error: failure, operation: "loadDocument" }, { source: "runtime" });
98
+ throw failure;
99
+ }
100
+ finally {
101
+ if (isCurrent()) {
102
+ this.#events.publish("runtime.loading", { loading: false }, { source: "runtime" });
103
+ }
104
+ }
105
+ }
106
+ #assertActive() {
107
+ if (this.#disposed) {
108
+ throw new Error("RuntimeDocumentCoordinator has been disposed");
109
+ }
110
+ }
111
+ }
112
+ function throwIfAborted(signal) {
113
+ if (!signal?.aborted)
114
+ return;
115
+ throw new DOMException("The runtime load was aborted", "AbortError");
116
+ }
117
+ function isAbortError(error) {
118
+ return ((error instanceof DOMException && error.name === "AbortError") ||
119
+ (!!error &&
120
+ typeof error === "object" &&
121
+ "name" in error &&
122
+ error.name === "AbortError"));
123
+ }
124
+ //# sourceMappingURL=runtime-document-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-document-coordinator.js","sourceRoot":"","sources":["../../src/core/runtime-document-coordinator.ts"],"names":[],"mappings":"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"}