@fps-games/engine 0.0.1-beta.2 → 0.0.1-beta.21

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 (333) hide show
  1. package/dist/asset-resource.d.ts +45 -0
  2. package/dist/asset-resource.d.ts.map +1 -0
  3. package/dist/asset-resource.js +147 -0
  4. package/dist/asset-resource.js.map +1 -0
  5. package/dist/babylon/camera.d.ts +25 -0
  6. package/dist/babylon/camera.d.ts.map +1 -0
  7. package/dist/babylon/camera.js +149 -0
  8. package/dist/babylon/camera.js.map +1 -0
  9. package/dist/babylon/frame-pump.d.ts +27 -0
  10. package/dist/babylon/frame-pump.d.ts.map +1 -0
  11. package/dist/babylon/frame-pump.js +90 -0
  12. package/dist/babylon/frame-pump.js.map +1 -0
  13. package/dist/babylon/game-world-plugin-lifecycle.d.ts +26 -0
  14. package/dist/babylon/game-world-plugin-lifecycle.d.ts.map +1 -0
  15. package/dist/babylon/game-world-plugin-lifecycle.js +257 -0
  16. package/dist/babylon/game-world-plugin-lifecycle.js.map +1 -0
  17. package/dist/babylon/lighting-controller.d.ts.map +1 -1
  18. package/dist/babylon/lighting-controller.js +162 -16
  19. package/dist/babylon/lighting-controller.js.map +1 -1
  20. package/dist/babylon/plugin-contract.d.ts +15 -0
  21. package/dist/babylon/plugin-contract.d.ts.map +1 -0
  22. package/dist/babylon/plugin-contract.js +10 -0
  23. package/dist/babylon/plugin-contract.js.map +1 -0
  24. package/dist/babylon/renderer/asset-container-instantiation.d.ts +39 -0
  25. package/dist/babylon/renderer/asset-container-instantiation.d.ts.map +1 -0
  26. package/dist/babylon/renderer/asset-container-instantiation.js +287 -0
  27. package/dist/babylon/renderer/asset-container-instantiation.js.map +1 -0
  28. package/dist/babylon/renderer/brdf-texture-settlement.d.ts +7 -0
  29. package/dist/babylon/renderer/brdf-texture-settlement.d.ts.map +1 -0
  30. package/dist/babylon/renderer/brdf-texture-settlement.js +29 -0
  31. package/dist/babylon/renderer/brdf-texture-settlement.js.map +1 -0
  32. package/dist/babylon/renderer/environment/environment-texture-controller.d.ts +7 -0
  33. package/dist/babylon/renderer/environment/environment-texture-controller.d.ts.map +1 -0
  34. package/dist/babylon/renderer/environment/environment-texture-controller.js +358 -0
  35. package/dist/babylon/renderer/environment/environment-texture-controller.js.map +1 -0
  36. package/dist/babylon/renderer/environment/index.d.ts +4 -0
  37. package/dist/babylon/renderer/environment/index.d.ts.map +1 -0
  38. package/dist/babylon/renderer/environment/index.js +4 -0
  39. package/dist/babylon/renderer/environment/index.js.map +1 -0
  40. package/dist/babylon/renderer/environment/profile.d.ts +3 -0
  41. package/dist/babylon/renderer/environment/profile.d.ts.map +1 -0
  42. package/dist/babylon/renderer/environment/profile.js +27 -0
  43. package/dist/babylon/renderer/environment/profile.js.map +1 -0
  44. package/dist/babylon/renderer/environment/types.d.ts +24 -0
  45. package/dist/babylon/renderer/environment/types.d.ts.map +1 -0
  46. package/dist/babylon/renderer/environment/types.js +6 -0
  47. package/dist/babylon/renderer/environment/types.js.map +1 -0
  48. package/dist/babylon/renderer/index.d.ts +26 -0
  49. package/dist/babylon/renderer/index.d.ts.map +1 -0
  50. package/dist/babylon/renderer/index.js +26 -0
  51. package/dist/babylon/renderer/index.js.map +1 -0
  52. package/dist/babylon/renderer/lighting/directional-light-angles.d.ts +17 -0
  53. package/dist/babylon/renderer/lighting/directional-light-angles.d.ts.map +1 -0
  54. package/dist/babylon/renderer/lighting/directional-light-angles.js +67 -0
  55. package/dist/babylon/renderer/lighting/directional-light-angles.js.map +1 -0
  56. package/dist/babylon/renderer/material-owner-candidates.d.ts +21 -0
  57. package/dist/babylon/renderer/material-owner-candidates.d.ts.map +1 -0
  58. package/dist/babylon/renderer/material-owner-candidates.js +217 -0
  59. package/dist/babylon/renderer/material-owner-candidates.js.map +1 -0
  60. package/dist/babylon/renderer/materials/index.d.ts +3 -0
  61. package/dist/babylon/renderer/materials/index.d.ts.map +1 -0
  62. package/dist/babylon/renderer/materials/index.js +3 -0
  63. package/dist/babylon/renderer/materials/index.js.map +1 -0
  64. package/dist/babylon/renderer/materials/material-runtime.d.ts +29 -0
  65. package/dist/babylon/renderer/materials/material-runtime.d.ts.map +1 -0
  66. package/dist/babylon/renderer/materials/material-runtime.js +660 -0
  67. package/dist/babylon/renderer/materials/material-runtime.js.map +1 -0
  68. package/dist/babylon/renderer/materials/material-slot-owner.d.ts +42 -0
  69. package/dist/babylon/renderer/materials/material-slot-owner.d.ts.map +1 -0
  70. package/dist/babylon/renderer/materials/material-slot-owner.js +318 -0
  71. package/dist/babylon/renderer/materials/material-slot-owner.js.map +1 -0
  72. package/dist/babylon/renderer/outlines/babylon-default/apply.d.ts +4 -0
  73. package/dist/babylon/renderer/outlines/babylon-default/apply.d.ts.map +1 -0
  74. package/dist/babylon/renderer/outlines/babylon-default/apply.js +45 -0
  75. package/dist/babylon/renderer/outlines/babylon-default/apply.js.map +1 -0
  76. package/dist/babylon/renderer/outlines/babylon-default/index.d.ts +3 -0
  77. package/dist/babylon/renderer/outlines/babylon-default/index.d.ts.map +1 -0
  78. package/dist/babylon/renderer/outlines/babylon-default/index.js +2 -0
  79. package/dist/babylon/renderer/outlines/babylon-default/index.js.map +1 -0
  80. package/dist/babylon/renderer/outlines/babylon-default/types.d.ts +7 -0
  81. package/dist/babylon/renderer/outlines/babylon-default/types.d.ts.map +1 -0
  82. package/dist/babylon/renderer/outlines/babylon-default/types.js +2 -0
  83. package/dist/babylon/renderer/outlines/babylon-default/types.js.map +1 -0
  84. package/dist/babylon/renderer/outlines/index.d.ts +4 -0
  85. package/dist/babylon/renderer/outlines/index.d.ts.map +1 -0
  86. package/dist/babylon/renderer/outlines/index.js +3 -0
  87. package/dist/babylon/renderer/outlines/index.js.map +1 -0
  88. package/dist/babylon/renderer/outlines/runtime-override.d.ts +36 -0
  89. package/dist/babylon/renderer/outlines/runtime-override.d.ts.map +1 -0
  90. package/dist/babylon/renderer/outlines/runtime-override.js +131 -0
  91. package/dist/babylon/renderer/outlines/runtime-override.js.map +1 -0
  92. package/dist/babylon/renderer/outlines/types.d.ts +7 -0
  93. package/dist/babylon/renderer/outlines/types.d.ts.map +1 -0
  94. package/dist/babylon/renderer/outlines/types.js +2 -0
  95. package/dist/babylon/renderer/outlines/types.js.map +1 -0
  96. package/dist/babylon/renderer/placement/index.d.ts +2 -0
  97. package/dist/babylon/renderer/placement/index.d.ts.map +1 -0
  98. package/dist/babylon/renderer/placement/index.js +2 -0
  99. package/dist/babylon/renderer/placement/index.js.map +1 -0
  100. package/dist/babylon/renderer/placement/runtime-drop-position.d.ts +24 -0
  101. package/dist/babylon/renderer/placement/runtime-drop-position.d.ts.map +1 -0
  102. package/dist/babylon/renderer/placement/runtime-drop-position.js +63 -0
  103. package/dist/babylon/renderer/placement/runtime-drop-position.js.map +1 -0
  104. package/dist/babylon/renderer/post-process/babylon-default-pipeline.d.ts +7 -0
  105. package/dist/babylon/renderer/post-process/babylon-default-pipeline.d.ts.map +1 -0
  106. package/dist/babylon/renderer/post-process/babylon-default-pipeline.js +301 -0
  107. package/dist/babylon/renderer/post-process/babylon-default-pipeline.js.map +1 -0
  108. package/dist/babylon/renderer/post-process/index.d.ts +5 -0
  109. package/dist/babylon/renderer/post-process/index.d.ts.map +1 -0
  110. package/dist/babylon/renderer/post-process/index.js +5 -0
  111. package/dist/babylon/renderer/post-process/index.js.map +1 -0
  112. package/dist/babylon/renderer/post-process/profile.d.ts +5 -0
  113. package/dist/babylon/renderer/post-process/profile.d.ts.map +1 -0
  114. package/dist/babylon/renderer/post-process/profile.js +155 -0
  115. package/dist/babylon/renderer/post-process/profile.js.map +1 -0
  116. package/dist/babylon/renderer/post-process/types.d.ts +81 -0
  117. package/dist/babylon/renderer/post-process/types.d.ts.map +1 -0
  118. package/dist/babylon/renderer/post-process/types.js +24 -0
  119. package/dist/babylon/renderer/post-process/types.js.map +1 -0
  120. package/dist/babylon/renderer/post-process/volume-stack.d.ts +4 -0
  121. package/dist/babylon/renderer/post-process/volume-stack.d.ts.map +1 -0
  122. package/dist/babylon/renderer/post-process/volume-stack.js +105 -0
  123. package/dist/babylon/renderer/post-process/volume-stack.js.map +1 -0
  124. package/dist/babylon/renderer/rendering/image-node.d.ts +35 -0
  125. package/dist/babylon/renderer/rendering/image-node.d.ts.map +1 -0
  126. package/dist/babylon/renderer/rendering/image-node.js +39 -0
  127. package/dist/babylon/renderer/rendering/image-node.js.map +1 -0
  128. package/dist/babylon/renderer/rendering/index.d.ts +3 -0
  129. package/dist/babylon/renderer/rendering/index.d.ts.map +1 -0
  130. package/dist/babylon/renderer/rendering/index.js +3 -0
  131. package/dist/babylon/renderer/rendering/index.js.map +1 -0
  132. package/dist/babylon/renderer/rendering/node-rendering.d.ts +19 -0
  133. package/dist/babylon/renderer/rendering/node-rendering.d.ts.map +1 -0
  134. package/dist/babylon/renderer/rendering/node-rendering.js +66 -0
  135. package/dist/babylon/renderer/rendering/node-rendering.js.map +1 -0
  136. package/dist/babylon/renderer/shadows/blob-shadow-shaders.d.ts +5 -0
  137. package/dist/babylon/renderer/shadows/blob-shadow-shaders.d.ts.map +1 -0
  138. package/dist/babylon/renderer/shadows/blob-shadow-shaders.js +46 -0
  139. package/dist/babylon/renderer/shadows/blob-shadow-shaders.js.map +1 -0
  140. package/dist/babylon/renderer/shadows/blob-shadow-system.d.ts +5 -0
  141. package/dist/babylon/renderer/shadows/blob-shadow-system.d.ts.map +1 -0
  142. package/dist/babylon/renderer/shadows/blob-shadow-system.js +402 -0
  143. package/dist/babylon/renderer/shadows/blob-shadow-system.js.map +1 -0
  144. package/dist/babylon/renderer/shadows/dynamic-shadow-system.d.ts +87 -0
  145. package/dist/babylon/renderer/shadows/dynamic-shadow-system.d.ts.map +1 -0
  146. package/dist/babylon/renderer/shadows/dynamic-shadow-system.js +663 -0
  147. package/dist/babylon/renderer/shadows/dynamic-shadow-system.js.map +1 -0
  148. package/dist/babylon/renderer/shadows/planar-shadow-shaders.d.ts +7 -0
  149. package/dist/babylon/renderer/shadows/planar-shadow-shaders.d.ts.map +1 -0
  150. package/dist/babylon/renderer/shadows/planar-shadow-shaders.js +316 -0
  151. package/dist/babylon/renderer/shadows/planar-shadow-shaders.js.map +1 -0
  152. package/dist/babylon/renderer/shadows/planar-shadow-system.d.ts +5 -0
  153. package/dist/babylon/renderer/shadows/planar-shadow-system.d.ts.map +1 -0
  154. package/dist/babylon/renderer/shadows/planar-shadow-system.js +1562 -0
  155. package/dist/babylon/renderer/shadows/planar-shadow-system.js.map +1 -0
  156. package/dist/babylon/renderer/shadows/shadow-generator-shaders.d.ts +14 -0
  157. package/dist/babylon/renderer/shadows/shadow-generator-shaders.d.ts.map +1 -0
  158. package/dist/babylon/renderer/shadows/shadow-generator-shaders.js +14 -0
  159. package/dist/babylon/renderer/shadows/shadow-generator-shaders.js.map +1 -0
  160. package/dist/babylon/renderer/shadows/shadow-map-experiment-depth-backend.d.ts +69 -0
  161. package/dist/babylon/renderer/shadows/shadow-map-experiment-depth-backend.d.ts.map +1 -0
  162. package/dist/babylon/renderer/shadows/shadow-map-experiment-depth-backend.js +847 -0
  163. package/dist/babylon/renderer/shadows/shadow-map-experiment-depth-backend.js.map +1 -0
  164. package/dist/babylon/renderer/shadows/shadow-map-experiment-system.d.ts +148 -0
  165. package/dist/babylon/renderer/shadows/shadow-map-experiment-system.d.ts.map +1 -0
  166. package/dist/babylon/renderer/shadows/shadow-map-experiment-system.js +4535 -0
  167. package/dist/babylon/renderer/shadows/shadow-map-experiment-system.js.map +1 -0
  168. package/dist/babylon/renderer/shadows/static-projected-shadow-artifact-system.d.ts +4 -0
  169. package/dist/babylon/renderer/shadows/static-projected-shadow-artifact-system.d.ts.map +1 -0
  170. package/dist/babylon/renderer/shadows/static-projected-shadow-artifact-system.js +645 -0
  171. package/dist/babylon/renderer/shadows/static-projected-shadow-artifact-system.js.map +1 -0
  172. package/dist/babylon/renderer/shadows/static-projected-shadow-atlas.d.ts +61 -0
  173. package/dist/babylon/renderer/shadows/static-projected-shadow-atlas.d.ts.map +1 -0
  174. package/dist/babylon/renderer/shadows/static-projected-shadow-atlas.js +382 -0
  175. package/dist/babylon/renderer/shadows/static-projected-shadow-atlas.js.map +1 -0
  176. package/dist/babylon/renderer/shadows/static-projected-shadow-bake.d.ts +47 -0
  177. package/dist/babylon/renderer/shadows/static-projected-shadow-bake.d.ts.map +1 -0
  178. package/dist/babylon/renderer/shadows/static-projected-shadow-bake.js +285 -0
  179. package/dist/babylon/renderer/shadows/static-projected-shadow-bake.js.map +1 -0
  180. package/dist/babylon/renderer/shadows/static-projected-shadow-baker.d.ts +88 -0
  181. package/dist/babylon/renderer/shadows/static-projected-shadow-baker.d.ts.map +1 -0
  182. package/dist/babylon/renderer/shadows/static-projected-shadow-baker.js +830 -0
  183. package/dist/babylon/renderer/shadows/static-projected-shadow-baker.js.map +1 -0
  184. package/dist/babylon/renderer/shadows/static-projected-shadow-options.d.ts +3 -0
  185. package/dist/babylon/renderer/shadows/static-projected-shadow-options.d.ts.map +1 -0
  186. package/dist/babylon/renderer/shadows/static-projected-shadow-options.js +60 -0
  187. package/dist/babylon/renderer/shadows/static-projected-shadow-options.js.map +1 -0
  188. package/dist/babylon/renderer/shadows/static-projected-shadow-rendering.d.ts +27 -0
  189. package/dist/babylon/renderer/shadows/static-projected-shadow-rendering.d.ts.map +1 -0
  190. package/dist/babylon/renderer/shadows/static-projected-shadow-rendering.js +220 -0
  191. package/dist/babylon/renderer/shadows/static-projected-shadow-rendering.js.map +1 -0
  192. package/dist/babylon/renderer/shadows/types.d.ts +421 -0
  193. package/dist/babylon/renderer/shadows/types.d.ts.map +1 -0
  194. package/dist/babylon/renderer/shadows/types.js +127 -0
  195. package/dist/babylon/renderer/shadows/types.js.map +1 -0
  196. package/dist/babylon/renderer/world-rendering-controller.d.ts +29 -0
  197. package/dist/babylon/renderer/world-rendering-controller.d.ts.map +1 -0
  198. package/dist/babylon/renderer/world-rendering-controller.js +183 -0
  199. package/dist/babylon/renderer/world-rendering-controller.js.map +1 -0
  200. package/dist/babylon/renderer-controller.d.ts +93 -0
  201. package/dist/babylon/renderer-controller.d.ts.map +1 -0
  202. package/dist/babylon/renderer-controller.js +706 -0
  203. package/dist/babylon/renderer-controller.js.map +1 -0
  204. package/dist/babylon/scene-renderer.d.ts +20 -0
  205. package/dist/babylon/scene-renderer.d.ts.map +1 -0
  206. package/dist/babylon/scene-renderer.js +58 -0
  207. package/dist/babylon/scene-renderer.js.map +1 -0
  208. package/dist/babylon.d.ts +7 -0
  209. package/dist/babylon.d.ts.map +1 -1
  210. package/dist/babylon.js +7 -0
  211. package/dist/babylon.js.map +1 -1
  212. package/dist/build-info.json +4 -4
  213. package/dist/camera.d.ts +25 -0
  214. package/dist/camera.d.ts.map +1 -0
  215. package/dist/camera.js +68 -0
  216. package/dist/camera.js.map +1 -0
  217. package/dist/compiled-scene-data.d.ts +23 -0
  218. package/dist/compiled-scene-data.d.ts.map +1 -0
  219. package/dist/compiled-scene-data.js +100 -0
  220. package/dist/compiled-scene-data.js.map +1 -0
  221. package/dist/config.d.ts +9 -3
  222. package/dist/config.d.ts.map +1 -1
  223. package/dist/config.js +21 -0
  224. package/dist/config.js.map +1 -1
  225. package/dist/frame.d.ts +32 -0
  226. package/dist/frame.d.ts.map +1 -0
  227. package/dist/frame.js +54 -0
  228. package/dist/frame.js.map +1 -0
  229. package/dist/ground-decal.d.ts +22 -0
  230. package/dist/ground-decal.d.ts.map +1 -0
  231. package/dist/ground-decal.js +48 -0
  232. package/dist/ground-decal.js.map +1 -0
  233. package/dist/index.d.ts +16 -1
  234. package/dist/index.d.ts.map +1 -1
  235. package/dist/index.js +16 -1
  236. package/dist/index.js.map +1 -1
  237. package/dist/lighting.d.ts +13 -5
  238. package/dist/lighting.d.ts.map +1 -1
  239. package/dist/lighting.js +11 -5
  240. package/dist/lighting.js.map +1 -1
  241. package/dist/material-owner.d.ts +141 -0
  242. package/dist/material-owner.d.ts.map +1 -0
  243. package/dist/material-owner.js +552 -0
  244. package/dist/material-owner.js.map +1 -0
  245. package/dist/material-profile.d.ts +62 -0
  246. package/dist/material-profile.d.ts.map +1 -0
  247. package/dist/material-profile.js +132 -0
  248. package/dist/material-profile.js.map +1 -0
  249. package/dist/rendering/index.d.ts +14 -0
  250. package/dist/rendering/index.d.ts.map +1 -0
  251. package/dist/rendering/index.js +12 -0
  252. package/dist/rendering/index.js.map +1 -0
  253. package/dist/rendering/rendering-profile-types.d.ts +322 -0
  254. package/dist/rendering/rendering-profile-types.d.ts.map +1 -0
  255. package/dist/rendering/rendering-profile-types.js +2 -0
  256. package/dist/rendering/rendering-profile-types.js.map +1 -0
  257. package/dist/rendering/rendering-profile-validation.d.ts +2 -0
  258. package/dist/rendering/rendering-profile-validation.d.ts.map +1 -0
  259. package/dist/rendering/rendering-profile-validation.js +364 -0
  260. package/dist/rendering/rendering-profile-validation.js.map +1 -0
  261. package/dist/rendering/rendering-profile-values.d.ts +19 -0
  262. package/dist/rendering/rendering-profile-values.d.ts.map +1 -0
  263. package/dist/rendering/rendering-profile-values.js +79 -0
  264. package/dist/rendering/rendering-profile-values.js.map +1 -0
  265. package/dist/rendering/rendering-profile.d.ts +15 -0
  266. package/dist/rendering/rendering-profile.d.ts.map +1 -0
  267. package/dist/rendering/rendering-profile.js +442 -0
  268. package/dist/rendering/rendering-profile.js.map +1 -0
  269. package/dist/rendering/shadow-map-experiment-depth.d.ts +63 -0
  270. package/dist/rendering/shadow-map-experiment-depth.d.ts.map +1 -0
  271. package/dist/rendering/shadow-map-experiment-depth.js +186 -0
  272. package/dist/rendering/shadow-map-experiment-depth.js.map +1 -0
  273. package/dist/rendering/shadow-map-experiment-lifecycle.d.ts +94 -0
  274. package/dist/rendering/shadow-map-experiment-lifecycle.d.ts.map +1 -0
  275. package/dist/rendering/shadow-map-experiment-lifecycle.js +407 -0
  276. package/dist/rendering/shadow-map-experiment-lifecycle.js.map +1 -0
  277. package/dist/rendering/shadow-map-experiment.d.ts +189 -0
  278. package/dist/rendering/shadow-map-experiment.d.ts.map +1 -0
  279. package/dist/rendering/shadow-map-experiment.js +549 -0
  280. package/dist/rendering/shadow-map-experiment.js.map +1 -0
  281. package/dist/rendering/shadow-quality.d.ts +5 -0
  282. package/dist/rendering/shadow-quality.d.ts.map +1 -0
  283. package/dist/rendering/shadow-quality.js +83 -0
  284. package/dist/rendering/shadow-quality.js.map +1 -0
  285. package/dist/rendering/shadow-runtime.d.ts +59 -0
  286. package/dist/rendering/shadow-runtime.d.ts.map +1 -0
  287. package/dist/rendering/shadow-runtime.js +378 -0
  288. package/dist/rendering/shadow-runtime.js.map +1 -0
  289. package/dist/rendering/shadow-settings.d.ts +15 -0
  290. package/dist/rendering/shadow-settings.d.ts.map +1 -0
  291. package/dist/rendering/shadow-settings.js +129 -0
  292. package/dist/rendering/shadow-settings.js.map +1 -0
  293. package/dist/rendering/shadow-types.d.ts +99 -0
  294. package/dist/rendering/shadow-types.d.ts.map +1 -0
  295. package/dist/rendering/shadow-types.js +5 -0
  296. package/dist/rendering/shadow-types.js.map +1 -0
  297. package/dist/rendering/shadow-validation.d.ts +3 -0
  298. package/dist/rendering/shadow-validation.d.ts.map +1 -0
  299. package/dist/rendering/shadow-validation.js +166 -0
  300. package/dist/rendering/shadow-validation.js.map +1 -0
  301. package/dist/rendering/value.d.ts +2 -0
  302. package/dist/rendering/value.d.ts.map +1 -0
  303. package/dist/rendering/value.js +6 -0
  304. package/dist/rendering/value.js.map +1 -0
  305. package/dist/runtime-data-token.d.ts +4 -0
  306. package/dist/runtime-data-token.d.ts.map +1 -0
  307. package/dist/runtime-data-token.js +4 -0
  308. package/dist/runtime-data-token.js.map +1 -0
  309. package/dist/runtime-data-types.d.ts +83 -0
  310. package/dist/runtime-data-types.d.ts.map +1 -0
  311. package/dist/runtime-data-types.js +2 -0
  312. package/dist/runtime-data-types.js.map +1 -0
  313. package/dist/runtime-data.d.ts +18 -0
  314. package/dist/runtime-data.d.ts.map +1 -0
  315. package/dist/runtime-data.js +301 -0
  316. package/dist/runtime-data.js.map +1 -0
  317. package/dist/runtime-scene-resolvers.d.ts +33 -0
  318. package/dist/runtime-scene-resolvers.d.ts.map +1 -0
  319. package/dist/runtime-scene-resolvers.js +36 -0
  320. package/dist/runtime-scene-resolvers.js.map +1 -0
  321. package/dist/scene-artifact-types.d.ts +385 -0
  322. package/dist/scene-artifact-types.d.ts.map +1 -0
  323. package/dist/scene-artifact-types.js +2 -0
  324. package/dist/scene-artifact-types.js.map +1 -0
  325. package/dist/scene-artifact-validation.d.ts +20 -0
  326. package/dist/scene-artifact-validation.d.ts.map +1 -0
  327. package/dist/scene-artifact-validation.js +1402 -0
  328. package/dist/scene-artifact-validation.js.map +1 -0
  329. package/dist/static-shadow-artifact.d.ts +131 -0
  330. package/dist/static-shadow-artifact.d.ts.map +1 -0
  331. package/dist/static-shadow-artifact.js +327 -0
  332. package/dist/static-shadow-artifact.js.map +1 -0
  333. package/package.json +51 -1
