@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
@@ -1,16 +1,15 @@
1
- import { TRANSPARENT_SORT_MODE_LAYER_Z, TRANSPARENT_SORT_MODE_LAYER_Y } from './chunk-RXZ3RGOU.mjs';
2
- import { DEFAULT_CLUSTER_GRID, DEFAULT_STANDARD_PROFILE, createIblKernelCache, MAX_LIGHTS, CLUSTER_GRID_STRIDE_U32, LIGHT_INDEX_LIST_CAPACITY, createStandardClusterLayout } from './chunk-OCDLEI6I.mjs';
3
- import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from './chunk-BLXGONR2.mjs';
4
- import { GPU_SHADER_STAGE_COMPUTE, GPU_BUFFER_USAGE_STORAGE, GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM, createHdrpBindGroupLayoutDescriptor, COOKIE_MATRIX_BYTES, IES_SLICE_WIDTH, IES_SLICE_HEIGHT, COOKIE_SLICE_SIZE, GPU_SHADER_STAGE_VERTEX, GPU_SHADER_STAGE_FRAGMENT, GPU_BUFFER_USAGE_INDEX, GPU_BUFFER_USAGE_VERTEX, isStandardPbrMaterialShader, probeBlendRecordOffset, worldEntityKey, instanceCollectionCacheKey, PROBE_BLEND_RECORD_BYTE_SIZE, GPU_BUFFER_USAGE_MAP_READ, getOpaqueResourceIdentity, pbrSkinMeshDynamicOffsets, gpuDrivenShadowDrawKey, SHADOW_CASTER_SHADER_ID, shadowCasterVariantSet, buildPbrMaterialUserRegionEntries, buildBindGroupLayoutDescriptor, GPU_BUFFER_USAGE_COPY_SRC, GPU_BUFFER_USAGE_INDIRECT, EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES, PROBE_BLEND_RECORD_STRIDE, gpuDrivenSourceDrawItemIndex, matchPass, createPbrSkinMeshBindGroupEntries, physicalTextureFields, isCanonicalStandardPbrMaterialShader, resolveRenderTargetMaterialSource, SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET, isStandardPbrSkinMaterialShader, SKIN_MATERIAL_SHADER_ID, gpuDrivenDrawKey, materialBindGroupLayoutIdentity } from './chunk-SHFUFJ5N.mjs';
5
- import { GPU_TEXTURE_USAGE_RENDER_ATTACHMENT, GPU_TEXTURE_USAGE_COPY_SRC, VertexColorVariantConflictError, EquirectProjectionFailedError, SHADOW_ATLAS_DEFAULT_LAYERS, SHADOW_ATLAS_DEFAULT_FACE_SIZE, ShadowAtlas, PointShadowAtlasUninitializedError, PointShadowAtlasBoundsViolationError, StandardClusterTransportUnavailableError, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_TEXTURE_BINDING, instanceUploadRangesForResident, createVisibilityBudget, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, StandardLightBudgetExceededError, RendererOperationError, VideoUploadUnsupportedError, StandardClusterIndexOverflowError, FXAA_POST_PROCESS_ID } from './chunk-WEX45HKH.mjs';
1
+ import { DEFAULT_CLUSTER_GRID, DEFAULT_STANDARD_PROFILE, createIblKernelCache, STANDARD_PBR_UBO_SIZE, MATERIAL_PER_ENTITY_STRIDE, MAX_LIGHTS, CLUSTER_GRID_STRIDE_U32, LIGHT_INDEX_LIST_CAPACITY, createStandardClusterLayout } from './chunk-SGPUJW3F.mjs';
2
+ import { TRANSPARENT_SORT_MODE_LAYER_Z, TRANSPARENT_SORT_MODE_LAYER_Y, SPRITE_PREMULTIPLIED_ALPHA_BLEND } from './chunk-XSFB7XXQ.mjs';
3
+ import { probeBlendRecordOffset, PROBE_BLEND_RECORD_BYTE_SIZE, PROBE_BLEND_RECORD_STRIDE } from './chunk-RIPAEGI6.mjs';
4
+ import { GPU_TEXTURE_USAGE_RENDER_ATTACHMENT, GPU_TEXTURE_USAGE_COPY_SRC, VertexColorVariantConflictError, GPU_SHADER_STAGE_COMPUTE, GPU_BUFFER_USAGE_STORAGE, GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM, createHdrpBindGroupLayoutDescriptor, EquirectProjectionFailedError, SHADOW_ATLAS_DEFAULT_LAYERS, COOKIE_MATRIX_BYTES, SHADOW_ATLAS_DEFAULT_FACE_SIZE, ShadowAtlas, PointShadowAtlasUninitializedError, PointShadowAtlasBoundsViolationError, IES_SLICE_WIDTH, IES_SLICE_HEIGHT, COOKIE_SLICE_SIZE, StandardClusterTransportUnavailableError, GPU_SHADER_STAGE_VERTEX, GPU_SHADER_STAGE_FRAGMENT, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_TEXTURE_BINDING, GPU_BUFFER_USAGE_INDEX, GPU_BUFFER_USAGE_VERTEX, isStandardPbrMaterialShader, worldEntityKey, instanceCollectionCacheKey, instanceUploadRangesForResident, createVisibilityBudget, GPU_BUFFER_USAGE_MAP_READ, getOpaqueResourceIdentity, pbrSkinMeshDynamicOffsets, gpuDrivenShadowDrawKey, SHADOW_CASTER_SHADER_ID, shadowCasterVariantSet, buildPbrMaterialUserRegionEntries, buildBindGroupLayoutDescriptor, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, GPU_BUFFER_USAGE_COPY_SRC, GPU_BUFFER_USAGE_INDIRECT, StandardLightBudgetExceededError, EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES, gpuDrivenSourceDrawItemIndex, matchPass, createPbrSkinMeshBindGroupEntries, physicalTextureFields, isCanonicalStandardPbrMaterialShader, RendererOperationError, resolveRenderTargetMaterialSource, VideoUploadUnsupportedError, SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET, StandardClusterIndexOverflowError, isStandardPbrSkinMaterialShader, SKIN_MATERIAL_SHADER_ID, FXAA_POST_PROCESS_ID, gpuDrivenDrawKey, materialBindGroupLayoutIdentity } from './chunk-MXTWKZO4.mjs';
6
5
  import { derive, ok, err as err$1, toShared, ASSET_ERROR_HINTS, deriveTextureLayout, handleSlot, resolveMaterialTextureCoordinates, KNOWN_PASS_KINDS } from '@forgeax/engine-types';
7
6
  import { RenderGraphError } from '@forgeax/engine-render-graph';
8
7
  import { ok as ok$1, err, RhiError } from '@forgeax/engine-rhi';
9
8
  import { mat3, vec3, mat4 } from '@forgeax/engine-math';
