@forgeax/engine-render 0.0.0-dev.8d955ade1c79

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 (891) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +647 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/authoring-path.unit.test.d.ts +2 -0
  5. package/dist/__tests__/authoring-path.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +2 -0
  7. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +1 -0
  8. package/dist/__tests__/callback-inference.test-d.d.ts +2 -0
  9. package/dist/__tests__/callback-inference.test-d.d.ts.map +1 -0
  10. package/dist/__tests__/cluster-binner.test.d.ts +2 -0
  11. package/dist/__tests__/cluster-binner.test.d.ts.map +1 -0
  12. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +2 -0
  13. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +1 -0
  14. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +2 -0
  15. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +1 -0
  16. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
  17. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
  18. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
  19. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
  20. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +2 -0
  21. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +1 -0
  22. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +2 -0
  23. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +1 -0
  24. package/dist/__tests__/factory-contract.integration.test.d.ts +2 -0
  25. package/dist/__tests__/factory-contract.integration.test.d.ts.map +1 -0
  26. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +2 -0
  27. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +1 -0
  28. package/dist/__tests__/frame-observation.contract.test.d.ts +2 -0
  29. package/dist/__tests__/frame-observation.contract.test.d.ts.map +1 -0
  30. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
  31. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
  32. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +2 -0
  33. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +1 -0
  34. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +6 -0
  35. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -0
  36. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +2 -0
  37. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +1 -0
  38. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +2 -0
  39. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +1 -0
  40. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +2 -0
  41. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +1 -0
  42. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +2 -0
  43. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +1 -0
  44. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +18 -0
  45. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -0
  46. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +2 -0
  47. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +1 -0
  48. package/dist/__tests__/gpu-driven-view-reference.d.ts +15 -0
  49. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
  50. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +2 -0
  51. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +1 -0
  52. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +2 -0
  53. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +1 -0
  54. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +2 -0
  55. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +1 -0
  56. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +2 -0
  57. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +1 -0
  58. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +7 -0
  59. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -0
  60. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +2 -0
  61. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +1 -0
  62. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +2 -0
  63. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +1 -0
  64. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +2 -0
  65. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +1 -0
  66. package/dist/__tests__/gpu-scene.dawn.test.d.ts +2 -0
  67. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +1 -0
  68. package/dist/__tests__/gpu-scene.unit.test.d.ts +2 -0
  69. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +1 -0
  70. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
  71. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
  72. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +2 -0
  73. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +1 -0
  74. package/dist/__tests__/injection-kind-owner.test-d.d.ts +2 -0
  75. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +1 -0
  76. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +2 -0
  77. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +1 -0
  78. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +2 -0
  79. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +1 -0
  80. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +2 -0
  81. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +1 -0
  82. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +2 -0
  83. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +1 -0
  84. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +2 -0
  85. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +1 -0
  86. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +2 -0
  87. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/material-stride-surface.unit.test.d.ts +2 -0
  89. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +2 -0
  91. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +1 -0
  92. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +2 -0
  93. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +1 -0
  94. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +2 -0
  95. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +1 -0
  96. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +2 -0
  97. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +1 -0
  98. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +2 -0
  99. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +1 -0
  100. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
  101. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +2 -0
  103. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +1 -0
  104. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +2 -0
  105. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +1 -0
  106. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +2 -0
  107. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +1 -0
  108. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +2 -0
  109. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +1 -0
  110. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +2 -0
  111. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +1 -0
  112. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +2 -0
  113. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +1 -0
  114. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +2 -0
  115. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +2 -0
  117. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +1 -0
  118. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +2 -0
  119. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +1 -0
  120. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +2 -0
  121. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +1 -0
  122. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +2 -0
  123. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +2 -0
  125. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +1 -0
  126. package/dist/__tests__/profiler-default-off.test.d.ts +2 -0
  127. package/dist/__tests__/profiler-default-off.test.d.ts.map +1 -0
  128. package/dist/__tests__/profiler-phase-catalog.test.d.ts +2 -0
  129. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +1 -0
  130. package/dist/__tests__/profiler-phase-integration.test.d.ts +2 -0
  131. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +1 -0
  132. package/dist/__tests__/profiler-phase-token.test.d.ts +2 -0
  133. package/dist/__tests__/profiler-phase-token.test.d.ts.map +1 -0
  134. package/dist/__tests__/public-surface.test-d.d.ts +2 -0
  135. package/dist/__tests__/public-surface.test-d.d.ts.map +1 -0
  136. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +2 -0
  137. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +1 -0
  138. package/dist/__tests__/render-error-code-owner.test-d.d.ts +2 -0
  139. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +1 -0
  140. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +2 -0
  141. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +1 -0
  142. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +2 -0
  143. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -0
  144. package/dist/__tests__/render-feature-assembly.test-d.d.ts +2 -0
  145. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +1 -0
  146. package/dist/__tests__/render-feature-context.test-d.d.ts +2 -0
  147. package/dist/__tests__/render-feature-context.test-d.d.ts.map +1 -0
  148. package/dist/__tests__/render-feature-contract.test-d.d.ts +2 -0
  149. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +1 -0
  150. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +2 -0
  151. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +1 -0
  152. package/dist/__tests__/render-feature-docs.unit.test.d.ts +2 -0
  153. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +1 -0
  154. package/dist/__tests__/render-feature-errors.unit.test.d.ts +2 -0
  155. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +1 -0
  156. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +2 -0
  157. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +1 -0
  158. package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
  159. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
  160. package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
  161. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
  162. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +2 -0
  163. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +1 -0
  164. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +2 -0
  165. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +1 -0
  166. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +2 -0
  167. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +1 -0
  168. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +2 -0
  169. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +1 -0
  170. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +2 -0
  171. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +1 -0
  172. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +2 -0
  173. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +1 -0
  174. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +2 -0
  175. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +1 -0
  176. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +2 -0
  177. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +1 -0
  178. package/dist/__tests__/render-feature-retry.unit.test.d.ts +2 -0
  179. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +1 -0
  180. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +2 -0
  181. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +1 -0
  182. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +2 -0
  183. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +1 -0
  184. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +2 -0
  185. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +1 -0
  186. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +2 -0
  187. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +1 -0
  188. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +2 -0
  189. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +1 -0
  190. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +2 -0
  191. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +1 -0
  192. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +7 -0
  193. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +1 -0
  194. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +2 -0
  195. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +1 -0
  196. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +2 -0
  197. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +1 -0
  198. package/dist/__tests__/render-graph-hzb-gpu.d.ts +7 -0
  199. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +1 -0
  200. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +2 -0
  201. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +1 -0
  202. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +2 -0
  203. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +1 -0
  204. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +2 -0
  205. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +1 -0
  206. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +12 -0
  207. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +1 -0
  208. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +2 -0
  209. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +1 -0
  210. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +2 -0
  211. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +1 -0
  212. package/dist/__tests__/render-scene-projection.unit.test.d.ts +2 -0
  213. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +1 -0
  214. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +2 -0
  215. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +1 -0
  216. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +2 -0
  217. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +1 -0
  218. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +2 -0
  219. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +1 -0
  220. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +2 -0
  221. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +1 -0
  222. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +2 -0
  223. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +1 -0
  224. package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
  225. package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
  226. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +2 -0
  227. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +1 -0
  228. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
  229. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
  230. package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
  231. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
  232. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
  233. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
  234. package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
  235. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
  236. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
  237. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
  238. package/dist/__tests__/surface-configuration.unit.test.d.ts +2 -0
  239. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +1 -0
  240. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +2 -0
  241. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +1 -0
  242. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +2 -0
  243. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +1 -0
  244. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +2 -0
  245. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +1 -0
  246. package/dist/__tests__/urp-pipeline.unit.test.d.ts +2 -0
  247. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +1 -0
  248. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +2 -0
  249. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +1 -0
  250. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +2 -0
  251. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +1 -0
  252. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +2 -0
  253. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +1 -0
  254. package/dist/__tests__/visibility-extract.integration.test.d.ts +2 -0
  255. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +1 -0
  256. package/dist/__tests__/visibility-extract.perf.test.d.ts +2 -0
  257. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +1 -0
  258. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +2 -0
  259. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +1 -0
  260. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +2 -0
  261. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +1 -0
  262. package/dist/__tests__/visibility-instances.integration.test.d.ts +2 -0
  263. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +1 -0
  264. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +2 -0
  265. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +1 -0
  266. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +2 -0
  267. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +1 -0
  268. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +2 -0
  269. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +1 -0
  270. package/dist/__tests__/visibility-public-surface.test-d.d.ts +2 -0
  271. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +1 -0
  272. package/dist/__tests__/visibility-resolver.unit.test.d.ts +2 -0
  273. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +1 -0
  274. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
  275. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
  276. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +2 -0
  277. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +1 -0
  278. package/dist/__tests__/vocabulary.unit.test.d.ts +2 -0
  279. package/dist/__tests__/vocabulary.unit.test.d.ts.map +1 -0
  280. package/dist/assembly/backend-contract.d.ts +37 -0
  281. package/dist/assembly/backend-contract.d.ts.map +1 -0
  282. package/dist/assembly/factory.d.ts +207 -0
  283. package/dist/assembly/factory.d.ts.map +1 -0
  284. package/dist/assembly/host-contract.d.ts +84 -0
  285. package/dist/assembly/host-contract.d.ts.map +1 -0
  286. package/dist/assembly/material/assembly.d.ts +21 -0
  287. package/dist/assembly/material/assembly.d.ts.map +1 -0
  288. package/dist/assembly/material/pipeline-projection.d.ts +30 -0
  289. package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
  290. package/dist/assets/asset-decoders.d.ts +5 -0
  291. package/dist/assets/asset-decoders.d.ts.map +1 -0
  292. package/dist/assets/render-asset-port.d.ts +17 -0
  293. package/dist/assets/render-asset-port.d.ts.map +1 -0
  294. package/dist/assets/resolve-render-asset.d.ts +6 -0
  295. package/dist/assets/resolve-render-asset.d.ts.map +1 -0
  296. package/dist/authoring.d.ts +12 -0
  297. package/dist/authoring.d.ts.map +1 -0
  298. package/dist/authoring.mjs +27 -0
  299. package/dist/authoring.mjs.map +1 -0
  300. package/dist/chunk-CQXZC5XI.mjs +182 -0
  301. package/dist/chunk-CQXZC5XI.mjs.map +1 -0
  302. package/dist/chunk-HCOGPHKS.mjs +93 -0
  303. package/dist/chunk-HCOGPHKS.mjs.map +1 -0
  304. package/dist/chunk-YEJIUW7D.mjs +1152 -0
  305. package/dist/chunk-YEJIUW7D.mjs.map +1 -0
  306. package/dist/cluster-binner.d.ts +152 -0
  307. package/dist/cluster-binner.d.ts.map +1 -0
  308. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +2 -0
  309. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +1 -0
  310. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +2 -0
  311. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +1 -0
  312. package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
  313. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
  314. package/dist/components/__tests__/schema-parity.unit.test.d.ts +2 -0
  315. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +1 -0
  316. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +2 -0
  317. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +1 -0
  318. package/dist/components/camera.d.ts +311 -0
  319. package/dist/components/camera.d.ts.map +1 -0
  320. package/dist/components/directional-light.d.ts +76 -0
  321. package/dist/components/directional-light.d.ts.map +1 -0
  322. package/dist/components/glyph-text.d.ts +26 -0
  323. package/dist/components/glyph-text.d.ts.map +1 -0
  324. package/dist/components/index.d.ts +24 -0
  325. package/dist/components/index.d.ts.map +1 -0
  326. package/dist/components/instances.d.ts +41 -0
  327. package/dist/components/instances.d.ts.map +1 -0
  328. package/dist/components/layer.d.ts +34 -0
  329. package/dist/components/layer.d.ts.map +1 -0
  330. package/dist/components/light-helpers.d.ts +53 -0
  331. package/dist/components/light-helpers.d.ts.map +1 -0
  332. package/dist/components/lines.d.ts +5 -0
  333. package/dist/components/lines.d.ts.map +1 -0
  334. package/dist/components/mesh-filter.d.ts +24 -0
  335. package/dist/components/mesh-filter.d.ts.map +1 -0
  336. package/dist/components/mesh-renderer.d.ts +33 -0
  337. package/dist/components/mesh-renderer.d.ts.map +1 -0
  338. package/dist/components/point-light-shadow.d.ts +27 -0
  339. package/dist/components/point-light-shadow.d.ts.map +1 -0
  340. package/dist/components/point-light.d.ts +35 -0
  341. package/dist/components/point-light.d.ts.map +1 -0
  342. package/dist/components/points.d.ts +15 -0
  343. package/dist/components/points.d.ts.map +1 -0
  344. package/dist/components/post-process-params.d.ts +5 -0
  345. package/dist/components/post-process-params.d.ts.map +1 -0
  346. package/dist/components/scene-instance.d.ts +140 -0
  347. package/dist/components/scene-instance.d.ts.map +1 -0
  348. package/dist/components/skybox-background.d.ts +56 -0
  349. package/dist/components/skybox-background.d.ts.map +1 -0
  350. package/dist/components/skylight.d.ts +55 -0
  351. package/dist/components/skylight.d.ts.map +1 -0
  352. package/dist/components/sort-key.d.ts +44 -0
  353. package/dist/components/sort-key.d.ts.map +1 -0
  354. package/dist/components/spot-light.d.ts +81 -0
  355. package/dist/components/spot-light.d.ts.map +1 -0
  356. package/dist/components/sprite-animation.d.ts +74 -0
  357. package/dist/components/sprite-animation.d.ts.map +1 -0
  358. package/dist/components/sprite-instances.d.ts +51 -0
  359. package/dist/components/sprite-instances.d.ts.map +1 -0
  360. package/dist/components/sprite-playback-mode.d.ts +42 -0
  361. package/dist/components/sprite-playback-mode.d.ts.map +1 -0
  362. package/dist/components/sprite-region-override.d.ts +46 -0
  363. package/dist/components/sprite-region-override.d.ts.map +1 -0
  364. package/dist/components/tile-layer.d.ts +106 -0
  365. package/dist/components/tile-layer.d.ts.map +1 -0
  366. package/dist/components/tilemap.d.ts +25 -0
  367. package/dist/components/tilemap.d.ts.map +1 -0
  368. package/dist/components/visibility.d.ts +22 -0
  369. package/dist/components/visibility.d.ts.map +1 -0
  370. package/dist/construct-renderer.d.ts +19 -0
  371. package/dist/construct-renderer.d.ts.map +1 -0
  372. package/dist/construct-renderer.mjs +27462 -0
  373. package/dist/construct-renderer.mjs.map +1 -0
  374. package/dist/debug-draw-glue.d.ts +5 -0
  375. package/dist/debug-draw-glue.d.ts.map +1 -0
  376. package/dist/device/device-scope.d.ts +83 -0
  377. package/dist/device/device-scope.d.ts.map +1 -0
  378. package/dist/device/gpu-residency.d.ts +337 -0
  379. package/dist/device/gpu-residency.d.ts.map +1 -0
  380. package/dist/device/resource-types.d.ts +8 -0
  381. package/dist/device/resource-types.d.ts.map +1 -0
  382. package/dist/engine-metrics.d.ts +23 -0
  383. package/dist/engine-metrics.d.ts.map +1 -0
  384. package/dist/errors/ecs-validation.d.ts +3 -0
  385. package/dist/errors/ecs-validation.d.ts.map +1 -0
  386. package/dist/errors/index.d.ts +4 -0
  387. package/dist/errors/index.d.ts.map +1 -0
  388. package/dist/errors/recover.d.ts +105 -0
  389. package/dist/errors/recover.d.ts.map +1 -0
  390. package/dist/errors/render.d.ts +705 -0
  391. package/dist/errors/render.d.ts.map +1 -0
  392. package/dist/extract/visibility.d.ts +26 -0
  393. package/dist/extract/visibility.d.ts.map +1 -0
  394. package/dist/features/fullscreen.d.ts +19 -0
  395. package/dist/features/fullscreen.d.ts.map +1 -0
  396. package/dist/features/host.d.ts +106 -0
  397. package/dist/features/host.d.ts.map +1 -0
  398. package/dist/features/morph/morph-feature.d.ts +79 -0
  399. package/dist/features/morph/morph-feature.d.ts.map +1 -0
  400. package/dist/features/plan.d.ts +182 -0
  401. package/dist/features/plan.d.ts.map +1 -0
  402. package/dist/features/prepared-gpu-work.d.ts +117 -0
  403. package/dist/features/prepared-gpu-work.d.ts.map +1 -0
  404. package/dist/features/prepared-graphics-store.d.ts +66 -0
  405. package/dist/features/prepared-graphics-store.d.ts.map +1 -0
  406. package/dist/features/prepared-graphics.d.ts +215 -0
  407. package/dist/features/prepared-graphics.d.ts.map +1 -0
  408. package/dist/features/render-graph-compute.d.ts +13 -0
  409. package/dist/features/render-graph-compute.d.ts.map +1 -0
  410. package/dist/features/render-graph-contribution.d.ts +12 -0
  411. package/dist/features/render-graph-contribution.d.ts.map +1 -0
  412. package/dist/features/render-graph-raster.d.ts +38 -0
  413. package/dist/features/render-graph-raster.d.ts.map +1 -0
  414. package/dist/features/render-graph-resources.d.ts +11 -0
  415. package/dist/features/render-graph-resources.d.ts.map +1 -0
  416. package/dist/features/targets.d.ts +32 -0
  417. package/dist/features/targets.d.ts.map +1 -0
  418. package/dist/features/types.d.ts +68 -0
  419. package/dist/features/types.d.ts.map +1 -0
  420. package/dist/features/vocabulary.d.ts +14 -0
  421. package/dist/features/vocabulary.d.ts.map +1 -0
  422. package/dist/fullscreen-post-process-pass.d.ts +157 -0
  423. package/dist/fullscreen-post-process-pass.d.ts.map +1 -0
  424. package/dist/glyph-text-layout-system.d.ts +19 -0
  425. package/dist/glyph-text-layout-system.d.ts.map +1 -0
  426. package/dist/gpu-driven/batch-topology.d.ts +55 -0
  427. package/dist/gpu-driven/batch-topology.d.ts.map +1 -0
  428. package/dist/gpu-driven/production-raster.d.ts +51 -0
  429. package/dist/gpu-driven/production-raster.d.ts.map +1 -0
  430. package/dist/gpu-driven/view-gpu.d.ts +85 -0
  431. package/dist/gpu-driven/view-gpu.d.ts.map +1 -0
  432. package/dist/gpu-resource.d.ts +73 -0
  433. package/dist/gpu-resource.d.ts.map +1 -0
  434. package/dist/gpu-scene-schema.d.ts +78 -0
  435. package/dist/gpu-scene-schema.d.ts.map +1 -0
  436. package/dist/gpu-scene.d.ts +55 -0
  437. package/dist/gpu-scene.d.ts.map +1 -0
  438. package/dist/gpu-stage.d.ts +4 -0
  439. package/dist/gpu-stage.d.ts.map +1 -0
  440. package/dist/gpu-texture-usage.d.ts +6 -0
  441. package/dist/gpu-texture-usage.d.ts.map +1 -0
  442. package/dist/gpu-usage.d.ts +9 -0
  443. package/dist/gpu-usage.d.ts.map +1 -0
  444. package/dist/hdrp-buffers.d.ts +163 -0
  445. package/dist/hdrp-buffers.d.ts.map +1 -0
  446. package/dist/ibl/IblPipelineCache.d.ts +168 -0
  447. package/dist/ibl/IblPipelineCache.d.ts.map +1 -0
  448. package/dist/ibl/skylight-bind-group.d.ts +130 -0
  449. package/dist/ibl/skylight-bind-group.d.ts.map +1 -0
  450. package/dist/index.d.ts +31 -0
  451. package/dist/index.d.ts.map +1 -0
  452. package/dist/index.mjs +169 -0
  453. package/dist/index.mjs.map +1 -0
  454. package/dist/inspection-types.d.ts +72 -0
  455. package/dist/inspection-types.d.ts.map +1 -0
  456. package/dist/instance-buffer-cache.d.ts +56 -0
  457. package/dist/instance-buffer-cache.d.ts.map +1 -0
  458. package/dist/internal.d.ts +2 -0
  459. package/dist/internal.d.ts.map +1 -0
  460. package/dist/internal.mjs +3 -0
  461. package/dist/internal.mjs.map +1 -0
  462. package/dist/lifecycle.d.ts +62 -0
  463. package/dist/lifecycle.d.ts.map +1 -0
  464. package/dist/light-buffer-layout.d.ts +164 -0
  465. package/dist/light-buffer-layout.d.ts.map +1 -0
  466. package/dist/materials.d.ts +47 -0
  467. package/dist/materials.d.ts.map +1 -0
  468. package/dist/mesh-material-bindings.d.ts +43 -0
  469. package/dist/mesh-material-bindings.d.ts.map +1 -0
  470. package/dist/pbr-pipeline.d.ts +301 -0
  471. package/dist/pbr-pipeline.d.ts.map +1 -0
  472. package/dist/pipeline/standard-forward-lane.d.ts +5 -0
  473. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
  474. package/dist/pipeline/standard-pipeline.d.ts +31 -0
  475. package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
  476. package/dist/pipeline/standard-profile.d.ts +40 -0
  477. package/dist/pipeline/standard-profile.d.ts.map +1 -0
  478. package/dist/pipeline-builder.d.ts +122 -0
  479. package/dist/pipeline-builder.d.ts.map +1 -0
  480. package/dist/pipeline-spec-types.d.ts +24 -0
  481. package/dist/pipeline-spec-types.d.ts.map +1 -0
  482. package/dist/pipeline-spec.d.ts +367 -0
  483. package/dist/pipeline-spec.d.ts.map +1 -0
  484. package/dist/plugin.d.ts +4 -0
  485. package/dist/plugin.d.ts.map +1 -0
  486. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +2 -0
  487. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +1 -0
  488. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +2 -0
  489. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +1 -0
  490. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +2 -0
  491. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +1 -0
  492. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +2 -0
  493. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +1 -0
  494. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +2 -0
  495. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +1 -0
  496. package/dist/points-lines/__tests__/points-lines.bench.d.ts +2 -0
  497. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +1 -0
  498. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +2 -0
  499. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +1 -0
  500. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +2 -0
  501. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +1 -0
  502. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +2 -0
  503. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +1 -0
  504. package/dist/points-lines/admission.d.ts +36 -0
  505. package/dist/points-lines/admission.d.ts.map +1 -0
  506. package/dist/points-lines/bounds.d.ts +8 -0
  507. package/dist/points-lines/bounds.d.ts.map +1 -0
  508. package/dist/points-lines/expansion-cache.d.ts +28 -0
  509. package/dist/points-lines/expansion-cache.d.ts.map +1 -0
  510. package/dist/points-lines/inspection.d.ts +53 -0
  511. package/dist/points-lines/inspection.d.ts.map +1 -0
  512. package/dist/points-lines/prepare.d.ts +67 -0
  513. package/dist/points-lines/prepare.d.ts.map +1 -0
  514. package/dist/points-lines/record.d.ts +60 -0
  515. package/dist/points-lines/record.d.ts.map +1 -0
  516. package/dist/points-lines/snapshot.d.ts +49 -0
  517. package/dist/points-lines/snapshot.d.ts.map +1 -0
  518. package/dist/post-process-errors.d.ts +182 -0
  519. package/dist/post-process-errors.d.ts.map +1 -0
  520. package/dist/prepare/prepared-graphics-resolver.d.ts +59 -0
  521. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -0
  522. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +2 -0
  523. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +1 -0
  524. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +2 -0
  525. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +1 -0
  526. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
  527. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
  528. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +2 -0
  529. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +1 -0
  530. package/dist/record/frame-lighting.d.ts +121 -0
  531. package/dist/record/frame-lighting.d.ts.map +1 -0
  532. package/dist/record/frame-snapshot.d.ts +429 -0
  533. package/dist/record/frame-snapshot.d.ts.map +1 -0
  534. package/dist/record/frame-targets.d.ts +20 -0
  535. package/dist/record/frame-targets.d.ts.map +1 -0
  536. package/dist/record/frame.d.ts +71 -0
  537. package/dist/record/frame.d.ts.map +1 -0
  538. package/dist/record/helpers.d.ts +102 -0
  539. package/dist/record/helpers.d.ts.map +1 -0
  540. package/dist/record/main-pass-geometry.d.ts +28 -0
  541. package/dist/record/main-pass-geometry.d.ts.map +1 -0
  542. package/dist/record/main-pass-material.d.ts +204 -0
  543. package/dist/record/main-pass-material.d.ts.map +1 -0
  544. package/dist/record/main-pass-sprite-draws.d.ts +43 -0
  545. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -0
  546. package/dist/record/main-pass.d.ts +20 -0
  547. package/dist/record/main-pass.d.ts.map +1 -0
  548. package/dist/record/mesh-ssbo.d.ts +446 -0
  549. package/dist/record/mesh-ssbo.d.ts.map +1 -0
  550. package/dist/record/render-context.d.ts +252 -0
  551. package/dist/record/render-context.d.ts.map +1 -0
  552. package/dist/record/shadow-pass.d.ts +52 -0
  553. package/dist/record/shadow-pass.d.ts.map +1 -0
  554. package/dist/record/skybox-post-pass.d.ts +33 -0
  555. package/dist/record/skybox-post-pass.d.ts.map +1 -0
  556. package/dist/record/typed-frame-graph.d.ts +35 -0
  557. package/dist/record/typed-frame-graph.d.ts.map +1 -0
  558. package/dist/record/view-ubo.d.ts +45 -0
  559. package/dist/record/view-ubo.d.ts.map +1 -0
  560. package/dist/render-contract.d.ts +424 -0
  561. package/dist/render-contract.d.ts.map +1 -0
  562. package/dist/render-data.d.ts +143 -0
  563. package/dist/render-data.d.ts.map +1 -0
  564. package/dist/render-graph-primitives.d.ts +76 -0
  565. package/dist/render-graph-primitives.d.ts.map +1 -0
  566. package/dist/render-pipeline.d.ts +110 -0
  567. package/dist/render-pipeline.d.ts.map +1 -0
  568. package/dist/render-system-extract.d.ts +868 -0
  569. package/dist/render-system-extract.d.ts.map +1 -0
  570. package/dist/render-system.d.ts +125 -0
  571. package/dist/render-system.d.ts.map +1 -0
  572. package/dist/scene/render-scene-types.d.ts +61 -0
  573. package/dist/scene/render-scene-types.d.ts.map +1 -0
  574. package/dist/scene/render-scene.d.ts +112 -0
  575. package/dist/scene/render-scene.d.ts.map +1 -0
  576. package/dist/scene-instances/post-spawn-resolve-joints.d.ts +30 -0
  577. package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -0
  578. package/dist/shadow-atlas.d.ts +117 -0
  579. package/dist/shadow-atlas.d.ts.map +1 -0
  580. package/dist/ssao-buffers.d.ts +50 -0
  581. package/dist/ssao-buffers.d.ts.map +1 -0
  582. package/dist/ssao-config.d.ts +28 -0
  583. package/dist/ssao-config.d.ts.map +1 -0
  584. package/dist/systems/active-camera.d.ts +53 -0
  585. package/dist/systems/active-camera.d.ts.map +1 -0
  586. package/dist/systems/pass-selector.d.ts +24 -0
  587. package/dist/systems/pass-selector.d.ts.map +1 -0
  588. package/dist/systems/skin-palette-allocator.d.ts +49 -0
  589. package/dist/systems/skin-palette-allocator.d.ts.map +1 -0
  590. package/dist/systems/skin-palette-types.d.ts +14 -0
  591. package/dist/systems/skin-palette-types.d.ts.map +1 -0
  592. package/dist/systems/transparent-sort-config.d.ts +112 -0
  593. package/dist/systems/transparent-sort-config.d.ts.map +1 -0
  594. package/dist/tilemap-chunk-extract-system.d.ts +143 -0
  595. package/dist/tilemap-chunk-extract-system.d.ts.map +1 -0
  596. package/dist/typed-render-graph-primitives.d.ts +57 -0
  597. package/dist/typed-render-graph-primitives.d.ts.map +1 -0
  598. package/dist/typed-shadow-passes.d.ts +11 -0
  599. package/dist/typed-shadow-passes.d.ts.map +1 -0
  600. package/package.json +94 -0
  601. package/src/__tests__/authoring-path.unit.test.ts +23 -0
  602. package/src/__tests__/backend-selection-rhi-capture.test-d.ts +21 -0
  603. package/src/__tests__/callback-inference.test-d.ts +8 -0
  604. package/src/__tests__/cluster-binner.test.ts +272 -0
  605. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +20 -0
  606. package/src/__tests__/construct-renderer-identity.unit.test.ts +23 -0
  607. package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
  608. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
  609. package/src/__tests__/direct-extract-consumer-contract.test-d.ts +23 -0
  610. package/src/__tests__/direct-light-snapshot.unit.test.ts +61 -0
  611. package/src/__tests__/factory-contract.integration.test.ts +280 -0
  612. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +15 -0
  613. package/src/__tests__/frame-observation.contract.test.ts +112 -0
  614. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
  615. package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +167 -0
  616. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +350 -0
  617. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +12 -0
  618. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +16 -0
  619. package/src/__tests__/gpu-driven-production.integration.test.ts +436 -0
  620. package/src/__tests__/gpu-driven-scaling.unit.test.ts +87 -0
  621. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +271 -0
  622. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +290 -0
  623. package/src/__tests__/gpu-driven-view-reference.ts +111 -0
  624. package/src/__tests__/gpu-driven-view.browser.test.ts +30 -0
  625. package/src/__tests__/gpu-driven-view.dawn.test.ts +28 -0
  626. package/src/__tests__/gpu-driven-view.unit.test.ts +199 -0
  627. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +59 -0
  628. package/src/__tests__/gpu-scene-render-graph-gpu.ts +308 -0
  629. package/src/__tests__/gpu-scene-render-graph.browser.test.ts +19 -0
  630. package/src/__tests__/gpu-scene-render-graph.dawn.test.ts +19 -0
  631. package/src/__tests__/gpu-scene-schema.unit.test.ts +16 -0
  632. package/src/__tests__/gpu-scene.dawn.test.ts +205 -0
  633. package/src/__tests__/gpu-scene.unit.test.ts +147 -0
  634. package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
  635. package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +92 -0
  636. package/src/__tests__/injection-kind-owner.test-d.ts +14 -0
  637. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +728 -0
  638. package/src/__tests__/light-buffer-layout.unit.test.ts +40 -0
  639. package/src/__tests__/material-contract-inventory.unit.test.ts +24 -0
  640. package/src/__tests__/material-cooked-projection.unit.test.ts +150 -0
  641. package/src/__tests__/material-snapshot-mutation.integration.test.ts +53 -0
  642. package/src/__tests__/material-static-dynamic-route.unit.test.ts +94 -0
  643. package/src/__tests__/material-stride-surface.unit.test.ts +32 -0
  644. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +106 -0
  645. package/src/__tests__/mesh-material-bindings.unit.test.ts +89 -0
  646. package/src/__tests__/mesh-stride-surface.unit.test.ts +16 -0
  647. package/src/__tests__/morph-culling-reentry.dawn.test.ts +157 -0
  648. package/src/__tests__/morph-feature-gpu-work.integration.test.ts +80 -0
  649. package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
  650. package/src/__tests__/morph-visual-evidence.integration.test.ts +80 -0
  651. package/src/__tests__/nineslice-handle-surface.unit.test.ts +19 -0
  652. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +201 -0
  653. package/src/__tests__/prepared-buffer-kind-owner.test-d.ts +29 -0
  654. package/src/__tests__/prepared-graphics-capability.unit.test.ts +65 -0
  655. package/src/__tests__/prepared-graphics-generation.unit.test.ts +161 -0
  656. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +138 -0
  657. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +29 -0
  658. package/src/__tests__/prepared-graphics-resolver.unit.test.ts +285 -0
  659. package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +105 -0
  660. package/src/__tests__/prepared-graphics-store.unit.test.ts +154 -0
  661. package/src/__tests__/prepared-graphics-validation.unit.test.ts +176 -0
  662. package/src/__tests__/profiler-default-off.test.ts +22 -0
  663. package/src/__tests__/profiler-phase-catalog.test.ts +66 -0
  664. package/src/__tests__/profiler-phase-integration.test.ts +62 -0
  665. package/src/__tests__/profiler-phase-token.test.ts +79 -0
  666. package/src/__tests__/public-surface.test-d.ts +94 -0
  667. package/src/__tests__/recover-error-policy-owner.unit.test.ts +107 -0
  668. package/src/__tests__/render-error-code-owner.test-d.ts +116 -0
  669. package/src/__tests__/render-error-detail-ssot.test-d.ts +139 -0
  670. package/src/__tests__/render-error-exhaustive.test-d.ts +110 -0
  671. package/src/__tests__/render-feature-assembly.test-d.ts +43 -0
  672. package/src/__tests__/render-feature-context.test-d.ts +57 -0
  673. package/src/__tests__/render-feature-contract.test-d.ts +49 -0
  674. package/src/__tests__/render-feature-diagnostics.unit.test.ts +149 -0
  675. package/src/__tests__/render-feature-docs.unit.test.ts +89 -0
  676. package/src/__tests__/render-feature-errors.unit.test.ts +47 -0
  677. package/src/__tests__/render-feature-gpu-work.integration.test.ts +316 -0
  678. package/src/__tests__/render-feature-plan.test-d.ts +161 -0
  679. package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
  680. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +90 -0
  681. package/src/__tests__/render-feature-prepared-errors.test-d.ts +79 -0
  682. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +80 -0
  683. package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +72 -0
  684. package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +36 -0
  685. package/src/__tests__/render-feature-prepared-graphics.test-d.ts +74 -0
  686. package/src/__tests__/render-feature-prepared-graphics.unit.test.ts +121 -0
  687. package/src/__tests__/render-feature-public-surface.test-d.ts +57 -0
  688. package/src/__tests__/render-feature-retry.unit.test.ts +87 -0
  689. package/src/__tests__/render-feature-scheduling.unit.test.ts +110 -0
  690. package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +137 -0
  691. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +146 -0
  692. package/src/__tests__/render-feature-visibility-context.test-d.ts +33 -0
  693. package/src/__tests__/render-feature-visibility-context.unit.test.ts +37 -0
  694. package/src/__tests__/render-feature-zero-work.unit.test.ts +76 -0
  695. package/src/__tests__/render-graph-compute-raster-gpu.ts +342 -0
  696. package/src/__tests__/render-graph-compute-raster.browser.test.ts +16 -0
  697. package/src/__tests__/render-graph-compute-raster.dawn.test.ts +22 -0
  698. package/src/__tests__/render-graph-hzb-gpu.ts +239 -0
  699. package/src/__tests__/render-graph-hzb.browser.test.ts +16 -0
  700. package/src/__tests__/render-graph-hzb.dawn.test.ts +23 -0
  701. package/src/__tests__/render-graph-primitives.unit.test.ts +22 -0
  702. package/src/__tests__/render-graph-storage-indirect-gpu.ts +162 -0
  703. package/src/__tests__/render-graph-storage-indirect.browser.test.ts +21 -0
  704. package/src/__tests__/render-graph-storage-indirect.dawn.test.ts +28 -0
  705. package/src/__tests__/render-scene-projection.unit.test.ts +168 -0
  706. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +121 -0
  707. package/src/__tests__/renderer-lifecycle.integration.test.ts +58 -0
  708. package/src/__tests__/rhi-backend-package-boundary.unit.test.ts +11 -0
  709. package/src/__tests__/scriptable-pack-consumer.test-d.ts +14 -0
  710. package/src/__tests__/shader-stage-surface.unit.test.ts +43 -0
  711. package/src/__tests__/ssao-config.unit.test.ts +36 -0
  712. package/src/__tests__/ssao-kernel-surface.unit.test.ts +14 -0
  713. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
  714. package/src/__tests__/standard-descriptors.test-d.ts +22 -0
  715. package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
  716. package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
  717. package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
  718. package/src/__tests__/surface-configuration.unit.test.ts +91 -0
  719. package/src/__tests__/texture-usage-surface.unit.test.ts +58 -0
  720. package/src/__tests__/typed-pipeline-topology.unit.test.ts +223 -0
  721. package/src/__tests__/urp-pipeline-targets.unit.test.ts +42 -0
  722. package/src/__tests__/urp-pipeline.unit.test.ts +14 -0
  723. package/src/__tests__/vertex-color-pipeline.unit.test.ts +132 -0
  724. package/src/__tests__/vertex-layout-consumer.unit.test.ts +25 -0
  725. package/src/__tests__/visibility-diagnostics.integration.test.ts +62 -0
  726. package/src/__tests__/visibility-extract.integration.test.ts +98 -0
  727. package/src/__tests__/visibility-extract.perf.test.ts +130 -0
  728. package/src/__tests__/visibility-feature-dedup.integration.test.ts +55 -0
  729. package/src/__tests__/visibility-hidden-report.unit.test.ts +36 -0
  730. package/src/__tests__/visibility-instances.integration.test.ts +46 -0
  731. package/src/__tests__/visibility-multi-world.integration.test.ts +86 -0
  732. package/src/__tests__/visibility-producer-matrix.integration.test.ts +168 -0
  733. package/src/__tests__/visibility-producer-matrix.unit.test.ts +96 -0
  734. package/src/__tests__/visibility-public-surface.test-d.ts +27 -0
  735. package/src/__tests__/visibility-resolver.unit.test.ts +85 -0
  736. package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
  737. package/src/__tests__/visibility-snapshot-contract.unit.test.ts +60 -0
  738. package/src/__tests__/vocabulary.unit.test.ts +21 -0
  739. package/src/assembly/backend-contract.ts +57 -0
  740. package/src/assembly/factory.ts +8130 -0
  741. package/src/assembly/host-contract.ts +101 -0
  742. package/src/assembly/material/assembly.ts +48 -0
  743. package/src/assembly/material/pipeline-projection.ts +63 -0
  744. package/src/assets/asset-decoders.ts +158 -0
  745. package/src/assets/render-asset-port.ts +44 -0
  746. package/src/assets/resolve-render-asset.ts +13 -0
  747. package/src/authoring.ts +17 -0
  748. package/src/cluster-binner.ts +700 -0
  749. package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
  750. package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
  751. package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
  752. package/src/components/__tests__/schema-parity.unit.test.ts +25 -0
  753. package/src/components/__tests__/visibility-schema.unit.test.ts +35 -0
  754. package/src/components/camera.ts +512 -0
  755. package/src/components/directional-light.ts +120 -0
  756. package/src/components/glyph-text.ts +64 -0
  757. package/src/components/index.ts +54 -0
  758. package/src/components/instances.ts +206 -0
  759. package/src/components/layer.ts +69 -0
  760. package/src/components/light-helpers.ts +188 -0
  761. package/src/components/lines.ts +18 -0
  762. package/src/components/mesh-filter.ts +60 -0
  763. package/src/components/mesh-renderer.ts +61 -0
  764. package/src/components/point-light-shadow.ts +43 -0
  765. package/src/components/point-light.ts +65 -0
  766. package/src/components/points.ts +40 -0
  767. package/src/components/post-process-params.ts +35 -0
  768. package/src/components/scene-instance.ts +193 -0
  769. package/src/components/skybox-background.ts +103 -0
  770. package/src/components/skylight.ts +97 -0
  771. package/src/components/sort-key.ts +75 -0
  772. package/src/components/spot-light.ts +124 -0
  773. package/src/components/sprite-animation.ts +168 -0
  774. package/src/components/sprite-instances.ts +179 -0
  775. package/src/components/sprite-playback-mode.ts +79 -0
  776. package/src/components/sprite-region-override.ts +105 -0
  777. package/src/components/tile-layer.ts +167 -0
  778. package/src/components/tilemap.ts +48 -0
  779. package/src/components/visibility.ts +53 -0
  780. package/src/construct-renderer.ts +67 -0
  781. package/src/debug-draw-glue.ts +48 -0
  782. package/src/device/device-scope.ts +306 -0
  783. package/src/device/gpu-residency.ts +1822 -0
  784. package/src/device/resource-types.ts +20 -0
  785. package/src/engine-metrics.ts +82 -0
  786. package/src/errors/ecs-validation.ts +16 -0
  787. package/src/errors/index.ts +3 -0
  788. package/src/errors/recover.ts +161 -0
  789. package/src/errors/render.ts +1284 -0
  790. package/src/extract/visibility.ts +120 -0
  791. package/src/features/fullscreen.ts +46 -0
  792. package/src/features/host.ts +1363 -0
  793. package/src/features/morph/morph-feature.ts +377 -0
  794. package/src/features/plan.ts +447 -0
  795. package/src/features/prepared-gpu-work.ts +959 -0
  796. package/src/features/prepared-graphics-store.ts +449 -0
  797. package/src/features/prepared-graphics.ts +420 -0
  798. package/src/features/render-graph-compute.ts +69 -0
  799. package/src/features/render-graph-contribution.ts +75 -0
  800. package/src/features/render-graph-raster.ts +332 -0
  801. package/src/features/render-graph-resources.ts +38 -0
  802. package/src/features/targets.ts +70 -0
  803. package/src/features/types.ts +103 -0
  804. package/src/features/vocabulary.ts +24 -0
  805. package/src/fullscreen-post-process-pass.ts +363 -0
  806. package/src/glyph-text-layout-system.ts +421 -0
  807. package/src/gpu-driven/batch-topology.ts +245 -0
  808. package/src/gpu-driven/production-raster.ts +695 -0
  809. package/src/gpu-driven/view-gpu.ts +703 -0
  810. package/src/gpu-resource.ts +159 -0
  811. package/src/gpu-scene-schema.ts +136 -0
  812. package/src/gpu-scene.ts +722 -0
  813. package/src/gpu-stage.ts +9 -0
  814. package/src/gpu-texture-usage.ts +12 -0
  815. package/src/gpu-usage.ts +14 -0
  816. package/src/hdrp-buffers.ts +480 -0
  817. package/src/ibl/IblPipelineCache.ts +1006 -0
  818. package/src/ibl/skylight-bind-group.ts +513 -0
  819. package/src/index.ts +129 -0
  820. package/src/inspection-types.ts +80 -0
  821. package/src/instance-buffer-cache.ts +95 -0
  822. package/src/internal.ts +9 -0
  823. package/src/lifecycle.ts +168 -0
  824. package/src/light-buffer-layout.ts +346 -0
  825. package/src/materials.ts +214 -0
  826. package/src/mesh-material-bindings.ts +103 -0
  827. package/src/pbr-pipeline.ts +1137 -0
  828. package/src/pipeline/standard-forward-lane.ts +229 -0
  829. package/src/pipeline/standard-pipeline.ts +555 -0
  830. package/src/pipeline/standard-profile.ts +65 -0
  831. package/src/pipeline-builder.ts +382 -0
  832. package/src/pipeline-spec-types.ts +28 -0
  833. package/src/pipeline-spec.ts +1231 -0
  834. package/src/plugin.ts +69 -0
  835. package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
  836. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
  837. package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
  838. package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
  839. package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
  840. package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
  841. package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
  842. package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
  843. package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
  844. package/src/points-lines/admission.ts +238 -0
  845. package/src/points-lines/bounds.ts +23 -0
  846. package/src/points-lines/expansion-cache.ts +215 -0
  847. package/src/points-lines/inspection.ts +97 -0
  848. package/src/points-lines/prepare.ts +177 -0
  849. package/src/points-lines/record.ts +125 -0
  850. package/src/points-lines/snapshot.ts +130 -0
  851. package/src/post-process-errors.ts +302 -0
  852. package/src/prepare/prepared-graphics-resolver.ts +456 -0
  853. package/src/record/__tests__/material-bg-cache.unit.test.ts +41 -0
  854. package/src/record/__tests__/material-slot-plan.unit.test.ts +44 -0
  855. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
  856. package/src/record/__tests__/video-texture-view.unit.test.ts +90 -0
  857. package/src/record/frame-lighting.ts +1074 -0
  858. package/src/record/frame-snapshot.ts +500 -0
  859. package/src/record/frame-targets.ts +137 -0
  860. package/src/record/frame.ts +1598 -0
  861. package/src/record/helpers.ts +284 -0
  862. package/src/record/main-pass-geometry.ts +1065 -0
  863. package/src/record/main-pass-material.ts +1043 -0
  864. package/src/record/main-pass-sprite-draws.ts +1137 -0
  865. package/src/record/main-pass.ts +610 -0
  866. package/src/record/mesh-ssbo.ts +885 -0
  867. package/src/record/render-context.ts +384 -0
  868. package/src/record/shadow-pass.ts +698 -0
  869. package/src/record/skybox-post-pass.ts +593 -0
  870. package/src/record/typed-frame-graph.ts +461 -0
  871. package/src/record/view-ubo.ts +222 -0
  872. package/src/render-contract.ts +582 -0
  873. package/src/render-data.ts +385 -0
  874. package/src/render-graph-primitives.ts +811 -0
  875. package/src/render-pipeline.ts +259 -0
  876. package/src/render-system-extract.ts +4585 -0
  877. package/src/render-system.ts +1933 -0
  878. package/src/scene/render-scene-types.ts +67 -0
  879. package/src/scene/render-scene.ts +1087 -0
  880. package/src/scene-instances/post-spawn-resolve-joints.ts +165 -0
  881. package/src/shadow-atlas.ts +244 -0
  882. package/src/ssao-buffers.ts +334 -0
  883. package/src/ssao-config.ts +61 -0
  884. package/src/systems/active-camera.ts +116 -0
  885. package/src/systems/pass-selector.ts +49 -0
  886. package/src/systems/skin-palette-allocator.ts +251 -0
  887. package/src/systems/skin-palette-types.ts +14 -0
  888. package/src/systems/transparent-sort-config.ts +233 -0
  889. package/src/tilemap-chunk-extract-system.ts +1290 -0
  890. package/src/typed-render-graph-primitives.ts +541 -0
  891. package/src/typed-shadow-passes.ts +165 -0
