@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
@@ -0,0 +1,246 @@
1
+ import { ColorCurves } from "@babylonjs/core/Materials/colorCurves";
2
+ import { ImageProcessingConfiguration } from "@babylonjs/core/Materials/imageProcessingConfiguration";
3
+ import { DefaultRenderingPipeline } from "@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline";
4
+ import { SSAORenderingPipeline } from "@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline";
5
+ import { DepthOfFieldEffectBlurLevel } from "@babylonjs/core/PostProcesses/depthOfFieldEffect";
6
+ /** Owns every post-processing object created from a scene document. */
7
+ export class PostProcessController {
8
+ scene;
9
+ #pipeline = null;
10
+ #ssao = null;
11
+ #camera = null;
12
+ #config = null;
13
+ #disposed = false;
14
+ constructor(scene) {
15
+ this.scene = scene;
16
+ }
17
+ get pipeline() {
18
+ return this.#pipeline;
19
+ }
20
+ get ssaoPipeline() {
21
+ return this.#ssao;
22
+ }
23
+ apply(config) {
24
+ this.#assertActive();
25
+ this.#config = structuredClone(config);
26
+ const camera = this.scene.activeCamera;
27
+ if (!config.enabled || !camera) {
28
+ this.#disposePipelines();
29
+ this.#disableImageProcessing();
30
+ return;
31
+ }
32
+ if (!this.#pipeline || this.#camera !== camera) {
33
+ this.#disposePipelines();
34
+ this.#camera = camera;
35
+ this.#pipeline = new DefaultRenderingPipeline("skenora-default-pipeline", true, this.scene, [camera], true);
36
+ }
37
+ const pipeline = this.#pipeline;
38
+ pipeline.samples = config.antialiasing === "samples" ? config.samples : 1;
39
+ pipeline.fxaaEnabled = config.antialiasing === "fxaa";
40
+ pipeline.imageProcessingEnabled = config.imageProcessing;
41
+ pipeline.imageProcessing.ditheringEnabled = config.dithering;
42
+ pipeline.bloomEnabled = config.bloom;
43
+ pipeline.bloomWeight = config.bloomWeight;
44
+ pipeline.bloomThreshold = config.bloomThreshold;
45
+ pipeline.bloomKernel = config.bloomKernel;
46
+ pipeline.sharpenEnabled = config.sharpen;
47
+ pipeline.sharpen.edgeAmount = config.sharpenEdgeAmount;
48
+ pipeline.sharpen.colorAmount = config.sharpenColorAmount;
49
+ pipeline.grainEnabled = config.grain;
50
+ pipeline.grain.intensity = config.grainIntensity;
51
+ pipeline.grain.animated = config.grainAnimated;
52
+ pipeline.glowLayerEnabled = config.glow;
53
+ if (pipeline.glowLayer) {
54
+ pipeline.glowLayer.intensity = config.glowIntensity;
55
+ pipeline.glowLayer.blurKernelSize = config.glowBlurKernelSize;
56
+ }
57
+ pipeline.chromaticAberrationEnabled = config.chromaticAberration;
58
+ pipeline.chromaticAberration.aberrationAmount =
59
+ config.chromaticAberrationAmount;
60
+ pipeline.chromaticAberration.radialIntensity =
61
+ config.chromaticAberrationRadialIntensity;
62
+ setChromaticDirection(pipeline, config.chromaticAberrationDirection);
63
+ pipeline.depthOfFieldEnabled = config.depthOfField;
64
+ pipeline.depthOfFieldBlurLevel = toBlurLevel(config.depthOfFieldBlurLevel);
65
+ pipeline.depthOfField.focusDistance = config.depthOfFieldFocusDistance;
66
+ pipeline.depthOfField.fStop = config.depthOfFieldFStop;
67
+ pipeline.depthOfField.focalLength = config.depthOfFieldFocalLength;
68
+ pipeline.depthOfField.lensSize = config.depthOfFieldLensSize;
69
+ this.#applyImageProcessing(config);
70
+ this.#applySsao(config, camera);
71
+ }
72
+ refreshCamera() {
73
+ this.#assertActive();
74
+ if (this.#config)
75
+ this.apply(this.#config);
76
+ }
77
+ capture(fallback) {
78
+ const pipeline = this.#pipeline;
79
+ const image = this.scene.imageProcessingConfiguration;
80
+ if (!pipeline)
81
+ return { ...fallback, enabled: false };
82
+ const direction = pipeline.chromaticAberration.direction;
83
+ return {
84
+ ...fallback,
85
+ enabled: true,
86
+ antialiasing: pipeline.fxaaEnabled
87
+ ? "fxaa"
88
+ : pipeline.samples > 1
89
+ ? "samples"
90
+ : "none",
91
+ samples: pipeline.samples,
92
+ imageProcessing: pipeline.imageProcessingEnabled,
93
+ dithering: pipeline.imageProcessing.ditheringEnabled,
94
+ bloom: pipeline.bloomEnabled,
95
+ bloomWeight: readNumber(pipeline.bloomWeight, fallback.bloomWeight),
96
+ bloomThreshold: readNumber(pipeline.bloomThreshold, fallback.bloomThreshold),
97
+ bloomKernel: readNumber(pipeline.bloomKernel, fallback.bloomKernel),
98
+ sharpen: pipeline.sharpenEnabled,
99
+ sharpenEdgeAmount: pipeline.sharpen.edgeAmount,
100
+ sharpenColorAmount: pipeline.sharpen.colorAmount,
101
+ grain: pipeline.grainEnabled,
102
+ grainIntensity: pipeline.grain.intensity,
103
+ grainAnimated: pipeline.grain.animated,
104
+ glow: pipeline.glowLayerEnabled,
105
+ glowIntensity: pipeline.glowLayer?.intensity ?? fallback.glowIntensity,
106
+ glowBlurKernelSize: pipeline.glowLayer?.blurKernelSize ?? fallback.glowBlurKernelSize,
107
+ chromaticAberration: pipeline.chromaticAberrationEnabled,
108
+ chromaticAberrationAmount: readNumber(pipeline.chromaticAberration.aberrationAmount, fallback.chromaticAberrationAmount),
109
+ chromaticAberrationRadialIntensity: readNumber(pipeline.chromaticAberration.radialIntensity, fallback.chromaticAberrationRadialIntensity),
110
+ chromaticAberrationDirection: direction.x === 0 && direction.y === 0
111
+ ? 0
112
+ : Math.atan2(direction.x, direction.y),
113
+ depthOfField: pipeline.depthOfFieldEnabled,
114
+ depthOfFieldBlurLevel: fromBlurLevel(pipeline.depthOfFieldBlurLevel),
115
+ depthOfFieldFocusDistance: readNumber(pipeline.depthOfField.focusDistance, fallback.depthOfFieldFocusDistance),
116
+ depthOfFieldFStop: readNumber(pipeline.depthOfField.fStop, fallback.depthOfFieldFStop),
117
+ depthOfFieldFocalLength: readNumber(pipeline.depthOfField.focalLength, fallback.depthOfFieldFocalLength),
118
+ depthOfFieldLensSize: readNumber(pipeline.depthOfField.lensSize, fallback.depthOfFieldLensSize),
119
+ exposure: image.exposure,
120
+ contrast: image.contrast,
121
+ vignetteEnabled: image.vignetteEnabled,
122
+ vignetteWeight: image.vignetteWeight,
123
+ vignetteCameraFov: image.vignetteCameraFov,
124
+ toneMappingEnabled: image.toneMappingEnabled,
125
+ toneMappingType: image.toneMappingType === ImageProcessingConfiguration.TONEMAPPING_ACES
126
+ ? "aces"
127
+ : "standard",
128
+ colorCurves: {
129
+ enabled: image.colorCurvesEnabled,
130
+ globalHue: image.colorCurves?.globalHue ?? fallback.colorCurves.globalHue,
131
+ globalDensity: image.colorCurves?.globalDensity ??
132
+ fallback.colorCurves.globalDensity,
133
+ globalSaturation: image.colorCurves?.globalSaturation ??
134
+ fallback.colorCurves.globalSaturation,
135
+ },
136
+ ssao: this.#ssao
137
+ ? {
138
+ ...fallback.ssao,
139
+ enabled: true,
140
+ totalStrength: this.#ssao.totalStrength,
141
+ base: this.#ssao.base,
142
+ radius: this.#ssao.radius,
143
+ area: this.#ssao.area,
144
+ fallOff: this.#ssao.fallOff,
145
+ }
146
+ : { ...fallback.ssao, enabled: false },
147
+ };
148
+ }
149
+ dispose() {
150
+ if (this.#disposed)
151
+ return;
152
+ this.#disposed = true;
153
+ this.#disposePipelines();
154
+ this.#config = null;
155
+ }
156
+ #applyImageProcessing(config) {
157
+ const image = this.scene.imageProcessingConfiguration;
158
+ image.exposure = config.exposure;
159
+ image.contrast = config.contrast;
160
+ image.vignetteEnabled = config.vignetteEnabled;
161
+ image.vignetteWeight = config.vignetteWeight;
162
+ image.vignetteCameraFov = config.vignetteCameraFov;
163
+ image.toneMappingEnabled = config.toneMappingEnabled;
164
+ image.toneMappingType =
165
+ config.toneMappingType === "aces"
166
+ ? ImageProcessingConfiguration.TONEMAPPING_ACES
167
+ : ImageProcessingConfiguration.TONEMAPPING_STANDARD;
168
+ image.colorCurvesEnabled = config.colorCurves.enabled;
169
+ image.colorCurves ??= new ColorCurves();
170
+ image.colorCurves.globalHue = config.colorCurves.globalHue;
171
+ image.colorCurves.globalDensity = config.colorCurves.globalDensity;
172
+ image.colorCurves.globalSaturation = config.colorCurves.globalSaturation;
173
+ }
174
+ #applySsao(config, camera) {
175
+ if (!config.ssao.enabled) {
176
+ this.#disposeSsao();
177
+ return;
178
+ }
179
+ if (!this.#ssao) {
180
+ this.#ssao = new SSAORenderingPipeline("skenora-ssao-pipeline", this.scene, {
181
+ ssaoRatio: config.ssao.ssaoRatio,
182
+ combineRatio: config.ssao.combineRatio,
183
+ });
184
+ this.scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this.#ssao.name, camera);
185
+ }
186
+ this.#ssao.totalStrength = config.ssao.totalStrength;
187
+ this.#ssao.base = config.ssao.base;
188
+ this.#ssao.radius = config.ssao.radius;
189
+ this.#ssao.area = config.ssao.area;
190
+ this.#ssao.fallOff = config.ssao.fallOff;
191
+ }
192
+ #disableImageProcessing() {
193
+ const image = this.scene.imageProcessingConfiguration;
194
+ image.vignetteEnabled = false;
195
+ image.colorCurvesEnabled = false;
196
+ image.toneMappingEnabled = false;
197
+ }
198
+ #disposePipelines() {
199
+ this.#disposeSsao();
200
+ this.#pipeline?.dispose();
201
+ this.#pipeline = null;
202
+ this.#camera = null;
203
+ }
204
+ #disposeSsao() {
205
+ if (!this.#ssao)
206
+ return;
207
+ if (this.#camera) {
208
+ this.scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this.#ssao.name, this.#camera);
209
+ }
210
+ this.#ssao.dispose();
211
+ this.#ssao = null;
212
+ }
213
+ #assertActive() {
214
+ if (this.#disposed) {
215
+ throw new Error("PostProcessController has been disposed");
216
+ }
217
+ }
218
+ }
219
+ function setChromaticDirection(pipeline, radians) {
220
+ if (radians === 0) {
221
+ pipeline.chromaticAberration.direction.set(0, 0);
222
+ return;
223
+ }
224
+ pipeline.chromaticAberration.direction.set(Math.sin(radians), Math.cos(radians));
225
+ }
226
+ function toBlurLevel(value) {
227
+ if (value === "high")
228
+ return DepthOfFieldEffectBlurLevel.High;
229
+ if (value === "medium")
230
+ return DepthOfFieldEffectBlurLevel.Medium;
231
+ return DepthOfFieldEffectBlurLevel.Low;
232
+ }
233
+ function fromBlurLevel(value) {
234
+ if (value === DepthOfFieldEffectBlurLevel.High)
235
+ return "high";
236
+ if (value === DepthOfFieldEffectBlurLevel.Medium)
237
+ return "medium";
238
+ return "low";
239
+ }
240
+ function readNumber(value, fallback) {
241
+ if (typeof value === "number")
242
+ return value;
243
+ const candidate = value?.value;
244
+ return typeof candidate === "number" ? candidate : fallback;
245
+ }
246
+ //# sourceMappingURL=post-process-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-process-controller.js","sourceRoot":"","sources":["../../src/systems/post-process-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** Session-owned active render time. No timers, global state, or mesh callbacks. */
2
+ export declare class RuntimeClock {
3
+ #private;
4
+ subscribe(listener: (deltaMs: number) => void): () => void;
5
+ tick(now: number): void;
6
+ resetInterval(): void;
7
+ dispose(): void;
8
+ }
9
+ //# sourceMappingURL=runtime-clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-clock.d.ts","sourceRoot":"","sources":["../../src/systems/runtime-clock.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,qBAAa,YAAY;;IAIvB,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAK1D,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQvB,aAAa,IAAI,IAAI;IAGrB,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,25 @@
1
+ /** Session-owned active render time. No timers, global state, or mesh callbacks. */
2
+ export class RuntimeClock {
3
+ #last = null;
4
+ #listeners = new Set();
5
+ subscribe(listener) {
6
+ this.#listeners.add(listener);
7
+ return () => this.#listeners.delete(listener);
8
+ }
9
+ tick(now) {
10
+ if (!Number.isFinite(now))
11
+ return;
12
+ const delta = this.#last === null ? 0 : Math.min(100, Math.max(0, now - this.#last));
13
+ this.#last = now;
14
+ for (const listener of this.#listeners)
15
+ listener(delta);
16
+ }
17
+ resetInterval() {
18
+ this.#last = null;
19
+ }
20
+ dispose() {
21
+ this.#last = null;
22
+ this.#listeners.clear();
23
+ }
24
+ }
25
+ //# sourceMappingURL=runtime-clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-clock.js","sourceRoot":"","sources":["../../src/systems/runtime-clock.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,OAAO,YAAY;IACvB,KAAK,GAAkB,IAAI,CAAC;IACnB,UAAU,GAAG,IAAI,GAAG,EAA6B,CAAC;IAE3D,SAAS,CAAC,QAAmC;QAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,GAAW;QACd,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO;QAClC,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;QACjB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU;YAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,aAAa;QACX,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,OAAO;QACL,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { Scene } from "@babylonjs/core/scene";
2
+ import { type SceneDocumentData, type SkyboxConfig } from "@skenora/contracts";
3
+ import type { ResourceResolver } from "@skenora/resources";
4
+ /** Owns the visible sky only; IBL, lights, fog state, and time stay external. */
5
+ export declare class SkyboxController {
6
+ #private;
7
+ readonly scene: Scene;
8
+ readonly resources: ResourceResolver;
9
+ constructor(scene: Scene, resources: ResourceResolver);
10
+ get visible(): boolean;
11
+ setVisible(visible: boolean): void;
12
+ apply(document: Readonly<SceneDocumentData>, config: Readonly<SkyboxConfig> | null, isCurrent?: () => boolean): Promise<void>;
13
+ dispose(): void;
14
+ }
15
+ //# sourceMappingURL=skybox-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skybox-controller.d.ts","sourceRoot":"","sources":["../../src/systems/skybox-controller.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAEV,gBAAgB,EAEjB,MAAM,oBAAoB,CAAC;AAiC5B,iFAAiF;AACjF,qBAAa,gBAAgB;;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;gBAOzB,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB;IAKrD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAM5B,KAAK,CACT,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACrC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,EACrC,SAAS,GAAE,MAAM,OAA+B,GAC/C,OAAO,CAAC,IAAI,CAAC;IAiChB,OAAO,IAAI,IAAI;CAkHhB"}
@@ -0,0 +1,282 @@
1
+ import { BackgroundMaterial } from "@babylonjs/core/Materials/Background/backgroundMaterial";
2
+ import { CubeTexture } from "@babylonjs/core/Materials/Textures/cubeTexture";
3
+ import { EquiRectangularCubeTexture } from "@babylonjs/core/Materials/Textures/equiRectangularCubeTexture";
4
+ import { Texture } from "@babylonjs/core/Materials/Textures/texture";
5
+ import { Vector3 } from "@babylonjs/core/Maths/math.vector";
6
+ import { CreateBox } from "@babylonjs/core/Meshes/Builders/boxBuilder";
7
+ import { DEFAULT_ATMOSPHERE_SKY_PARAMETERS, } from "@skenora/contracts";
8
+ import { loadEnvironmentTexture } from "./environment-texture.js";
9
+ const CUBEMAP_FACE_KEYS = [
10
+ "positiveX",
11
+ "positiveY",
12
+ "positiveZ",
13
+ "negativeX",
14
+ "negativeY",
15
+ "negativeZ",
16
+ ];
17
+ /** Owns the visible sky only; IBL, lights, fog state, and time stay external. */
18
+ export class SkyboxController {
19
+ scene;
20
+ resources;
21
+ #current = null;
22
+ #stagingScope = null;
23
+ #visible = true;
24
+ #revision = 0;
25
+ #disposed = false;
26
+ constructor(scene, resources) {
27
+ this.scene = scene;
28
+ this.resources = resources;
29
+ }
30
+ get visible() {
31
+ return this.#visible;
32
+ }
33
+ setVisible(visible) {
34
+ this.#assertActive();
35
+ this.#visible = visible;
36
+ this.#current?.mesh.setEnabled(visible);
37
+ }
38
+ async apply(document, config, isCurrent = () => !this.#disposed) {
39
+ this.#assertActive();
40
+ const revision = ++this.#revision;
41
+ const current = () => isCurrent() && revision === this.#revision;
42
+ this.#stagingScope?.dispose();
43
+ this.#stagingScope = null;
44
+ if (!config) {
45
+ if (current())
46
+ this.#replace(null);
47
+ return;
48
+ }
49
+ if (this.#current && usesSameSource(this.#current.config, config)) {
50
+ if (!current())
51
+ return;
52
+ updateInstance(this.#current, config);
53
+ this.#current.config = structuredClone(config);
54
+ return;
55
+ }
56
+ let staged;
57
+ try {
58
+ staged = await this.#createInstance(document, config);
59
+ }
60
+ catch (error) {
61
+ if (!current())
62
+ return;
63
+ throw error;
64
+ }
65
+ if (!current()) {
66
+ disposeInstance(staged);
67
+ return;
68
+ }
69
+ staged.mesh.setEnabled(this.#visible);
70
+ this.#replace(staged);
71
+ }
72
+ dispose() {
73
+ if (this.#disposed)
74
+ return;
75
+ this.#disposed = true;
76
+ this.#revision += 1;
77
+ this.#stagingScope?.dispose();
78
+ this.#stagingScope = null;
79
+ this.#replace(null);
80
+ }
81
+ async #createInstance(document, config) {
82
+ if (config.source.kind === "procedural") {
83
+ const { SkyMaterial } = await import("@babylonjs/materials/sky/skyMaterial");
84
+ const material = new SkyMaterial("skenora-procedural-sky", this.scene);
85
+ try {
86
+ material.backFaceCulling = false;
87
+ const mesh = createSkyMesh(this.scene, "procedural");
88
+ mesh.material = material;
89
+ const instance = {
90
+ kind: "procedural",
91
+ mesh,
92
+ material,
93
+ scope: null,
94
+ config: structuredClone(config),
95
+ };
96
+ updateInstance(instance, config);
97
+ return instance;
98
+ }
99
+ catch (error) {
100
+ material.dispose(true);
101
+ throw error;
102
+ }
103
+ }
104
+ const scope = this.resources.createScope();
105
+ this.#stagingScope = scope;
106
+ let texture = null;
107
+ try {
108
+ if (config.source.kind === "environment") {
109
+ const asset = requireAsset(document, config.source.assetId, "environment");
110
+ const resource = await scope.acquire(asset, {
111
+ expectedKind: "environment",
112
+ });
113
+ texture = await loadEnvironmentTexture(this.scene, resource.objectUrl, resource.name, config.source.format ?? "auto");
114
+ }
115
+ else if (config.source.kind === "cubemap") {
116
+ const resources = await acquireCubemapFaces(scope, document, config.source.faces);
117
+ texture = await loadCubemapTexture(this.scene, resources.map((resource) => resource.objectUrl));
118
+ }
119
+ else {
120
+ const asset = requireAsset(document, config.source.assetId, "texture");
121
+ const resource = await scope.acquire(asset, {
122
+ expectedKind: "texture",
123
+ });
124
+ texture = await loadPanoramaTexture(this.scene, resource.objectUrl, config.source.resolution ?? 512);
125
+ }
126
+ const material = new BackgroundMaterial("skenora-texture-sky-material", this.scene);
127
+ material.backFaceCulling = false;
128
+ material.reflectionTexture = texture;
129
+ texture.coordinatesMode = Texture.SKYBOX_MODE;
130
+ const mesh = createSkyMesh(this.scene, config.source.kind);
131
+ mesh.material = material;
132
+ const instance = {
133
+ kind: config.source.kind,
134
+ mesh,
135
+ material,
136
+ texture,
137
+ scope,
138
+ config: structuredClone(config),
139
+ };
140
+ updateInstance(instance, config);
141
+ return instance;
142
+ }
143
+ catch (error) {
144
+ texture?.dispose();
145
+ scope.dispose();
146
+ throw error;
147
+ }
148
+ finally {
149
+ if (this.#stagingScope === scope)
150
+ this.#stagingScope = null;
151
+ }
152
+ }
153
+ #replace(next) {
154
+ const previous = this.#current;
155
+ this.#current = next;
156
+ if (previous && previous !== next)
157
+ disposeInstance(previous);
158
+ }
159
+ #assertActive() {
160
+ if (this.#disposed)
161
+ throw new Error("SkyboxController has been disposed");
162
+ }
163
+ }
164
+ async function acquireCubemapFaces(scope, document, faces) {
165
+ return Promise.all(CUBEMAP_FACE_KEYS.map((face) => {
166
+ const asset = requireAsset(document, faces[face], "texture");
167
+ return scope.acquire(asset, { expectedKind: "texture" });
168
+ }));
169
+ }
170
+ function requireAsset(document, assetId, kind) {
171
+ const asset = document.assets[assetId];
172
+ if (!asset || asset.kind !== kind) {
173
+ throw new Error(`Skybox ${kind} asset not found: ${assetId}`);
174
+ }
175
+ return asset;
176
+ }
177
+ function loadCubemapTexture(scene, files) {
178
+ return loadTexture((onLoad, onError) => new CubeTexture(files.join("|"), scene, {
179
+ files: [...files],
180
+ onLoad,
181
+ onError,
182
+ }));
183
+ }
184
+ function loadPanoramaTexture(scene, url, resolution) {
185
+ return loadTexture((onLoad, onError) => new EquiRectangularCubeTexture(url, scene, resolution, false, true, onLoad, onError));
186
+ }
187
+ function loadTexture(create) {
188
+ return new Promise((resolve, reject) => {
189
+ let texture = null;
190
+ let settled = false;
191
+ const onLoad = () => {
192
+ if (!texture || settled)
193
+ return;
194
+ settled = true;
195
+ resolve(texture);
196
+ };
197
+ const onError = (message, exception) => {
198
+ if (settled)
199
+ return;
200
+ settled = true;
201
+ texture?.dispose();
202
+ reject(exception instanceof Error
203
+ ? exception
204
+ : new Error(message || "Skybox texture could not be loaded"));
205
+ };
206
+ texture = create(onLoad, onError);
207
+ if (texture.isReady())
208
+ onLoad();
209
+ });
210
+ }
211
+ function createSkyMesh(scene, sourceKind) {
212
+ const mesh = CreateBox("skenora-skybox", { size: 1_000 }, scene);
213
+ mesh.setEnabled(false);
214
+ mesh.isPickable = false;
215
+ mesh.infiniteDistance = true;
216
+ mesh.ignoreCameraMaxZ = true;
217
+ mesh.metadata = {
218
+ skenora: { helper: "skybox", managed: true, sourceKind },
219
+ };
220
+ return mesh;
221
+ }
222
+ function updateInstance(instance, config) {
223
+ const participatesInFog = config.fogParticipation === "inherit";
224
+ instance.mesh.applyFog = participatesInFog;
225
+ instance.material.fogEnabled = participatesInFog;
226
+ if (instance.kind === "procedural") {
227
+ instance.mesh.rotation.y = config.rotationY ?? 0;
228
+ applyAtmosphereParameters(instance.material, config.source.kind === "procedural"
229
+ ? config.source.parameters
230
+ : undefined);
231
+ return;
232
+ }
233
+ instance.material.reflectionBlur = config.blur ?? 0;
234
+ const rotatable = instance.texture;
235
+ if ("rotationY" in rotatable) {
236
+ rotatable.rotationY = config.rotationY ?? 0;
237
+ instance.mesh.rotation.y = 0;
238
+ }
239
+ else {
240
+ instance.mesh.rotation.y = config.rotationY ?? 0;
241
+ }
242
+ }
243
+ function applyAtmosphereParameters(material, parameters) {
244
+ const values = { ...DEFAULT_ATMOSPHERE_SKY_PARAMETERS, ...parameters };
245
+ material.luminance = values.luminance;
246
+ material.turbidity = values.turbidity;
247
+ material.rayleigh = values.rayleigh;
248
+ material.mieCoefficient = values.mieCoefficient;
249
+ material.mieDirectionalG = values.mieDirectionalG;
250
+ material.dithering = values.dithering;
251
+ material.useSunPosition = true;
252
+ material.cameraOffset.copyFromFloats(0, values.horizonOffset, 0);
253
+ material.up.copyFromFloats(values.up.x, values.up.y, values.up.z).normalize();
254
+ const sunDirection = new Vector3(values.sunDiskDirection.x, values.sunDiskDirection.y, values.sunDiskDirection.z).normalize();
255
+ material.sunPosition.copyFrom(sunDirection.scale(material.distance));
256
+ }
257
+ function usesSameSource(left, right) {
258
+ if (left.source.kind !== right.source.kind)
259
+ return false;
260
+ if (left.source.kind === "procedural")
261
+ return true;
262
+ if (left.source.kind === "environment") {
263
+ return (right.source.kind === "environment" &&
264
+ left.source.assetId === right.source.assetId &&
265
+ (left.source.format ?? "auto") === (right.source.format ?? "auto"));
266
+ }
267
+ if (left.source.kind === "panorama") {
268
+ return (right.source.kind === "panorama" &&
269
+ left.source.assetId === right.source.assetId &&
270
+ (left.source.resolution ?? 512) === (right.source.resolution ?? 512));
271
+ }
272
+ if (right.source.kind !== "cubemap")
273
+ return false;
274
+ const leftFaces = left.source.faces;
275
+ const rightFaces = right.source.faces;
276
+ return CUBEMAP_FACE_KEYS.every((face) => leftFaces[face] === rightFaces[face]);
277
+ }
278
+ function disposeInstance(instance) {
279
+ instance.mesh.dispose(false, true);
280
+ instance.scope?.dispose();
281
+ }
282
+ //# sourceMappingURL=skybox-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skybox-controller.js","sourceRoot":"","sources":["../../src/systems/skybox-controller.ts"],"names":[],"mappings":"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"}