10
9
  import { deriveVertexLayoutProjection, DEFAULT_VERTEX_ATTRIBUTE_MAP, deriveVertexBufferLayout, deriveVertexBufferLayoutFromProjection } from '@forgeax/engine-geometry';
11
10
  import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
12
- import { probeVideoHighPerfUpload, VIDEO_ELEMENT_PROVIDER_KEY } from '@forgeax/engine-graphics-extras';
13
- import { DEFAULT_STANDARD_PBR_PARAM_SCHEMA, STANDARD_PIPELINE_PARAM_SCHEMA, GPU_DRIVEN_MATERIAL_ROW_BYTES, findVariantByKey, DEFAULT_MSDF_TEXT_PARAM_SCHEMA, DEFAULT_SPRITE_PARAM_SCHEMA, DEFAULT_UNLIT_PARAM_SCHEMA, STANDARD_PHYSICAL_TEXTURE_FIELDS, STANDARD_TEXTURE_MASK_OVERRIDE } from '@forgeax/engine-shader';
11
+ import { probeVideoHighPerfUpload, VIDEO_SOURCE_PROVIDER_KEY, videoSourceExtent } from '@forgeax/engine-graphics-extras';
12
+ import { STANDARD_PIPELINE_PARAM_SCHEMA, GPU_DRIVEN_MATERIAL_ROW_BYTES, findVariantByKey, DEFAULT_MSDF_TEXT_PARAM_SCHEMA, DEFAULT_SPRITE_PARAM_SCHEMA, DEFAULT_UNLIT_PARAM_SCHEMA, STANDARD_PHYSICAL_TEXTURE_FIELDS, STANDARD_TEXTURE_MASK_OVERRIDE } from '@forgeax/engine-shader';
14
13
  import { isCompressedFormat, bytesPerRow, blockParamsForFormat } from '@forgeax/engine-codec';
15
14
 
16
15
  // src/pipeline/render-extent.ts
@@ -2520,7 +2519,7 @@ var POINTS_LINES_VIEW_BUFFER_SIZE = POINTS_LINES_VIEW_SLOT_STRIDE * POINTS_LINES
2520
2519
  var VIEW_UNIFORM_SLOT_STRIDE = 1024;
2521
2520
  var POINT_SHADOW_VIEW_SLOT_COUNT = 24;
2522
2521
  var CUBE_CAPTURE_VIEW_SLOT_BASE = 1 + POINT_SHADOW_VIEW_SLOT_COUNT;
2523
- var REFLECTION_PROBE_VIEW_SLOT_BASE = CUBE_CAPTURE_VIEW_SLOT_BASE + 6;
2522
+ var REFLECTION_PROBE_VIEW_SLOT_BASE = CUBE_CAPTURE_VIEW_SLOT_BASE + 6 + 1;
2524
2523
  var REFLECTION_PROBE_VIEW_SLOT_COUNT = 16;
2525
2524
  var VIEW_UNIFORM_BUFFER_SIZE = VIEW_UNIFORM_SLOT_STRIDE * (REFLECTION_PROBE_VIEW_SLOT_BASE + REFLECTION_PROBE_VIEW_SLOT_COUNT);
2526
2525
  function pointShadowViewOffset(layer, face) {
@@ -4408,6 +4407,108 @@ var GpuTexture = class {
4408
4407
  }
4409
4408
  };
4410
4409
 
4410
+ // src/record/sprite-instance-buffer.ts
4411
+ function interleaveSpriteInstanceBuffer(transforms, regions, includePrevious = false) {
4412
+ const count = transforms.length / 16;
4413
+ const stride = includePrevious ? 36 : 20;
4414
+ const regionOffset = includePrevious ? 32 : 16;
4415
+ const out = new Float32Array(count * stride);
4416
+ for (let i = 0; i < count; i++) {
4417
+ const dstBase = i * stride;
4418
+ const transformBase = i * 16;
4419
+ const regionBase = i * 4;
4420
+ for (let k = 0; k < 16; k++) out[dstBase + k] = transforms[transformBase + k] ?? 0;
4421
+ if (includePrevious) {
4422
+ for (let k = 0; k < 16; k++) {
4423
+ out[dstBase + 16 + k] = transforms[transformBase + k] ?? 0;
4424
+ }
4425
+ }
4426
+ for (let k = 0; k < 4; k++) {
4427
+ out[dstBase + regionOffset + k] = regions[regionBase + k] ?? 0;
4428
+ }
4429
+ }
4430
+ return out;
4431
+ }
4432
+ function spriteInstancesCacheHit(entry, snapshot, requestedBytes) {
4433
+ return entry !== void 0 && entry.uploadedArchVersion === snapshot.archVersion && entry.uploadedByteLength === requestedBytes;
4434
+ }
4435
+ function resolveSpriteInstancesBuffer(c, spriteEntry, fallbackBuffer, fallbackCount) {
4436
+ const { runtime, frameState } = c;
4437
+ let buffer = fallbackBuffer;
4438
+ let count = fallbackCount;
4439
+ const spriteInstancesSnap = spriteEntry.source.spriteInstances;
4440
+ if (spriteInstancesSnap !== void 0) {
4441
+ if (spriteInstancesSnap.instanceCount === 0) return { buffer, count: 0 };
4442
+ const uniformFallback = runtime.device.caps.storageBuffer === false;
4443
+ const interleaved = interleaveSpriteInstanceBuffer(
4444
+ spriteInstancesSnap.transforms,
4445
+ spriteInstancesSnap.regions,
4446
+ !uniformFallback
4447
+ );
4448
+ const requestedBytes = interleaved.byteLength;
4449
+ const cap = runtime.device.limits.maxStorageBufferBindingSize;
4450
+ if (typeof cap === "number" && requestedBytes > cap) {
4451
+ runtime.errorRegistry.fire(
4452
+ new RhiError({
4453
+ code: "limit-exceeded",
4454
+ expected: `requestedBytes (${requestedBytes}) <= maxStorageBufferBindingSize (${cap})`,
4455
+ hint: "reduce SpriteInstances instance count to fit within device.limits.maxStorageBufferBindingSize (144 bytes per instance: current mat4 64B + previous mat4 64B + region 16B)",
4456
+ detail: {
4457
+ maxStorageBufferBindingSize: cap,
4458
+ requestedBytes
4459
+ }
4460
+ })
4461
+ );
4462
+ } else {
4463
+ const cachedSpriteInst = frameState.instanceBuffers.get(
4464
+ worldEntityKey(spriteEntry.source.worldId, spriteInstancesSnap.cacheKey)
4465
+ );
4466
+ let activeSpriteInst = null;
4467
+ if (spriteInstancesCacheHit(cachedSpriteInst, spriteInstancesSnap, requestedBytes)) {
4468
+ activeSpriteInst = cachedSpriteInst ?? null;
4469
+ } else if (requestedBytes > 0) {
4470
+ const bufRes = runtime.device.createBuffer({
4471
+ size: requestedBytes,
4472
+ usage: (uniformFallback ? GPU_BUFFER_USAGE_UNIFORM : GPU_BUFFER_USAGE_STORAGE) | GPU_BUFFER_USAGE_COPY_DST,
4473
+ mappedAtCreation: false
4474
+ });
4475
+ if (!bufRes.ok) {
4476
+ runtime.errorRegistry.fire(bufRes.error);
4477
+ } else {
4478
+ if (cachedSpriteInst !== void 0 && !cachedSpriteInst.buffer.isDestroyed) {
4479
+ const r = cachedSpriteInst.buffer.destroy();
4480
+ if (!r.ok) runtime.errorRegistry.fire(r.error);
4481
+ }
4482
+ const newBuf = new GpuBuffer(runtime.device, bufRes.value);
4483
+ activeSpriteInst = {
4484
+ buffer: newBuf,
4485
+ uploadedArchVersion: spriteInstancesSnap.archVersion,
4486
+ uploadedByteLength: requestedBytes
4487
+ };
4488
+ frameState.instanceBuffers.set(
4489
+ worldEntityKey(spriteEntry.source.worldId, spriteInstancesSnap.cacheKey),
4490
+ activeSpriteInst
4491
+ );
4492
+ }
4493
+ }
4494
+ if (activeSpriteInst !== null && requestedBytes > 0) {
4495
+ const writeRes = runtime.device.queue.writeBuffer(
4496
+ activeSpriteInst.buffer.handle,
4497
+ 0,
4498
+ interleaved
4499
+ );
4500
+ if (!writeRes.ok) {
4501
+ runtime.errorRegistry.fire(writeRes.error);
4502
+ } else {
4503
+ buffer = activeSpriteInst.buffer.handle;
4504
+ count = spriteInstancesSnap.instanceCount;
4505
+ }
4506
+ }
4507
+ }
4508
+ }
4509
+ return { buffer, count };
4510
+ }
4511
+
4411
4512
  // src/record/fold-instance-buffer.ts
