@forgeax/engine-render 0.1.32 → 0.1.33

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 (250) hide show
  1. package/README.md +379 -33
  2. package/dist/assembly/analytic-fog-registration.d.ts +3 -0
  3. package/dist/assembly/analytic-fog-registration.d.ts.map +1 -0
  4. package/dist/assembly/fxaa-registration.d.ts +4 -0
  5. package/dist/assembly/fxaa-registration.d.ts.map +1 -0
  6. package/dist/assembly/lod-observation.d.ts +4 -0
  7. package/dist/assembly/lod-observation.d.ts.map +1 -0
  8. package/dist/assembly/motion-blur-registration.d.ts +3 -0
  9. package/dist/assembly/motion-blur-registration.d.ts.map +1 -0
  10. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  11. package/dist/assembly/temporal-post-process-prewarm.d.ts +13 -0
  12. package/dist/assembly/temporal-post-process-prewarm.d.ts.map +1 -0
  13. package/dist/assembly/webgpu-ready-contract.d.ts +4 -3
  14. package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -1
  15. package/dist/assembly/webgpu-ready.d.ts +1 -1
  16. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  17. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  18. package/dist/bloom-admission.d.ts +13 -0
  19. package/dist/bloom-admission.d.ts.map +1 -0
  20. package/dist/{chunk-DRR7D3KX.mjs → chunk-3RTCJTH4.mjs} +12 -9
  21. package/dist/chunk-3RTCJTH4.mjs.map +1 -0
  22. package/dist/{chunk-S665NJNF.mjs → chunk-LEAXOMYJ.mjs} +3 -3
  23. package/dist/{chunk-S665NJNF.mjs.map → chunk-LEAXOMYJ.mjs.map} +1 -1
  24. package/dist/{chunk-6TFBXLRJ.mjs → chunk-NB2S7ZRX.mjs} +155 -11
  25. package/dist/chunk-NB2S7ZRX.mjs.map +1 -0
  26. package/dist/{chunk-LULCA3OF.mjs → chunk-NNQL7CB3.mjs} +4 -4
  27. package/dist/{chunk-LULCA3OF.mjs.map → chunk-NNQL7CB3.mjs.map} +1 -1
  28. package/dist/{chunk-4NNZQCL3.mjs → chunk-OO3DRYK7.mjs} +66 -200
  29. package/dist/chunk-OO3DRYK7.mjs.map +1 -0
  30. package/dist/{chunk-GWCEMDVR.mjs → chunk-PLAXOOX5.mjs} +232 -7
  31. package/dist/chunk-PLAXOOX5.mjs.map +1 -0
  32. package/dist/{chunk-JRIPCMYC.mjs → chunk-VOZWDM3L.mjs} +283 -193
  33. package/dist/chunk-VOZWDM3L.mjs.map +1 -0
  34. package/dist/{chunk-JCIRYQ4V.mjs → chunk-ZDQWGQW7.mjs} +10 -4
  35. package/dist/chunk-ZDQWGQW7.mjs.map +1 -0
  36. package/dist/components/atmosphere.d.ts +2 -0
  37. package/dist/components/atmosphere.d.ts.map +1 -1
  38. package/dist/components/camera.d.ts +20 -4
  39. package/dist/components/camera.d.ts.map +1 -1
  40. package/dist/components/mesh-filter.d.ts +6 -5
  41. package/dist/components/mesh-filter.d.ts.map +1 -1
  42. package/dist/components/motion-blur.d.ts +1 -0
  43. package/dist/components/motion-blur.d.ts.map +1 -1
  44. package/dist/construct-renderer.mjs +2865 -526
  45. package/dist/construct-renderer.mjs.map +1 -1
  46. package/dist/device/gpu-residency.d.ts +6 -0
  47. package/dist/device/gpu-residency.d.ts.map +1 -1
  48. package/dist/environment/analytic-fog.d.ts +6 -0
  49. package/dist/environment/analytic-fog.d.ts.map +1 -0
  50. package/dist/errors/render.d.ts +6 -2
  51. package/dist/errors/render.d.ts.map +1 -1
  52. package/dist/extract/camera.d.ts.map +1 -1
  53. package/dist/extract/contracts.d.ts +7 -0
  54. package/dist/extract/contracts.d.ts.map +1 -1
  55. package/dist/extract/environment.d.ts +2 -0
  56. package/dist/extract/environment.d.ts.map +1 -1
  57. package/dist/features/error-reporting.d.ts +13 -0
  58. package/dist/features/error-reporting.d.ts.map +1 -0
  59. package/dist/features/host.d.ts +5 -0
  60. package/dist/features/host.d.ts.map +1 -1
  61. package/dist/features/motion-blur/motion-blur-feature.d.ts +20 -2
  62. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -1
  63. package/dist/features/motion-blur/motion-blur-params.d.ts +21 -0
  64. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -1
  65. package/dist/features/motion-blur/motion-blur-runtime.d.ts +54 -0
  66. package/dist/features/motion-blur/motion-blur-runtime.d.ts.map +1 -0
  67. package/dist/features/plan.d.ts +7 -4
  68. package/dist/features/plan.d.ts.map +1 -1
  69. package/dist/features/prepared-gpu-work.d.ts +9 -5
  70. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  71. package/dist/features/render-graph-compute.d.ts.map +1 -1
  72. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  73. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
  74. package/dist/gpu-driven/prepared-draw.d.ts +7 -0
  75. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  76. package/dist/gpu-driven/production-raster.d.ts +3 -1
  77. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  78. package/dist/gpu-driven/view-gpu.d.ts +9 -0
  79. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  80. package/dist/gpu-scene.d.ts +6 -1
  81. package/dist/gpu-scene.d.ts.map +1 -1
  82. package/dist/index.d.ts +5 -2
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.mjs +5 -5
  85. package/dist/inspection-types.d.ts +43 -2
  86. package/dist/inspection-types.d.ts.map +1 -1
  87. package/dist/instances.d.ts +8 -1
  88. package/dist/instances.d.ts.map +1 -1
  89. package/dist/internal.mjs +6 -6
  90. package/dist/pipeline/standard-post.d.ts +28 -19
  91. package/dist/pipeline/standard-post.d.ts.map +1 -1
  92. package/dist/pipeline-spec.d.ts +2 -2
  93. package/dist/record/frame-snapshot.d.ts +3 -0
  94. package/dist/record/frame-snapshot.d.ts.map +1 -1
  95. package/dist/record/frame-targets.d.ts.map +1 -1
  96. package/dist/record/frame.d.ts +5 -2
  97. package/dist/record/frame.d.ts.map +1 -1
  98. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  99. package/dist/record/mesh-ssbo.d.ts +6 -5
  100. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  101. package/dist/record/render-context.d.ts +12 -28
  102. package/dist/record/render-context.d.ts.map +1 -1
  103. package/dist/record/shadow-pass.d.ts.map +1 -1
  104. package/dist/record/skybox-post-pass.d.ts +5 -3
  105. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  106. package/dist/record/typed-frame-graph.d.ts +1 -1
  107. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  108. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  109. package/dist/render-contract.d.ts +24 -4
  110. package/dist/render-contract.d.ts.map +1 -1
  111. package/dist/render-pipeline.d.ts +3 -1
  112. package/dist/render-pipeline.d.ts.map +1 -1
  113. package/dist/render-system-extract-tail.d.ts.map +1 -1
  114. package/dist/render-system-extract.d.ts +8 -1
  115. package/dist/render-system-extract.d.ts.map +1 -1
  116. package/dist/render-system.d.ts +7 -1
  117. package/dist/render-system.d.ts.map +1 -1
  118. package/dist/scene/render-scene.d.ts +2 -0
  119. package/dist/scene/render-scene.d.ts.map +1 -1
  120. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  121. package/dist/temporal/frame.d.ts +7 -0
  122. package/dist/temporal/frame.d.ts.map +1 -1
  123. package/dist/temporal/index.mjs +5 -5
  124. package/dist/temporal/view.d.ts +6 -1
  125. package/dist/temporal/view.d.ts.map +1 -1
  126. package/dist/typed-render-graph-primitives.d.ts +10 -7
  127. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  128. package/dist/volume/component.d.ts +0 -1
  129. package/dist/volume/component.d.ts.map +1 -1
  130. package/dist/volume/passes.d.ts.map +1 -1
  131. package/dist/volume/temporal.d.ts +3 -1
  132. package/dist/volume/temporal.d.ts.map +1 -1
  133. package/package.json +21 -21
  134. package/src/__tests__/analytic-fog-graph.unit.test.ts +199 -0
  135. package/src/__tests__/analytic-fog-optics.unit.test.ts +38 -0
  136. package/src/__tests__/bloom-exact-zero.unit.test.ts +112 -18
  137. package/src/__tests__/bloom-lifecycle.integration.test.ts +17 -4
  138. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +20 -0
  139. package/src/__tests__/environment-fog-lanes.integration.test.ts +14 -0
  140. package/src/__tests__/environment-selection.unit.test.ts +12 -0
  141. package/src/__tests__/factory-contract.integration.test.ts +331 -68
  142. package/src/__tests__/frame-camera-selection.unit.test.ts +39 -1
  143. package/src/__tests__/frame-plan-contract.unit.test.ts +2 -0
  144. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +2 -1
  145. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +1 -1
  146. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +1 -1
  147. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +11 -0
  148. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +12 -0
  149. package/src/__tests__/gpu-scene.unit.test.ts +91 -0
  150. package/src/__tests__/instances-store.unit.test.ts +75 -0
  151. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +31 -0
  152. package/src/__tests__/motion-blur-compute.dawn.test.ts +583 -0
  153. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +21 -0
  154. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +86 -0
  155. package/src/__tests__/public-surface.test-d.ts +8 -0
  156. package/src/__tests__/render-error-code-owner.test-d.ts +2 -0
  157. package/src/__tests__/render-feature-error-reporting.unit.test.ts +24 -0
  158. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +23 -0
  159. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +31 -0
  160. package/src/__tests__/renderer-frame-transaction.integration.test.ts +7 -1
  161. package/src/__tests__/shader-manifest-fixture.ts +4 -4
  162. package/src/__tests__/skinned-shadow-caster.test.ts +2 -0
  163. package/src/__tests__/standard-lighting-write.unit.test.ts +2 -1
  164. package/src/__tests__/standard-pipeline.dawn.test.ts +1 -1
  165. package/src/__tests__/standard-pipeline.integration.test.ts +18 -8
  166. package/src/__tests__/temporal-reset-matrix.unit.test.ts +10 -0
  167. package/src/__tests__/temporal-view.unit.test.ts +2 -1
  168. package/src/__tests__/typed-pipeline-topology.unit.test.ts +20 -4
  169. package/src/__tests__/volume-optics-oracle.unit.test.ts +3 -1
  170. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +177 -13
  171. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +447 -61
  172. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +27 -0
  173. package/src/__tests__/volumetric-fog-topology.unit.test.ts +19 -3
  174. package/src/assembly/analytic-fog-registration.ts +14 -0
  175. package/src/assembly/fxaa-registration.ts +17 -0
  176. package/src/assembly/lod-observation.ts +12 -0
  177. package/src/assembly/motion-blur-registration.ts +17 -0
  178. package/src/assembly/renderer-facade.ts +2 -0
  179. package/src/assembly/temporal-post-process-prewarm.ts +40 -0
  180. package/src/assembly/webgpu-ready-contract.ts +8 -3
  181. package/src/assembly/webgpu-ready.ts +181 -245
  182. package/src/assembly/webgpu-renderer.ts +16 -31
  183. package/src/bloom-admission.ts +21 -0
  184. package/src/components/__tests__/motion-blur.unit.test.ts +1 -0
  185. package/src/components/atmosphere.ts +4 -0
  186. package/src/components/camera.ts +66 -10
  187. package/src/components/mesh-filter.ts +11 -9
  188. package/src/components/motion-blur.ts +1 -0
  189. package/src/device/gpu-residency.ts +56 -12
  190. package/src/environment/analytic-fog.ts +44 -0
  191. package/src/environment/background.ts +2 -2
  192. package/src/errors/render.ts +14 -1
  193. package/src/extract/camera.ts +20 -7
  194. package/src/extract/contracts.ts +7 -0
  195. package/src/extract/environment.ts +4 -0
  196. package/src/features/error-reporting.ts +78 -0
  197. package/src/features/host.ts +25 -12
  198. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +111 -1
  199. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +58 -3
  200. package/src/features/motion-blur/motion-blur-feature.ts +1519 -15
  201. package/src/features/motion-blur/motion-blur-params.ts +70 -2
  202. package/src/features/motion-blur/motion-blur-runtime.ts +176 -0
  203. package/src/features/plan.ts +25 -8
  204. package/src/features/prepared-gpu-work.ts +86 -35
  205. package/src/features/render-graph-compute.ts +13 -5
  206. package/src/features/render-graph-contribution.ts +2 -0
  207. package/src/gpu-driven/material-artifacts.ts +2 -7
  208. package/src/gpu-driven/prepared-draw.ts +15 -10
  209. package/src/gpu-driven/production-raster.ts +83 -7
  210. package/src/gpu-driven/view-gpu.ts +17 -0
  211. package/src/gpu-scene.ts +188 -21
  212. package/src/index.ts +32 -0
  213. package/src/inspection-types.ts +60 -2
  214. package/src/instances.ts +80 -1
  215. package/src/pipeline/standard-post.ts +307 -78
  216. package/src/pipeline-spec.ts +5 -5
  217. package/src/points-lines/__tests__/view-ubo.unit.test.ts +2 -1
  218. package/src/record/__tests__/temporal-payload.unit.test.ts +2 -1
  219. package/src/record/frame-snapshot.ts +5 -1
  220. package/src/record/frame-targets.ts +10 -6
  221. package/src/record/frame.ts +163 -22
  222. package/src/record/main-pass-geometry.ts +30 -1
  223. package/src/record/main-pass-sprite-draws.ts +6 -1
  224. package/src/record/mesh-ssbo.ts +43 -6
  225. package/src/record/render-context.ts +12 -28
  226. package/src/record/shadow-pass.ts +6 -1
  227. package/src/record/skybox-post-pass.ts +122 -196
  228. package/src/record/typed-frame-graph.ts +153 -9
  229. package/src/recovery/render-system-candidate.ts +22 -10
  230. package/src/render-contract.ts +23 -4
  231. package/src/render-pipeline.ts +6 -1
  232. package/src/render-system-extract-tail.ts +16 -0
  233. package/src/render-system-extract.ts +45 -13
  234. package/src/render-system.ts +255 -120
  235. package/src/scene/render-scene.ts +85 -4
  236. package/src/temporal/__tests__/temporal-frame-transaction.unit.test.ts +36 -0
  237. package/src/temporal/frame-coordinator.ts +8 -1
  238. package/src/temporal/frame.ts +20 -0
  239. package/src/temporal/view.ts +13 -2
  240. package/src/typed-render-graph-primitives.ts +121 -48
  241. package/src/volume/component.ts +0 -1
  242. package/src/volume/passes.ts +8 -4
  243. package/src/volume/resources.ts +1 -1
  244. package/src/volume/temporal.ts +11 -0
  245. package/dist/chunk-4NNZQCL3.mjs.map +0 -1
  246. package/dist/chunk-6TFBXLRJ.mjs.map +0 -1
  247. package/dist/chunk-DRR7D3KX.mjs.map +0 -1
  248. package/dist/chunk-GWCEMDVR.mjs.map +0 -1
  249. package/dist/chunk-JCIRYQ4V.mjs.map +0 -1
  250. package/dist/chunk-JRIPCMYC.mjs.map +0 -1
