@forgeax/engine-runtime 0.1.23 → 0.1.24

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 (368) hide show
  1. package/README.md +15 -6
  2. package/dist/__tests__/advance-animation-player.cases.unit.test.d.ts +2 -0
  3. package/dist/__tests__/advance-animation-player.cases.unit.test.d.ts.map +1 -0
  4. package/dist/__tests__/asset-registry-aabb.cases.unit.test.d.ts +2 -0
  5. package/dist/__tests__/asset-registry-aabb.cases.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/asset-registry-bootstrap.cases.unit.test.d.ts +2 -0
  7. package/dist/__tests__/asset-registry-bootstrap.cases.unit.test.d.ts.map +1 -0
  8. package/dist/__tests__/asset-registry-builtin-nineslice.cases.unit.test.d.ts +2 -0
  9. package/dist/__tests__/asset-registry-builtin-nineslice.cases.unit.test.d.ts.map +1 -0
  10. package/dist/__tests__/asset-registry-d9-tile-sampler-soft-warn.cases.unit.test.d.ts +2 -0
  11. package/dist/__tests__/asset-registry-d9-tile-sampler-soft-warn.cases.unit.test.d.ts.map +1 -0
  12. package/dist/__tests__/asset-registry-guid.cases.unit.test.d.ts +2 -0
  13. package/dist/__tests__/asset-registry-guid.cases.unit.test.d.ts.map +1 -0
  14. package/dist/__tests__/asset-registry-material-validate.cases.unit.test.d.ts +2 -0
  15. package/dist/__tests__/asset-registry-material-validate.cases.unit.test.d.ts.map +1 -0
  16. package/dist/__tests__/asset-registry-mesh-fail-fast.cases.unit.test.d.ts +2 -0
  17. package/dist/__tests__/asset-registry-mesh-fail-fast.cases.unit.test.d.ts.map +1 -0
  18. package/dist/__tests__/asset-registry-scene.cases.unit.test.d.ts +2 -0
  19. package/dist/__tests__/asset-registry-scene.cases.unit.test.d.ts.map +1 -0
  20. package/dist/__tests__/asset-registry-sprite-slices-validate.cases.unit.test.d.ts +2 -0
  21. package/dist/__tests__/asset-registry-sprite-slices-validate.cases.unit.test.d.ts.map +1 -0
  22. package/dist/__tests__/asset-renderer-assembly.cases.unit.test.d.ts +2 -0
  23. package/dist/__tests__/asset-renderer-assembly.cases.unit.test.d.ts.map +1 -0
  24. package/dist/__tests__/asset.cases.unit.test.d.ts +2 -0
  25. package/dist/__tests__/asset.cases.unit.test.d.ts.map +1 -0
  26. package/dist/__tests__/bloom-gating.cases.unit.test.d.ts +2 -0
  27. package/dist/__tests__/bloom-gating.cases.unit.test.d.ts.map +1 -0
  28. package/dist/__tests__/builtin-guid-ssot.cases.unit.test.d.ts +2 -0
  29. package/dist/__tests__/builtin-guid-ssot.cases.unit.test.d.ts.map +1 -0
  30. package/dist/__tests__/builtin-pack.cases.unit.test.d.ts +2 -0
  31. package/dist/__tests__/builtin-pack.cases.unit.test.d.ts.map +1 -0
  32. package/dist/__tests__/camera-antialias.cases.unit.test.d.ts +2 -0
  33. package/dist/__tests__/camera-antialias.cases.unit.test.d.ts.map +1 -0
  34. package/dist/__tests__/camera-bloom.cases.unit.test.d.ts +2 -0
  35. package/dist/__tests__/camera-bloom.cases.unit.test.d.ts.map +1 -0
  36. package/dist/__tests__/camera-clear-schema.cases.unit.test.d.ts +2 -0
  37. package/dist/__tests__/camera-clear-schema.cases.unit.test.d.ts.map +1 -0
  38. package/dist/__tests__/camera-ortho.cases.unit.test.d.ts +2 -0
  39. package/dist/__tests__/camera-ortho.cases.unit.test.d.ts.map +1 -0
  40. package/dist/__tests__/cluster-binner.cases.unit.test.d.ts +2 -0
  41. package/dist/__tests__/cluster-binner.cases.unit.test.d.ts.map +1 -0
  42. package/dist/__tests__/create-renderer-fallback-shader-manifest.cases.unit.test.d.ts +2 -0
  43. package/dist/__tests__/create-renderer-fallback-shader-manifest.cases.unit.test.d.ts.map +1 -0
  44. package/dist/__tests__/create-renderer-uniform-fallback.cases.unit.test.d.ts +2 -0
  45. package/dist/__tests__/create-renderer-uniform-fallback.cases.unit.test.d.ts.map +1 -0
  46. package/dist/__tests__/cubemap-upload.cases.unit.test.d.ts +2 -0
  47. package/dist/__tests__/cubemap-upload.cases.unit.test.d.ts.map +1 -0
  48. package/dist/__tests__/dev-import-transport.cases.unit.test.d.ts +2 -0
  49. package/dist/__tests__/dev-import-transport.cases.unit.test.d.ts.map +1 -0
  50. package/dist/__tests__/engine-metrics.cases.unit.test.d.ts +2 -0
  51. package/dist/__tests__/engine-metrics.cases.unit.test.d.ts.map +1 -0
  52. package/dist/__tests__/equirect-projection-error.cases.unit.test.d.ts +2 -0
  53. package/dist/__tests__/equirect-projection-error.cases.unit.test.d.ts.map +1 -0
  54. package/dist/__tests__/font-asset-load.cases.unit.test.d.ts +2 -0
  55. package/dist/__tests__/font-asset-load.cases.unit.test.d.ts.map +1 -0
  56. package/dist/__tests__/fxaa-intermediate-texture.cases.unit.test.d.ts +2 -0
  57. package/dist/__tests__/fxaa-intermediate-texture.cases.unit.test.d.ts.map +1 -0
  58. package/dist/__tests__/fxaa-pipeline.cases.unit.test.d.ts +2 -0
  59. package/dist/__tests__/fxaa-pipeline.cases.unit.test.d.ts.map +1 -0
  60. package/dist/__tests__/gpu-residency.cases.unit.test.d.ts +2 -0
  61. package/dist/__tests__/gpu-residency.cases.unit.test.d.ts.map +1 -0
  62. package/dist/__tests__/gpu-resource-release.cases.unit.test.d.ts +2 -0
  63. package/dist/__tests__/gpu-resource-release.cases.unit.test.d.ts.map +1 -0
  64. package/dist/__tests__/handle-quad.cases.unit.test.d.ts +2 -0
  65. package/dist/__tests__/handle-quad.cases.unit.test.d.ts.map +1 -0
  66. package/dist/__tests__/hdrp-bgl-slots.cases.unit.test.d.ts +2 -0
  67. package/dist/__tests__/hdrp-bgl-slots.cases.unit.test.d.ts.map +1 -0
  68. package/dist/__tests__/hdrp-grid-invalid.cases.unit.test.d.ts +2 -0
  69. package/dist/__tests__/hdrp-grid-invalid.cases.unit.test.d.ts.map +1 -0
  70. package/dist/__tests__/hdrp-index-list-overflow-once.cases.unit.test.d.ts +2 -0
  71. package/dist/__tests__/hdrp-index-list-overflow-once.cases.unit.test.d.ts.map +1 -0
  72. package/dist/__tests__/hdrp-light-budget.cases.unit.test.d.ts +2 -0
  73. package/dist/__tests__/hdrp-light-budget.cases.unit.test.d.ts.map +1 -0
  74. package/dist/__tests__/hdrp-pipeline-asset-config.cases.unit.test.d.ts +2 -0
  75. package/dist/__tests__/hdrp-pipeline-asset-config.cases.unit.test.d.ts.map +1 -0
  76. package/dist/__tests__/helpers/renderer-device-loss-dawn.d.ts +25 -0
  77. package/dist/__tests__/helpers/renderer-device-loss-dawn.d.ts.map +1 -0
  78. package/dist/__tests__/helpers/standard-material-manifest.d.ts +0 -1
  79. package/dist/__tests__/helpers/standard-material-manifest.d.ts.map +1 -1
  80. package/dist/__tests__/ibl-pipeline-cache.cases.unit.test.d.ts +2 -0
  81. package/dist/__tests__/ibl-pipeline-cache.cases.unit.test.d.ts.map +1 -0
  82. package/dist/__tests__/lazy-catalog.cases.unit.test.d.ts +2 -0
  83. package/dist/__tests__/lazy-catalog.cases.unit.test.d.ts.map +1 -0
  84. package/dist/__tests__/load-by-guid-hdr.cases.unit.test.d.ts +2 -0
  85. package/dist/__tests__/load-by-guid-hdr.cases.unit.test.d.ts.map +1 -0
  86. package/dist/__tests__/load-by-guid-prod-material-parent.cases.unit.test.d.ts +2 -0
  87. package/dist/__tests__/load-by-guid-prod-material-parent.cases.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/load-by-guid-prod.cases.unit.test.d.ts +2 -0
  89. package/dist/__tests__/load-by-guid-prod.cases.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/loader-registry.cases.unit.test.d.ts +2 -0
  91. package/dist/__tests__/loader-registry.cases.unit.test.d.ts.map +1 -0
  92. package/dist/__tests__/m7-hdrp-demo-shape.cases.unit.test.d.ts +2 -0
  93. package/dist/__tests__/m7-hdrp-demo-shape.cases.unit.test.d.ts.map +1 -0
  94. package/dist/__tests__/mipmap-formula.cases.unit.test.d.ts +2 -0
  95. package/dist/__tests__/mipmap-formula.cases.unit.test.d.ts.map +1 -0
  96. package/dist/__tests__/mipmap-pipeline-cache.cases.unit.test.d.ts +2 -0
  97. package/dist/__tests__/mipmap-pipeline-cache.cases.unit.test.d.ts.map +1 -0
  98. package/dist/__tests__/parse-asset-payload-material.cases.unit.test.d.ts +2 -0
  99. package/dist/__tests__/parse-asset-payload-material.cases.unit.test.d.ts.map +1 -0
  100. package/dist/__tests__/parse-asset-payload-texture.cases.unit.test.d.ts +2 -0
  101. package/dist/__tests__/parse-asset-payload-texture.cases.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/parse-scene-payload-refs.cases.unit.test.d.ts +2 -0
  103. package/dist/__tests__/parse-scene-payload-refs.cases.unit.test.d.ts.map +1 -0
  104. package/dist/__tests__/pass-selector.cases.unit.test.d.ts +2 -0
  105. package/dist/__tests__/pass-selector.cases.unit.test.d.ts.map +1 -0
  106. package/dist/__tests__/pipeline-builder.cases.unit.test.d.ts +2 -0
  107. package/dist/__tests__/pipeline-builder.cases.unit.test.d.ts.map +1 -0
  108. package/dist/__tests__/pipeline-cache-key-topology.cases.unit.test.d.ts +2 -0
  109. package/dist/__tests__/pipeline-cache-key-topology.cases.unit.test.d.ts.map +1 -0
  110. package/dist/__tests__/pipeline-vertex-stride-branch.cases.unit.test.d.ts +2 -0
  111. package/dist/__tests__/pipeline-vertex-stride-branch.cases.unit.test.d.ts.map +1 -0
  112. package/dist/__tests__/pipeline.cases.unit.test.d.ts +2 -0
  113. package/dist/__tests__/pipeline.cases.unit.test.d.ts.map +1 -0
  114. package/dist/__tests__/post-process-register.cases.unit.test.d.ts +2 -0
  115. package/dist/__tests__/post-process-register.cases.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/propagate-transforms.cases.unit.test.d.ts +2 -0
  117. package/dist/__tests__/propagate-transforms.cases.unit.test.d.ts.map +1 -0
  118. package/dist/__tests__/record-all-topology.cases.unit.test.d.ts +2 -0
  119. package/dist/__tests__/record-all-topology.cases.unit.test.d.ts.map +1 -0
  120. package/dist/__tests__/record-draw-branch.cases.unit.test.d.ts +2 -0
  121. package/dist/__tests__/record-draw-branch.cases.unit.test.d.ts.map +1 -0
  122. package/dist/__tests__/record-strip-index-format.cases.unit.test.d.ts +2 -0
  123. package/dist/__tests__/record-strip-index-format.cases.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/register-with-guid-rgba16float.cases.unit.test.d.ts +2 -0
  125. package/dist/__tests__/register-with-guid-rgba16float.cases.unit.test.d.ts.map +1 -0
  126. package/dist/__tests__/render-data.cases.unit.test.d.ts +2 -0
  127. package/dist/__tests__/render-data.cases.unit.test.d.ts.map +1 -0
  128. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
  129. package/dist/__tests__/render-query-regression.cases.unit.test.d.ts +2 -0
  130. package/dist/__tests__/render-query-regression.cases.unit.test.d.ts.map +1 -0
  131. package/dist/__tests__/render-system-record-submesh.cases.unit.test.d.ts +2 -0
  132. package/dist/__tests__/render-system-record-submesh.cases.unit.test.d.ts.map +1 -0
  133. package/dist/__tests__/render-system-record-warn-once.cases.unit.test.d.ts +2 -0
  134. package/dist/__tests__/render-system-record-warn-once.cases.unit.test.d.ts.map +1 -0
  135. package/dist/__tests__/renderer-device-loss-multi-world.integration.test.d.ts +2 -0
  136. package/dist/__tests__/renderer-device-loss-multi-world.integration.test.d.ts.map +1 -0
  137. package/dist/__tests__/renderer-device-loss-provider-feasibility.dawn.test.d.ts +2 -0
  138. package/dist/__tests__/renderer-device-loss-provider-feasibility.dawn.test.d.ts.map +1 -0
  139. package/dist/__tests__/renderer-device-loss-recovery.dawn.test.d.ts +2 -0
  140. package/dist/__tests__/renderer-device-loss-recovery.dawn.test.d.ts.map +1 -0
  141. package/dist/__tests__/renderer-draw-world.cases.unit.test.d.ts +2 -0
  142. package/dist/__tests__/renderer-draw-world.cases.unit.test.d.ts.map +1 -0
  143. package/dist/__tests__/renderer-recovery-consumer.integration.test.d.ts +2 -0
  144. package/dist/__tests__/renderer-recovery-consumer.integration.test.d.ts.map +1 -0
  145. package/dist/__tests__/renderstate-pipeline-cache.cases.unit.test.d.ts +2 -0
  146. package/dist/__tests__/renderstate-pipeline-cache.cases.unit.test.d.ts.map +1 -0
  147. package/dist/__tests__/resolve-scene-guids.cases.unit.test.d.ts +2 -0
  148. package/dist/__tests__/resolve-scene-guids.cases.unit.test.d.ts.map +1 -0
  149. package/dist/__tests__/shadow-skip-non-triangle.cases.unit.test.d.ts +2 -0
  150. package/dist/__tests__/shadow-skip-non-triangle.cases.unit.test.d.ts.map +1 -0
  151. package/dist/__tests__/skin-errors-kebab-case.cases.unit.test.d.ts +2 -0
  152. package/dist/__tests__/skin-errors-kebab-case.cases.unit.test.d.ts.map +1 -0
  153. package/dist/__tests__/skin-instances-coexist.cases.unit.test.d.ts +2 -0
  154. package/dist/__tests__/skin-instances-coexist.cases.unit.test.d.ts.map +1 -0
  155. package/dist/__tests__/skin-m2-extract-happy.cases.unit.test.d.ts +2 -0
  156. package/dist/__tests__/skin-m2-extract-happy.cases.unit.test.d.ts.map +1 -0
  157. package/dist/__tests__/skin-m2-extract-joint-error.cases.unit.test.d.ts +2 -0
  158. package/dist/__tests__/skin-m2-extract-joint-error.cases.unit.test.d.ts.map +1 -0
  159. package/dist/__tests__/skin-m2-extract-null-assets.cases.unit.test.d.ts +2 -0
  160. package/dist/__tests__/skin-m2-extract-null-assets.cases.unit.test.d.ts.map +1 -0
  161. package/dist/__tests__/skin-m2-extract-skeleton-error.cases.unit.test.d.ts +2 -0
  162. package/dist/__tests__/skin-m2-extract-skeleton-error.cases.unit.test.d.ts.map +1 -0
  163. package/dist/__tests__/skin-m3-record-cache.cases.unit.test.d.ts +2 -0
  164. package/dist/__tests__/skin-m3-record-cache.cases.unit.test.d.ts.map +1 -0
  165. package/dist/__tests__/skin-palette-extract.cases.unit.test.d.ts +2 -0
  166. package/dist/__tests__/skin-palette-extract.cases.unit.test.d.ts.map +1 -0
  167. package/dist/__tests__/skin-pipeline-routing.cases.unit.test.d.ts +2 -0
  168. package/dist/__tests__/skin-pipeline-routing.cases.unit.test.d.ts.map +1 -0
  169. package/dist/__tests__/skin.cases.unit.test.d.ts +2 -0
  170. package/dist/__tests__/skin.cases.unit.test.d.ts.map +1 -0
  171. package/dist/__tests__/skybox-extract.cases.unit.test.d.ts +2 -0
  172. package/dist/__tests__/skybox-extract.cases.unit.test.d.ts.map +1 -0
  173. package/dist/__tests__/skybox-shader-compile.cases.unit.test.d.ts +2 -0
  174. package/dist/__tests__/skybox-shader-compile.cases.unit.test.d.ts.map +1 -0
  175. package/dist/__tests__/skylight-bind-group.cases.unit.test.d.ts +2 -0
  176. package/dist/__tests__/skylight-bind-group.cases.unit.test.d.ts.map +1 -0
  177. package/dist/__tests__/skylight-component.cases.unit.test.d.ts +2 -0
  178. package/dist/__tests__/skylight-component.cases.unit.test.d.ts.map +1 -0
  179. package/dist/__tests__/skylight-fallback-path.cases.unit.test.d.ts +2 -0
  180. package/dist/__tests__/skylight-fallback-path.cases.unit.test.d.ts.map +1 -0
  181. package/dist/__tests__/skylight-pipeline-layout.cases.unit.test.d.ts +2 -0
  182. package/dist/__tests__/skylight-pipeline-layout.cases.unit.test.d.ts.map +1 -0
  183. package/dist/__tests__/skylight-solid-color-extract.cases.unit.test.d.ts +2 -0
  184. package/dist/__tests__/skylight-solid-color-extract.cases.unit.test.d.ts.map +1 -0
  185. package/dist/__tests__/sprite-animation-tick-boundary.cases.unit.test.d.ts +2 -0
  186. package/dist/__tests__/sprite-animation-tick-boundary.cases.unit.test.d.ts.map +1 -0
  187. package/dist/__tests__/sprite-animation-tick-clamp.cases.unit.test.d.ts +2 -0
  188. package/dist/__tests__/sprite-animation-tick-clamp.cases.unit.test.d.ts.map +1 -0
  189. package/dist/__tests__/sprite-animation-tick-frame-duration-negative.cases.unit.test.d.ts +2 -0
  190. package/dist/__tests__/sprite-animation-tick-frame-duration-negative.cases.unit.test.d.ts.map +1 -0
  191. package/dist/__tests__/sprite-animation-tick-frame-duration-zero.cases.unit.test.d.ts +2 -0
  192. package/dist/__tests__/sprite-animation-tick-frame-duration-zero.cases.unit.test.d.ts.map +1 -0
  193. package/dist/__tests__/sprite-animation-tick-loop.cases.unit.test.d.ts +2 -0
  194. package/dist/__tests__/sprite-animation-tick-loop.cases.unit.test.d.ts.map +1 -0
  195. package/dist/__tests__/sprite-animation-tick-override-probe.cases.unit.test.d.ts +2 -0
  196. package/dist/__tests__/sprite-animation-tick-override-probe.cases.unit.test.d.ts.map +1 -0
  197. package/dist/__tests__/sprite-animation-tick-regions-mismatch.cases.unit.test.d.ts +2 -0
  198. package/dist/__tests__/sprite-animation-tick-regions-mismatch.cases.unit.test.d.ts.map +1 -0
  199. package/dist/__tests__/storage-buffer-caps.cases.unit.test.d.ts +2 -0
  200. package/dist/__tests__/storage-buffer-caps.cases.unit.test.d.ts.map +1 -0
  201. package/dist/__tests__/systems.cases.unit.test.d.ts +2 -0
  202. package/dist/__tests__/systems.cases.unit.test.d.ts.map +1 -0
  203. package/dist/__tests__/tonemap-hdr-target.cases.unit.test.d.ts +2 -0
  204. package/dist/__tests__/tonemap-hdr-target.cases.unit.test.d.ts.map +1 -0
  205. package/dist/__tests__/tonemap-pipeline-split.cases.unit.test.d.ts +2 -0
  206. package/dist/__tests__/tonemap-pipeline-split.cases.unit.test.d.ts.map +1 -0
  207. package/dist/__tests__/tonemap.cases.unit.test.d.ts +2 -0
  208. package/dist/__tests__/tonemap.cases.unit.test.d.ts.map +1 -0
  209. package/dist/__tests__/transparent-sort-config-get.cases.unit.test.d.ts +2 -0
  210. package/dist/__tests__/transparent-sort-config-get.cases.unit.test.d.ts.map +1 -0
  211. package/dist/__tests__/transparent-sort-config-set.cases.unit.test.d.ts +2 -0
  212. package/dist/__tests__/transparent-sort-config-set.cases.unit.test.d.ts.map +1 -0
  213. package/dist/__tests__/transparent-sort.cases.unit.test.d.ts +2 -0
  214. package/dist/__tests__/transparent-sort.cases.unit.test.d.ts.map +1 -0
  215. package/dist/__tests__/upload-texture-consistency.cases.unit.test.d.ts +2 -0
  216. package/dist/__tests__/upload-texture-consistency.cases.unit.test.d.ts.map +1 -0
  217. package/dist/__tests__/verify-revisions.cases.unit.test.d.ts +2 -0
  218. package/dist/__tests__/verify-revisions.cases.unit.test.d.ts.map +1 -0
  219. package/dist/__tests__/wire-default-loaders.cases.unit.test.d.ts +2 -0
  220. package/dist/__tests__/wire-default-loaders.cases.unit.test.d.ts.map +1 -0
  221. package/dist/__tests__/zero-camera-clear-fallback.cases.unit.test.d.ts +2 -0
  222. package/dist/__tests__/zero-camera-clear-fallback.cases.unit.test.d.ts.map +1 -0
  223. package/dist/dev-import-transport.d.ts.map +1 -1
  224. package/dist/index.mjs +1 -1
  225. package/dist/index.mjs.map +1 -1
  226. package/package.json +30 -30
  227. package/src/__tests__/advance-animation-player.cases.unit.test.ts +1666 -0
  228. package/src/__tests__/asset-registry-aabb.cases.unit.test.ts +676 -0
  229. package/src/__tests__/asset-registry-bootstrap.cases.unit.test.ts +472 -0
  230. package/src/__tests__/asset-registry-builtin-nineslice.cases.unit.test.ts +481 -0
  231. package/src/__tests__/asset-registry-d9-tile-sampler-soft-warn.cases.unit.test.ts +568 -0
  232. package/src/__tests__/asset-registry-guid.cases.unit.test.ts +500 -0
  233. package/src/__tests__/asset-registry-material-validate.cases.unit.test.ts +756 -0
  234. package/src/__tests__/asset-registry-mesh-fail-fast.cases.unit.test.ts +591 -0
  235. package/src/__tests__/asset-registry-scene.cases.unit.test.ts +501 -0
  236. package/src/__tests__/asset-registry-sprite-slices-validate.cases.unit.test.ts +536 -0
  237. package/src/__tests__/asset-renderer-assembly.cases.unit.test.ts +496 -0
  238. package/src/__tests__/asset.cases.unit.test.ts +439 -0
  239. package/src/__tests__/bind-group-cache-keying.test.ts +6 -2
  240. package/src/__tests__/bloom-gating.cases.unit.test.ts +428 -0
  241. package/src/__tests__/builtin-guid-ssot.cases.unit.test.ts +472 -0
  242. package/src/__tests__/builtin-pack.cases.unit.test.ts +639 -0
  243. package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
  244. package/src/__tests__/camera-antialias.cases.unit.test.ts +372 -0
  245. package/src/__tests__/camera-bloom.cases.unit.test.ts +396 -0
  246. package/src/__tests__/camera-clear-schema.cases.unit.test.ts +391 -0
  247. package/src/__tests__/camera-ortho.cases.unit.test.ts +484 -0
  248. package/src/__tests__/cluster-binner.cases.unit.test.ts +817 -0
  249. package/src/__tests__/collect-scene-mount-collapse.test.ts +5 -1
  250. package/src/__tests__/create-renderer-fallback-shader-manifest.cases.unit.test.ts +345 -0
  251. package/src/__tests__/create-renderer-uniform-fallback.cases.unit.test.ts +445 -0
  252. package/src/__tests__/cubemap-upload.cases.unit.test.ts +593 -0
  253. package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +184 -17
  254. package/src/__tests__/dawn/material-alpha.dawn.test.ts +17 -4
  255. package/src/__tests__/derive-bgl-integration.test.ts +8 -8
  256. package/src/__tests__/dev-import-transport.cases.unit.test.ts +503 -0
  257. package/src/__tests__/engine-metrics.cases.unit.test.ts +371 -0
  258. package/src/__tests__/equirect-projection-error.cases.unit.test.ts +416 -0
  259. package/src/__tests__/font-asset-load.cases.unit.test.ts +510 -0
  260. package/src/__tests__/fxaa-intermediate-texture.cases.unit.test.ts +690 -0
  261. package/src/__tests__/fxaa-pipeline.cases.unit.test.ts +546 -0
  262. package/src/__tests__/gpu-residency.cases.unit.test.ts +479 -0
  263. package/src/__tests__/gpu-resource-release.cases.unit.test.ts +929 -0
  264. package/src/__tests__/handle-quad.cases.unit.test.ts +491 -0
  265. package/src/__tests__/hdrp-bgl-slots.cases.unit.test.ts +451 -0
  266. package/src/__tests__/hdrp-grid-invalid.cases.unit.test.ts +408 -0
  267. package/src/__tests__/hdrp-index-list-overflow-once.cases.unit.test.ts +405 -0
  268. package/src/__tests__/hdrp-light-budget.cases.unit.test.ts +483 -0
  269. package/src/__tests__/hdrp-pipeline-asset-config.cases.unit.test.ts +441 -0
  270. package/src/__tests__/helpers/renderer-device-loss-dawn.ts +69 -0
  271. package/src/__tests__/helpers/standard-material-manifest.ts +11 -15
  272. package/src/__tests__/ibl-pipeline-cache.cases.unit.test.ts +415 -0
  273. package/src/__tests__/lazy-catalog.cases.unit.test.ts +848 -0
  274. package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +6 -5
  275. package/src/__tests__/load-by-guid-hdr.cases.unit.test.ts +582 -0
  276. package/src/__tests__/load-by-guid-prod-material-parent.cases.unit.test.ts +1514 -0
  277. package/src/__tests__/load-by-guid-prod.cases.unit.test.ts +557 -0
  278. package/src/__tests__/loader-registry.cases.unit.test.ts +767 -0
  279. package/src/__tests__/m7-hdrp-demo-shape.cases.unit.test.ts +361 -0
  280. package/src/__tests__/material-texture-uv-scale.unit.test.ts +2 -2
  281. package/src/__tests__/materials.unit.test.ts +29 -10
  282. package/src/__tests__/mipmap-formula.cases.unit.test.ts +434 -0
  283. package/src/__tests__/mipmap-pipeline-cache.cases.unit.test.ts +490 -0
  284. package/src/__tests__/parse-asset-payload-material.cases.unit.test.ts +565 -0
  285. package/src/__tests__/parse-asset-payload-texture.cases.unit.test.ts +720 -0
  286. package/src/__tests__/parse-scene-payload-refs.cases.unit.test.ts +767 -0
  287. package/src/__tests__/pass-selector.cases.unit.test.ts +376 -0
  288. package/src/__tests__/pbr-pipeline.unit.test.ts +23 -5
  289. package/src/__tests__/pipeline-builder.cases.unit.test.ts +624 -0
  290. package/src/__tests__/pipeline-cache-key-topology.cases.unit.test.ts +807 -0
  291. package/src/__tests__/pipeline-vertex-stride-branch.cases.unit.test.ts +379 -0
  292. package/src/__tests__/pipeline.cases.unit.test.ts +370 -0
  293. package/src/__tests__/post-process-register.cases.unit.test.ts +405 -0
  294. package/src/__tests__/propagate-transforms.cases.unit.test.ts +502 -0
  295. package/src/__tests__/propagate-transforms.dawn.test.ts +19 -2
  296. package/src/__tests__/record-all-topology.cases.unit.test.ts +608 -0
  297. package/src/__tests__/record-draw-branch.cases.unit.test.ts +621 -0
  298. package/src/__tests__/record-strip-index-format.cases.unit.test.ts +419 -0
  299. package/src/__tests__/register-with-guid-rgba16float.cases.unit.test.ts +469 -0
  300. package/src/__tests__/render-data.cases.unit.test.ts +553 -0
  301. package/src/__tests__/render-error-exhaustive.test-d.ts +1 -0
  302. package/src/__tests__/render-query-regression.cases.unit.test.ts +531 -0
  303. package/src/__tests__/render-system-record-submesh.cases.unit.test.ts +740 -0
  304. package/src/__tests__/render-system-record-warn-once.cases.unit.test.ts +418 -0
  305. package/src/__tests__/render-system-record.test.ts +15 -33
  306. package/src/__tests__/renderer-device-loss-multi-world.integration.test.ts +103 -0
  307. package/src/__tests__/renderer-device-loss-provider-feasibility.dawn.test.ts +124 -0
  308. package/src/__tests__/renderer-device-loss-recovery.dawn.test.ts +50 -0
  309. package/src/__tests__/renderer-draw-world.cases.unit.test.ts +514 -0
  310. package/src/__tests__/renderer-recovery-consumer.integration.test.ts +96 -0
  311. package/src/__tests__/renderstate-pipeline-cache.cases.unit.test.ts +631 -0
  312. package/src/__tests__/resolve-scene-guids.cases.unit.test.ts +1123 -0
  313. package/src/__tests__/shadow-caster-empty-schema.test.ts +1 -1
  314. package/src/__tests__/shadow-fields-observable.dawn.test.ts +2 -2
  315. package/src/__tests__/shadow-m1.dawn.test.ts +1 -1
  316. package/src/__tests__/shadow-skip-non-triangle.cases.unit.test.ts +681 -0
  317. package/src/__tests__/skin-errors-kebab-case.cases.unit.test.ts +475 -0
  318. package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +5 -4
  319. package/src/__tests__/skin-instances-coexist.cases.unit.test.ts +375 -0
  320. package/src/__tests__/skin-m2-extract-happy.cases.unit.test.ts +592 -0
  321. package/src/__tests__/skin-m2-extract-joint-error.cases.unit.test.ts +619 -0
  322. package/src/__tests__/skin-m2-extract-null-assets.cases.unit.test.ts +569 -0
  323. package/src/__tests__/skin-m2-extract-skeleton-error.cases.unit.test.ts +585 -0
  324. package/src/__tests__/skin-m3-record-cache.cases.unit.test.ts +457 -0
  325. package/src/__tests__/skin-palette-extract.cases.unit.test.ts +635 -0
  326. package/src/__tests__/skin-pipeline-routing.cases.unit.test.ts +411 -0
  327. package/src/__tests__/skin.cases.unit.test.ts +421 -0
  328. package/src/__tests__/skybox-extract.cases.unit.test.ts +511 -0
  329. package/src/__tests__/skybox-shader-compile.cases.unit.test.ts +437 -0
  330. package/src/__tests__/skylight-bind-group.cases.unit.test.ts +642 -0
  331. package/src/__tests__/skylight-component.cases.unit.test.ts +386 -0
  332. package/src/__tests__/skylight-fallback-path.cases.unit.test.ts +566 -0
  333. package/src/__tests__/skylight-lazy-projection.test.ts +35 -20
  334. package/src/__tests__/skylight-pipeline-layout.cases.unit.test.ts +506 -0
  335. package/src/__tests__/skylight-solid-color-extract.cases.unit.test.ts +399 -0
  336. package/src/__tests__/sprite-animation-tick-boundary.cases.unit.test.ts +521 -0
  337. package/src/__tests__/sprite-animation-tick-clamp.cases.unit.test.ts +453 -0
  338. package/src/__tests__/sprite-animation-tick-frame-duration-negative.cases.unit.test.ts +447 -0
  339. package/src/__tests__/sprite-animation-tick-frame-duration-zero.cases.unit.test.ts +395 -0
  340. package/src/__tests__/sprite-animation-tick-loop.cases.unit.test.ts +494 -0
  341. package/src/__tests__/sprite-animation-tick-override-probe.cases.unit.test.ts +439 -0
  342. package/src/__tests__/sprite-animation-tick-regions-mismatch.cases.unit.test.ts +466 -0
  343. package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +5 -5
  344. package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
  345. package/src/__tests__/ssao-pipelines.test.ts +1 -1
  346. package/src/__tests__/storage-buffer-caps.cases.unit.test.ts +373 -0
  347. package/src/__tests__/systems.cases.unit.test.ts +425 -0
  348. package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +1 -1
  349. package/src/__tests__/tonemap-hdr-target.cases.unit.test.ts +670 -0
  350. package/src/__tests__/tonemap-pipeline-split.cases.unit.test.ts +867 -0
  351. package/src/__tests__/tonemap.cases.unit.test.ts +446 -0
  352. package/src/__tests__/transparent-sort-config-get.cases.unit.test.ts +395 -0
  353. package/src/__tests__/transparent-sort-config-set.cases.unit.test.ts +424 -0
  354. package/src/__tests__/transparent-sort.cases.unit.test.ts +684 -0
  355. package/src/__tests__/upload-texture-consistency.cases.unit.test.ts +478 -0
  356. package/src/__tests__/verify-revisions.cases.unit.test.ts +619 -0
  357. package/src/__tests__/wire-default-loaders.cases.unit.test.ts +461 -0
  358. package/src/__tests__/zero-camera-clear-fallback.cases.unit.test.ts +374 -0
  359. package/src/dev-import-transport.ts +2 -1
  360. package/dist/__tests__/asset.unit.test.d.ts +0 -2
  361. package/dist/__tests__/asset.unit.test.d.ts.map +0 -1
  362. package/dist/__tests__/pipeline.unit.test.d.ts +0 -2
  363. package/dist/__tests__/pipeline.unit.test.d.ts.map +0 -1
  364. package/dist/__tests__/systems.unit.test.d.ts +0 -2
  365. package/dist/__tests__/systems.unit.test.d.ts.map +0 -1
  366. package/src/__tests__/asset.unit.test.ts +0 -7113
  367. package/src/__tests__/pipeline.unit.test.ts +0 -5279
  368. package/src/__tests__/systems.unit.test.ts +0 -9061