4412
4513
  function resolveFoldInstanceBuffer(c, bucket, headIndex) {
4413
4514
  const { runtime, frameState } = c;
@@ -4526,7 +4627,7 @@ var COMPRESSION_FEATURES = [
4526
4627
  function transmissionBackdropAvailable(limit) {
4527
4628
  return limit === void 0 || limit >= STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES;
4528
4629
  }
4529
- var STANDARD_PHYSICAL_REQUIRED_SAMPLED_TEXTURES = 22;
4630
+ var STANDARD_PHYSICAL_REQUIRED_SAMPLED_TEXTURES = 23;
4530
4631
  function deriveDeviceFeatureAdmission(adapter, options) {
4531
4632
  const requiredFeatures = COMPRESSION_FEATURES.filter((feature) => adapter.features.has(feature));
4532
4633
  const timestampRequested = options?.gpuPassTiming !== void 0 || options?.captureGpuTimings === true;
@@ -4577,10 +4678,6 @@ function assembleMaterialWithSkylightEntries(materialEntries, skylight, transmis
4577
4678
  },
4578
4679
  {
4579
4680
  binding: iblStart + 5,
4580
- resource: { kind: "sampler", value: skylight.brdfLutSampler }
4581
- },
4582
- {
4583
- binding: iblStart + 6,
4584
4681
  resource: { kind: "buffer", value: { buffer: skylight.intensityBuffer } }
4585
4682
  }
4586
4683
  ];
@@ -4915,116 +5012,6 @@ function deriveRenderDataCubemap(source) {
4915
5012
  cubeUsage: GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING | GPU_TEXTURE_USAGE_COPY_DST | GPU_TEXTURE_USAGE_COPY_SRC
4916
5013
  });
4917
5014
  }
4918
- var STANDARD_PBR_UBO_SIZE = derive(DEFAULT_STANDARD_PBR_PARAM_SCHEMA).uboLayout.totalBytes;
4919
- var MATERIAL_PER_ENTITY_STRIDE = Math.ceil(STANDARD_PBR_UBO_SIZE / 256) * 256;
4920
- function resolveSurfaceProfile(storageFormat, viewFormat, facts) {
4921
- if (facts.surfaceViewFormats) {
4922
- return ok$1({
4923
- kind: "dual-view",
4924
- storageFormat,
4925
- viewFormat,
4926
- viewFormats: [viewFormat],
4927
- hasDisplayEndpoint: true
4928
- });
4929
- }
4930
- if (!facts.rawAttachment || !facts.floatRenderAttachment) {
4931
- return err(
4932
- new RhiError({
4933
- code: "webgpu-runtime-error",
4934
- expected: "raw surface attachment and rgba16float render attachment capabilities",
4935
- hint: "surface profile cannot establish a raw-only linear output route",
4936
- detail: {
4937
- error: {
4938
- code: "surface-raw-endpoint-failed",
4939
- message: "raw-only surface capabilities are incomplete"
4940
- }
4941
- }
4942
- })
4943
- );
4944
- }
4945
- return ok$1({
4946
- kind: "raw-only",
4947
- storageFormat,
4948
- viewFormat: storageFormat,
4949
- viewFormats: [],
4950
- hasDisplayEndpoint: false
4951
- });
4952
- }
4953
- function resolveSurfaceFormatPair(_backendKind, storage, view) {
4954
- return { storage, view };
4955
- }
4956
- function surfaceCapabilityFacts(device, storageFormat) {
4957
- const internal = device;
4958
- return {
4959
- surfaceViewFormats: internal.surfaceViewFormats ?? device.caps?.backendKind !== "wgpu-webgl2",
4960
- rawAttachment: storageFormat === "rgba8unorm" || storageFormat === "bgra8unorm",
4961
- floatRenderAttachment: device.caps?.rgba16floatRenderable ?? true
4962
- };
4963
- }
4964
- function configureSurface(context, device, format, colorAttachmentFormat) {
4965
- const backendKind = device.caps?.backendKind ?? "webgpu";
4966
- const isWebGl2 = backendKind === "wgpu-webgl2";
4967
- const surfaceFormats = resolveSurfaceFormatPair(
4968
- backendKind,
4969
- format,
4970
- colorAttachmentFormat
4971
- );
4972
- const profile = resolveSurfaceProfile(
4973
- surfaceFormats.storage,
4974
- surfaceFormats.view,
4975
- surfaceCapabilityFacts(device, surfaceFormats.storage)
4976
- );
4977
- if (!profile.ok) return profile;
4978
- const supportsTextureBinding = backendKind !== "wgpu-webgl2" && (device.caps?.storageBuffer ?? true);
4979
- const configured = context.configure({
4980
- device,
4981
- format: surfaceFormats.storage,
4982
- alphaMode: isWebGl2 ? "opaque" : "premultiplied",
4983
- usage: GPU_TEXTURE_USAGE_RENDER_ATTACHMENT | (supportsTextureBinding ? GPU_TEXTURE_USAGE_TEXTURE_BINDING : 0) | (isWebGl2 ? 0 : GPU_TEXTURE_USAGE_COPY_SRC),
4984
- viewFormats: [...profile.value.viewFormats]
4985
- });
4986
- if (!configured.ok) return configured;
4987
- if (isWebGl2 && (context.presentationProof === void 0 || !context.presentationProof.descriptor || !context.presentationProof.acquisition || !context.presentationProof.validation || typeof context.presentationProof.surfaceIdentity !== "string" || context.presentationProof.surfaceIdentity.length === 0 || context.presentationProof.requested === void 0 || context.presentationProof.validated === void 0 || JSON.stringify(context.presentationProof.requested) !== JSON.stringify(context.presentationProof.validated))) {
4988
- return err(
4989
- new RhiError({
4990
- code: "webgpu-runtime-error",
4991
- expected: "WebGL2 surface storage has descriptor, acquisition, and validation proof",
4992
- hint: "run the concrete presentation probe and retain the last-known-good graph when proof is absent",
4993
- detail: {
4994
- error: {
4995
- code: "surface-raw-endpoint-failed",
4996
- message: "surface storage raw endpoint proof is incomplete"
4997
- }
4998
- }
4999
- })
5000
- );
5001
- }
5002
- return ok$1(void 0);
5003
- }
5004
- function selectSwapChainFormat(storageBufferCapable, surfaceViewFormats = true) {
5005
- if (!storageBufferCapable) {
5006
- return {
5007
- storage: "rgba8unorm",
5008
- view: surfaceViewFormats ? "rgba8unorm-srgb" : "rgba8unorm"
5009
- };
5010
- }
5011
- const nav = globalThis.navigator;
5012
- const gpu = nav?.gpu;
5013
- const getPreferred = gpu?.getPreferredCanvasFormat;
5014
- if (gpu !== void 0 && typeof getPreferred === "function") {
5015
- const storage = getPreferred.call(gpu);
5016
- const view = storage === "rgba8unorm" ? "rgba8unorm-srgb" : storage === "bgra8unorm" ? "bgra8unorm-srgb" : storage;
5017
- return {
5018
- storage,
5019
- view: surfaceViewFormats ? view : storage
5020
- };
5021
- }
5022
- return {
5023
- storage: "rgba8unorm",
5024
- view: surfaceViewFormats ? "rgba8unorm-srgb" : "rgba8unorm",
5025
- fallbackReason: "preferred-canvas-format-missing"
5026
- };
5027
- }
5028
5015
 