@@ -1,11 +1,12 @@
1
1
  import { GlyphText } from './chunk-ILQ5MEZF.mjs';
2
- import { MeshRenderer, MeshFilter, DirectionalLight, validateDirectionalLightData, PointLight, computeInvRangeSquared, SpotLight, degToCos, RectAreaLight, validateRectAreaLightData, directionalShadowQualityFromF32, PointLightShadow, Skylight, LightProbe, validateLightProbeData, SkyboxBackground, Atmosphere, Instances, Layer, Points, Lines, SortKey, resolveMeshMaterialBindings, pointShapeFromU32, PostProcessParams, buildCubeCameraFaceViews, CubeCamera, cubeCameraUpdateIntentFromF32, ReflectionProbe, reflectionProbeUpdateIntentFromF32, tonemapToU32, resolveVisibility, Fog, VolumetricFog, resolveSelectedVolumetricLight, extractVolumetricFog, MotionBlur, DynamicResolution, ScreenSpaceReflection, DepthOfField, Camera, cameraProjectionFromF32, resolveDepthOfFieldParams, depthOfFieldRequestFailure, CAMERA_EXPOSURE_MODE_MANUAL, cameraExposureFromColumns, antialiasFromF32, validateDynamicResolutionCamera, bloomEnabledFromF32, tonemapFromF32 } from './chunk-GWCEMDVR.mjs';
2
+ import { MeshRenderer, MeshFilter, DirectionalLight, validateDirectionalLightData, PointLight, computeInvRangeSquared, SpotLight, degToCos, RectAreaLight, validateRectAreaLightData, directionalShadowQualityFromF32, PointLightShadow, Skylight, LightProbe, validateLightProbeData, SkyboxBackground, Atmosphere, selectEnvironment, Instances, Layer, Points, Lines, SortKey, resolveMeshMaterialBindings, pointShapeFromU32, PostProcessParams, buildCubeCameraFaceViews, CubeCamera, cubeCameraUpdateIntentFromF32, ReflectionProbe, reflectionProbeUpdateIntentFromF32, tonemapToU32, resolveVisibility, Fog, VolumetricFog, resolveSelectedVolumetricLight, extractVolumetricFog, MotionBlur, DynamicResolution, ScreenSpaceReflection, DepthOfField, Camera, cameraProjectionFromF32, resolveDepthOfFieldParams, depthOfFieldRequestFailure, CAMERA_EXPOSURE_MODE_MANUAL, cameraExposureFromColumns, antialiasFromF32, validateDynamicResolutionCamera, validateCameraBloom, tonemapFromF32 } from './chunk-PLAXOOX5.mjs';
3
3
  import { SpriteRegionOverride, SpriteInstances, selectActiveCameraIndex, getActiveCamera } from './chunk-PA5DRJNI.mjs';
