@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.
- package/README.md +92 -0
- package/dist/core/built-in-runtime-capabilities.d.ts +21 -0
- package/dist/core/built-in-runtime-capabilities.d.ts.map +1 -0
- package/dist/core/built-in-runtime-capabilities.js +175 -0
- package/dist/core/built-in-runtime-capabilities.js.map +1 -0
- package/dist/core/runtime-capability-registry.d.ts +90 -0
- package/dist/core/runtime-capability-registry.d.ts.map +1 -0
- package/dist/core/runtime-capability-registry.js +42 -0
- package/dist/core/runtime-capability-registry.js.map +1 -0
- package/dist/core/runtime-document-coordinator.d.ts +28 -0
- package/dist/core/runtime-document-coordinator.d.ts.map +1 -0
- package/dist/core/runtime-document-coordinator.js +124 -0
- package/dist/core/runtime-document-coordinator.js.map +1 -0
- package/dist/core/runtime-events.d.ts +43 -0
- package/dist/core/runtime-events.d.ts.map +1 -0
- package/dist/core/runtime-events.js +2 -0
- package/dist/core/runtime-events.js.map +1 -0
- package/dist/core/runtime-session.d.ts +93 -0
- package/dist/core/runtime-session.d.ts.map +1 -0
- package/dist/core/runtime-session.js +1344 -0
- package/dist/core/runtime-session.js.map +1 -0
- package/dist/editor-tools/camera-path-editing-controller.d.ts +36 -0
- package/dist/editor-tools/camera-path-editing-controller.d.ts.map +1 -0
- package/dist/editor-tools/camera-path-editing-controller.js +212 -0
- package/dist/editor-tools/camera-path-editing-controller.js.map +1 -0
- package/dist/editor-tools/camera-path-visualizer.d.ts +28 -0
- package/dist/editor-tools/camera-path-visualizer.d.ts.map +1 -0
- package/dist/editor-tools/camera-path-visualizer.js +151 -0
- package/dist/editor-tools/camera-path-visualizer.js.map +1 -0
- package/dist/editor-tools/drop-preview-controller.d.ts +34 -0
- package/dist/editor-tools/drop-preview-controller.d.ts.map +1 -0
- package/dist/editor-tools/drop-preview-controller.js +209 -0
- package/dist/editor-tools/drop-preview-controller.js.map +1 -0
- package/dist/editor-tools/grid-helper.d.ts +18 -0
- package/dist/editor-tools/grid-helper.d.ts.map +1 -0
- package/dist/editor-tools/grid-helper.js +27 -0
- package/dist/editor-tools/grid-helper.js.map +1 -0
- package/dist/editor-tools/light-editing-controller.d.ts +25 -0
- package/dist/editor-tools/light-editing-controller.d.ts.map +1 -0
- package/dist/editor-tools/light-editing-controller.js +207 -0
- package/dist/editor-tools/light-editing-controller.js.map +1 -0
- package/dist/editor-tools/node-operations.d.ts +51 -0
- package/dist/editor-tools/node-operations.d.ts.map +1 -0
- package/dist/editor-tools/node-operations.js +182 -0
- package/dist/editor-tools/node-operations.js.map +1 -0
- package/dist/editor-tools/selection-controller.d.ts +44 -0
- package/dist/editor-tools/selection-controller.d.ts.map +1 -0
- package/dist/editor-tools/selection-controller.js +299 -0
- package/dist/editor-tools/selection-controller.js.map +1 -0
- package/dist/editor-tools/shape-drawing-controller.d.ts +45 -0
- package/dist/editor-tools/shape-drawing-controller.d.ts.map +1 -0
- package/dist/editor-tools/shape-drawing-controller.js +205 -0
- package/dist/editor-tools/shape-drawing-controller.js.map +1 -0
- package/dist/editor-tools/shape-editing-controller.d.ts +40 -0
- package/dist/editor-tools/shape-editing-controller.d.ts.map +1 -0
- package/dist/editor-tools/shape-editing-controller.js +340 -0
- package/dist/editor-tools/shape-editing-controller.js.map +1 -0
- package/dist/editor.d.ts +12 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +12 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/inspection/node-tools.d.ts +51 -0
- package/dist/inspection/node-tools.d.ts.map +1 -0
- package/dist/inspection/node-tools.js +282 -0
- package/dist/inspection/node-tools.js.map +1 -0
- package/dist/interaction/runtime-third-person-controller.d.ts +24 -0
- package/dist/interaction/runtime-third-person-controller.d.ts.map +1 -0
- package/dist/interaction/runtime-third-person-controller.js +71 -0
- package/dist/interaction/runtime-third-person-controller.js.map +1 -0
- package/dist/interaction/third-person-controller.d.ts +61 -0
- package/dist/interaction/third-person-controller.d.ts.map +1 -0
- package/dist/interaction/third-person-controller.js +400 -0
- package/dist/interaction/third-person-controller.js.map +1 -0
- package/dist/interaction.d.ts +3 -0
- package/dist/interaction.d.ts.map +1 -0
- package/dist/interaction.js +3 -0
- package/dist/interaction.js.map +1 -0
- package/dist/presentation/scene-renderer.d.ts +75 -0
- package/dist/presentation/scene-renderer.d.ts.map +1 -0
- package/dist/presentation/scene-renderer.js +324 -0
- package/dist/presentation/scene-renderer.js.map +1 -0
- package/dist/presentation/viewport-controller.d.ts +13 -0
- package/dist/presentation/viewport-controller.d.ts.map +1 -0
- package/dist/presentation/viewport-controller.js +186 -0
- package/dist/presentation/viewport-controller.js.map +1 -0
- package/dist/projection/annotation-projector.d.ts +28 -0
- package/dist/projection/annotation-projector.d.ts.map +1 -0
- package/dist/projection/annotation-projector.js +98 -0
- package/dist/projection/annotation-projector.js.map +1 -0
- package/dist/projection/built-in-entity-projectors.d.ts +7 -0
- package/dist/projection/built-in-entity-projectors.d.ts.map +1 -0
- package/dist/projection/built-in-entity-projectors.js +75 -0
- package/dist/projection/built-in-entity-projectors.js.map +1 -0
- package/dist/projection/camera-entity-factory.d.ts +9 -0
- package/dist/projection/camera-entity-factory.d.ts.map +1 -0
- package/dist/projection/camera-entity-factory.js +93 -0
- package/dist/projection/camera-entity-factory.js.map +1 -0
- package/dist/projection/document-applier.d.ts +38 -0
- package/dist/projection/document-applier.d.ts.map +1 -0
- package/dist/projection/document-applier.js +219 -0
- package/dist/projection/document-applier.js.map +1 -0
- package/dist/projection/entity-projection-registry.d.ts +56 -0
- package/dist/projection/entity-projection-registry.d.ts.map +1 -0
- package/dist/projection/entity-projection-registry.js +121 -0
- package/dist/projection/entity-projection-registry.js.map +1 -0
- package/dist/projection/model-importer.d.ts +41 -0
- package/dist/projection/model-importer.d.ts.map +1 -0
- package/dist/projection/model-importer.js +469 -0
- package/dist/projection/model-importer.js.map +1 -0
- package/dist/projection/particle-capability.d.ts +5 -0
- package/dist/projection/particle-capability.d.ts.map +1 -0
- package/dist/projection/particle-capability.js +2 -0
- package/dist/projection/particle-capability.js.map +1 -0
- package/dist/projection/particle-factory.d.ts +18 -0
- package/dist/projection/particle-factory.d.ts.map +1 -0
- package/dist/projection/particle-factory.js +313 -0
- package/dist/projection/particle-factory.js.map +1 -0
- package/dist/projection/primitive-factory.d.ts +5 -0
- package/dist/projection/primitive-factory.d.ts.map +1 -0
- package/dist/projection/primitive-factory.js +55 -0
- package/dist/projection/primitive-factory.js.map +1 -0
- package/dist/projection/procedural-factory.d.ts +6 -0
- package/dist/projection/procedural-factory.d.ts.map +1 -0
- package/dist/projection/procedural-factory.js +34 -0
- package/dist/projection/procedural-factory.js.map +1 -0
- package/dist/projection/runtime-projection-state.d.ts +19 -0
- package/dist/projection/runtime-projection-state.d.ts.map +1 -0
- package/dist/projection/runtime-projection-state.js +58 -0
- package/dist/projection/runtime-projection-state.js.map +1 -0
- package/dist/projection/shape-factory.d.ts +5 -0
- package/dist/projection/shape-factory.d.ts.map +1 -0
- package/dist/projection/shape-factory.js +101 -0
- package/dist/projection/shape-factory.js.map +1 -0
- package/dist/projection-entry.d.ts +10 -0
- package/dist/projection-entry.d.ts.map +1 -0
- package/dist/projection-entry.js +8 -0
- package/dist/projection-entry.js.map +1 -0
- package/dist/simulation/fixed-step-scheduler.d.ts +13 -0
- package/dist/simulation/fixed-step-scheduler.d.ts.map +1 -0
- package/dist/simulation/fixed-step-scheduler.js +45 -0
- package/dist/simulation/fixed-step-scheduler.js.map +1 -0
- package/dist/simulation/simulation-runtime-model.d.ts +24 -0
- package/dist/simulation/simulation-runtime-model.d.ts.map +1 -0
- package/dist/simulation/simulation-runtime-model.js +63 -0
- package/dist/simulation/simulation-runtime-model.js.map +1 -0
- package/dist/simulation/simulation-wgsl.d.ts +3 -0
- package/dist/simulation/simulation-wgsl.d.ts.map +1 -0
- package/dist/simulation/simulation-wgsl.js +294 -0
- package/dist/simulation/simulation-wgsl.js.map +1 -0
- package/dist/simulation/webgpu-simulation-renderer.d.ts +67 -0
- package/dist/simulation/webgpu-simulation-renderer.d.ts.map +1 -0
- package/dist/simulation/webgpu-simulation-renderer.js +504 -0
- package/dist/simulation/webgpu-simulation-renderer.js.map +1 -0
- package/dist/simulation/webgpu-types.d.ts +90 -0
- package/dist/simulation/webgpu-types.d.ts.map +1 -0
- package/dist/simulation/webgpu-types.js +10 -0
- package/dist/simulation/webgpu-types.js.map +1 -0
- package/dist/simulation.d.ts +4 -0
- package/dist/simulation.d.ts.map +1 -0
- package/dist/simulation.js +4 -0
- package/dist/simulation.js.map +1 -0
- package/dist/systems/animation-controller.d.ts +52 -0
- package/dist/systems/animation-controller.d.ts.map +1 -0
- package/dist/systems/animation-controller.js +146 -0
- package/dist/systems/animation-controller.js.map +1 -0
- package/dist/systems/camera-controller.d.ts +41 -0
- package/dist/systems/camera-controller.d.ts.map +1 -0
- package/dist/systems/camera-controller.js +207 -0
- package/dist/systems/camera-controller.js.map +1 -0
- package/dist/systems/camera-path-controller.d.ts +39 -0
- package/dist/systems/camera-path-controller.d.ts.map +1 -0
- package/dist/systems/camera-path-controller.js +287 -0
- package/dist/systems/camera-path-controller.js.map +1 -0
- package/dist/systems/environment-controller.d.ts +18 -0
- package/dist/systems/environment-controller.d.ts.map +1 -0
- package/dist/systems/environment-controller.js +251 -0
- package/dist/systems/environment-controller.js.map +1 -0
- package/dist/systems/environment-texture.d.ts +7 -0
- package/dist/systems/environment-texture.d.ts.map +1 -0
- package/dist/systems/environment-texture.js +57 -0
- package/dist/systems/environment-texture.js.map +1 -0
- package/dist/systems/fog-controller.d.ts +12 -0
- package/dist/systems/fog-controller.d.ts.map +1 -0
- package/dist/systems/fog-controller.js +60 -0
- package/dist/systems/fog-controller.js.map +1 -0
- package/dist/systems/generated-texture-cache.d.ts +33 -0
- package/dist/systems/generated-texture-cache.d.ts.map +1 -0
- package/dist/systems/generated-texture-cache.js +101 -0
- package/dist/systems/generated-texture-cache.js.map +1 -0
- package/dist/systems/glass-transmission-controller.d.ts +21 -0
- package/dist/systems/glass-transmission-controller.d.ts.map +1 -0
- package/dist/systems/glass-transmission-controller.js +119 -0
- package/dist/systems/glass-transmission-controller.js.map +1 -0
- package/dist/systems/gpu-program-cache.d.ts +19 -0
- package/dist/systems/gpu-program-cache.d.ts.map +1 -0
- package/dist/systems/gpu-program-cache.js +95 -0
- package/dist/systems/gpu-program-cache.js.map +1 -0
- package/dist/systems/ground-controller.d.ts +14 -0
- package/dist/systems/ground-controller.d.ts.map +1 -0
- package/dist/systems/ground-controller.js +121 -0
- package/dist/systems/ground-controller.js.map +1 -0
- package/dist/systems/lighting-controller.d.ts +23 -0
- package/dist/systems/lighting-controller.d.ts.map +1 -0
- package/dist/systems/lighting-controller.js +204 -0
- package/dist/systems/lighting-controller.js.map +1 -0
- package/dist/systems/material-animation-controller.d.ts +26 -0
- package/dist/systems/material-animation-controller.d.ts.map +1 -0
- package/dist/systems/material-animation-controller.js +221 -0
- package/dist/systems/material-animation-controller.js.map +1 -0
- package/dist/systems/material-binding-resolver.d.ts +16 -0
- package/dist/systems/material-binding-resolver.d.ts.map +1 -0
- package/dist/systems/material-binding-resolver.js +54 -0
- package/dist/systems/material-binding-resolver.js.map +1 -0
- package/dist/systems/material-controller.d.ts +29 -0
- package/dist/systems/material-controller.d.ts.map +1 -0
- package/dist/systems/material-controller.js +233 -0
- package/dist/systems/material-controller.js.map +1 -0
- package/dist/systems/material-preparation.d.ts +9 -0
- package/dist/systems/material-preparation.d.ts.map +1 -0
- package/dist/systems/material-preparation.js +51 -0
- package/dist/systems/material-preparation.js.map +1 -0
- package/dist/systems/material-slots.d.ts +18 -0
- package/dist/systems/material-slots.d.ts.map +1 -0
- package/dist/systems/material-slots.js +78 -0
- package/dist/systems/material-slots.js.map +1 -0
- package/dist/systems/owned-material-controller.d.ts +20 -0
- package/dist/systems/owned-material-controller.d.ts.map +1 -0
- package/dist/systems/owned-material-controller.js +611 -0
- package/dist/systems/owned-material-controller.js.map +1 -0
- package/dist/systems/pbr-material.d.ts +22 -0
- package/dist/systems/pbr-material.d.ts.map +1 -0
- package/dist/systems/pbr-material.js +358 -0
- package/dist/systems/pbr-material.js.map +1 -0
- package/dist/systems/post-process-controller.d.ts +17 -0
- package/dist/systems/post-process-controller.d.ts.map +1 -0
- package/dist/systems/post-process-controller.js +246 -0
- package/dist/systems/post-process-controller.js.map +1 -0
- package/dist/systems/runtime-clock.d.ts +9 -0
- package/dist/systems/runtime-clock.d.ts.map +1 -0
- package/dist/systems/runtime-clock.js +25 -0
- package/dist/systems/runtime-clock.js.map +1 -0
- package/dist/systems/skybox-controller.d.ts +15 -0
- package/dist/systems/skybox-controller.d.ts.map +1 -0
- package/dist/systems/skybox-controller.js +282 -0
- package/dist/systems/skybox-controller.js.map +1 -0
- package/dist/systems/sprite-sheet-controller.d.ts +52 -0
- package/dist/systems/sprite-sheet-controller.d.ts.map +1 -0
- package/dist/systems/sprite-sheet-controller.js +187 -0
- package/dist/systems/sprite-sheet-controller.js.map +1 -0
- package/dist/systems/surface-effect-plugin.d.ts +26 -0
- package/dist/systems/surface-effect-plugin.d.ts.map +1 -0
- package/dist/systems/surface-effect-plugin.js +204 -0
- package/dist/systems/surface-effect-plugin.js.map +1 -0
- package/dist/systems/surface-program-plugin.d.ts +29 -0
- package/dist/systems/surface-program-plugin.d.ts.map +1 -0
- package/dist/systems/surface-program-plugin.js +139 -0
- package/dist/systems/surface-program-plugin.js.map +1 -0
- package/dist/systems/texture-animation-controller.d.ts +18 -0
- package/dist/systems/texture-animation-controller.d.ts.map +1 -0
- package/dist/systems/texture-animation-controller.js +147 -0
- package/dist/systems/texture-animation-controller.js.map +1 -0
- package/dist/systems/weather-controller.d.ts +16 -0
- package/dist/systems/weather-controller.d.ts.map +1 -0
- package/dist/systems/weather-controller.js +205 -0
- package/dist/systems/weather-controller.js.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|