@forgeax/engine-render 0.1.34 → 0.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/README.md +52 -3
  2. package/dist/assembly/device-feature-admission.d.ts +2 -2
  3. package/dist/assembly/host-contract.d.ts +3 -2
  4. package/dist/assembly/host-contract.d.ts.map +1 -1
  5. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  6. package/dist/assembly/render-target-host.d.ts +5 -0
  7. package/dist/assembly/render-target-host.d.ts.map +1 -1
  8. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  9. package/dist/assembly/webgpu-renderer.d.ts +1 -0
  10. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  11. package/dist/authoring.mjs +2 -4
  12. package/dist/authoring.mjs.map +1 -1
  13. package/dist/chunk-3XUBWRY2.mjs +1842 -0
  14. package/dist/chunk-3XUBWRY2.mjs.map +1 -0
  15. package/dist/{chunk-UI5SFODX.mjs → chunk-G6HDNGY7.mjs} +2329 -1776
  16. package/dist/chunk-G6HDNGY7.mjs.map +1 -0
  17. package/dist/{chunk-HEB564WF.mjs → chunk-LM5IE7GF.mjs} +4 -4
  18. package/dist/{chunk-HEB564WF.mjs.map → chunk-LM5IE7GF.mjs.map} +1 -1
  19. package/dist/{chunk-MKDIT2EM.mjs → chunk-LNIUIKQ7.mjs} +143 -246
  20. package/dist/chunk-LNIUIKQ7.mjs.map +1 -0
  21. package/dist/chunk-MXTWKZO4.mjs +3268 -0
  22. package/dist/chunk-MXTWKZO4.mjs.map +1 -0
  23. package/dist/{chunk-ODZWR6JQ.mjs → chunk-MZ4C7EHF.mjs} +2042 -27
  24. package/dist/chunk-MZ4C7EHF.mjs.map +1 -0
  25. package/dist/chunk-RIPAEGI6.mjs +48 -0
  26. package/dist/chunk-RIPAEGI6.mjs.map +1 -0
  27. package/dist/{chunk-OCDLEI6I.mjs → chunk-SGPUJW3F.mjs} +117 -5
  28. package/dist/chunk-SGPUJW3F.mjs.map +1 -0
  29. package/dist/{chunk-ELJFJ2BU.mjs → chunk-X2KA6WHM.mjs} +29 -4
  30. package/dist/chunk-X2KA6WHM.mjs.map +1 -0
  31. package/dist/{chunk-BLXGONR2.mjs → chunk-XSFB7XXQ.mjs} +51 -4
  32. package/dist/chunk-XSFB7XXQ.mjs.map +1 -0
  33. package/dist/cloud/frame-context.d.ts +2 -2
  34. package/dist/cloud/frame-context.d.ts.map +1 -1
  35. package/dist/construct-renderer.mjs +810 -2073
  36. package/dist/construct-renderer.mjs.map +1 -1
  37. package/dist/device/gpu-residency.d.ts +19 -19
  38. package/dist/device/gpu-residency.d.ts.map +1 -1
  39. package/dist/errors/render.d.ts +3 -2
  40. package/dist/errors/render.d.ts.map +1 -1
  41. package/dist/extract/material-context.d.ts +7 -0
  42. package/dist/extract/material-context.d.ts.map +1 -0
  43. package/dist/features/host.d.ts +5 -0
  44. package/dist/features/host.d.ts.map +1 -1
  45. package/dist/features/plan.d.ts +2 -0
  46. package/dist/features/plan.d.ts.map +1 -1
  47. package/dist/features/types.d.ts +4 -0
  48. package/dist/features/types.d.ts.map +1 -1
  49. package/dist/glyph-text-layout-system.d.ts +1 -1
  50. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  51. package/dist/gpu-driven/shadow-ownership.d.ts +3 -3
  52. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -1
  53. package/dist/ibl/frame-resources.d.ts.map +1 -1
  54. package/dist/ibl/skylight-bind-group.d.ts +4 -4
  55. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  56. package/dist/index.d.ts +3 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.mjs +530 -9
  59. package/dist/index.mjs.map +1 -1
  60. package/dist/instances.d.ts +3 -4
  61. package/dist/instances.d.ts.map +1 -1
  62. package/dist/internal.mjs +7 -8
  63. package/dist/internal.mjs.map +1 -1
  64. package/dist/pbr-pipeline.d.ts +3 -3
  65. package/dist/pbr-pipeline.d.ts.map +1 -1
  66. package/dist/pipeline/standard-output/lut-gpu.d.ts +2 -2
  67. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -1
  68. package/dist/pipeline/standard-output/resources.d.ts +2 -2
  69. package/dist/pipeline/standard-output/resources.d.ts.map +1 -1
  70. package/dist/publication/contract.d.ts +77 -0
  71. package/dist/publication/contract.d.ts.map +1 -0
  72. package/dist/publication/dependencies.d.ts +7 -0
  73. package/dist/publication/dependencies.d.ts.map +1 -0
  74. package/dist/publication/prepare-geometry.d.ts +9 -0
  75. package/dist/publication/prepare-geometry.d.ts.map +1 -0
  76. package/dist/publication/programs.d.ts +5 -0
  77. package/dist/publication/programs.d.ts.map +1 -0
  78. package/dist/publication/publisher.d.ts +33 -0
  79. package/dist/publication/publisher.d.ts.map +1 -0
  80. package/dist/publication/receiver.d.ts +29 -0
  81. package/dist/publication/receiver.d.ts.map +1 -0
  82. package/dist/publication/resource-scope.d.ts +18 -0
  83. package/dist/publication/resource-scope.d.ts.map +1 -0
  84. package/dist/publication/targets.d.ts +33 -0
  85. package/dist/publication/targets.d.ts.map +1 -0
  86. package/dist/publication/video.d.ts +5 -0
  87. package/dist/publication/video.d.ts.map +1 -0
  88. package/dist/record/fold-buckets.d.ts +3 -3
  89. package/dist/record/fold-buckets.d.ts.map +1 -1
  90. package/dist/record/frame-snapshot.d.ts +6 -6
  91. package/dist/record/frame-snapshot.d.ts.map +1 -1
  92. package/dist/record/frame.d.ts +5 -4
  93. package/dist/record/frame.d.ts.map +1 -1
  94. package/dist/record/helpers.d.ts +2 -2
  95. package/dist/record/helpers.d.ts.map +1 -1
  96. package/dist/record/main-pass-geometry.d.ts +2 -2
  97. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  98. package/dist/record/main-pass-material.d.ts +7 -9
  99. package/dist/record/main-pass-material.d.ts.map +1 -1
  100. package/dist/record/main-pass-sprite-draws.d.ts +3 -16
  101. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  102. package/dist/record/main-pass.d.ts.map +1 -1
  103. package/dist/record/prepared-material-bindings.d.ts +3 -3
  104. package/dist/record/prepared-material-bindings.d.ts.map +1 -1
  105. package/dist/record/render-context.d.ts +2 -2
  106. package/dist/record/render-context.d.ts.map +1 -1
  107. package/dist/record/sprite-instance-buffer.d.ts +31 -0
  108. package/dist/record/sprite-instance-buffer.d.ts.map +1 -0
  109. package/dist/record/target-capture-graph.d.ts +19 -0
  110. package/dist/record/target-capture-graph.d.ts.map +1 -0
  111. package/dist/record/typed-frame-graph.d.ts +2 -13
  112. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  113. package/dist/record/view-ubo.d.ts.map +1 -1
  114. package/dist/record/volume-params.d.ts +2 -2
  115. package/dist/record/volume-params.d.ts.map +1 -1
  116. package/dist/recovery/render-system-candidate.d.ts +5 -5
  117. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  118. package/dist/render-contract.d.ts +4 -1
  119. package/dist/render-contract.d.ts.map +1 -1
  120. package/dist/render-system-extract-tail.d.ts.map +1 -1
  121. package/dist/render-system-extract.d.ts +2 -0
  122. package/dist/render-system-extract.d.ts.map +1 -1
  123. package/dist/render-system-presentation.d.ts +2 -2
  124. package/dist/render-system-presentation.d.ts.map +1 -1
  125. package/dist/render-system-projections.d.ts +3 -2
  126. package/dist/render-system-projections.d.ts.map +1 -1
  127. package/dist/render-system-residency.d.ts +2 -2
  128. package/dist/render-system-residency.d.ts.map +1 -1
  129. package/dist/render-system.d.ts +3 -7
  130. package/dist/render-system.d.ts.map +1 -1
  131. package/dist/scene/render-scene.d.ts +8 -4
  132. package/dist/scene/render-scene.d.ts.map +1 -1
  133. package/dist/scene/render-source.d.ts +42 -0
  134. package/dist/scene/render-source.d.ts.map +1 -0
  135. package/dist/scene/source-systems.d.ts +6 -0
  136. package/dist/scene/source-systems.d.ts.map +1 -0
  137. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  138. package/dist/systems/skin-palette-types.d.ts +10 -0
  139. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  140. package/dist/systems/transparent-dispatch.d.ts +2 -2
  141. package/dist/systems/transparent-dispatch.d.ts.map +1 -1
  142. package/dist/systems/transparent-sort-config.d.ts +2 -1
  143. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  144. package/dist/temporal/index.mjs +6 -7
  145. package/package.json +21 -21
  146. package/src/__tests__/auto-exposure-transaction.integration.test.ts +4 -9
  147. package/src/__tests__/device-feature-admission.unit.test.ts +3 -2
  148. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +3 -4
  149. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +4 -1
  150. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +0 -1
  151. package/src/__tests__/materials-standard-contract.unit.test.ts +0 -1
  152. package/src/__tests__/physical-clearcoat.integration.test.ts +23 -23
  153. package/src/__tests__/physical-material-budget.unit.test.ts +40 -0
  154. package/src/__tests__/render-error-code-owner.test-d.ts +1 -0
  155. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +1 -1
  156. package/src/assembly/device-feature-admission.ts +2 -2
  157. package/src/assembly/host-contract.ts +5 -2
  158. package/src/assembly/recovery/renderer-recover.ts +9 -0
  159. package/src/assembly/render-target-host.ts +57 -47
  160. package/src/assembly/renderer-facade.ts +3 -1
  161. package/src/assembly/webgpu-ready.ts +1 -1
  162. package/src/assembly/webgpu-renderer.ts +89 -61
  163. package/src/cloud/frame-context.ts +2 -2
  164. package/src/device/gpu-residency.ts +26 -25
  165. package/src/errors/render.ts +3 -1
  166. package/src/extract/material-context.ts +21 -0
  167. package/src/features/host.ts +13 -5
  168. package/src/features/plan.ts +2 -0
  169. package/src/features/types.ts +4 -0
  170. package/src/glyph-text-layout-system.ts +2 -2
  171. package/src/gpu-driven/shadow-ownership.ts +3 -3
  172. package/src/ibl/frame-resources.ts +0 -1
  173. package/src/ibl/skylight-bind-group.ts +13 -25
  174. package/src/index.ts +9 -0
  175. package/src/instances.ts +9 -6
  176. package/src/pbr-pipeline.ts +11 -17
  177. package/src/pipeline/standard-output/lut-gpu.ts +3 -3
  178. package/src/pipeline/standard-output/resources.ts +2 -2
  179. package/src/publication/__tests__/derived-geometry.integration.test.ts +177 -0
  180. package/src/publication/__tests__/features.integration.test.ts +122 -0
  181. package/src/publication/__tests__/programs.unit.test.ts +25 -0
  182. package/src/publication/__tests__/publication.integration.test.ts +370 -0
  183. package/src/publication/__tests__/targets.integration.test.ts +120 -0
  184. package/src/publication/__tests__/video.browser.test.ts +50 -0
  185. package/src/publication/contract.ts +104 -0
  186. package/src/publication/dependencies.ts +54 -0
  187. package/src/publication/prepare-geometry.ts +94 -0
  188. package/src/publication/programs.ts +45 -0
  189. package/src/publication/publisher.ts +618 -0
  190. package/src/publication/receiver.ts +297 -0
  191. package/src/publication/resource-scope.ts +31 -0
  192. package/src/publication/targets.ts +182 -0
  193. package/src/publication/video.ts +33 -0
  194. package/src/record/__tests__/material-bg-cache.unit.test.ts +15 -1
  195. package/src/record/__tests__/sprite-material-abi.unit.test.ts +8 -10
  196. package/src/record/__tests__/video-texture-view.unit.test.ts +9 -9
  197. package/src/record/fold-buckets.ts +8 -5
  198. package/src/record/frame-snapshot.ts +6 -6
  199. package/src/record/frame.ts +42 -22
  200. package/src/record/helpers.ts +2 -2
  201. package/src/record/main-pass-geometry.ts +21 -2
  202. package/src/record/main-pass-material.ts +37 -33
  203. package/src/record/main-pass-sprite-draws.ts +6 -152
  204. package/src/record/main-pass.ts +8 -7
  205. package/src/record/prepared-material-bindings.ts +11 -6
  206. package/src/record/render-context.ts +2 -2
  207. package/src/record/shadow-pass.ts +0 -3
  208. package/src/record/sprite-instance-buffer.ts +155 -0
  209. package/src/record/target-capture-graph.ts +258 -0
  210. package/src/record/typed-frame-graph.ts +6 -206
  211. package/src/record/view-ubo.ts +1 -1
  212. package/src/record/volume-params.ts +6 -6
  213. package/src/recovery/render-system-candidate.ts +10 -10
  214. package/src/render-contract.ts +6 -1
  215. package/src/render-system-extract-tail.ts +33 -17
  216. package/src/render-system-extract.ts +2 -0
  217. package/src/render-system-presentation.ts +2 -2
  218. package/src/render-system-projections.ts +3 -2
  219. package/src/render-system-residency.ts +2 -2
  220. package/src/render-system.ts +82 -53
  221. package/src/scene/render-scene.ts +110 -100
  222. package/src/scene/render-source.ts +90 -0
  223. package/src/scene/source-systems.ts +33 -0
  224. package/src/systems/skin-palette-allocator.ts +1 -0
  225. package/src/systems/skin-palette-types.ts +11 -0
  226. package/src/systems/transparent-dispatch.ts +2 -2
  227. package/src/systems/transparent-sort-config.ts +3 -1
  228. package/dist/chunk-BLXGONR2.mjs.map +0 -1
  229. package/dist/chunk-ELJFJ2BU.mjs.map +0 -1
  230. package/dist/chunk-ILQ5MEZF.mjs +0 -32
  231. package/dist/chunk-ILQ5MEZF.mjs.map +0 -1
  232. package/dist/chunk-MKDIT2EM.mjs.map +0 -1
  233. package/dist/chunk-OCDLEI6I.mjs.map +0 -1
  234. package/dist/chunk-ODZWR6JQ.mjs.map +0 -1
  235. package/dist/chunk-RXZ3RGOU.mjs +0 -53
  236. package/dist/chunk-RXZ3RGOU.mjs.map +0 -1
  237. package/dist/chunk-SHFUFJ5N.mjs +0 -1781
  238. package/dist/chunk-SHFUFJ5N.mjs.map +0 -1
  239. package/dist/chunk-UI5SFODX.mjs.map +0 -1
  240. package/dist/chunk-UINHLCZA.mjs +0 -2389
  241. package/dist/chunk-UINHLCZA.mjs.map +0 -1
  242. package/dist/chunk-WEX45HKH.mjs +0 -1524
  243. package/dist/chunk-WEX45HKH.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/assets/asset-decoders.ts","../src/examples/single-layer-medium-surface.ts","../src/plugin.ts","../src/scene/visibility/gpu-frame-timing.ts","../src/ssr/composition.ts","../src/transmission/oracle.ts","../src/transmission/single-layer-medium.ts"],"names":["record","invalid","err","ok","clamp01","finiteColor"],"mappings":"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","file":"index.mjs","sourcesContent":["import { validateCookedMaterialRecord } from '@forgeax/engine-pack';\nimport {\n type AssetDecoderContribution,\n type AssetKind,\n type AssetLoadError,\n err,\n MATERIAL_TEXTURE_SLOTS,\n type MaterialAsset,\n type MaterialChildAsset,\n type MaterialRootAsset,\n ok,\n type RenderPipelineAsset,\n type SamplerAsset,\n} from '@forgeax/engine-types';\n\nfunction invalid(guid: string, expected: string, reason: string) {\n return err({\n code: 'asset-package-invalid' as const,\n expected,\n hint: 'recook the render asset and publish its complete cooked payload',\n detail: { guid, reason },\n });\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction validMaterial(value: unknown): value is MaterialAsset {\n if (!record(value) || value.kind !== 'material') return false;\n if (value.cooked !== undefined && !validateCookedMaterialRecord(value.cooked).ok) {\n return false;\n }\n if (value.passes !== undefined && !Array.isArray(value.passes)) return false;\n if (value.parameters !== undefined && !Array.isArray(value.parameters)) return false;\n if (\n value.parent !== undefined &&\n ['colorSpace', 'passes', 'parameters'].some((field) => Object.hasOwn(value, field))\n ) {\n return false;\n }\n return value.values === undefined || record(value.values);\n}\n\nfunction resolveMaterialWireRef(\n value: unknown,\n refs: readonly string[],\n field: string,\n guid: string,\n): ReturnType<typeof ok<string | number>> | ReturnType<typeof err<AssetLoadError>> {\n if (typeof value !== 'number') return ok(value as string | number);\n if (!Number.isSafeInteger(value) || value < 0 || refs[value] === undefined) {\n return err<AssetLoadError>({\n code: 'asset-package-invalid',\n expected: `${field} to reference a GUID through the material Pack refs[] table`,\n hint: 'recook the material so every texture or sampler ref has a matching refs[] entry',\n detail: { guid, reason: `${field} refs[${value}] is out of bounds` },\n });\n }\n return ok(refs[value] as string);\n}\n\nfunction resolveMaterialWireRefs(\n value: MaterialAsset,\n refs: readonly string[],\n guid: string,\n): ReturnType<typeof ok<MaterialAsset>> | ReturnType<typeof err<AssetLoadError>> {\n if (refs.length === 0) return ok(value);\n\n let changed = false;\n const wire = value as unknown as { readonly parent?: unknown };\n let parent = wire.parent;\n if (typeof parent === 'number') {\n const resolved = resolveMaterialWireRef(parent, refs, 'parent', guid);\n if (!resolved.ok) return resolved;\n parent = resolved.value;\n changed = true;\n }\n\n if (value.values === undefined) {\n if (!changed) return ok(value);\n if (parent !== undefined) {\n const child = value as MaterialChildAsset;\n return ok({ ...child, parent: parent as unknown as MaterialChildAsset['parent'] });\n }\n return ok(value);\n }\n\n const textureFields = new Set(\n value.parameters === undefined\n ? MATERIAL_TEXTURE_SLOTS\n : value.parameters\n .filter((parameter) => parameter.type === 'texture' || parameter.type === 'texture_cube')\n .map((parameter) => parameter.name),\n );\n const values = { ...value.values };\n for (const [field, raw] of Object.entries(values)) {\n if (typeof raw === 'number' && textureFields.has(field)) {\n const resolved = resolveMaterialWireRef(raw, refs, field, guid);\n if (!resolved.ok) return resolved;\n values[field] = resolved.value as NonNullable<MaterialAsset['values']>[string];\n changed = true;\n continue;\n }\n if (!record(raw)) continue;\n const rawRecord = raw as unknown as Record<string, unknown>;\n let rewritten: Record<string, unknown> | undefined;\n for (const key of ['texture', 'sampler'] as const) {\n if (!(key in rawRecord)) continue;\n const resolved = resolveMaterialWireRef(rawRecord[key], refs, `${field}.${key}`, guid);\n if (!resolved.ok) return resolved;\n if (resolved.value !== rawRecord[key]) {\n rewritten ??= { ...rawRecord };\n rewritten[key] = resolved.value;\n changed = true;\n }\n }\n if (rewritten !== undefined) {\n values[field] = rewritten as unknown as NonNullable<MaterialAsset['values']>[string];\n }\n }\n if (!changed) return ok(value);\n if (parent !== undefined) {\n const child = value as MaterialChildAsset;\n return ok({\n ...child,\n parent: parent as unknown as MaterialChildAsset['parent'],\n values,\n });\n }\n return ok({ ...value, values } as MaterialRootAsset);\n}\n\nexport const materialContribution: AssetDecoderContribution<MaterialAsset, 'material'> = {\n kind: { kind: 'material' } as AssetKind<MaterialAsset, 'material'>,\n consumer: 'Render MaterialScene',\n decoder: {\n async decode({ envelope }) {\n if (!validMaterial(envelope.payload)) {\n return invalid(\n envelope.guid,\n 'a material payload with cooked passes, parameters, and values',\n 'material owner validation failed',\n );\n }\n return resolveMaterialWireRefs(envelope.payload, envelope.refs, envelope.guid);\n },\n },\n};\n\nexport const samplerContribution: AssetDecoderContribution<SamplerAsset, 'sampler'> = {\n kind: { kind: 'sampler' } as AssetKind<SamplerAsset, 'sampler'>,\n consumer: 'Render DeviceScope',\n decoder: {\n async decode({ envelope }) {\n return envelope.payload.kind === 'sampler'\n ? ok(envelope.payload)\n : invalid(envelope.guid, 'a sampler payload', 'sampler owner validation failed');\n },\n },\n};\n\nexport const renderPipelineContribution: AssetDecoderContribution<\n RenderPipelineAsset,\n 'render-pipeline'\n> = {\n kind: { kind: 'render-pipeline' } as AssetKind<RenderPipelineAsset, 'render-pipeline'>,\n consumer: 'Render Pipeline',\n decoder: {\n async decode({ envelope }) {\n const payload = envelope.payload;\n return payload.kind === 'render-pipeline' && payload.pipelineId.trim().length > 0\n ? ok(payload)\n : invalid(\n envelope.guid,\n 'a render-pipeline payload with a pipelineId',\n 'render-pipeline owner validation failed',\n );\n },\n },\n};\n","import type { MaterialRootAsset } from '@forgeax/engine-types';\n\n/**\n * A public root asset showing the model declaration and its bounded input.\n * The page is shared by every material instance; Render supplies the page\n * bytes and each instance publishes its own range.\n */\nexport const SINGLE_LAYER_MEDIUM_SURFACE_EXAMPLE = {\n kind: 'material',\n surface: {\n model: 'single-layer-medium',\n module: 'game::water_surface_a',\n dynamicInput: {\n name: 'waterEvents',\n fields: [\n { name: 'position', type: 'vec3<f32>' },\n { name: 'time', type: 'f32' },\n { name: 'eventId', type: 'u32' },\n ],\n maxRecords: 64,\n maxDomains: 8,\n maxPageBytes: 2048,\n maxBindings: 1,\n maxEventsPerSample: 8,\n },\n },\n passes: [\n {\n name: 'color',\n program: { module: 'forgeax::single-layer-medium' },\n },\n ],\n parameters: [],\n values: {},\n} as const satisfies MaterialRootAsset;\n\n/** Two different imported Surface implementations consuming one model ABI. */\nexport const SINGLE_LAYER_MEDIUM_SURFACE_EXAMPLES = [\n {\n module: 'game::water_surface_a',\n source: `#define_import_path game::water_surface_a\n#import forgeax_material::single_layer_medium_surface_v1::{SingleLayerMediumSurfaceInput, SingleLayerMediumSurfaceData}\nfn evaluate_surface(input : SingleLayerMediumSurfaceInput) -> SingleLayerMediumSurfaceData {\n let event = read_waterEvents(input.eventRangeStart);\n let normal = normalize(input.geometricNormalWS + vec3<f32>(0.0, 0.0, event.time * 0.02));\n return SingleLayerMediumSurfaceData(normal, 0.18, 1.0, 0.0, vec3<f32>(0.18, 0.06, 0.02), vec3<f32>(0.02, 0.04, 0.08), 1.333, 0.2, 1000.0);\n}`,\n },\n {\n module: 'game::water_surface_b',\n source: `#define_import_path game::water_surface_b\n#import forgeax_material::single_layer_medium_surface_v1::{SingleLayerMediumSurfaceInput, SingleLayerMediumSurfaceData}\nfn evaluate_surface(input : SingleLayerMediumSurfaceInput) -> SingleLayerMediumSurfaceData {\n let event = read_waterEvents(input.eventRangeStart);\n let normal = normalize(input.geometricNormalWS + vec3<f32>(event.position.xy * 0.01, 0.0));\n return SingleLayerMediumSurfaceData(normal, 0.32, 1.0, clamp(event.time * 0.1, 0.0, 1.0), vec3<f32>(0.04, 0.02, 0.01), vec3<f32>(0.08, 0.05, 0.02), 1.333, -0.1, 800.0);\n}`,\n },\n] as const;\n","import type { Component, World } from '@forgeax/engine-ecs';\nimport type { Plugin } from '@forgeax/engine-plugin';\nimport { Atmosphere } from './components/atmosphere';\nimport { BarrelDistortion } from './components/barrel-distortion';\nimport { Camera } from './components/camera';\nimport { CloudLayer } from './components/cloud-layer';\nimport { DepthOfField } from './components/depth-of-field';\nimport { DirectionalLight } from './components/directional-light';\nimport { DynamicResolution } from './components/dynamic-resolution';\nimport { Instances } from './components/instances';\nimport { Layer } from './components/layer';\nimport { LightProbe } from './components/light-probe';\nimport { Lines } from './components/lines';\nimport { MeshFilter } from './components/mesh-filter';\nimport { MeshRenderer } from './components/mesh-renderer';\nimport { MotionBlur } from './components/motion-blur';\nimport { PointLight } from './components/point-light';\nimport { PointLightShadow } from './components/point-light-shadow';\nimport { Points } from './components/points';\nimport { PostProcessParams } from './components/post-process-params';\nimport { RectAreaLight } from './components/rect-area-light';\nimport { SceneInstance } from './components/scene-instance';\nimport { SkyboxBackground } from './components/skybox-background';\nimport { Skylight } from './components/skylight';\nimport { SortKey } from './components/sort-key';\nimport { SpotLight } from './components/spot-light';\nimport { SpriteAnimation } from './components/sprite-animation';\nimport { SpriteInstances } from './components/sprite-instances';\nimport { SpriteRegionOverride } from './components/sprite-region-override';\nimport { TileLayer } from './components/tile-layer';\nimport { Tilemap } from './components/tilemap';\nimport { Visibility } from './components/visibility';\n\nconst RENDER_COMPONENTS: readonly Component[] = [\n Atmosphere,\n BarrelDistortion,\n Camera,\n CloudLayer,\n DirectionalLight,\n DynamicResolution,\n DepthOfField,\n Instances,\n Layer,\n LightProbe,\n MeshFilter,\n MeshRenderer,\n MotionBlur,\n PointLight,\n PointLightShadow,\n Points,\n Lines,\n PostProcessParams,\n RectAreaLight,\n SceneInstance,\n SkyboxBackground,\n Skylight,\n SortKey,\n SpotLight,\n SpriteAnimation,\n SpriteInstances,\n SpriteRegionOverride,\n TileLayer,\n Tilemap,\n Visibility,\n];\n\nfunction registerRenderComponents(world: World): () => void {\n const leases = RENDER_COMPONENTS.map((component) =>\n world.components.register(component).unwrap(),\n );\n return () => {\n for (let index = leases.length - 1; index >= 0; index -= 1) leases[index]?.dispose();\n };\n}\n\n/** Install the built-in render ECS vocabulary in one World. */\nexport function renderComponentsPlugin(): Plugin {\n return {\n name: 'render-components',\n inject: ['world'],\n apply(ctx) {\n ctx.effect(() => registerRenderComponents(ctx.world), 'render/components');\n },\n };\n}\n","/** Renderer-owned timestamp facts spanning one graph and one queue submit. */\n\nexport interface GpuFrameTimingProtocol {\n readonly firstMarker: 'frame.first-pass';\n readonly terminalMarker: 'occlusion.resolve-copy';\n readonly sameGraph: true;\n readonly sameSubmit: true;\n}\n\nexport interface GpuFrameTiming {\n readonly frameId: number;\n readonly deviceGeneration: number;\n readonly protocol: GpuFrameTimingProtocol;\n aborted: boolean;\n submitId: number | undefined;\n}\n\nexport interface GpuFrameTimingRecord {\n readonly firstPassTimestampNs: number;\n readonly occlusionResolveTimestampNs: number;\n readonly submitted: boolean;\n readonly graphGeneration: number;\n readonly submitId: number;\n}\n\nexport interface GpuFrameTimingSample {\n readonly frameId: number;\n readonly deviceGeneration: number;\n readonly durationUs: number;\n readonly protocol: GpuFrameTimingProtocol;\n readonly graphGeneration: number;\n readonly submitId: number;\n}\n\nexport interface GpuFrameTimingSummary {\n readonly medianUs: number;\n readonly p95Us: number;\n readonly samples: number;\n}\n\nconst PROTOCOL: GpuFrameTimingProtocol = Object.freeze({\n firstMarker: 'frame.first-pass',\n terminalMarker: 'occlusion.resolve-copy',\n sameGraph: true,\n sameSubmit: true,\n});\n\nexport function createGpuFrameTiming(input: {\n readonly frameId: number;\n readonly deviceGeneration: number;\n}): GpuFrameTiming {\n return { ...input, protocol: PROTOCOL, aborted: false, submitId: undefined };\n}\n\nexport function recordGpuFrameTiming(\n timing: GpuFrameTiming,\n record: GpuFrameTimingRecord,\n): GpuFrameTimingSample {\n if (!record.submitted) {\n timing.aborted = true;\n throw new Error('GPU frame timing requires a submitted frame');\n }\n if (timing.aborted) throw new Error('GPU frame timing cannot cross a failed submit');\n if (timing.submitId !== undefined && timing.submitId !== record.submitId) {\n throw new Error('GPU frame timing markers must share one submit');\n }\n if (\n !Number.isFinite(record.firstPassTimestampNs) ||\n !Number.isFinite(record.occlusionResolveTimestampNs)\n ) {\n throw new Error('GPU frame timing requires finite timestamps');\n }\n if (record.occlusionResolveTimestampNs < record.firstPassTimestampNs) {\n throw new Error('GPU frame timing terminal marker precedes first marker');\n }\n timing.submitId = record.submitId;\n return Object.freeze({\n frameId: timing.frameId,\n deviceGeneration: timing.deviceGeneration,\n durationUs: (record.occlusionResolveTimestampNs - record.firstPassTimestampNs) / 1_000,\n protocol: PROTOCOL,\n graphGeneration: record.graphGeneration,\n submitId: record.submitId,\n });\n}\n\nfunction nearestRank(values: readonly number[], percentile: number): number {\n const sorted = [...values].sort((left, right) => left - right);\n return sorted[Math.max(0, Math.ceil(percentile * sorted.length) - 1)] ?? 0;\n}\n\nexport function summarizeGpuFrameTiming(\n samples: readonly GpuFrameTimingSample[],\n): GpuFrameTimingSummary {\n const values = samples.map((sample) => sample.durationUs);\n return Object.freeze({\n medianUs: nearestRank(values, 0.5),\n p95Us: nearestRank(values, 0.95),\n samples: values.length,\n });\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\n\n/** Linear HDR RGB used by the M0 composition contract. */\nexport type SsrReflectionColor = readonly [number, number, number];\n\nexport interface SsrCompositionInput {\n /** Screen-hit confidence. The parent SSR consumer supplies 0..1. */\n readonly c: number;\n /** The Standard BRDF specular lobe before SSR replacement. */\n readonly baseSpecular: SsrReflectionColor;\n /** The same-source BRDF-projected screen contribution. */\n readonly screenSpecular: SsrReflectionColor;\n /** The committed producer-owned environment contribution. */\n readonly fallbackSpecular: SsrReflectionColor;\n}\n\nexport interface SsrCompositionInputError {\n readonly code: 'ssr-composition-input-invalid';\n readonly expected: string;\n readonly hint: string;\n readonly detail: Readonly<{\n readonly field: 'c' | 'baseSpecular' | 'screenSpecular' | 'fallbackSpecular';\n }>;\n}\n\nexport type SsrCompositionResult = Result<SsrReflectionColor, SsrCompositionInputError>;\n\nfunction finiteColor(value: SsrReflectionColor): boolean {\n return value.length === 3 && value.every(Number.isFinite);\n}\n\nfunction invalid(\n field: SsrCompositionInputError['detail']['field'],\n expected: string,\n): SsrCompositionResult {\n return err({\n code: 'ssr-composition-input-invalid',\n expected,\n hint: 'preserve linear HDR and the bounded SSR confidence before composing',\n detail: Object.freeze({ field }),\n });\n}\n\n/**\n * Apply the M0 reflection replacement contract without owning an SSR pass.\n *\n * `c=0` returns the base Standard specular lobe. `c=1` replaces only that\n * lobe with the same-source screen contribution, subtracting the committed\n * environment contribution once. Hi-Z traversal, history and graph wiring\n * remain owned by the parent SSR feature.\n */\nexport function composeSsrReflection(input: SsrCompositionInput): SsrCompositionResult {\n if (!Number.isFinite(input.c) || input.c < 0 || input.c > 1) {\n return invalid('c', 'a finite confidence in the inclusive range 0..1');\n }\n for (const [field, value] of [\n ['baseSpecular', input.baseSpecular],\n ['screenSpecular', input.screenSpecular],\n ['fallbackSpecular', input.fallbackSpecular],\n ] as const) {\n if (!finiteColor(value)) {\n return invalid(field, 'three finite linear HDR RGB channels');\n }\n }\n const c = input.c;\n return ok(\n Object.freeze([\n input.baseSpecular[0] + c * (input.screenSpecular[0] - input.fallbackSpecular[0]),\n input.baseSpecular[1] + c * (input.screenSpecular[1] - input.fallbackSpecular[1]),\n input.baseSpecular[2] + c * (input.screenSpecular[2] - input.fallbackSpecular[2]),\n ]) as SsrReflectionColor,\n );\n}\n","/** Pure CPU expectations for transmission math; this module has no GPU ownership. */\n\nexport type Color3 = readonly [number, number, number];\nexport type Uv2 = readonly [number, number];\n\nexport const DEFAULT_IOR = 1.5;\nexport const DEFAULT_GUARD_BAND = 0.02;\n\nexport interface TransmissionEnergy {\n readonly reflection: number;\n readonly transmission: number;\n readonly diffuse: number;\n readonly metallicResidual: number;\n}\n\nexport interface BackdropResolution {\n readonly source: 'refracted' | 'environment' | 'unrefracted';\n readonly color: Color3;\n}\n\nexport interface BackdropInputs {\n readonly uv: Uv2;\n readonly refracted?: Color3;\n readonly environment?: Color3;\n readonly unrefracted: Color3;\n readonly guardBand?: number;\n}\n\nconst clamp01 = (value: number): number => Math.min(Math.max(value, 0), 1);\n\nconst finiteOr = (value: number, fallback: number): number =>\n Number.isFinite(value) ? value : fallback;\n\nconst safeIor = (ior: number): number => {\n const candidate = finiteOr(ior, DEFAULT_IOR);\n return candidate >= 1 ? candidate : DEFAULT_IOR;\n};\n\n/** Returns dielectric F0 for air to a material with the supplied IOR. */\nexport function fresnelF0(ior: number): number {\n const ratio = (safeIor(ior) - 1) / (safeIor(ior) + 1);\n return ratio * ratio;\n}\n\n/**\n * Returns unpolarized dielectric reflectance. `eta` is incident IOR divided\n * by transmitted IOR, so values above one can produce total internal\n * reflection. This is a CPU oracle only; it does not sample a GPU resource.\n */\nexport function fresnelReflectance(cosTheta: number, eta: number): number {\n if (!Number.isFinite(cosTheta) || !Number.isFinite(eta) || eta <= 0) return 1;\n\n const cosIncident = clamp01(cosTheta);\n const sinTransmittedSquared = eta * eta * (1 - cosIncident * cosIncident);\n if (sinTransmittedSquared >= 1) return 1;\n\n const cosTransmitted = Math.sqrt(Math.max(0, 1 - sinTransmittedSquared));\n const perpendicularDenominator = cosIncident + eta * cosTransmitted;\n const parallelDenominator = eta * cosIncident + cosTransmitted;\n if (perpendicularDenominator === 0 || parallelDenominator === 0) return 1;\n\n const perpendicular = (cosIncident - eta * cosTransmitted) / perpendicularDenominator;\n const parallel = (eta * cosIncident - cosTransmitted) / parallelDenominator;\n return clamp01((perpendicular * perpendicular + parallel * parallel) / 2);\n}\n\nexport function splitTransmissionEnergy(input: {\n readonly transmission: number;\n readonly metallic: number;\n readonly cosTheta: number;\n readonly ior: number;\n}): TransmissionEnergy {\n const transmission = clamp01(finiteOr(input.transmission, 0));\n const metallic = clamp01(finiteOr(input.metallic, 0));\n const reflectance = fresnelReflectance(input.cosTheta, 1 / safeIor(input.ior));\n const nonMetal = 1 - metallic;\n const refracted = (1 - reflectance) * nonMetal;\n\n return {\n reflection: reflectance,\n transmission: refracted * transmission,\n diffuse: refracted * (1 - transmission),\n metallicResidual: (1 - reflectance) * metallic,\n };\n}\n\nexport function beerLambertAttenuation(\n color: Color3,\n thickness: number,\n distance?: number,\n): Color3 {\n if (\n !Number.isFinite(thickness) ||\n thickness <= 0 ||\n distance === undefined ||\n !Number.isFinite(distance) ||\n distance <= 0\n ) {\n return [1, 1, 1];\n }\n\n const exponent = thickness / distance;\n const attenuate = (component: number): number => {\n const safeComponent = clamp01(finiteOr(component, 0));\n return Math.min(Math.max(safeComponent ** exponent, 0), 1);\n };\n return [attenuate(color[0]), attenuate(color[1]), attenuate(color[2])];\n}\n\nexport function roughnessToLod(roughness: number, maxLod: number): number {\n const safeRoughness = clamp01(finiteOr(roughness, 0));\n const safeMaxLod = Math.max(finiteOr(maxLod, 0), 0);\n return safeRoughness * safeRoughness * safeMaxLod;\n}\n\nexport function isWithinGuardBand(uv: Uv2, guardBand = DEFAULT_GUARD_BAND): boolean {\n if (!uv.every(Number.isFinite) || !Number.isFinite(guardBand)) return false;\n const band = clamp01(guardBand);\n return uv.every((coordinate) => coordinate >= band && coordinate <= 1 - band);\n}\n\nexport function resolveRefractionBackdrop(input: BackdropInputs): BackdropResolution {\n if (\n isWithinGuardBand(input.uv, input.guardBand) &&\n input.refracted !== undefined &&\n isFiniteColor(input.refracted)\n ) {\n return { source: 'refracted', color: input.refracted };\n }\n if (input.environment !== undefined && isFiniteColor(input.environment)) {\n return { source: 'environment', color: input.environment };\n }\n if (isFiniteColor(input.unrefracted)) {\n return { source: 'unrefracted', color: input.unrefracted };\n }\n return { source: 'unrefracted', color: [0, 0, 0] };\n}\n\nexport function isFiniteColor(color: Color3): boolean {\n return color.length === 3 && color.every(Number.isFinite);\n}\n","import { type Color3, fresnelReflectance, type Uv2 } from './oracle.js';\n\nexport type MediumVector3 = readonly [number, number, number];\n\nexport interface SingleLayerMediumCoefficients {\n /** Linear, inverse-metre absorption coefficients. */\n readonly absorption: MediumVector3;\n /** Linear, inverse-metre scattering coefficients. */\n readonly scattering: MediumVector3;\n readonly ior: number;\n /** Henyey-Greenstein phase anisotropy in [-1, 1]. */\n readonly phaseG?: number;\n}\n\nexport interface SingleLayerMediumOptics {\n readonly sigmaT: MediumVector3;\n readonly transmittance: MediumVector3;\n /** Uniform-medium single-scatter integral sigmaS * (1 - T) / sigmaT. */\n readonly singleScatter: MediumVector3;\n readonly reflectance: number;\n readonly transmissionWeight: number;\n readonly phase: number;\n readonly distanceMeters: number;\n}\n\nexport type SingleLayerMediumBackgroundReason = 'front' | 'shore' | 'edge' | 'sky-miss';\n\nexport interface SingleLayerMediumBackgroundCandidate {\n readonly color: Color3;\n readonly depthMeters: number;\n readonly uv: Uv2;\n}\n\nexport interface SingleLayerMediumBackgroundInput {\n /** No-water color and raw depth must come from the same view identity. */\n readonly original: SingleLayerMediumBackgroundCandidate;\n /** Refracted candidate carries color and depth as one pair. */\n readonly refracted?: SingleLayerMediumBackgroundCandidate;\n readonly environment?: Color3;\n readonly surfaceDepthMeters: number;\n readonly maxDistanceMeters: number;\n readonly depthToleranceMeters?: number;\n}\n\nexport interface SingleLayerMediumBackgroundResolution {\n readonly source: 'refracted' | 'unrefracted' | 'environment';\n readonly reason?: SingleLayerMediumBackgroundReason;\n readonly candidate: SingleLayerMediumBackgroundCandidate | undefined;\n readonly color: Color3;\n readonly distanceMeters: number;\n}\n\nconst DEFAULT_MAX_DISTANCE_METERS = 1000;\nconst DEFAULT_DEPTH_TOLERANCE_METERS = 0.001;\nconst DEFAULT_IOR = 1.333;\n\nconst finiteOr = (value: number, fallback: number): number =>\n Number.isFinite(value) ? value : fallback;\n\nfunction oneMinusExpNeg(value: number): number {\n const x = Math.max(finiteOr(value, 0), 0);\n if (x < 1e-3) {\n const x2 = x * x;\n return x * (1 - x * 0.5 + x2 / 6 - (x * x2) / 24);\n }\n return -Math.expm1(-x);\n}\n\nfunction singleScatterIntegral(sigmaS: number, sigmaT: number, distance: number): number {\n const scattering = Math.max(finiteOr(sigmaS, 0), 0);\n const extinction = Math.max(finiteOr(sigmaT, 0), 0);\n const path = Math.max(finiteOr(distance, 0), 0);\n if (extinction === 0) return scattering * path;\n return (scattering * oneMinusExpNeg(extinction * path)) / extinction;\n}\n\nconst nonNegative = (value: number): number => Math.max(finiteOr(value, 0), 0);\n\nconst clamp01 = (value: number): number => Math.min(Math.max(finiteOr(value, 0), 0), 1);\n\n/** Test an endpoint against the undisturbed geometric water plane. */\nexport function isBelowSingleLayerMediumPlane(input: {\n readonly surfacePosition: MediumVector3;\n readonly geometricNormal: MediumVector3;\n readonly endpoint: MediumVector3;\n readonly epsilonMeters?: number;\n}): boolean {\n const [nx, ny, nz] = input.geometricNormal;\n const length = Math.hypot(nx, ny, nz);\n if (!Number.isFinite(length) || length <= 1e-8) return false;\n const signedDistance =\n ((input.endpoint[0] - input.surfacePosition[0]) * nx +\n (input.endpoint[1] - input.surfacePosition[1]) * ny +\n (input.endpoint[2] - input.surfacePosition[2]) * nz) /\n length;\n return Number.isFinite(signedDistance) && signedDistance <= (input.epsilonMeters ?? 0.001);\n}\n\nfunction vector3(input: MediumVector3 | undefined): MediumVector3 {\n return [nonNegative(input?.[0] ?? 0), nonNegative(input?.[1] ?? 0), nonNegative(input?.[2] ?? 0)];\n}\n\nfunction finiteColor(input: Color3 | undefined): input is Color3 {\n return input !== undefined && input.length === 3 && input.every(Number.isFinite);\n}\n\nfunction finiteUv(input: Uv2): boolean {\n return input.length === 2 && input.every(Number.isFinite);\n}\n\nfunction safeDistance(value: number, maxDistance: number): number {\n return Math.min(Math.max(finiteOr(value, 0), 0), maxDistance);\n}\n\n/**\n * Evaluate the stable analytic portion of the Engine's single-layer model.\n * Zero extinction uses the continuous limit and every returned component is\n * finite, even when an authored value is NaN or infinite.\n */\nexport function integrateSingleLayerMedium(input: {\n readonly coefficients: SingleLayerMediumCoefficients;\n readonly distanceMeters: number;\n readonly cosTheta: number;\n readonly phaseCosTheta?: number;\n /** Finite authored propagation bound; defaults to the conservative 1000 m bound. */\n readonly maxDistanceMeters?: number;\n}): SingleLayerMediumOptics {\n const absorption = vector3(input.coefficients.absorption);\n const scattering = vector3(input.coefficients.scattering);\n const sigmaT: MediumVector3 = [\n absorption[0] + scattering[0],\n absorption[1] + scattering[1],\n absorption[2] + scattering[2],\n ];\n const maxDistanceMeters = Math.min(\n Math.max(\n finiteOr(input.maxDistanceMeters ?? DEFAULT_MAX_DISTANCE_METERS, DEFAULT_MAX_DISTANCE_METERS),\n 0,\n ),\n 100000,\n );\n const distanceMeters = safeDistance(input.distanceMeters, maxDistanceMeters);\n const transmittance: MediumVector3 = [\n Number.isFinite(sigmaT[0]) && sigmaT[0] > 0 ? Math.exp(-sigmaT[0] * distanceMeters) : 1,\n Number.isFinite(sigmaT[1]) && sigmaT[1] > 0 ? Math.exp(-sigmaT[1] * distanceMeters) : 1,\n Number.isFinite(sigmaT[2]) && sigmaT[2] > 0 ? Math.exp(-sigmaT[2] * distanceMeters) : 1,\n ];\n const singleScatter: MediumVector3 = [\n singleScatterIntegral(scattering[0], sigmaT[0], distanceMeters),\n singleScatterIntegral(scattering[1], sigmaT[1], distanceMeters),\n singleScatterIntegral(scattering[2], sigmaT[2], distanceMeters),\n ];\n const iorCandidate = finiteOr(input.coefficients.ior, DEFAULT_IOR);\n const ior = iorCandidate >= 1 ? iorCandidate : DEFAULT_IOR;\n const reflectance = fresnelReflectance(input.cosTheta, 1 / ior);\n const transmissionWeight = 1 - reflectance;\n const phaseG = Math.min(Math.max(finiteOr(input.coefficients.phaseG ?? 0, 0), -1), 1);\n const phaseCosTheta = clamp01(input.phaseCosTheta ?? input.cosTheta);\n const phaseDenominator = Math.max(1 + phaseG * phaseG - 2 * phaseG * phaseCosTheta, 1e-6);\n const phase = (1 - phaseG * phaseG) / (4 * Math.PI * phaseDenominator ** 1.5);\n return {\n sigmaT,\n transmittance,\n singleScatter,\n reflectance,\n transmissionWeight,\n phase: finiteOr(phase, 1 / (4 * Math.PI)),\n distanceMeters,\n };\n}\n\n/** Compose linear HDR terms after exactly one Fresnel allocation. */\nexport function composeSingleLayerMediumColor(input: {\n readonly optics: SingleLayerMediumOptics;\n readonly background: Color3;\n readonly reflection: Color3;\n readonly foamColor?: Color3;\n readonly coverage?: number;\n readonly foam?: number;\n}): Color3 {\n const coverage = clamp01(input.coverage ?? 1);\n const foam = clamp01(input.foam ?? 0) * coverage;\n const foamColor = finiteColor(input.foamColor) ? input.foamColor : [1, 1, 1];\n const background = finiteColor(input.background) ? input.background : [0, 0, 0];\n const reflection = finiteColor(input.reflection) ? input.reflection : [0, 0, 0];\n const medium: MediumVector3 = [\n background[0] * input.optics.transmittance[0] + input.optics.singleScatter[0],\n background[1] * input.optics.transmittance[1] + input.optics.singleScatter[1],\n background[2] * input.optics.transmittance[2] + input.optics.singleScatter[2],\n ];\n const waterWeight = input.optics.transmissionWeight * coverage * (1 - foam);\n const reflectionWeight = input.optics.reflectance * coverage;\n const foamWeight = foam;\n return [\n finiteOr(\n reflection[0] * reflectionWeight + medium[0] * waterWeight + foamColor[0] * foamWeight,\n 0,\n ),\n finiteOr(\n reflection[1] * reflectionWeight + medium[1] * waterWeight + foamColor[1] * foamWeight,\n 0,\n ),\n finiteOr(\n reflection[2] * reflectionWeight + medium[2] * waterWeight + foamColor[2] * foamWeight,\n 0,\n ),\n ];\n}\n\nfunction validCandidate(\n candidate: SingleLayerMediumBackgroundCandidate | undefined,\n maxDistance: number,\n): candidate is SingleLayerMediumBackgroundCandidate {\n return (\n candidate !== undefined &&\n finiteColor(candidate.color) &&\n finiteUv(candidate.uv) &&\n Number.isFinite(candidate.depthMeters) &&\n candidate.depthMeters >= 0 &&\n candidate.depthMeters <= maxDistance\n );\n}\n\n/**\n * Resolve paired color/depth input with front, shore, edge, and sky-miss\n * reasons. Environment is a reflection/background fallback only; it is never\n * used as a riverbed transmission sample when a valid original pair exists.\n */\nexport function resolveSingleLayerMediumBackground(\n input: SingleLayerMediumBackgroundInput,\n): SingleLayerMediumBackgroundResolution {\n const maxDistance = Math.max(finiteOr(input.maxDistanceMeters, DEFAULT_MAX_DISTANCE_METERS), 0);\n const tolerance = Math.max(\n finiteOr(\n input.depthToleranceMeters ?? DEFAULT_DEPTH_TOLERANCE_METERS,\n DEFAULT_DEPTH_TOLERANCE_METERS,\n ),\n 0,\n );\n const surfaceDepth = finiteOr(input.surfaceDepthMeters, 0);\n if (\n validCandidate(input.refracted, maxDistance) &&\n input.refracted.uv.every((coordinate) => coordinate >= 0 && coordinate <= 1)\n ) {\n if (input.refracted.depthMeters + tolerance < surfaceDepth) {\n return {\n source: 'unrefracted',\n reason: 'front',\n candidate: validCandidate(input.original, maxDistance) ? input.original : undefined,\n color: validCandidate(input.original, maxDistance) ? input.original.color : [0, 0, 0],\n distanceMeters: validCandidate(input.original, maxDistance)\n ? Math.max(input.original.depthMeters - surfaceDepth, 0)\n : 0,\n };\n }\n return {\n source: 'refracted',\n candidate: input.refracted,\n color: input.refracted.color,\n distanceMeters: Math.max(input.refracted.depthMeters - surfaceDepth, 0),\n };\n }\n if (validCandidate(input.original, maxDistance)) {\n const reason: SingleLayerMediumBackgroundReason =\n input.refracted === undefined\n ? 'shore'\n : finiteUv(input.refracted.uv) &&\n input.refracted.uv.some((coordinate) => coordinate < 0 || coordinate > 1)\n ? 'edge'\n : 'shore';\n return {\n source: 'unrefracted',\n reason,\n candidate: input.original,\n color: input.original.color,\n distanceMeters: Math.max(input.original.depthMeters - surfaceDepth, 0),\n };\n }\n if (finiteColor(input.environment)) {\n return {\n source: 'environment',\n reason: 'sky-miss',\n candidate: undefined,\n color: input.environment,\n distanceMeters: maxDistance,\n };\n }\n return {\n source: 'environment',\n reason: 'sky-miss',\n candidate: undefined,\n color: [0, 0, 0],\n distanceMeters: maxDistance,\n };\n}\n\n/** Screen-space approximation of the Euclidean endpoint path, clamped to the declared maximum. */\nexport function estimateSingleLayerPathLength(input: {\n readonly surfacePosition: readonly [number, number, number];\n readonly backgroundPosition: readonly [number, number, number] | undefined;\n readonly maxDistanceMeters: number;\n}): { readonly distanceMeters: number; readonly valid: boolean } {\n const maxDistance = Math.max(finiteOr(input.maxDistanceMeters, DEFAULT_MAX_DISTANCE_METERS), 0);\n if (\n input.surfacePosition.length !== 3 ||\n input.backgroundPosition === undefined ||\n input.backgroundPosition.length !== 3 ||\n !input.surfacePosition.every(Number.isFinite) ||\n !input.backgroundPosition.every(Number.isFinite)\n ) {\n return { distanceMeters: maxDistance, valid: false };\n }\n const distance = Math.hypot(\n (input.backgroundPosition[0] ?? 0) - (input.surfacePosition[0] ?? 0),\n (input.backgroundPosition[1] ?? 0) - (input.surfacePosition[1] ?? 0),\n (input.backgroundPosition[2] ?? 0) - (input.surfacePosition[2] ?? 0),\n );\n return {\n distanceMeters: Math.min(Math.max(finiteOr(distance, maxDistance), 0), maxDistance),\n valid: Number.isFinite(distance),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/assets/asset-decoders.ts","../src/examples/single-layer-medium-surface.ts","../src/plugin.ts","../src/publication/video.ts","../src/publication/publisher.ts","../src/scene/visibility/gpu-frame-timing.ts","../src/ssr/composition.ts","../src/transmission/oracle.ts","../src/transmission/single-layer-medium.ts"],"names":["err","source","row","ok","feature","record","invalid","clamp01","finiteColor"],"mappings":"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","file":"index.mjs","sourcesContent":["import { validateCookedMaterialRecord } from '@forgeax/engine-pack';\nimport {\n type AssetDecoderContribution,\n type AssetKind,\n type AssetLoadError,\n err,\n MATERIAL_TEXTURE_SLOTS,\n type MaterialAsset,\n type MaterialChildAsset,\n type MaterialRootAsset,\n ok,\n type RenderPipelineAsset,\n type SamplerAsset,\n} from '@forgeax/engine-types';\n\nfunction invalid(guid: string, expected: string, reason: string) {\n return err({\n code: 'asset-package-invalid' as const,\n expected,\n hint: 'recook the render asset and publish its complete cooked payload',\n detail: { guid, reason },\n });\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction validMaterial(value: unknown): value is MaterialAsset {\n if (!record(value) || value.kind !== 'material') return false;\n if (value.cooked !== undefined && !validateCookedMaterialRecord(value.cooked).ok) {\n return false;\n }\n if (value.passes !== undefined && !Array.isArray(value.passes)) return false;\n if (value.parameters !== undefined && !Array.isArray(value.parameters)) return false;\n if (\n value.parent !== undefined &&\n ['colorSpace', 'passes', 'parameters'].some((field) => Object.hasOwn(value, field))\n ) {\n return false;\n }\n return value.values === undefined || record(value.values);\n}\n\nfunction resolveMaterialWireRef(\n value: unknown,\n refs: readonly string[],\n field: string,\n guid: string,\n): ReturnType<typeof ok<string | number>> | ReturnType<typeof err<AssetLoadError>> {\n if (typeof value !== 'number') return ok(value as string | number);\n if (!Number.isSafeInteger(value) || value < 0 || refs[value] === undefined) {\n return err<AssetLoadError>({\n code: 'asset-package-invalid',\n expected: `${field} to reference a GUID through the material Pack refs[] table`,\n hint: 'recook the material so every texture or sampler ref has a matching refs[] entry',\n detail: { guid, reason: `${field} refs[${value}] is out of bounds` },\n });\n }\n return ok(refs[value] as string);\n}\n\nfunction resolveMaterialWireRefs(\n value: MaterialAsset,\n refs: readonly string[],\n guid: string,\n): ReturnType<typeof ok<MaterialAsset>> | ReturnType<typeof err<AssetLoadError>> {\n if (refs.length === 0) return ok(value);\n\n let changed = false;\n const wire = value as unknown as { readonly parent?: unknown };\n let parent = wire.parent;\n if (typeof parent === 'number') {\n const resolved = resolveMaterialWireRef(parent, refs, 'parent', guid);\n if (!resolved.ok) return resolved;\n parent = resolved.value;\n changed = true;\n }\n\n if (value.values === undefined) {\n if (!changed) return ok(value);\n if (parent !== undefined) {\n const child = value as MaterialChildAsset;\n return ok({ ...child, parent: parent as unknown as MaterialChildAsset['parent'] });\n }\n return ok(value);\n }\n\n const textureFields = new Set(\n value.parameters === undefined\n ? MATERIAL_TEXTURE_SLOTS\n : value.parameters\n .filter((parameter) => parameter.type === 'texture' || parameter.type === 'texture_cube')\n .map((parameter) => parameter.name),\n );\n const values = { ...value.values };\n for (const [field, raw] of Object.entries(values)) {\n if (typeof raw === 'number' && textureFields.has(field)) {\n const resolved = resolveMaterialWireRef(raw, refs, field, guid);\n if (!resolved.ok) return resolved;\n values[field] = resolved.value as NonNullable<MaterialAsset['values']>[string];\n changed = true;\n continue;\n }\n if (!record(raw)) continue;\n const rawRecord = raw as unknown as Record<string, unknown>;\n let rewritten: Record<string, unknown> | undefined;\n for (const key of ['texture', 'sampler'] as const) {\n if (!(key in rawRecord)) continue;\n const resolved = resolveMaterialWireRef(rawRecord[key], refs, `${field}.${key}`, guid);\n if (!resolved.ok) return resolved;\n if (resolved.value !== rawRecord[key]) {\n rewritten ??= { ...rawRecord };\n rewritten[key] = resolved.value;\n changed = true;\n }\n }\n if (rewritten !== undefined) {\n values[field] = rewritten as unknown as NonNullable<MaterialAsset['values']>[string];\n }\n }\n if (!changed) return ok(value);\n if (parent !== undefined) {\n const child = value as MaterialChildAsset;\n return ok({\n ...child,\n parent: parent as unknown as MaterialChildAsset['parent'],\n values,\n });\n }\n return ok({ ...value, values } as MaterialRootAsset);\n}\n\nexport const materialContribution: AssetDecoderContribution<MaterialAsset, 'material'> = {\n kind: { kind: 'material' } as AssetKind<MaterialAsset, 'material'>,\n consumer: 'Render MaterialScene',\n decoder: {\n async decode({ envelope }) {\n if (!validMaterial(envelope.payload)) {\n return invalid(\n envelope.guid,\n 'a material payload with cooked passes, parameters, and values',\n 'material owner validation failed',\n );\n }\n return resolveMaterialWireRefs(envelope.payload, envelope.refs, envelope.guid);\n },\n },\n};\n\nexport const samplerContribution: AssetDecoderContribution<SamplerAsset, 'sampler'> = {\n kind: { kind: 'sampler' } as AssetKind<SamplerAsset, 'sampler'>,\n consumer: 'Render DeviceScope',\n decoder: {\n async decode({ envelope }) {\n return envelope.payload.kind === 'sampler'\n ? ok(envelope.payload)\n : invalid(envelope.guid, 'a sampler payload', 'sampler owner validation failed');\n },\n },\n};\n\nexport const renderPipelineContribution: AssetDecoderContribution<\n RenderPipelineAsset,\n 'render-pipeline'\n> = {\n kind: { kind: 'render-pipeline' } as AssetKind<RenderPipelineAsset, 'render-pipeline'>,\n consumer: 'Render Pipeline',\n decoder: {\n async decode({ envelope }) {\n const payload = envelope.payload;\n return payload.kind === 'render-pipeline' && payload.pipelineId.trim().length > 0\n ? ok(payload)\n : invalid(\n envelope.guid,\n 'a render-pipeline payload with a pipelineId',\n 'render-pipeline owner validation failed',\n );\n },\n },\n};\n","import type { MaterialRootAsset } from '@forgeax/engine-types';\n\n/**\n * A public root asset showing the model declaration and its bounded input.\n * The page is shared by every material instance; Render supplies the page\n * bytes and each instance publishes its own range.\n */\nexport const SINGLE_LAYER_MEDIUM_SURFACE_EXAMPLE = {\n kind: 'material',\n surface: {\n model: 'single-layer-medium',\n module: 'game::water_surface_a',\n dynamicInput: {\n name: 'waterEvents',\n fields: [\n { name: 'position', type: 'vec3<f32>' },\n { name: 'time', type: 'f32' },\n { name: 'eventId', type: 'u32' },\n ],\n maxRecords: 64,\n maxDomains: 8,\n maxPageBytes: 2048,\n maxBindings: 1,\n maxEventsPerSample: 8,\n },\n },\n passes: [\n {\n name: 'color',\n program: { module: 'forgeax::single-layer-medium' },\n },\n ],\n parameters: [],\n values: {},\n} as const satisfies MaterialRootAsset;\n\n/** Two different imported Surface implementations consuming one model ABI. */\nexport const SINGLE_LAYER_MEDIUM_SURFACE_EXAMPLES = [\n {\n module: 'game::water_surface_a',\n source: `#define_import_path game::water_surface_a\n#import forgeax_material::single_layer_medium_surface_v1::{SingleLayerMediumSurfaceInput, SingleLayerMediumSurfaceData}\nfn evaluate_surface(input : SingleLayerMediumSurfaceInput) -> SingleLayerMediumSurfaceData {\n let event = read_waterEvents(input.eventRangeStart);\n let normal = normalize(input.geometricNormalWS + vec3<f32>(0.0, 0.0, event.time * 0.02));\n return SingleLayerMediumSurfaceData(normal, 0.18, 1.0, 0.0, vec3<f32>(0.18, 0.06, 0.02), vec3<f32>(0.02, 0.04, 0.08), 1.333, 0.2, 1000.0);\n}`,\n },\n {\n module: 'game::water_surface_b',\n source: `#define_import_path game::water_surface_b\n#import forgeax_material::single_layer_medium_surface_v1::{SingleLayerMediumSurfaceInput, SingleLayerMediumSurfaceData}\nfn evaluate_surface(input : SingleLayerMediumSurfaceInput) -> SingleLayerMediumSurfaceData {\n let event = read_waterEvents(input.eventRangeStart);\n let normal = normalize(input.geometricNormalWS + vec3<f32>(event.position.xy * 0.01, 0.0));\n return SingleLayerMediumSurfaceData(normal, 0.32, 1.0, clamp(event.time * 0.1, 0.0, 1.0), vec3<f32>(0.04, 0.02, 0.01), vec3<f32>(0.08, 0.05, 0.02), 1.333, -0.1, 800.0);\n}`,\n },\n] as const;\n","import type { Component, World } from '@forgeax/engine-ecs';\nimport type { Plugin } from '@forgeax/engine-plugin';\nimport { Atmosphere } from './components/atmosphere';\nimport { BarrelDistortion } from './components/barrel-distortion';\nimport { Camera } from './components/camera';\nimport { CloudLayer } from './components/cloud-layer';\nimport { DepthOfField } from './components/depth-of-field';\nimport { DirectionalLight } from './components/directional-light';\nimport { DynamicResolution } from './components/dynamic-resolution';\nimport { Instances } from './components/instances';\nimport { Layer } from './components/layer';\nimport { LightProbe } from './components/light-probe';\nimport { Lines } from './components/lines';\nimport { MeshFilter } from './components/mesh-filter';\nimport { MeshRenderer } from './components/mesh-renderer';\nimport { MotionBlur } from './components/motion-blur';\nimport { PointLight } from './components/point-light';\nimport { PointLightShadow } from './components/point-light-shadow';\nimport { Points } from './components/points';\nimport { PostProcessParams } from './components/post-process-params';\nimport { RectAreaLight } from './components/rect-area-light';\nimport { SceneInstance } from './components/scene-instance';\nimport { SkyboxBackground } from './components/skybox-background';\nimport { Skylight } from './components/skylight';\nimport { SortKey } from './components/sort-key';\nimport { SpotLight } from './components/spot-light';\nimport { SpriteAnimation } from './components/sprite-animation';\nimport { SpriteInstances } from './components/sprite-instances';\nimport { SpriteRegionOverride } from './components/sprite-region-override';\nimport { TileLayer } from './components/tile-layer';\nimport { Tilemap } from './components/tilemap';\nimport { Visibility } from './components/visibility';\n\nconst RENDER_COMPONENTS: readonly Component[] = [\n Atmosphere,\n BarrelDistortion,\n Camera,\n CloudLayer,\n DirectionalLight,\n DynamicResolution,\n DepthOfField,\n Instances,\n Layer,\n LightProbe,\n MeshFilter,\n MeshRenderer,\n MotionBlur,\n PointLight,\n PointLightShadow,\n Points,\n Lines,\n PostProcessParams,\n RectAreaLight,\n SceneInstance,\n SkyboxBackground,\n Skylight,\n SortKey,\n SpotLight,\n SpriteAnimation,\n SpriteInstances,\n SpriteRegionOverride,\n TileLayer,\n Tilemap,\n Visibility,\n];\n\nfunction registerRenderComponents(world: World): () => void {\n const leases = RENDER_COMPONENTS.map((component) =>\n world.components.register(component).unwrap(),\n );\n return () => {\n for (let index = leases.length - 1; index >= 0; index -= 1) leases[index]?.dispose();\n };\n}\n\n/** Install the built-in render ECS vocabulary in one World. */\nexport function renderComponentsPlugin(): Plugin {\n return {\n name: 'render-components',\n inject: ['world'],\n apply(ctx) {\n ctx.effect(() => registerRenderComponents(ctx.world), 'render/components');\n },\n };\n}\n","import type { EntityHandle, World } from '@forgeax/engine-ecs';\nimport {\n VIDEO_SOURCE_PROVIDER_KEY,\n type VideoSourceProvider,\n videoSourceExtent,\n} from '@forgeax/engine-graphics-extras';\nimport type { Handle } from '@forgeax/engine-types';\nimport type { RenderPublication } from './contract';\n\n/** Native VideoFrame cloning shares decoded pixels; it never copies source ECS storage. */\nexport function publicationVideoFrames(\n world: World,\n consumers: ReadonlyMap<number, readonly number[]>,\n): RenderPublication['videoFrames'] {\n if (consumers.size === 0 || !world.hasResource(VIDEO_SOURCE_PROVIDER_KEY)) return [];\n const provider = world.getResource<VideoSourceProvider>(VIDEO_SOURCE_PROVIDER_KEY);\n const frames: RenderPublication['videoFrames'][number][] = [];\n try {\n for (const [entity, clips] of consumers)\n for (const clip of clips) {\n const source = provider.getSource(\n entity as EntityHandle,\n clip as Handle<'VideoAsset', 'shared'>,\n );\n if (source === undefined || videoSourceExtent(source) === undefined) continue;\n frames.push({ entity, clip, frame: new VideoFrame(source) });\n }\n return frames;\n } catch (cause) {\n for (const row of frames) row.frame.close();\n throw cause;\n }\n}\n","import {\n type AssetRegistry,\n RuntimeMaterialValue,\n RuntimeMeshVertices,\n resolveAssetHandle,\n} from '@forgeax/engine-assets-runtime';\nimport { type EntityHandle, Time, type World } from '@forgeax/engine-ecs';\nimport { AssetGuid } from '@forgeax/engine-pack/guid';\nimport type { RhiCaps } from '@forgeax/engine-rhi';\nimport { ChildOf, Children, GlobalTransform } from '@forgeax/engine-scene';\nimport { type Asset, err, type Handle, ok, type Result } from '@forgeax/engine-types';\nimport { Visibility } from '../components';\nimport { renderMaterialContext } from '../extract/material-context';\nimport type { RenderFeature } from '../features/types';\nimport {\n extractFrames,\n internSharedRefFromGuid,\n type MaterialSnapshot,\n type MaterialSnapshotCachesByWorld,\n type RenderableSnapshot,\n resolveMaterialSnapshot,\n} from '../render-system-extract';\nimport {\n createGlobalTransformChangeQuery,\n createRenderSourceState,\n isRenderableMember,\n RENDERABLE_SOURCE_COMPONENTS,\n} from '../scene/render-source';\nimport { registerRenderSourceSystems } from '../scene/source-systems';\nimport { getTransparentSortConfig } from '../systems/transparent-sort-config';\nimport { renderTargetMaterialSourceIdentity } from '../targets/material-source';\nimport {\n type RenderPublication,\n RenderPublicationError,\n type RenderPublicationIdentity,\n type RenderPublicationTemplate,\n} from './contract';\nimport { publicationDependencies, publicationFrameDependencies } from './dependencies';\nimport { publicationTargetSources, type RenderPublicationTargetOwner } from './targets';\nimport { publicationVideoFrames } from './video';\n\nexport interface RenderPublicationCandidate {\n readonly packet: RenderPublication;\n /** Call synchronously after successful postMessage; never wait for remote ACK. */\n accept(): void;\n discard(): void;\n}\n\n/** Source indices and asset dependencies only; the receiver owns the RenderScene. */\nexport function createRenderPublisher(\n world: World,\n assets: AssetRegistry,\n identity: RenderPublicationIdentity,\n capabilities?: RhiCaps,\n features: readonly RenderFeature<unknown>[] = [],\n targetOwner?: RenderPublicationTargetOwner,\n) {\n const pendingMeshContent = new Set<Handle<string, 'shared'>>();\n const releaseTransforms = registerRenderSourceSystems(world, assets, {\n updateMesh: (handle) => pendingMeshContent.add(handle),\n });\n const source = createRenderSourceState(world);\n const transforms = createGlobalTransformChangeQuery(world);\n const caches: MaterialSnapshotCachesByWorld = new WeakMap();\n const members = new Set<number>();\n const publishedPrograms = new Set<string>();\n const dependencies = new Map<number, readonly Handle<string, 'shared'>[]>();\n const consumers = new Map<Handle<string, 'shared'>, Set<number>>();\n const pending = new Set<number>();\n let videoConsumers = new Map<number, readonly number[]>();\n let pendingFeatures: RenderPublication['features'] = [];\n let pendingFeatureOwners: readonly RenderFeature<unknown>[] = [];\n const acknowledgedFeatures = new Set<string>();\n const jointsByEntity = new Map<number, readonly number[]>();\n const skinConsumers = new Map<number, Set<number>>();\n let frameDependencies = new Set<Handle<string, 'shared'>>();\n let catalogEpoch = -1,\n revision = 0,\n disposed = false,\n active = false;\n let lastScannedRows = 0,\n inFlight = false,\n allocations = 0;\n let storage = [new ArrayBuffer(0), new ArrayBuffer(0), new ArrayBuffer(0), new ArrayBuffer(0)];\n const buffer = (index: number, bytes: number): ArrayBuffer => {\n let value = storage[index] as ArrayBuffer;\n if (value.byteLength < bytes) {\n let capacity = Math.max(16, value.byteLength);\n while (capacity < bytes) capacity *= 2;\n value = new ArrayBuffer(capacity);\n storage[index] = value;\n allocations++;\n }\n return value;\n };\n\n const fail = (reason: RenderPublicationError['detail']['reason'], subject: string) =>\n err(new RenderPublicationError({ reason, subject }));\n\n return {\n identity,\n inspect: () => ({\n revision,\n members: members.size,\n assetCount: consumers.size,\n scannedRows: lastScannedRows,\n inFlight,\n allocations,\n }),\n prepare(\n sampleTimeSeconds: number,\n temporalReset = false,\n ): Result<RenderPublicationCandidate, RenderPublicationError> {\n if (disposed) return fail('disposed', 'publisher');\n if (active || inFlight) return fail('in-flight', 'publication storage has not been returned');\n const baseline = revision === 0;\n const featureSources = [...features];\n const batch = source.projection.read();\n lastScannedRows = batch.scannedRows;\n const changed = new Set(pending),\n removed = new Set<number>();\n const invalidated = new Set<Handle<string, 'shared'>>(pendingMeshContent);\n const runtimeChanged =\n batch.membershipChanged ||\n batch.changedComponents.includes(RuntimeMaterialValue) ||\n batch.changedComponents.includes(RuntimeMeshVertices);\n for (const index of batch.indices) {\n const previous = source.entities.get(index),\n current = source.projection.entity(index);\n if (\n previous !== undefined &&\n members.has(previous) &&\n (current !== previous || !isRenderableMember(world, previous))\n )\n removed.add(previous);\n if (runtimeChanged) {\n for (const handle of source.contentHandles.get(index) ?? [])\n invalidated.add(handle as Handle<string, 'shared'>);\n if (current !== undefined) {\n if (world.hasComponent(current, RuntimeMaterialValue))\n invalidated.add(world.get(current, RuntimeMaterialValue).unwrap().asset);\n if (world.hasComponent(current, RuntimeMeshVertices))\n invalidated.add(world.get(current, RuntimeMeshVertices).unwrap().asset);\n }\n }\n if (previous !== undefined)\n for (const consumer of skinConsumers.get(previous) ?? []) changed.add(consumer);\n if (current === undefined) continue;\n if (\n isRenderableMember(world, current) &&\n (baseline ||\n !members.has(current) ||\n RENDERABLE_SOURCE_COMPONENTS.some((component) =>\n source.projection.changed(current, component),\n ))\n )\n changed.add(current);\n if (\n batch.membershipChanged ||\n source.projection.changed(current, ChildOf) ||\n source.projection.changed(current, Visibility)\n ) {\n const queue = [current],\n visited = new Set<number>();\n while (queue.length) {\n const entity = queue.pop() as EntityHandle;\n if (visited.has(entity)) continue;\n visited.add(entity);\n if (isRenderableMember(world, entity)) changed.add(entity);\n if (world.hasComponent(entity, Children))\n queue.push(\n ...Array.from(\n world.get(entity, Children).unwrap().entities,\n (child) => child as EntityHandle,\n ),\n );\n }\n }\n }\n if (baseline || catalogEpoch !== assets.catalogEpoch) {\n for (const entity of members) changed.add(entity);\n for (const entity of source.entities.values())\n if (isRenderableMember(world, entity)) changed.add(entity);\n }\n for (const handle of invalidated)\n for (const entity of consumers.get(handle) ?? []) changed.add(entity);\n const matrixRows = new Map<number, Float32Array>();\n for (const span of transforms.spans().unwrap()) {\n const values = span.get(GlobalTransform).world;\n for (let row = 0; row < span.entities.length; row++) {\n const entity = span.entities[row] as EntityHandle;\n for (const consumer of skinConsumers.get(entity) ?? []) changed.add(consumer);\n if (members.has(entity) && !removed.has(entity)) {\n matrixRows.set(entity, values.subarray(row * 16, row * 16 + 16));\n pending.add(entity);\n }\n }\n }\n for (const entity of changed) pending.add(entity);\n let videoFrames: RenderPublication['videoFrames'] = [];\n try {\n const frame = extractFrames(\n [world],\n { cameraOwner: 0, resourceOwner: 0 },\n assets,\n undefined,\n caches,\n {\n ...(capabilities === undefined ? {} : renderMaterialContext(capabilities)),\n cull: 'none',\n retainHidden: true,\n renderables: changed.size ? { kind: 'partial', entitiesByWorld: [changed] } : 'none',\n },\n );\n const templates: RenderPublicationTemplate[] = [],\n templateIds = new Map<string, number>();\n const upserts: number[] = [];\n const programs = new Map<string, RenderPublication['programs'][number]>();\n const nextDependencies = new Map<number, readonly Handle<string, 'shared'>[]>();\n const assetRows = new Map<Handle<string, 'shared'>, Asset>();\n const byRenderable = new Map<number, RenderPublicationTemplate['dispatch'][number][]>();\n for (const { entityIndex: _entity, renderableIndex, ...dispatch } of frame.dispatch) {\n const rows = byRenderable.get(renderableIndex) ?? [];\n rows.push(dispatch);\n byRenderable.set(renderableIndex, rows);\n }\n const publishPrograms = (materials: readonly MaterialSnapshot[]) => {\n for (const material of materials) {\n const keys = new Set([\n ...Object.values(material.materialProgramKeys ?? {}),\n ...Object.values(material.materialSceneIndexProgramKeys ?? {}).map(\n (program) => program.specializationKey,\n ),\n ...(material.materialShaderId === undefined ||\n material.materialShaderId.startsWith('forgeax::')\n ? []\n : [material.materialShaderId]),\n ]);\n for (const key of keys) {\n if (publishedPrograms.has(key) || programs.has(key)) continue;\n const shader = assets.shaderRegistry.findMaterialArtifact(key);\n if (!shader.ok) throw shader.error;\n const artifact = assets.getMaterialArtifact(key);\n programs.set(key, {\n key,\n shader: {\n source: shader.value.source,\n paramSchema: shader.value.paramSchema,\n ...(shader.value.receipt === undefined ? {} : { receipt: shader.value.receipt }),\n },\n ...(artifact === undefined ? {} : { artifact }),\n });\n }\n }\n };\n for (let i = 0; i < frame.renderables.length; i++) {\n const row = frame.renderables[i] as RenderableSnapshot;\n if (row.skin) return fail('unsupported', 'source GPU skin receipt');\n const { worldId: _world, entityKey, transform, ...snapshot } = row;\n const template = { snapshot, dispatch: byRenderable.get(i) ?? [] };\n const key = JSON.stringify(template, (_key, value: unknown) =>\n value instanceof Map\n ? _key === 'textureSources'\n ? [...value].map(([name, source]) => [\n name,\n renderTargetMaterialSourceIdentity(source),\n ])\n : [...value]\n : ArrayBuffer.isView(value)\n ? Array.from(value as unknown as ArrayLike<number>)\n : value,\n );\n let templateId = templateIds.get(key);\n if (templateId === undefined) {\n templateId = templates.length;\n templateIds.set(key, templateId);\n templates.push(template);\n }\n upserts.push(entityKey, templateId);\n matrixRows.set(entityKey, transform.world);\n publishPrograms(row.materials);\n const handles = publicationDependencies(row);\n for (const lod of row.lods ?? []) {\n const handle = internSharedRefFromGuid(\n world,\n assets,\n AssetGuid.format(lod.mesh),\n 'MeshAsset',\n );\n if (handle !== undefined) handles.push(handle);\n }\n nextDependencies.set(entityKey, handles);\n for (const handle of handles) {\n if (\n !baseline &&\n (consumers.has(handle) || frameDependencies.has(handle)) &&\n !invalidated.has(handle) &&\n catalogEpoch === assets.catalogEpoch\n )\n continue;\n const value = resolveAssetHandle(world, handle);\n if (!value.ok) throw value.error;\n assetRows.set(handle, value.value);\n }\n }\n const featureRows = featureSources.map((feature) => {\n const data = feature\n .extract({\n worlds: [world],\n owner: 0,\n frameNumber: revision + 1,\n ...(capabilities === undefined ? {} : { caps: capabilities }),\n ...(frame.cameras[0] === undefined ? {} : { selectedCamera: frame.cameras[0] }),\n visibilitySnapshots: frame.featureVisibilitySnapshots,\n ...(frame.cloudLayer === undefined\n ? {}\n : { frame: { cloudLayer: frame.cloudLayer } }),\n })\n .unwrap();\n return { identity: feature.identity, data };\n });\n const nextFrameDependencies = new Set(publicationFrameDependencies(frame));\n const pendingGuids = featureSources.flatMap((feature) => {\n const row = featureRows.find((row) => row.identity === feature.identity);\n return row === undefined ? [] : [...(feature.assetDependencies?.(row.data) ?? [])];\n });\n const seenGuids = new Set<string>();\n for (const guid of pendingGuids) {\n const key = guid.toLowerCase();\n if (seenGuids.has(key)) continue;\n seenGuids.add(key);\n const asset = assets.lookup(key);\n const handle = internSharedRefFromGuid(world, assets, key, 'RenderFeatureAsset');\n if (asset === undefined || handle === undefined)\n throw new Error(`Missing feature asset ${guid}`);\n nextFrameDependencies.add(handle);\n for (const ref of assets.assetCatalog.get(key)?.refs ?? []) pendingGuids.push(ref.guid);\n if (asset.kind === 'material') {\n const material = resolveMaterialSnapshot(\n handle,\n world,\n assets,\n undefined,\n undefined,\n capabilities === undefined\n ? undefined\n : renderMaterialContext(capabilities).materialContext,\n );\n publishPrograms([material]);\n for (const dependency of publicationDependencies({\n assetHandle: handle,\n materials: [material],\n }))\n nextFrameDependencies.add(dependency);\n }\n }\n for (const handle of nextFrameDependencies) {\n if (\n !baseline &&\n (consumers.has(handle) || frameDependencies.has(handle)) &&\n !invalidated.has(handle) &&\n catalogEpoch === assets.catalogEpoch\n )\n continue;\n const value = resolveAssetHandle(world, handle);\n if (!value.ok) throw value.error;\n assetRows.set(handle, value.value);\n }\n const emitted = new Set(frame.renderables.map((row) => row.entityKey));\n for (const entity of changed)\n if (members.has(entity) && !emitted.has(entity)) removed.add(entity);\n for (const entity of removed) matrixRows.delete(entity);\n const nextVideoConsumers = new Map(videoConsumers);\n for (const entity of removed) nextVideoConsumers.delete(entity);\n for (const row of frame.renderables) {\n const clips = [\n ...new Set(\n row.materials.flatMap((material) => [\n ...(material.videoTextureFields?.values() ?? []),\n ]),\n ),\n ];\n if (clips.length > 0) nextVideoConsumers.set(row.entityKey, clips);\n else nextVideoConsumers.delete(row.entityKey);\n }\n videoFrames = publicationVideoFrames(world, nextVideoConsumers);\n\n const transformEntities = new Uint32Array(\n buffer(2, matrixRows.size * 4),\n 0,\n matrixRows.size,\n ),\n matrices = new Float32Array(buffer(3, matrixRows.size * 64), 0, matrixRows.size * 16);\n let index = 0;\n for (const [entity, matrix] of matrixRows) {\n transformEntities[index] = entity;\n matrices.set(matrix, index * 16);\n index++;\n }\n const {\n renderables: _rows,\n dispatch: _dispatch,\n visibilitySnapshots: _visibility,\n featureVisibilitySnapshots: _features,\n hiddenEntityReports: _hidden,\n shadowCasterEntityKeys: _casters,\n shadowCasterDrawKeys: _draws,\n shadowCasterMembership: _membership,\n ...metadata\n } = frame;\n const retired = new Set<Handle<string, 'shared'>>();\n const removedConsumers = new Set([...removed, ...nextDependencies.keys()]);\n const nextHandles = new Set([...nextDependencies.values()].flat());\n const removedCounts = new Map<Handle<string, 'shared'>, number>();\n for (const entity of removedConsumers)\n for (const handle of dependencies.get(entity) ?? [])\n removedCounts.set(handle, (removedCounts.get(handle) ?? 0) + 1);\n for (const [handle, count] of removedCounts)\n if (\n count === consumers.get(handle)?.size &&\n !nextHandles.has(handle) &&\n !nextFrameDependencies.has(handle)\n )\n retired.add(handle);\n for (const handle of frameDependencies) {\n if (\n !nextFrameDependencies.has(handle) &&\n !nextHandles.has(handle) &&\n (consumers.get(handle)?.size ?? 0) === (removedCounts.get(handle) ?? 0)\n )\n retired.add(handle);\n }\n const upsertColumn = new Uint32Array(buffer(0, upserts.length * 4), 0, upserts.length);\n upsertColumn.set(upserts);\n const removedColumn = new Uint32Array(buffer(1, removed.size * 4), 0, removed.size);\n removedColumn.set([...removed]);\n const packet: RenderPublication = {\n ...identity,\n revision: revision + 1,\n base: revision,\n baseline,\n time: { ...world.getResource(Time) },\n sampleTimeSeconds,\n temporalReset,\n transparentSort: getTransparentSortConfig(world),\n metadata,\n templates,\n videoFrames,\n targets: targetOwner?.snapshot() ?? [],\n targetSources: publicationTargetSources(templates),\n features: featureRows,\n programs: [...programs.values()],\n upserts: upsertColumn,\n removed: removedColumn,\n transformEntities,\n transforms: matrices,\n assets: [...assetRows].map(([handle, value]) => {\n const guid = assets.guidOf(value);\n return { handle, value, ...(guid === undefined ? {} : { guid }) };\n }),\n retiredAssets: [...retired],\n invalidatedAssets: [...invalidated],\n };\n batch.validate();\n active = true;\n let closed = false;\n return ok({\n packet,\n accept: () => {\n if (closed)\n throw new RenderPublicationError({ reason: 'revision', subject: 'closed candidate' });\n batch.accept();\n for (const handle of invalidated) pendingMeshContent.delete(handle);\n for (const key of programs.keys()) publishedPrograms.add(key);\n closed = true;\n active = false;\n inFlight = true;\n revision++;\n for (const row of videoFrames) row.frame.close();\n videoConsumers = nextVideoConsumers;\n pendingFeatures = featureRows;\n pendingFeatureOwners = featureSources;\n acknowledgedFeatures.clear();\n frameDependencies = nextFrameDependencies;\n catalogEpoch = assets.catalogEpoch;\n for (const entity of removedConsumers) {\n for (const handle of dependencies.get(entity) ?? []) {\n consumers.get(handle)?.delete(entity);\n if (consumers.get(handle)?.size === 0) consumers.delete(handle);\n }\n dependencies.delete(entity);\n }\n for (const entity of removedConsumers) {\n for (const joint of jointsByEntity.get(entity) ?? []) {\n const users = skinConsumers.get(joint);\n users?.delete(entity);\n if (users?.size === 0) skinConsumers.delete(joint);\n }\n jointsByEntity.delete(entity);\n }\n for (const row of frame.renderables) {\n if (row.skinJointEntities === undefined) continue;\n jointsByEntity.set(row.entityKey, row.skinJointEntities);\n for (const joint of row.skinJointEntities) {\n let users = skinConsumers.get(joint);\n if (users === undefined) {\n users = new Set();\n skinConsumers.set(joint, users);\n }\n users.add(row.entityKey);\n }\n }\n for (const entity of removed) members.delete(entity);\n for (const [entity, handles] of nextDependencies) {\n members.add(entity);\n dependencies.set(entity, handles);\n for (const handle of handles) {\n let users = consumers.get(handle);\n if (!users) {\n users = new Set();\n consumers.set(handle, users);\n }\n users.add(entity);\n }\n }\n for (const entity of matrixRows.keys()) pending.delete(entity);\n for (const entity of removed) pending.delete(entity);\n for (const sourceIndex of batch.indices) {\n const entity = source.projection.entity(sourceIndex);\n if (entity === undefined) {\n source.entities.delete(sourceIndex);\n source.contentHandles.delete(sourceIndex);\n } else {\n source.entities.set(sourceIndex, entity);\n const handles: number[] = [];\n if (world.hasComponent(entity, RuntimeMaterialValue))\n handles.push(world.get(entity, RuntimeMaterialValue).unwrap().asset);\n if (world.hasComponent(entity, RuntimeMeshVertices))\n handles.push(world.get(entity, RuntimeMeshVertices).unwrap().asset);\n if (handles.length) source.contentHandles.set(sourceIndex, handles);\n else source.contentHandles.delete(sourceIndex);\n }\n }\n },\n discard: () => {\n if (!closed) {\n closed = true;\n active = false;\n for (const row of videoFrames) row.frame.close();\n }\n },\n });\n } catch (cause) {\n for (const row of videoFrames) row.frame.close();\n return fail('unsupported', cause instanceof Error ? cause.message : String(cause));\n }\n },\n acknowledgeFeatures(\n acceptedRevision: number,\n receipts: readonly { readonly identity: string; readonly feedback: unknown }[],\n ): Result<void, RenderPublicationError> {\n if (disposed) return fail('disposed', 'publisher');\n if (!inFlight || revision !== acceptedRevision)\n return fail('revision', 'feature acknowledgment');\n const identities = new Set<string>();\n for (const receipt of receipts) {\n if (identities.has(receipt.identity) || acknowledgedFeatures.has(receipt.identity))\n return fail('revision', 'duplicate feature acknowledgment');\n const row = pendingFeatures.find((row) => row.identity === receipt.identity);\n const feature = pendingFeatureOwners.find(\n (feature) => feature.identity === receipt.identity,\n );\n if (row === undefined || feature === undefined)\n return fail('shape', 'unknown feature acknowledgment');\n identities.add(receipt.identity);\n }\n for (const receipt of receipts) {\n acknowledgedFeatures.add(receipt.identity);\n const row = pendingFeatures.find((row) => row.identity === receipt.identity);\n const feature = pendingFeatureOwners.find(\n (feature) => feature.identity === receipt.identity,\n );\n feature?.onSourceFrameSubmitted?.(row?.data, receipt.feedback);\n }\n return ok(undefined);\n },\n recycle(\n acceptedRevision: number,\n buffers: readonly ArrayBuffer[],\n ): Result<void, RenderPublicationError> {\n if (disposed) return fail('disposed', 'publisher');\n if (!inFlight || acceptedRevision !== revision)\n return fail('revision', 'returned storage revision');\n if (buffers.length !== 4 || buffers.some((value) => !(value instanceof ArrayBuffer)))\n return fail('shape', 'returned storage');\n storage = [...buffers];\n inFlight = false;\n return ok(undefined);\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n releaseTransforms();\n members.clear();\n dependencies.clear();\n consumers.clear();\n pending.clear();\n pendingMeshContent.clear();\n videoConsumers.clear();\n pendingFeatures = [];\n pendingFeatureOwners = [];\n acknowledgedFeatures.clear();\n frameDependencies.clear();\n jointsByEntity.clear();\n skinConsumers.clear();\n },\n };\n}\n","/** Renderer-owned timestamp facts spanning one graph and one queue submit. */\n\nexport interface GpuFrameTimingProtocol {\n readonly firstMarker: 'frame.first-pass';\n readonly terminalMarker: 'occlusion.resolve-copy';\n readonly sameGraph: true;\n readonly sameSubmit: true;\n}\n\nexport interface GpuFrameTiming {\n readonly frameId: number;\n readonly deviceGeneration: number;\n readonly protocol: GpuFrameTimingProtocol;\n aborted: boolean;\n submitId: number | undefined;\n}\n\nexport interface GpuFrameTimingRecord {\n readonly firstPassTimestampNs: number;\n readonly occlusionResolveTimestampNs: number;\n readonly submitted: boolean;\n readonly graphGeneration: number;\n readonly submitId: number;\n}\n\nexport interface GpuFrameTimingSample {\n readonly frameId: number;\n readonly deviceGeneration: number;\n readonly durationUs: number;\n readonly protocol: GpuFrameTimingProtocol;\n readonly graphGeneration: number;\n readonly submitId: number;\n}\n\nexport interface GpuFrameTimingSummary {\n readonly medianUs: number;\n readonly p95Us: number;\n readonly samples: number;\n}\n\nconst PROTOCOL: GpuFrameTimingProtocol = Object.freeze({\n firstMarker: 'frame.first-pass',\n terminalMarker: 'occlusion.resolve-copy',\n sameGraph: true,\n sameSubmit: true,\n});\n\nexport function createGpuFrameTiming(input: {\n readonly frameId: number;\n readonly deviceGeneration: number;\n}): GpuFrameTiming {\n return { ...input, protocol: PROTOCOL, aborted: false, submitId: undefined };\n}\n\nexport function recordGpuFrameTiming(\n timing: GpuFrameTiming,\n record: GpuFrameTimingRecord,\n): GpuFrameTimingSample {\n if (!record.submitted) {\n timing.aborted = true;\n throw new Error('GPU frame timing requires a submitted frame');\n }\n if (timing.aborted) throw new Error('GPU frame timing cannot cross a failed submit');\n if (timing.submitId !== undefined && timing.submitId !== record.submitId) {\n throw new Error('GPU frame timing markers must share one submit');\n }\n if (\n !Number.isFinite(record.firstPassTimestampNs) ||\n !Number.isFinite(record.occlusionResolveTimestampNs)\n ) {\n throw new Error('GPU frame timing requires finite timestamps');\n }\n if (record.occlusionResolveTimestampNs < record.firstPassTimestampNs) {\n throw new Error('GPU frame timing terminal marker precedes first marker');\n }\n timing.submitId = record.submitId;\n return Object.freeze({\n frameId: timing.frameId,\n deviceGeneration: timing.deviceGeneration,\n durationUs: (record.occlusionResolveTimestampNs - record.firstPassTimestampNs) / 1_000,\n protocol: PROTOCOL,\n graphGeneration: record.graphGeneration,\n submitId: record.submitId,\n });\n}\n\nfunction nearestRank(values: readonly number[], percentile: number): number {\n const sorted = [...values].sort((left, right) => left - right);\n return sorted[Math.max(0, Math.ceil(percentile * sorted.length) - 1)] ?? 0;\n}\n\nexport function summarizeGpuFrameTiming(\n samples: readonly GpuFrameTimingSample[],\n): GpuFrameTimingSummary {\n const values = samples.map((sample) => sample.durationUs);\n return Object.freeze({\n medianUs: nearestRank(values, 0.5),\n p95Us: nearestRank(values, 0.95),\n samples: values.length,\n });\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\n\n/** Linear HDR RGB used by the M0 composition contract. */\nexport type SsrReflectionColor = readonly [number, number, number];\n\nexport interface SsrCompositionInput {\n /** Screen-hit confidence. The parent SSR consumer supplies 0..1. */\n readonly c: number;\n /** The Standard BRDF specular lobe before SSR replacement. */\n readonly baseSpecular: SsrReflectionColor;\n /** The same-source BRDF-projected screen contribution. */\n readonly screenSpecular: SsrReflectionColor;\n /** The committed producer-owned environment contribution. */\n readonly fallbackSpecular: SsrReflectionColor;\n}\n\nexport interface SsrCompositionInputError {\n readonly code: 'ssr-composition-input-invalid';\n readonly expected: string;\n readonly hint: string;\n readonly detail: Readonly<{\n readonly field: 'c' | 'baseSpecular' | 'screenSpecular' | 'fallbackSpecular';\n }>;\n}\n\nexport type SsrCompositionResult = Result<SsrReflectionColor, SsrCompositionInputError>;\n\nfunction finiteColor(value: SsrReflectionColor): boolean {\n return value.length === 3 && value.every(Number.isFinite);\n}\n\nfunction invalid(\n field: SsrCompositionInputError['detail']['field'],\n expected: string,\n): SsrCompositionResult {\n return err({\n code: 'ssr-composition-input-invalid',\n expected,\n hint: 'preserve linear HDR and the bounded SSR confidence before composing',\n detail: Object.freeze({ field }),\n });\n}\n\n/**\n * Apply the M0 reflection replacement contract without owning an SSR pass.\n *\n * `c=0` returns the base Standard specular lobe. `c=1` replaces only that\n * lobe with the same-source screen contribution, subtracting the committed\n * environment contribution once. Hi-Z traversal, history and graph wiring\n * remain owned by the parent SSR feature.\n */\nexport function composeSsrReflection(input: SsrCompositionInput): SsrCompositionResult {\n if (!Number.isFinite(input.c) || input.c < 0 || input.c > 1) {\n return invalid('c', 'a finite confidence in the inclusive range 0..1');\n }\n for (const [field, value] of [\n ['baseSpecular', input.baseSpecular],\n ['screenSpecular', input.screenSpecular],\n ['fallbackSpecular', input.fallbackSpecular],\n ] as const) {\n if (!finiteColor(value)) {\n return invalid(field, 'three finite linear HDR RGB channels');\n }\n }\n const c = input.c;\n return ok(\n Object.freeze([\n input.baseSpecular[0] + c * (input.screenSpecular[0] - input.fallbackSpecular[0]),\n input.baseSpecular[1] + c * (input.screenSpecular[1] - input.fallbackSpecular[1]),\n input.baseSpecular[2] + c * (input.screenSpecular[2] - input.fallbackSpecular[2]),\n ]) as SsrReflectionColor,\n );\n}\n","/** Pure CPU expectations for transmission math; this module has no GPU ownership. */\n\nexport type Color3 = readonly [number, number, number];\nexport type Uv2 = readonly [number, number];\n\nexport const DEFAULT_IOR = 1.5;\nexport const DEFAULT_GUARD_BAND = 0.02;\n\nexport interface TransmissionEnergy {\n readonly reflection: number;\n readonly transmission: number;\n readonly diffuse: number;\n readonly metallicResidual: number;\n}\n\nexport interface BackdropResolution {\n readonly source: 'refracted' | 'environment' | 'unrefracted';\n readonly color: Color3;\n}\n\nexport interface BackdropInputs {\n readonly uv: Uv2;\n readonly refracted?: Color3;\n readonly environment?: Color3;\n readonly unrefracted: Color3;\n readonly guardBand?: number;\n}\n\nconst clamp01 = (value: number): number => Math.min(Math.max(value, 0), 1);\n\nconst finiteOr = (value: number, fallback: number): number =>\n Number.isFinite(value) ? value : fallback;\n\nconst safeIor = (ior: number): number => {\n const candidate = finiteOr(ior, DEFAULT_IOR);\n return candidate >= 1 ? candidate : DEFAULT_IOR;\n};\n\n/** Returns dielectric F0 for air to a material with the supplied IOR. */\nexport function fresnelF0(ior: number): number {\n const ratio = (safeIor(ior) - 1) / (safeIor(ior) + 1);\n return ratio * ratio;\n}\n\n/**\n * Returns unpolarized dielectric reflectance. `eta` is incident IOR divided\n * by transmitted IOR, so values above one can produce total internal\n * reflection. This is a CPU oracle only; it does not sample a GPU resource.\n */\nexport function fresnelReflectance(cosTheta: number, eta: number): number {\n if (!Number.isFinite(cosTheta) || !Number.isFinite(eta) || eta <= 0) return 1;\n\n const cosIncident = clamp01(cosTheta);\n const sinTransmittedSquared = eta * eta * (1 - cosIncident * cosIncident);\n if (sinTransmittedSquared >= 1) return 1;\n\n const cosTransmitted = Math.sqrt(Math.max(0, 1 - sinTransmittedSquared));\n const perpendicularDenominator = cosIncident + eta * cosTransmitted;\n const parallelDenominator = eta * cosIncident + cosTransmitted;\n if (perpendicularDenominator === 0 || parallelDenominator === 0) return 1;\n\n const perpendicular = (cosIncident - eta * cosTransmitted) / perpendicularDenominator;\n const parallel = (eta * cosIncident - cosTransmitted) / parallelDenominator;\n return clamp01((perpendicular * perpendicular + parallel * parallel) / 2);\n}\n\nexport function splitTransmissionEnergy(input: {\n readonly transmission: number;\n readonly metallic: number;\n readonly cosTheta: number;\n readonly ior: number;\n}): TransmissionEnergy {\n const transmission = clamp01(finiteOr(input.transmission, 0));\n const metallic = clamp01(finiteOr(input.metallic, 0));\n const reflectance = fresnelReflectance(input.cosTheta, 1 / safeIor(input.ior));\n const nonMetal = 1 - metallic;\n const refracted = (1 - reflectance) * nonMetal;\n\n return {\n reflection: reflectance,\n transmission: refracted * transmission,\n diffuse: refracted * (1 - transmission),\n metallicResidual: (1 - reflectance) * metallic,\n };\n}\n\nexport function beerLambertAttenuation(\n color: Color3,\n thickness: number,\n distance?: number,\n): Color3 {\n if (\n !Number.isFinite(thickness) ||\n thickness <= 0 ||\n distance === undefined ||\n !Number.isFinite(distance) ||\n distance <= 0\n ) {\n return [1, 1, 1];\n }\n\n const exponent = thickness / distance;\n const attenuate = (component: number): number => {\n const safeComponent = clamp01(finiteOr(component, 0));\n return Math.min(Math.max(safeComponent ** exponent, 0), 1);\n };\n return [attenuate(color[0]), attenuate(color[1]), attenuate(color[2])];\n}\n\nexport function roughnessToLod(roughness: number, maxLod: number): number {\n const safeRoughness = clamp01(finiteOr(roughness, 0));\n const safeMaxLod = Math.max(finiteOr(maxLod, 0), 0);\n return safeRoughness * safeRoughness * safeMaxLod;\n}\n\nexport function isWithinGuardBand(uv: Uv2, guardBand = DEFAULT_GUARD_BAND): boolean {\n if (!uv.every(Number.isFinite) || !Number.isFinite(guardBand)) return false;\n const band = clamp01(guardBand);\n return uv.every((coordinate) => coordinate >= band && coordinate <= 1 - band);\n}\n\nexport function resolveRefractionBackdrop(input: BackdropInputs): BackdropResolution {\n if (\n isWithinGuardBand(input.uv, input.guardBand) &&\n input.refracted !== undefined &&\n isFiniteColor(input.refracted)\n ) {\n return { source: 'refracted', color: input.refracted };\n }\n if (input.environment !== undefined && isFiniteColor(input.environment)) {\n return { source: 'environment', color: input.environment };\n }\n if (isFiniteColor(input.unrefracted)) {\n return { source: 'unrefracted', color: input.unrefracted };\n }\n return { source: 'unrefracted', color: [0, 0, 0] };\n}\n\nexport function isFiniteColor(color: Color3): boolean {\n return color.length === 3 && color.every(Number.isFinite);\n}\n","import { type Color3, fresnelReflectance, type Uv2 } from './oracle.js';\n\nexport type MediumVector3 = readonly [number, number, number];\n\nexport interface SingleLayerMediumCoefficients {\n /** Linear, inverse-metre absorption coefficients. */\n readonly absorption: MediumVector3;\n /** Linear, inverse-metre scattering coefficients. */\n readonly scattering: MediumVector3;\n readonly ior: number;\n /** Henyey-Greenstein phase anisotropy in [-1, 1]. */\n readonly phaseG?: number;\n}\n\nexport interface SingleLayerMediumOptics {\n readonly sigmaT: MediumVector3;\n readonly transmittance: MediumVector3;\n /** Uniform-medium single-scatter integral sigmaS * (1 - T) / sigmaT. */\n readonly singleScatter: MediumVector3;\n readonly reflectance: number;\n readonly transmissionWeight: number;\n readonly phase: number;\n readonly distanceMeters: number;\n}\n\nexport type SingleLayerMediumBackgroundReason = 'front' | 'shore' | 'edge' | 'sky-miss';\n\nexport interface SingleLayerMediumBackgroundCandidate {\n readonly color: Color3;\n readonly depthMeters: number;\n readonly uv: Uv2;\n}\n\nexport interface SingleLayerMediumBackgroundInput {\n /** No-water color and raw depth must come from the same view identity. */\n readonly original: SingleLayerMediumBackgroundCandidate;\n /** Refracted candidate carries color and depth as one pair. */\n readonly refracted?: SingleLayerMediumBackgroundCandidate;\n readonly environment?: Color3;\n readonly surfaceDepthMeters: number;\n readonly maxDistanceMeters: number;\n readonly depthToleranceMeters?: number;\n}\n\nexport interface SingleLayerMediumBackgroundResolution {\n readonly source: 'refracted' | 'unrefracted' | 'environment';\n readonly reason?: SingleLayerMediumBackgroundReason;\n readonly candidate: SingleLayerMediumBackgroundCandidate | undefined;\n readonly color: Color3;\n readonly distanceMeters: number;\n}\n\nconst DEFAULT_MAX_DISTANCE_METERS = 1000;\nconst DEFAULT_DEPTH_TOLERANCE_METERS = 0.001;\nconst DEFAULT_IOR = 1.333;\n\nconst finiteOr = (value: number, fallback: number): number =>\n Number.isFinite(value) ? value : fallback;\n\nfunction oneMinusExpNeg(value: number): number {\n const x = Math.max(finiteOr(value, 0), 0);\n if (x < 1e-3) {\n const x2 = x * x;\n return x * (1 - x * 0.5 + x2 / 6 - (x * x2) / 24);\n }\n return -Math.expm1(-x);\n}\n\nfunction singleScatterIntegral(sigmaS: number, sigmaT: number, distance: number): number {\n const scattering = Math.max(finiteOr(sigmaS, 0), 0);\n const extinction = Math.max(finiteOr(sigmaT, 0), 0);\n const path = Math.max(finiteOr(distance, 0), 0);\n if (extinction === 0) return scattering * path;\n return (scattering * oneMinusExpNeg(extinction * path)) / extinction;\n}\n\nconst nonNegative = (value: number): number => Math.max(finiteOr(value, 0), 0);\n\nconst clamp01 = (value: number): number => Math.min(Math.max(finiteOr(value, 0), 0), 1);\n\n/** Test an endpoint against the undisturbed geometric water plane. */\nexport function isBelowSingleLayerMediumPlane(input: {\n readonly surfacePosition: MediumVector3;\n readonly geometricNormal: MediumVector3;\n readonly endpoint: MediumVector3;\n readonly epsilonMeters?: number;\n}): boolean {\n const [nx, ny, nz] = input.geometricNormal;\n const length = Math.hypot(nx, ny, nz);\n if (!Number.isFinite(length) || length <= 1e-8) return false;\n const signedDistance =\n ((input.endpoint[0] - input.surfacePosition[0]) * nx +\n (input.endpoint[1] - input.surfacePosition[1]) * ny +\n (input.endpoint[2] - input.surfacePosition[2]) * nz) /\n length;\n return Number.isFinite(signedDistance) && signedDistance <= (input.epsilonMeters ?? 0.001);\n}\n\nfunction vector3(input: MediumVector3 | undefined): MediumVector3 {\n return [nonNegative(input?.[0] ?? 0), nonNegative(input?.[1] ?? 0), nonNegative(input?.[2] ?? 0)];\n}\n\nfunction finiteColor(input: Color3 | undefined): input is Color3 {\n return input !== undefined && input.length === 3 && input.every(Number.isFinite);\n}\n\nfunction finiteUv(input: Uv2): boolean {\n return input.length === 2 && input.every(Number.isFinite);\n}\n\nfunction safeDistance(value: number, maxDistance: number): number {\n return Math.min(Math.max(finiteOr(value, 0), 0), maxDistance);\n}\n\n/**\n * Evaluate the stable analytic portion of the Engine's single-layer model.\n * Zero extinction uses the continuous limit and every returned component is\n * finite, even when an authored value is NaN or infinite.\n */\nexport function integrateSingleLayerMedium(input: {\n readonly coefficients: SingleLayerMediumCoefficients;\n readonly distanceMeters: number;\n readonly cosTheta: number;\n readonly phaseCosTheta?: number;\n /** Finite authored propagation bound; defaults to the conservative 1000 m bound. */\n readonly maxDistanceMeters?: number;\n}): SingleLayerMediumOptics {\n const absorption = vector3(input.coefficients.absorption);\n const scattering = vector3(input.coefficients.scattering);\n const sigmaT: MediumVector3 = [\n absorption[0] + scattering[0],\n absorption[1] + scattering[1],\n absorption[2] + scattering[2],\n ];\n const maxDistanceMeters = Math.min(\n Math.max(\n finiteOr(input.maxDistanceMeters ?? DEFAULT_MAX_DISTANCE_METERS, DEFAULT_MAX_DISTANCE_METERS),\n 0,\n ),\n 100000,\n );\n const distanceMeters = safeDistance(input.distanceMeters, maxDistanceMeters);\n const transmittance: MediumVector3 = [\n Number.isFinite(sigmaT[0]) && sigmaT[0] > 0 ? Math.exp(-sigmaT[0] * distanceMeters) : 1,\n Number.isFinite(sigmaT[1]) && sigmaT[1] > 0 ? Math.exp(-sigmaT[1] * distanceMeters) : 1,\n Number.isFinite(sigmaT[2]) && sigmaT[2] > 0 ? Math.exp(-sigmaT[2] * distanceMeters) : 1,\n ];\n const singleScatter: MediumVector3 = [\n singleScatterIntegral(scattering[0], sigmaT[0], distanceMeters),\n singleScatterIntegral(scattering[1], sigmaT[1], distanceMeters),\n singleScatterIntegral(scattering[2], sigmaT[2], distanceMeters),\n ];\n const iorCandidate = finiteOr(input.coefficients.ior, DEFAULT_IOR);\n const ior = iorCandidate >= 1 ? iorCandidate : DEFAULT_IOR;\n const reflectance = fresnelReflectance(input.cosTheta, 1 / ior);\n const transmissionWeight = 1 - reflectance;\n const phaseG = Math.min(Math.max(finiteOr(input.coefficients.phaseG ?? 0, 0), -1), 1);\n const phaseCosTheta = clamp01(input.phaseCosTheta ?? input.cosTheta);\n const phaseDenominator = Math.max(1 + phaseG * phaseG - 2 * phaseG * phaseCosTheta, 1e-6);\n const phase = (1 - phaseG * phaseG) / (4 * Math.PI * phaseDenominator ** 1.5);\n return {\n sigmaT,\n transmittance,\n singleScatter,\n reflectance,\n transmissionWeight,\n phase: finiteOr(phase, 1 / (4 * Math.PI)),\n distanceMeters,\n };\n}\n\n/** Compose linear HDR terms after exactly one Fresnel allocation. */\nexport function composeSingleLayerMediumColor(input: {\n readonly optics: SingleLayerMediumOptics;\n readonly background: Color3;\n readonly reflection: Color3;\n readonly foamColor?: Color3;\n readonly coverage?: number;\n readonly foam?: number;\n}): Color3 {\n const coverage = clamp01(input.coverage ?? 1);\n const foam = clamp01(input.foam ?? 0) * coverage;\n const foamColor = finiteColor(input.foamColor) ? input.foamColor : [1, 1, 1];\n const background = finiteColor(input.background) ? input.background : [0, 0, 0];\n const reflection = finiteColor(input.reflection) ? input.reflection : [0, 0, 0];\n const medium: MediumVector3 = [\n background[0] * input.optics.transmittance[0] + input.optics.singleScatter[0],\n background[1] * input.optics.transmittance[1] + input.optics.singleScatter[1],\n background[2] * input.optics.transmittance[2] + input.optics.singleScatter[2],\n ];\n const waterWeight = input.optics.transmissionWeight * coverage * (1 - foam);\n const reflectionWeight = input.optics.reflectance * coverage;\n const foamWeight = foam;\n return [\n finiteOr(\n reflection[0] * reflectionWeight + medium[0] * waterWeight + foamColor[0] * foamWeight,\n 0,\n ),\n finiteOr(\n reflection[1] * reflectionWeight + medium[1] * waterWeight + foamColor[1] * foamWeight,\n 0,\n ),\n finiteOr(\n reflection[2] * reflectionWeight + medium[2] * waterWeight + foamColor[2] * foamWeight,\n 0,\n ),\n ];\n}\n\nfunction validCandidate(\n candidate: SingleLayerMediumBackgroundCandidate | undefined,\n maxDistance: number,\n): candidate is SingleLayerMediumBackgroundCandidate {\n return (\n candidate !== undefined &&\n finiteColor(candidate.color) &&\n finiteUv(candidate.uv) &&\n Number.isFinite(candidate.depthMeters) &&\n candidate.depthMeters >= 0 &&\n candidate.depthMeters <= maxDistance\n );\n}\n\n/**\n * Resolve paired color/depth input with front, shore, edge, and sky-miss\n * reasons. Environment is a reflection/background fallback only; it is never\n * used as a riverbed transmission sample when a valid original pair exists.\n */\nexport function resolveSingleLayerMediumBackground(\n input: SingleLayerMediumBackgroundInput,\n): SingleLayerMediumBackgroundResolution {\n const maxDistance = Math.max(finiteOr(input.maxDistanceMeters, DEFAULT_MAX_DISTANCE_METERS), 0);\n const tolerance = Math.max(\n finiteOr(\n input.depthToleranceMeters ?? DEFAULT_DEPTH_TOLERANCE_METERS,\n DEFAULT_DEPTH_TOLERANCE_METERS,\n ),\n 0,\n );\n const surfaceDepth = finiteOr(input.surfaceDepthMeters, 0);\n if (\n validCandidate(input.refracted, maxDistance) &&\n input.refracted.uv.every((coordinate) => coordinate >= 0 && coordinate <= 1)\n ) {\n if (input.refracted.depthMeters + tolerance < surfaceDepth) {\n return {\n source: 'unrefracted',\n reason: 'front',\n candidate: validCandidate(input.original, maxDistance) ? input.original : undefined,\n color: validCandidate(input.original, maxDistance) ? input.original.color : [0, 0, 0],\n distanceMeters: validCandidate(input.original, maxDistance)\n ? Math.max(input.original.depthMeters - surfaceDepth, 0)\n : 0,\n };\n }\n return {\n source: 'refracted',\n candidate: input.refracted,\n color: input.refracted.color,\n distanceMeters: Math.max(input.refracted.depthMeters - surfaceDepth, 0),\n };\n }\n if (validCandidate(input.original, maxDistance)) {\n const reason: SingleLayerMediumBackgroundReason =\n input.refracted === undefined\n ? 'shore'\n : finiteUv(input.refracted.uv) &&\n input.refracted.uv.some((coordinate) => coordinate < 0 || coordinate > 1)\n ? 'edge'\n : 'shore';\n return {\n source: 'unrefracted',\n reason,\n candidate: input.original,\n color: input.original.color,\n distanceMeters: Math.max(input.original.depthMeters - surfaceDepth, 0),\n };\n }\n if (finiteColor(input.environment)) {\n return {\n source: 'environment',\n reason: 'sky-miss',\n candidate: undefined,\n color: input.environment,\n distanceMeters: maxDistance,\n };\n }\n return {\n source: 'environment',\n reason: 'sky-miss',\n candidate: undefined,\n color: [0, 0, 0],\n distanceMeters: maxDistance,\n };\n}\n\n/** Screen-space approximation of the Euclidean endpoint path, clamped to the declared maximum. */\nexport function estimateSingleLayerPathLength(input: {\n readonly surfacePosition: readonly [number, number, number];\n readonly backgroundPosition: readonly [number, number, number] | undefined;\n readonly maxDistanceMeters: number;\n}): { readonly distanceMeters: number; readonly valid: boolean } {\n const maxDistance = Math.max(finiteOr(input.maxDistanceMeters, DEFAULT_MAX_DISTANCE_METERS), 0);\n if (\n input.surfacePosition.length !== 3 ||\n input.backgroundPosition === undefined ||\n input.backgroundPosition.length !== 3 ||\n !input.surfacePosition.every(Number.isFinite) ||\n !input.backgroundPosition.every(Number.isFinite)\n ) {\n return { distanceMeters: maxDistance, valid: false };\n }\n const distance = Math.hypot(\n (input.backgroundPosition[0] ?? 0) - (input.surfacePosition[0] ?? 0),\n (input.backgroundPosition[1] ?? 0) - (input.surfacePosition[1] ?? 0),\n (input.backgroundPosition[2] ?? 0) - (input.surfacePosition[2] ?? 0),\n );\n return {\n distanceMeters: Math.min(Math.max(finiteOr(distance, maxDistance), 0), maxDistance),\n valid: Number.isFinite(distance),\n };\n}\n"]}
@@ -1,4 +1,3 @@
1
- import type { World } from '@forgeax/engine-ecs';
2
1
  import { InstanceTransformsStrideMismatchError } from '@forgeax/engine-ecs/projection';
3
2
  import type { RhiErrorCode } from '@forgeax/engine-rhi';
4
3
  /** Renderer projection identity; never stored in a World or SceneAsset. */
@@ -79,15 +78,15 @@ export declare class InstanceProjectionStore {
79
78
  private identities;
80
79
  private readonly records;
81
80
  private readonly residency;
82
- project(world: World, entity: number, transforms: ArrayLike<number>): InstanceCollectionSnapshot;
81
+ project(world: object, entity: number, transforms: ArrayLike<number>): InstanceCollectionSnapshot;
83
82
  /** Called only after the owning RenderScene accepts its prepared changes. */
84
- accept(world: World, entity: number, snapshot: {
83
+ accept(world: object, entity: number, snapshot: {
85
84
  readonly collectionId?: InstanceCollectionId;
86
85
  readonly revision?: number;
87
86
  readonly transforms: Float32Array;
88
87
  readonly generations?: Uint32Array;
89
88
  }): void;
90
- release(world: World, entity: number): void;
89
+ release(world: object, entity: number): void;
91
90
  retain(ids: ReadonlySet<InstanceCollectionId>): void;
92
91
  dispose(): void;
93
92
  _resetResidency(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"instances.d.ts","sourceRoot":"","sources":["../src/instances.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instances.d.ts","sourceRoot":"","sources":["../src/instances.ts"],"names":[],"mappings":"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"}
package/dist/internal.mjs CHANGED
@@ -1,11 +1,10 @@
1
- export { PROBE_MAX_CONTRIBUTORS, SSR_HISTORY_FORMAT, SsrHistoryOwner, admitProbeContributors, blendLightProbes, buildRectAreaWorldFrame, createExtendedLightingState, createSsrHistoryOwner, estimateSsrSpatialMemory, projectExtendedLightingInspection, promoteExtendedLightingCandidate, recordExtendedLightingFailure, rectAreaFacesPoint, scaledProbeWeight, setOcclusionRuntimeTestHooks } from './chunk-UI5SFODX.mjs';
2
- import './chunk-ILQ5MEZF.mjs';
3
- import './chunk-UINHLCZA.mjs';
4
- import './chunk-ELJFJ2BU.mjs';
5
- export { TemporalFrameCoordinator } from './chunk-HEB564WF.mjs';
6
- import { EXTENDED_LIGHTING_TOPOLOGY } from './chunk-SHFUFJ5N.mjs';
7
- export { DeviceScope, EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES, deriveExtendedLightingCapability, extendedLightingSampledTextureCapacityAvailable, validateGraphTargetCaptureReadback } from './chunk-SHFUFJ5N.mjs';
8
- export { createLightResourceUnavailable, createVisibilityBudget } from './chunk-WEX45HKH.mjs';
1
+ export { PROBE_MAX_CONTRIBUTORS, SSR_HISTORY_FORMAT, SsrHistoryOwner, admitProbeContributors, blendLightProbes, createExtendedLightingState, createSsrHistoryOwner, estimateSsrSpatialMemory, projectExtendedLightingInspection, promoteExtendedLightingCandidate, recordExtendedLightingFailure, scaledProbeWeight, setOcclusionRuntimeTestHooks } from './chunk-3XUBWRY2.mjs';
2
+ export { buildRectAreaWorldFrame, rectAreaFacesPoint } from './chunk-G6HDNGY7.mjs';
3
+ import './chunk-X2KA6WHM.mjs';
4
+ export { TemporalFrameCoordinator } from './chunk-LM5IE7GF.mjs';
5
+ import './chunk-RIPAEGI6.mjs';
6
+ import { EXTENDED_LIGHTING_TOPOLOGY } from './chunk-MXTWKZO4.mjs';
7
+ export { DeviceScope, EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES, createLightResourceUnavailable, createVisibilityBudget, deriveExtendedLightingCapability, extendedLightingSampledTextureCapacityAvailable, validateGraphTargetCaptureReadback } from './chunk-MXTWKZO4.mjs';
9
8
  export { resolveTilesetRuntime } from '@forgeax/engine-assets-runtime';
10
9
  import '@forgeax/engine-shader';
11
10
  import { ok, err } from '@forgeax/engine-types';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/prepare/extended-lighting/ltc-resources.ts","../src/ssr/temporal.ts"],"names":["ok","err"],"mappings":"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","file":"internal.mjs","sourcesContent":["// @forgeax/engine-render - DeviceScope-owned RectArea LTC resources.\n\nimport type { Result, RhiDevice, RhiError, Texture } from '@forgeax/engine-rhi';\nimport { LTC_TABLE_HEIGHT, LTC_TABLE_WIDTH, LTC_TABLES } from '@forgeax/engine-shader';\nimport { err, ok } from '@forgeax/engine-types';\nimport { type DeviceScope, LifecycleTransaction } from '../../device/device-scope';\nimport {\n GPU_TEXTURE_USAGE_COPY_DST,\n GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n} from '../../gpu-texture-usage';\nimport { deriveExtendedLightingCapability, EXTENDED_LIGHTING_TOPOLOGY } from './resources';\n\nexport interface LtcResourcePlanInput {\n readonly scope: DeviceScope;\n readonly ltcAvailable: boolean;\n readonly residentGeneration?: number;\n}\n\nexport interface LtcResourcePlan {\n readonly topology: typeof EXTENDED_LIGHTING_TOPOLOGY;\n readonly generation: number;\n readonly rectAdmission: 'admitted' | 'omitted';\n readonly tableCount: number;\n readonly uploadCount: number;\n}\n\nexport interface LtcResourceCandidate {\n readonly topology: typeof EXTENDED_LIGHTING_TOPOLOGY;\n readonly generation: number;\n readonly scope: DeviceScope;\n readonly lambertTexture: Texture;\n readonly ggxTexture: Texture;\n readonly tableCount: 2;\n readonly uploadCount: 2;\n}\n\nexport function deriveLtcResourcePlan(input: LtcResourcePlanInput): LtcResourcePlan {\n const admitted = input.ltcAvailable;\n return {\n topology: EXTENDED_LIGHTING_TOPOLOGY,\n generation: input.scope.generation,\n rectAdmission: admitted ? 'admitted' : 'omitted',\n tableCount: admitted ? 2 : 0,\n uploadCount: admitted && input.residentGeneration !== input.scope.generation ? 2 : 0,\n };\n}\n\nfunction failure(expected: string, actual: string): Result<never, RhiError> {\n return err({\n code: 'webgpu-runtime-error',\n expected,\n hint: 'inspect device capabilities and retry the extendedLighting candidate',\n detail: { error: { code: 'ltc-resource', message: actual } },\n } as RhiError);\n}\n\nfunction textureBytes(table: Uint16Array): Uint8Array {\n return new Uint8Array(table.buffer, table.byteOffset, table.byteLength);\n}\n\n/** Create both tracked tables atomically; unavailable LTC only omits Rect. */\nexport async function createLtcResourceCandidate(input: {\n readonly device: RhiDevice | undefined;\n readonly scope: DeviceScope;\n}): Promise<Result<LtcResourceCandidate | undefined, RhiError>> {\n if (input.device === undefined) return ok(undefined);\n if (!deriveExtendedLightingCapability(input.device).admitted) return ok(undefined);\n const device = input.device;\n\n const transaction = new LifecycleTransaction(input.scope);\n let lambertTexture: Texture | undefined;\n let ggxTexture: Texture | undefined;\n const createTable = (label: string, table: Uint16Array): Texture => {\n const texture = device.createTexture({\n label,\n size: { width: LTC_TABLE_WIDTH, height: LTC_TABLE_HEIGHT, depthOrArrayLayers: 1 },\n mipLevelCount: 1,\n sampleCount: 1,\n dimension: '2d',\n format: 'rgba16float',\n usage: GPU_TEXTURE_USAGE_COPY_DST | GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n viewFormats: [],\n textureBindingViewDimension: undefined,\n });\n if (texture === undefined || !texture.ok) {\n throw texture?.error ?? new Error('LTC texture creation returned no result');\n }\n const write = device.queue.writeTexture(\n { texture: texture.value, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n textureBytes(table),\n { offset: 0, bytesPerRow: LTC_TABLE_WIDTH * 8, rowsPerImage: LTC_TABLE_HEIGHT },\n { width: LTC_TABLE_WIDTH, height: LTC_TABLE_HEIGHT, depthOrArrayLayers: 1 },\n );\n if (!write.ok) throw write.error;\n return texture.value;\n };\n\n transaction.add({\n kind: 'texture',\n create: () => {\n lambertTexture = createTable('extended-lighting-ltc-lambert', LTC_TABLES.lambert);\n return lambertTexture;\n },\n cleanup: (value) => {\n const destroyed = input.device?.destroyTexture(value);\n if (destroyed !== undefined && !destroyed.ok) throw destroyed.error;\n },\n });\n transaction.add({\n kind: 'texture',\n create: () => {\n ggxTexture = createTable('extended-lighting-ltc-ggx', LTC_TABLES.ggx);\n return ggxTexture;\n },\n cleanup: (value) => {\n const destroyed = input.device?.destroyTexture(value);\n if (destroyed !== undefined && !destroyed.ok) throw destroyed.error;\n },\n });\n\n const committed = await transaction.commit();\n if (!committed.ok)\n return failure(committed.error.primary.expected, committed.error.primary.message);\n if (lambertTexture === undefined || ggxTexture === undefined) {\n return failure('two LTC textures', 'the transaction committed without both tables');\n }\n return ok({\n topology: EXTENDED_LIGHTING_TOPOLOGY,\n generation: input.scope.generation,\n scope: input.scope,\n lambertTexture,\n ggxTexture,\n tableCount: 2,\n uploadCount: 2,\n });\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport type {\n TemporalFrameBeginInput,\n TemporalFrameCandidate,\n TemporalFrameConsumerId,\n TemporalFrameCoordinator,\n TemporalFrameError,\n TemporalFramePhases,\n TemporalFrameReceipt,\n TemporalFrameStage,\n} from '../temporal/frame-coordinator';\nimport type {\n SsrHistoryCandidate,\n SsrHistoryError,\n SsrHistoryFailureStage,\n SsrHistoryInspection,\n SsrHistoryOwner,\n SsrHistoryResetReason,\n} from './history';\n\nexport interface SsrTemporalCandidate<T> {\n readonly temporal: TemporalFrameCandidate<T>;\n readonly history: SsrHistoryCandidate;\n}\nexport interface SsrTemporalExecutionError {\n readonly code: 'ssr-temporal-stage-failed';\n readonly expected: string;\n readonly hint: string;\n readonly detail: Readonly<{ readonly stage: TemporalFrameStage; readonly cause: unknown }>;\n}\nexport interface SsrTemporalInspection {\n readonly sharedEpoch: number;\n readonly consumerIds: readonly TemporalFrameConsumerId[];\n readonly coordinatorAttempt: 'none' | 'active' | 'committed' | 'aborted';\n readonly history: SsrHistoryInspection;\n}\nexport type SsrTemporalError = TemporalFrameError | SsrHistoryError | SsrTemporalExecutionError;\n\nfunction stageFromError(cause: unknown): TemporalFrameStage {\n if (typeof cause === 'object' && cause !== null && 'stage' in cause) {\n const stage = (cause as { readonly stage?: unknown }).stage;\n if (stage === 'build' || stage === 'encode' || stage === 'finish' || stage === 'submit') {\n return stage;\n }\n }\n return 'submit';\n}\nfunction coordinatorInput<T>(input: TemporalFrameBeginInput<T>): TemporalFrameBeginInput<T> {\n const consumerIds = input.consumerIds?.includes('ssr')\n ? input.consumerIds\n : [...(input.consumerIds ?? []), 'ssr' as const];\n return { ...input, temporalDemand: true, consumerIds };\n}\nfunction resetCoordinator<T>(\n coordinator: TemporalFrameCoordinator<T>,\n reason: SsrHistoryResetReason,\n): void {\n switch (reason) {\n case 'first-enable':\n case 'disable':\n return;\n case 'resize':\n coordinator.reset('resize');\n return;\n case 'camera-cut':\n coordinator.reset('cut');\n return;\n case 'history-version':\n coordinator.reset('camera-switch');\n return;\n case 'coverage-loss':\n coordinator.reset('detach');\n return;\n case 'reflection-generation':\n case 'device-recovery':\n coordinator.reset('device-generation');\n return;\n }\n}\n\n/** Stages SSR history beside the shared renderer transaction without owning submit or epochs. */\nexport class SsrTemporalConsumer<T = unknown> {\n constructor(\n private readonly coordinator: TemporalFrameCoordinator<T>,\n readonly history: SsrHistoryOwner,\n ) {}\n begin(\n input: TemporalFrameBeginInput<T>,\n ): Result<SsrTemporalCandidate<T>, TemporalFrameError | SsrHistoryError> {\n const history = this.history.beginFrame();\n if (!history.ok) return history;\n const temporal = this.coordinator.begin(coordinatorInput(input));\n if (!temporal.ok) {\n this.history.abortFrame(history.value, 'build');\n return temporal;\n }\n return ok({ temporal: temporal.value, history: history.value });\n }\n commit(\n candidate: SsrTemporalCandidate<T>,\n ): Result<TemporalFrameReceipt<T>, TemporalFrameError | SsrHistoryError> {\n const committed = this.coordinator.commit(candidate.temporal);\n if (!committed.ok) {\n this.history.abortFrame(candidate.history, 'submit');\n return committed;\n }\n const history = this.history.commitFrame(candidate.history);\n if (!history.ok) return history;\n return committed;\n }\n abort(candidate: SsrTemporalCandidate<T>, stage: SsrHistoryFailureStage): void {\n this.history.abortFrame(candidate.history, stage);\n this.coordinator.abort(candidate.temporal, stage);\n }\n run(\n input: TemporalFrameBeginInput<T>,\n phases: TemporalFramePhases<T>,\n ): Result<TemporalFrameReceipt<T>, SsrTemporalError> {\n const started = this.begin(input);\n if (!started.ok) return started;\n const candidate = started.value;\n try {\n const built = phases.build();\n phases.encode(built);\n phases.finish();\n phases.submit();\n } catch (cause) {\n const stage = stageFromError(cause);\n this.abort(candidate, stage);\n return err({\n code: 'ssr-temporal-stage-failed',\n expected: `SSR temporal ${stage} succeeds before commit`,\n hint: 'inspect the owned stage failure and retry without promoting the candidate',\n detail: { stage, cause },\n });\n }\n return this.commit(candidate);\n }\n reset(reason: SsrHistoryResetReason): void {\n this.history.reset(reason);\n resetCoordinator(this.coordinator, reason);\n }\n retireAfterFence(\n queue: Parameters<SsrHistoryOwner['retireAfterFence']>[0],\n onFailure: Parameters<SsrHistoryOwner['retireAfterFence']>[1],\n ): void {\n this.history.retireAfterFence(queue, onFailure);\n }\n inspect(): SsrTemporalInspection {\n const temporal = this.coordinator.inspect();\n return Object.freeze({\n sharedEpoch: temporal.epoch,\n consumerIds: temporal.consumerIds,\n coordinatorAttempt: temporal.attempt,\n history: this.history.inspect(),\n });\n }\n}\nexport function createSsrTemporalConsumer<T>(\n coordinator: TemporalFrameCoordinator<T>,\n history: SsrHistoryOwner,\n): SsrTemporalConsumer<T> {\n return new SsrTemporalConsumer(coordinator, history);\n}\n"]}
1
+ {"version":3,"sources":["../src/prepare/extended-lighting/ltc-resources.ts","../src/ssr/temporal.ts"],"names":["ok","err"],"mappings":"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","file":"internal.mjs","sourcesContent":["// @forgeax/engine-render - DeviceScope-owned RectArea LTC resources.\n\nimport type { Result, RhiDevice, RhiError, Texture } from '@forgeax/engine-rhi';\nimport { LTC_TABLE_HEIGHT, LTC_TABLE_WIDTH, LTC_TABLES } from '@forgeax/engine-shader';\nimport { err, ok } from '@forgeax/engine-types';\nimport { type DeviceScope, LifecycleTransaction } from '../../device/device-scope';\nimport {\n GPU_TEXTURE_USAGE_COPY_DST,\n GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n} from '../../gpu-texture-usage';\nimport { deriveExtendedLightingCapability, EXTENDED_LIGHTING_TOPOLOGY } from './resources';\n\nexport interface LtcResourcePlanInput {\n readonly scope: DeviceScope;\n readonly ltcAvailable: boolean;\n readonly residentGeneration?: number;\n}\n\nexport interface LtcResourcePlan {\n readonly topology: typeof EXTENDED_LIGHTING_TOPOLOGY;\n readonly generation: number;\n readonly rectAdmission: 'admitted' | 'omitted';\n readonly tableCount: number;\n readonly uploadCount: number;\n}\n\nexport interface LtcResourceCandidate {\n readonly topology: typeof EXTENDED_LIGHTING_TOPOLOGY;\n readonly generation: number;\n readonly scope: DeviceScope;\n readonly lambertTexture: Texture;\n readonly ggxTexture: Texture;\n readonly tableCount: 2;\n readonly uploadCount: 2;\n}\n\nexport function deriveLtcResourcePlan(input: LtcResourcePlanInput): LtcResourcePlan {\n const admitted = input.ltcAvailable;\n return {\n topology: EXTENDED_LIGHTING_TOPOLOGY,\n generation: input.scope.generation,\n rectAdmission: admitted ? 'admitted' : 'omitted',\n tableCount: admitted ? 2 : 0,\n uploadCount: admitted && input.residentGeneration !== input.scope.generation ? 2 : 0,\n };\n}\n\nfunction failure(expected: string, actual: string): Result<never, RhiError> {\n return err({\n code: 'webgpu-runtime-error',\n expected,\n hint: 'inspect device capabilities and retry the extendedLighting candidate',\n detail: { error: { code: 'ltc-resource', message: actual } },\n } as RhiError);\n}\n\nfunction textureBytes(table: Uint16Array): Uint8Array {\n return new Uint8Array(table.buffer, table.byteOffset, table.byteLength);\n}\n\n/** Create both tracked tables atomically; unavailable LTC only omits Rect. */\nexport async function createLtcResourceCandidate(input: {\n readonly device: RhiDevice | undefined;\n readonly scope: DeviceScope;\n}): Promise<Result<LtcResourceCandidate | undefined, RhiError>> {\n if (input.device === undefined) return ok(undefined);\n if (!deriveExtendedLightingCapability(input.device).admitted) return ok(undefined);\n const device = input.device;\n\n const transaction = new LifecycleTransaction(input.scope);\n let lambertTexture: Texture | undefined;\n let ggxTexture: Texture | undefined;\n const createTable = (label: string, table: Uint16Array): Texture => {\n const texture = device.createTexture({\n label,\n size: { width: LTC_TABLE_WIDTH, height: LTC_TABLE_HEIGHT, depthOrArrayLayers: 1 },\n mipLevelCount: 1,\n sampleCount: 1,\n dimension: '2d',\n format: 'rgba16float',\n usage: GPU_TEXTURE_USAGE_COPY_DST | GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n viewFormats: [],\n textureBindingViewDimension: undefined,\n });\n if (texture === undefined || !texture.ok) {\n throw texture?.error ?? new Error('LTC texture creation returned no result');\n }\n const write = device.queue.writeTexture(\n { texture: texture.value, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n textureBytes(table),\n { offset: 0, bytesPerRow: LTC_TABLE_WIDTH * 8, rowsPerImage: LTC_TABLE_HEIGHT },\n { width: LTC_TABLE_WIDTH, height: LTC_TABLE_HEIGHT, depthOrArrayLayers: 1 },\n );\n if (!write.ok) throw write.error;\n return texture.value;\n };\n\n transaction.add({\n kind: 'texture',\n create: () => {\n lambertTexture = createTable('extended-lighting-ltc-lambert', LTC_TABLES.lambert);\n return lambertTexture;\n },\n cleanup: (value) => {\n const destroyed = input.device?.destroyTexture(value);\n if (destroyed !== undefined && !destroyed.ok) throw destroyed.error;\n },\n });\n transaction.add({\n kind: 'texture',\n create: () => {\n ggxTexture = createTable('extended-lighting-ltc-ggx', LTC_TABLES.ggx);\n return ggxTexture;\n },\n cleanup: (value) => {\n const destroyed = input.device?.destroyTexture(value);\n if (destroyed !== undefined && !destroyed.ok) throw destroyed.error;\n },\n });\n\n const committed = await transaction.commit();\n if (!committed.ok)\n return failure(committed.error.primary.expected, committed.error.primary.message);\n if (lambertTexture === undefined || ggxTexture === undefined) {\n return failure('two LTC textures', 'the transaction committed without both tables');\n }\n return ok({\n topology: EXTENDED_LIGHTING_TOPOLOGY,\n generation: input.scope.generation,\n scope: input.scope,\n lambertTexture,\n ggxTexture,\n tableCount: 2,\n uploadCount: 2,\n });\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport type {\n TemporalFrameBeginInput,\n TemporalFrameCandidate,\n TemporalFrameConsumerId,\n TemporalFrameCoordinator,\n TemporalFrameError,\n TemporalFramePhases,\n TemporalFrameReceipt,\n TemporalFrameStage,\n} from '../temporal/frame-coordinator';\nimport type {\n SsrHistoryCandidate,\n SsrHistoryError,\n SsrHistoryFailureStage,\n SsrHistoryInspection,\n SsrHistoryOwner,\n SsrHistoryResetReason,\n} from './history';\n\nexport interface SsrTemporalCandidate<T> {\n readonly temporal: TemporalFrameCandidate<T>;\n readonly history: SsrHistoryCandidate;\n}\nexport interface SsrTemporalExecutionError {\n readonly code: 'ssr-temporal-stage-failed';\n readonly expected: string;\n readonly hint: string;\n readonly detail: Readonly<{ readonly stage: TemporalFrameStage; readonly cause: unknown }>;\n}\nexport interface SsrTemporalInspection {\n readonly sharedEpoch: number;\n readonly consumerIds: readonly TemporalFrameConsumerId[];\n readonly coordinatorAttempt: 'none' | 'active' | 'committed' | 'aborted';\n readonly history: SsrHistoryInspection;\n}\nexport type SsrTemporalError = TemporalFrameError | SsrHistoryError | SsrTemporalExecutionError;\n\nfunction stageFromError(cause: unknown): TemporalFrameStage {\n if (typeof cause === 'object' && cause !== null && 'stage' in cause) {\n const stage = (cause as { readonly stage?: unknown }).stage;\n if (stage === 'build' || stage === 'encode' || stage === 'finish' || stage === 'submit') {\n return stage;\n }\n }\n return 'submit';\n}\nfunction coordinatorInput<T>(input: TemporalFrameBeginInput<T>): TemporalFrameBeginInput<T> {\n const consumerIds = input.consumerIds?.includes('ssr')\n ? input.consumerIds\n : [...(input.consumerIds ?? []), 'ssr' as const];\n return { ...input, temporalDemand: true, consumerIds };\n}\nfunction resetCoordinator<T>(\n coordinator: TemporalFrameCoordinator<T>,\n reason: SsrHistoryResetReason,\n): void {\n switch (reason) {\n case 'first-enable':\n case 'disable':\n return;\n case 'resize':\n coordinator.reset('resize');\n return;\n case 'camera-cut':\n coordinator.reset('cut');\n return;\n case 'history-version':\n coordinator.reset('camera-switch');\n return;\n case 'coverage-loss':\n coordinator.reset('detach');\n return;\n case 'reflection-generation':\n case 'device-recovery':\n coordinator.reset('device-generation');\n return;\n }\n}\n\n/** Stages SSR history beside the shared renderer transaction without owning submit or epochs. */\nexport class SsrTemporalConsumer<T = unknown> {\n constructor(\n private readonly coordinator: TemporalFrameCoordinator<T>,\n readonly history: SsrHistoryOwner,\n ) {}\n begin(\n input: TemporalFrameBeginInput<T>,\n ): Result<SsrTemporalCandidate<T>, TemporalFrameError | SsrHistoryError> {\n const history = this.history.beginFrame();\n if (!history.ok) return history;\n const temporal = this.coordinator.begin(coordinatorInput(input));\n if (!temporal.ok) {\n this.history.abortFrame(history.value, 'build');\n return temporal;\n }\n return ok({ temporal: temporal.value, history: history.value });\n }\n commit(\n candidate: SsrTemporalCandidate<T>,\n ): Result<TemporalFrameReceipt<T>, TemporalFrameError | SsrHistoryError> {\n const committed = this.coordinator.commit(candidate.temporal);\n if (!committed.ok) {\n this.history.abortFrame(candidate.history, 'submit');\n return committed;\n }\n const history = this.history.commitFrame(candidate.history);\n if (!history.ok) return history;\n return committed;\n }\n abort(candidate: SsrTemporalCandidate<T>, stage: SsrHistoryFailureStage): void {\n this.history.abortFrame(candidate.history, stage);\n this.coordinator.abort(candidate.temporal, stage);\n }\n run(\n input: TemporalFrameBeginInput<T>,\n phases: TemporalFramePhases<T>,\n ): Result<TemporalFrameReceipt<T>, SsrTemporalError> {\n const started = this.begin(input);\n if (!started.ok) return started;\n const candidate = started.value;\n try {\n const built = phases.build();\n phases.encode(built);\n phases.finish();\n phases.submit();\n } catch (cause) {\n const stage = stageFromError(cause);\n this.abort(candidate, stage);\n return err({\n code: 'ssr-temporal-stage-failed',\n expected: `SSR temporal ${stage} succeeds before commit`,\n hint: 'inspect the owned stage failure and retry without promoting the candidate',\n detail: { stage, cause },\n });\n }\n return this.commit(candidate);\n }\n reset(reason: SsrHistoryResetReason): void {\n this.history.reset(reason);\n resetCoordinator(this.coordinator, reason);\n }\n retireAfterFence(\n queue: Parameters<SsrHistoryOwner['retireAfterFence']>[0],\n onFailure: Parameters<SsrHistoryOwner['retireAfterFence']>[1],\n ): void {\n this.history.retireAfterFence(queue, onFailure);\n }\n inspect(): SsrTemporalInspection {\n const temporal = this.coordinator.inspect();\n return Object.freeze({\n sharedEpoch: temporal.epoch,\n consumerIds: temporal.consumerIds,\n coordinatorAttempt: temporal.attempt,\n history: this.history.inspect(),\n });\n }\n}\nexport function createSsrTemporalConsumer<T>(\n coordinator: TemporalFrameCoordinator<T>,\n history: SsrHistoryOwner,\n): SsrTemporalConsumer<T> {\n return new SsrTemporalConsumer(coordinator, history);\n}\n"]}
@@ -264,13 +264,13 @@ export declare function createPbrSkinMeshBindGroupEntries(meshBuffer: Buffer, me
264
264
  export declare function pbrSkinMeshDynamicOffsets(meshOffset: number, paletteOffset: number): readonly [number, number, number];
265
265
  /**
266
266
  * Build a stand-alone 7-entry unlit material BGL. Round-4 D-5 keeps unlit
267
- * material BG isolated from Skylight binding 7..13 -- unlit demos do not
267
+ * material BG isolated from Skylight binding 7..12 -- unlit demos do not
268
268
  * pay for IBL state. The unlit pipeline still binds material at slot 1,
269
269
  * just with a 7-entry layout.
270
270
  *
271
271
  * Note: at the moment the runtime still routes both unlit + standard
272
272
  * through a single 14-entry pipeline layout; the unlit material BG
273
- * carries fallback identity resources at binding 7..13. This factory is
273
+ * carries fallback identity resources at binding 7..12. This factory is
274
274
  * exported as a future-proof seam for the moment when unlit demos own
275
275
  * their own pipeline layout (t57 (e) test pins the contract today so the
276
276
  * eventual split has a green target).
@@ -327,7 +327,7 @@ export declare const SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET = "";
327
327
  *
328
328
  * Three groups by derivation source:
329
329
  * 1. Shader-derived (paramSchema reflection + injection chain):
330
- * - `'pbr-material-merged'` — derived user region + Skylight 7 + transmission 2
330
+ * - `'pbr-material-merged'` — derived user region + Skylight 6 + transmission 2
331
331
  * - `'unlit-material'` — 7 entries: base PBR material only (no inject)
332
332
  * - `'hdrp-7-slot'` — 7 entries (binding 0 + 3..8): HDRP cluster + SSAO group(2) BGL
333
333
  * 2. Caps-driven literal shapes (no shader):
@@ -1 +1 @@
1
- {"version":3,"file":"pbr-pipeline.d.ts","sourceRoot":"","sources":["../src/pbr-pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pbr-pipeline.d.ts","sourceRoot":"","sources":["../src/pbr-pipeline.ts"],"names":[],"mappings":"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"}