@forgeax/engine-render 0.1.34 → 0.1.35

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 (243) hide show
  1. package/README.md +52 -3
  2. package/dist/assembly/device-feature-admission.d.ts +2 -2
  3. package/dist/assembly/host-contract.d.ts +3 -2
  4. package/dist/assembly/host-contract.d.ts.map +1 -1
  5. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  6. package/dist/assembly/render-target-host.d.ts +5 -0
  7. package/dist/assembly/render-target-host.d.ts.map +1 -1
  8. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  9. package/dist/assembly/webgpu-renderer.d.ts +1 -0
  10. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  11. package/dist/authoring.mjs +2 -4
  12. package/dist/authoring.mjs.map +1 -1
  13. package/dist/chunk-3XUBWRY2.mjs +1842 -0
  14. package/dist/chunk-3XUBWRY2.mjs.map +1 -0
  15. package/dist/{chunk-UI5SFODX.mjs → chunk-G6HDNGY7.mjs} +2329 -1776
  16. package/dist/chunk-G6HDNGY7.mjs.map +1 -0
  17. package/dist/{chunk-HEB564WF.mjs → chunk-LM5IE7GF.mjs} +4 -4
  18. package/dist/{chunk-HEB564WF.mjs.map → chunk-LM5IE7GF.mjs.map} +1 -1
  19. package/dist/{chunk-MKDIT2EM.mjs → chunk-LNIUIKQ7.mjs} +143 -246
  20. package/dist/chunk-LNIUIKQ7.mjs.map +1 -0
  21. package/dist/chunk-MXTWKZO4.mjs +3268 -0
  22. package/dist/chunk-MXTWKZO4.mjs.map +1 -0
  23. package/dist/{chunk-ODZWR6JQ.mjs → chunk-MZ4C7EHF.mjs} +2042 -27
  24. package/dist/chunk-MZ4C7EHF.mjs.map +1 -0
  25. package/dist/chunk-RIPAEGI6.mjs +48 -0
  26. package/dist/chunk-RIPAEGI6.mjs.map +1 -0
  27. package/dist/{chunk-OCDLEI6I.mjs → chunk-SGPUJW3F.mjs} +117 -5
  28. package/dist/chunk-SGPUJW3F.mjs.map +1 -0
  29. package/dist/{chunk-ELJFJ2BU.mjs → chunk-X2KA6WHM.mjs} +29 -4
  30. package/dist/chunk-X2KA6WHM.mjs.map +1 -0
  31. package/dist/{chunk-BLXGONR2.mjs → chunk-XSFB7XXQ.mjs} +51 -4
  32. package/dist/chunk-XSFB7XXQ.mjs.map +1 -0
  33. package/dist/cloud/frame-context.d.ts +2 -2
  34. package/dist/cloud/frame-context.d.ts.map +1 -1
  35. package/dist/construct-renderer.mjs +810 -2073
  36. package/dist/construct-renderer.mjs.map +1 -1
  37. package/dist/device/gpu-residency.d.ts +19 -19
  38. package/dist/device/gpu-residency.d.ts.map +1 -1
  39. package/dist/errors/render.d.ts +3 -2
  40. package/dist/errors/render.d.ts.map +1 -1
  41. package/dist/extract/material-context.d.ts +7 -0
  42. package/dist/extract/material-context.d.ts.map +1 -0
  43. package/dist/features/host.d.ts +5 -0
  44. package/dist/features/host.d.ts.map +1 -1
  45. package/dist/features/plan.d.ts +2 -0
  46. package/dist/features/plan.d.ts.map +1 -1
  47. package/dist/features/types.d.ts +4 -0
  48. package/dist/features/types.d.ts.map +1 -1
  49. package/dist/glyph-text-layout-system.d.ts +1 -1
  50. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  51. package/dist/gpu-driven/shadow-ownership.d.ts +3 -3
  52. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -1
  53. package/dist/ibl/frame-resources.d.ts.map +1 -1
  54. package/dist/ibl/skylight-bind-group.d.ts +4 -4
  55. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  56. package/dist/index.d.ts +3 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.mjs +530 -9
  59. package/dist/index.mjs.map +1 -1
  60. package/dist/instances.d.ts +3 -4
  61. package/dist/instances.d.ts.map +1 -1
  62. package/dist/internal.mjs +7 -8
  63. package/dist/internal.mjs.map +1 -1
  64. package/dist/pbr-pipeline.d.ts +3 -3
  65. package/dist/pbr-pipeline.d.ts.map +1 -1
  66. package/dist/pipeline/standard-output/lut-gpu.d.ts +2 -2
  67. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -1
  68. package/dist/pipeline/standard-output/resources.d.ts +2 -2
  69. package/dist/pipeline/standard-output/resources.d.ts.map +1 -1
  70. package/dist/publication/contract.d.ts +77 -0
  71. package/dist/publication/contract.d.ts.map +1 -0
  72. package/dist/publication/dependencies.d.ts +7 -0
  73. package/dist/publication/dependencies.d.ts.map +1 -0
  74. package/dist/publication/prepare-geometry.d.ts +9 -0
  75. package/dist/publication/prepare-geometry.d.ts.map +1 -0
  76. package/dist/publication/programs.d.ts +5 -0
  77. package/dist/publication/programs.d.ts.map +1 -0
  78. package/dist/publication/publisher.d.ts +33 -0
  79. package/dist/publication/publisher.d.ts.map +1 -0
  80. package/dist/publication/receiver.d.ts +29 -0
  81. package/dist/publication/receiver.d.ts.map +1 -0
  82. package/dist/publication/resource-scope.d.ts +18 -0
  83. package/dist/publication/resource-scope.d.ts.map +1 -0
  84. package/dist/publication/targets.d.ts +33 -0
  85. package/dist/publication/targets.d.ts.map +1 -0
  86. package/dist/publication/video.d.ts +5 -0
  87. package/dist/publication/video.d.ts.map +1 -0
  88. package/dist/record/fold-buckets.d.ts +3 -3
  89. package/dist/record/fold-buckets.d.ts.map +1 -1
  90. package/dist/record/frame-snapshot.d.ts +6 -6
  91. package/dist/record/frame-snapshot.d.ts.map +1 -1
  92. package/dist/record/frame.d.ts +5 -4
  93. package/dist/record/frame.d.ts.map +1 -1
  94. package/dist/record/helpers.d.ts +2 -2
  95. package/dist/record/helpers.d.ts.map +1 -1
  96. package/dist/record/main-pass-geometry.d.ts +2 -2
  97. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  98. package/dist/record/main-pass-material.d.ts +7 -9
  99. package/dist/record/main-pass-material.d.ts.map +1 -1
  100. package/dist/record/main-pass-sprite-draws.d.ts +3 -16
  101. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  102. package/dist/record/main-pass.d.ts.map +1 -1
  103. package/dist/record/prepared-material-bindings.d.ts +3 -3
  104. package/dist/record/prepared-material-bindings.d.ts.map +1 -1
  105. package/dist/record/render-context.d.ts +2 -2
  106. package/dist/record/render-context.d.ts.map +1 -1
  107. package/dist/record/sprite-instance-buffer.d.ts +31 -0
  108. package/dist/record/sprite-instance-buffer.d.ts.map +1 -0
  109. package/dist/record/target-capture-graph.d.ts +19 -0
  110. package/dist/record/target-capture-graph.d.ts.map +1 -0
  111. package/dist/record/typed-frame-graph.d.ts +2 -13
  112. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  113. package/dist/record/view-ubo.d.ts.map +1 -1
  114. package/dist/record/volume-params.d.ts +2 -2
  115. package/dist/record/volume-params.d.ts.map +1 -1
  116. package/dist/recovery/render-system-candidate.d.ts +5 -5
  117. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  118. package/dist/render-contract.d.ts +4 -1
  119. package/dist/render-contract.d.ts.map +1 -1
  120. package/dist/render-system-extract-tail.d.ts.map +1 -1
  121. package/dist/render-system-extract.d.ts +2 -0
  122. package/dist/render-system-extract.d.ts.map +1 -1
  123. package/dist/render-system-presentation.d.ts +2 -2
  124. package/dist/render-system-presentation.d.ts.map +1 -1
  125. package/dist/render-system-projections.d.ts +3 -2
  126. package/dist/render-system-projections.d.ts.map +1 -1
  127. package/dist/render-system-residency.d.ts +2 -2
  128. package/dist/render-system-residency.d.ts.map +1 -1
  129. package/dist/render-system.d.ts +3 -7
  130. package/dist/render-system.d.ts.map +1 -1
  131. package/dist/scene/render-scene.d.ts +8 -4
  132. package/dist/scene/render-scene.d.ts.map +1 -1
  133. package/dist/scene/render-source.d.ts +42 -0
  134. package/dist/scene/render-source.d.ts.map +1 -0
  135. package/dist/scene/source-systems.d.ts +6 -0
  136. package/dist/scene/source-systems.d.ts.map +1 -0
  137. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  138. package/dist/systems/skin-palette-types.d.ts +10 -0
  139. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  140. package/dist/systems/transparent-dispatch.d.ts +2 -2
  141. package/dist/systems/transparent-dispatch.d.ts.map +1 -1
  142. package/dist/systems/transparent-sort-config.d.ts +2 -1
  143. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  144. package/dist/temporal/index.mjs +6 -7
  145. package/package.json +21 -21
  146. package/src/__tests__/auto-exposure-transaction.integration.test.ts +4 -9
  147. package/src/__tests__/device-feature-admission.unit.test.ts +3 -2
  148. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +3 -4
  149. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +4 -1
  150. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +0 -1
  151. package/src/__tests__/materials-standard-contract.unit.test.ts +0 -1
  152. package/src/__tests__/physical-clearcoat.integration.test.ts +23 -23
  153. package/src/__tests__/physical-material-budget.unit.test.ts +40 -0
  154. package/src/__tests__/render-error-code-owner.test-d.ts +1 -0
  155. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +1 -1
  156. package/src/assembly/device-feature-admission.ts +2 -2
  157. package/src/assembly/host-contract.ts +5 -2
  158. package/src/assembly/recovery/renderer-recover.ts +9 -0
  159. package/src/assembly/render-target-host.ts +57 -47
  160. package/src/assembly/renderer-facade.ts +3 -1
  161. package/src/assembly/webgpu-ready.ts +1 -1
  162. package/src/assembly/webgpu-renderer.ts +89 -61
  163. package/src/cloud/frame-context.ts +2 -2
  164. package/src/device/gpu-residency.ts +26 -25
  165. package/src/errors/render.ts +3 -1
  166. package/src/extract/material-context.ts +21 -0
  167. package/src/features/host.ts +13 -5
  168. package/src/features/plan.ts +2 -0
  169. package/src/features/types.ts +4 -0
  170. package/src/glyph-text-layout-system.ts +2 -2
  171. package/src/gpu-driven/shadow-ownership.ts +3 -3
  172. package/src/ibl/frame-resources.ts +0 -1
  173. package/src/ibl/skylight-bind-group.ts +13 -25
  174. package/src/index.ts +9 -0
  175. package/src/instances.ts +9 -6
  176. package/src/pbr-pipeline.ts +11 -17
  177. package/src/pipeline/standard-output/lut-gpu.ts +3 -3
  178. package/src/pipeline/standard-output/resources.ts +2 -2
  179. package/src/publication/__tests__/derived-geometry.integration.test.ts +177 -0
  180. package/src/publication/__tests__/features.integration.test.ts +122 -0
  181. package/src/publication/__tests__/programs.unit.test.ts +25 -0
  182. package/src/publication/__tests__/publication.integration.test.ts +370 -0
  183. package/src/publication/__tests__/targets.integration.test.ts +120 -0
  184. package/src/publication/__tests__/video.browser.test.ts +50 -0
  185. package/src/publication/contract.ts +104 -0
  186. package/src/publication/dependencies.ts +54 -0
  187. package/src/publication/prepare-geometry.ts +94 -0
  188. package/src/publication/programs.ts +45 -0
  189. package/src/publication/publisher.ts +618 -0
  190. package/src/publication/receiver.ts +297 -0
  191. package/src/publication/resource-scope.ts +31 -0
  192. package/src/publication/targets.ts +182 -0
  193. package/src/publication/video.ts +33 -0
  194. package/src/record/__tests__/material-bg-cache.unit.test.ts +15 -1
  195. package/src/record/__tests__/sprite-material-abi.unit.test.ts +8 -10
  196. package/src/record/__tests__/video-texture-view.unit.test.ts +9 -9
  197. package/src/record/fold-buckets.ts +8 -5
  198. package/src/record/frame-snapshot.ts +6 -6
  199. package/src/record/frame.ts +42 -22
  200. package/src/record/helpers.ts +2 -2
  201. package/src/record/main-pass-geometry.ts +21 -2
  202. package/src/record/main-pass-material.ts +37 -33
  203. package/src/record/main-pass-sprite-draws.ts +6 -152
  204. package/src/record/main-pass.ts +8 -7
  205. package/src/record/prepared-material-bindings.ts +11 -6
  206. package/src/record/render-context.ts +2 -2
  207. package/src/record/shadow-pass.ts +0 -3
  208. package/src/record/sprite-instance-buffer.ts +155 -0
  209. package/src/record/target-capture-graph.ts +258 -0
  210. package/src/record/typed-frame-graph.ts +6 -206
  211. package/src/record/view-ubo.ts +1 -1
  212. package/src/record/volume-params.ts +6 -6
  213. package/src/recovery/render-system-candidate.ts +10 -10
  214. package/src/render-contract.ts +6 -1
  215. package/src/render-system-extract-tail.ts +33 -17
  216. package/src/render-system-extract.ts +2 -0
  217. package/src/render-system-presentation.ts +2 -2
  218. package/src/render-system-projections.ts +3 -2
  219. package/src/render-system-residency.ts +2 -2
  220. package/src/render-system.ts +82 -53
  221. package/src/scene/render-scene.ts +110 -100
  222. package/src/scene/render-source.ts +90 -0
  223. package/src/scene/source-systems.ts +33 -0
  224. package/src/systems/skin-palette-allocator.ts +1 -0
  225. package/src/systems/skin-palette-types.ts +11 -0
  226. package/src/systems/transparent-dispatch.ts +2 -2
  227. package/src/systems/transparent-sort-config.ts +3 -1
  228. package/dist/chunk-BLXGONR2.mjs.map +0 -1
  229. package/dist/chunk-ELJFJ2BU.mjs.map +0 -1
  230. package/dist/chunk-ILQ5MEZF.mjs +0 -32
  231. package/dist/chunk-ILQ5MEZF.mjs.map +0 -1
  232. package/dist/chunk-MKDIT2EM.mjs.map +0 -1
  233. package/dist/chunk-OCDLEI6I.mjs.map +0 -1
  234. package/dist/chunk-ODZWR6JQ.mjs.map +0 -1
  235. package/dist/chunk-RXZ3RGOU.mjs +0 -53
  236. package/dist/chunk-RXZ3RGOU.mjs.map +0 -1
  237. package/dist/chunk-SHFUFJ5N.mjs +0 -1781
  238. package/dist/chunk-SHFUFJ5N.mjs.map +0 -1
  239. package/dist/chunk-UI5SFODX.mjs.map +0 -1
  240. package/dist/chunk-UINHLCZA.mjs +0 -2389
  241. package/dist/chunk-UINHLCZA.mjs.map +0 -1
  242. package/dist/chunk-WEX45HKH.mjs +0 -1524
  243. package/dist/chunk-WEX45HKH.mjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,13 +1,21 @@