4
- import { PROBE_BLEND_RECORD_CAPACITY, GPU_BUFFER_USAGE_MAP_READ, GPU_BUFFER_USAGE_VERTEX, GPU_BUFFER_USAGE_COPY_DST, gpuDrivenShadowDrawKey, IES_SLICE_CAPACITY, COOKIE_SLICE_CAPACITY, isStandardPbrSkinMaterialShader, buildGpuDrivenDraws, worldEntityKey, gpuDrivenSourceDrawItemIndex, selectPasses, resolveRenderTargetMaterialSource, isCanonicalStandardPbrMaterialShader, PROBE_BLEND_RECORD_BYTE_SIZE, GPU_BUFFER_USAGE_UNIFORM, GPU_BUFFER_USAGE_QUERY_RESOLVE, GPU_BUFFER_USAGE_COPY_SRC, COOKIE_SLICE_SIZE, isStandardPbrMaterialShader } from './chunk-DRR7D3KX.mjs';
5
- import { STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, SHADOW_ATLAS_DEFAULT_LAYERS, MaterialSkinAttrMissingError, SkinMaterialMismatchError, InstanceCollectionError, ShadowInvalidConfigError, EnvironmentSourceConflictError, FogCardinalityError, GPU_TEXTURE_USAGE_COPY_SRC, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_TEXTURE_BINDING, GPU_TEXTURE_USAGE_STORAGE_BINDING, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT, AtmosphereInvalidParameterError } from './chunk-6TFBXLRJ.mjs';
4
+ import { PROBE_BLEND_RECORD_CAPACITY, GPU_BUFFER_USAGE_MAP_READ, GPU_BUFFER_USAGE_VERTEX, GPU_BUFFER_USAGE_COPY_DST, gpuDrivenShadowDrawKey, IES_SLICE_CAPACITY, COOKIE_SLICE_CAPACITY, isStandardPbrSkinMaterialShader, buildGpuDrivenDraws, worldEntityKey, gpuDrivenSourceDrawItemIndex, selectPasses, resolveRenderTargetMaterialSource, isCanonicalStandardPbrMaterialShader, PROBE_BLEND_RECORD_BYTE_SIZE, GPU_BUFFER_USAGE_UNIFORM, GPU_BUFFER_USAGE_QUERY_RESOLVE, GPU_BUFFER_USAGE_COPY_SRC, COOKIE_SLICE_SIZE, isStandardPbrMaterialShader } from './chunk-3RTCJTH4.mjs';
5
+ import { MotionBlurValidationError, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, SHADOW_ATLAS_DEFAULT_LAYERS, MaterialSkinAttrMissingError, SkinMaterialMismatchError, InstanceCollectionError, ShadowInvalidConfigError, resolveMotionBlurParams, GPU_TEXTURE_USAGE_COPY_SRC, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_TEXTURE_BINDING, GPU_TEXTURE_USAGE_STORAGE_BINDING, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT } from './chunk-NB2S7ZRX.mjs';
6
6
  import { R_MIN, ok, err, TextError, toShared, handleSlot, AssetError, ASSET_ERROR_HINTS, materialValuesToLinearRuntime, derive, unpackSlot, materialGuidText } from '@forgeax/engine-types';
