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

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 +659 -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 +4533 -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,847 @@
1
+ import { FreeCamera } from '@babylonjs/core/Cameras/freeCamera.js';
2
+ import { Camera } from '@babylonjs/core/Cameras/camera.js';
3
+ import { DirectionalLight } from '@babylonjs/core/Lights/directionalLight.js';
4
+ import { ShadowGenerator } from '@babylonjs/core/Lights/Shadows/shadowGenerator.js';
5
+ import { Material } from '@babylonjs/core/Materials/material.js';
6
+ import { EffectRenderer, EffectWrapper } from '@babylonjs/core/Materials/effectRenderer.js';
7
+ import { RenderTargetTexture } from '@babylonjs/core/Materials/Textures/renderTargetTexture.js';
8
+ import { Vector3 } from '@babylonjs/core/Maths/math.vector.js';
9
+ import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder.js';
10
+ import { DEFAULT_SHADOW_MAP_EXPERIMENT_SOFTNESS, resolveShadowMapExperimentAppearance, } from '../../../rendering/index.js';
11
+ const COMPOSITOR_COMPILE_RETRY_LIMIT = 240;
12
+ const MAX_FULL_FLOAT_SPLIT_DEPTH_TEXELS = 3 * 2048 * 2048;
13
+ const SOFT_BLUR_SCALE = 2;
14
+ const MAX_SOFT_KERNEL_TEXELS = 16;
15
+ export function readBabylonShadowMapExperimentAllocationCleanup(error) {
16
+ const cleanup = error
17
+ ?.shadowMapExperimentAllocationCleanup;
18
+ return typeof cleanup === 'function' ? cleanup : null;
19
+ }
20
+ export function createBabylonShadowMapExperimentDepthBackend(scene, light, plan, options = {}) {
21
+ const gpuCapability = readGpuCapability(scene.getEngine(), plan);
22
+ if (plan.generator.backend.mode === 'single') {
23
+ assertSingleBackendSupported(plan, gpuCapability);
24
+ return createSingleBackend(light, plan, null, gpuCapability);
25
+ }
26
+ const unsupportedReason = readSplitUnsupportedReason(gpuCapability, plan);
27
+ if (unsupportedReason)
28
+ return fallbackOrThrow(light, plan, unsupportedReason, gpuCapability);
29
+ try {
30
+ return createSplitBackend(scene, light, plan, gpuCapability, options);
31
+ }
32
+ catch (error) {
33
+ const retryCleanup = readBabylonShadowMapExperimentAllocationCleanup(error);
34
+ if (retryCleanup) {
35
+ const cleanupErrors = retryCleanup();
36
+ if (cleanupErrors.length > 0)
37
+ throw attachAllocationCleanup(error, retryCleanup, cleanupErrors);
38
+ }
39
+ return fallbackOrThrow(light, plan, `split-initialization-failed:${errorMessage(error)}`, gpuCapability);
40
+ }
41
+ }
42
+ export function createBabylonShadowMapExperimentSingleDepthBackend(light, plan, fallbackReason) {
43
+ const gpuCapability = readGpuCapability(light.getScene().getEngine(), plan);
44
+ assertSingleBackendSupported(plan, gpuCapability);
45
+ return createSingleBackend(light, plan, fallbackReason, gpuCapability);
46
+ }
47
+ function createSplitBackend(scene, light, plan, gpuCapability, options) {
48
+ const resources = [];
49
+ const existingGenerators = snapshotShadowGenerators(light);
50
+ const existingSceneMeshes = new Set(scene.meshes);
51
+ const leakedFacadeSentinels = new Set();
52
+ const existingSceneCameras = new Set(scene.cameras);
53
+ const leakedHelperCameras = new Set();
54
+ const leakedGenerators = new Set();
55
+ try {
56
+ const staticCamera = createHelperCamera(scene, 'static');
57
+ trackDisposable(resources, staticCamera);
58
+ const dynamicCamera = createHelperCamera(scene, 'dynamic');
59
+ trackDisposable(resources, dynamicCamera);
60
+ const staticGenerator = new ShadowGenerator(plan.generator.maps.staticResolution, light, true, staticCamera, true, true);
61
+ trackDisposable(resources, staticGenerator);
62
+ const dynamicGenerator = new ShadowGenerator(plan.generator.maps.dynamicResolution, light, true, dynamicCamera, true, true);
63
+ trackDisposable(resources, dynamicGenerator);
64
+ const facadeGenerator = new ShadowGenerator(plan.generator.maps.compositeResolution, light, true, null, true, true);
65
+ trackDisposable(resources, facadeGenerator);
66
+ configureHardGenerator(staticGenerator, plan);
67
+ configureHardGenerator(dynamicGenerator, plan);
68
+ configureSplitFacadeGenerator(facadeGenerator, plan);
69
+ const staticMap = requireShadowMap(staticGenerator, 'static');
70
+ const dynamicMap = requireShadowMap(dynamicGenerator, 'dynamic');
71
+ const compositeMap = requireShadowMap(facadeGenerator, 'composite');
72
+ configureRenderOnce(staticMap);
73
+ configureRenderOnce(dynamicMap);
74
+ configureRenderOnce(compositeMap);
75
+ staticMap.renderList = [];
76
+ dynamicMap.renderList = [];
77
+ const facadeEligibilityMesh = MeshBuilder.CreatePlane('__fps_shadow_facade_eligibility__', { size: 0.001 }, scene);
78
+ trackDisposable(resources, facadeEligibilityMesh);
79
+ facadeEligibilityMesh.doNotSerialize = true;
80
+ scene.removeMesh(facadeEligibilityMesh);
81
+ compositeMap.renderList = [facadeEligibilityMesh];
82
+ scene.markAllMaterialsAsDirty(Material.LightDirtyFlag);
83
+ const compositor = createDepthCompositor(scene.getEngine(), staticMap, dynamicMap, compositeMap, options.onCompositorLifecycleEvent);
84
+ trackDisposable(resources, compositor);
85
+ const compositorFailure = compositor.getFailureReason();
86
+ if (compositorFailure)
87
+ throw new Error(compositorFailure);
88
+ compositeMap.customRenderFunction = () => compositor.render();
89
+ return createOwnedBackend({
90
+ mode: 'split-static-dynamic',
91
+ fallbackReason: null,
92
+ gpuCapability,
93
+ textureFormat: 'r-full-float',
94
+ receiverFilter: plan.generator.filter === 'low-pcf'
95
+ && resolveShadowMapExperimentAppearance(plan.generator).softness > 0
96
+ ? 'native-soft-kernel'
97
+ : 'hard',
98
+ filter: plan.generator.filter,
99
+ initialAppearance: resolveShadowMapExperimentAppearance(plan.generator),
100
+ generator: facadeGenerator,
101
+ staticGenerator,
102
+ dynamicGenerator,
103
+ compositor,
104
+ staticResolution: plan.generator.maps.staticResolution,
105
+ dynamicResolution: plan.generator.maps.dynamicResolution,
106
+ compositeResolution: plan.generator.maps.compositeResolution,
107
+ disposeResources: () => disposeTrackedReverse(resources),
108
+ });
109
+ }
110
+ catch (error) {
111
+ const nestedCleanup = readBabylonShadowMapExperimentAllocationCleanup(error);
112
+ const retryCleanup = () => Object.freeze([
113
+ ...(nestedCleanup?.() ?? []),
114
+ ...cleanupFailedGeneratorAllocation(light, existingGenerators, resources, leakedGenerators, scene, existingSceneMeshes, leakedFacadeSentinels, existingSceneCameras, leakedHelperCameras),
115
+ ]);
116
+ const cleanupErrors = retryCleanup();
117
+ throw cleanupErrors.length > 0 ? attachAllocationCleanup(error, retryCleanup, cleanupErrors) : error;
118
+ }
119
+ }
120
+ function createSingleBackend(light, plan, fallbackReason, gpuCapability) {
121
+ const existingGenerators = snapshotShadowGenerators(light);
122
+ const resources = [];
123
+ const leakedGenerators = new Set();
124
+ try {
125
+ const generator = new ShadowGenerator(plan.generator.maps.compositeResolution, light);
126
+ trackDisposable(resources, generator);
127
+ configureGenerator(generator, plan);
128
+ const map = requireShadowMap(generator, 'single');
129
+ configureRenderOnce(map);
130
+ return createOwnedBackend({
131
+ mode: fallbackReason ? 'single-map-fallback' : 'single-map',
132
+ fallbackReason,
133
+ gpuCapability,
134
+ textureFormat: 'single-map',
135
+ receiverFilter: readSingleMapReceiverFilter(generator, plan),
136
+ filter: plan.generator.filter,
137
+ initialAppearance: resolveShadowMapExperimentAppearance(plan.generator),
138
+ generator,
139
+ staticGenerator: generator,
140
+ dynamicGenerator: generator,
141
+ compositor: null,
142
+ staticResolution: plan.generator.maps.compositeResolution,
143
+ dynamicResolution: plan.generator.maps.compositeResolution,
144
+ compositeResolution: plan.generator.maps.compositeResolution,
145
+ disposeResources: () => generator.dispose(),
146
+ });
147
+ }
148
+ catch (error) {
149
+ const retryCleanup = () => cleanupFailedGeneratorAllocation(light, existingGenerators, resources, leakedGenerators);
150
+ const cleanupErrors = retryCleanup();
151
+ throw cleanupErrors.length > 0 ? attachAllocationCleanup(error, retryCleanup, cleanupErrors) : error;
152
+ }
153
+ }
154
+ function createOwnedBackend(input) {
155
+ let disposed = false;
156
+ let staticCandidateCount = 0;
157
+ let dynamicCandidateCount = 0;
158
+ let staticRefreshCount = 0;
159
+ let dynamicRefreshCount = 0;
160
+ let compositeRefreshCount = 0;
161
+ let staticRenderCount = 0;
162
+ let dynamicRenderCount = 0;
163
+ let compositeRenderCount = 0;
164
+ let appearance = input.initialAppearance;
165
+ let receiverFilter = input.receiverFilter;
166
+ let staticLastReasons = Object.freeze([]);
167
+ let dynamicLastReasons = Object.freeze([]);
168
+ const staticCasters = new Set();
169
+ const dynamicCasters = new Set();
170
+ input.staticGenerator.getShadowMap()?.onBeforeRenderObservable.add(() => { staticRenderCount += 1; });
171
+ input.dynamicGenerator.getShadowMap()?.onBeforeRenderObservable.add(() => { dynamicRenderCount += 1; });
172
+ input.generator.getShadowMap()?.onBeforeRenderObservable.add(() => { compositeRenderCount += 1; });
173
+ const assertUsable = () => {
174
+ if (disposed)
175
+ throw new Error('shadowMapExperiment.depthBackendDisposed');
176
+ };
177
+ const generatorForLayer = (layer) => (layer === 'static' ? input.staticGenerator : input.dynamicGenerator);
178
+ const casterSetForLayer = (layer) => (layer === 'static' ? staticCasters : dynamicCasters);
179
+ return {
180
+ generator: input.generator,
181
+ mode: input.mode,
182
+ fallbackReason: input.fallbackReason,
183
+ getRuntimeFailureReason() {
184
+ return input.compositor?.getFailureReason() ?? null;
185
+ },
186
+ isAttachedTo(light) {
187
+ if (disposed || light.isDisposed())
188
+ return false;
189
+ const scene = light.getScene();
190
+ const attachedGenerators = new Set(light.getShadowGenerators()?.values() ?? []);
191
+ const ownedGenerators = new Set([
192
+ input.generator,
193
+ input.staticGenerator,
194
+ input.dynamicGenerator,
195
+ ]);
196
+ return [...ownedGenerators].every(ownedGenerator => {
197
+ const shadowMap = ownedGenerator.getShadowMap();
198
+ return ownedGenerator.getLight() === light
199
+ && attachedGenerators.has(ownedGenerator)
200
+ && shadowMap !== null
201
+ && scene.textures.includes(shadowMap);
202
+ });
203
+ },
204
+ addCaster(mesh, layer) {
205
+ assertUsable();
206
+ const target = casterSetForLayer(layer);
207
+ const other = casterSetForLayer(layer === 'static' ? 'dynamic' : 'static');
208
+ const wasStatic = staticCasters.has(mesh);
209
+ const wasDynamic = dynamicCasters.has(mesh);
210
+ if (target.has(mesh) && !other.has(mesh))
211
+ return;
212
+ try {
213
+ if (isSingleMapMode(input.mode)) {
214
+ if (!wasStatic && !wasDynamic)
215
+ input.generator.addShadowCaster(mesh, false);
216
+ }
217
+ else {
218
+ generatorForLayer(layer).addShadowCaster(mesh, false);
219
+ if (other.has(mesh)) {
220
+ generatorForLayer(layer === 'static' ? 'dynamic' : 'static').removeShadowCaster(mesh, false);
221
+ }
222
+ }
223
+ }
224
+ catch (error) {
225
+ const rollbackErrors = restoreCasterMembership(input, mesh, wasStatic, wasDynamic);
226
+ throw attachCasterMutationRollback(error, rollbackErrors);
227
+ }
228
+ staticCasters.delete(mesh);
229
+ dynamicCasters.delete(mesh);
230
+ target.add(mesh);
231
+ },
232
+ removeCaster(mesh) {
233
+ assertUsable();
234
+ const wasStatic = staticCasters.has(mesh);
235
+ const wasDynamic = dynamicCasters.has(mesh);
236
+ if (!wasStatic && !wasDynamic)
237
+ return;
238
+ try {
239
+ if (isSingleMapMode(input.mode)) {
240
+ input.generator.removeShadowCaster(mesh, false);
241
+ }
242
+ else {
243
+ if (wasStatic)
244
+ input.staticGenerator.removeShadowCaster(mesh, false);
245
+ if (wasDynamic)
246
+ input.dynamicGenerator.removeShadowCaster(mesh, false);
247
+ }
248
+ }
249
+ catch (error) {
250
+ const rollbackErrors = restoreCasterMembership(input, mesh, wasStatic, wasDynamic);
251
+ throw attachCasterMutationRollback(error, rollbackErrors);
252
+ }
253
+ staticCasters.delete(mesh);
254
+ dynamicCasters.delete(mesh);
255
+ },
256
+ hasCaster(mesh, layer) {
257
+ if (layer)
258
+ return casterSetForLayer(layer).has(mesh);
259
+ return staticCasters.has(mesh) || dynamicCasters.has(mesh);
260
+ },
261
+ setCandidateCounts(staticCount, dynamicCount) {
262
+ assertUsable();
263
+ staticCandidateCount = Math.max(0, Math.floor(staticCount));
264
+ dynamicCandidateCount = Math.max(0, Math.floor(dynamicCount));
265
+ },
266
+ setAppearance(nextAppearance) {
267
+ assertUsable();
268
+ const next = resolveShadowMapExperimentAppearance(nextAppearance);
269
+ const softnessChanged = next.softness !== appearance.softness;
270
+ input.generator.setDarkness(next.darkness);
271
+ if (softnessChanged) {
272
+ receiverFilter = configureReceiverAppearance(input.generator, input.mode, input.filter, input.compositeResolution ?? input.generator.getShadowMap()?.getSize().width ?? 0, next.softness);
273
+ }
274
+ appearance = next;
275
+ return Object.freeze({
276
+ compositeRefreshRequired: softnessChanged
277
+ && input.filter === 'low-pcf'
278
+ && input.mode === 'split-static-dynamic',
279
+ });
280
+ },
281
+ refresh(decision) {
282
+ assertUsable();
283
+ if (decision.static.shouldRefresh) {
284
+ input.staticGenerator.getShadowMap()?.resetRefreshCounter();
285
+ staticRefreshCount += 1;
286
+ staticLastReasons = decision.static.reasons;
287
+ }
288
+ if (decision.dynamic.shouldRefresh) {
289
+ input.dynamicGenerator.getShadowMap()?.resetRefreshCounter();
290
+ dynamicRefreshCount += 1;
291
+ dynamicLastReasons = decision.dynamic.reasons;
292
+ }
293
+ if (decision.composite.shouldRefresh) {
294
+ input.generator.getShadowMap()?.resetRefreshCounter();
295
+ compositeRefreshCount += 1;
296
+ }
297
+ },
298
+ getEvidence() {
299
+ const staticRetained = staticCasters.size;
300
+ const dynamicRetained = dynamicCasters.size;
301
+ return Object.freeze({
302
+ backend: input.mode,
303
+ fallbackReason: input.fallbackReason,
304
+ receiverFilter,
305
+ appearance,
306
+ gpuCapability: input.gpuCapability,
307
+ textureFormat: input.textureFormat,
308
+ static: layerEvidence(input.staticResolution ?? input.generator.getShadowMap()?.getSize().width ?? 0, staticCandidateCount, staticRetained, staticRefreshCount, staticRenderCount, staticLastReasons),
309
+ dynamic: layerEvidence(input.dynamicResolution ?? input.generator.getShadowMap()?.getSize().width ?? 0, dynamicCandidateCount, dynamicRetained, dynamicRefreshCount, dynamicRenderCount, dynamicLastReasons),
310
+ compositeResolution: input.compositeResolution ?? input.generator.getShadowMap()?.getSize().width ?? 0,
311
+ compositeRefreshCount,
312
+ compositeRenderCount,
313
+ compositorReady: input.compositor?.isReady() ?? true,
314
+ });
315
+ },
316
+ dispose() {
317
+ if (disposed)
318
+ return;
319
+ input.disposeResources();
320
+ staticCasters.clear();
321
+ dynamicCasters.clear();
322
+ disposed = true;
323
+ },
324
+ };
325
+ }
326
+ function restoreCasterMembership(input, mesh, wasStatic, wasDynamic) {
327
+ const rollbackErrors = [];
328
+ const attempt = (operation) => {
329
+ try {
330
+ operation();
331
+ }
332
+ catch (error) {
333
+ rollbackErrors.push(error);
334
+ }
335
+ };
336
+ if (isSingleMapMode(input.mode)) {
337
+ attempt(() => forceGeneratorCasterMembership(input.generator, mesh, wasStatic || wasDynamic, false));
338
+ }
339
+ else {
340
+ attempt(() => forceGeneratorCasterMembership(input.staticGenerator, mesh, wasStatic, false));
341
+ attempt(() => forceGeneratorCasterMembership(input.dynamicGenerator, mesh, wasDynamic, false));
342
+ }
343
+ return Object.freeze(rollbackErrors);
344
+ }
345
+ function isSingleMapMode(mode) {
346
+ return mode === 'single-map' || mode === 'single-map-fallback';
347
+ }
348
+ function forceGeneratorCasterMembership(generator, mesh, retained, markFacadeEligibility) {
349
+ const map = generator.getShadowMap();
350
+ if (!map)
351
+ return;
352
+ const wasEligible = (map.renderList?.length ?? 0) > 0;
353
+ const renderList = map.renderList ?? (map.renderList = []);
354
+ const index = renderList.indexOf(mesh);
355
+ if (retained && index === -1)
356
+ renderList.push(mesh);
357
+ if (!retained && index !== -1)
358
+ renderList.splice(index, 1);
359
+ const isEligible = renderList.length > 0;
360
+ if (markFacadeEligibility && wasEligible !== isEligible) {
361
+ generator.getLight().getScene().markAllMaterialsAsDirty(Material.LightDirtyFlag);
362
+ }
363
+ }
364
+ function attachCasterMutationRollback(error, rollbackErrors) {
365
+ if (rollbackErrors.length === 0)
366
+ return error;
367
+ if (error && (typeof error === 'object' || typeof error === 'function')) {
368
+ try {
369
+ Object.assign(error, { casterMutationRollbackErrors: rollbackErrors });
370
+ return error;
371
+ }
372
+ catch {
373
+ // Preserve the primary failure as cause when it cannot carry rollback diagnostics.
374
+ }
375
+ }
376
+ return Object.assign(new Error(errorMessage(error)), {
377
+ cause: error,
378
+ casterMutationRollbackErrors: rollbackErrors,
379
+ });
380
+ }
381
+ function createDepthCompositor(engine, staticMap, dynamicMap, compositeMap, onLifecycleEvent) {
382
+ const renderer = new EffectRenderer(engine);
383
+ let wrapper = null;
384
+ let compiled = false;
385
+ let compileError = null;
386
+ let runtimeError = null;
387
+ let pendingRenderAttemptCount = 0;
388
+ let lifecycleDisposed = false;
389
+ let readyNotified = false;
390
+ let failureNotified = false;
391
+ const notifyLifecycle = (event) => {
392
+ if (lifecycleDisposed)
393
+ return;
394
+ if (event === 'ready') {
395
+ if (readyNotified || failureNotified)
396
+ return;
397
+ readyNotified = true;
398
+ }
399
+ else if (event === 'failed') {
400
+ if (failureNotified)
401
+ return;
402
+ failureNotified = true;
403
+ }
404
+ else if (readyNotified || failureNotified) {
405
+ return;
406
+ }
407
+ onLifecycleEvent?.(event);
408
+ };
409
+ const queueLifecycle = (event) => {
410
+ queueMicrotask(() => notifyLifecycle(event));
411
+ };
412
+ try {
413
+ wrapper = new EffectWrapper({
414
+ engine,
415
+ name: 'fpsShadowDepthMinCompositor',
416
+ fragmentShader: `
417
+ precision highp float;
418
+ varying vec2 vUV;
419
+ uniform sampler2D staticDepthSampler;
420
+ uniform sampler2D dynamicDepthSampler;
421
+ void main(void) {
422
+ float staticDepth = texture2D(staticDepthSampler, vUV).r;
423
+ float dynamicDepth = texture2D(dynamicDepthSampler, vUV).r;
424
+ float composedDepth = min(staticDepth, dynamicDepth);
425
+ gl_FragDepth = composedDepth;
426
+ gl_FragColor = vec4(composedDepth, 1.0, 1.0, 1.0);
427
+ }`,
428
+ samplerNames: ['staticDepthSampler', 'dynamicDepthSampler'],
429
+ blockCompilation: true,
430
+ });
431
+ const ownedWrapper = wrapper;
432
+ ownedWrapper.onApplyObservable.add(() => {
433
+ ownedWrapper.effect.setTexture('staticDepthSampler', staticMap);
434
+ ownedWrapper.effect.setTexture('dynamicDepthSampler', dynamicMap);
435
+ });
436
+ ownedWrapper.updateEffect(null, ['scale'], ['staticDepthSampler', 'dynamicDepthSampler'], undefined, () => {
437
+ if (lifecycleDisposed)
438
+ return;
439
+ compiled = true;
440
+ pendingRenderAttemptCount = 0;
441
+ compositeMap.resetRefreshCounter();
442
+ queueLifecycle('ready');
443
+ }, (_effect, errors) => {
444
+ if (lifecycleDisposed)
445
+ return;
446
+ compileError = errors || 'unknown';
447
+ queueLifecycle('failed');
448
+ });
449
+ }
450
+ catch (error) {
451
+ const cleanupErrors = [];
452
+ let wrapperDisposed = wrapper === null;
453
+ let rendererDisposed = false;
454
+ const retryCleanup = () => {
455
+ const retryErrors = [];
456
+ if (!wrapperDisposed && wrapper) {
457
+ try {
458
+ wrapper.dispose();
459
+ wrapperDisposed = true;
460
+ }
461
+ catch (cleanupError) {
462
+ retryErrors.push(cleanupError);
463
+ }
464
+ }
465
+ if (!rendererDisposed) {
466
+ try {
467
+ renderer.dispose();
468
+ rendererDisposed = true;
469
+ }
470
+ catch (cleanupError) {
471
+ retryErrors.push(cleanupError);
472
+ }
473
+ }
474
+ return Object.freeze(retryErrors);
475
+ };
476
+ cleanupErrors.push(...retryCleanup());
477
+ if (cleanupErrors.length > 0) {
478
+ throw attachAllocationCleanup(error, retryCleanup, cleanupErrors);
479
+ }
480
+ throw error;
481
+ }
482
+ const ownedWrapper = wrapper;
483
+ let wrapperDisposed = false;
484
+ let rendererDisposed = false;
485
+ const readCompileError = () => {
486
+ if (compileError)
487
+ return compileError;
488
+ const effect = ownedWrapper.effect;
489
+ const effectError = effect?.getCompilationError() ?? '';
490
+ if (effectError) {
491
+ compileError = effectError;
492
+ queueLifecycle('failed');
493
+ }
494
+ return compileError;
495
+ };
496
+ return {
497
+ isReady() {
498
+ return runtimeError === null && readCompileError() === null && compiled && ownedWrapper.isReady();
499
+ },
500
+ getFailureReason() {
501
+ if (runtimeError)
502
+ return runtimeError;
503
+ const currentCompileError = readCompileError();
504
+ if (currentCompileError)
505
+ return `compositor-compile-failed:${currentCompileError}`;
506
+ return null;
507
+ },
508
+ render() {
509
+ if (runtimeError || readCompileError())
510
+ return;
511
+ if (!compiled || !ownedWrapper.isReady()) {
512
+ pendingRenderAttemptCount += 1;
513
+ if (pendingRenderAttemptCount >= COMPOSITOR_COMPILE_RETRY_LIMIT) {
514
+ runtimeError = `compositor-compile-timeout:${COMPOSITOR_COMPILE_RETRY_LIMIT}-render-attempts`;
515
+ notifyLifecycle('failed');
516
+ return;
517
+ }
518
+ compositeMap.resetRefreshCounter();
519
+ notifyLifecycle('pending');
520
+ return;
521
+ }
522
+ try {
523
+ const previousDepthWrite = engine.getDepthWrite();
524
+ renderer.saveStates();
525
+ try {
526
+ renderer.setViewport();
527
+ engine.setDepthWrite(true);
528
+ renderer.applyEffectWrapper(ownedWrapper, true);
529
+ renderer.draw();
530
+ }
531
+ finally {
532
+ engine.setDepthWrite(previousDepthWrite);
533
+ renderer.restoreStates();
534
+ }
535
+ }
536
+ catch (error) {
537
+ runtimeError = `compositor-render-failed:${errorMessage(error)}`;
538
+ notifyLifecycle('failed');
539
+ }
540
+ },
541
+ dispose() {
542
+ lifecycleDisposed = true;
543
+ const cleanupErrors = [];
544
+ if (!wrapperDisposed) {
545
+ try {
546
+ ownedWrapper.dispose();
547
+ wrapperDisposed = true;
548
+ }
549
+ catch (error) {
550
+ cleanupErrors.push(error);
551
+ }
552
+ }
553
+ if (!rendererDisposed) {
554
+ try {
555
+ renderer.dispose();
556
+ rendererDisposed = true;
557
+ }
558
+ catch (error) {
559
+ cleanupErrors.push(error);
560
+ }
561
+ }
562
+ if (cleanupErrors.length > 0) {
563
+ throw Object.assign(new Error('shadowMapExperiment.depthCompositorDisposeFailed'), { cleanupErrors });
564
+ }
565
+ },
566
+ };
567
+ }
568
+ function createHelperCamera(scene, layer) {
569
+ const camera = new FreeCamera(`__fps_shadow_${layer}_camera__`, Vector3.Zero(), scene, false);
570
+ camera.doNotSerialize = true;
571
+ camera.layerMask = 0;
572
+ camera.minZ = 0.01;
573
+ camera.maxZ = 10_000;
574
+ camera.metadata = Object.freeze({ helper: true, shadowMapExperimentLayer: layer });
575
+ return camera;
576
+ }
577
+ function configureGenerator(generator, plan) {
578
+ configureGeneratorCommon(generator, plan);
579
+ configureReceiverAppearance(generator, 'single-map', plan.generator.filter, plan.generator.maps.compositeResolution, resolveShadowMapExperimentAppearance(plan.generator).softness);
580
+ }
581
+ function readSingleMapReceiverFilter(generator, plan) {
582
+ if (plan.generator.filter !== 'low-pcf')
583
+ return 'hard';
584
+ if (generator.useContactHardeningShadow)
585
+ return 'native-contact-hardening';
586
+ if (generator.usePercentageCloserFiltering)
587
+ return 'native-low-pcf';
588
+ if (generator.usePoissonSampling)
589
+ return 'poisson-low-pcf';
590
+ return 'hard';
591
+ }
592
+ function configureGeneratorCommon(generator, plan) {
593
+ generator.filteringQuality = ShadowGenerator.QUALITY_LOW;
594
+ generator.bias = plan.generator.bias;
595
+ generator.normalBias = plan.generator.normalBias;
596
+ generator.setDarkness(plan.generator.darkness);
597
+ generator.doNotSerialize = true;
598
+ }
599
+ function configureHardGenerator(generator, plan) {
600
+ configureGeneratorCommon(generator, plan);
601
+ generator.filter = ShadowGenerator.FILTER_NONE;
602
+ }
603
+ function configureSplitFacadeGenerator(generator, plan) {
604
+ configureHardGenerator(generator, plan);
605
+ configureReceiverAppearance(generator, 'split-static-dynamic', plan.generator.filter, plan.generator.maps.compositeResolution, resolveShadowMapExperimentAppearance(plan.generator).softness);
606
+ }
607
+ function configureReceiverAppearance(generator, mode, filter, compositeResolution, softness) {
608
+ if (filter !== 'low-pcf' || softness <= 0) {
609
+ generator.filter = ShadowGenerator.FILTER_NONE;
610
+ return 'hard';
611
+ }
612
+ if (mode === 'split-static-dynamic') {
613
+ configureSoftKernelGenerator(generator, compositeResolution, softness);
614
+ return 'native-soft-kernel';
615
+ }
616
+ generator.filteringQuality = ShadowGenerator.QUALITY_HIGH;
617
+ if (Math.abs(softness - DEFAULT_SHADOW_MAP_EXPERIMENT_SOFTNESS) <= 1e-6) {
618
+ generator.usePercentageCloserFiltering = true;
619
+ return 'native-low-pcf';
620
+ }
621
+ generator.contactHardeningLightSizeUVRatio = Math.max(0.001, softness * 0.1);
622
+ generator.useContactHardeningShadow = true;
623
+ return 'native-contact-hardening';
624
+ }
625
+ function configureSoftKernelGenerator(generator, compositeResolution, softness) {
626
+ generator.blurScale = SOFT_BLUR_SCALE;
627
+ generator.useKernelBlur = true;
628
+ generator.blurKernel = Math.max(2, Math.round(softness * MAX_SOFT_KERNEL_TEXELS * compositeResolution / 2048));
629
+ generator.useBlurCloseExponentialShadowMap = true;
630
+ }
631
+ function configureRenderOnce(map) {
632
+ map.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;
633
+ map.renderParticles = false;
634
+ }
635
+ function requireShadowMap(generator, layer) {
636
+ const map = generator.getShadowMap();
637
+ if (!map)
638
+ throw new Error(`shadowMapExperiment.shadowMapUnavailable:${layer}`);
639
+ return map;
640
+ }
641
+ function readGpuCapability(engine, plan) {
642
+ const caps = engine.getCaps();
643
+ const engineKind = engine.isWebGPU ? 'webgpu' : 'webgl';
644
+ const fragmentDepthSupported = caps.fragmentDepthSupported === true;
645
+ const nativeShadowComparison = engine._features?.supportShadowSamplers === true;
646
+ const requiredResolution = Math.max(plan.generator.maps.staticResolution, plan.generator.maps.dynamicResolution, plan.generator.maps.compositeResolution);
647
+ const fullFloatRender = caps.textureFloatRender === true;
648
+ const fullFloatLinearFiltering = caps.textureFloatLinearFiltering === true;
649
+ const halfFloatRender = caps.textureHalfFloatRender === true;
650
+ const halfFloatLinearFiltering = caps.textureHalfFloatLinearFiltering === true;
651
+ const splitPreservesSourceResolution = readSplitSourceResolutionMismatch(plan) === null;
652
+ const splitWithinBudget = readFullFloatSplitDepthTexelCount(plan) <= MAX_FULL_FLOAT_SPLIT_DEPTH_TEXELS;
653
+ return Object.freeze({
654
+ engine: engineKind,
655
+ fragmentDepthSupported,
656
+ nativeShadowComparison,
657
+ fullFloatRender,
658
+ fullFloatLinearFiltering,
659
+ maxRenderTextureSize: caps.maxRenderTextureSize,
660
+ halfFloatRender,
661
+ halfFloatLinearFiltering,
662
+ splitSupported: engineKind === 'webgl'
663
+ && fragmentDepthSupported
664
+ && nativeShadowComparison
665
+ && caps.maxRenderTextureSize >= requiredResolution
666
+ && fullFloatRender
667
+ && fullFloatLinearFiltering
668
+ && splitPreservesSourceResolution
669
+ && splitWithinBudget,
670
+ });
671
+ }
672
+ function readSplitUnsupportedReason(capability, plan) {
673
+ if (capability.engine === 'webgpu')
674
+ return 'unsupported-engine:webgpu';
675
+ const requiredResolution = Math.max(plan.generator.maps.staticResolution, plan.generator.maps.dynamicResolution, plan.generator.maps.compositeResolution);
676
+ if (capability.maxRenderTextureSize < requiredResolution) {
677
+ return `insufficient-max-render-texture-size:${capability.maxRenderTextureSize}`;
678
+ }
679
+ if (!(capability.fullFloatRender && capability.fullFloatLinearFiltering)) {
680
+ return 'full-float-render-target-unavailable';
681
+ }
682
+ if (!capability.fragmentDepthSupported)
683
+ return 'fragment-depth-unavailable';
684
+ if (!capability.nativeShadowComparison)
685
+ return 'shadow-comparison-sampler-unavailable';
686
+ const sourceResolutionMismatch = readSplitSourceResolutionMismatch(plan);
687
+ if (sourceResolutionMismatch)
688
+ return sourceResolutionMismatch;
689
+ const splitDepthTexelCount = readFullFloatSplitDepthTexelCount(plan);
690
+ if (splitDepthTexelCount > MAX_FULL_FLOAT_SPLIT_DEPTH_TEXELS) {
691
+ return `full-float-split-budget-exceeded:${splitDepthTexelCount}:limit:${MAX_FULL_FLOAT_SPLIT_DEPTH_TEXELS}`;
692
+ }
693
+ return null;
694
+ }
695
+ function readSplitSourceResolutionMismatch(plan) {
696
+ const maps = plan.generator.maps;
697
+ if (maps.staticResolution < maps.compositeResolution) {
698
+ return `split-source-resolution-below-composite:static:${maps.staticResolution}:composite:${maps.compositeResolution}`;
699
+ }
700
+ if (maps.dynamicResolution < maps.compositeResolution) {
701
+ return `split-source-resolution-below-composite:dynamic:${maps.dynamicResolution}:composite:${maps.compositeResolution}`;
702
+ }
703
+ return null;
704
+ }
705
+ function readFullFloatSplitDepthTexelCount(plan) {
706
+ const maps = plan.generator.maps;
707
+ return maps.staticResolution ** 2
708
+ + maps.dynamicResolution ** 2
709
+ + maps.compositeResolution ** 2;
710
+ }
711
+ function fallbackOrThrow(light, plan, reason, gpuCapability) {
712
+ if (plan.generator.backend.fallback === 'disable') {
713
+ throw new Error(`shadowMapExperiment.splitBackendUnavailable:${reason}`);
714
+ }
715
+ assertSingleBackendSupported(plan, gpuCapability);
716
+ return createSingleBackend(light, plan, reason, gpuCapability);
717
+ }
718
+ function assertSingleBackendSupported(plan, gpuCapability) {
719
+ const resolution = plan.generator.maps.compositeResolution;
720
+ if (resolution > gpuCapability.maxRenderTextureSize) {
721
+ throw new Error(`shadowMapExperiment.singleBackendUnavailable:insufficient-max-render-texture-size:${gpuCapability.maxRenderTextureSize}:required:${resolution}`);
722
+ }
723
+ }
724
+ function layerEvidence(resolution, candidateMeshCount, retainedMeshCount, refreshCount, renderCount, lastRefreshReasons) {
725
+ return Object.freeze({
726
+ resolution,
727
+ candidateMeshCount,
728
+ retainedMeshCount,
729
+ culledMeshCount: Math.max(0, candidateMeshCount - retainedMeshCount),
730
+ renderListCount: retainedMeshCount,
731
+ refreshCount,
732
+ renderCount,
733
+ lastRefreshReasons,
734
+ });
735
+ }
736
+ function trackDisposable(resources, resource) {
737
+ resources.push({ resource, disposed: false });
738
+ return resource;
739
+ }
740
+ function disposeTrackedReverse(resources) {
741
+ const errors = [];
742
+ for (const owner of [...resources].reverse()) {
743
+ if (owner.disposed)
744
+ continue;
745
+ try {
746
+ owner.resource.dispose();
747
+ owner.disposed = true;
748
+ }
749
+ catch (error) {
750
+ errors.push(error);
751
+ }
752
+ }
753
+ if (errors.length > 0) {
754
+ throw Object.assign(new Error('shadowMapExperiment.depthBackendDisposeFailed'), { cleanupErrors: errors });
755
+ }
756
+ }
757
+ function snapshotShadowGenerators(light) {
758
+ return new Set(light.getShadowGenerators()?.values() ?? []);
759
+ }
760
+ function cleanupFailedGeneratorAllocation(light, existingGenerators, resources, leakedGenerators, scene, existingSceneMeshes, leakedFacadeSentinels, existingSceneCameras, leakedHelperCameras) {
761
+ const errors = [];
762
+ const trackedResources = new Set(resources.map(owner => owner.resource));
763
+ for (const generator of light.getShadowGenerators()?.values() ?? []) {
764
+ if (!existingGenerators.has(generator) && !trackedResources.has(generator)) {
765
+ leakedGenerators.add(generator);
766
+ }
767
+ }
768
+ if (scene && existingSceneCameras && leakedHelperCameras) {
769
+ for (const camera of scene.cameras) {
770
+ const helperName = camera.name === '__fps_shadow_static_camera__'
771
+ || camera.name === '__fps_shadow_dynamic_camera__';
772
+ if (helperName && !existingSceneCameras.has(camera) && !trackedResources.has(camera)) {
773
+ leakedHelperCameras.add(camera);
774
+ }
775
+ }
776
+ }
777
+ for (const generator of [...leakedGenerators].reverse()) {
778
+ try {
779
+ generator.dispose();
780
+ leakedGenerators.delete(generator);
781
+ }
782
+ catch (error) {
783
+ errors.push(error);
784
+ }
785
+ }
786
+ try {
787
+ disposeTrackedReverse(resources);
788
+ }
789
+ catch (error) {
790
+ errors.push(error);
791
+ }
792
+ if (scene && existingSceneMeshes && leakedFacadeSentinels) {
793
+ for (const mesh of scene.meshes) {
794
+ if (mesh.name === '__fps_shadow_facade_eligibility__'
795
+ && !existingSceneMeshes.has(mesh)
796
+ && !trackedResources.has(mesh)) {
797
+ leakedFacadeSentinels.add(mesh);
798
+ }
799
+ }
800
+ for (const mesh of [...leakedFacadeSentinels]) {
801
+ try {
802
+ mesh.dispose();
803
+ leakedFacadeSentinels.delete(mesh);
804
+ }
805
+ catch (error) {
806
+ errors.push(error);
807
+ }
808
+ }
809
+ }
810
+ if (scene && leakedHelperCameras) {
811
+ for (const camera of [...leakedHelperCameras]) {
812
+ let removed = false;
813
+ try {
814
+ scene.removeCamera(camera);
815
+ removed = true;
816
+ }
817
+ catch (error) {
818
+ errors.push(error);
819
+ }
820
+ if (!removed)
821
+ continue;
822
+ try {
823
+ Camera.prototype.dispose.call(camera);
824
+ leakedHelperCameras.delete(camera);
825
+ }
826
+ catch (error) {
827
+ errors.push(error);
828
+ }
829
+ }
830
+ }
831
+ return Object.freeze(errors);
832
+ }
833
+ function errorMessage(error) {
834
+ return error instanceof Error ? error.message : String(error);
835
+ }
836
+ function attachAllocationCleanup(error, retryCleanup, cleanupErrors) {
837
+ const metadata = {
838
+ cleanupErrors: Object.freeze([...cleanupErrors]),
839
+ shadowMapExperimentAllocationCleanup: retryCleanup,
840
+ };
841
+ if (error && typeof error === 'object' && Object.isExtensible(error)) {
842
+ Object.assign(error, metadata);
843
+ return error;
844
+ }
845
+ return Object.assign(new Error(errorMessage(error)), { cause: error }, metadata);
846
+ }
847
+ //# sourceMappingURL=shadow-map-experiment-depth-backend.js.map