1
- export { BARREL_DISTORTION_FEATURE_IDENTITY, BARREL_DISTORTION_POST_PROCESS_ID, BARREL_DISTORTION_WGSL, BARREL_DISTORTION_WGSL_COORDINATE, CLOUD_DENSITY_COMPUTE_WGSL, CLOUD_HISTORY_FULLSCREEN_WGSL, CLOUD_HISTORY_SURFACE_COUNT, CLOUD_LAYER_DENSITY_BINDINGS, CLOUD_LAYER_DENSITY_CACHE, CLOUD_LAYER_DENSITY_OUTPUT, CLOUD_LAYER_DENSITY_PROGRAM, CLOUD_LAYER_FEATURE_IDENTITY, CLOUD_RGBA16FLOAT_BYTES_PER_TEXEL, CLOUD_VIEW_FULLSCREEN_WGSL, CLOUD_VIEW_PARAMS_BYTES, CloudHistoryStore, DEFAULT_REFLECTION_PROBE_LIMITS, DynamicGeometryError, DynamicInputError, LOD_OCCLUSION_INSPECTION_MAX_BYTES, LOD_OCCLUSION_INSPECTION_SCHEMA, ReadonlyDynamicInputPage, ReflectionProbeProjection, SSR_FORMAT_PROFILE, SSR_FORMAT_STAGES, acceptCloudLayerGeneration, admitPointsLines, admitReflectionProbe, admitSingleLayerMediumSubmission, admitSsrM0, admitSsrSpatial, advanceProbeFilter, applyCloudSolarTransmittance, boxProjectReflectionDirection, buildCloudDensityCache, buildReflectionProbeTable, cloudCapabilitiesFromRhi, cloudTemporalResetReasons, cloudTemporalSignature, commitProbeFilterStep, compositeCloudRadiance, consumeLodOcclusionInspection, createBarrelDistortionRenderFeature, createCloudHistory, createCloudLayerFeature, createCloudShadowProjection, createDynamicGeometryLifecycle, createProbeFilterState, estimateReflectionProbeBytes, evaluateCloudDensity, inspectCloudLayer, inspectCloudLayerResources, inspectLodOcclusion, inspectPointShadow, inspectReflectionFallback, inspectVolumetricFog, integrateCloudCameraPath, integrateCloudInterior, integrateCloudPath, integrateCloudSolarColumn, intersectCloudLayer, probeFilterIsSteady, projectCloudShadowUv, projectSsrDependencies, projectSsrSpatialInspection, reconstructCloudDensityCache, reflectionProbeTableBytes, reprojectCloudHistory, resolveSsrAdmissionGeneration, retainCloudLayerAfterFailure, sampleCloudDensity, sampleCloudShadow, selectReflectionProbe, serializeLodOcclusionInspection, serializeSsrSpatialInspection, snapshotCloudDensityCache, validateReflectionProbeInput, validateScreenSpaceReflection, zeroSsrAdmissionWork } from './chunk-ODZWR6JQ.mjs';
2
- import { Atmosphere, BarrelDistortion, Camera, CloudLayer, DirectionalLight, DynamicResolution, DepthOfField, Instances, Layer, LightProbe, MeshFilter, MeshRenderer, MotionBlur, PointLight, PointLightShadow, Points, Lines, PostProcessParams, RectAreaLight, SceneInstance, SkyboxBackground, Skylight, SortKey, SpotLight, Visibility } from './chunk-UINHLCZA.mjs';
3
- export { ANTIALIAS_FXAA, ANTIALIAS_MSAA, ANTIALIAS_NONE, ANTIALIAS_TAA, Atmosphere, BLOOM_DISABLED, BLOOM_ENABLED, BarrelDistortion, CAMERA_BLOOM_INTENSITY_MAX, CAMERA_BLOOM_INTENSITY_MIN, CAMERA_BLOOM_SCATTER_MAX, CAMERA_BLOOM_SCATTER_MIN, CAMERA_BLOOM_SOFT_KNEE_MAX, CAMERA_BLOOM_SOFT_KNEE_MIN, CAMERA_BLOOM_THRESHOLD_MAX, CAMERA_BLOOM_THRESHOLD_MIN, CAMERA_EXPOSURE_MODE_AUTO, CAMERA_EXPOSURE_MODE_MANUAL, CAMERA_PROJECTION_ORTHOGRAPHIC, CAMERA_PROJECTION_PERSPECTIVE, CAMERA_TEMPERATURE_MAX, CAMERA_TEMPERATURE_MIN, CAMERA_TINT_MAX, CAMERA_TINT_MIN, CLOUD_QUALITY_PROFILES, CUBE_CAMERA_FACE_ORDER, CUBE_CAMERA_UPDATE_CONTINUOUS, CUBE_CAMERA_UPDATE_ONCE, CUBE_CAMERA_UPDATE_ON_DEMAND, Camera, CameraError, CloudLayer, CloudLayerCacheInvalidError, CloudLayerCapabilityMissingError, CloudLayerInvalidParameterError, CloudLayerOwnerConflictError, CloudLayerResourceFailureError, CloudQualityValue, CubeCamera, DEFAULT_CLOUD_LAYER, DEFAULT_DEPTH_OF_FIELD_PARAMS, DEPTH_OF_FIELD_PARAMS_BYTE_SIZE, DepthOfField, DepthOfFieldQualityValue, DepthOfFieldSideValue, DepthOfFieldValidationError, DirectionalLight, DirectionalShadowFilterValue, DynamicResolution, Fog, Instances, Layer, LightProbe, Lines, MAX_VOLUMETRIC_FOG_OWNERS, MeshFilter, MeshRenderer, MotionBlur, PointLight, PointLightShadow, PointShapeValue, Points, PostProcessParams, REFLECTION_PROBE_UPDATE_CONTINUOUS, REFLECTION_PROBE_UPDATE_ONCE, REFLECTION_PROBE_UPDATE_ON_CHANGE, RectAreaLight, ReflectionProbe, SKYBOX_MODE_CUBEMAP, SceneInstance, ScreenSpaceReflection, SkyboxBackground, Skylight, SortKey, SpotLight, SunCardinalityError, TONEMAP_ACES_FILMIC, TONEMAP_AGX, TONEMAP_CINEON, TONEMAP_LINEAR, TONEMAP_NEUTRAL, TONEMAP_NONE, TONEMAP_REINHARD, TONEMAP_REINHARD_EXTENDED, Visibility, VisibilityStateValue, VolumetricFog, VolumetricFogSamplingValue, attachBarrelDistortionCameraFrame, buildCubeCameraFaceViews, cameraExposureFromColumns, cameraProjectionFromF32, cloudLayerSourceKey, cloudQualityFromF32, computeInvRangeSquared, createBarrelDistortionMapping, cubeCameraUpdateIntentFromF32, cubeCameraUpdateIntentToF32, degToCos, depthOfFieldQualityCode, depthOfFieldQualityFromF32, depthOfFieldRequestFailure, depthOfFieldSideCode, depthOfFieldSideFromF32, depthOfFieldTapCount, directionalShadowQualityFromF32, extractCloudLayer, extractVolumetricFog, freezeBarrelDistortionMapping, hasVolumetricFogCapability, mapDisplayToScene, mapDisplayUvToSceneUv, mapSceneToDisplay, mapSceneUvToDisplayUv, orthographic, packDepthOfFieldParams, perspective, pointShapeFromU32, projectMeshMaterialBindingObservation, reflectionProbeUpdateIntentFromF32, reflectionProbeUpdateIntentToF32, resolveDepthOfFieldParams, resolveIntegratedVolumeConsumer, resolveSelectedVolumetricLight, resolveVisibility, resolveVolumetricFogLightPair, selectCloudLayerFrame, signedDepthOfFieldCoC, summarizeMeshMaterialBindings, validateBarrelDistortionParameters, validateCameraBloom, validateCameraColorGrading, validateCameraExposure, validateCloudLayer, validateDepthOfFieldFrameParams, validateDepthOfFieldParams, validateDirection, validateDirectionalLightData, validateDynamicResolutionCamera, validateDynamicResolutionParameters, validateLightProbeData, validatePointLightData, validatePointLightShadowData, validateRectAreaLightData, validateSpotLightData, validateVolumetricFog, visibilityStateFromU32 } from './chunk-UINHLCZA.mjs';
4
- import { SpriteAnimation, SpriteInstances, SpriteRegionOverride, TileLayer, Tilemap } from './chunk-ELJFJ2BU.mjs';
5
- export { getActiveCamera, setActiveCamera } from './chunk-ELJFJ2BU.mjs';
6
- export { DEFAULT_STANDARD_PROFILE, REFLECTION_PROBE_IBL_STAGES, SCENE_DATA_TEMPORAL_V1_DESCRIPTOR, SCENE_DATA_TEMPORAL_V1_SCHEMA, beginProbeIblUpdate, createIblKernelCache, createProbeIblOutput, createSceneDataCatalog, publishProbeIblOutput, resetIblKernelCaches } from './chunk-OCDLEI6I.mjs';
7
- export { MaterialAuthoringContractError, MaterialTransmissionContractError, Materials, srgb } from './chunk-BLXGONR2.mjs';
8
- export { AtmosphereInvalidParameterError, AutoExposureCapabilityUnavailableError, AutoExposureInvalidParameterError, AutoExposureStageFailedError, AutoExposureStaleGenerationError, BarrelDistortionInvalidParameterError, DEFAULT_MOTION_BLUR_PARAMS, DynamicResolutionInvalidParameterError, DynamicResolutionRequiresTaaError, DynamicResolutionTimingUnavailableError, EnvironmentGenerationFailedError, EnvironmentSourceConflictError, FogCardinalityError, GpuDrivenPreparationError, InstanceTransformsError, MotionBlurValidationError, OwnerStageFailedError, RENDER_PHASE_CATALOG, RendererOperationError, SHADOW_ATLAS_DEFAULT_FACE_SIZE, SHADOW_ATLAS_DEFAULT_LAYERS, SceneDataUnavailableError, ShadowAtlas, TaaCapsInsufficientError, createAutoExposureError, createAutoExposureInspection, effectiveMotionBlurSampleCount, isMotionBlurIntervalValid, motionBlurExposureScale, motionBlurSampleDelta, motionBlurTemporalDemand, resolveMotionBlurParams, validateMotionBlurParams } from './chunk-WEX45HKH.mjs';
1
+ import { registerRenderSourceSystems, createRenderSourceState, createGlobalTransformChangeQuery, isRenderableMember, renderMaterialContext, publicationDependencies, publicationFrameDependencies, publicationTargetSources, RenderPublicationError, RENDERABLE_SOURCE_COMPONENTS } from './chunk-MZ4C7EHF.mjs';
2
+ export { BARREL_DISTORTION_FEATURE_IDENTITY, BARREL_DISTORTION_POST_PROCESS_ID, BARREL_DISTORTION_WGSL, BARREL_DISTORTION_WGSL_COORDINATE, CLOUD_DENSITY_COMPUTE_WGSL, CLOUD_HISTORY_FULLSCREEN_WGSL, CLOUD_HISTORY_SURFACE_COUNT, CLOUD_LAYER_DENSITY_BINDINGS, CLOUD_LAYER_DENSITY_CACHE, CLOUD_LAYER_DENSITY_OUTPUT, CLOUD_LAYER_DENSITY_PROGRAM, CLOUD_LAYER_FEATURE_IDENTITY, CLOUD_RGBA16FLOAT_BYTES_PER_TEXEL, CLOUD_VIEW_FULLSCREEN_WGSL, CLOUD_VIEW_PARAMS_BYTES, CloudHistoryStore, DEFAULT_REFLECTION_PROBE_LIMITS, DynamicGeometryError, DynamicInputError, LOD_OCCLUSION_INSPECTION_MAX_BYTES, LOD_OCCLUSION_INSPECTION_SCHEMA, ReadonlyDynamicInputPage, ReflectionProbeProjection, RenderPublicationError, RenderPublicationTargetOwner, SSR_FORMAT_PROFILE, SSR_FORMAT_STAGES, acceptCloudLayerGeneration, admitPointsLines, admitReflectionProbe, admitSingleLayerMediumSubmission, admitSsrM0, admitSsrSpatial, advanceProbeFilter, applyCloudSolarTransmittance, boxProjectReflectionDirection, buildCloudDensityCache, buildReflectionProbeTable, cloudCapabilitiesFromRhi, cloudTemporalResetReasons, cloudTemporalSignature, commitProbeFilterStep, compositeCloudRadiance, consumeLodOcclusionInspection, createBarrelDistortionRenderFeature, createCloudHistory, createCloudLayerFeature, createCloudShadowProjection, createDynamicGeometryLifecycle, createProbeFilterState, estimateReflectionProbeBytes, evaluateCloudDensity, inspectCloudLayer, inspectCloudLayerResources, inspectLodOcclusion, inspectPointShadow, inspectReflectionFallback, inspectVolumetricFog, integrateCloudCameraPath, integrateCloudInterior, integrateCloudPath, integrateCloudSolarColumn, intersectCloudLayer, probeFilterIsSteady, projectCloudShadowUv, projectSsrDependencies, projectSsrSpatialInspection, reconstructCloudDensityCache, reflectionProbeTableBytes, renderPublicationTransfers, reprojectCloudHistory, resolveSsrAdmissionGeneration, retainCloudLayerAfterFailure, sampleCloudDensity, sampleCloudShadow, selectReflectionProbe, serializeLodOcclusionInspection, serializeSsrSpatialInspection, snapshotCloudDensityCache, validateReflectionProbeInput, validateScreenSpaceReflection, zeroSsrAdmissionWork } from './chunk-MZ4C7EHF.mjs';
3
+ import { Visibility, extractFrames, internSharedRefFromGuid, resolveMaterialSnapshot, Atmosphere, BarrelDistortion, Camera, CloudLayer, DirectionalLight, DynamicResolution, DepthOfField, Instances, Layer, LightProbe, MeshFilter, MeshRenderer, MotionBlur, PointLight, PointLightShadow, Points, Lines, PostProcessParams, RectAreaLight, SceneInstance, SkyboxBackground, Skylight, SortKey, SpotLight } from './chunk-G6HDNGY7.mjs';
4
+ export { ANTIALIAS_FXAA, ANTIALIAS_MSAA, ANTIALIAS_NONE, ANTIALIAS_TAA, Atmosphere, BLOOM_DISABLED, BLOOM_ENABLED, BarrelDistortion, CAMERA_BLOOM_INTENSITY_MAX, CAMERA_BLOOM_INTENSITY_MIN, CAMERA_BLOOM_SCATTER_MAX, CAMERA_BLOOM_SCATTER_MIN, CAMERA_BLOOM_SOFT_KNEE_MAX, CAMERA_BLOOM_SOFT_KNEE_MIN, CAMERA_BLOOM_THRESHOLD_MAX, CAMERA_BLOOM_THRESHOLD_MIN, CAMERA_EXPOSURE_MODE_AUTO, CAMERA_EXPOSURE_MODE_MANUAL, CAMERA_PROJECTION_ORTHOGRAPHIC, CAMERA_PROJECTION_PERSPECTIVE, CAMERA_TEMPERATURE_MAX, CAMERA_TEMPERATURE_MIN, CAMERA_TINT_MAX, CAMERA_TINT_MIN, CLOUD_QUALITY_PROFILES, CUBE_CAMERA_FACE_ORDER, CUBE_CAMERA_UPDATE_CONTINUOUS, CUBE_CAMERA_UPDATE_ONCE, CUBE_CAMERA_UPDATE_ON_DEMAND, Camera, CameraError, CloudLayer, CloudLayerCacheInvalidError, CloudLayerCapabilityMissingError, CloudLayerInvalidParameterError, CloudLayerOwnerConflictError, CloudLayerResourceFailureError, CloudQualityValue, CubeCamera, DEFAULT_CLOUD_LAYER, DEFAULT_DEPTH_OF_FIELD_PARAMS, DEPTH_OF_FIELD_PARAMS_BYTE_SIZE, DepthOfField, DepthOfFieldQualityValue, DepthOfFieldSideValue, DepthOfFieldValidationError, DirectionalLight, DirectionalShadowFilterValue, DynamicResolution, Fog, Instances, Layer, LightProbe, Lines, MAX_VOLUMETRIC_FOG_OWNERS, MeshFilter, MeshRenderer, MotionBlur, PointLight, PointLightShadow, PointShapeValue, Points, PostProcessParams, REFLECTION_PROBE_UPDATE_CONTINUOUS, REFLECTION_PROBE_UPDATE_ONCE, REFLECTION_PROBE_UPDATE_ON_CHANGE, RectAreaLight, ReflectionProbe, SKYBOX_MODE_CUBEMAP, SceneInstance, ScreenSpaceReflection, SkyboxBackground, Skylight, SortKey, SpotLight, SunCardinalityError, TONEMAP_ACES_FILMIC, TONEMAP_AGX, TONEMAP_CINEON, TONEMAP_LINEAR, TONEMAP_NEUTRAL, TONEMAP_NONE, TONEMAP_REINHARD, TONEMAP_REINHARD_EXTENDED, Visibility, VisibilityStateValue, VolumetricFog, VolumetricFogSamplingValue, attachBarrelDistortionCameraFrame, buildCubeCameraFaceViews, cameraExposureFromColumns, cameraProjectionFromF32, cloudLayerSourceKey, cloudQualityFromF32, computeInvRangeSquared, createBarrelDistortionMapping, cubeCameraUpdateIntentFromF32, cubeCameraUpdateIntentToF32, degToCos, depthOfFieldQualityCode, depthOfFieldQualityFromF32, depthOfFieldRequestFailure, depthOfFieldSideCode, depthOfFieldSideFromF32, depthOfFieldTapCount, directionalShadowQualityFromF32, extractCloudLayer, extractVolumetricFog, freezeBarrelDistortionMapping, hasVolumetricFogCapability, mapDisplayToScene, mapDisplayUvToSceneUv, mapSceneToDisplay, mapSceneUvToDisplayUv, orthographic, packDepthOfFieldParams, perspective, pointShapeFromU32, projectMeshMaterialBindingObservation, reflectionProbeUpdateIntentFromF32, reflectionProbeUpdateIntentToF32, resolveDepthOfFieldParams, resolveIntegratedVolumeConsumer, resolveSelectedVolumetricLight, resolveVisibility, resolveVolumetricFogLightPair, selectCloudLayerFrame, signedDepthOfFieldCoC, summarizeMeshMaterialBindings, validateBarrelDistortionParameters, validateCameraBloom, validateCameraColorGrading, validateCameraExposure, validateCloudLayer, validateDepthOfFieldFrameParams, validateDepthOfFieldParams, validateDirection, validateDirectionalLightData, validateDynamicResolutionCamera, validateDynamicResolutionParameters, validateLightProbeData, validatePointLightData, validatePointLightShadowData, validateRectAreaLightData, validateSpotLightData, validateVolumetricFog, visibilityStateFromU32 } from './chunk-G6HDNGY7.mjs';
5
+ import { SpriteAnimation, SpriteInstances, SpriteRegionOverride, TileLayer, Tilemap } from './chunk-X2KA6WHM.mjs';
6
+ export { getActiveCamera, setActiveCamera } from './chunk-X2KA6WHM.mjs';
7
+ export { DEFAULT_STANDARD_PROFILE, REFLECTION_PROBE_IBL_STAGES, SCENE_DATA_TEMPORAL_V1_DESCRIPTOR, SCENE_DATA_TEMPORAL_V1_SCHEMA, beginProbeIblUpdate, createIblKernelCache, createProbeIblOutput, createSceneDataCatalog, publishProbeIblOutput, resetIblKernelCaches } from './chunk-SGPUJW3F.mjs';
8
+ import { getTransparentSortConfig } from './chunk-XSFB7XXQ.mjs';
9
+ export { MaterialAuthoringContractError, MaterialTransmissionContractError, Materials, srgb } from './chunk-XSFB7XXQ.mjs';
10
+ import { renderTargetMaterialSourceIdentity } from './chunk-MXTWKZO4.mjs';
11
+ export { AtmosphereInvalidParameterError, AutoExposureCapabilityUnavailableError, AutoExposureInvalidParameterError, AutoExposureStageFailedError, AutoExposureStaleGenerationError, BarrelDistortionInvalidParameterError, DEFAULT_MOTION_BLUR_PARAMS, DynamicResolutionInvalidParameterError, DynamicResolutionRequiresTaaError, DynamicResolutionTimingUnavailableError, EnvironmentGenerationFailedError, EnvironmentSourceConflictError, FogCardinalityError, GpuDrivenPreparationError, InstanceTransformsError, MotionBlurValidationError, OwnerStageFailedError, RENDER_PHASE_CATALOG, RendererOperationError, SHADOW_ATLAS_DEFAULT_FACE_SIZE, SHADOW_ATLAS_DEFAULT_LAYERS, SceneDataUnavailableError, ShadowAtlas, TaaCapsInsufficientError, createAutoExposureError, createAutoExposureInspection, effectiveMotionBlurSampleCount, isMotionBlurIntervalValid, motionBlurExposureScale, motionBlurSampleDelta, motionBlurTemporalDemand, resolveMotionBlurParams, validateMotionBlurParams } from './chunk-MXTWKZO4.mjs';
9
12
  import { validateCookedMaterialRecord } from '@forgeax/engine-pack';
