@forgeax/engine-render 0.1.32 → 0.1.34
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.
- package/README.md +1374 -142
- package/dist/assembly/analytic-fog-registration.d.ts +3 -0
- package/dist/assembly/analytic-fog-registration.d.ts.map +1 -0
- package/dist/assembly/backend-contract.d.ts +2 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -1
- package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
- package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
- package/dist/assembly/canvas-draw-guard.d.ts +3 -0
- package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
- package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
- package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
- package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
- package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
- package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
- package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
- package/dist/assembly/factory.d.ts +1 -1
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/fxaa-registration.d.ts +4 -0
- package/dist/assembly/fxaa-registration.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +3 -3
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/lod-observation.d.ts +4 -0
- package/dist/assembly/lod-observation.d.ts.map +1 -0
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
- package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
- package/dist/assembly/material-shader-policy.d.ts +16 -2
- package/dist/assembly/material-shader-policy.d.ts.map +1 -1
- package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
- package/dist/assembly/motion-blur-registration.d.ts +3 -0
- package/dist/assembly/motion-blur-registration.d.ts.map +1 -0
- package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
- package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
- package/dist/assembly/render-feature-post-processes.d.ts +6 -0
- package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
- package/dist/assembly/renderer-facade.d.ts.map +1 -1
- package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
- package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
- package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
- package/dist/assembly/renderer-inspection.d.ts +11 -0
- package/dist/assembly/renderer-inspection.d.ts.map +1 -1
- package/dist/assembly/temporal-post-process-prewarm.d.ts +13 -0
- package/dist/assembly/temporal-post-process-prewarm.d.ts.map +1 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-ready-contract.d.ts +4 -3
- package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -1
- package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
- package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready.d.ts +2 -2
- package/dist/assembly/webgpu-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
- package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer.d.ts +1 -1
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
- package/dist/authoring.mjs +1 -1
- package/dist/barrel-distortion.d.ts +47 -0
- package/dist/barrel-distortion.d.ts.map +1 -0
- package/dist/bloom-admission.d.ts +13 -0
- package/dist/bloom-admission.d.ts.map +1 -0
- package/dist/{chunk-PA5DRJNI.mjs → chunk-ELJFJ2BU.mjs} +2 -2
- package/dist/chunk-ELJFJ2BU.mjs.map +1 -0
- package/dist/{chunk-JCIRYQ4V.mjs → chunk-HEB564WF.mjs} +10 -4
- package/dist/chunk-HEB564WF.mjs.map +1 -0
- package/dist/{chunk-JRIPCMYC.mjs → chunk-MKDIT2EM.mjs} +1584 -375
- package/dist/chunk-MKDIT2EM.mjs.map +1 -0
- package/dist/{chunk-S665NJNF.mjs → chunk-OCDLEI6I.mjs} +3 -3
- package/dist/{chunk-S665NJNF.mjs.map → chunk-OCDLEI6I.mjs.map} +1 -1
- package/dist/chunk-ODZWR6JQ.mjs +4927 -0
- package/dist/chunk-ODZWR6JQ.mjs.map +1 -0
- package/dist/{chunk-DRR7D3KX.mjs → chunk-SHFUFJ5N.mjs} +192 -18
- package/dist/chunk-SHFUFJ5N.mjs.map +1 -0
- package/dist/{chunk-4NNZQCL3.mjs → chunk-UI5SFODX.mjs} +223 -277
- package/dist/chunk-UI5SFODX.mjs.map +1 -0
- package/dist/{chunk-GWCEMDVR.mjs → chunk-UINHLCZA.mjs} +787 -80
- package/dist/chunk-UINHLCZA.mjs.map +1 -0
- package/dist/{chunk-6TFBXLRJ.mjs → chunk-WEX45HKH.mjs} +222 -337
- package/dist/chunk-WEX45HKH.mjs.map +1 -0
- package/dist/cloud/density.d.ts +55 -0
- package/dist/cloud/density.d.ts.map +1 -0
- package/dist/cloud/extract.d.ts +25 -0
- package/dist/cloud/extract.d.ts.map +1 -0
- package/dist/cloud/feature.d.ts +57 -0
- package/dist/cloud/feature.d.ts.map +1 -0
- package/dist/cloud/frame-context.d.ts +8 -0
- package/dist/cloud/frame-context.d.ts.map +1 -0
- package/dist/cloud/inspection.d.ts +59 -0
- package/dist/cloud/inspection.d.ts.map +1 -0
- package/dist/cloud/optics.d.ts +56 -0
- package/dist/cloud/optics.d.ts.map +1 -0
- package/dist/cloud/parameters.d.ts +73 -0
- package/dist/cloud/parameters.d.ts.map +1 -0
- package/dist/cloud/resources.d.ts +60 -0
- package/dist/cloud/resources.d.ts.map +1 -0
- package/dist/cloud/shadow.d.ts +42 -0
- package/dist/cloud/shadow.d.ts.map +1 -0
- package/dist/cloud/temporal.d.ts +74 -0
- package/dist/cloud/temporal.d.ts.map +1 -0
- package/dist/components/atmosphere.d.ts +2 -0
- package/dist/components/atmosphere.d.ts.map +1 -1
- package/dist/components/barrel-distortion.d.ts +13 -0
- package/dist/components/barrel-distortion.d.ts.map +1 -0
- package/dist/components/camera.d.ts +20 -4
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/cloud-layer.d.ts +29 -0
- package/dist/components/cloud-layer.d.ts.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/instances.d.ts +20 -6
- package/dist/components/instances.d.ts.map +1 -1
- package/dist/components/mesh-filter.d.ts +6 -5
- package/dist/components/mesh-filter.d.ts.map +1 -1
- package/dist/components/motion-blur.d.ts +1 -0
- package/dist/components/motion-blur.d.ts.map +1 -1
- package/dist/construct-renderer.d.ts +1 -1
- package/dist/construct-renderer.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +9751 -3528
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +6 -0
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/dynamic-geometry.d.ts +5 -1
- package/dist/dynamic-geometry.d.ts.map +1 -1
- package/dist/environment/analytic-fog.d.ts +6 -0
- package/dist/environment/analytic-fog.d.ts.map +1 -0
- package/dist/errors/cloud.d.ts +59 -0
- package/dist/errors/cloud.d.ts.map +1 -0
- package/dist/errors/render.d.ts +23 -5
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/examples/single-layer-medium-surface.d.ts +47 -0
- package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
- package/dist/extract/camera.d.ts.map +1 -1
- package/dist/extract/contracts.d.ts +12 -1
- package/dist/extract/contracts.d.ts.map +1 -1
- package/dist/extract/environment.d.ts +2 -0
- package/dist/extract/environment.d.ts.map +1 -1
- package/dist/features/barrel-distortion.d.ts +29 -0
- package/dist/features/barrel-distortion.d.ts.map +1 -0
- package/dist/features/error-reporting.d.ts +17 -0
- package/dist/features/error-reporting.d.ts.map +1 -0
- package/dist/features/host.d.ts +15 -0
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/motion-blur/motion-blur-feature.d.ts +20 -2
- package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -1
- package/dist/features/motion-blur/motion-blur-params.d.ts +21 -0
- package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -1
- package/dist/features/motion-blur/motion-blur-runtime.d.ts +54 -0
- package/dist/features/motion-blur/motion-blur-runtime.d.ts.map +1 -0
- package/dist/features/plan.d.ts +15 -4
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +9 -5
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/render-graph-compute.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts +5 -0
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +1 -0
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/targets.d.ts +2 -0
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +44 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +15 -7
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-dirty-ranges.d.ts +11 -0
- package/dist/gpu-dirty-ranges.d.ts.map +1 -0
- package/dist/gpu-driven/batch-topology.d.ts +17 -0
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/material-artifacts.d.ts +6 -0
- package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
- package/dist/gpu-driven/prepared-draw.d.ts +7 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster-material.d.ts +178 -0
- package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
- package/dist/gpu-driven/production-raster.d.ts +50 -4
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/resource-allocation.d.ts +31 -0
- package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
- package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
- package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +35 -2
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +11 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +2 -2
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +10 -1
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +31 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +258 -8
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +178 -3
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instance-buffer-cache.d.ts +4 -4
- package/dist/instance-buffer-cache.d.ts.map +1 -1
- package/dist/instances.d.ts +49 -94
- package/dist/instances.d.ts.map +1 -1
- package/dist/internal.mjs +7 -7
- package/dist/pbr-pipeline.d.ts +19 -1
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
- package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
- package/dist/pipeline/standard-output/types.d.ts +4 -2
- package/dist/pipeline/standard-output/types.d.ts.map +1 -1
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +28 -19
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +1 -1
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +2 -2
- package/dist/plugin.d.ts.map +1 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
- package/dist/record/barrel-distortion-frame.d.ts +15 -0
- package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
- package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
- package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
- package/dist/record/fold-buckets.d.ts +95 -0
- package/dist/record/fold-buckets.d.ts.map +1 -0
- package/dist/record/fold-instance-buffer.d.ts +6 -0
- package/dist/record/fold-instance-buffer.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +1 -0
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +40 -3
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +14 -62
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/gpu-draw-receipts.d.ts +11 -0
- package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
- package/dist/record/gpu-timing.d.ts +8 -0
- package/dist/record/gpu-timing.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +21 -5
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +7 -1
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +13 -2
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +6 -5
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/motion-blur-receipt.d.ts +11 -0
- package/dist/record/motion-blur-receipt.d.ts.map +1 -0
- package/dist/record/probe-blend-buffer.d.ts +16 -0
- package/dist/record/probe-blend-buffer.d.ts.map +1 -0
- package/dist/record/recovery-pipeline.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +34 -31
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts +2 -0
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +6 -4
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +22 -2
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +11 -3
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/record/volume-params.d.ts +9 -0
- package/dist/record/volume-params.d.ts.map +1 -0
- package/dist/recovery/render-system-candidate.d.ts +10 -0
- package/dist/recovery/render-system-candidate.d.ts.map +1 -1
- package/dist/reflection/record-owner.d.ts.map +1 -1
- package/dist/render-contract.d.ts +66 -8
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +106 -3
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +3 -2
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +24 -10
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system-presentation.d.ts +23 -0
- package/dist/render-system-presentation.d.ts.map +1 -0
- package/dist/render-system-producer-roots.d.ts +10 -0
- package/dist/render-system-producer-roots.d.ts.map +1 -0
- package/dist/render-system-residency.d.ts +12 -0
- package/dist/render-system-residency.d.ts.map +1 -0
- package/dist/render-system.d.ts +26 -15
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/probe-blend.d.ts +27 -0
- package/dist/scene/probe-blend.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +14 -5
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/ssao-buffers.d.ts +9 -0
- package/dist/ssao-buffers.d.ts.map +1 -1
- package/dist/surface/dynamic-input.d.ts +133 -0
- package/dist/surface/dynamic-input.d.ts.map +1 -0
- package/dist/surface/gpu-driven.d.ts +41 -0
- package/dist/surface/gpu-driven.d.ts.map +1 -0
- package/dist/surface/submission-observation.d.ts +136 -0
- package/dist/surface/submission-observation.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
- package/dist/temporal/frame-coordinator.d.ts.map +1 -1
- package/dist/temporal/frame.d.ts +7 -0
- package/dist/temporal/frame.d.ts.map +1 -1
- package/dist/temporal/gpu.d.ts +13 -1
- package/dist/temporal/gpu.d.ts.map +1 -1
- package/dist/temporal/index.mjs +5 -5
- package/dist/temporal/inspection.d.ts.map +1 -1
- package/dist/temporal/standard-scene-data.d.ts.map +1 -1
- package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
- package/dist/temporal/view.d.ts +6 -1
- package/dist/temporal/view.d.ts.map +1 -1
- package/dist/transmission/single-layer-medium.d.ts +89 -0
- package/dist/transmission/single-layer-medium.d.ts.map +1 -0
- package/dist/typed-render-graph-primitives.d.ts +24 -9
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/volume/component.d.ts +9 -5
- package/dist/volume/component.d.ts.map +1 -1
- package/dist/volume/extract.d.ts +1 -1
- package/dist/volume/extract.d.ts.map +1 -1
- package/dist/volume/inspection.d.ts +2 -0
- package/dist/volume/inspection.d.ts.map +1 -1
- package/dist/volume/passes.d.ts +4 -1
- package/dist/volume/passes.d.ts.map +1 -1
- package/dist/volume/resources.d.ts.map +1 -1
- package/dist/volume/temporal.d.ts +3 -1
- package/dist/volume/temporal.d.ts.map +1 -1
- package/package.json +22 -21
- package/src/__tests__/analytic-fog-graph.unit.test.ts +199 -0
- package/src/__tests__/analytic-fog-optics.unit.test.ts +38 -0
- package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
- package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
- package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
- package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
- package/src/__tests__/bloom-exact-zero.unit.test.ts +112 -18
- package/src/__tests__/bloom-lifecycle.integration.test.ts +17 -4
- package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
- package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
- package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
- package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
- package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +20 -0
- package/src/__tests__/environment-fog-lanes.integration.test.ts +14 -0
- package/src/__tests__/environment-selection.unit.test.ts +12 -0
- package/src/__tests__/factory-contract.integration.test.ts +626 -113
- package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
- package/src/__tests__/frame-camera-selection.unit.test.ts +39 -1
- package/src/__tests__/frame-plan-contract.unit.test.ts +2 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +14 -3
- package/src/__tests__/gpu-dirty-ranges.unit.test.ts +22 -0
- package/src/__tests__/gpu-driven-baseline.characterization.test.ts +16 -3
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +12 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +2 -1
- package/src/__tests__/gpu-driven-material-artifacts.unit.test.ts +143 -0
- package/src/__tests__/gpu-driven-pbr.dawn.test.ts +2 -2
- package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
- package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +7 -6
- package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +1 -1
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +103 -4
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
- package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
- package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
- package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
- package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
- package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
- package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +12 -0
- package/src/__tests__/gpu-scene.unit.test.ts +210 -9
- package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
- package/src/__tests__/instances-culling.integration.test.ts +10 -36
- package/src/__tests__/instances-store.unit.test.ts +105 -238
- package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
- package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +146 -0
- package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
- package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
- package/src/__tests__/mesh-submission-lifetime.unit.test.ts +31 -0
- package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
- package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
- package/src/__tests__/motion-blur-compute.dawn.test.ts +589 -0
- package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
- package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
- package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
- package/src/__tests__/physical-clearcoat.integration.test.ts +58 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +21 -0
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
- package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +86 -0
- package/src/__tests__/probe-bindings.unit.test.ts +582 -1
- package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
- package/src/__tests__/public-surface.test-d.ts +8 -0
- package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
- package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +9 -0
- package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
- package/src/__tests__/render-feature-error-reporting.unit.test.ts +44 -0
- package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
- package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
- package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +23 -0
- package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
- package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
- package/src/__tests__/render-scene-temporal-retry.unit.test.ts +37 -6
- package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
- package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
- package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +41 -7
- package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +33 -11
- package/src/__tests__/resource-allocation.unit.test.ts +123 -0
- package/src/__tests__/shader-manifest-fixture.ts +4 -4
- package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
- package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
- package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +17 -0
- package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
- package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
- package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
- package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
- package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
- package/src/__tests__/standard-lighting-write.unit.test.ts +2 -1
- package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
- package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
- package/src/__tests__/standard-pipeline.dawn.test.ts +1 -1
- package/src/__tests__/standard-pipeline.integration.test.ts +200 -9
- package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
- package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
- package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
- package/src/__tests__/temporal-performance.integration.test.ts +3 -3
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +10 -0
- package/src/__tests__/temporal-view.unit.test.ts +2 -1
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +20 -4
- package/src/__tests__/visibility-instances.integration.test.ts +7 -19
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
- package/src/__tests__/volume-optics-oracle.unit.test.ts +7 -3
- package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +189 -15
- package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
- package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
- package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +558 -68
- package/src/__tests__/volumetric-fog-temporal.unit.test.ts +27 -0
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +23 -5
- package/src/assembly/analytic-fog-registration.ts +14 -0
- package/src/assembly/backend-contract.ts +30 -0
- package/src/assembly/barrel-distortion-inspection.ts +22 -0
- package/src/assembly/canvas-draw-guard.ts +11 -0
- package/src/assembly/cloud-shadow-entry.ts +22 -0
- package/src/assembly/dynamic-geometry-host.ts +65 -37
- package/src/assembly/dynamic-geometry-runtime.ts +7 -1
- package/src/assembly/factory.ts +2 -30
- package/src/assembly/fxaa-registration.ts +17 -0
- package/src/assembly/host-contract.ts +3 -3
- package/src/assembly/lod-observation.ts +12 -0
- package/src/assembly/material/assembly.ts +25 -13
- package/src/assembly/material/pipeline-helpers.ts +53 -12
- package/src/assembly/material-shader-policy.ts +55 -0
- package/src/assembly/material-shader-prewarm.ts +21 -10
- package/src/assembly/motion-blur-registration.ts +17 -0
- package/src/assembly/recovery/device-loss-fanout.ts +13 -0
- package/src/assembly/recovery/renderer-recover.ts +41 -18
- package/src/assembly/render-feature-post-processes.ts +54 -0
- package/src/assembly/renderer-facade.ts +6 -1
- package/src/assembly/renderer-feature-inspection.ts +8 -2
- package/src/assembly/renderer-frame-transaction.ts +23 -0
- package/src/assembly/renderer-inspection.ts +28 -0
- package/src/assembly/skin-palette-owner.ts +1 -1
- package/src/assembly/temporal-post-process-prewarm.ts +40 -0
- package/src/assembly/webgpu-pbr-ready.ts +9 -1
- package/src/assembly/webgpu-ready-contract.ts +8 -3
- package/src/assembly/webgpu-ready-per-pass.ts +104 -0
- package/src/assembly/webgpu-ready.ts +296 -306
- package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
- package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
- package/src/assembly/webgpu-renderer.ts +228 -281
- package/src/assembly/webgpu-vertex-layouts.ts +1 -1
- package/src/barrel-distortion.ts +247 -0
- package/src/bloom-admission.ts +21 -0
- package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
- package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
- package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
- package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
- package/src/cloud/density.ts +600 -0
- package/src/cloud/extract.ts +110 -0
- package/src/cloud/feature.ts +1810 -0
- package/src/cloud/frame-context.ts +42 -0
- package/src/cloud/inspection.ts +130 -0
- package/src/cloud/optics.ts +285 -0
- package/src/cloud/parameters.ts +255 -0
- package/src/cloud/resources.ts +122 -0
- package/src/cloud/shadow.ts +167 -0
- package/src/cloud/temporal.ts +226 -0
- package/src/components/__tests__/motion-blur.unit.test.ts +1 -0
- package/src/components/atmosphere.ts +4 -0
- package/src/components/barrel-distortion.ts +46 -0
- package/src/components/camera.ts +66 -10
- package/src/components/cloud-layer.ts +47 -0
- package/src/components/index.ts +2 -0
- package/src/components/instances.ts +18 -45
- package/src/components/mesh-filter.ts +11 -9
- package/src/components/motion-blur.ts +1 -0
- package/src/components/sprite-instances.ts +1 -1
- package/src/construct-renderer.ts +1 -1
- package/src/device/gpu-residency.ts +56 -12
- package/src/dynamic-geometry.ts +12 -1
- package/src/environment/analytic-fog.ts +44 -0
- package/src/environment/background.ts +2 -2
- package/src/errors/cloud.ts +103 -0
- package/src/errors/render.ts +58 -8
- package/src/examples/single-layer-medium-surface.ts +59 -0
- package/src/extract/camera.ts +35 -8
- package/src/extract/contracts.ts +12 -0
- package/src/extract/environment.ts +4 -0
- package/src/features/barrel-distortion.ts +172 -0
- package/src/features/error-reporting.ts +98 -0
- package/src/features/host.ts +138 -24
- package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +111 -1
- package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +58 -3
- package/src/features/motion-blur/motion-blur-feature.ts +1519 -15
- package/src/features/motion-blur/motion-blur-params.ts +70 -2
- package/src/features/motion-blur/motion-blur-runtime.ts +176 -0
- package/src/features/plan.ts +33 -8
- package/src/features/prepared-gpu-work.ts +86 -35
- package/src/features/render-graph-compute.ts +13 -5
- package/src/features/render-graph-contribution.ts +11 -0
- package/src/features/render-graph-raster.ts +45 -3
- package/src/features/targets.ts +66 -0
- package/src/features/types.ts +47 -0
- package/src/fullscreen-post-process-pass.ts +41 -9
- package/src/gpu-dirty-ranges.ts +48 -0
- package/src/gpu-driven/batch-topology.ts +53 -0
- package/src/gpu-driven/material-artifacts.ts +35 -32
- package/src/gpu-driven/prepared-draw.ts +27 -14
- package/src/gpu-driven/production-raster-material.ts +1894 -0
- package/src/gpu-driven/production-raster.ts +904 -787
- package/src/gpu-driven/resource-allocation.ts +142 -0
- package/src/gpu-driven/shadow-ownership.ts +71 -0
- package/src/gpu-driven/view-gpu.ts +181 -10
- package/src/gpu-scene.ts +259 -101
- package/src/hdrp-buffers.ts +4 -3
- package/src/ibl/skylight-bind-group.ts +49 -7
- package/src/index.ts +228 -9
- package/src/inspection-types.ts +222 -2
- package/src/instance-buffer-cache.ts +4 -4
- package/src/instances.ts +151 -492
- package/src/pbr-pipeline.ts +219 -13
- package/src/pipeline/single-layer-medium-passes.ts +267 -0
- package/src/pipeline/standard-forward-lane.ts +313 -57
- package/src/pipeline/standard-output/graph.ts +8 -2
- package/src/pipeline/standard-output/types.ts +12 -1
- package/src/pipeline/standard-pipeline.ts +291 -18
- package/src/pipeline/standard-post.ts +397 -102
- package/src/pipeline-builder.ts +1 -1
- package/src/pipeline-spec.ts +5 -5
- package/src/plugin.ts +4 -0
- package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
- package/src/points-lines/__tests__/view-ubo.unit.test.ts +2 -1
- package/src/prepare/prepared-graphics-resolver.ts +2 -0
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +1 -1
- package/src/record/__tests__/temporal-payload.unit.test.ts +3 -2
- package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
- package/src/record/barrel-distortion-frame.ts +110 -0
- package/src/record/dynamic-geometry-consumption.ts +39 -9
- package/src/record/fold-buckets.ts +852 -0
- package/src/record/fold-instance-buffer.ts +51 -0
- package/src/record/frame-lighting.ts +36 -2
- package/src/record/frame-snapshot.ts +44 -4
- package/src/record/frame-targets.ts +10 -6
- package/src/record/frame.ts +373 -1099
- package/src/record/gpu-draw-receipts.ts +38 -0
- package/src/record/gpu-timing.ts +48 -5
- package/src/record/main-pass-geometry.ts +281 -83
- package/src/record/main-pass-material.ts +66 -4
- package/src/record/main-pass-sprite-draws.ts +13 -66
- package/src/record/main-pass.ts +156 -20
- package/src/record/mesh-ssbo.ts +43 -6
- package/src/record/motion-blur-receipt.ts +91 -0
- package/src/record/probe-blend-buffer.ts +180 -0
- package/src/record/recovery-pipeline.ts +35 -3
- package/src/record/render-context.ts +51 -31
- package/src/record/shadow-pass.ts +36 -2
- package/src/record/skybox-post-pass.ts +150 -200
- package/src/record/typed-frame-graph.ts +824 -44
- package/src/record/view-ubo.ts +26 -3
- package/src/record/volume-params.ts +225 -0
- package/src/recovery/render-system-candidate.ts +257 -52
- package/src/reflection/record-owner.ts +7 -3
- package/src/render-contract.ts +71 -8
- package/src/render-graph-primitives.ts +7 -1
- package/src/render-pipeline.ts +136 -1
- package/src/render-system-extract-tail.ts +72 -60
- package/src/render-system-extract.ts +117 -87
- package/src/render-system-presentation.ts +56 -0
- package/src/render-system-producer-roots.ts +96 -0
- package/src/render-system-residency.ts +159 -0
- package/src/render-system.ts +601 -482
- package/src/scene/probe-blend.ts +96 -4
- package/src/scene/render-scene.ts +431 -281
- package/src/ssao-buffers.ts +95 -2
- package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
- package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
- package/src/surface/dynamic-input.ts +658 -0
- package/src/surface/gpu-driven.ts +147 -0
- package/src/surface/submission-observation.ts +517 -0
- package/src/systems/skin-palette-allocator.ts +4 -1
- package/src/temporal/__tests__/temporal-frame-transaction.unit.test.ts +36 -0
- package/src/temporal/frame-coordinator.ts +8 -1
- package/src/temporal/frame.ts +20 -0
- package/src/temporal/gpu.ts +101 -17
- package/src/temporal/inspection.ts +7 -1
- package/src/temporal/standard-scene-data.ts +5 -0
- package/src/temporal/target-coverage-attachment.ts +4 -0
- package/src/temporal/view.ts +13 -2
- package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
- package/src/transmission/single-layer-medium.ts +322 -0
- package/src/typed-render-graph-primitives.ts +191 -50
- package/src/volume/component.ts +10 -10
- package/src/volume/extract.ts +11 -5
- package/src/volume/inspection.ts +3 -0
- package/src/volume/passes.ts +95 -8
- package/src/volume/resources.ts +2 -1
- package/src/volume/temporal.ts +11 -0
- package/dist/chunk-4NNZQCL3.mjs.map +0 -1
- package/dist/chunk-6TFBXLRJ.mjs.map +0 -1
- package/dist/chunk-DRR7D3KX.mjs.map +0 -1
- package/dist/chunk-GWCEMDVR.mjs.map +0 -1
- package/dist/chunk-JCIRYQ4V.mjs.map +0 -1
- package/dist/chunk-JRIPCMYC.mjs.map +0 -1
- package/dist/chunk-LULCA3OF.mjs +0 -1713
- package/dist/chunk-LULCA3OF.mjs.map +0 -1
- package/dist/chunk-PA5DRJNI.mjs.map +0 -1
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import type { CloudQuality } from '../components/cloud-layer';
|
|
2
|
+
|
|
3
|
+
export type CloudTemporalResetReason =
|
|
4
|
+
| 'authoring-generation'
|
|
5
|
+
| 'camera-cut'
|
|
6
|
+
| 'resize'
|
|
7
|
+
| 'recovery'
|
|
8
|
+
| 'time-discontinuity'
|
|
9
|
+
| 'cloud-shadow-revision'
|
|
10
|
+
| 'device-generation'
|
|
11
|
+
| 'history-missing'
|
|
12
|
+
| 'reprojection-outside'
|
|
13
|
+
| 'scene-depth-disocclusion';
|
|
14
|
+
|
|
15
|
+
export interface CloudTemporalSignature {
|
|
16
|
+
readonly sourceKey: string;
|
|
17
|
+
readonly viewId: string;
|
|
18
|
+
readonly authoringGeneration: number;
|
|
19
|
+
readonly cloudShadowRevision: number;
|
|
20
|
+
readonly cameraRevision: number;
|
|
21
|
+
readonly deviceGeneration: number;
|
|
22
|
+
readonly width: number;
|
|
23
|
+
readonly height: number;
|
|
24
|
+
readonly timeSeconds: number;
|
|
25
|
+
readonly quality: CloudQuality;
|
|
26
|
+
/** Scene-depth producer revision used to reject disoccluded history. */
|
|
27
|
+
readonly sceneDepthVersion?: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface CloudHistory {
|
|
31
|
+
readonly width: number;
|
|
32
|
+
readonly height: number;
|
|
33
|
+
readonly signature: string;
|
|
34
|
+
readonly temporal: CloudTemporalSignature;
|
|
35
|
+
readonly generation: number;
|
|
36
|
+
readonly valid: boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface CloudTemporalDecision {
|
|
40
|
+
readonly reset: boolean;
|
|
41
|
+
readonly reasons: readonly CloudTemporalResetReason[];
|
|
42
|
+
readonly signature: string;
|
|
43
|
+
readonly history: CloudHistory | undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface CloudTemporalFrame {
|
|
47
|
+
readonly signature: CloudTemporalSignature;
|
|
48
|
+
readonly history: CloudHistory | undefined;
|
|
49
|
+
readonly reset: boolean;
|
|
50
|
+
readonly reasons: readonly CloudTemporalResetReason[];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface CloudHistoryReprojectionInput {
|
|
54
|
+
readonly currentDepth: number;
|
|
55
|
+
readonly historyDepth: number;
|
|
56
|
+
readonly motion: readonly [number, number];
|
|
57
|
+
readonly currentPixel: readonly [number, number];
|
|
58
|
+
readonly historySize: readonly [number, number];
|
|
59
|
+
readonly depthTolerance?: number;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface CloudHistoryReprojection {
|
|
63
|
+
readonly accepted: boolean;
|
|
64
|
+
readonly historyUv: readonly [number, number];
|
|
65
|
+
readonly weight: number;
|
|
66
|
+
readonly reason: 'accepted' | 'outside' | 'depth-disocclusion';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function cloudTemporalSignature(input: CloudTemporalSignature): string {
|
|
70
|
+
return [
|
|
71
|
+
'cloud-temporal-v1',
|
|
72
|
+
input.viewId,
|
|
73
|
+
input.sourceKey,
|
|
74
|
+
input.authoringGeneration,
|
|
75
|
+
input.cloudShadowRevision,
|
|
76
|
+
input.cameraRevision,
|
|
77
|
+
input.deviceGeneration,
|
|
78
|
+
input.width,
|
|
79
|
+
input.height,
|
|
80
|
+
input.timeSeconds,
|
|
81
|
+
input.quality,
|
|
82
|
+
input.sceneDepthVersion ?? 0,
|
|
83
|
+
].join(':');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function sameLayout(left: CloudTemporalSignature, right: CloudTemporalSignature): boolean {
|
|
87
|
+
return left.viewId === right.viewId && left.width === right.width && left.height === right.height;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Compare the facts that make a cloud history safe to reuse. */
|
|
91
|
+
export function cloudTemporalResetReasons(
|
|
92
|
+
previous: CloudTemporalSignature | undefined,
|
|
93
|
+
next: CloudTemporalSignature,
|
|
94
|
+
options: { readonly cameraCut?: boolean; readonly recovery?: boolean } = {},
|
|
95
|
+
): readonly CloudTemporalResetReason[] {
|
|
96
|
+
if (previous === undefined) return ['history-missing'];
|
|
97
|
+
const reasons: CloudTemporalResetReason[] = [];
|
|
98
|
+
if (
|
|
99
|
+
previous.sourceKey !== next.sourceKey ||
|
|
100
|
+
previous.authoringGeneration !== next.authoringGeneration
|
|
101
|
+
) {
|
|
102
|
+
reasons.push('authoring-generation');
|
|
103
|
+
}
|
|
104
|
+
if (previous.cloudShadowRevision !== next.cloudShadowRevision)
|
|
105
|
+
reasons.push('cloud-shadow-revision');
|
|
106
|
+
if (previous.deviceGeneration !== next.deviceGeneration) reasons.push('device-generation');
|
|
107
|
+
if (
|
|
108
|
+
previous.sceneDepthVersion !== undefined &&
|
|
109
|
+
next.sceneDepthVersion !== undefined &&
|
|
110
|
+
previous.sceneDepthVersion !== next.sceneDepthVersion
|
|
111
|
+
) {
|
|
112
|
+
reasons.push('scene-depth-disocclusion');
|
|
113
|
+
}
|
|
114
|
+
if (!sameLayout(previous, next)) reasons.push('resize');
|
|
115
|
+
if (options.cameraCut === true || previous.cameraRevision !== next.cameraRevision)
|
|
116
|
+
reasons.push('camera-cut');
|
|
117
|
+
const dt = next.timeSeconds - previous.timeSeconds;
|
|
118
|
+
if (!Number.isFinite(dt) || dt < 0 || dt > 0.5) reasons.push('time-discontinuity');
|
|
119
|
+
if (options.recovery === true) reasons.push('recovery');
|
|
120
|
+
return Object.freeze(reasons);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function createCloudHistory(
|
|
124
|
+
signature: CloudTemporalSignature,
|
|
125
|
+
generation: number,
|
|
126
|
+
valid = false,
|
|
127
|
+
): CloudHistory {
|
|
128
|
+
return Object.freeze({
|
|
129
|
+
width: Math.max(1, Math.floor(signature.width)),
|
|
130
|
+
height: Math.max(1, Math.floor(signature.height)),
|
|
131
|
+
signature: cloudTemporalSignature(signature),
|
|
132
|
+
temporal: Object.freeze({ ...signature }),
|
|
133
|
+
generation,
|
|
134
|
+
valid,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Per-view histories are keyed by the renderer's view identity. */
|
|
139
|
+
export class CloudHistoryStore {
|
|
140
|
+
private readonly maxViews: number;
|
|
141
|
+
private readonly entries = new Map<
|
|
142
|
+
string,
|
|
143
|
+
{ readonly history: CloudHistory; readonly signature: CloudTemporalSignature }
|
|
144
|
+
>();
|
|
145
|
+
|
|
146
|
+
constructor(maxViews = 4) {
|
|
147
|
+
this.maxViews = Math.max(1, Math.floor(maxViews));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
begin(
|
|
151
|
+
signature: CloudTemporalSignature,
|
|
152
|
+
options: { readonly cameraCut?: boolean; readonly recovery?: boolean } = {},
|
|
153
|
+
): CloudTemporalDecision {
|
|
154
|
+
const key = signature.viewId;
|
|
155
|
+
const previousEntry = this.entries.get(key);
|
|
156
|
+
const previous = previousEntry?.history;
|
|
157
|
+
const reasons = cloudTemporalResetReasons(previousEntry?.signature, signature, options);
|
|
158
|
+
const reset = reasons.length > 0;
|
|
159
|
+
return Object.freeze({
|
|
160
|
+
reset,
|
|
161
|
+
reasons,
|
|
162
|
+
signature: cloudTemporalSignature(signature),
|
|
163
|
+
history: reset ? undefined : previous,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
commit(signature: CloudTemporalSignature, history: CloudHistory): void {
|
|
168
|
+
if (
|
|
169
|
+
history.width !== Math.max(1, Math.floor(signature.width)) ||
|
|
170
|
+
history.height !== Math.max(1, Math.floor(signature.height))
|
|
171
|
+
) {
|
|
172
|
+
this.entries.delete(signature.viewId);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
this.entries.set(signature.viewId, { history, signature: Object.freeze({ ...signature }) });
|
|
176
|
+
while (this.entries.size > this.maxViews) {
|
|
177
|
+
const oldest = this.entries.keys().next().value as string | undefined;
|
|
178
|
+
if (oldest === undefined) break;
|
|
179
|
+
this.entries.delete(oldest);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
reset(viewId?: string): void {
|
|
184
|
+
if (viewId === undefined) this.entries.clear();
|
|
185
|
+
else this.entries.delete(viewId);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
get(viewId: string): CloudHistory | undefined {
|
|
189
|
+
return this.entries.get(viewId)?.history;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
dispose(): void {
|
|
193
|
+
this.entries.clear();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** Project one current pixel into the previous cloud history. */
|
|
198
|
+
export function reprojectCloudHistory(
|
|
199
|
+
input: CloudHistoryReprojectionInput,
|
|
200
|
+
historyWeight = 0.9,
|
|
201
|
+
): CloudHistoryReprojection {
|
|
202
|
+
const width = Math.max(1, input.historySize[0] ?? 1);
|
|
203
|
+
const height = Math.max(1, input.historySize[1] ?? 1);
|
|
204
|
+
const uv: [number, number] = [
|
|
205
|
+
((input.currentPixel[0] ?? 0) - (input.motion[0] ?? 0)) / width,
|
|
206
|
+
((input.currentPixel[1] ?? 0) - (input.motion[1] ?? 0)) / height,
|
|
207
|
+
];
|
|
208
|
+
if (uv[0] < 0 || uv[0] > 1 || uv[1] < 0 || uv[1] > 1) {
|
|
209
|
+
return { accepted: false, historyUv: uv, weight: 0, reason: 'outside' };
|
|
210
|
+
}
|
|
211
|
+
const depthTolerance =
|
|
212
|
+
input.depthTolerance ?? Math.max(0.01, Math.abs(input.currentDepth) * 0.02);
|
|
213
|
+
if (
|
|
214
|
+
!Number.isFinite(input.currentDepth) ||
|
|
215
|
+
!Number.isFinite(input.historyDepth) ||
|
|
216
|
+
Math.abs(input.currentDepth - input.historyDepth) > depthTolerance
|
|
217
|
+
) {
|
|
218
|
+
return { accepted: false, historyUv: uv, weight: 0, reason: 'depth-disocclusion' };
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
accepted: true,
|
|
222
|
+
historyUv: uv,
|
|
223
|
+
weight: Math.min(0.99, Math.max(0, historyWeight)),
|
|
224
|
+
reason: 'accepted',
|
|
225
|
+
};
|
|
226
|
+
}
|
|
@@ -8,6 +8,7 @@ describe('MotionBlur component schema', () => {
|
|
|
8
8
|
shutterAngle: { type: 'f32', default: 180 },
|
|
9
9
|
maxRadiusPixels: { type: 'f32', default: 32 },
|
|
10
10
|
sampleCount: { type: 'f32', default: 8 },
|
|
11
|
+
targetFps: { type: 'f32', default: 60 },
|
|
11
12
|
});
|
|
12
13
|
expect(MotionBlur.fields).not.toHaveProperty('enabled');
|
|
13
14
|
});
|
|
@@ -7,4 +7,8 @@ export const Atmosphere = defineComponent('Atmosphere', {
|
|
|
7
7
|
mieCoefficient: { type: 'f32', default: 0.005 },
|
|
8
8
|
mieDirectionalG: { type: 'f32', default: 0.8 },
|
|
9
9
|
sunAngularRadius: { type: 'f32', default: 0.004675 },
|
|
10
|
+
/** Independent multiplier for the analytic circumsolar lobe. */
|
|
11
|
+
circumsolarStrength: { type: 'f32', default: 1 },
|
|
12
|
+
/** Relative angular width of the analytic circumsolar lobe. */
|
|
13
|
+
circumsolarWidth: { type: 'f32', default: 1 },
|
|
10
14
|
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { defineComponent, type SchemaOf, type ShapeOf } from '@forgeax/engine-ecs';
|
|
2
|
+
import { err, ok, type Result } from '@forgeax/engine-types';
|
|
3
|
+
import { BarrelDistortionInvalidParameterError } from '../errors/render';
|
|
4
|
+
|
|
5
|
+
/** Camera companion that applies the bounded first-order barrel model. */
|
|
6
|
+
export const BarrelDistortion = defineComponent('BarrelDistortion', {
|
|
7
|
+
strength: { type: 'f32', default: 0 },
|
|
8
|
+
centerX: { type: 'f32', default: 0.5 },
|
|
9
|
+
centerY: { type: 'f32', default: 0.5 },
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export type BarrelDistortionData = ShapeOf<SchemaOf<typeof BarrelDistortion>>;
|
|
13
|
+
|
|
14
|
+
const DEFAULT_BARREL_DISTORTION: BarrelDistortionData = Object.freeze({
|
|
15
|
+
strength: 0,
|
|
16
|
+
centerX: 0.5,
|
|
17
|
+
centerY: 0.5,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
function invalid(
|
|
21
|
+
field: 'strength' | 'centerX' | 'centerY',
|
|
22
|
+
value: number,
|
|
23
|
+
expected: string,
|
|
24
|
+
): BarrelDistortionInvalidParameterError {
|
|
25
|
+
return new BarrelDistortionInvalidParameterError({ field, value, expected });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Validate and detach camera-owned barrel authoring data. */
|
|
29
|
+
export function validateBarrelDistortionParameters(
|
|
30
|
+
input: Partial<BarrelDistortionData> | undefined,
|
|
31
|
+
): Result<BarrelDistortionData, BarrelDistortionInvalidParameterError> {
|
|
32
|
+
const value = input ?? {};
|
|
33
|
+
const strength = value.strength ?? DEFAULT_BARREL_DISTORTION.strength;
|
|
34
|
+
const centerX = value.centerX ?? DEFAULT_BARREL_DISTORTION.centerX;
|
|
35
|
+
const centerY = value.centerY ?? DEFAULT_BARREL_DISTORTION.centerY;
|
|
36
|
+
if (!Number.isFinite(strength) || strength < 0 || strength > 0.35) {
|
|
37
|
+
return err(invalid('strength', strength, 'finite and in [0, 0.35]'));
|
|
38
|
+
}
|
|
39
|
+
if (!Number.isFinite(centerX) || centerX < 0 || centerX > 1) {
|
|
40
|
+
return err(invalid('centerX', centerX, 'finite and in [0, 1]'));
|
|
41
|
+
}
|
|
42
|
+
if (!Number.isFinite(centerY) || centerY < 0 || centerY > 1) {
|
|
43
|
+
return err(invalid('centerY', centerY, 'finite and in [0, 1]'));
|
|
44
|
+
}
|
|
45
|
+
return ok(Object.freeze({ strength, centerX, centerY }));
|
|
46
|
+
}
|
package/src/components/camera.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
// @forgeax/engine-render - Camera (projection variant + ortho extension).
|
|
2
2
|
//
|
|
3
|
-
// Schema:
|
|
4
|
-
//
|
|
5
|
-
// quartet (left + right + bottom + top). The view matrix continues to be
|
|
6
|
-
// derived from the entity's Transform (AC-06 case B fires
|
|
3
|
+
// Schema: projection, output, Bloom, and lifecycle columns. The view matrix
|
|
4
|
+
// continues to be derived from the entity's Transform (AC-06 case B fires
|
|
7
5
|
// 'render-system-no-camera' when 0 such entities exist).
|
|
8
6
|
//
|
|
9
7
|
// Projection discriminator:
|
|
@@ -386,7 +384,7 @@ export function antialiasFromF32(value: number): Antialias {
|
|
|
386
384
|
*
|
|
387
385
|
* Two members:
|
|
388
386
|
* `'off'` - default; no bloom post-processing (zero-overhead opt-out path)
|
|
389
|
-
* `'on'` -
|
|
387
|
+
* `'on'` - five-level HDR extraction/downsample/tent-upsample pipeline
|
|
390
388
|
*
|
|
391
389
|
* Bloom is a discrete enum (0/1) — illegal values fail-fast with the closed
|
|
392
390
|
* CameraError contract (charter P3), matching antialiasFromF32 precedent.
|
|
@@ -398,6 +396,19 @@ export const BLOOM_DISABLED = 0;
|
|
|
398
396
|
/** Numeric encoding of bloom enabled (schema value for `bloom`). */
|
|
399
397
|
export const BLOOM_ENABLED = 1;
|
|
400
398
|
|
|
399
|
+
/** Bloom intensity is a linear HDR add-back multiplier. */
|
|
400
|
+
export const CAMERA_BLOOM_INTENSITY_MIN = 0;
|
|
401
|
+
export const CAMERA_BLOOM_INTENSITY_MAX = 8;
|
|
402
|
+
/** Bloom threshold is expressed in scene-linear Rec.709 luminance. */
|
|
403
|
+
export const CAMERA_BLOOM_THRESHOLD_MIN = 0;
|
|
404
|
+
export const CAMERA_BLOOM_THRESHOLD_MAX = 65504;
|
|
405
|
+
/** Soft-knee transition width relative to the threshold. */
|
|
406
|
+
export const CAMERA_BLOOM_SOFT_KNEE_MIN = 0;
|
|
407
|
+
export const CAMERA_BLOOM_SOFT_KNEE_MAX = 1;
|
|
408
|
+
/** Coarse pyramid contribution. This is a blend, not a blur radius. */
|
|
409
|
+
export const CAMERA_BLOOM_SCATTER_MIN = 0;
|
|
410
|
+
export const CAMERA_BLOOM_SCATTER_MAX = 0.95;
|
|
411
|
+
|
|
401
412
|
/**
|
|
402
413
|
* Map a `camera.bloom` numeric value to the closed `BloomEnabled` string-literal
|
|
403
414
|
* union. Invalid values fail-fast with structured error (charter P3).
|
|
@@ -414,6 +425,49 @@ export function bloomEnabledFromF32(value: number): BloomEnabled {
|
|
|
414
425
|
);
|
|
415
426
|
}
|
|
416
427
|
|
|
428
|
+
function validateBloomRange(field: string, value: number, min: number, max: number): void {
|
|
429
|
+
if (!Number.isFinite(value) || value < min || value > max) {
|
|
430
|
+
throw cameraError(
|
|
431
|
+
'camera-bloom-invalid',
|
|
432
|
+
field,
|
|
433
|
+
value,
|
|
434
|
+
`a finite value in [${min}, ${max}]`,
|
|
435
|
+
`set Camera.${field} to a finite value in [${min}, ${max}]`,
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/** Validate the complete Camera-owned Bloom contract at the extract boundary. */
|
|
441
|
+
export function validateCameraBloom(
|
|
442
|
+
bloom: number,
|
|
443
|
+
threshold: number,
|
|
444
|
+
intensity: number,
|
|
445
|
+
softKnee: number,
|
|
446
|
+
scatter: number,
|
|
447
|
+
): BloomEnabled {
|
|
448
|
+
const enabled = bloomEnabledFromF32(bloom);
|
|
449
|
+
validateBloomRange(
|
|
450
|
+
'bloomThreshold',
|
|
451
|
+
threshold,
|
|
452
|
+
CAMERA_BLOOM_THRESHOLD_MIN,
|
|
453
|
+
CAMERA_BLOOM_THRESHOLD_MAX,
|
|
454
|
+
);
|
|
455
|
+
validateBloomRange(
|
|
456
|
+
'bloomIntensity',
|
|
457
|
+
intensity,
|
|
458
|
+
CAMERA_BLOOM_INTENSITY_MIN,
|
|
459
|
+
CAMERA_BLOOM_INTENSITY_MAX,
|
|
460
|
+
);
|
|
461
|
+
validateBloomRange(
|
|
462
|
+
'bloomSoftKnee',
|
|
463
|
+
softKnee,
|
|
464
|
+
CAMERA_BLOOM_SOFT_KNEE_MIN,
|
|
465
|
+
CAMERA_BLOOM_SOFT_KNEE_MAX,
|
|
466
|
+
);
|
|
467
|
+
validateBloomRange('bloomScatter', scatter, CAMERA_BLOOM_SCATTER_MIN, CAMERA_BLOOM_SCATTER_MAX);
|
|
468
|
+
return enabled;
|
|
469
|
+
}
|
|
470
|
+
|
|
417
471
|
/**
|
|
418
472
|
* Camera projection parameters (perspective + orthographic variants) +
|
|
419
473
|
* tonemap trio (mode + exposure + whitePoint).
|
|
@@ -447,8 +501,9 @@ export function bloomEnabledFromF32(value: number): BloomEnabled {
|
|
|
447
501
|
* N>1 fires 'render-system-multi-camera' + uses first). Multi-viewport is
|
|
448
502
|
* OOS (see feat-future-multi-viewport). The orthographic path reuses the
|
|
449
503
|
* same near / far as the perspective path — both variants share the single
|
|
450
|
-
* Camera archetype (
|
|
451
|
-
* the `clearColor` array<f32,4> column
|
|
504
|
+
* Camera archetype (30 schema fields, including the Bloom controls, one
|
|
505
|
+
* historyVersion u32 column, the `clearColor` array<f32,4> column, and the
|
|
506
|
+
* `autoAspect` bool column).
|
|
452
507
|
*
|
|
453
508
|
* @example Perspective camera at (0, 0, 3) looking down -Z (zero-config tonemap):
|
|
454
509
|
* world.spawn(
|
|
@@ -514,7 +569,8 @@ export const Camera = defineComponent('Camera', {
|
|
|
514
569
|
bloom: { type: 'f32', default: 0 },
|
|
515
570
|
bloomThreshold: { type: 'f32', default: 1.0 },
|
|
516
571
|
bloomIntensity: { type: 'f32', default: 1.0 },
|
|
517
|
-
|
|
572
|
+
bloomSoftKnee: { type: 'f32', default: 0.5 },
|
|
573
|
+
bloomScatter: { type: 'f32', default: 0.7 },
|
|
518
574
|
// M1 target camera role: zero means this camera is eligible for display;
|
|
519
575
|
// non-zero shared targets are auxiliary producers whose views and receipt
|
|
520
576
|
// promotion remain owned by Renderer.
|
|
@@ -544,7 +600,7 @@ export const Camera = defineComponent('Camera', {
|
|
|
544
600
|
|
|
545
601
|
// ─── Camera POD type (derived from Camera token — single source, AC-07) ─────
|
|
546
602
|
//
|
|
547
|
-
// ShapeOf<SchemaOf<typeof Camera>> resolves the
|
|
603
|
+
// ShapeOf<SchemaOf<typeof Camera>> resolves the 30-field POD from the Camera
|
|
548
604
|
// token's schema, which is itself derived from Camera.fields[k].type (D-A7).
|
|
549
605
|
// This replaces the hand-maintained CameraDataPod interface — the field set
|
|
550
606
|
// lives exclusively in the Camera component definition above.
|
|
@@ -626,7 +682,7 @@ function cameraColorGradingColumns(
|
|
|
626
682
|
|
|
627
683
|
// ─── Camera factory functions (w13 SSOT refactoring) ─────────────────────
|
|
628
684
|
//
|
|
629
|
-
// Standalone factory functions that return
|
|
685
|
+
// Standalone factory functions that return 29-field CameraPod objects
|
|
630
686
|
// matching the Camera component column shape. Not static methods because
|
|
631
687
|
// TypeScript const-namespace merge is not supported, and Object.assign
|
|
632
688
|
// would break the Camera token's reference identity (archetype columns /
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { defineComponent, type SchemaOf, type ShapeOf } from '@forgeax/engine-ecs';
|
|
2
|
+
|
|
3
|
+
/** Closed quality lane for the renderer-owned procedural cloud producer. */
|
|
4
|
+
export type CloudQuality = 'low' | 'medium' | 'high';
|
|
5
|
+
|
|
6
|
+
export const CloudQualityValue = Object.freeze({
|
|
7
|
+
low: 0,
|
|
8
|
+
medium: 1,
|
|
9
|
+
high: 2,
|
|
10
|
+
} as const);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A single World-authored cloud layer.
|
|
14
|
+
*
|
|
15
|
+
* The component contains only source facts. Cache resolution, optical step
|
|
16
|
+
* counts, temporal history and GPU handles are derived by Render and never
|
|
17
|
+
* written back into ECS.
|
|
18
|
+
*/
|
|
19
|
+
export const CloudLayer = defineComponent('CloudLayer', {
|
|
20
|
+
/** Stable integer seed for the periodic 3D density field. */
|
|
21
|
+
seed: { type: 'u32', default: 1337 },
|
|
22
|
+
/** World-space lower edge of the layer, in metres. */
|
|
23
|
+
baseHeight: { type: 'f32', default: 120 },
|
|
24
|
+
/** World-space thickness of the layer, in metres. */
|
|
25
|
+
thickness: { type: 'f32', default: 80 },
|
|
26
|
+
/** Horizontal noise scale, in cycles per metre. */
|
|
27
|
+
scale: { type: 'f32', default: 0.004 },
|
|
28
|
+
/** Coverage threshold in [0, 1]. */
|
|
29
|
+
coverage: { type: 'f32', default: 0.48 },
|
|
30
|
+
/** Extinction multiplier in inverse metres. */
|
|
31
|
+
density: { type: 'f32', default: 1 },
|
|
32
|
+
/** World-space wind velocity in metres per second. */
|
|
33
|
+
wind: { type: 'array<f32, 3>', default: new Float32Array([8, 0, 2]) },
|
|
34
|
+
/** Quality controls cache resolution and bounded ray steps. */
|
|
35
|
+
quality: { type: 'f32', default: CloudQualityValue.medium },
|
|
36
|
+
/** Maximum world-space distance represented by the light-space shadow map. */
|
|
37
|
+
shadowRange: { type: 'f32', default: 512 },
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export type CloudLayerData = ShapeOf<SchemaOf<typeof CloudLayer>>;
|
|
41
|
+
|
|
42
|
+
export function cloudQualityFromF32(value: number): CloudQuality | undefined {
|
|
43
|
+
if (value === CloudQualityValue.low) return 'low';
|
|
44
|
+
if (value === CloudQualityValue.medium) return 'medium';
|
|
45
|
+
if (value === CloudQualityValue.high) return 'high';
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
package/src/components/index.ts
CHANGED
|
@@ -1,50 +1,23 @@
|
|
|
1
|
-
// @forgeax/engine-render - renderer-owned large instance association.
|
|
2
|
-
//
|
|
3
|
-
// The ECS component deliberately carries only a stable collection identity.
|
|
4
|
-
// Matrix bytes, revision, capacity, dirty ranges, GPU residency and fallback
|
|
5
|
-
// policy belong to InstanceCollectionStore, exposed from the same Renderer.
|
|
6
|
-
// This keeps large payloads out of the ECS managed BufferPool while retaining
|
|
7
|
-
// ordinary query and entity-lifetime semantics.
|
|
8
|
-
//
|
|
9
|
-
// Authoring example:
|
|
10
|
-
//
|
|
11
|
-
// const transforms = new Float32Array(instanceCount * 16);
|
|
12
|
-
// for (let index = 0; index < instanceCount; index += 1) {
|
|
13
|
-
// const offset = index * 16;
|
|
14
|
-
// transforms[offset] = 1;
|
|
15
|
-
// transforms[offset + 5] = 1;
|
|
16
|
-
// transforms[offset + 10] = 1;
|
|
17
|
-
// transforms[offset + 15] = 1;
|
|
18
|
-
// }
|
|
19
|
-
// const collection = renderer.instances.create({
|
|
20
|
-
// transforms,
|
|
21
|
-
// }).unwrap();
|
|
22
|
-
// world.spawn(
|
|
23
|
-
// { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
24
|
-
// { component: MeshRenderer, data: {} },
|
|
25
|
-
// { component: Instances, data: { collectionId: collection.collectionId } },
|
|
26
|
-
// );
|
|
27
|
-
//
|
|
28
|
-
// Updates stay on the renderer owner and publish one revision:
|
|
29
|
-
//
|
|
30
|
-
// renderer.instances.update(collection.collectionId, {
|
|
31
|
-
// start: 12,
|
|
32
|
-
// transforms: patch,
|
|
33
|
-
// });
|
|
34
|
-
//
|
|
35
|
-
// Render extraction snapshots the validated packed column-major matrices once
|
|
36
|
-
// per frame. Direct, GPU-driven and fallback lanes consume that same detached
|
|
37
|
-
// projection; callers never split one logical collection into ECS chunks.
|
|
38
|
-
|
|
39
1
|
import { defineComponent } from '@forgeax/engine-ecs';
|
|
40
|
-
import type { InstanceCollectionData } from '../instances';
|
|
41
2
|
|
|
42
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* World-owned local transforms for one explicit instanced renderable.
|
|
5
|
+
* Packed column-major mat4 values compose as entityWorld * instanceLocal.
|
|
6
|
+
* ECS owns copying, mutation and entity lifetime, including large arrays.
|
|
7
|
+
* Renderer extraction derives its own snapshot and GPU residency; neither
|
|
8
|
+
* authoring nor glTF SceneAsset lowering requires a Renderer identity.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const transforms = new Float32Array(20_000 * 16);
|
|
12
|
+
* for (let i = 0; i < 20_000; i++) {
|
|
13
|
+
* transforms[i * 16] = transforms[i * 16 + 5] =
|
|
14
|
+
* transforms[i * 16 + 10] = transforms[i * 16 + 15] = 1;
|
|
15
|
+
* }
|
|
16
|
+
* const entity = world.spawn({ component: Instances, data: { transforms } }).unwrap();
|
|
17
|
+
* world.set(entity, Instances, { transforms }).unwrap();
|
|
18
|
+
*/
|
|
43
19
|
export const Instances = defineComponent('Instances', {
|
|
44
|
-
|
|
20
|
+
transforms: { type: 'array<f32>' },
|
|
45
21
|
});
|
|
46
22
|
|
|
47
|
-
|
|
48
|
-
export type InstancesData = InstanceCollectionData;
|
|
49
|
-
|
|
50
|
-
export type { InstanceCollectionId } from '../instances';
|
|
23
|
+
export type InstancesData = { readonly transforms: Float32Array };
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
//
|
|
11
11
|
// AI users spawn with the assets-runtime constants `HANDLE_CUBE` /
|
|
12
12
|
// `HANDLE_TRIANGLE` (now branded `Handle<'MeshAsset','shared'>` to
|
|
13
|
-
// match the schema-derived shape)
|
|
14
|
-
//
|
|
13
|
+
// match the schema-derived shape). A loaded or custom MeshAsset payload is
|
|
14
|
+
// bound by allocating a World shared reference before publishing this field.
|
|
15
15
|
//
|
|
16
16
|
// Naming flavor: unity-style "MeshFilter / MeshRenderer" pair, but the forgeax
|
|
17
17
|
// pair does NOT mirror Unity's filter-toggle semantics - MeshFilter only
|
|
@@ -22,12 +22,13 @@
|
|
|
22
22
|
// query never matches -> entity is silently absent from the
|
|
23
23
|
// RenderableSnapshot[] (NO default-material fallback, NO onError fire);
|
|
24
24
|
// case B (MeshRenderer.material omitted at spawn) -> mid-grey
|
|
25
|
-
// defaultMaterialSnapshot fallback (no onError);
|
|
25
|
+
// defaultMaterialSnapshot fallback (no onError); an unbound scalar shared<T>
|
|
26
|
+
// field (slot 0) is also not a renderable; case C (non-zero material handle
|
|
26
27
|
// unresolved) -> RhiError 'asset-not-registered' (mirrors the
|
|
27
28
|
// MeshFilter.assetHandle dangling-ref path).
|
|
28
29
|
//
|
|
29
30
|
// charter mapping: proposition 1 (single import) + proposition 4 (explicit
|
|
30
|
-
// failure:
|
|
31
|
+
// failure: a non-zero unregistered handle fires onError 'asset-not-registered'
|
|
31
32
|
// with .detail = { assetHandle } + cross-asset brand mismatch is a TS
|
|
32
33
|
// compile-time error) + proposition 5 (consistent abstraction: the schema
|
|
33
34
|
// vocab `'shared<T>'` is the SSOT for AssetRegistry-owned handles across
|
|
@@ -39,12 +40,13 @@ import { defineComponent } from '@forgeax/engine-ecs';
|
|
|
39
40
|
* Mesh filter (geometry asset reference).
|
|
40
41
|
*
|
|
41
42
|
* `assetHandle` carries a `Handle<'MeshAsset', 'shared'>` (u32-stored)
|
|
42
|
-
* pointing
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
43
|
+
* pointing to a mesh payload in the current World shared-reference / builtin
|
|
44
|
+
* handle namespace. An omitted field defaults to slot `0`, the unbound
|
|
45
|
+
* sentinel; an entity with that value is not emitted as a renderable. Use the
|
|
46
|
+
* predefined constants `HANDLE_CUBE` / `HANDLE_TRIANGLE` for builtins and
|
|
47
|
+
* allocate a World shared reference for a loaded mesh payload.
|
|
46
48
|
*
|
|
47
|
-
* Error path: if
|
|
49
|
+
* Error path: if a non-zero handle is not registered at draw time, RenderSystem
|
|
48
50
|
* fires `Renderer.onError` with
|
|
49
51
|
* `RhiError({ code: 'asset-not-registered', detail: { assetHandle } })`
|
|
50
52
|
* and skips this entity (other entities continue rendering; charter
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
// composes per instance:
|
|
42
42
|
// world_position[i] = entity_world * instances_local[i] * vertex_position
|
|
43
43
|
// `SpriteInstances.transforms[i*16..i*16+15]` is interpreted as a local-
|
|
44
|
-
// space transform under the entity,
|
|
44
|
+
// space transform under the entity, exactly like `Instances.transforms`.
|
|
45
45
|
// Set the entity's `Transform` to identity to make `instances_local[i]`
|
|
46
46
|
// directly world-space.
|
|
47
47
|
//
|
|
@@ -14,7 +14,7 @@ export type {
|
|
|
14
14
|
RhiBackendInstrumentation,
|
|
15
15
|
RhiBackendPack,
|
|
16
16
|
} from './assembly/backend-contract';
|
|
17
|
-
export { EngineEnvironmentError } from './assembly/backend-contract';
|
|
17
|
+
export { EngineEnvironmentError, loadRhiPack } from './assembly/backend-contract';
|
|
18
18
|
export type { RendererLegacyHostAdapter } from './assembly/host-contract';
|
|
19
19
|
export type { BundlerOptions };
|
|
20
20
|
|