@@ -126,7 +126,7 @@ async function readbackRgba16f(
126
126
  texture: GPUTexture,
127
127
  arrayLayer: number,
128
128
  mipLevel: number,
129
- ): Promise<number[]> {
129
+ ): Promise<{ values: number[]; rawBytes: number[] }> {
130
130
  // Read one pixel from (0,0) of (face=arrayLayer, mip=mipLevel).
131
131
  const bytesPerRow = 256;
132
132
  const buffer = device.createBuffer({
@@ -142,7 +142,8 @@ async function readbackRgba16f(
142
142
  device.queue.submit([encoder.finish()]);
143
143
  await buffer.mapAsync(0x0001 /* MAP_READ */);
144
144
  const range = buffer.getMappedRange();
145
- const dv = new DataView(range.slice(0));
145
+ const raw = new Uint8Array(range.slice(0));
146
+ const dv = new DataView(raw.buffer);
146
147
  buffer.unmap();
147
148
  const f16ToF32 = (u16: number) => {
148
149
  const sign = (u16 & 0x8000) >> 15;
@@ -152,12 +153,129 @@ async function readbackRgba16f(
152
153
  if (exp === 0x1f) return frac ? Number.NaN : (sign ? -1 : 1) * Number.POSITIVE_INFINITY;
153
154
  return (sign ? -1 : 1) * 2 ** (exp - 15) * (1 + frac / 1024);
154
155
  };
155
- return [
156
- f16ToF32(dv.getUint16(0, true)),
157
- f16ToF32(dv.getUint16(2, true)),
158
- f16ToF32(dv.getUint16(4, true)),
159
- f16ToF32(dv.getUint16(6, true)),
160
- ];
156
+ return {
157
+ values: [
158
+ f16ToF32(dv.getUint16(0, true)),
159
+ f16ToF32(dv.getUint16(2, true)),
160
+ f16ToF32(dv.getUint16(4, true)),
161
+ f16ToF32(dv.getUint16(6, true)),
162
+ ],
163
+ rawBytes: [...raw.slice(0, 8)],
164
+ };
165
+ }
166
+
167
+ interface TextureReadbackSpec {
168
+ readonly label: string;
169
+ readonly texture: GPUTexture;
170
+ readonly width: number;
171
+ readonly height: number;
172
+ readonly faces: number;
173
+ readonly mipLevels: number;
174
+ readonly identity: string;
175
+ }
176
+
177
+ /**
178
+ * Submit all subresource copies before mapping any staging buffer. This keeps
179
+ * the readback observational: no producer pass is interrupted by a map/wait.
180
+ */
181
+ async function assertFiniteTextureRgba16f(
182
+ device: GPUDevice,
183
+ spec: TextureReadbackSpec,
184
+ ): Promise<void> {
185
+ const bytesPerPixel = 8;
186
+ const parts: Array<{
187
+ readonly buffer: GPUBuffer;
188
+ readonly width: number;
189
+ readonly height: number;
190
+ readonly face: number;
191
+ readonly mip: number;
192
+ readonly rowPitch: number;
193
+ }> = [];
194
+ const encoder = device.createCommandEncoder({ label: `${spec.label}-full-readback` });
195
+ for (let mip = 0; mip < spec.mipLevels; mip += 1) {
196
+ const width = Math.max(1, spec.width >> mip);
197
+ const height = Math.max(1, spec.height >> mip);
198
+ const rowPitch = Math.ceil((width * bytesPerPixel) / 256) * 256;
199
+ for (let face = 0; face < spec.faces; face += 1) {
200
+ const buffer = device.createBuffer({
201
+ label: `${spec.label}-readback-face${face}-mip${mip}`,
202
+ size: rowPitch * height,
203
+ usage: 0x0001 | 0x0008,
204
+ });
205
+ encoder.copyTextureToBuffer(
206
+ { texture: spec.texture, mipLevel: mip, origin: { x: 0, y: 0, z: face } },
207
+ { buffer, bytesPerRow: rowPitch },
208
+ { width, height, depthOrArrayLayers: 1 },
209
+ );
210
+ parts.push({ buffer, width, height, face, mip, rowPitch });
211
+ }
212
+ }
213
+ device.queue.submit([encoder.finish()]);
214
+ await Promise.all(parts.map((part) => part.buffer.mapAsync(0x0001)));
215
+ try {
216
+ for (const part of parts) {
217
+ const raw = new Uint8Array(part.buffer.getMappedRange()).slice();
218
+ const view = new DataView(raw.buffer);
219
+ for (let y = 0; y < part.height; y += 1) {
220
+ for (let x = 0; x < part.width; x += 1) {
221
+ const offset = y * part.rowPitch + x * bytesPerPixel;
222
+ for (let channel = 0; channel < 4; channel += 1) {
223
+ const value = f16ToF32(view.getUint16(offset + channel * 2, true));
224
+ if (!Number.isFinite(value)) {
225
+ const rawBytes = [...raw.slice(offset, offset + bytesPerPixel)];
226
+ throw new Error(
227
+ `${spec.label} non-finite sample at texture=${spec.identity}, face=${part.face}, mip=${part.mip}, x=${x}, y=${y}; rawBytes=${rawBytes.join(',')}`,
228
+ );
229
+ }
230
+ }
231
+ }
232
+ }
233
+ }
234
+ } finally {
235
+ for (const part of parts) {
236
+ part.buffer.unmap();
237
+ part.buffer.destroy();
238
+ }
239
+ }
240
+ }
241
+
242
+ function f16ToF32(u16: number): number {
243
+ const sign = (u16 & 0x8000) >> 15;
244
+ const exp = (u16 & 0x7c00) >> 10;
245
+ const frac = u16 & 0x03ff;
246
+ if (exp === 0) return (sign ? -1 : 1) * 2 ** -14 * (frac / 1024);
247
+ if (exp === 0x1f) return frac ? Number.NaN : (sign ? -1 : 1) * Number.POSITIVE_INFINITY;
248
+ return (sign ? -1 : 1) * 2 ** (exp - 15) * (1 + frac / 1024);
249
+ }
250
+
251
+ async function loadPhysicalGuidEquirect(): Promise<EquirectAsset> {
252
+ const fs = await import('node:fs');
253
+ const path = await import('node:path');
254
+ const crypto = await import('node:crypto');
255
+ const here = path.dirname(new URL(import.meta.url).pathname);
256
+ const guid = '019e4a26-3c29-7420-af5d-20f2724a16b0';
257
+ const bodyPath = path.resolve(
258
+ here,
259
+ '../../../../../apps/hello/physical-material/dist/assets',
260
+ `${guid}-body.bin`,
261
+ );
262
+ const raw = (fs.readFileSync as unknown as (path: string) => Uint8Array)(bodyPath);
263
+ const data = new Uint8Array(raw.byteLength);
264
+ data.set(raw);
265
+ const digest = crypto.createHash('sha256').update(data).digest('hex');
266
+ const expected = '391ac77feea42745a6ae6b12d4da46bed90e8af4721525f4def0882c10cd8084';
267
+ if (digest !== expected) throw new Error(`physical HDR body hash mismatch: ${digest}`);
268
+ console.error(
269
+ `[ibl-diagnostic] ${JSON.stringify({ sourceGuid: guid, bodyPath, bodySha256: digest, width: 1600, height: 800, format: 'rgba16float', deviceGeneration: 0 })}`,
270
+ );
271
+ return {
272
+ kind: 'equirect',
273
+ width: 1600,
274
+ height: 800,
275
+ format: 'rgba16float',
276
+ data,
277
+ colorSpace: 'linear',
278
+ };
161
279
  }
162
280
 
163
281
  describe('t51 (M3.5) -- dawn IBL 4-pass non-zero readback', () => {
@@ -184,7 +302,10 @@ describe('t51 (M3.5) -- dawn IBL 4-pass non-zero readback', () => {
184
302
  const scope = DeviceScope.create(0, 'ibl-dawn-test');
185
303
  store.bindDeviceScope(scope);
186
304
  const world = new World();
187
- const equirect = makeWhiteEquirect();
305
+ const equirect =
306
+ process.env.FORGEAX_IBL_REAL_SOURCE === '1'
307
+ ? await loadPhysicalGuidEquirect()
308
+ : makeWhiteEquirect();
188
309
  const equirectHandle = world.allocSharedRef('EquirectAsset', equirect);
189
310
 
190
311
  // The production path receives the opaque RhiDevice and the same
@@ -220,7 +341,16 @@ describe('t51 (M3.5) -- dawn IBL 4-pass non-zero readback', () => {
220
341
 
221
342
  // (a) equirect-to-cube face 0 center pixel != 0
222
343
  const cubePx = await readbackRgba16f(rawDevice, cubeRaw, 0, 0);
223
- expect(cubePx.some((c) => c !== 0)).toBe(true);
344
+ expect(cubePx.values.some((c) => c !== 0)).toBe(true);
345
+ await assertFiniteTextureRgba16f(rawDevice, {
346
+ label: 'base-cube',
347
+ texture: cubeRaw,
348
+ width: Math.min(equirect.width, equirect.height),
349
+ height: Math.min(equirect.width, equirect.height),
350
+ faces: 6,
351
+ mipLevels: 1,
352
+ identity: 'cubemap-source',
353
+ });
224
354
 
225
355
  // (b) irradiance, (c) prefilter, (d) brdfLut: the textures live on
226
356
  // IblPipelineCache after t52/t53. Read opaque cache slots through the
@@ -234,16 +364,53 @@ describe('t51 (M3.5) -- dawn IBL 4-pass non-zero readback', () => {
234
364
  expect(irrTex).toBeDefined();
235
365
  expect(prefTex).toBeDefined();
236
366
  expect(brdfTex).toBeDefined();
237
- if (irrTex === undefined || prefTex === undefined || brdfTex === undefined) return;
367
+ expect(cache.prefilterFaceViewsByMip).toBeDefined();
368
+ if (
369
+ irrTex === undefined ||
370
+ prefTex === undefined ||
371
+ brdfTex === undefined ||
372
+ cache.prefilterFaceViewsByMip === undefined
373
+ )
374
+ return;
238
375
 
239
- const irrPx = await readbackRgba16f(rawDevice, rawTexture(irrTex), 0, 0);
240
- expect(irrPx.some((c) => c !== 0)).toBe(true);
376
+ const irrRaw = rawTexture(irrTex);
377
+ const irrPx = await readbackRgba16f(rawDevice, irrRaw, 0, 0);
378
+ expect(irrPx.values.some((c) => c !== 0)).toBe(true);
379
+ await assertFiniteTextureRgba16f(rawDevice, {
380
+ label: 'irradiance',
381
+ texture: irrRaw,
382
+ width: 32,
383
+ height: 32,
384
+ faces: 6,
385
+ mipLevels: 1,
386
+ identity: 'ibl-irradiance-cube',
387
+ });
241
388
 
242
- const prefPx = await readbackRgba16f(rawDevice, rawTexture(prefTex), 0, 0);
243
- expect(prefPx.some((c) => c !== 0)).toBe(true);
389
+ const prefRaw = rawTexture(prefTex);
390
+ const prefPx = await readbackRgba16f(rawDevice, prefRaw, 0, 0);
391
+ expect(prefPx.values.some((c) => c !== 0)).toBe(true);
392
+ await assertFiniteTextureRgba16f(rawDevice, {
393
+ label: 'prefilter',
394
+ texture: prefRaw,
395
+ width: 128,
396
+ height: 128,
397
+ faces: 6,
398
+ mipLevels: cache.prefilterFaceViewsByMip.length,
399
+ identity: 'ibl-prefilter-cube',
400
+ });
244
401
 
245
- const brdfPx = await readbackRgba16f(rawDevice, rawTexture(brdfTex), 0, 0);
246
- expect(brdfPx.some((c) => c !== 0)).toBe(true);
402
+ const brdfRaw = rawTexture(brdfTex);
403
+ const brdfPx = await readbackRgba16f(rawDevice, brdfRaw, 0, 0);
404
+ expect(brdfPx.values.some((c) => c !== 0)).toBe(true);
405
+ await assertFiniteTextureRgba16f(rawDevice, {
406
+ label: 'brdf-lut',
407
+ texture: brdfRaw,
408
+ width: 256,
409
+ height: 256,
410
+ faces: 1,
411
+ mipLevels: 1,
412
+ identity: 'ibl-brdf-lut',
413
+ });
247
414
  },
248
415
  60_000,
249
416
  );
@@ -22,6 +22,7 @@ const ENGINE_MANIFEST = await (async () => {
22
22
  return buildEngineShaderManifest();
23
23
  })();
24
24
  const ENGINE_MANIFEST_URL = `data:application/json,${encodeURIComponent(JSON.stringify(ENGINE_MANIFEST))}`;
25
+ const LIGHTWEIGHT_DAWN = process.env.FORGEAX_DAWN_LIGHTWEIGHT === '1';
25
26
 
26
27
  interface AlphaCase {
27
28
  readonly caseId: string;
@@ -92,6 +93,16 @@ const CASES: readonly AlphaCase[] = [
92
93
  },
93
94
  ];
94
95
 
96
+ const DAWN_CASES = LIGHTWEIGHT_DAWN
97
+ ? CASES.filter((testCase) =>
98
+ [
99
+ 'material-alpha-rgba-factor',
100
+ 'material-alpha-mask-explicit',
101
+ 'material-alpha-blend',
102
+ ].includes(testCase.caseId),
103
+ )
104
+ : CASES;
105
+
95
106
  function textureBytes(color: readonly [number, number, number, number]): Uint8Array {
96
107
  return Uint8Array.from(color.map((channel) => Math.round(channel * 255)));
97
108
  }
@@ -224,13 +235,12 @@ async function captureCase(testCase: AlphaCase): Promise<[number, number, number
224
235
  }
225
236
  : { cullMode: 'none' as const };
226
237
  const material = Materials.standard({
227
- baseColor: [
238
+ baseColor: Materials.srgb([
228
239
  testCase.baseColor[0],
229
240
  testCase.baseColor[1],
230
241
  testCase.baseColor[2],
231
242
  testCase.baseAlpha,
232
- ],
233
- colorSpace: 'srgb',
243
+ ]),
234
244
  castShadow: false,
235
245
  metallic: 0,
236
246
  roughness: 1,
@@ -281,7 +291,10 @@ function expectedVisible(testCase: AlphaCase): boolean {
281
291
  }
282
292
 
283
293
  describe('M2 runtime PBR alpha readback', () => {
284
- for (const testCase of CASES) {
294
+ // The browser parity gate still closes all seven alpha cases. Dawn keeps
295
+ // one opaque, one mask, and one blend boundary on overloaded PR runners;
296
+ // local/nightly runs retain the complete threshold matrix.
297
+ for (const testCase of DAWN_CASES) {
285
298
  it(`${testCase.caseId}: Materials.standard single draw is observable`, async () => {
286
299
  const actual = await captureCase(testCase);
287
300
  const expected = testCase.clear.map((channel) => Math.round(channel * 255));
@@ -50,7 +50,7 @@ const standardPbrSchema: readonly ParamSchemaEntry[] = [
50
50
  { name: 'occlusionStrength', type: 'f32', default: 1 },
51
51
  { name: 'alphaCutoff', type: 'f32', default: 0 },
52
52
  { name: 'clearcoat', type: 'f32', default: 0 },
53
- { name: 'clearcoatRoughness', type: 'f32', default: 0.5 },
53
+ { name: 'clearcoatRoughness', type: 'f32', default: 1 },
54
54
  { name: 'baseColorTexture', type: 'texture2d' },
55
55
  { name: 'metallicRoughnessTexture', type: 'texture2d' },
56
56
  { name: 'normalTexture', type: 'texture2d' },
@@ -202,12 +202,12 @@ const defaultStandardPbrSchema: readonly ParamSchemaEntry[] = [
202
202
  { name: 'occlusionStrength', type: 'f32', default: 1 },
203
203
  { name: 'alphaCutoff', type: 'f32', default: 0 },
204
204
  { name: 'clearcoat', type: 'f32', default: 0 },
205
- { name: 'clearcoatRoughness', type: 'f32', default: 0.5 },
206
- { name: 'specularTint', type: 'vec3', default: [1, 1, 1] },
205
+ { name: 'clearcoatRoughness', type: 'f32', default: 1 },
206
+ { name: 'specularColor', type: 'vec3', default: [1, 1, 1] },
207
207
  { name: 'baseColorTexture', type: 'texture2d' },
208
208
  { name: 'metallicRoughnessTexture', type: 'texture2d' },
209
209
  { name: 'normalTexture', type: 'texture2d' },
210
- { name: 'specularTintTexture', type: 'texture2d' },
210
+ { name: 'specularColorTexture', type: 'texture2d' },
211
211
  ];
212
212
 
213
213
  describe('built-in PBR derive+injection regression fence (M1 w1)', () => {
@@ -234,7 +234,7 @@ describe('built-in PBR derive+injection regression fence (M1 w1)', () => {
234
234
  expect(out.textureFieldNames.has('baseColorTexture')).toBe(true);
235
235
  expect(out.textureFieldNames.has('metallicRoughnessTexture')).toBe(true);
236
236
  expect(out.textureFieldNames.has('normalTexture')).toBe(true);
237
- expect(out.textureFieldNames.has('specularTintTexture')).toBe(true);
237
+ expect(out.textureFieldNames.has('specularColorTexture')).toBe(true);
238
238
 
239
239
  // sampler map: each texture has a paired sampler.
240
240
  expect(out.samplerForTexture.size).toBe(4);
@@ -243,7 +243,7 @@ describe('built-in PBR derive+injection regression fence (M1 w1)', () => {
243
243
  'metallicRoughnessTexture_sampler',
244
244
  );
245
245
  expect(out.samplerForTexture.get('normalTexture')).toBe('normalTexture_sampler');
246
- expect(out.samplerForTexture.get('specularTintTexture')).toBe('specularTintTexture_sampler');
246
+ expect(out.samplerForTexture.get('specularColorTexture')).toBe('specularColorTexture_sampler');
247
247
  });
248
248
 
249
249
  it('w1 full pipeline: derive + ibl injection + lightmap injection = 20 entries dense 0..19', () => {
@@ -337,7 +337,7 @@ const parallax4TextureSchema: readonly ParamSchemaEntry[] = [
337
337
  { name: 'baseColorTexture', type: 'texture2d' },
338
338
  { name: 'metallicRoughnessTexture', type: 'texture2d' },
339
339
  { name: 'normalTexture', type: 'texture2d' },
340
- { name: 'specularTintTexture', type: 'texture2d' },
340
+ { name: 'specularColorTexture', type: 'texture2d' },
341
341
  { name: 'heightTexture', type: 'texture2d' },
342
342
  ];
343
343
 
@@ -354,7 +354,7 @@ describe('5-texture custom schema derive: heightTexture binding + injection shif
354
354
  expect(out.bglEntries.length).toBe(11);
355
355
 
356
356
  // heightTexture is the 5th texture: sampler at binding 9, texture at binding 10.
357
- // (after baseColor 1/2, MR 3/4, normal 5/6, specular tint 7/8).
357
+ // (after baseColor 1/2, MR 3/4, and normal 5/6).
358
358
  const heightSampler = out.bglEntries[9];
359
359
  const heightTexture = out.bglEntries[10];
360
360
  expect(heightSampler?.binding).toBe(9);