5029
5016
  // src/record/main-pass-material.ts
5030
5017
  function selectMaterialGroup2(clusterGroup, meshGroup, group2Contract) {
@@ -5163,8 +5150,8 @@ function clearVideoUploadFailureEpisode(store, entityKey, clip) {
5163
5150
  }
5164
5151
  function videoTextureView(world, store, runtime, entityKey, clip, highPerfAvailable) {
5165
5152
  if (store === void 0) return void 0;
5166
- const provider = world.hasResource(VIDEO_ELEMENT_PROVIDER_KEY) ? world.getResource(VIDEO_ELEMENT_PROVIDER_KEY) : void 0;
5167
- const element = provider?.getElement(entityKey, clip);
5153
+ const provider = !("resolveAsset" in world) && world.hasResource(VIDEO_SOURCE_PROVIDER_KEY) ? world.getResource(VIDEO_SOURCE_PROVIDER_KEY) : void 0;
5154
+ const element = "resolveAsset" in world ? world.videoFrame(entityKey, clip) : provider?.getSource(entityKey, clip);
5168
5155
  if (element === void 0 && !highPerfAvailable) {
5169
5156
  if (markVideoUploadFailureEpisode(store, entityKey, clip)) {
5170
5157
  runtime.errorRegistry.fire(new VideoUploadUnsupportedError());
@@ -5175,9 +5162,9 @@ function videoTextureView(world, store, runtime, entityKey, clip, highPerfAvaila
5175
5162
  clearVideoUploadFailureEpisode(store, entityKey, clip);
5176
5163
  return store.getView(clip);
5177
5164
  }
5178
- const width = element.videoWidth;
5179
- const height = element.videoHeight;
5180
- if (width <= 0 || height <= 0 || element.readyState < 2) return store.getView(clip);
5165
+ const extent = videoSourceExtent(element);
5166
+ if (extent === void 0) return store.getView(clip);
5167
+ const { width, height } = extent;
5181
5168
  const uploaded = store.uploadFrame(clip, element, width, height);
5182
5169
  if (uploaded === void 0) return store.getView(clip);
5183
5170
  if (!uploaded.ok) {
@@ -5431,7 +5418,7 @@ function recordIblMaterialBinding(frameState, materialBgl, bindGroup, entries, i
5431
5418
  if (receipt === void 0) return;
5432
5419
  const skylightBindingStart = entries.findIndex((entry) => entry.binding === iblStart);
5433
5420
  if (skylightBindingStart < 0) return;
5434
- const iblEntries = entries.slice(skylightBindingStart, skylightBindingStart + 7);
5421
+ const iblEntries = entries.slice(skylightBindingStart, skylightBindingStart + 6);
5435
5422
  const projected = [];
5436
5423
  for (const entry of iblEntries) {
5437
5424
  if (entry.resource.kind === "externalTexture") continue;
@@ -5457,8 +5444,9 @@ function recordIblMaterialBinding(frameState, materialBgl, bindGroup, entries, i
5457
5444
  };
5458
5445
  }
5459
5446
  function isMaterialBgAssemblyCacheHit(cached, material, materialBgl, materialBuffer, skylightResources, materialResourceEpoch, transmissionBackdropView, sceneMaterialBuffer, surfaceRawDepthView) {
5460
- if (transmissionBackdropView != null || surfaceRawDepthView != null) return false;
5461
- return cached?.material === material && cached.materialResourceEpoch === materialResourceEpoch && cached.materialBgl === materialBgl && cached.materialBuffer === materialBuffer && cached.sceneMaterialBuffer === sceneMaterialBuffer && cached.skylightResources.irradianceView === skylightResources.irradianceView && cached.skylightResources.irradianceSampler === skylightResources.irradianceSampler && cached.skylightResources.prefilterView === skylightResources.prefilterView && cached.skylightResources.skylightPrefilterView === skylightResources.skylightPrefilterView && cached.skylightResources.prefilterSampler === skylightResources.prefilterSampler && cached.skylightResources.brdfLutView === skylightResources.brdfLutView && cached.skylightResources.brdfLutSampler === skylightResources.brdfLutSampler && cached.skylightResources.intensityBuffer === skylightResources.intensityBuffer;
5447
+ if (transmissionBackdropView != null || surfaceRawDepthView != null || (material.textureSources?.size ?? 0) > 0)
5448
+ return false;
5449
+ return cached?.material === material && cached.materialResourceEpoch === materialResourceEpoch && cached.materialBgl === materialBgl && cached.materialBuffer === materialBuffer && cached.sceneMaterialBuffer === sceneMaterialBuffer && cached.skylightResources.irradianceView === skylightResources.irradianceView && cached.skylightResources.irradianceSampler === skylightResources.irradianceSampler && cached.skylightResources.prefilterView === skylightResources.prefilterView && cached.skylightResources.skylightPrefilterView === skylightResources.skylightPrefilterView && cached.skylightResources.prefilterSampler === skylightResources.prefilterSampler && cached.skylightResources.brdfLutView === skylightResources.brdfLutView && cached.skylightResources.intensityBuffer === skylightResources.intensityBuffer;
5462
5450
  }
5463
5451
  function buildPerSubmeshMaterialBg(deps, submeshMaterial, entityKey, materialWorld = deps.world, materialShaderId = submeshMaterial.materialShaderId) {
5464
5452
  const {
@@ -5564,10 +5552,6 @@ function buildPerSubmeshMaterialBg(deps, submeshMaterial, entityKey, materialWor
5564
5552
  },
5565
5553
  {
5566
5554
  binding: 6 + smUserRegionFields.length * 2,
5567
- resource: { kind: "sampler", value: effectiveSkylightResources.brdfLutSampler }
5568
- },
5569
- {
5570
- binding: 7 + smUserRegionFields.length * 2,
5571
5555
  resource: {
5572
5556
  kind: "buffer",
5573
5557
  value: { buffer: effectiveSkylightResources.intensityBuffer }
@@ -5760,7 +5744,7 @@ function buildPerSubmeshMaterialBg(deps, submeshMaterial, entityKey, materialWor
5760
5744
  "miss"
5761
5745
  );
5762
5746
  }
5763
- if (smMaterialHandle !== void 0 && !smHasVideoFields && materialResourcesResident && !hasActiveTransmissionBackdrop) {
5747
+ if (smMaterialHandle !== void 0 && !smHasVideoFields && (submeshMaterial.textureSources?.size ?? 0) === 0 && materialResourcesResident && !hasActiveTransmissionBackdrop) {
5764
5748
  if (materialCacheKey !== void 0) {
5765
5749
  materialBgAssemblyCache.set(materialCacheKey, {
5766
5750
  material: submeshMaterial,
@@ -5814,7 +5798,6 @@ function resolveMaterialSkylight(runtime, pipelineState, skylight, skylightCount
5814
5798
  prefilterView: activeViews.pref,
5815
5799
  prefilterSampler: skylightFallback.sampler,
5816
5800
  brdfLutView: activeViews.brdf,
5817
- brdfLutSampler: skylightFallback.sampler,
5818
5801
  intensityBuffer: skylightFallback.intensityBuffer
5819
5802
  } : {
5820
5803
  irradianceView: skylightFallback.irradianceView,
@@ -5822,7 +5805,6 @@ function resolveMaterialSkylight(runtime, pipelineState, skylight, skylightCount
5822
5805
  prefilterView: skylightFallback.prefilterView,
5823
5806
  prefilterSampler: skylightFallback.sampler,
5824
5807
  brdfLutView: skylightFallback.brdfLutView,
5825
- brdfLutSampler: skylightFallback.sampler,
5826
5808
  intensityBuffer: skylightFallback.intensityBuffer
5827
5809
  };
5828
5810
  return { skylightResources, activeViews };
@@ -7000,6 +6982,22 @@ function resolveStorageInstanceChunks(c, entry, inst, cap, probeBuffer, probeOff
7000
6982
  function resolveGeometryInstanceBuffer(c, entry, identityInstanceDraws, useProbeBlend) {
7001
6983
  const { runtime, pipelineState, frameState } = c;
7002
6984
  const inst = entry.source.instances;
6985
+ if (entry.source.spriteInstances !== void 0) {
6986
+ const { buffer, count } = resolveSpriteInstancesBuffer(
6987
+ c,
6988
+ entry,
6989
+ pipelineState.identityInstanceBuffer,
6990
+ 0
6991
+ );
6992
+ return count === 0 ? [] : [
6993
+ {
6994
+ instanceBuffer: buffer,
6995
+ instanceBindGroup: resolveGeometryInstancesBindGroup(c, buffer, void 0),
6996
+ probeOffset: -1,
6997
+ instanceCount: count
6998
+ }
6999
+ ];
7000
+ }
7003
7001
  const probeBinding = !useProbeBlend || !runtime.device.caps.storageBuffer || entry.source.probeBlendRecord === void 0 ? void 0 : resolveProbeBlendBuffer(
7004
7002
  c,
7005
7003
  entry.source.probeBlendRecord,
@@ -7357,30 +7355,6 @@ function resolveGeometryInstancesBindGroup(c, instanceBuffer, probeBuffer) {
7357
7355
  bindGroupCounts
7358
7356
  );
7359
7357
  }
7360
- function interleaveSpriteInstanceBuffer(transforms, regions, includePrevious = false) {
7361
- const count = transforms.length / 16;
7362
- const stride = includePrevious ? 36 : 20;
7363
- const regionOffset = includePrevious ? 32 : 16;
7364
- const out = new Float32Array(count * stride);
7365
- for (let i = 0; i < count; i++) {
7366
- const dstBase = i * stride;
7367
- const transformBase = i * 16;
7368
- const regionBase = i * 4;
7369
- for (let k = 0; k < 16; k++) out[dstBase + k] = transforms[transformBase + k] ?? 0;
7370
- if (includePrevious) {
7371
- for (let k = 0; k < 16; k++) {
7372
- out[dstBase + 16 + k] = transforms[transformBase + k] ?? 0;
7373
- }
7374
- }
7375
- for (let k = 0; k < 4; k++) {
7376
- out[dstBase + regionOffset + k] = regions[regionBase + k] ?? 0;
7377
- }
7378
- }
7379
- return out;
7380
- }
7381
- function spriteInstancesCacheHit(entry, snapshot, requestedBytes) {
7382
- return entry !== void 0 && entry.uploadedArchVersion === snapshot.archVersion && entry.uploadedByteLength === requestedBytes;
7383
- }
7384
7358
  function computeSplitLdrSprite(validatedOrdered, tonemapActive, dispatch) {
7385
7359
  if (tonemapActive) return false;
7386
7360
  if (dispatch !== void 0 && dispatch.length > 0) {
@@ -7767,81 +7741,6 @@ function recordSpriteEntityDraws(c, spritePass, matchedIndices, resolveMaterialB
7767
7741
  c.onRenderableDraw?.(spriteEntry, 0);
7768
7742
  }
7769
7743
  }
7770
- function resolveSpriteInstancesBuffer(c, spriteEntry, fallbackBuffer, fallbackCount) {
7771
- const { runtime, frameState } = c;
7772
- let buffer = fallbackBuffer;
7773
- let count = fallbackCount;
7774
- const spriteInstancesSnap = spriteEntry.source.spriteInstances;
7775
- if (spriteInstancesSnap !== void 0) {
7776
- const uniformFallback = runtime.device.caps.storageBuffer === false;
7777
- const interleaved = interleaveSpriteInstanceBuffer(
7778
- spriteInstancesSnap.transforms,
7779
- spriteInstancesSnap.regions,
7780
- !uniformFallback
7781
- );
7782
- const requestedBytes = interleaved.byteLength;
7783
- const cap = runtime.device.limits.maxStorageBufferBindingSize;
7784
- if (typeof cap === "number" && requestedBytes > cap) {
7785
- runtime.errorRegistry.fire(
7786
- new RhiError({
7787
- code: "limit-exceeded",
7788
- expected: `requestedBytes (${requestedBytes}) <= maxStorageBufferBindingSize (${cap})`,
7789
- hint: "reduce SpriteInstances instance count to fit within device.limits.maxStorageBufferBindingSize (144 bytes per instance: current mat4 64B + previous mat4 64B + region 16B)",
7790
- detail: {
7791
- maxStorageBufferBindingSize: cap,
7792
- requestedBytes
7793
- }
7794
- })
7795
- );
7796
- } else {
7797
- const cachedSpriteInst = frameState.instanceBuffers.get(
7798
- worldEntityKey(spriteEntry.source.worldId, spriteInstancesSnap.cacheKey)
7799
- );
7800
- let activeSpriteInst = null;
7801
- if (spriteInstancesCacheHit(cachedSpriteInst, spriteInstancesSnap, requestedBytes)) {
7802
- activeSpriteInst = cachedSpriteInst ?? null;
7803
- } else if (requestedBytes > 0) {
7804
- const bufRes = runtime.device.createBuffer({
7805
- size: requestedBytes,
7806
- usage: (uniformFallback ? GPU_BUFFER_USAGE_UNIFORM : GPU_BUFFER_USAGE_STORAGE) | GPU_BUFFER_USAGE_COPY_DST,
7807
- mappedAtCreation: false
7808
- });
7809
- if (!bufRes.ok) {
7810
- runtime.errorRegistry.fire(bufRes.error);
7811
- } else {
7812
- if (cachedSpriteInst !== void 0 && !cachedSpriteInst.buffer.isDestroyed) {
7813
- const r = cachedSpriteInst.buffer.destroy();
7814
- if (!r.ok) runtime.errorRegistry.fire(r.error);
7815
- }
7816
- const newBuf = new GpuBuffer(runtime.device, bufRes.value);
7817
- activeSpriteInst = {
7818
- buffer: newBuf,
7819
- uploadedArchVersion: spriteInstancesSnap.archVersion,
7820
- uploadedByteLength: requestedBytes
7821
- };
7822
- frameState.instanceBuffers.set(
7823
- worldEntityKey(spriteEntry.source.worldId, spriteInstancesSnap.cacheKey),
7824
- activeSpriteInst
7825
- );
7826
- }
7827
- }
7828
- if (activeSpriteInst !== null && requestedBytes > 0) {
7829
- const writeRes = runtime.device.queue.writeBuffer(
7830
- activeSpriteInst.buffer.handle,
7831
- 0,
7832
- interleaved
7833
- );
7834
- if (!writeRes.ok) {
7835
- runtime.errorRegistry.fire(writeRes.error);
7836
- } else {
7837
- buffer = activeSpriteInst.buffer.handle;
7838
- count = spriteInstancesSnap.instanceCount;
7839
- }
7840
- }
7841
- }
7842
- }
7843
- return { buffer, count };
7844
- }
7845
7744
  function transparentPassColorFormat(c, pipelineState = c.pipelineState) {
7846
7745
  if (c.transparentColorFormat !== void 0) return c.transparentColorFormat;
7847
7746
  if (!c.runtime.device.caps.storageBuffer) return pipelineState.colorAttachmentFormat;
@@ -12116,7 +12015,6 @@ function ensureSpotShadowMaterialBg(c) {
12116
12015
  prefilterView: fb.prefilterView,
12117
12016
  prefilterSampler: fb.sampler,
12118
12017
  brdfLutView: fb.brdfLutView,
12119
- brdfLutSampler: fb.sampler,
12120
12018
  intensityBuffer: fb.intensityBuffer
12121
12019
  },
12122
12020
  transmissionBackdropAvailable(runtime.device.limits.maxSampledTexturesPerShaderStage) ? void 0 : null
@@ -12170,7 +12068,6 @@ function ensureGpuDrivenAlphaMaskMaterialBg(c, projection) {
12170
12068
  prefilterView: fallback.prefilterView,
12171
12069
  prefilterSampler: fallback.sampler,
12172
12070
  brdfLutView: fallback.brdfLutView,
12173
- brdfLutSampler: fallback.sampler,
12174
12071
  intensityBuffer: fallback.intensityBuffer
12175
12072
  };
12176
12073
  const deps = {
@@ -12222,7 +12119,6 @@ function ensureGpuDrivenCustomShadowMaterialBg(c, projection) {
12222
12119
  prefilterView: fallback.prefilterView,
12223
12120
  prefilterSampler: fallback.sampler,
12224
12121
  brdfLutView: fallback.brdfLutView,
12225
- brdfLutSampler: fallback.sampler,
12226
12122
  intensityBuffer: fallback.intensityBuffer
12227
12123
  };
12228
12124
  const deps = {
@@ -12484,7 +12380,7 @@ function recordMainPass(c, selector, options, graphPass) {
12484
12380
  identities: [
12485
12381
  getOpaqueResourceIdentity(skylightResources.irradianceSampler),
12486
12382
  getOpaqueResourceIdentity(skylightResources.prefilterSampler),
12487
- getOpaqueResourceIdentity(skylightResources.brdfLutSampler)
12383
+ getOpaqueResourceIdentity(skylightResources.irradianceSampler)
12488
12384
  ]
12489
12385
  },
12490
12386
  resources: {
@@ -12504,7 +12400,9 @@ function recordMainPass(c, selector, options, graphPass) {
12504
12400
  },
12505
12401
  brdfLut: {
12506
12402
  viewIdentity: getOpaqueResourceIdentity(skylightResources.brdfLutView),
12507
- samplerIdentity: getOpaqueResourceIdentity(skylightResources.brdfLutSampler),
12403
+ samplerIdentity: getOpaqueResourceIdentity(
12404
+ skylightResources.irradianceSampler
12405
+ ),
12508
12406
  deviceGeneration: runtime.deviceScope.generation
12509
12407
  },
12510
12408
  intensityBufferIdentity: getOpaqueResourceIdentity(
@@ -12549,7 +12447,6 @@ function recordMainPass(c, selector, options, graphPass) {
12549
12447
  skylightPrefilterView: skylightResources.prefilterView,
12550
12448
  prefilterSampler: row.sampler,
12551
12449
  brdfLutView: skylightResources.brdfLutView,
12552
- brdfLutSampler: skylightResources.brdfLutSampler,
12553
12450
  intensityBuffer: row.uniformBuffer
12554
12451
  };
12555
12452
  return { resources: probeResources, probeIndex: row.index };
@@ -14916,6 +14813,6 @@ function addTaaResolvePass(graph, current, currentTemporal, previousColor, previ
14916
14813
  });
14917
14814
  }
14918
14815
 
14919
- export { BLOOM_COMPOSITE_PARAMS_BYTES, BLOOM_DOWNSAMPLE_PARAMS_BYTES, BLOOM_UPSAMPLE_PARAMS_BYTES, BYTES_PER_DIRECT_LIGHT_SLOT, BatchTopology, CAPTURE_VIEW_PROJS, CLOUD_HISTORY_FORMATS, CUBEMAP_FACE_VERTICES, CUBE_CAPTURE_VIEW_SLOT_BASE, DEFERRED_COLOR_FORMATS, DEPTH_MIN_PARAMS_BYTE_SIZE, DEPTH_TEXTURE_FORMAT, FALLBACK_BYTES_PER_ROW, GPU_DRIVEN_VIEW_WGSL, GPU_SCENE_LAYOUTS, GpuBuffer, GpuDrivenView, GpuResourceAllocationLedger, GpuTexture, HDR_COLOR_ATTACHMENT_FORMAT, MATERIAL_PER_ENTITY_STRIDE, MESH_PER_ENTITY_STRIDE, MESH_SSBO_BYTES, MIPMAP_PREWARM_FORMATS, OcclusionConfidenceScheduler, POINTS_LINES_MATERIAL_SHADER_ID, POINTS_LINES_VIEW_BUFFER_SIZE, PREFILTER_MIP_LEVELS, PREFILTER_SIZE, PipelineSpecError, PostProcessError, REFLECTION_PROBE_VIEW_SLOT_BASE, SHADOW_CASTER_BUFFER_SIZE, STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES, STANDARD_PBR_UBO_SIZE, ShadowViewStatePool, SurfaceSubmissionObservationOwner, TEMPORAL_HISTORY_FORMATS, TYPED_BLOOM_PASS_NAMES, VIEW_UBO_BYTES, VIEW_UNIFORM_BYTES, VIEW_UNIFORM_SLOT_STRIDE, abortTemporalGpuSubmit, addReflectionFallbackObservationPass, addStandardSceneDataPass, addTaaResolvePass, addTypedBloomPasses, addTypedCompositePostEffects, addTypedFrameObservationPass, addTypedFullscreenPass, addTypedOutputTransformPass, addTypedScenePass, addTypedSkyboxPass, addTypedSsaoPasses, addTypedTemporalResolvePass, aggregateTemporalDemand, applyMaterialTextureUvScales, applyParamSchemaDefaultsToUbo, applyParamSnapshotToUbo, assembleMaterialWithSkylightEntries, assertStorageBufferCap, buildFoldDispatchPlan, buildFullscreenPostProcessPass, buildLinearLdrMaterialSpecTable, buildPerFrameBindGroups, buildSpecConstTable, cacheKeyOf, cleanPerEntityCache, colorFormatsForPassKind, combineGpuResourceAllocationInspections, commitTemporalGpuSubmit, computeProjectionMatrix, computeSplitLdrSprite, computeViewMatrix, configureSurface, createClusterBinScratch, createFullscreenBindGroup, createHdrpClusterMembershipBindGroupLayoutDescriptor, createIblPipelines, createPointsLinesLaneAdapter, createPointsLinesLaneContract, createRenderPipelineTarget, createSkylightFallback, createStandardSceneDataTarget, createStandardSurfaceLightingBindGroup, decideVisibility, defaultViewForUserRegionField, deriveRenderDataCubemap, deriveRenderDataMesh, deriveRenderDataTexture, deriveRenderExtent, describeTemporalDemand, detectNineSliceScaleTooSmall, deviceOptionsForAdapter, driveLazyEquirectProjection, encodeDirectionalShadowPass, encodeMainPass, encodePointShadowPass, encodeSpotShadowPass, ensureMeshSsboCapacity, ensureProbeBlendRecordBuffer, entryHasDepthRead, evaluateFoldBucketUniformCap, foldDispatchBuckets, geometryRenderStateForPass, geometryRenderStateForTopology, getIblProbeBackgroundSource, getOrBuildPipeline, getOrCreateFromChain, getOrCreateHdrpBuffers, getOrCreateIblCache, getTemporalBindGroupResources, getTemporalGpuState, getTemporalParamsBuffer, gpuSceneFieldOffset, hasPendingTemporalGpuSubmit, importRenderPipelineSurface, incrementFoldedDrawsMetric, inspectResourceClassSplits, isTemporalFullscreenBinding, packInstanceStorageBuffer, passKindPolicyTable, postProcessShaderEntrySignature, postProcessShaderModuleLabel, postProcessShaderPipelineLabel, prepareFrameLighting, prepareMaterialSkylight, prewarmMaterialShaderVariants, projectedHeightForCandidate, renderExtentSize, renderPipelineCloudHistoryTargets, resetHdrpBuffers, resetSsaoResources, residentTextureView, resolveGeometryInstanceBuffer, resolveMaterialSkylight, resolveOutputDither, resolveReflectionProbeBinding, resolveSkyboxActive, resolveSsaoParameters, resolveSurfaceFormatPair, resolveSurfaceProfile, retireTemporalGpuState, retireTemporalGpuStateAfterFence, runIblPrecompute, selectGpuDrivenSceneIndexVariant, selectGpuLodLane, selectHdrpPbrPrewarmVariants, selectLazyEquirectHandle, selectLod, selectProbePrewarmVariants, selectSkinPrewarmVariants, selectStandardPbrTransmissionPrewarmVariants, selectSwapChainFormat, setIblComposedShaders, shadowViewIdentityKey, shadowViewRasterAccesses, shouldIssueRetest, stageTemporalGpuSubmit, standardBloomAdmitted, standardStorageVariantSet, standardTemporalLaneAdmission, standardTemporalPostOrder, standardTopologyVariantSet, temporalReadIndex, temporalWriteIndex, transmissionBackdropAvailable, uploadMeshSsboBatch, variantSetFromDefines, variantSetFromVertexLayoutProjection, warnMultiSkybox, warnMultiSkylight, warnZeroLightStandard, writeHdrpClusterAndSsaoBuffers, writePbrMaterialUboPayload, writePointsLinesViewUbo, writeShadowCasterUniforms, writeShadowParamsBuffer, writeSpotModifierTextures, writeViewUbo };
14920
- //# sourceMappingURL=chunk-MKDIT2EM.mjs.map
14921
- //# sourceMappingURL=chunk-MKDIT2EM.mjs.map
14816
+ export { BLOOM_COMPOSITE_PARAMS_BYTES, BLOOM_DOWNSAMPLE_PARAMS_BYTES, BLOOM_UPSAMPLE_PARAMS_BYTES, BYTES_PER_DIRECT_LIGHT_SLOT, BatchTopology, CAPTURE_VIEW_PROJS, CLOUD_HISTORY_FORMATS, CUBEMAP_FACE_VERTICES, CUBE_CAPTURE_VIEW_SLOT_BASE, DEFERRED_COLOR_FORMATS, DEPTH_MIN_PARAMS_BYTE_SIZE, DEPTH_TEXTURE_FORMAT, FALLBACK_BYTES_PER_ROW, GPU_DRIVEN_VIEW_WGSL, GPU_SCENE_LAYOUTS, GpuBuffer, GpuDrivenView, GpuResourceAllocationLedger, GpuTexture, HDR_COLOR_ATTACHMENT_FORMAT, MESH_PER_ENTITY_STRIDE, MESH_SSBO_BYTES, MIPMAP_PREWARM_FORMATS, OcclusionConfidenceScheduler, POINTS_LINES_MATERIAL_SHADER_ID, POINTS_LINES_VIEW_BUFFER_SIZE, PREFILTER_MIP_LEVELS, PREFILTER_SIZE, PipelineSpecError, PostProcessError, REFLECTION_PROBE_VIEW_SLOT_BASE, SHADOW_CASTER_BUFFER_SIZE, STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES, ShadowViewStatePool, SurfaceSubmissionObservationOwner, TEMPORAL_HISTORY_FORMATS, TYPED_BLOOM_PASS_NAMES, VIEW_UBO_BYTES, VIEW_UNIFORM_BYTES, VIEW_UNIFORM_SLOT_STRIDE, abortTemporalGpuSubmit, addReflectionFallbackObservationPass, addStandardSceneDataPass, addTaaResolvePass, addTypedBloomPasses, addTypedCompositePostEffects, addTypedFrameObservationPass, addTypedFullscreenPass, addTypedOutputTransformPass, addTypedScenePass, addTypedSkyboxPass, addTypedSsaoPasses, addTypedTemporalResolvePass, aggregateTemporalDemand, applyMaterialTextureUvScales, applyParamSchemaDefaultsToUbo, applyParamSnapshotToUbo, assembleMaterialWithSkylightEntries, assertStorageBufferCap, buildFoldDispatchPlan, buildFullscreenPostProcessPass, buildLinearLdrMaterialSpecTable, buildPerFrameBindGroups, buildSpecConstTable, cacheKeyOf, cleanPerEntityCache, colorFormatsForPassKind, combineGpuResourceAllocationInspections, commitTemporalGpuSubmit, computeProjectionMatrix, computeSplitLdrSprite, computeViewMatrix, createClusterBinScratch, createFullscreenBindGroup, createHdrpClusterMembershipBindGroupLayoutDescriptor, createIblPipelines, createPointsLinesLaneAdapter, createPointsLinesLaneContract, createRenderPipelineTarget, createSkylightFallback, createStandardSceneDataTarget, createStandardSurfaceLightingBindGroup, decideVisibility, defaultViewForUserRegionField, deriveRenderDataCubemap, deriveRenderDataMesh, deriveRenderDataTexture, deriveRenderExtent, describeTemporalDemand, detectNineSliceScaleTooSmall, deviceOptionsForAdapter, driveLazyEquirectProjection, encodeDirectionalShadowPass, encodeMainPass, encodePointShadowPass, encodeSpotShadowPass, ensureMeshSsboCapacity, ensureProbeBlendRecordBuffer, entryHasDepthRead, evaluateFoldBucketUniformCap, foldDispatchBuckets, geometryRenderStateForPass, geometryRenderStateForTopology, getIblProbeBackgroundSource, getOrBuildPipeline, getOrCreateFromChain, getOrCreateHdrpBuffers, getOrCreateIblCache, getTemporalBindGroupResources, getTemporalGpuState, getTemporalParamsBuffer, gpuSceneFieldOffset, hasPendingTemporalGpuSubmit, importRenderPipelineSurface, incrementFoldedDrawsMetric, inspectResourceClassSplits, isTemporalFullscreenBinding, packInstanceStorageBuffer, passKindPolicyTable, postProcessShaderEntrySignature, postProcessShaderModuleLabel, postProcessShaderPipelineLabel, prepareFrameLighting, prepareMaterialSkylight, prewarmMaterialShaderVariants, projectedHeightForCandidate, renderExtentSize, renderPipelineCloudHistoryTargets, resetHdrpBuffers, resetSsaoResources, residentTextureView, resolveGeometryInstanceBuffer, resolveMaterialSkylight, resolveOutputDither, resolveReflectionProbeBinding, resolveSkyboxActive, resolveSsaoParameters, retireTemporalGpuState, retireTemporalGpuStateAfterFence, runIblPrecompute, selectGpuDrivenSceneIndexVariant, selectGpuLodLane, selectHdrpPbrPrewarmVariants, selectLazyEquirectHandle, selectLod, selectProbePrewarmVariants, selectSkinPrewarmVariants, selectStandardPbrTransmissionPrewarmVariants, setIblComposedShaders, shadowViewIdentityKey, shadowViewRasterAccesses, shouldIssueRetest, stageTemporalGpuSubmit, standardBloomAdmitted, standardStorageVariantSet, standardTemporalLaneAdmission, standardTemporalPostOrder, standardTopologyVariantSet, temporalReadIndex, temporalWriteIndex, transmissionBackdropAvailable, uploadMeshSsboBatch, variantSetFromDefines, variantSetFromVertexLayoutProjection, warnMultiSkybox, warnMultiSkylight, warnZeroLightStandard, writeHdrpClusterAndSsaoBuffers, writePbrMaterialUboPayload, writePointsLinesViewUbo, writeShadowCasterUniforms, writeShadowParamsBuffer, writeSpotModifierTextures, writeViewUbo };
14817
+ //# sourceMappingURL=chunk-LNIUIKQ7.mjs.map
14818
+ //# sourceMappingURL=chunk-LNIUIKQ7.mjs.map