7
7
  import { err as err$1, ok as ok$1, RhiError } from '@forgeax/engine-rhi';
8
8
  import { resolveAssetHandle, walkMaterialPassesOverSharedRefs, selectMaterialPassProgram, materialParametersToParamSchema as materialParametersToParamSchema$1 } from '@forgeax/engine-assets-runtime';
9
+ import { Time } from '@forgeax/engine-ecs';
9
10
  import { SpawnLightInvalidBoundsError, routeWorldError, SpriteInstancesMutuallyExclusiveWithInstancesError, SpriteInstancesRequiresSpriteShaderError, SpriteInstancesCountMismatchError, readRenderArrayView } from '@forgeax/engine-ecs/projection';
10
11
  import { vec3, mat4, frustum, box3 } from '@forgeax/engine-math';
11
12
  import { AssetGuid } from '@forgeax/engine-pack/guid';
@@ -183,6 +184,24 @@ function projectLightInspection(input) {
183
184
  function lightInspectionIdentity(topology, generation) {
184
185
  return `${topology}:generation-${generation}`;
185
186
  }
187
+ var emptyBloomInspection = () => ({
188
+ graphStatus: "empty",
189
+ enabled: false,
190
+ levelCount: 0,
191
+ levelDimensions: [],
192
+ downsamplePassCount: 0,
193
+ upsamplePassCount: 0,
194
+ targetCount: 0,
195
+ targetBytes: 0,
196
+ resourceCount: 0,
197
+ passCount: 0,
198
+ encodeCount: 0,
199
+ bindGroupCount: 0,
200
+ uploadCount: 0,
201
+ residentChildBytes: 0,
202
+ generation: 0,
203
+ state: "off"
204
+ });
186
205
 
187
206
  // src/prepare/extended-lighting/state.ts
188
207
  function createExtendedLightingState(generation) {
@@ -938,8 +957,8 @@ var OcclusionRenderRuntime = class {
938
957
  if (this.queryLatencySamplesUs.length === 0) {
939
958
  return { median: 0, p95: 0, last: this.lastQueryLatencyUs };
940
959
  }
941
- const sorted2 = [...this.queryLatencySamplesUs].sort((left, right) => left - right);
942
- const rank = (percentile) => sorted2[Math.max(0, Math.ceil(sorted2.length * percentile) - 1)] ?? 0;
960
+ const sorted = [...this.queryLatencySamplesUs].sort((left, right) => left - right);
961
+ const rank = (percentile) => sorted[Math.max(0, Math.ceil(sorted.length * percentile) - 1)] ?? 0;
943
962
  return {
944
963
  median: rank(0.5),
945
964
  p95: rank(0.95),
@@ -1224,181 +1243,6 @@ function runtimeError(hint) {
1224
1243
  });
1225
1244
  }
1226
1245
 
1227
- // src/environment/signature.ts
1228
- function sorted(items) {
1229
- return [...items].sort((left, right) => left.entityKey - right.entityKey);
1230
- }
1231
- function environmentSignature(input) {
1232
- return JSON.stringify({
1233
- environments: sorted(input.environments),
1234
- fogs: sorted(input.fogs),
1235
- suns: sorted(input.suns)
1236
- });
1237
- }
1238
- function environmentOnlySignature(input) {
1239
- return JSON.stringify({
1240
- environments: sorted(input.environments),
1241
- suns: sorted(input.suns)
1242
- });
1243
- }
1244
- function fogOnlySignature(input) {
1245
- return JSON.stringify({ fogs: sorted(input.fogs) });
1246
- }
1247
- function environmentFactSignatures(input) {
1248
- return {
1249
- environmentSignature: environmentOnlySignature(input),
1250
- fogSignature: fogOnlySignature(input),
1251
- signature: environmentSignature(input)
1252
- };
1253
- }
1254
-
1255
- // src/extract/environment.ts
1256
- var ATMOSPHERE_PARAMETER_RANGES = Object.freeze({
1257
- turbidity: Object.freeze({ min: 1, max: 20 }),
1258
- rayleigh: Object.freeze({ min: 0, max: Number.POSITIVE_INFINITY }),
1259
- mieCoefficient: Object.freeze({ min: 0, max: Number.POSITIVE_INFINITY }),
1260
- mieDirectionalG: Object.freeze({ min: 0, max: 0.999 }),
1261
- sunAngularRadius: Object.freeze({ min: 0, max: Number.POSITIVE_INFINITY })
1262
- });
1263
- function validateFogParameters(candidate) {
1264
- if (candidate.color.length !== 3) {
1265
- return {
1266
- field: "color",
1267
- value: candidate.color.length,
1268
- expected: "exactly three finite channels in [0, 1]"
1269
- };
1270
- }
1271
- for (let index = 0; index < candidate.color.length; index += 1) {
1272
- const value = candidate.color[index];
1273
- if (value === void 0 || !Number.isFinite(value) || value < 0 || value > 1) {
1274
- return {
1275
- field: `color[${index}]`,
1276
- value: value ?? Number.NaN,
1277
- expected: "a finite number in [0, 1]"
1278
- };
1279
- }
1280
- }
1281
- if (!Number.isFinite(candidate.density) || candidate.density < 0) {
1282
- return { field: "density", value: candidate.density, expected: "a finite number >= 0" };
1283
- }
1284
- if (!Number.isFinite(candidate.heightFalloff) || candidate.heightFalloff < 0) {
1285
- return {
1286
- field: "heightFalloff",
1287
- value: candidate.heightFalloff,
1288
- expected: "a finite number >= 0"
1289
- };
1290
- }
1291
- if (!Number.isFinite(candidate.maxOpacity) || candidate.maxOpacity < 0 || candidate.maxOpacity > 1) {
1292
- return {
1293
- field: "maxOpacity",
1294
- value: candidate.maxOpacity,
1295
- expected: "a finite number in [0, 1]"
1296
- };
1297
- }
1298
- return void 0;
1299
- }
1300
- function validateAtmosphereParameters(parameters) {
1301
- for (const field of Object.keys(ATMOSPHERE_PARAMETER_RANGES)) {
1302
- const value = parameters[field];
1303
- const range = ATMOSPHERE_PARAMETER_RANGES[field];
1304
- if (!Number.isFinite(value) || value < range.min || value > range.max) {
1305
- return new AtmosphereInvalidParameterError(field, value, range);
1306
- }
1307
- }
1308
- return void 0;
1309
- }
1310
-
1311
- // src/environment/frame.ts
1312
- var SKYLIGHT_RECOVERY_FALLBACK = Object.freeze({
1313
- kind: "skylight",
1314
- active: false
1315
- });
1316
- var EnvironmentSelectionParameterError = class extends Error {
1317
- code = "environment-selection-invalid";
1318
- expected;
1319
- hint;
1320
- detail;
1321
- constructor(field, value, expected) {
1322
- super(`environment selection field ${field} is invalid`);
1323
- this.name = "EnvironmentSelectionParameterError";
1324
- this.expected = expected;
1325
- this.hint = `set ${field} to a finite value satisfying ${expected}`;
1326
- this.detail = { field, value };
1327
- }
1328
- };
1329
- var SunCardinalityError = class extends Error {
1330
- code = "sun-cardinality";
1331
- expected = "atmosphere has exactly one sun owner";
1332
- hint = "add exactly one DirectionalLight sun for the atmosphere owner";
1333
- detail;
1334
- constructor(value) {
1335
- super(`atmosphere sun cardinality is ${value}`);
1336
- this.name = "SunCardinalityError";
1337
- this.detail = { field: "sun", value };
1338
- }
1339
- };
1340
- function freezeCandidate(candidate) {
1341
- return Object.freeze(candidate);
1342
- }
1343
- function freezeFog(candidate) {
1344
- return Object.freeze({
1345
- ...candidate,
1346
- color: Object.freeze([...candidate.color])
1347
- });
1348
- }
1349
- function selectEnvironment(input) {
1350
- if (input.environments.length > 1) {
1351
- return err(
1352
- new EnvironmentSourceConflictError(
1353
- [...input.environments].sort((left, right) => left.entityKey - right.entityKey).map(({ kind, entityKey, sourceKey }) => ({ kind, entityKey, sourceKey }))
1354
- )
1355
- );
1356
- }
1357
- if (input.fogs.length > 1) return err(new FogCardinalityError(input.fogs.length));
1358
- const selectedFog = input.fogs[0];
1359
- if (selectedFog !== void 0) {
1360
- const issue = validateFogParameters(selectedFog);
1361
- if (issue !== void 0) {
1362
- return err(new EnvironmentSelectionParameterError(issue.field, issue.value, issue.expected));
1363
- }
1364
- }
1365
- const selected = input.environments[0];
1366
- if (selected?.kind === "atmosphere") {
1367
- const invalid = validateAtmosphereParameters(selected.atmosphere);
1368
- if (invalid !== void 0) return err(invalid);
1369
- }
1370
- if (selected?.kind === "atmosphere" && input.suns.length !== 1) {
1371
- return err(new SunCardinalityError(input.suns.length));
1372
- }
1373
- const source = selected === void 0 ? { kind: "none" } : selected.kind === "atmosphere" ? {
1374
- kind: "atmosphere",
1375
- entityKey: selected.entityKey,
1376
- sourceKey: selected.sourceKey,
1377
- atmosphere: Object.freeze({ ...selected.atmosphere })
1378
- } : {
1379
- kind: "image",
1380
- entityKey: selected.entityKey,
1381
- sourceKey: selected.sourceKey
1382
- };
1383
- const sun = input.suns[0] === void 0 ? void 0 : freezeCandidate({ ...input.suns[0] });
1384
- const fog = selectedFog === void 0 ? void 0 : freezeFog(selectedFog);
1385
- const signatureInput = {
1386
- environments: selected === void 0 ? [] : [selected],
1387
- fogs: selectedFog === void 0 ? [] : [selectedFog],
1388
- suns: input.suns
1389
- };
1390
- const signatures = environmentFactSignatures(signatureInput);
1391
- const result = {
1392
- source: Object.freeze(source),
1393
- fog,
1394
- ...signatures,
1395
- revision: 0,
1396
- sun
1397
- };
1398
- Object.defineProperty(result, "lane", { value: input.lane, enumerable: false });
1399
- return ok(Object.freeze(result));
1400
- }
1401
-
1402
1246
  // src/extract/directional-shadow-projection.ts
1403
1247
  function projectDirectionalShadow(fits, mapSize, shadowFilter, shadowAngularRadius, maxPenumbraTexels) {
1404
1248
  if (!Number.isFinite(mapSize) || mapSize < 1) return void 0;
@@ -2054,9 +1898,10 @@ function extractFrames(worlds, owner, assets, pipelineState, materialSnapshotCac
2054
1898
  });
2055
1899
  const frame = extractFrame(world, prepared);
2056
1900
  framesByWorld.set(wi, frame);
2057
- } catch (err8) {
1901
+ } catch (err6) {
1902
+ if (err6 instanceof MotionBlurValidationError) throw err6;
2058
1903
  try {
2059
- createWorldInternalView(world)._routeError(err8, {
1904
+ createWorldInternalView(world)._routeError(err6, {
2060
1905
  severity: Severity.Error,
2061
1906
  systemName: `RenderSystem.extractFrames(world[${wi}])`
2062
1907
  });
@@ -2927,7 +2772,9 @@ function extractFrame(world, context) {
2927
2772
  rayleigh: value.rayleigh,
2928
2773
  mieCoefficient: value.mieCoefficient,
2929
2774
  mieDirectionalG: value.mieDirectionalG,
2930
- sunAngularRadius: value.sunAngularRadius
2775
+ sunAngularRadius: value.sunAngularRadius,
2776
+ circumsolarStrength: value.circumsolarStrength,
2777
+ circumsolarWidth: value.circumsolarWidth
2931
2778
  };
2932
2779
  environmentCandidates.push({
2933
2780
  kind: "atmosphere",
@@ -3085,6 +2932,9 @@ function extractFrame(world, context) {
3085
2932
  if (!authorVisible && !retainHidden) {
3086
2933
  continue;
3087
2934
  }
2935
+ if (isRenderable && fAssetHandle === 0) {
2936
+ continue;
2937
+ }
3088
2938
  const layerVal = fLayerValue ?? 0;
3089
2939
  const pendingDispatch = [];
3090
2940
  const materialsView = worldInternal._getArrayView(entity, MeshRenderer, "materials");
@@ -3270,28 +3120,28 @@ function extractFrame(world, context) {
3270
3120
  } else {
3271
3121
  const resolvedResult = walkMaterialPassesOverSharedRefs(world, tagged, assets);
3272
3122
  if (!resolvedResult.ok) {
3273
- const err8 = resolvedResult.error;
3274
- switch (err8.code) {
3123
+ const err6 = resolvedResult.error;
3124
+ switch (err6.code) {
3275
3125
  case "material-parent-not-found":
3276
3126
  case "material-no-effective-pass":
3277
3127
  case "material-value-unknown":
3278
3128
  case "material-value-type-mismatch":
3279
3129
  case "material-contract-program-mismatch":
3280
- worldInternal._routeError(err8, {
3130
+ worldInternal._routeError(err6, {
3281
3131
  severity: Severity.Error,
3282
- systemName: `RenderSystem.extract (${err8.code})`
3132
+ systemName: `RenderSystem.extract (${err6.code})`
3283
3133
  });
3284
3134
  break;
3285
3135
  case "material-circular-inheritance":
3286
- worldInternal._routeError(err8, {
3136
+ worldInternal._routeError(err6, {
3287
3137
  severity: Severity.Error,
3288
3138
  systemName: "RenderSystem.extract (material-circular-inheritance)"
3289
3139
  });
3290
3140
  break;
3291
3141
  default:
3292
- worldInternal._routeError(err8, {
3142
+ worldInternal._routeError(err6, {
3293
3143
  severity: Severity.Error,
3294
- systemName: `RenderSystem.extract (_materialWalk: ${err8.code})`
3144
+ systemName: `RenderSystem.extract (_materialWalk: ${err6.code})`
3295
3145
  });
3296
3146
  }
3297
3147
  continue;
@@ -3927,6 +3777,7 @@ function extractFrame(world, context) {
3927
3777
  }
3928
3778
  instancesSnap = {
3929
3779
  transforms: collectionResult.value.transforms,
3780
+ generations: collectionResult.value.generations,
3930
3781
  instanceCount: collectionResult.value.count,
3931
3782
  collectionId: collectionResult.value.collectionId,
3932
3783
  revision: collectionResult.value.revision,
@@ -5078,6 +4929,9 @@ function collectCameraSnapshots(world) {
5078
4929
  for (const row of cameraQuery) {
5079
4930
  const cam = row.get(Camera);
5080
4931
  const motionBlur = row.get(MotionBlur);
4932
+ const motionBlurResult = resolveMotionBlurParams(motionBlur);
4933
+ if (!motionBlurResult.ok) throw motionBlurResult.error;
4934
+ const motionBlurParams = motionBlurResult.value;
5081
4935
  const depthOfField = row.get(DepthOfField);
5082
4936
  const dynamicResolution = row.get(DynamicResolution);
5083
4937
  const screenSpaceReflection = row.get(ScreenSpaceReflection);
@@ -5126,10 +4980,17 @@ function collectCameraSnapshots(world) {
5126
4980
  ...output === void 0 ? {} : { output },
5127
4981
  antialias,
5128
4982
  ...dynamicResolutionResult.value === void 0 ? {} : { dynamicResolution: dynamicResolutionResult.value },
5129
- bloom: bloomEnabledFromF32(cam.bloom),
4983
+ bloom: validateCameraBloom(
4984
+ cam.bloom,
4985
+ cam.bloomThreshold,
4986
+ cam.bloomIntensity,
4987
+ cam.bloomSoftKnee,
4988
+ cam.bloomScatter
4989
+ ),
5130
4990
  bloomThreshold: cam.bloomThreshold,
5131
4991
  bloomIntensity: cam.bloomIntensity,
5132
- bloomBlurRadius: cam.bloomBlurRadius,
4992
+ bloomSoftKnee: cam.bloomSoftKnee,
4993
+ bloomScatter: cam.bloomScatter,
5133
4994
  clearColor: [
5134
4995
  cam.clearColor[0] ?? 0,
5135
4996
  cam.clearColor[1] ?? 0,
@@ -5138,11 +4999,12 @@ function collectCameraSnapshots(world) {
5138
4999
  ],
5139
5000
  ...depthOfFieldResult.ok && depthOfFieldResult.value !== void 0 ? { depthOfField: depthOfFieldResult.value } : {},
5140
5001
  ...depthOfFieldError === void 0 ? {} : { depthOfFieldError },
5141
- ...motionBlur === void 0 ? {} : {
5002
+ ...motionBlurParams === void 0 ? {} : {
5142
5003
  motionBlur: {
5143
- shutterAngle: motionBlur.shutterAngle,
5144
- maxRadiusPixels: motionBlur.maxRadiusPixels,
5145
- sampleCount: motionBlur.sampleCount
5004
+ shutterAngle: motionBlurParams.shutterAngle,
5005
+ maxRadiusPixels: motionBlurParams.maxRadiusPixels,
5006
+ sampleCount: motionBlurParams.sampleCount,
5007
+ targetFps: motionBlurParams.targetFps
5146
5008
  }
5147
5009
  },
5148
5010
  ...screenSpaceReflection === void 0 ? {} : {
@@ -5320,6 +5182,8 @@ function textureDigest(texture2) {
5320
5182
  return `fnv1a:${hash.toString(16).padStart(8, "0")}`;
5321
5183
  }
5322
5184
  function extractVolumeSnapshot(world, assets, worldInternal) {
5185
+ const elapsed = world.getResource(Time).elapsed;
5186
+ const worldTimeSeconds = Number.isFinite(elapsed) ? Math.max(0, elapsed) : 0;
5323
5187
  const query = world.query({ read: [VolumetricFog] }).unwrap();
5324
5188
  const authorings = [];
5325
5189
  let selectedLight;
@@ -5349,7 +5213,7 @@ function extractVolumeSnapshot(world, assets, worldInternal) {
5349
5213
  }) : resolved.error,
5350
5214
  { severity: Severity.Error, systemName: "RenderSystem.extract (volumetric-density)" }
5351
5215
  );
5352
- return { status: "degraded" };
5216
+ return { status: "degraded", worldTimeSeconds };
5353
5217
  }
5354
5218
  const densityAsset = resolved.value;
5355
5219
  const guid = assets?.guidOf(densityAsset) ?? `handle:${Number(densityHandle)}`;
@@ -5406,6 +5270,7 @@ function extractVolumeSnapshot(world, assets, worldInternal) {
5406
5270
  });
5407
5271
  return {
5408
5272
  status: "degraded",
5273
+ worldTimeSeconds,
5409
5274
  ...first === void 0 ? {} : {
5410
5275
  densityHandle: first.densityHandle,
5411
5276
  densityAsset: first.densityAsset,
@@ -5430,6 +5295,7 @@ function extractVolumeSnapshot(world, assets, worldInternal) {
5430
5295
  };
5431
5296
  return {
5432
5297
  status: "available",
5298
+ worldTimeSeconds,
5433
5299
  fog: extracted.value.fog,
5434
5300
  densityHandle: first.densityHandle,
5435
5301
  densityAsset: first.densityAsset,
@@ -5978,6 +5844,6 @@ var ProbeBlendSceneProjection = class {
5978
5844
  }
5979
5845
  };
5980
5846
 
5981
- export { InstanceBoundsCache, OcclusionRenderRuntime, PROBE_MAX_CONTRIBUTORS, ProbeBlendSceneProjection, SKYLIGHT_RECOVERY_FALLBACK, SSR_HISTORY_FORMAT, SsrHistoryOwner, admitProbeContributors, blendLightProbes, buildRectAreaWorldFrame, buildShadowFrusta, createCookieProjectionMatrixData, createExtendedLightingState, createSsrHistoryOwner, createSsrSpatialResources, estimateSsrSpatialMemory, extractFrames, fingerprintNumericArray, glyphTextLayoutSystem, primitiveKey, primitiveKeyId, projectExtendedLightingInspection, promoteExtendedLightingCandidate, recordExtendedLightingFailure, rectAreaFacesPoint, scaledProbeWeight, setOcclusionRuntimeTestHooks, viewKey, viewKeyId };
5982
- //# sourceMappingURL=chunk-4NNZQCL3.mjs.map
5983
- //# sourceMappingURL=chunk-4NNZQCL3.mjs.map
5847
+ export { InstanceBoundsCache, OcclusionRenderRuntime, PROBE_MAX_CONTRIBUTORS, ProbeBlendSceneProjection, SSR_HISTORY_FORMAT, SsrHistoryOwner, admitProbeContributors, blendLightProbes, buildRectAreaWorldFrame, buildShadowFrusta, createCookieProjectionMatrixData, createExtendedLightingState, createSsrHistoryOwner, createSsrSpatialResources, emptyBloomInspection, estimateSsrSpatialMemory, extractFrames, fingerprintNumericArray, glyphTextLayoutSystem, primitiveKey, primitiveKeyId, projectExtendedLightingInspection, promoteExtendedLightingCandidate, recordExtendedLightingFailure, rectAreaFacesPoint, scaledProbeWeight, setOcclusionRuntimeTestHooks, viewKey, viewKeyId };
5848
+ //# sourceMappingURL=chunk-OO3DRYK7.mjs.map
5849
+ //# sourceMappingURL=chunk-OO3DRYK7.mjs.map