@@ -0,0 +1,830 @@
1
+ import { DirectionalLight } from '@babylonjs/core/Lights/directionalLight.js';
2
+ import { Matrix, Vector3 } from '@babylonjs/core/Maths/math.vector.js';
3
+ import { RenderTargetTexture } from '@babylonjs/core/Materials/Textures/renderTargetTexture.js';
4
+ import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh.js';
5
+ import { InstancedMesh } from '@babylonjs/core/Meshes/instancedMesh.js';
6
+ import { Mesh } from '@babylonjs/core/Meshes/mesh.js';
7
+ import { buildStaticProjectedShadowBounds, collectStaticProjectedShadowNodeMeshes, createStaticProjectedShadowMaskTexture, } from './static-projected-shadow-bake.js';
8
+ import { copyStaticProjectedShadowSdfTileToAtlas, createStaticProjectedShadowAtlasPixels, createStaticProjectedShadowSdfTileFromMaskPixels, packStaticProjectedShadowAtlasTiles, } from './static-projected-shadow-atlas.js';
9
+ import { resolveStaticProjectedShadowOptions } from './static-projected-shadow-options.js';
10
+ import { DEFAULT_STATIC_PROJECTED_SHADOW_OPTIONS, } from './types.js';
11
+ const DEFAULT_SHADOW_DIRECTION = new Vector3(-0.3, -1, -0.2).normalize();
12
+ export function createStaticProjectedShadowBaker(options) {
13
+ return new BabylonStaticProjectedShadowBaker(options);
14
+ }
15
+ export function collectStaticProjectedShadowBakeRoots(scene) {
16
+ const candidates = scene.meshes.filter(isExplicitStaticProjectedShadowRoot);
17
+ const candidateSet = new Set(candidates);
18
+ return candidates.filter(mesh => !hasSelectedAncestor(mesh, candidateSet));
19
+ }
20
+ export function createStaticProjectedShadowBakeHashes(input) {
21
+ const options = resolveStaticProjectedShadowOptions(input.options ?? {});
22
+ const planeY = options.plane.height + options.plane.yOffset;
23
+ const lightDir = resolveBakeLightDirection(input.directionalLight);
24
+ const roots = createBakeRoots(input.roots ?? collectStaticProjectedShadowBakeRoots(input.scene), {
25
+ lightDir,
26
+ planeY,
27
+ padding: options.bake.padding,
28
+ });
29
+ return createBakeHashes({ roots, lightDir, planeY, options });
30
+ }
31
+ export function createStaticProjectedShadowProfileHash(options = {}) {
32
+ return createBakeProfileHash(resolveStaticProjectedShadowOptions(options));
33
+ }
34
+ class BabylonStaticProjectedShadowBaker {
35
+ config;
36
+ readMaskTexturePixels;
37
+ processSdfTile;
38
+ encodeAtlasTexture;
39
+ yieldToMainThread;
40
+ now;
41
+ constructor(config) {
42
+ this.config = config;
43
+ this.readMaskTexturePixels = config.readMaskTexturePixels ?? defaultReadMaskTexturePixels;
44
+ this.processSdfTile = config.processSdfTile ?? defaultProcessSdfTile;
45
+ this.encodeAtlasTexture = config.encodeAtlasTexture ?? defaultEncodeAtlasTexture;
46
+ this.yieldToMainThread = config.yieldToMainThread;
47
+ this.now = config.now ?? (() => new Date().toISOString());
48
+ }
49
+ async bake(input = {}) {
50
+ const startedAt = nowMs();
51
+ const options = resolveStaticProjectedShadowOptions(this.config.options ?? {});
52
+ const planeY = options.plane.height + options.plane.yOffset;
53
+ const lightDir = resolveBakeLightDirection(this.config.directionalLight);
54
+ const roots = createBakeRoots(input.roots ?? this.config.roots ?? collectStaticProjectedShadowBakeRoots(this.config.scene), {
55
+ lightDir,
56
+ planeY,
57
+ padding: options.bake.padding,
58
+ });
59
+ const sourceMeshCount = roots.reduce((sum, root) => sum + root.meshes.length, 0);
60
+ const { sourceHash, lightHash, profileHash } = createBakeHashes({ roots, lightDir, planeY, options });
61
+ const chunkPlan = createBakeChunkPlan(roots, {
62
+ chunkSize: options.bake.spatialChunkSize,
63
+ targetChunkCount: options.bake.targetChunkCount,
64
+ planeY,
65
+ });
66
+ const chunks = chunkPlan.chunks;
67
+ const previousArtifact = input.previousArtifact ?? this.config.previousArtifact ?? null;
68
+ let chunkWorks = chunks.map(createBakeChunkWork);
69
+ let reusedChunks = collectReusableArtifactChunks(previousArtifact, chunkWorks, {
70
+ lightHash,
71
+ profileHash,
72
+ planeHeight: options.plane.height,
73
+ planeYOffset: options.plane.yOffset,
74
+ });
75
+ let dirtyChunkWorks = chunkWorks.filter(work => !reusedChunks.chunkIds.has(work.chunk.id));
76
+ let packing = packDirtyChunkWorks(dirtyChunkWorks, options.bake, Math.max(1, options.bake.maxAtlasPages - reusedChunks.pages.length));
77
+ if (dirtyChunkWorks.length > 0
78
+ && reusedChunks.chunks.length > 0
79
+ && reusedChunks.pages.length + packing.pages.length > options.bake.maxAtlasPages) {
80
+ reusedChunks = createEmptyReusableArtifactChunks();
81
+ dirtyChunkWorks = chunkWorks;
82
+ packing = packDirtyChunkWorks(dirtyChunkWorks, options.bake, options.bake.maxAtlasPages);
83
+ }
84
+ await this.reportProgress({
85
+ phase: 'collect',
86
+ sourceRootCount: roots.length,
87
+ sourceMeshCount,
88
+ completedChunkCount: reusedChunks.chunks.length,
89
+ totalChunkCount: chunks.length,
90
+ encodedTextureCount: 0,
91
+ atlasPageCount: packing.pages.length,
92
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
93
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
94
+ bakedChunkCount: 0,
95
+ reusedChunkCount: reusedChunks.chunks.length,
96
+ });
97
+ await this.yieldProgress({
98
+ phase: 'reuse',
99
+ sourceRootCount: roots.length,
100
+ sourceMeshCount,
101
+ completedChunkCount: reusedChunks.chunks.length,
102
+ totalChunkCount: chunks.length,
103
+ encodedTextureCount: 0,
104
+ atlasPageCount: packing.pages.length,
105
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
106
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
107
+ bakedChunkCount: 0,
108
+ reusedChunkCount: reusedChunks.chunks.length,
109
+ });
110
+ const atlasPixelsByPageId = new Map();
111
+ const pageLayoutsById = new Map(packing.pages.map(page => [page.id, page]));
112
+ const reusedPageIds = new Set(reusedChunks.pages.map(page => page.id));
113
+ const bakedPageIds = createBakedPageIds(packing.pages.map(page => page.id), reusedPageIds);
114
+ for (const page of packing.pages) {
115
+ atlasPixelsByPageId.set(page.id, createStaticProjectedShadowAtlasPixels(page.width, page.height));
116
+ }
117
+ const pendingChunks = [];
118
+ for (let index = 0; index < dirtyChunkWorks.length; index += 1) {
119
+ const work = dirtyChunkWorks[index];
120
+ const chunk = work.chunk;
121
+ const layout = packing.layoutsByTileId.get(chunk.id);
122
+ if (!layout)
123
+ continue;
124
+ const completedBefore = reusedChunks.chunks.length + index;
125
+ await this.reportProgress({
126
+ phase: 'chunk',
127
+ sourceRootCount: roots.length,
128
+ sourceMeshCount,
129
+ completedChunkCount: completedBefore,
130
+ totalChunkCount: chunks.length,
131
+ encodedTextureCount: pendingChunks.length,
132
+ currentChunkId: chunk.id,
133
+ atlasPageCount: packing.pages.length,
134
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
135
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
136
+ bakedChunkCount: pendingChunks.length,
137
+ reusedChunkCount: reusedChunks.chunks.length,
138
+ });
139
+ const mask = await createStaticProjectedShadowMaskTexture(chunk.roots.flatMap(root => root.meshes), {
140
+ scene: this.config.scene,
141
+ name: chunk.id,
142
+ bounds: chunk.bounds,
143
+ lightDir,
144
+ planeY,
145
+ resolution: {
146
+ width: layout.width,
147
+ height: layout.height,
148
+ },
149
+ });
150
+ if (!mask) {
151
+ await this.reportProgress({
152
+ phase: 'chunk',
153
+ sourceRootCount: roots.length,
154
+ sourceMeshCount,
155
+ completedChunkCount: completedBefore + 1,
156
+ totalChunkCount: chunks.length,
157
+ encodedTextureCount: pendingChunks.length,
158
+ currentChunkId: chunk.id,
159
+ atlasPageCount: packing.pages.length,
160
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
161
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
162
+ bakedChunkCount: pendingChunks.length,
163
+ reusedChunkCount: reusedChunks.chunks.length,
164
+ });
165
+ await this.yieldProgress({
166
+ phase: 'chunk',
167
+ sourceRootCount: roots.length,
168
+ sourceMeshCount,
169
+ completedChunkCount: completedBefore + 1,
170
+ totalChunkCount: chunks.length,
171
+ encodedTextureCount: pendingChunks.length,
172
+ currentChunkId: chunk.id,
173
+ atlasPageCount: packing.pages.length,
174
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
175
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
176
+ bakedChunkCount: pendingChunks.length,
177
+ reusedChunkCount: reusedChunks.chunks.length,
178
+ });
179
+ continue;
180
+ }
181
+ try {
182
+ await this.reportProgress({
183
+ phase: 'sdf',
184
+ sourceRootCount: roots.length,
185
+ sourceMeshCount,
186
+ completedChunkCount: completedBefore,
187
+ totalChunkCount: chunks.length,
188
+ encodedTextureCount: pendingChunks.length,
189
+ currentChunkId: chunk.id,
190
+ atlasPageCount: packing.pages.length,
191
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
192
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
193
+ bakedChunkCount: pendingChunks.length,
194
+ reusedChunkCount: reusedChunks.chunks.length,
195
+ });
196
+ const maskPixels = await this.readMaskTexturePixels({
197
+ texture: mask.texture,
198
+ chunkId: chunk.id,
199
+ bounds: chunk.bounds,
200
+ width: layout.width,
201
+ height: layout.height,
202
+ });
203
+ if (!maskPixels || maskPixels.width !== layout.width || maskPixels.height !== layout.height)
204
+ continue;
205
+ const sdfTile = await this.processSdfTile({
206
+ chunkId: chunk.id,
207
+ pixels: maskPixels.pixels,
208
+ width: maskPixels.width,
209
+ height: maskPixels.height,
210
+ sdfRadiusPx: options.bake.sdfRadiusPx,
211
+ });
212
+ if (!sdfTile?.hasCoverage || sdfTile.width !== maskPixels.width || sdfTile.height !== maskPixels.height)
213
+ continue;
214
+ const atlasPixels = atlasPixelsByPageId.get(layout.pageId);
215
+ const pageLayout = pageLayoutsById.get(layout.pageId);
216
+ if (!atlasPixels)
217
+ continue;
218
+ if (!pageLayout)
219
+ continue;
220
+ copyStaticProjectedShadowSdfTileToAtlas(atlasPixels, pageLayout.width, sdfTile.sdfAlpha, maskPixels.width, maskPixels.height, layout.copyX, layout.copyY);
221
+ const pageId = bakedPageIds.get(layout.pageId) ?? layout.pageId;
222
+ pendingChunks.push({
223
+ id: chunk.id,
224
+ bounds: {
225
+ minX: roundNumber(chunk.bounds.minX),
226
+ maxX: roundNumber(chunk.bounds.maxX),
227
+ minZ: roundNumber(chunk.bounds.minZ),
228
+ maxZ: roundNumber(chunk.bounds.maxZ),
229
+ y: roundNumber(chunk.bounds.center.y),
230
+ },
231
+ plane: {
232
+ height: roundNumber(options.plane.height),
233
+ yOffset: roundNumber(options.plane.yOffset),
234
+ },
235
+ pageId,
236
+ atlasRect: layout.atlasRect,
237
+ atlasUv: layout.atlasUv,
238
+ sourceNodeIds: work.sourceNodeIds,
239
+ sourceHash: work.sourceHash,
240
+ lightHash,
241
+ profileHash,
242
+ });
243
+ }
244
+ finally {
245
+ mask.dispose();
246
+ }
247
+ await this.reportProgress({
248
+ phase: 'chunk',
249
+ sourceRootCount: roots.length,
250
+ sourceMeshCount,
251
+ completedChunkCount: completedBefore + 1,
252
+ totalChunkCount: chunks.length,
253
+ encodedTextureCount: pendingChunks.length,
254
+ currentChunkId: chunk.id,
255
+ atlasPageCount: packing.pages.length,
256
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
257
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
258
+ bakedChunkCount: pendingChunks.length,
259
+ reusedChunkCount: reusedChunks.chunks.length,
260
+ });
261
+ await this.yieldProgress({
262
+ phase: 'chunk',
263
+ sourceRootCount: roots.length,
264
+ sourceMeshCount,
265
+ completedChunkCount: completedBefore + 1,
266
+ totalChunkCount: chunks.length,
267
+ encodedTextureCount: pendingChunks.length,
268
+ currentChunkId: chunk.id,
269
+ atlasPageCount: packing.pages.length,
270
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
271
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
272
+ bakedChunkCount: pendingChunks.length,
273
+ reusedChunkCount: reusedChunks.chunks.length,
274
+ });
275
+ }
276
+ await this.reportProgress({
277
+ phase: 'pack',
278
+ sourceRootCount: roots.length,
279
+ sourceMeshCount,
280
+ completedChunkCount: chunks.length,
281
+ totalChunkCount: chunks.length,
282
+ encodedTextureCount: pendingChunks.length,
283
+ atlasPageCount: reusedChunks.pages.length + packing.pages.length,
284
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
285
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
286
+ bakedChunkCount: pendingChunks.length,
287
+ reusedChunkCount: reusedChunks.chunks.length,
288
+ });
289
+ const usedPageIds = new Set(pendingChunks.map(chunk => chunk.pageId));
290
+ const pages = [...reusedChunks.pages];
291
+ const encodedPageIds = new Set();
292
+ for (const page of packing.pages) {
293
+ const pageId = bakedPageIds.get(page.id) ?? page.id;
294
+ if (!usedPageIds.has(pageId))
295
+ continue;
296
+ const pixels = atlasPixelsByPageId.get(page.id);
297
+ if (!pixels)
298
+ continue;
299
+ await this.reportProgress({
300
+ phase: 'encode',
301
+ sourceRootCount: roots.length,
302
+ sourceMeshCount,
303
+ completedChunkCount: chunks.length,
304
+ totalChunkCount: chunks.length,
305
+ encodedTextureCount: pages.length,
306
+ currentChunkId: pageId,
307
+ atlasPageCount: reusedChunks.pages.length + packing.pages.length,
308
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
309
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
310
+ bakedChunkCount: pendingChunks.length,
311
+ reusedChunkCount: reusedChunks.chunks.length,
312
+ });
313
+ const sdfTextureDataUrl = await this.encodeAtlasTexture({
314
+ pageId,
315
+ pixels,
316
+ width: page.width,
317
+ height: page.height,
318
+ });
319
+ if (!isPngDataUrl(sdfTextureDataUrl))
320
+ continue;
321
+ pages.push({
322
+ id: pageId,
323
+ width: page.width,
324
+ height: page.height,
325
+ sdfTextureDataUrl,
326
+ });
327
+ encodedPageIds.add(pageId);
328
+ await this.yieldProgress({
329
+ phase: 'encode',
330
+ sourceRootCount: roots.length,
331
+ sourceMeshCount,
332
+ completedChunkCount: chunks.length,
333
+ totalChunkCount: chunks.length,
334
+ encodedTextureCount: pages.length,
335
+ currentChunkId: pageId,
336
+ atlasPageCount: reusedChunks.pages.length + packing.pages.length,
337
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
338
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
339
+ bakedChunkCount: pendingChunks.length,
340
+ reusedChunkCount: reusedChunks.chunks.length,
341
+ });
342
+ }
343
+ const artifactChunks = [...reusedChunks.chunks, ...pendingChunks.filter(chunk => encodedPageIds.has(chunk.pageId))]
344
+ .sort((left, right) => left.id.localeCompare(right.id));
345
+ const durationMs = Math.max(0, Math.round(nowMs() - startedAt));
346
+ const atlasUsage = calculateArtifactAtlasUsage(pages, artifactChunks);
347
+ await this.reportProgress({
348
+ phase: 'complete',
349
+ sourceRootCount: roots.length,
350
+ sourceMeshCount,
351
+ completedChunkCount: chunks.length,
352
+ totalChunkCount: chunks.length,
353
+ encodedTextureCount: pages.length,
354
+ atlasPageCount: pages.length,
355
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
356
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
357
+ bakedChunkCount: pendingChunks.length,
358
+ reusedChunkCount: reusedChunks.chunks.length,
359
+ });
360
+ return {
361
+ version: 2,
362
+ format: 'sdf-atlas',
363
+ pages,
364
+ chunks: artifactChunks,
365
+ sourceHash,
366
+ lightHash,
367
+ profileHash,
368
+ generatedAt: this.now(),
369
+ stats: {
370
+ sourceRootCount: roots.length,
371
+ sourceMeshCount,
372
+ attemptedChunkCount: chunks.length,
373
+ chunkCount: artifactChunks.length,
374
+ textureCount: pages.length,
375
+ pageCount: pages.length,
376
+ skippedChunkCount: Math.max(0, chunks.length - artifactChunks.length),
377
+ resolution: options.bake.resolution,
378
+ chunkSize: chunkPlan.effectiveChunkSize,
379
+ atlasSize: packing.atlasSize,
380
+ atlasUsedPixels: atlasUsage.usedPixels,
381
+ atlasAllocatedPixels: atlasUsage.allocatedPixels,
382
+ atlasOccupancy: atlasUsage.occupancy,
383
+ texelsPerMeter: options.bake.texelsPerMeter,
384
+ effectiveTexelsPerMeter: packing.effectiveTexelsPerMeter,
385
+ maxAtlasPages: options.bake.maxAtlasPages,
386
+ sdfRadiusPx: options.bake.sdfRadiusPx,
387
+ spatialChunkSize: options.bake.spatialChunkSize,
388
+ effectiveSpatialChunkSize: chunkPlan.effectiveChunkSize,
389
+ targetChunkCount: options.bake.targetChunkCount,
390
+ bakedChunkCount: pendingChunks.length,
391
+ reusedChunkCount: reusedChunks.chunks.length,
392
+ durationMs,
393
+ },
394
+ };
395
+ }
396
+ async reportProgress(progress) {
397
+ await this.config.onProgress?.(progress);
398
+ }
399
+ async yieldProgress(progress) {
400
+ await this.yieldToMainThread?.(progress);
401
+ }
402
+ }
403
+ function calculateArtifactAtlasUsage(pages, chunks) {
404
+ const pageIds = new Set(pages.map(page => page.id));
405
+ const usedPixels = chunks.reduce((sum, chunk) => (pageIds.has(chunk.pageId)
406
+ ? sum + Math.max(0, chunk.atlasRect.width) * Math.max(0, chunk.atlasRect.height)
407
+ : sum), 0);
408
+ const allocatedPixels = pages.reduce((sum, page) => (sum + Math.max(0, page.width) * Math.max(0, page.height)), 0);
409
+ return {
410
+ usedPixels,
411
+ allocatedPixels,
412
+ occupancy: roundNumber(allocatedPixels > 0 ? usedPixels / allocatedPixels : 0),
413
+ };
414
+ }
415
+ function createBakeHashes(input) {
416
+ return {
417
+ sourceHash: createBakeSourceHash(input.roots),
418
+ lightHash: createBakeLightHash(input.lightDir, input.planeY),
419
+ profileHash: createBakeProfileHash(input.options),
420
+ };
421
+ }
422
+ function createBakeChunkWork(chunk) {
423
+ const sourceNodeIds = uniqueStrings(chunk.roots.map(root => root.sourceNodeId));
424
+ return {
425
+ chunk,
426
+ sourceNodeIds,
427
+ sourceHash: createBakeHash(sourceNodeIds),
428
+ };
429
+ }
430
+ function packDirtyChunkWorks(works, bakeOptions, maxAtlasPages) {
431
+ return packStaticProjectedShadowAtlasTiles(works.map(work => ({
432
+ id: work.chunk.id,
433
+ width: Math.max(1e-6, work.chunk.bounds.width),
434
+ height: Math.max(1e-6, work.chunk.bounds.depth),
435
+ })), {
436
+ texelsPerMeter: bakeOptions.texelsPerMeter,
437
+ atlasSize: bakeOptions.atlasSize,
438
+ maxAtlasPages: Math.max(1, maxAtlasPages),
439
+ paddingPx: Math.min(2, Math.max(0, Math.round(bakeOptions.sdfRadiusPx))),
440
+ });
441
+ }
442
+ function createEmptyReusableArtifactChunks() {
443
+ return {
444
+ chunks: [],
445
+ pages: [],
446
+ chunkIds: new Set(),
447
+ };
448
+ }
449
+ function collectReusableArtifactChunks(artifact, works, hashes) {
450
+ if (!artifact || artifact.version !== 2)
451
+ return createEmptyReusableArtifactChunks();
452
+ const pagesById = new Map(artifact.pages
453
+ .filter(page => isPngDataUrl(page.sdfTextureDataUrl))
454
+ .map(page => [page.id, page]));
455
+ if (pagesById.size === 0)
456
+ return createEmptyReusableArtifactChunks();
457
+ const worksById = new Map(works.map(work => [work.chunk.id, work]));
458
+ const reusableChunks = [];
459
+ const reusablePages = new Map();
460
+ const reusableChunkIds = new Set();
461
+ for (const previousChunk of artifact.chunks) {
462
+ const work = worksById.get(previousChunk.id);
463
+ const page = pagesById.get(previousChunk.pageId);
464
+ if (!work || !page)
465
+ continue;
466
+ if (previousChunk.sourceHash !== work.sourceHash)
467
+ continue;
468
+ if (previousChunk.lightHash !== hashes.lightHash || previousChunk.profileHash !== hashes.profileHash)
469
+ continue;
470
+ if (!matchesChunkBounds(previousChunk, work.chunk.bounds))
471
+ continue;
472
+ if (!matchesChunkPlane(previousChunk, hashes.planeHeight, hashes.planeYOffset))
473
+ continue;
474
+ reusableChunks.push({ ...previousChunk, sourceNodeIds: [...previousChunk.sourceNodeIds] });
475
+ reusablePages.set(page.id, { ...page });
476
+ reusableChunkIds.add(previousChunk.id);
477
+ }
478
+ return {
479
+ chunks: reusableChunks,
480
+ pages: [...reusablePages.values()],
481
+ chunkIds: reusableChunkIds,
482
+ };
483
+ }
484
+ function matchesChunkBounds(chunk, bounds) {
485
+ return chunk.bounds.minX === roundNumber(bounds.minX)
486
+ && chunk.bounds.maxX === roundNumber(bounds.maxX)
487
+ && chunk.bounds.minZ === roundNumber(bounds.minZ)
488
+ && chunk.bounds.maxZ === roundNumber(bounds.maxZ)
489
+ && chunk.bounds.y === roundNumber(bounds.center.y);
490
+ }
491
+ function matchesChunkPlane(chunk, height, yOffset) {
492
+ return chunk.plane.height === roundNumber(height)
493
+ && chunk.plane.yOffset === roundNumber(yOffset);
494
+ }
495
+ function createBakedPageIds(pageIds, existingPageIds) {
496
+ const used = new Set(existingPageIds);
497
+ const result = new Map();
498
+ for (const pageId of pageIds) {
499
+ let next = pageId;
500
+ if (used.has(next)) {
501
+ let suffix = 0;
502
+ do {
503
+ next = `bake_${suffix}_${pageId}`;
504
+ suffix += 1;
505
+ } while (used.has(next));
506
+ }
507
+ used.add(next);
508
+ result.set(pageId, next);
509
+ }
510
+ return result;
511
+ }
512
+ function createBakeSourceHash(roots) {
513
+ return createBakeHash(roots.map(root => ({
514
+ id: root.sourceNodeId,
515
+ name: root.root.name,
516
+ matrix: serializeMatrix(root.root.getWorldMatrix()),
517
+ bounds: serializeBounds(root.bounds),
518
+ })));
519
+ }
520
+ function createBakeLightHash(lightDir, planeY) {
521
+ return createBakeHash({
522
+ direction: serializeVector(lightDir),
523
+ planeY: roundNumber(planeY),
524
+ });
525
+ }
526
+ function createBakeProfileHash(options) {
527
+ return createBakeHash({
528
+ plane: {
529
+ height: roundNumber(options.plane.height),
530
+ yOffset: roundNumber(options.plane.yOffset),
531
+ },
532
+ bake: {
533
+ padding: roundNumber(options.bake.padding),
534
+ texelsPerMeter: roundNumber(options.bake.texelsPerMeter),
535
+ atlasSize: roundNumber(options.bake.atlasSize),
536
+ maxAtlasPages: roundNumber(options.bake.maxAtlasPages),
537
+ sdfRadiusPx: roundNumber(options.bake.sdfRadiusPx),
538
+ spatialChunkSize: roundNumber(options.bake.spatialChunkSize),
539
+ },
540
+ });
541
+ }
542
+ function createBakeRoots(roots, options) {
543
+ const result = [];
544
+ for (const root of roots) {
545
+ if (root.isDisposed() || !root.isEnabled(false) || isStaticProjectedShadowInternal(root))
546
+ continue;
547
+ const meshes = collectStaticProjectedShadowNodeMeshes(root).filter(isBakeMesh);
548
+ if (meshes.length === 0)
549
+ continue;
550
+ const bounds = buildStaticProjectedShadowBounds(meshes, {
551
+ lightDir: options.lightDir,
552
+ planeY: options.planeY,
553
+ padding: options.padding,
554
+ });
555
+ if (!bounds)
556
+ continue;
557
+ result.push({
558
+ root,
559
+ sourceNodeId: readAuthoredProjectionNodeId(root) ?? root.id ?? root.name,
560
+ meshes,
561
+ bounds,
562
+ });
563
+ }
564
+ return result;
565
+ }
566
+ function createBakeChunkPlan(roots, options) {
567
+ const requestedChunkSize = Math.max(options.chunkSize || DEFAULT_STATIC_PROJECTED_SHADOW_OPTIONS.bake.spatialChunkSize, 1);
568
+ const targetChunkCount = Math.max(1, Math.floor(options.targetChunkCount || DEFAULT_STATIC_PROJECTED_SHADOW_OPTIONS.bake.targetChunkCount));
569
+ let effectiveChunkSize = requestedChunkSize;
570
+ let chunks = createBakeChunksAtSize(roots, {
571
+ chunkSize: effectiveChunkSize,
572
+ planeY: options.planeY,
573
+ });
574
+ for (let attempt = 0; attempt < 6 && chunks.length > targetChunkCount; attempt += 1) {
575
+ const scale = Math.sqrt(chunks.length / targetChunkCount) * 1.05;
576
+ effectiveChunkSize = Math.max(effectiveChunkSize + 1e-6, effectiveChunkSize * scale);
577
+ chunks = createBakeChunksAtSize(roots, {
578
+ chunkSize: effectiveChunkSize,
579
+ planeY: options.planeY,
580
+ });
581
+ }
582
+ return {
583
+ chunks,
584
+ requestedChunkSize: roundNumber(requestedChunkSize),
585
+ effectiveChunkSize: roundNumber(effectiveChunkSize),
586
+ };
587
+ }
588
+ function createBakeChunksAtSize(roots, options) {
589
+ const chunkSize = Math.max(options.chunkSize || DEFAULT_STATIC_PROJECTED_SHADOW_OPTIONS.bake.spatialChunkSize, 1);
590
+ const chunks = new Map();
591
+ for (const root of roots) {
592
+ const minGridX = Math.floor(root.bounds.minX / chunkSize);
593
+ const maxGridX = Math.floor((root.bounds.maxX - 1e-6) / chunkSize);
594
+ const minGridZ = Math.floor(root.bounds.minZ / chunkSize);
595
+ const maxGridZ = Math.floor((root.bounds.maxZ - 1e-6) / chunkSize);
596
+ for (let gridX = minGridX; gridX <= maxGridX; gridX += 1) {
597
+ for (let gridZ = minGridZ; gridZ <= maxGridZ; gridZ += 1) {
598
+ const id = `chunk_${gridX}_${gridZ}`;
599
+ let chunk = chunks.get(id);
600
+ if (!chunk) {
601
+ chunk = {
602
+ id,
603
+ gridX,
604
+ gridZ,
605
+ bounds: createChunkBounds(gridX, gridZ, chunkSize, options.planeY),
606
+ roots: [],
607
+ };
608
+ chunks.set(id, chunk);
609
+ }
610
+ chunk.roots.push(root);
611
+ }
612
+ }
613
+ }
614
+ for (const chunk of chunks.values()) {
615
+ chunk.bounds = createTightChunkBounds(chunk.roots, chunk.bounds);
616
+ }
617
+ return [...chunks.values()].sort((left, right) => left.gridX - right.gridX || left.gridZ - right.gridZ);
618
+ }
619
+ function createChunkBounds(gridX, gridZ, chunkSize, planeY) {
620
+ const minX = gridX * chunkSize;
621
+ const maxX = minX + chunkSize;
622
+ const minZ = gridZ * chunkSize;
623
+ const maxZ = minZ + chunkSize;
624
+ return {
625
+ center: new Vector3((minX + maxX) * 0.5, planeY, (minZ + maxZ) * 0.5),
626
+ width: chunkSize,
627
+ depth: chunkSize,
628
+ minX,
629
+ maxX,
630
+ minZ,
631
+ maxZ,
632
+ };
633
+ }
634
+ function createTightChunkBounds(roots, gridBounds) {
635
+ let minX = Infinity;
636
+ let maxX = -Infinity;
637
+ let minZ = Infinity;
638
+ let maxZ = -Infinity;
639
+ for (const root of roots) {
640
+ const clippedMinX = Math.max(root.bounds.minX, gridBounds.minX);
641
+ const clippedMaxX = Math.min(root.bounds.maxX, gridBounds.maxX);
642
+ const clippedMinZ = Math.max(root.bounds.minZ, gridBounds.minZ);
643
+ const clippedMaxZ = Math.min(root.bounds.maxZ, gridBounds.maxZ);
644
+ if (clippedMaxX <= clippedMinX || clippedMaxZ <= clippedMinZ)
645
+ continue;
646
+ minX = Math.min(minX, clippedMinX);
647
+ maxX = Math.max(maxX, clippedMaxX);
648
+ minZ = Math.min(minZ, clippedMinZ);
649
+ maxZ = Math.max(maxZ, clippedMaxZ);
650
+ }
651
+ if (![minX, maxX, minZ, maxZ].every(Number.isFinite))
652
+ return gridBounds;
653
+ return {
654
+ center: new Vector3((minX + maxX) * 0.5, gridBounds.center.y, (minZ + maxZ) * 0.5),
655
+ width: maxX - minX,
656
+ depth: maxZ - minZ,
657
+ minX,
658
+ maxX,
659
+ minZ,
660
+ maxZ,
661
+ };
662
+ }
663
+ function isBakeMesh(mesh) {
664
+ if (mesh.isDisposed() || !mesh.isEnabled(false))
665
+ return false;
666
+ if (!(mesh instanceof Mesh) && !(mesh instanceof InstancedMesh))
667
+ return false;
668
+ const geometrySource = mesh instanceof InstancedMesh ? mesh.sourceMesh : mesh;
669
+ if (!(geometrySource instanceof Mesh) || !geometrySource.geometry)
670
+ return false;
671
+ return mesh.isVisible && !isStaticProjectedShadowInternal(mesh);
672
+ }
673
+ function isExplicitStaticProjectedShadowRoot(mesh) {
674
+ if (mesh.isDisposed() || !mesh.isEnabled(false) || isStaticProjectedShadowInternal(mesh))
675
+ return false;
676
+ const projection = readAuthoredProjectionMetadata(mesh);
677
+ if (projection?.runtimeKind === 'camera' || projection?.runtimeKind === 'light')
678
+ return false;
679
+ return isStaticShadowSettingsMetadata(projection?.shadow)
680
+ || isStaticShadowPlanMetadata(projection?.shadowPlan);
681
+ }
682
+ function hasSelectedAncestor(mesh, selected) {
683
+ let cursor = mesh.parent;
684
+ while (cursor) {
685
+ if (cursor instanceof AbstractMesh && selected.has(cursor))
686
+ return true;
687
+ cursor = cursor.parent;
688
+ }
689
+ return false;
690
+ }
691
+ function isStaticProjectedShadowInternal(mesh) {
692
+ const metadata = mesh.metadata;
693
+ return !!metadata
694
+ && typeof metadata === 'object'
695
+ && (metadata.disableStaticProjectedShadow === true
696
+ || metadata.staticProjectedShadowInternal === true
697
+ || metadata.disableBlobShadow === true
698
+ || metadata.blobShadowInternal === true
699
+ || metadata.disablePlanarShadow === true
700
+ || metadata.planarShadowInternal === true);
701
+ }
702
+ function readAuthoredProjectionNodeId(mesh) {
703
+ const nodeId = readAuthoredProjectionMetadata(mesh)?.nodeId;
704
+ return typeof nodeId === 'string' && nodeId.trim() ? nodeId.trim() : null;
705
+ }
706
+ function readAuthoredProjectionMetadata(mesh) {
707
+ const metadata = mesh.metadata;
708
+ if (!metadata || typeof metadata !== 'object')
709
+ return null;
710
+ const editorProjection = metadata.editorProjection;
711
+ return editorProjection && typeof editorProjection === 'object' && !Array.isArray(editorProjection)
712
+ ? editorProjection
713
+ : null;
714
+ }
715
+ function isStaticShadowPlanMetadata(value) {
716
+ if (!value || typeof value !== 'object' || Array.isArray(value))
717
+ return false;
718
+ const record = value;
719
+ return record.backend === 'static-baked' || record.mode === 'static';
720
+ }
721
+ function isStaticShadowSettingsMetadata(value) {
722
+ if (!value || typeof value !== 'object' || Array.isArray(value))
723
+ return false;
724
+ return value.mode === 'static';
725
+ }
726
+ function resolveBakeLightDirection(light) {
727
+ const direction = light?.direction;
728
+ return direction?.lengthSquared?.() && direction.lengthSquared() > 1e-6
729
+ ? direction.clone().normalize()
730
+ : DEFAULT_SHADOW_DIRECTION.clone();
731
+ }
732
+ async function defaultReadMaskTexturePixels(input) {
733
+ const pixels = await input.texture.readPixels();
734
+ if (!pixels)
735
+ return null;
736
+ const size = input.texture.getSize();
737
+ return {
738
+ pixels,
739
+ width: Math.max(1, Math.round(size.width || input.width)),
740
+ height: Math.max(1, Math.round(size.height || input.height)),
741
+ };
742
+ }
743
+ async function defaultEncodeAtlasTexture(input) {
744
+ return encodeRgbaPixelsAsPngDataUrl(input.pixels, input.width, input.height);
745
+ }
746
+ function defaultProcessSdfTile(input) {
747
+ return createStaticProjectedShadowSdfTileFromMaskPixels(input.pixels, input.width, input.height, input.sdfRadiusPx);
748
+ }
749
+ function encodeRgbaPixelsAsPngDataUrl(pixels, width, height) {
750
+ const canvas = createCanvas(width, height);
751
+ const context = canvas?.getContext('2d');
752
+ if (!canvas || !context)
753
+ return null;
754
+ const imageData = context.createImageData(width, height);
755
+ const source = pixels instanceof Uint8Array || pixels instanceof Uint8ClampedArray
756
+ ? pixels
757
+ : new Uint8Array(pixels.buffer, pixels.byteOffset, pixels.byteLength);
758
+ const target = imageData.data;
759
+ const length = Math.min(source.length, target.length);
760
+ for (let index = 0; index < length; index += 4) {
761
+ const alpha = source[index + 3] ?? 0;
762
+ target[index] = alpha > 0 ? 255 : 0;
763
+ target[index + 1] = alpha > 0 ? 255 : 0;
764
+ target[index + 2] = alpha > 0 ? 255 : 0;
765
+ target[index + 3] = alpha;
766
+ }
767
+ context.putImageData(imageData, 0, 0);
768
+ return typeof canvas.toDataURL === 'function' ? canvas.toDataURL('image/png') : null;
769
+ }
770
+ function createCanvas(width, height) {
771
+ const documentRef = typeof document === 'undefined' ? null : document;
772
+ if (!documentRef?.createElement)
773
+ return null;
774
+ const canvas = documentRef.createElement('canvas');
775
+ canvas.width = width;
776
+ canvas.height = height;
777
+ return canvas;
778
+ }
779
+ function createBakeHash(value) {
780
+ const text = stableStringify(value);
781
+ let hash = 0x811c9dc5;
782
+ for (let index = 0; index < text.length; index += 1) {
783
+ hash ^= text.charCodeAt(index);
784
+ hash = Math.imul(hash, 0x01000193);
785
+ }
786
+ return `fnv1a:${(hash >>> 0).toString(16).padStart(8, '0')}`;
787
+ }
788
+ function stableStringify(value) {
789
+ if (value == null || typeof value !== 'object')
790
+ return JSON.stringify(value);
791
+ if (Array.isArray(value))
792
+ return `[${value.map(stableStringify).join(',')}]`;
793
+ const entries = Object.entries(value)
794
+ .sort(([left], [right]) => left.localeCompare(right));
795
+ return `{${entries.map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`).join(',')}}`;
796
+ }
797
+ function serializeMatrix(matrix) {
798
+ return matrix.asArray().map(roundNumber);
799
+ }
800
+ function serializeVector(vector) {
801
+ return {
802
+ x: roundNumber(vector.x),
803
+ y: roundNumber(vector.y),
804
+ z: roundNumber(vector.z),
805
+ };
806
+ }
807
+ function serializeBounds(bounds) {
808
+ return {
809
+ minX: roundNumber(bounds.minX),
810
+ maxX: roundNumber(bounds.maxX),
811
+ minZ: roundNumber(bounds.minZ),
812
+ maxZ: roundNumber(bounds.maxZ),
813
+ y: roundNumber(bounds.center.y),
814
+ };
815
+ }
816
+ function roundNumber(value) {
817
+ return Math.round(value * 1000000) / 1000000;
818
+ }
819
+ function nowMs() {
820
+ return typeof performance !== 'undefined' && typeof performance.now === 'function'
821
+ ? performance.now()
822
+ : Date.now();
823
+ }
824
+ function uniqueStrings(values) {
825
+ return [...new Set(values.map(value => value.trim()).filter(Boolean))];
826
+ }
827
+ function isPngDataUrl(value) {
828
+ return typeof value === 'string' && /^data:image\/png[;,]/i.test(value);
829
+ }
830
+ //# sourceMappingURL=static-projected-shadow-baker.js.map