@@ -0,0 +1,64 @@
1
+ // @forgeax/engine-runtime - GlyphText component (feat-20260531-world-space-msdf-text-rendering M4 / w14).
2
+ //
3
+ // `GlyphText` is the authoring source component for world-space MSDF text
4
+ // (requirements AC-06 / §domain model). It carries ONLY authoring data; the
5
+ // glyph quad baking + MeshFilter / MeshRenderer attachment is the job of the
6
+ // `glyphTextLayoutSystem` (plan-strategy D-2: GlyphText is pure authoring
7
+ // data, baking is a system responsibility). There is NO `TextLayoutAsset`
8
+ // intermediate (OOS-5) -- layout output lives directly in a baked MeshAsset.
9
+ //
10
+ // Naming: single-semantic component drops the `Component` suffix
11
+ // (AGENTS.md §Component naming rule #1 -- Transform / Camera / GlyphText).
12
+ //
13
+ // Schema vocab:
14
+ // - `fontHandle: 'shared<FontAsset>'` -> `Handle<'FontAsset', 'shared'>`
15
+ // (u32-stored; AssetRegistry owns the FontAsset lifecycle). AI users
16
+ // obtain the handle via `assets.loadByGuid<FontAsset>(guid)`.
17
+ // - `text: 'string'` -> native JS string (UniqueRefStore-backed, same
18
+ // dispatch as `Name.value`).
19
+ // - `fontSize: 'f32'` -> layout scale applied to the FontAsset metrics.
20
+ // - `color: 'array<f32, 4>'` -> linear-space rgba tint (feat-20260709 M3:
21
+ // collapsed from four `colorR/G/B/A` scalar columns into one inline
22
+ // stride-4 SoA column, mirroring the DirectionalLight direction/color
23
+ // idiom). Explicit layer-2 default [1,1,1,1] (opaque white).
24
+ //
25
+ // charter mapping: P1 (single import surface from `@forgeax/engine-render`,
26
+ // co-located with `glyphTextLayoutSystem` that consumes it) + P3
27
+ // (machine-readable schema literal) + P5 (consistent abstraction: same
28
+ // `'shared<T>'` idiom as MeshFilter.assetHandle / MeshRenderer.materials).
29
+
30
+ import { defineComponent } from '@forgeax/engine-ecs';
31
+
32
+ /**
33
+ * Glyph text authoring component (world-space MSDF text).
34
+ *
35
+ * Spawn an entity with a `GlyphText` and the `glyphTextLayoutSystem`
36
+ * (auto-wired by `createRenderer` / `createApp`) lays out the glyph quads,
37
+ * bakes a `MeshAsset`, and attaches `MeshFilter` + `MeshRenderer` on the
38
+ * next frame (Commands-deferred). Mutating `text` / `fontSize` / `color`
39
+ * re-bakes the mesh in place (plan-strategy D-1 updateMesh; registry size
40
+ * unchanged, AC-08).
41
+ *
42
+ * @example Spawn a world-space label:
43
+ * import { GlyphText } from '@forgeax/engine-render/authoring';
44
+ * const font = (await assets.loadByGuid(fontGuid)).unwrap();
45
+ * world.spawn({
46
+ * component: GlyphText,
47
+ * data: { fontHandle: font, text: 'Hello', fontSize: 32,
48
+ * color: [1, 1, 1, 1] },
49
+ * });
50
+ */
51
+ export const GlyphText = defineComponent('GlyphText', {
52
+ // The layout/render owner re-resolves the font asset on the target world;
53
+ // authoring text and style remain portable simulation state.
54
+ fontHandle: {
55
+ type: 'shared<FontAsset>',
56
+ default: 0 as never,
57
+ simulationTransient: true,
58
+ },
59
+ text: { type: 'string', default: '' },
60
+ fontSize: { type: 'f32', default: 16 },
61
+ // color carries an explicit layer-2 default [1,1,1,1] (opaque white); the
62
+ // array layer-3 fallback is all-zero, so the default MUST be explicit (D-5).
63
+ color: { type: 'array<f32, 4>', default: new Float32Array([1, 1, 1, 1]) },
64
+ });
@@ -0,0 +1,54 @@
1
+ export * from './camera';
2
+ export * from './directional-light';
3
+ export { Instances, type InstancesData } from './instances';
4
+ export { Layer } from './layer';
5
+ export { Lines } from './lines';
6
+ export * from './mesh-filter';
7
+ export * from './mesh-renderer';
8
+ export { PointLight } from './point-light';
9
+ export { PointLightShadow } from './point-light-shadow';
10
+ export {
11
+ type PointShape,
12
+ PointShapeValue,
13
+ Points,
14
+ pointShapeFromU32,
15
+ } from './points';
16
+ export { PostProcessParams } from './post-process-params';
17
+ export {
18
+ SceneInstance,
19
+ type SceneInstanceOverrideRecord,
20
+ type SceneInstanceState,
21
+ } from './scene-instance';
22
+ export {
23
+ SKYBOX_MODE_CUBEMAP,
24
+ SkyboxBackground,
25
+ type SkyboxMode,
26
+ skyboxModeFromF32,
27
+ } from './skybox-background';
28
+ export { Skylight } from './skylight';
29
+ export { SortKey } from './sort-key';
30
+ export { SpotLight } from './spot-light';
31
+ export { SpriteAnimation } from './sprite-animation';
32
+ export { SpriteInstances, type SpriteInstancesData } from './sprite-instances';
33
+ export {
34
+ SPRITE_PLAYBACK_MODE_CLAMP,
35
+ SPRITE_PLAYBACK_MODE_LOOP,
36
+ type SpritePlaybackMode,
37
+ spritePlaybackModeFromU32,
38
+ } from './sprite-playback-mode';
39
+ export { SpriteRegionOverride } from './sprite-region-override';
40
+ export {
41
+ decodeSortScope,
42
+ encodeSortScope,
43
+ markTileLayerDirty,
44
+ type SortScope,
45
+ TileLayer,
46
+ type TileLayerData,
47
+ } from './tile-layer';
48
+ export { Tilemap } from './tilemap';
49
+ export {
50
+ Visibility,
51
+ type VisibilityState,
52
+ VisibilityStateValue,
53
+ visibilityStateFromU32,
54
+ } from './visibility';
@@ -0,0 +1,206 @@
1
+ // @forgeax/engine-render - Instances component (per-entity instanced-draw transforms).
2
+ //
3
+ // Two sources, one component (feat-20260622-chunk-gpu-instancing-sprite-tilemap
4
+ // / AC-09; charter P4 consistent abstraction + charter P1 progressive disclosure).
5
+ // The `Instances` ECS component has exactly TWO sources of `transforms` data, and
6
+ // AI users should hold the boundary explicitly to avoid misreading the ECS view:
7
+ //
8
+ // Source 1 (EXPLICIT, the only source that lands in ECS) — AI user opt-in.
9
+ // The AI user hand-attaches `Instances { transforms }` onto an entity at
10
+ // spawn / set time for high-performance instanced draw. `world.get(e,
11
+ // Instances)` returns the AI user's payload verbatim (a `Float32Array`
12
+ // snapshot of column-major mat4 instances; stride = 16). This is the sole
13
+ // code path through which `Instances` ever appears on an entity.
14
+ //
15
+ // Source 2 (TRANSPARENT, never written back into ECS) — engine record-stage
16
+ // fold. When the AI user spawns N independent sprite / tilemap-cell
17
+ // entities sharing the same (Layer.value, posZ, materialHandle) sort
18
+ // equivalence class, the engine record stage transparently folds the
19
+ // equivalent run into ONE `drawIndexed(indexCount, count)` using an
20
+ // INTERNAL transient buffer (see `render-system-record.ts` fold operator
21
+ // + `render.instancing.foldedDraws` metric, and the `RhiError
22
+ // 'instancing-exceeds-uniform-cap'` fallback). The fold operator does
23
+ // NOT auto-inject `Instances` onto those entities — `world.get(e,
24
+ // Instances)` on a folded entity returns `Result.err` exactly as before.
25
+ // The ECS view is preserved bit-for-bit (per-cell / per-sprite entity
26
+ // retained, query / despawn / picking unchanged); the optimisation is
27
+ // invisible at the component layer (charter P4: consistent abstraction —
28
+ // the high-performance path is opt-in via Source 1, the default spawn
29
+ // shape stays untouched).
30
+ //
31
+ // AI user reading this header: do NOT expect engine-side fold to materialise
32
+ // as an `Instances` row on your entity. Read the metric (foldedDraws) or the
33
+ // RhiError code to observe fold behaviour; never gate logic on a runtime
34
+ // `world.get(e, Instances)` lookup after spawn.
35
+ //
36
+ // Schema: 1 array<f32> field `transforms` carrying packed column-major mat4
37
+ // instance transforms (16 f32 per instance, stride = 16). Stride is enforced
38
+ // through a TWO-LAYER contract:
39
+ //
40
+ // 1. AI user set-site: spawn / `world.set` / `world.push` callers pass a
41
+ // `Float32Array` (or numeric array) whose `length` is a non-zero
42
+ // multiple of 16. The set site is the AI user's responsibility -- the
43
+ // engine cannot prove the column-major mat4 packing without the
44
+ // caller's intent.
45
+ // 2. RenderSystem extract entry: `render-system-extract.ts` performs a
46
+ // defensive `transforms.length % 16 === 0` check on every
47
+ // `world.get(e, Instances).transforms` snapshot at frame extract time;
48
+ // violations route a structured `InstanceTransformsStrideMismatchError`
49
+ // (`code: 'instance-transforms-stride-mismatch'`,
50
+ // `detail: { actualLength, expectedStride: 16 }`) through the World
51
+ // Layer-3 ErrorHandler and the renderable is skipped (fail-fast: the
52
+ // malformed length never reaches the GPU upload path).
53
+ //
54
+ // feat-20260515-buffer-array-vocab-collapse M3 / w16 (decision §2.3 stride
55
+ // responsibility migration): the legacy component-level
56
+ // stride-declaration option (`{ transforms: 16 }` keyed on the retired
57
+ // per-component stride defineComponent option key) was retired because:
58
+ // - The ECS layer no longer carries a per-component stride schema (M2 /
59
+ // w9 dropped the option from `DefineComponentOptions` -- the SSOT
60
+ // moved to the RenderSystem entry + AI user set site).
61
+ // - Centralising the check at the consumer (RenderSystem extract) rather
62
+ // than the producer (ECS write paths) lets the GPU upload path stay
63
+ // trust-the-snapshot; AI users get one structured error per offending
64
+ // frame rather than one per write.
65
+ //
66
+ // feat-20260514-ecs-children-instances-managed-buffer-array M3 / w14:
67
+ // migrated from the legacy `{ buffer: 'ref', count: 'u32' }` pair (which
68
+ // cross-coupled with the now-deleted `AssetRegistry.createInstancedBuffer`
69
+ // pipeline + the `InstancedBufferAsset` POD) to the ECS-managed array path.
70
+ // Resize is a `world.push(e, Instances, 'transforms', value)` away (one f32
71
+ // at a time) plus a future `world.grow` if a bulk-resize affordance is
72
+ // added.
73
+ //
74
+ // Storage buffer cap-gate (D-5 OOS-08 follow-up):
75
+ // - The runtime RenderSystem consumer (`render-system-record.ts`) checks
76
+ // `device.caps.storageBuffer` before binding the per-entity transforms;
77
+ // `caps.storageBuffer === false` (backend lacking storage buffer support,
78
+ // e.g. rhi-wgpu webgl backend) routes a `RhiError` ('feature-not-enabled').
79
+ // A future loop owns the per-draw fallback path.
80
+ //
81
+ // Group transform chained semantics (charter proposition 5 mental migration):
82
+ // - When the same entity carries both `Transform` (entity_world) and
83
+ // `Instances` (per-instance local transforms), the vertex shader
84
+ // composes per instance:
85
+ //
86
+ // world_position[i] = entity_world * instances_local[i] * vertex_position
87
+ //
88
+ // - `Instances.transforms[i*16..i*16+15]` is interpreted as a local-space
89
+ // transform under the entity, exactly like a child entity's `Transform`
90
+ // under `ChildOf { parent }` in the hierarchy system. AI users reuse
91
+ // the `parent x local` intuition without a new concept. Set the
92
+ // entity's `Transform` to identity to make `instances_local[i]`
93
+ // directly world-space.
94
+ //
95
+ // 4-segment minimum contract (read this header before reaching for
96
+ // the source body):
97
+ //
98
+ // ===== (a) single-component import + spawn example =====
99
+ //
100
+ // import {
101
+ // createRenderer, HANDLE_CUBE,
102
+ // MeshFilter, MeshRenderer, Transform,
103
+ // Instances, type InstancesData,
104
+ // } from '@forgeax/engine-render';
105
+ //
106
+ // // 1 entity rendering N instanced cubes (16N packed f32, column-major mat4):
107
+ // const transforms = new Float32Array(N * 16);
108
+ // // ... fill column-major mat4 columns per instance ...
109
+ // world.spawn(
110
+ // { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
111
+ // { component: MeshRenderer, data: {} },
112
+ // { component: Instances, data: { transforms } },
113
+ // );
114
+ //
115
+ // ===== (b) packed mat4 layout =====
116
+ //
117
+ // const transforms = new Float32Array(N * 16); // column-major mat4 per instance
118
+ // // instance i occupies floats [i*16 .. i*16+15]:
119
+ // // [m00 m10 m20 m30 <- column 0
120
+ // // m01 m11 m21 m31 <- column 1
121
+ // // m02 m12 m22 m32 <- column 2
122
+ // // m03 m13 m23 m33] <- column 3 (translation in m03/m13/m23)
123
+ //
124
+ // `transforms.length` MUST be a non-zero multiple of 16. AI users gate at
125
+ // the set / push site; the RenderSystem extract entry holds the second
126
+ // defensive (AC-06: detail carries `{ expectedStride: 16, actualLength }`).
127
+ // The instance count is the live snapshot length / 16.
128
+ //
129
+ // ===== (c) error code consumption (typed property access, no message regex) =====
130
+ //
131
+ // // Stride violation surfaces through the engine-ecs Layer-3 ErrorHandler
132
+ // // when extract reads a malformed snapshot:
133
+ // // on('error', (err) => {
134
+ // // if (err.code === 'instance-transforms-stride-mismatch') {
135
+ // // // err.detail.expectedStride === 16
136
+ // // // err.detail.actualLength === <user-supplied length>
137
+ // // }
138
+ // // });
139
+ // //
140
+ // // RenderSystem cap-gate (D-5) -> RhiError 'feature-not-enabled' on the
141
+ // // RhiErrorListenerRegistry channel:
142
+ // // on('error', (err) => {
143
+ // // if (err.code === 'feature-not-enabled') {
144
+ // // console.warn(err.expected, err.hint);
145
+ // // }
146
+ // // });
147
+ //
148
+ // charter mapping: proposition 1 (single import surface
149
+ // `import { Instances, type InstancesData } from '@forgeax/engine-render'`);
150
+ // proposition 3 (machine-readable schema > prose:
151
+ // `{ transforms: 'array<f32>' }` is the SSOT, stride 16 documented here +
152
+ // enforced at the RenderSystem entry);
153
+ // proposition 4 (explicit failure: stride violation routes a structured
154
+ // EcsError, not a silent half-row); proposition 5 (consistent abstraction:
155
+ // Instances mirrors Children -- both ride the array-vocab path).
156
+ //
157
+ // Anchors: requirements §AC-06 (stride 16 + RenderSystem upload path);
158
+ // plan-strategy §2.3 (stride responsibility migration to RenderSystem entry
159
+ // defensive + AI user set site) + §3.3 stride error path; plan-decisions
160
+ // D-1 / D-5.
161
+ // OOS-09 (no addChild Commands API) does not apply here; OOS-01 (no
162
+ // dangling-entity sweep) does not apply (Instances stores f32 not entity).
163
+
164
+ import { defineComponent } from '@forgeax/engine-ecs';
165
+
166
+ /**
167
+ * Per-entity instanced-draw transforms (ECS component).
168
+ *
169
+ * Carries a variable-length `array<f32>` of column-major mat4 instance
170
+ * transforms (16 f32 per instance, stride = 16; documented above and
171
+ * enforced at the RenderSystem extract entry, NOT at the ECS write paths).
172
+ *
173
+ * The runtime RenderSystem consumer materialises a fresh `Float32Array`
174
+ * snapshot on every `world.get(e, Instances).transforms` access (D-4
175
+ * no-cache), reads the live count from the snapshot's `length`, and
176
+ * uploads the bytes to a per-entity GPU storage buffer in the record stage
177
+ * (`render-system-record.ts`).
178
+ *
179
+ * @example Spawn an entity rendering 10000 instanced cubes:
180
+ * const transforms = new Float32Array(10000 * 16);
181
+ * // ... fill column-major mat4 columns ...
182
+ * world.spawn(
183
+ * { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
184
+ * { component: MeshRenderer, data: { ... } },
185
+ * { component: Instances, data: { transforms } },
186
+ * );
187
+ */
188
+ export const Instances = defineComponent('Instances', {
189
+ transforms: { type: 'array<f32>' },
190
+ });
191
+
192
+ /**
193
+ * Type-level hint for `data` at the `Instances` spawn site.
194
+ *
195
+ * The runtime ECS column shape for `array<f32>` accepts a `Float32Array`
196
+ * payload at spawn / set time (the bytes are copied into the BufferPool
197
+ * slot). The `transforms` field is documented as `Float32Array` here so
198
+ * AI-user IDE autocomplete picks up the typed-array shape.
199
+ *
200
+ * @example
201
+ * import type { InstancesData } from '@forgeax/engine-render';
202
+ * const data: InstancesData = { transforms: new Float32Array(N * 16) };
203
+ */
204
+ export type InstancesData = {
205
+ readonly transforms: Float32Array;
206
+ };
@@ -0,0 +1,69 @@
1
+ // @forgeax/engine-render - Layer (render-order layer index, signed 32-bit).
2
+ //
3
+ // Schema: 1 i32 column (value). Signed two's complement so negatives travel
4
+ // through the spawn payload unchanged — background sprites live at negative
5
+ // values (e.g. -100), the default game layer at 0, foreground at 100, UI at
6
+ // 1000. Layer is consumed at sort time by `transparent-sort.ts` (M-3 w23)
7
+ // as the primary key in the (layer asc, sortValue asc) composite ordering.
8
+ //
9
+ // Naming convention: bare entity name (no Component suffix; single-semantic
10
+ // component idiom aligned with Bevy ECS conventions — Transform / Camera /
11
+ // DirectionalLight follow the same shape, see AGENTS.md §Component naming).
12
+ //
13
+ // Layer is a generic ECS renderer component — NOT a 2D-only special. 3D
14
+ // entities may also carry Layer to bias their bucket placement (charter
15
+ // P4 consistent abstraction: same component drives both pipelines).
16
+ //
17
+ // AC-18 path (1): an entity spawned without an explicit Layer reads back
18
+ // 0 via the existing 4-layer spawn fallback chain
19
+ // (feat-20260517-spawn-default-fallback). This feat does NOT introduce a
20
+ // fifth fallback layer; the silent default flows through layer-3
21
+ // `typeDefault('i32') === 0`.
22
+ //
23
+ // @derives defineComponent factory (packages/ecs/src/component.ts) — i32
24
+ // is a legacy scalar type; its intrinsic properties (byteSize / viewCtor
25
+ // / storage) live in TYPE_METADATA['i32'] (feat-20260602 M1).
26
+ // @reuses spawn 4-layer fallback chain (feat-20260517-spawn-default-fallback)
27
+ // — layer-3 typeDefault('i32') returns 0, no fifth layer.
28
+ //
29
+ // charter mapping: F1 (single-import barrel discovery — Layer joins
30
+ // Transform / MeshFilter / MeshRenderer / Camera / DirectionalLight)
31
+ // + P3 (explicit default — 0 surfaces as a read-back value, not undefined)
32
+ // + P4 (consistent abstraction — Layer is a generic render component, not
33
+ // a 2D-only special).
34
+
35
+ import { defineComponent } from '@forgeax/engine-ecs';
36
+
37
+ /**
38
+ * Render-order layer index.
39
+ *
40
+ * Convention (non-binding; conveys intent, not enforced):
41
+ * - negative (e.g. -100): background layers (sky / parallax tiles).
42
+ * - 0: default game layer.
43
+ * - positive (e.g. 100): foreground layers (overlays, FX).
44
+ * - 1000+: UI / HUD.
45
+ *
46
+ * Signed i32 (two's complement, range \u00b12\u00b3\u00b9). Negatives round-trip
47
+ * through the spawn payload unchanged — no schema-layer mutate. i32 lives in
48
+ * the CPU sort path (transparent-sort.ts M-3 w23); no GPU-side stride
49
+ * compatibility risk.
50
+ *
51
+ * @example Minimal spawn (defaults to game layer 0):
52
+ * world.spawn({ component: Layer, data: {} }); // yields value=0
53
+ *
54
+ * @example Spawn 4 sprites across the conventional layer band:
55
+ * world.spawn({ component: Layer, data: { value: -100 } }); // background
56
+ * world.spawn({ component: Layer, data: { value: 0 } }); // default
57
+ * world.spawn({ component: Layer, data: { value: 100 } }); // foreground
58
+ * world.spawn({ component: Layer, data: { value: 1000 } }); // UI
59
+ *
60
+ * @example Spawn payload omitting Layer — the 4-layer fallback fills 0:
61
+ * const e = world.spawn(
62
+ * { component: Transform, data: { pos: [0, 0, 0],
63
+ * quat: [0, 0, 0, 1], scale: [1, 1, 1] } },
64
+ * );
65
+ * // Layer is not on the entity; query joins must check membership.
66
+ */
67
+ export const Layer = defineComponent('Layer', {
68
+ value: { type: 'i32', default: 0 },
69
+ });
@@ -0,0 +1,188 @@
1
+ // @forgeax/engine-render - host-side light helpers (M2 / w12).
2
+ //
3
+ // Pure-function single-shot conversion helpers for the SpotLight + PointLight
4
+ // extract path. Host calls each helper once per light entity per frame; the
5
+ // shader then sees only pre-computed `cos*` / `invRangeSquared` values. The
6
+ // runtime range owner is the revision-pinned Three r184 squared window; KHR
7
+ // values remain an import/reference boundary and are not substituted here.
8
+ //
9
+ // AC anchors: requirements AC-03 (deg -> rad -> cos host two-step
10
+ // conversion) + AC-08 (a + b) (KHR quartic + range = 0 NaN protection
11
+ // boundary).
12
+ //
13
+ // Plan-strategy anchors: D-S2 (cone unit deg API + cos shader optimization
14
+ // transparent to AI users) + D-S5 (Layer 1 host-side range = 0 ->
15
+ // invRangeSquared = 1e8 protects the 0 * Infinity = NaN intermediate).
16
+
17
+ import { err, ok, type Result } from '@forgeax/engine-types';
18
+ import { SpawnLightInvalidBoundsError } from '../errors/ecs-validation';
19
+ import { ShadowInvalidConfigError } from '../errors/render';
20
+
21
+ export type LightValidationError = SpawnLightInvalidBoundsError | ShadowInvalidConfigError;
22
+ export type LightValidationResult = Result<void, LightValidationError>;
23
+
24
+ const RANGE_ZERO_FALLBACK_INV_R2 = 1e8;
25
+ const DEG_TO_RAD = Math.PI / 180;
26
+
27
+ /**
28
+ * Convert SpotLight cone half-angle (degrees) to its cosine.
29
+ *
30
+ * Single-shot deg -> rad -> cos conversion executed once per spot light
31
+ * entity per frame on the host; the GPU shader sees only `cosInner` /
32
+ * `cosOuter` so its falloff path stays branch-free
33
+ * (`smoothstep(cosOuter, cosInner, dot(L, -lightDir))`).
34
+ *
35
+ * @param deg cone half-angle in degrees (component schema field
36
+ * `innerConeDeg` / `outerConeDeg`)
37
+ * @returns `cos(deg * pi / 180)`
38
+ */
39
+ export function degToCos(deg: number): number {
40
+ return Math.cos(deg * DEG_TO_RAD);
41
+ }
42
+
43
+ /**
44
+ * Convert PointLight / SpotLight `range` (meters) to `1 / range^2`.
45
+ *
46
+ * Three-branch fold supplies `1 / range^2` for the Three r184 finite-range
47
+ * window `clamp(1 - (d / range)^4, 0, 1)^2`:
48
+ *
49
+ * - `range = +Infinity` -> `0` (no truncation; quartic factor collapses
50
+ * to `1`, falloff reduces to plain `1 / d^2`).
51
+ * - `range = 0` -> `1e8` (host safety boundary; glTF `range: 0` is mapped
52
+ * to the no-cutoff `Infinity` value before this helper is called).
53
+ * - `range > 0` -> `1 / (range * range)` (standard quartic factor).
54
+ *
55
+ * @param range meters (component schema field `range`); `+Infinity` is the
56
+ * KHR no-truncation default
57
+ * @returns `1 / range^2` with three-branch NaN protection
58
+ */
59
+ export function computeInvRangeSquared(range: number): number {
60
+ if (range === Number.POSITIVE_INFINITY) return 0;
61
+ if (range === 0) return RANGE_ZERO_FALLBACK_INV_R2;
62
+ return 1 / (range * range);
63
+ }
64
+
65
+ /**
66
+ * feat-20260709 M2 / D-1: shared zero/missing-direction validate for
67
+ * DirectionalLight + SpotLight. `direction` has no layer-2 default, so an
68
+ * omitted direction lands the array layer-3 all-zero -- the same illegal state
69
+ * as an explicit zero vector. SSOT for the rejection so the two lights cannot
70
+ * drift. Returns the structured error to reject, or `null` when the direction
71
+ * is a valid non-zero vector.
72
+ */
73
+ export function validateDirection(
74
+ componentName: 'DirectionalLight' | 'SpotLight',
75
+ direction: ArrayLike<number> | undefined,
76
+ ): SpawnLightInvalidBoundsError | null {
77
+ const dir = direction;
78
+ if (dir === undefined || ((dir[0] ?? 0) === 0 && (dir[1] ?? 0) === 0 && (dir[2] ?? 0) === 0)) {
79
+ return new SpawnLightInvalidBoundsError(
80
+ componentName,
81
+ 'direction',
82
+ dir === undefined ? [0, 0, 0] : [dir[0] ?? 0, dir[1] ?? 0, dir[2] ?? 0],
83
+ );
84
+ }
85
+ return null;
86
+ }
87
+
88
+ /** Validate directional-light payloads at the render owner boundary. */
89
+ export function validateDirectionalLightData(
90
+ data: Readonly<Record<string, unknown>>,
91
+ ): LightValidationResult {
92
+ const directionError = validateDirection(
93
+ 'DirectionalLight',
94
+ data.direction as ArrayLike<number> | undefined,
95
+ );
96
+ if (directionError !== null) return err(directionError);
97
+ if (data.castShadow === false) return ok(undefined);
98
+
99
+ const mapSize = (data.mapSize as number | undefined) ?? 2048;
100
+ if (mapSize < 1) return err(new ShadowInvalidConfigError('mapSize', mapSize, 1));
101
+ const cascadeCount = (data.cascadeCount as number | undefined) ?? 4;
102
+ if (cascadeCount < 1 || cascadeCount > 4 || !Number.isInteger(cascadeCount)) {
103
+ return err(new ShadowInvalidConfigError('cascadeCount', cascadeCount, 1, 4));
104
+ }
105
+ const splitLambda = (data.splitLambda as number | undefined) ?? 0.75;
106
+ if (splitLambda < 0 || splitLambda > 1) {
107
+ return err(new ShadowInvalidConfigError('splitLambda', splitLambda, 0, 1));
108
+ }
109
+ const cascadeBlend = (data.cascadeBlend as number | undefined) ?? 0.2;
110
+ if (cascadeBlend < 0 || cascadeBlend > 0.5) {
111
+ return err(new ShadowInvalidConfigError('cascadeBlend', cascadeBlend, 0, 0.5));
112
+ }
113
+ const pcfKernelSize = (data.pcfKernelSize as number | undefined) ?? 3;
114
+ if (pcfKernelSize < 1 || pcfKernelSize % 2 === 0) {
115
+ return err(new ShadowInvalidConfigError('pcfKernelSize', pcfKernelSize, 1));
116
+ }
117
+ const shadowDistance = (data.shadowDistance as number | undefined) ?? 200;
118
+ if (shadowDistance <= 0) {
119
+ return err(new ShadowInvalidConfigError('shadowDistance', shadowDistance, 0, '>'));
120
+ }
121
+ return ok(undefined);
122
+ }
123
+
124
+ /** Validate spot-light payloads at the render owner boundary. */
125
+ export function validateSpotLightData(
126
+ data: Readonly<Record<string, unknown>>,
127
+ ): LightValidationResult {
128
+ const directionError = validateDirection(
129
+ 'SpotLight',
130
+ data.direction as ArrayLike<number> | undefined,
131
+ );
132
+ if (directionError !== null) return err(directionError);
133
+ if (data.castShadow === false) return ok(undefined);
134
+
135
+ const range = (data.range as number | undefined) ?? 10;
136
+ if (typeof range !== 'number' || Number.isNaN(range) || range < 0) {
137
+ return err(new SpawnLightInvalidBoundsError('SpotLight', 'range', range));
138
+ }
139
+ const innerConeDeg = (data.innerConeDeg as number | undefined) ?? 0;
140
+ const outerConeDeg = (data.outerConeDeg as number | undefined) ?? 45;
141
+ if (outerConeDeg > 90) {
142
+ return err(new SpawnLightInvalidBoundsError('SpotLight', 'outerNinety', outerConeDeg));
143
+ }
144
+ if (outerConeDeg <= innerConeDeg) {
145
+ return err(new SpawnLightInvalidBoundsError('SpotLight', 'innerOuter', outerConeDeg));
146
+ }
147
+ const mapSize = (data.mapSize as number | undefined) ?? 2048;
148
+ if (mapSize < 1) return err(new ShadowInvalidConfigError('mapSize', mapSize, 1));
149
+ const nearPlane = data.nearPlane as number | undefined;
150
+ const farPlane = data.farPlane as number | undefined;
151
+ if (nearPlane !== undefined && farPlane !== undefined && farPlane <= nearPlane) {
152
+ return err(new ShadowInvalidConfigError('farPlane', farPlane, nearPlane));
153
+ }
154
+ const pcfKernelSize = (data.pcfKernelSize as number | undefined) ?? 3;
155
+ if (pcfKernelSize < 1 || pcfKernelSize % 2 === 0) {
156
+ return err(new ShadowInvalidConfigError('pcfKernelSize', pcfKernelSize, 1));
157
+ }
158
+ return ok(undefined);
159
+ }
160
+
161
+ /** Validate point-light payloads at the render owner boundary. */
162
+ export function validatePointLightData(
163
+ data: Readonly<Record<string, unknown>>,
164
+ ): LightValidationResult {
165
+ const range = (data.range as number | undefined) ?? 10;
166
+ if (typeof range !== 'number' || Number.isNaN(range) || range < 0) {
167
+ return err(new SpawnLightInvalidBoundsError('PointLight', 'range', range));
168
+ }
169
+ return ok(undefined);
170
+ }
171
+
172
+ /** Validate point-light shadow payloads at the render owner boundary. */
173
+ export function validatePointLightShadowData(
174
+ data: Readonly<Record<string, unknown>>,
175
+ ): LightValidationResult {
176
+ const mapSize = (data.mapSize as number | undefined) ?? 512;
177
+ if (mapSize < 1) return err(new ShadowInvalidConfigError('mapSize', mapSize, 1));
178
+ const nearPlane = (data.nearPlane as number | undefined) ?? 0.1;
179
+ const farPlane = (data.farPlane as number | undefined) ?? 25;
180
+ if (farPlane <= nearPlane) {
181
+ return err(new ShadowInvalidConfigError('farPlane', farPlane, nearPlane));
182
+ }
183
+ const pcfKernelSize = (data.pcfKernelSize as number | undefined) ?? 3;
184
+ if (pcfKernelSize < 1 || pcfKernelSize % 2 === 0) {
185
+ return err(new ShadowInvalidConfigError('pcfKernelSize', pcfKernelSize, 1));
186
+ }
187
+ return ok(undefined);
188
+ }
@@ -0,0 +1,18 @@
1
+ import { defineComponent } from '@forgeax/engine-ecs';
2
+
3
+ /** Screen-space independent line segment style. */
4
+ export const Lines = defineComponent(
5
+ 'Lines',
6
+ {
7
+ widthPx: { type: 'f32', default: 1 },
8
+ },
9
+ {
10
+ meta: {
11
+ quickStart: 'Attach Lines to render line-list MeshAsset pairs in screen pixels.',
12
+ diagnostics: 'Inspect widthPx at the points-lines admission boundary.',
13
+ recovery: 'Use points-lines-invalid-style for non-finite or non-positive widthPx values.',
14
+ boundaries:
15
+ 'Lines owns raster width only; MeshFilter and MeshRenderer own geometry and material.',
16
+ },
17
+ },
18
+ );
@@ -0,0 +1,60 @@
1
+ // @forgeax/engine-render - MeshFilter (mesh asset reference).
2
+ //
3
+ // Schema: `{ assetHandle: 'shared<MeshAsset>' }`. The schema-vocab
4
+ // `'shared<T>'` keyword stores a u32 column and type-derives to
5
+ // `Handle<'MeshAsset', 'shared'>` (engine-ecs Handle<T,M> twoParam
6
+ // phantom; `'shared'` mode = ref-counted retain on set / release on
7
+ // clear, lifecycle owned by `SharedRefStore` per feat-20260614).
8
+ // The brand prevents cross-asset assignment at compile time (e.g.
9
+ // `Handle<'TextureAsset','shared'>` is not assignable to `assetHandle`).
10
+ //
11
+ // AI users spawn with the assets-runtime constants `HANDLE_CUBE` /
12
+ // `HANDLE_TRIANGLE` (now branded `Handle<'MeshAsset','shared'>` to
13
+ // match the schema-derived shape); custom mesh registration is owned by
14
+ // feat-future-asset-system (this MVP only exposes builtin handles).
15
+ //
16
+ // Naming flavor: unity-style "MeshFilter / MeshRenderer" pair, but the forgeax
17
+ // pair does NOT mirror Unity's filter-toggle semantics - MeshFilter only
18
+ // carries the geometry ref, MeshRenderer only carries the material handle;
19
+ // the pair is independently composable. D-Q7 default-material policy
20
+ // (feat-20260517-merge-mesh-renderer-material-renderer plan-strategy §2.2):
21
+ // case A (entity carries MeshFilter without MeshRenderer) -> archetype
22
+ // query never matches -> entity is silently absent from the
23
+ // RenderableSnapshot[] (NO default-material fallback, NO onError fire);
24
+ // case B (MeshRenderer.material omitted at spawn) -> mid-grey
25
+ // defaultMaterialSnapshot fallback (no onError); case C (material handle
26
+ // unresolved) -> RhiError 'asset-not-registered' (mirrors the
27
+ // MeshFilter.assetHandle dangling-ref path).
28
+ //
29
+ // charter mapping: proposition 1 (single import) + proposition 4 (explicit
30
+ // failure: missing or unregistered handle fires onError 'asset-not-registered'
31
+ // with .detail = { assetHandle } + cross-asset brand mismatch is a TS
32
+ // compile-time error) + proposition 5 (consistent abstraction: the schema
33
+ // vocab `'shared<T>'` is the SSOT for AssetRegistry-owned handles across
34
+ // the engine).
35
+
36
+ import { defineComponent } from '@forgeax/engine-ecs';
37
+
38
+ /**
39
+ * Mesh filter (geometry asset reference).
40
+ *
41
+ * `assetHandle` carries a `Handle<'MeshAsset', 'shared'>` (u32-stored)
42
+ * pointing into `engine.assets: AssetRegistry`. Use the predefined
43
+ * constants `HANDLE_CUBE` / `HANDLE_TRIANGLE` exported from
44
+ * `@forgeax/engine-render`; custom-mesh registration is OOS in MVP (see
45
+ * feat-future-asset-system).
46
+ *
47
+ * Error path: if the handle is not registered at draw time, RenderSystem
48
+ * fires `Renderer.onError` with
49
+ * `RhiError({ code: 'asset-not-registered', detail: { assetHandle } })`
50
+ * and skips this entity (other entities continue rendering; charter
51
+ * proposition 9 graceful degradation).
52
+ *
53
+ * @example Spawn an entity referencing the builtin cube mesh:
54
+ * import { MeshFilter } from '@forgeax/engine-render';
55
+ * import { HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
56
+ * world.spawn({ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } });
57
+ */
58
+ export const MeshFilter = defineComponent('MeshFilter', {
59
+ assetHandle: { type: 'shared<MeshAsset>' },
60
+ });