10
13
  import { ok, err, MATERIAL_TEXTURE_SLOTS } from '@forgeax/engine-types';
14
+ import { RuntimeMaterialValue, RuntimeMeshVertices, resolveAssetHandle } from '@forgeax/engine-assets-runtime';
15
+ import { Time } from '@forgeax/engine-ecs';
16
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
17
+ import { ChildOf, Children, GlobalTransform } from '@forgeax/engine-scene';
18
+ import { VIDEO_SOURCE_PROVIDER_KEY, videoSourceExtent } from '@forgeax/engine-graphics-extras';
11
19
 
12
20
  function invalid(guid, expected, reason) {
13
21
  return err({
@@ -245,6 +253,519 @@ function renderComponentsPlugin() {
245
253
  }
246
254
  };
247
255
  }
256
+ function publicationVideoFrames(world, consumers) {
257
+ if (consumers.size === 0 || !world.hasResource(VIDEO_SOURCE_PROVIDER_KEY)) return [];
258
+ const provider = world.getResource(VIDEO_SOURCE_PROVIDER_KEY);
259
+ const frames = [];
260
+ try {
261
+ for (const [entity, clips] of consumers)
262
+ for (const clip of clips) {
263
+ const source = provider.getSource(
264
+ entity,
265
+ clip
266
+ );
267
+ if (source === void 0 || videoSourceExtent(source) === void 0) continue;
268
+ frames.push({ entity, clip, frame: new VideoFrame(source) });
269
+ }
270
+ return frames;
271
+ } catch (cause) {
272
+ for (const row of frames) row.frame.close();
273
+ throw cause;
274
+ }
275
+ }
276
+
277
+ // src/publication/publisher.ts
278
+ function createRenderPublisher(world, assets, identity, capabilities, features = [], targetOwner) {
279
+ const pendingMeshContent = /* @__PURE__ */ new Set();
280
+ const releaseTransforms = registerRenderSourceSystems(world, assets, {
281
+ updateMesh: (handle) => pendingMeshContent.add(handle)
282
+ });
283
+ const source = createRenderSourceState(world);
284
+ const transforms = createGlobalTransformChangeQuery(world);
285
+ const caches = /* @__PURE__ */ new WeakMap();
286
+ const members = /* @__PURE__ */ new Set();
287
+ const publishedPrograms = /* @__PURE__ */ new Set();
288
+ const dependencies = /* @__PURE__ */ new Map();
289
+ const consumers = /* @__PURE__ */ new Map();
290
+ const pending = /* @__PURE__ */ new Set();
291
+ let videoConsumers = /* @__PURE__ */ new Map();
292
+ let pendingFeatures = [];
293
+ let pendingFeatureOwners = [];
294
+ const acknowledgedFeatures = /* @__PURE__ */ new Set();
295
+ const jointsByEntity = /* @__PURE__ */ new Map();
296
+ const skinConsumers = /* @__PURE__ */ new Map();
297
+ let frameDependencies = /* @__PURE__ */ new Set();
298
+ let catalogEpoch = -1, revision = 0, disposed = false, active = false;
299
+ let lastScannedRows = 0, inFlight = false, allocations = 0;
300
+ let storage = [new ArrayBuffer(0), new ArrayBuffer(0), new ArrayBuffer(0), new ArrayBuffer(0)];
301
+ const buffer = (index, bytes) => {
302
+ let value = storage[index];
303
+ if (value.byteLength < bytes) {
304
+ let capacity = Math.max(16, value.byteLength);
305
+ while (capacity < bytes) capacity *= 2;
306
+ value = new ArrayBuffer(capacity);
307
+ storage[index] = value;
308
+ allocations++;
309
+ }
310
+ return value;
311
+ };
312
+ const fail = (reason, subject) => err(new RenderPublicationError({ reason, subject }));
313
+ return {
314
+ identity,
315
+ inspect: () => ({
316
+ revision,
317
+ members: members.size,
318
+ assetCount: consumers.size,
319
+ scannedRows: lastScannedRows,
320
+ inFlight,
321
+ allocations
322
+ }),
323
+ prepare(sampleTimeSeconds, temporalReset = false) {
324
+ if (disposed) return fail("disposed", "publisher");
325
+ if (active || inFlight) return fail("in-flight", "publication storage has not been returned");
326
+ const baseline = revision === 0;
327
+ const featureSources = [...features];
328
+ const batch = source.projection.read();
329
+ lastScannedRows = batch.scannedRows;
330
+ const changed = new Set(pending), removed = /* @__PURE__ */ new Set();
331
+ const invalidated = new Set(pendingMeshContent);
332
+ const runtimeChanged = batch.membershipChanged || batch.changedComponents.includes(RuntimeMaterialValue) || batch.changedComponents.includes(RuntimeMeshVertices);
333
+ for (const index of batch.indices) {
334
+ const previous = source.entities.get(index), current = source.projection.entity(index);
335
+ if (previous !== void 0 && members.has(previous) && (current !== previous || !isRenderableMember(world, previous)))
336
+ removed.add(previous);
337
+ if (runtimeChanged) {
338
+ for (const handle of source.contentHandles.get(index) ?? [])
339
+ invalidated.add(handle);
340
+ if (current !== void 0) {
341
+ if (world.hasComponent(current, RuntimeMaterialValue))
342
+ invalidated.add(world.get(current, RuntimeMaterialValue).unwrap().asset);
343
+ if (world.hasComponent(current, RuntimeMeshVertices))
344
+ invalidated.add(world.get(current, RuntimeMeshVertices).unwrap().asset);
345
+ }
346
+ }
347
+ if (previous !== void 0)
348
+ for (const consumer of skinConsumers.get(previous) ?? []) changed.add(consumer);
349
+ if (current === void 0) continue;
350
+ if (isRenderableMember(world, current) && (baseline || !members.has(current) || RENDERABLE_SOURCE_COMPONENTS.some(
351
+ (component) => source.projection.changed(current, component)
352
+ )))
353
+ changed.add(current);
354
+ if (batch.membershipChanged || source.projection.changed(current, ChildOf) || source.projection.changed(current, Visibility)) {
355
+ const queue = [current], visited = /* @__PURE__ */ new Set();
356
+ while (queue.length) {
357
+ const entity = queue.pop();
358
+ if (visited.has(entity)) continue;
359
+ visited.add(entity);
360
+ if (isRenderableMember(world, entity)) changed.add(entity);
361
+ if (world.hasComponent(entity, Children))
362
+ queue.push(
363
+ ...Array.from(
364
+ world.get(entity, Children).unwrap().entities,
365
+ (child) => child
366
+ )
367
+ );
368
+ }
369
+ }
370
+ }
371
+ if (baseline || catalogEpoch !== assets.catalogEpoch) {
372
+ for (const entity of members) changed.add(entity);
373
+ for (const entity of source.entities.values())
374
+ if (isRenderableMember(world, entity)) changed.add(entity);
375
+ }
376
+ for (const handle of invalidated)
377
+ for (const entity of consumers.get(handle) ?? []) changed.add(entity);
378
+ const matrixRows = /* @__PURE__ */ new Map();
379
+ for (const span of transforms.spans().unwrap()) {
380
+ const values = span.get(GlobalTransform).world;
381
+ for (let row = 0; row < span.entities.length; row++) {
382
+ const entity = span.entities[row];
383
+ for (const consumer of skinConsumers.get(entity) ?? []) changed.add(consumer);
384
+ if (members.has(entity) && !removed.has(entity)) {
385
+ matrixRows.set(entity, values.subarray(row * 16, row * 16 + 16));
386
+ pending.add(entity);
387
+ }
388
+ }
389
+ }
390
+ for (const entity of changed) pending.add(entity);
391
+ let videoFrames = [];
392
+ try {
393
+ const frame = extractFrames(
394
+ [world],
395
+ { cameraOwner: 0, resourceOwner: 0 },
396
+ assets,
397
+ void 0,
398
+ caches,
399
+ {
400
+ ...capabilities === void 0 ? {} : renderMaterialContext(capabilities),
401
+ cull: "none",
402
+ retainHidden: true,
403
+ renderables: changed.size ? { kind: "partial", entitiesByWorld: [changed] } : "none"
404
+ }
405
+ );
406
+ const templates = [], templateIds = /* @__PURE__ */ new Map();
407
+ const upserts = [];
408
+ const programs = /* @__PURE__ */ new Map();
409
+ const nextDependencies = /* @__PURE__ */ new Map();
410
+ const assetRows = /* @__PURE__ */ new Map();
411
+ const byRenderable = /* @__PURE__ */ new Map();
412
+ for (const { entityIndex: _entity, renderableIndex, ...dispatch } of frame.dispatch) {
413
+ const rows = byRenderable.get(renderableIndex) ?? [];
414
+ rows.push(dispatch);
415
+ byRenderable.set(renderableIndex, rows);
416
+ }
417
+ const publishPrograms = (materials) => {
418
+ for (const material of materials) {
419
+ const keys = /* @__PURE__ */ new Set([
420
+ ...Object.values(material.materialProgramKeys ?? {}),
421
+ ...Object.values(material.materialSceneIndexProgramKeys ?? {}).map(
422
+ (program) => program.specializationKey
423
+ ),
424
+ ...material.materialShaderId === void 0 || material.materialShaderId.startsWith("forgeax::") ? [] : [material.materialShaderId]
425
+ ]);
426
+ for (const key of keys) {
427
+ if (publishedPrograms.has(key) || programs.has(key)) continue;
428
+ const shader = assets.shaderRegistry.findMaterialArtifact(key);
429
+ if (!shader.ok) throw shader.error;
430
+ const artifact = assets.getMaterialArtifact(key);
431
+ programs.set(key, {
432
+ key,
433
+ shader: {
434
+ source: shader.value.source,
435
+ paramSchema: shader.value.paramSchema,
436
+ ...shader.value.receipt === void 0 ? {} : { receipt: shader.value.receipt }
437
+ },
438
+ ...artifact === void 0 ? {} : { artifact }
439
+ });
440
+ }
441
+ }
442
+ };
443
+ for (let i = 0; i < frame.renderables.length; i++) {
444
+ const row = frame.renderables[i];
445
+ if (row.skin) return fail("unsupported", "source GPU skin receipt");
446
+ const { worldId: _world, entityKey, transform, ...snapshot } = row;
447
+ const template = { snapshot, dispatch: byRenderable.get(i) ?? [] };
448
+ const key = JSON.stringify(
449
+ template,
450
+ (_key, value) => value instanceof Map ? _key === "textureSources" ? [...value].map(([name, source2]) => [
451
+ name,
452
+ renderTargetMaterialSourceIdentity(source2)
453
+ ]) : [...value] : ArrayBuffer.isView(value) ? Array.from(value) : value
454
+ );
455
+ let templateId = templateIds.get(key);
456
+ if (templateId === void 0) {
457
+ templateId = templates.length;
458
+ templateIds.set(key, templateId);
459
+ templates.push(template);
460
+ }
461
+ upserts.push(entityKey, templateId);
462
+ matrixRows.set(entityKey, transform.world);
463
+ publishPrograms(row.materials);
464
+ const handles = publicationDependencies(row);
465
+ for (const lod of row.lods ?? []) {
466
+ const handle = internSharedRefFromGuid(
467
+ world,
468
+ assets,
469
+ AssetGuid.format(lod.mesh),
470
+ "MeshAsset"
471
+ );
472
+ if (handle !== void 0) handles.push(handle);
473
+ }
474
+ nextDependencies.set(entityKey, handles);
475
+ for (const handle of handles) {
476
+ if (!baseline && (consumers.has(handle) || frameDependencies.has(handle)) && !invalidated.has(handle) && catalogEpoch === assets.catalogEpoch)
477
+ continue;
478
+ const value = resolveAssetHandle(world, handle);
479
+ if (!value.ok) throw value.error;
480
+ assetRows.set(handle, value.value);
481
+ }
482
+ }
483
+ const featureRows = featureSources.map((feature) => {
484
+ const data = feature.extract({
485
+ worlds: [world],
486
+ owner: 0,
487
+ frameNumber: revision + 1,
488
+ ...capabilities === void 0 ? {} : { caps: capabilities },
489
+ ...frame.cameras[0] === void 0 ? {} : { selectedCamera: frame.cameras[0] },
490
+ visibilitySnapshots: frame.featureVisibilitySnapshots,
491
+ ...frame.cloudLayer === void 0 ? {} : { frame: { cloudLayer: frame.cloudLayer } }
492
+ }).unwrap();
493
+ return { identity: feature.identity, data };
494
+ });
495
+ const nextFrameDependencies = new Set(publicationFrameDependencies(frame));
496
+ const pendingGuids = featureSources.flatMap((feature) => {
497
+ const row = featureRows.find((row2) => row2.identity === feature.identity);
498
+ return row === void 0 ? [] : [...feature.assetDependencies?.(row.data) ?? []];
499
+ });
500
+ const seenGuids = /* @__PURE__ */ new Set();
501
+ for (const guid of pendingGuids) {
502
+ const key = guid.toLowerCase();
503
+ if (seenGuids.has(key)) continue;
504
+ seenGuids.add(key);
505
+ const asset = assets.lookup(key);
506
+ const handle = internSharedRefFromGuid(world, assets, key, "RenderFeatureAsset");
507
+ if (asset === void 0 || handle === void 0)
508
+ throw new Error(`Missing feature asset ${guid}`);
509
+ nextFrameDependencies.add(handle);
510
+ for (const ref of assets.assetCatalog.get(key)?.refs ?? []) pendingGuids.push(ref.guid);
511
+ if (asset.kind === "material") {
512
+ const material = resolveMaterialSnapshot(
513
+ handle,
514
+ world,
515
+ assets,
516
+ void 0,
517
+ void 0,
518
+ capabilities === void 0 ? void 0 : renderMaterialContext(capabilities).materialContext
519
+ );
520
+ publishPrograms([material]);
521
+ for (const dependency of publicationDependencies({
522
+ assetHandle: handle,
523
+ materials: [material]
524
+ }))
525
+ nextFrameDependencies.add(dependency);
526
+ }
527
+ }
528
+ for (const handle of nextFrameDependencies) {
529
+ if (!baseline && (consumers.has(handle) || frameDependencies.has(handle)) && !invalidated.has(handle) && catalogEpoch === assets.catalogEpoch)
530
+ continue;
531
+ const value = resolveAssetHandle(world, handle);
532
+ if (!value.ok) throw value.error;
533
+ assetRows.set(handle, value.value);
534
+ }
535
+ const emitted = new Set(frame.renderables.map((row) => row.entityKey));
536
+ for (const entity of changed)
537
+ if (members.has(entity) && !emitted.has(entity)) removed.add(entity);
538
+ for (const entity of removed) matrixRows.delete(entity);
539
+ const nextVideoConsumers = new Map(videoConsumers);
540
+ for (const entity of removed) nextVideoConsumers.delete(entity);
541
+ for (const row of frame.renderables) {
542
+ const clips = [
543
+ ...new Set(
544
+ row.materials.flatMap((material) => [
545
+ ...material.videoTextureFields?.values() ?? []
546
+ ])
547
+ )
548
+ ];
549
+ if (clips.length > 0) nextVideoConsumers.set(row.entityKey, clips);
550
+ else nextVideoConsumers.delete(row.entityKey);
551
+ }
552
+ videoFrames = publicationVideoFrames(world, nextVideoConsumers);
553
+ const transformEntities = new Uint32Array(
554
+ buffer(2, matrixRows.size * 4),
555
+ 0,
556
+ matrixRows.size
557
+ ), matrices = new Float32Array(buffer(3, matrixRows.size * 64), 0, matrixRows.size * 16);
558
+ let index = 0;
559
+ for (const [entity, matrix] of matrixRows) {
560
+ transformEntities[index] = entity;
561
+ matrices.set(matrix, index * 16);
562
+ index++;
563
+ }
564
+ const {
565
+ renderables: _rows,
566
+ dispatch: _dispatch,
567
+ visibilitySnapshots: _visibility,
568
+ featureVisibilitySnapshots: _features,
569
+ hiddenEntityReports: _hidden,
570
+ shadowCasterEntityKeys: _casters,
571
+ shadowCasterDrawKeys: _draws,
572
+ shadowCasterMembership: _membership,
573
+ ...metadata
574
+ } = frame;
575
+ const retired = /* @__PURE__ */ new Set();
576
+ const removedConsumers = /* @__PURE__ */ new Set([...removed, ...nextDependencies.keys()]);
577
+ const nextHandles = new Set([...nextDependencies.values()].flat());
578
+ const removedCounts = /* @__PURE__ */ new Map();
579
+ for (const entity of removedConsumers)
580
+ for (const handle of dependencies.get(entity) ?? [])
581
+ removedCounts.set(handle, (removedCounts.get(handle) ?? 0) + 1);
582
+ for (const [handle, count] of removedCounts)
583
+ if (count === consumers.get(handle)?.size && !nextHandles.has(handle) && !nextFrameDependencies.has(handle))
584
+ retired.add(handle);
585
+ for (const handle of frameDependencies) {
586
+ if (!nextFrameDependencies.has(handle) && !nextHandles.has(handle) && (consumers.get(handle)?.size ?? 0) === (removedCounts.get(handle) ?? 0))
587
+ retired.add(handle);
588
+ }
589
+ const upsertColumn = new Uint32Array(buffer(0, upserts.length * 4), 0, upserts.length);
590
+ upsertColumn.set(upserts);
591
+ const removedColumn = new Uint32Array(buffer(1, removed.size * 4), 0, removed.size);
592
+ removedColumn.set([...removed]);
593
+ const packet = {
594
+ ...identity,
595
+ revision: revision + 1,
596
+ base: revision,
597
+ baseline,
598
+ time: { ...world.getResource(Time) },
599
+ sampleTimeSeconds,
600
+ temporalReset,
601
+ transparentSort: getTransparentSortConfig(world),
602
+ metadata,
603
+ templates,
604
+ videoFrames,
605
+ targets: targetOwner?.snapshot() ?? [],
606
+ targetSources: publicationTargetSources(templates),
607
+ features: featureRows,
608
+ programs: [...programs.values()],
609
+ upserts: upsertColumn,
610
+ removed: removedColumn,
611
+ transformEntities,
612
+ transforms: matrices,
613
+ assets: [...assetRows].map(([handle, value]) => {
614
+ const guid = assets.guidOf(value);
615
+ return { handle, value, ...guid === void 0 ? {} : { guid } };
616
+ }),
617
+ retiredAssets: [...retired],
618
+ invalidatedAssets: [...invalidated]
619
+ };
620
+ batch.validate();
621
+ active = true;
622
+ let closed = false;
623
+ return ok({
624
+ packet,
625
+ accept: () => {
626
+ if (closed)
627
+ throw new RenderPublicationError({ reason: "revision", subject: "closed candidate" });
628
+ batch.accept();
629
+ for (const handle of invalidated) pendingMeshContent.delete(handle);
630
+ for (const key of programs.keys()) publishedPrograms.add(key);
631
+ closed = true;
632
+ active = false;
633
+ inFlight = true;
634
+ revision++;
635
+ for (const row of videoFrames) row.frame.close();
636
+ videoConsumers = nextVideoConsumers;
637
+ pendingFeatures = featureRows;
638
+ pendingFeatureOwners = featureSources;
639
+ acknowledgedFeatures.clear();
640
+ frameDependencies = nextFrameDependencies;
641
+ catalogEpoch = assets.catalogEpoch;
642
+ for (const entity of removedConsumers) {
643
+ for (const handle of dependencies.get(entity) ?? []) {
644
+ consumers.get(handle)?.delete(entity);
645
+ if (consumers.get(handle)?.size === 0) consumers.delete(handle);
646
+ }
647
+ dependencies.delete(entity);
648
+ }
649
+ for (const entity of removedConsumers) {
650
+ for (const joint of jointsByEntity.get(entity) ?? []) {
651
+ const users = skinConsumers.get(joint);
652
+ users?.delete(entity);
653
+ if (users?.size === 0) skinConsumers.delete(joint);
654
+ }
655
+ jointsByEntity.delete(entity);
656
+ }
657
+ for (const row of frame.renderables) {
658
+ if (row.skinJointEntities === void 0) continue;
659
+ jointsByEntity.set(row.entityKey, row.skinJointEntities);
660
+ for (const joint of row.skinJointEntities) {
661
+ let users = skinConsumers.get(joint);
662
+ if (users === void 0) {
663
+ users = /* @__PURE__ */ new Set();
664
+ skinConsumers.set(joint, users);
665
+ }
666
+ users.add(row.entityKey);
667
+ }
668
+ }
669
+ for (const entity of removed) members.delete(entity);
670
+ for (const [entity, handles] of nextDependencies) {
671
+ members.add(entity);
672
+ dependencies.set(entity, handles);
673
+ for (const handle of handles) {
674
+ let users = consumers.get(handle);
675
+ if (!users) {
676
+ users = /* @__PURE__ */ new Set();
677
+ consumers.set(handle, users);
678
+ }
679
+ users.add(entity);
680
+ }
681
+ }
682
+ for (const entity of matrixRows.keys()) pending.delete(entity);
683
+ for (const entity of removed) pending.delete(entity);
684
+ for (const sourceIndex of batch.indices) {
685
+ const entity = source.projection.entity(sourceIndex);
686
+ if (entity === void 0) {
687
+ source.entities.delete(sourceIndex);
688
+ source.contentHandles.delete(sourceIndex);
689
+ } else {
690
+ source.entities.set(sourceIndex, entity);
691
+ const handles = [];
692
+ if (world.hasComponent(entity, RuntimeMaterialValue))
693
+ handles.push(world.get(entity, RuntimeMaterialValue).unwrap().asset);
694
+ if (world.hasComponent(entity, RuntimeMeshVertices))
695
+ handles.push(world.get(entity, RuntimeMeshVertices).unwrap().asset);
696
+ if (handles.length) source.contentHandles.set(sourceIndex, handles);
697
+ else source.contentHandles.delete(sourceIndex);
698
+ }
699
+ }
700
+ },
701
+ discard: () => {
702
+ if (!closed) {
703
+ closed = true;
704
+ active = false;
705
+ for (const row of videoFrames) row.frame.close();
706
+ }
707
+ }
708
+ });
709
+ } catch (cause) {
710
+ for (const row of videoFrames) row.frame.close();
711
+ return fail("unsupported", cause instanceof Error ? cause.message : String(cause));
712
+ }
713
+ },
714
+ acknowledgeFeatures(acceptedRevision, receipts) {
715
+ if (disposed) return fail("disposed", "publisher");
716
+ if (!inFlight || revision !== acceptedRevision)
717
+ return fail("revision", "feature acknowledgment");
718
+ const identities = /* @__PURE__ */ new Set();
719
+ for (const receipt of receipts) {
720
+ if (identities.has(receipt.identity) || acknowledgedFeatures.has(receipt.identity))
721
+ return fail("revision", "duplicate feature acknowledgment");
722
+ const row = pendingFeatures.find((row2) => row2.identity === receipt.identity);
723
+ const feature = pendingFeatureOwners.find(
724
+ (feature2) => feature2.identity === receipt.identity
725
+ );
726
+ if (row === void 0 || feature === void 0)
727
+ return fail("shape", "unknown feature acknowledgment");
728
+ identities.add(receipt.identity);
729
+ }
730
+ for (const receipt of receipts) {
731
+ acknowledgedFeatures.add(receipt.identity);
732
+ const row = pendingFeatures.find((row2) => row2.identity === receipt.identity);
733
+ const feature = pendingFeatureOwners.find(
734
+ (feature2) => feature2.identity === receipt.identity
735
+ );
736
+ feature?.onSourceFrameSubmitted?.(row?.data, receipt.feedback);
737
+ }
738
+ return ok(void 0);
739
+ },
740
+ recycle(acceptedRevision, buffers) {
741
+ if (disposed) return fail("disposed", "publisher");
742
+ if (!inFlight || acceptedRevision !== revision)
743
+ return fail("revision", "returned storage revision");
744
+ if (buffers.length !== 4 || buffers.some((value) => !(value instanceof ArrayBuffer)))
745
+ return fail("shape", "returned storage");
746
+ storage = [...buffers];
747
+ inFlight = false;
748
+ return ok(void 0);
749
+ },
750
+ dispose() {
751
+ if (disposed) return;
752
+ disposed = true;
753
+ releaseTransforms();
754
+ members.clear();
755
+ dependencies.clear();
756
+ consumers.clear();
757
+ pending.clear();
758
+ pendingMeshContent.clear();
759
+ videoConsumers.clear();
760
+ pendingFeatures = [];
761
+ pendingFeatureOwners = [];
762
+ acknowledgedFeatures.clear();
763
+ frameDependencies.clear();
764
+ jointsByEntity.clear();
765
+ skinConsumers.clear();
766
+ }
767
+ };
768
+ }
248
769
 
249
770
  // src/scene/visibility/gpu-frame-timing.ts
250
771
  var PROTOCOL = Object.freeze({
@@ -523,6 +1044,6 @@ function estimateSingleLayerPathLength(input) {
523
1044
  };
524
1045
  }
525
1046
 
526
- export { SINGLE_LAYER_MEDIUM_SURFACE_EXAMPLE, SINGLE_LAYER_MEDIUM_SURFACE_EXAMPLES, composeSingleLayerMediumColor, composeSsrReflection, createGpuFrameTiming, estimateSingleLayerPathLength, integrateSingleLayerMedium, materialContribution, recordGpuFrameTiming, renderComponentsPlugin, renderPipelineContribution, resolveSingleLayerMediumBackground, samplerContribution, summarizeGpuFrameTiming };
1047
+ export { SINGLE_LAYER_MEDIUM_SURFACE_EXAMPLE, SINGLE_LAYER_MEDIUM_SURFACE_EXAMPLES, composeSingleLayerMediumColor, composeSsrReflection, createGpuFrameTiming, createRenderPublisher, estimateSingleLayerPathLength, integrateSingleLayerMedium, materialContribution, recordGpuFrameTiming, renderComponentsPlugin, renderPipelineContribution, resolveSingleLayerMediumBackground, samplerContribution, summarizeGpuFrameTiming };
527
1048
  //# sourceMappingURL=index.mjs.map
528
1049
  //# sourceMappingURL=index.mjs.map