@forgeax/engine-render 0.1.19 → 0.1.21
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 +215 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/assembly/device-feature-admission.d.ts +18 -0
- package/dist/assembly/device-feature-admission.d.ts.map +1 -0
- package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
- package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +34 -20
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +9 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/render-target-host.d.ts +46 -0
- package/dist/assembly/render-target-host.d.ts.map +1 -0
- package/dist/assets/render-asset-port.d.ts.map +1 -1
- package/dist/authoring.mjs +3 -0
- package/dist/authoring.mjs.map +1 -1
- package/dist/capture/cube-views.d.ts +21 -0
- package/dist/capture/cube-views.d.ts.map +1 -0
- package/dist/capture/scheduler.d.ts +54 -0
- package/dist/capture/scheduler.d.ts.map +1 -0
- package/dist/{chunk-RJRUS55L.mjs → chunk-5YADUCA7.mjs} +1896 -1624
- package/dist/chunk-5YADUCA7.mjs.map +1 -0
- package/dist/{chunk-LOSO4CTV.mjs → chunk-6OPXDQ2E.mjs} +423 -46
- package/dist/chunk-6OPXDQ2E.mjs.map +1 -0
- package/dist/{chunk-IPXCABEP.mjs → chunk-BXBQQKFQ.mjs} +3 -9
- package/dist/chunk-BXBQQKFQ.mjs.map +1 -0
- package/dist/chunk-FS2KNUQH.mjs +1294 -0
- package/dist/chunk-FS2KNUQH.mjs.map +1 -0
- package/dist/components/camera.d.ts +1 -0
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/cube-camera.d.ts +20 -0
- package/dist/components/cube-camera.d.ts.map +1 -0
- package/dist/components/directional-light.d.ts +11 -2
- package/dist/components/directional-light.d.ts.map +1 -1
- package/dist/components/directional-shadow-filter.d.ts +25 -0
- package/dist/components/directional-shadow-filter.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/light-helpers.d.ts.map +1 -1
- package/dist/components/reflection-probe.d.ts +17 -0
- package/dist/components/reflection-probe.d.ts.map +1 -0
- package/dist/components/spot-light.d.ts +12 -0
- package/dist/components/spot-light.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +8552 -1612
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +19 -2
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/environment/frame.d.ts.map +1 -1
- package/dist/environment/lifecycle.d.ts +5 -0
- package/dist/environment/lifecycle.d.ts.map +1 -1
- package/dist/errors/render.d.ts +209 -93
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/directional-shadow-projection.d.ts +23 -0
- package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
- package/dist/extract/environment.d.ts +14 -0
- package/dist/extract/environment.d.ts.map +1 -1
- package/dist/extract/visibility.d.ts.map +1 -1
- package/dist/features/fullscreen.d.ts.map +1 -1
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +10 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +13 -2
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +0 -1
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-usage.d.ts +2 -0
- package/dist/gpu-usage.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +19 -17
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +4 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/kernel-cache.d.ts +36 -0
- package/dist/ibl/kernel-cache.d.ts.map +1 -0
- package/dist/index.d.ts +35 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +51 -0
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instances-derived-bounds.d.ts +50 -0
- package/dist/instances-derived-bounds.d.ts.map +1 -0
- package/dist/internal.mjs +1 -1
- package/dist/light-buffer-layout.d.ts +30 -13
- package/dist/light-buffer-layout.d.ts.map +1 -1
- package/dist/mesh-material-bindings.d.ts +54 -0
- package/dist/mesh-material-bindings.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +20 -7
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts +2 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/errors.d.ts +4 -0
- package/dist/pipeline/standard-lighting/errors.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/graph.d.ts +24 -0
- package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/inspection.d.ts +38 -0
- package/dist/pipeline/standard-lighting/inspection.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/layout.d.ts +28 -0
- package/dist/pipeline/standard-lighting/layout.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/light-frame.d.ts +33 -0
- package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/membership.d.ts +14 -0
- package/dist/pipeline/standard-lighting/membership.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/prepare.d.ts +16 -0
- package/dist/pipeline/standard-lighting/prepare.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/topology.d.ts +45 -0
- package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/transport.d.ts +36 -0
- package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts +4 -13
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline/standard-profile.d.ts +12 -20
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +40 -7
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/point-shadow-inspection.d.ts +21 -0
- package/dist/point-shadow-inspection.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +29 -32
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +65 -15
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts +5 -0
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +12 -5
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/gpu-pass-timing/contract.d.ts +96 -0
- package/dist/record/gpu-pass-timing/contract.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/errors.d.ts +18 -0
- package/dist/record/gpu-pass-timing/errors.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/index.d.ts +8 -0
- package/dist/record/gpu-pass-timing/index.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/parser.d.ts +11 -0
- package/dist/record/gpu-pass-timing/parser.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/session.d.ts +43 -0
- package/dist/record/gpu-pass-timing/session.d.ts.map +1 -0
- package/dist/record/gpu-timing.d.ts +37 -0
- package/dist/record/gpu-timing.d.ts.map +1 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +23 -2
- 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 +2 -0
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +48 -3
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +81 -5
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +7 -4
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/reflection/filter.d.ts +22 -0
- package/dist/reflection/filter.d.ts.map +1 -0
- package/dist/reflection/gpu-table.d.ts +25 -0
- package/dist/reflection/gpu-table.d.ts.map +1 -0
- package/dist/reflection/projection.d.ts +91 -0
- package/dist/reflection/projection.d.ts.map +1 -0
- package/dist/render-contract.d.ts +114 -7
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-data.d.ts +10 -6
- package/dist/render-data.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts +1 -0
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +78 -2
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +113 -20
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +24 -3
- package/dist/render-system.d.ts.map +1 -1
- package/dist/renderer-inspect.d.ts +29 -0
- package/dist/renderer-inspect.d.ts.map +1 -0
- package/dist/renderer.d.ts +43 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +14 -0
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/shadow-atlas.d.ts +3 -3
- package/dist/shadow-atlas.d.ts.map +1 -1
- package/dist/ssao-buffers.d.ts +3 -0
- package/dist/ssao-buffers.d.ts.map +1 -1
- package/dist/targets/contracts.d.ts +66 -0
- package/dist/targets/contracts.d.ts.map +1 -0
- package/dist/targets/graph-projection.d.ts +29 -0
- package/dist/targets/graph-projection.d.ts.map +1 -0
- package/dist/targets/material-source.d.ts +34 -0
- package/dist/targets/material-source.d.ts.map +1 -0
- package/dist/targets/owner.d.ts +32 -0
- package/dist/targets/owner.d.ts.map +1 -0
- package/dist/targets/physical.d.ts +18 -0
- package/dist/targets/physical.d.ts.map +1 -0
- package/dist/targets/readback.d.ts +39 -0
- package/dist/targets/readback.d.ts.map +1 -0
- package/dist/temporal/frame.d.ts +44 -0
- package/dist/temporal/frame.d.ts.map +1 -0
- package/dist/temporal/index.mjs +3 -3
- package/dist/typed-render-graph-primitives.d.ts +6 -1
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-atlas.d.ts +10 -0
- package/dist/typed-shadow-atlas.d.ts.map +1 -0
- package/dist/typed-shadow-passes.d.ts +1 -1
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/capability.d.ts +57 -0
- package/dist/volume/capability.d.ts.map +1 -0
- package/dist/volume/component.d.ts +61 -0
- package/dist/volume/component.d.ts.map +1 -0
- package/dist/volume/extract.d.ts +11 -0
- package/dist/volume/extract.d.ts.map +1 -0
- package/dist/volume/inspection.d.ts +38 -0
- package/dist/volume/inspection.d.ts.map +1 -0
- package/dist/volume/passes.d.ts +38 -0
- package/dist/volume/passes.d.ts.map +1 -0
- package/dist/volume/recovery.d.ts +38 -0
- package/dist/volume/recovery.d.ts.map +1 -0
- package/dist/volume/resources.d.ts +57 -0
- package/dist/volume/resources.d.ts.map +1 -0
- package/dist/volume/temporal.d.ts +35 -0
- package/dist/volume/temporal.d.ts.map +1 -0
- package/package.json +20 -20
- package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
- package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
- package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
- package/src/__tests__/cluster-binner.unit.test.ts +35 -0
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -2
- package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
- package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
- package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
- package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
- package/src/__tests__/cube-camera.integration.test.ts +42 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +73 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -3
- package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
- package/src/__tests__/factory-contract.integration.test.ts +255 -29
- package/src/__tests__/fog-component.unit.test.ts +67 -0
- package/src/__tests__/fog.integration.test.ts +86 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -9
- package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +17 -1
- package/src/__tests__/gpu-driven-production.integration.test.ts +16 -17
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +12 -4
- package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
- package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
- package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
- package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
- package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
- package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
- package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
- package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
- package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
- package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
- package/src/__tests__/instances-culling.integration.test.ts +94 -0
- package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
- package/src/__tests__/material-observation.integration.test.ts +101 -0
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
- package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
- package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
- package/src/__tests__/public-surface.test-d.ts +10 -0
- package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
- package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
- package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
- package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
- package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
- package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
- package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +23 -3
- package/src/__tests__/render-feature-docs.unit.test.ts +1 -1
- package/src/__tests__/render-target-admission.unit.test.ts +80 -0
- package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
- package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
- package/src/__tests__/render-target-material-source.test-d.ts +30 -0
- package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
- package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
- package/src/__tests__/render-target-owner.unit.test.ts +122 -0
- package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
- package/src/__tests__/render-target-public-schema.json +107 -0
- package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
- package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
- package/src/__tests__/render-target-readback.integration.test.ts +90 -0
- package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +76 -0
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +1 -1
- package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
- package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
- package/src/__tests__/skin-motion-regression.unit.test.ts +132 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +32 -2
- package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
- package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +232 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +8 -5
- package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
- package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
- package/src/__tests__/standard-lighting-write.unit.test.ts +377 -0
- package/src/__tests__/standard-lighting.integration.test.ts +67 -0
- package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
- package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
- package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
- package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -36
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
- package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
- package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
- package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
- package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
- package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
- package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
- package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
- package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
- package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
- package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
- package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
- package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
- package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
- package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
- package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
- package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
- package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
- package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
- package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
- package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
- package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
- package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
- package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
- package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
- package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
- package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
- package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
- package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
- package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
- package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
- package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
- package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
- package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
- package/src/assembly/device-feature-admission.ts +73 -0
- package/src/assembly/directional-shadow-inspection.ts +122 -0
- package/src/assembly/factory.ts +1093 -246
- package/src/assembly/host-contract.ts +25 -0
- package/src/assembly/render-target-host.ts +847 -0
- package/src/assets/asset-decoders.ts +1 -1
- package/src/assets/render-asset-port.ts +7 -1
- package/src/capture/cube-views.ts +69 -0
- package/src/capture/scheduler.ts +265 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
- package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
- package/src/components/camera.ts +4 -0
- package/src/components/cube-camera.ts +52 -0
- package/src/components/directional-light.ts +22 -2
- package/src/components/directional-shadow-filter.ts +57 -0
- package/src/components/index.ts +2 -0
- package/src/components/light-helpers.ts +85 -7
- package/src/components/reflection-probe.ts +49 -0
- package/src/components/spot-light.ts +22 -3
- package/src/device/gpu-residency.ts +168 -58
- package/src/environment/frame.ts +6 -24
- package/src/environment/lifecycle.ts +12 -0
- package/src/errors/render.ts +405 -143
- package/src/extract/directional-shadow-projection.ts +61 -0
- package/src/extract/environment.ts +57 -0
- package/src/extract/visibility.ts +25 -1
- package/src/features/fullscreen.ts +3 -0
- package/src/features/targets.ts +4 -1
- package/src/features/types.ts +10 -0
- package/src/fullscreen-post-process-pass.ts +43 -2
- package/src/gpu-driven/batch-topology.ts +1 -0
- package/src/gpu-driven/production-raster.ts +1 -3
- package/src/gpu-scene.ts +8 -1
- package/src/gpu-usage.ts +2 -0
- package/src/hdrp-buffers.ts +165 -59
- package/src/ibl/IblPipelineCache.ts +11 -0
- package/src/ibl/kernel-cache.ts +88 -0
- package/src/index.ts +186 -1
- package/src/inspection-types.ts +56 -0
- package/src/instances-derived-bounds.ts +171 -0
- package/src/light-buffer-layout.ts +74 -26
- package/src/mesh-material-bindings.ts +132 -0
- package/src/pbr-pipeline.ts +139 -27
- package/src/pipeline/standard-forward-lane.ts +65 -15
- package/src/pipeline/standard-lighting/errors.ts +6 -0
- package/src/pipeline/standard-lighting/graph.ts +157 -0
- package/src/pipeline/standard-lighting/inspection.ts +88 -0
- package/src/pipeline/standard-lighting/layout.ts +31 -0
- package/src/pipeline/standard-lighting/light-frame.ts +34 -0
- package/src/pipeline/standard-lighting/membership.ts +43 -0
- package/src/pipeline/standard-lighting/prepare.ts +37 -0
- package/src/pipeline/standard-lighting/topology.ts +120 -0
- package/src/pipeline/standard-lighting/transport.ts +77 -0
- package/src/pipeline/standard-pipeline.ts +141 -192
- package/src/pipeline/standard-post.ts +26 -7
- package/src/pipeline/standard-profile.ts +23 -30
- package/src/pipeline-spec.ts +84 -21
- package/src/point-shadow-inspection.ts +55 -0
- package/src/record/__tests__/temporal-payload.unit.test.ts +42 -1
- package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
- package/src/record/frame-lighting.ts +470 -516
- package/src/record/frame-snapshot.ts +76 -28
- package/src/record/frame-targets.ts +23 -2
- package/src/record/frame.ts +1169 -79
- package/src/record/gpu-pass-timing/contract.ts +180 -0
- package/src/record/gpu-pass-timing/errors.ts +34 -0
- package/src/record/gpu-pass-timing/index.ts +37 -0
- package/src/record/gpu-pass-timing/parser.ts +97 -0
- package/src/record/gpu-pass-timing/session.ts +938 -0
- package/src/record/gpu-timing.ts +233 -0
- package/src/record/main-pass-geometry.ts +120 -80
- package/src/record/main-pass-material.ts +101 -11
- package/src/record/main-pass-sprite-draws.ts +54 -25
- package/src/record/main-pass.ts +71 -15
- package/src/record/render-context.ts +77 -0
- package/src/record/shadow-pass.ts +104 -66
- package/src/record/skybox-post-pass.ts +20 -4
- package/src/record/typed-frame-graph.ts +1016 -32
- package/src/record/view-ubo.ts +63 -28
- package/src/reflection/filter.ts +81 -0
- package/src/reflection/gpu-table.ts +44 -0
- package/src/reflection/projection.ts +281 -0
- package/src/render-contract.ts +147 -4
- package/src/render-data.ts +50 -22
- package/src/render-graph-primitives.ts +9 -4
- package/src/render-pipeline.ts +161 -2
- package/src/render-system-extract.ts +886 -103
- package/src/render-system.ts +1174 -66
- package/src/renderer-inspect.ts +66 -0
- package/src/renderer.ts +222 -0
- package/src/scene/render-scene.ts +117 -9
- package/src/shadow-atlas.ts +5 -5
- package/src/ssao-buffers.ts +9 -2
- package/src/targets/contracts.ts +182 -0
- package/src/targets/graph-projection.ts +169 -0
- package/src/targets/material-source.ts +143 -0
- package/src/targets/owner.ts +214 -0
- package/src/targets/physical.ts +18 -0
- package/src/targets/readback.ts +153 -0
- package/src/temporal/frame.ts +128 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +61 -23
- package/src/typed-render-graph-primitives.ts +34 -2
- package/src/typed-shadow-atlas.ts +17 -0
- package/src/typed-shadow-passes.ts +47 -40
- package/src/volume/capability.ts +173 -0
- package/src/volume/component.ts +110 -0
- package/src/volume/extract.ts +21 -0
- package/src/volume/inspection.ts +78 -0
- package/src/volume/passes.ts +686 -0
- package/src/volume/recovery.ts +86 -0
- package/src/volume/resources.ts +236 -0
- package/src/volume/temporal.ts +89 -0
- package/dist/chunk-IPXCABEP.mjs.map +0 -1
- package/dist/chunk-LOSO4CTV.mjs.map +0 -1
- package/dist/chunk-RJRUS55L.mjs.map +0 -1
- package/dist/chunk-YTQ5C7YQ.mjs +0 -584
- package/dist/chunk-YTQ5C7YQ.mjs.map +0 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// @forgeax/engine-render - Directional CSM projection owner.
|
|
2
|
+
|
|
3
|
+
import type { DirectionalShadowQuality } from '../components/directional-shadow-filter';
|
|
4
|
+
import { directionalShadowQualityFromF32 } from '../components/directional-shadow-filter';
|
|
5
|
+
|
|
6
|
+
/** Light-space bounds produced by one existing orthographic CSM fit. */
|
|
7
|
+
export interface DirectionalShadowCascadeFit {
|
|
8
|
+
readonly split: number;
|
|
9
|
+
readonly minX: number;
|
|
10
|
+
readonly maxX: number;
|
|
11
|
+
readonly minY: number;
|
|
12
|
+
readonly maxY: number;
|
|
13
|
+
readonly minZ: number;
|
|
14
|
+
readonly maxZ: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Host projection sent to the shared View UBO. */
|
|
18
|
+
export interface DirectionalShadowProjection {
|
|
19
|
+
readonly splitPlanes: Float32Array;
|
|
20
|
+
readonly directionalShadowQuality: DirectionalShadowQuality;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Project accepted Directional author facts and the existing CSM fit into the
|
|
25
|
+
* shared split vec4 lanes. `.x` is the split, `.y` is world units per texel,
|
|
26
|
+
* `.z` is the light-space depth span, and `.w` is reserved for the ABI.
|
|
27
|
+
*/
|
|
28
|
+
export function projectDirectionalShadow(
|
|
29
|
+
fits: readonly DirectionalShadowCascadeFit[],
|
|
30
|
+
mapSize: number,
|
|
31
|
+
shadowFilter: number,
|
|
32
|
+
shadowAngularRadius: number,
|
|
33
|
+
maxPenumbraTexels: number,
|
|
34
|
+
): DirectionalShadowProjection | undefined {
|
|
35
|
+
if (!Number.isFinite(mapSize) || mapSize < 1) return undefined;
|
|
36
|
+
const directionalShadowQuality = directionalShadowQualityFromF32(
|
|
37
|
+
shadowFilter,
|
|
38
|
+
shadowAngularRadius,
|
|
39
|
+
maxPenumbraTexels,
|
|
40
|
+
);
|
|
41
|
+
if (directionalShadowQuality === undefined) return undefined;
|
|
42
|
+
|
|
43
|
+
const splitPlanes = new Float32Array(16);
|
|
44
|
+
for (let index = 0; index < fits.length && index < 4; index += 1) {
|
|
45
|
+
const fit = fits[index];
|
|
46
|
+
if (fit === undefined) continue;
|
|
47
|
+
const width = Math.abs(fit.maxX - fit.minX);
|
|
48
|
+
const height = Math.abs(fit.maxY - fit.minY);
|
|
49
|
+
const depth = Math.abs(fit.maxZ - fit.minZ);
|
|
50
|
+
const worldUnitsPerTexel = Math.max(width, height, Number.EPSILON) / mapSize;
|
|
51
|
+
const lightDepthWorldSpan = Math.max(depth, Number.EPSILON);
|
|
52
|
+
if (!Number.isFinite(worldUnitsPerTexel) || !Number.isFinite(lightDepthWorldSpan)) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const lane = index * 4;
|
|
56
|
+
splitPlanes[lane] = fit.split;
|
|
57
|
+
splitPlanes[lane + 1] = worldUnitsPerTexel;
|
|
58
|
+
splitPlanes[lane + 2] = lightDepthWorldSpan;
|
|
59
|
+
}
|
|
60
|
+
return { splitPlanes, directionalShadowQuality };
|
|
61
|
+
}
|
|
@@ -76,6 +76,20 @@ export type EnvironmentSource =
|
|
|
76
76
|
|
|
77
77
|
export interface FogFrame extends FogCandidate {}
|
|
78
78
|
|
|
79
|
+
export interface FogParameterIssue {
|
|
80
|
+
readonly field: string;
|
|
81
|
+
readonly value: number;
|
|
82
|
+
readonly expected: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Structured failure retained when an invalid Fog update falls back to LKG. */
|
|
86
|
+
export interface FogSelectionFailure {
|
|
87
|
+
readonly code: string;
|
|
88
|
+
readonly expected: string;
|
|
89
|
+
readonly hint: string;
|
|
90
|
+
readonly detail: Readonly<Record<string, unknown>>;
|
|
91
|
+
}
|
|
92
|
+
|
|
79
93
|
export interface EnvironmentFrame {
|
|
80
94
|
readonly source: EnvironmentSource;
|
|
81
95
|
/** Descriptor of the real environment resource adopted for this frame. */
|
|
@@ -103,6 +117,49 @@ function freezeFog(candidate: FogCandidate): FogFrame {
|
|
|
103
117
|
});
|
|
104
118
|
}
|
|
105
119
|
|
|
120
|
+
/** Validate the bounded Fog domain once for every frame-selection producer. */
|
|
121
|
+
export function validateFogParameters(candidate: FogCandidate): FogParameterIssue | undefined {
|
|
122
|
+
if (candidate.color.length !== 3) {
|
|
123
|
+
return {
|
|
124
|
+
field: 'color',
|
|
125
|
+
value: candidate.color.length,
|
|
126
|
+
expected: 'exactly three finite channels in [0, 1]',
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
for (let index = 0; index < candidate.color.length; index += 1) {
|
|
130
|
+
const value = candidate.color[index];
|
|
131
|
+
if (value === undefined || !Number.isFinite(value) || value < 0 || value > 1) {
|
|
132
|
+
return {
|
|
133
|
+
field: `color[${index}]`,
|
|
134
|
+
value: value ?? Number.NaN,
|
|
135
|
+
expected: 'a finite number in [0, 1]',
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (!Number.isFinite(candidate.density) || candidate.density < 0) {
|
|
140
|
+
return { field: 'density', value: candidate.density, expected: 'a finite number >= 0' };
|
|
141
|
+
}
|
|
142
|
+
if (!Number.isFinite(candidate.heightFalloff) || candidate.heightFalloff < 0) {
|
|
143
|
+
return {
|
|
144
|
+
field: 'heightFalloff',
|
|
145
|
+
value: candidate.heightFalloff,
|
|
146
|
+
expected: 'a finite number >= 0',
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (
|
|
150
|
+
!Number.isFinite(candidate.maxOpacity) ||
|
|
151
|
+
candidate.maxOpacity < 0 ||
|
|
152
|
+
candidate.maxOpacity > 1
|
|
153
|
+
) {
|
|
154
|
+
return {
|
|
155
|
+
field: 'maxOpacity',
|
|
156
|
+
value: candidate.maxOpacity,
|
|
157
|
+
expected: 'a finite number in [0, 1]',
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
|
|
106
163
|
function freezeAtmosphere(parameters: AtmosphereParameters): AtmosphereParameters {
|
|
107
164
|
return Object.freeze({ ...parameters });
|
|
108
165
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { EntityHandle, World } from '@forgeax/engine-ecs';
|
|
2
|
+
import { createWorldProjection } from '@forgeax/engine-ecs/projection';
|
|
2
3
|
import {
|
|
3
4
|
projectHierarchy,
|
|
4
5
|
type SceneHierarchyDiagnostic,
|
|
@@ -37,6 +38,14 @@ interface ResolutionState {
|
|
|
37
38
|
readonly source: VisibilitySource;
|
|
38
39
|
}
|
|
39
40
|
|
|
41
|
+
interface VisibilityCacheEntry {
|
|
42
|
+
readonly changes: ReturnType<typeof createWorldProjection>;
|
|
43
|
+
readonly hierarchy: SceneHierarchySnapshot;
|
|
44
|
+
readonly snapshot: VisibilitySnapshot;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const VISIBILITY_CACHE = new WeakMap<World, VisibilityCacheEntry>();
|
|
48
|
+
|
|
40
49
|
/**
|
|
41
50
|
* Resolve author intent against the scene-owned valid parent projection.
|
|
42
51
|
* Diagnostics are preserved for callers to repair hierarchy input before retry.
|
|
@@ -45,6 +54,19 @@ export function resolveVisibility(
|
|
|
45
54
|
world: World,
|
|
46
55
|
hierarchy: SceneHierarchySnapshot = projectHierarchy(world),
|
|
47
56
|
): VisibilitySnapshot {
|
|
57
|
+
const cached = VISIBILITY_CACHE.get(world);
|
|
58
|
+
const changes = cached?.changes ?? createWorldProjection(world, { components: [Visibility] });
|
|
59
|
+
if (cached !== undefined) {
|
|
60
|
+
const evidence = changes.poll();
|
|
61
|
+
if (
|
|
62
|
+
evidence.status === 'delta' &&
|
|
63
|
+
evidence.changes.length === 0 &&
|
|
64
|
+
cached.hierarchy === hierarchy
|
|
65
|
+
) {
|
|
66
|
+
return cached.snapshot;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
48
70
|
// Visibility is an opt-in component. Query only the owning archetypes
|
|
49
71
|
// instead of walking every Entity row with an optional column; the latter
|
|
50
72
|
// made a World with no visibility intents pay a full-scene scan on each
|
|
@@ -123,7 +145,7 @@ export function resolveVisibility(
|
|
|
123
145
|
};
|
|
124
146
|
};
|
|
125
147
|
|
|
126
|
-
|
|
148
|
+
const snapshot: VisibilitySnapshot = {
|
|
127
149
|
diagnostics: hierarchy.diagnostics,
|
|
128
150
|
hasAnyIntent: intentCount > 0,
|
|
129
151
|
hasAnyHiddenIntent,
|
|
@@ -136,4 +158,6 @@ export function resolveVisibility(
|
|
|
136
158
|
return resolveEntity?.(entity)?.effective ?? 'visible';
|
|
137
159
|
},
|
|
138
160
|
};
|
|
161
|
+
VISIBILITY_CACHE.set(world, { changes, hierarchy, snapshot });
|
|
162
|
+
return snapshot;
|
|
139
163
|
}
|
|
@@ -28,6 +28,9 @@ export function createFullscreenRenderFeature(
|
|
|
28
28
|
const resourceName = `fullscreen.${options.identity.replace(/[^a-z0-9.-]/gi, '-').toLowerCase()}`;
|
|
29
29
|
return Object.freeze({
|
|
30
30
|
identity: options.identity,
|
|
31
|
+
requiredFullscreenPostProcesses: Object.freeze([
|
|
32
|
+
Object.freeze({ identity: options.identity, source: options.source }),
|
|
33
|
+
]),
|
|
31
34
|
extract: (_context: RenderFeatureExtractContext) => ok(undefined),
|
|
32
35
|
plan: (_data: undefined, _context: RenderFeaturePlanContext) =>
|
|
33
36
|
ok({
|
package/src/features/targets.ts
CHANGED
|
@@ -57,8 +57,11 @@ export function resolveStandardRenderFeatureTargets(input: {
|
|
|
57
57
|
readonly colorAttachmentFormat: TextureFormat;
|
|
58
58
|
}): readonly RenderFeatureTargetHandle[] {
|
|
59
59
|
const sampleCount: 1 | 4 = input.antialias === 'msaa' && input.multisample ? 4 : 1;
|
|
60
|
+
// Standard always exposes the scene to features as a linear float target;
|
|
61
|
+
// the shared Output Transform owns the eventual RGBA8 write for every
|
|
62
|
+
// antialias mode, including no-AA/WebGL2.
|
|
60
63
|
const linearLdr =
|
|
61
|
-
|
|
64
|
+
input.tonemap === 'none' ||
|
|
62
65
|
input.antialias === 'fxaa' ||
|
|
63
66
|
(input.antialias === 'msaa' && input.multisample);
|
|
64
67
|
const colorFormat =
|
package/src/features/types.ts
CHANGED
|
@@ -98,6 +98,16 @@ export interface RenderFeature<FrameData> {
|
|
|
98
98
|
* the same lazy module cache used by prepared graphics.
|
|
99
99
|
*/
|
|
100
100
|
readonly requiredMaterialShaders?: readonly string[];
|
|
101
|
+
/**
|
|
102
|
+
* Fullscreen program sources that must be module-ready before the first
|
|
103
|
+
* frame. The renderer seeds the same lazy post-process module cache used by
|
|
104
|
+
* the typed graph, so a synchronous frame driver cannot observe a cleared
|
|
105
|
+
* target while a boot-installed effect is compiling.
|
|
106
|
+
*/
|
|
107
|
+
readonly requiredFullscreenPostProcesses?: readonly {
|
|
108
|
+
readonly identity: string;
|
|
109
|
+
readonly source: string;
|
|
110
|
+
}[];
|
|
101
111
|
extract(context: RenderFeatureExtractContext): Result<FrameData, RenderError>;
|
|
102
112
|
plan(data: FrameData, context: RenderFeaturePlanContext): Result<RenderFeaturePlan, RenderError>;
|
|
103
113
|
}
|
|
@@ -67,7 +67,8 @@ export type PostProcessReadSampleType = 'depth';
|
|
|
67
67
|
* no paramSchema (params are passed inline via a {type, value} struct — plan-strategy D-4).
|
|
68
68
|
*
|
|
69
69
|
* `params` carries the WGSL struct definition + default value. When `params` is
|
|
70
|
-
* `undefined`, the post-process shader has no UBO
|
|
70
|
+
* `undefined`, the post-process shader has no params UBO. Special graph-owned
|
|
71
|
+
* passes such as FXAA may still register an internal policy UBO separately.
|
|
71
72
|
*
|
|
72
73
|
* `reads` declares graph resource keys this pass samples as input texture(s).
|
|
73
74
|
* If omitted, the pass samples the swap-chain color attachment (default path).
|
|
@@ -81,7 +82,7 @@ export interface PostProcessShaderEntry {
|
|
|
81
82
|
/** Composed WGSL source for the fragment stage (post-naga_oil). */
|
|
82
83
|
readonly source: string;
|
|
83
84
|
/**
|
|
84
|
-
* Params UBO schema. When undefined, the shader has no uniform buffer
|
|
85
|
+
* Params UBO schema. When undefined, the generic shader has no uniform buffer
|
|
85
86
|
* and the BGL degrades to 2 entries (texture@0 + sampler@1). When present, the
|
|
86
87
|
* primitive eager-creates a params UBO (at register, sized `byteSize`) and binds
|
|
87
88
|
* it at bindgroup(1) binding(2) as part of a 3-entry BGL
|
|
@@ -104,6 +105,46 @@ export interface PostProcessShaderEntry {
|
|
|
104
105
|
readonly reads?: readonly (string | PostProcessReadEntry)[] | undefined;
|
|
105
106
|
}
|
|
106
107
|
|
|
108
|
+
function postProcessSourceDigest(source: string): string {
|
|
109
|
+
let first = 0x811c9dc5;
|
|
110
|
+
let second = 0x9e3779b9;
|
|
111
|
+
for (let index = 0; index < source.length; index += 1) {
|
|
112
|
+
const code = source.charCodeAt(index);
|
|
113
|
+
first = Math.imul(first ^ code, 0x01000193);
|
|
114
|
+
second = Math.imul(second ^ (code + index), 0x01000193);
|
|
115
|
+
}
|
|
116
|
+
return `${source.length.toString(16)}-${(first >>> 0).toString(16).padStart(8, '0')}-${(second >>> 0).toString(16).padStart(8, '0')}`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Content-addressed PSO label shared by the post-process pipeline factory. */
|
|
120
|
+
export function postProcessShaderPipelineLabel(identity: string, source: string): string {
|
|
121
|
+
return `post-process-${identity}-pso-${postProcessSourceDigest(source)}`;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Content-addressed shader-module label shared by prewarm and lazy paths. */
|
|
125
|
+
export function postProcessShaderModuleLabel(identity: string, source: string): string {
|
|
126
|
+
return `${postProcessShaderPipelineLabel(identity, source)}-module`;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Stable declaration identity used by graph admission and the renderer's
|
|
131
|
+
* device-bound pipeline cache. Shader source, bind-group-affecting params,
|
|
132
|
+
* and graph reads must move together when a feature reuses its identity.
|
|
133
|
+
*/
|
|
134
|
+
export function postProcessShaderEntrySignature(entry: PostProcessShaderEntry): string {
|
|
135
|
+
return JSON.stringify({
|
|
136
|
+
source: entry.source,
|
|
137
|
+
params:
|
|
138
|
+
entry.params === undefined
|
|
139
|
+
? undefined
|
|
140
|
+
: {
|
|
141
|
+
byteSize: entry.params.byteSize,
|
|
142
|
+
defaultValue: Array.from(entry.params.defaultValue),
|
|
143
|
+
},
|
|
144
|
+
reads: entry.reads,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
107
148
|
/** Whether a feature binding opts into the temporal multi-read contract. */
|
|
108
149
|
export function isTemporalFullscreenBinding(values: Readonly<Record<string, unknown>>): boolean {
|
|
109
150
|
return (
|
|
@@ -53,6 +53,7 @@ function eligibleKeys(slot: RenderSceneSlot): readonly GpuDrivenBatchKey[] {
|
|
|
53
53
|
if (
|
|
54
54
|
draws === undefined ||
|
|
55
55
|
draws.length === 0 ||
|
|
56
|
+
snapshot.instances?.instanceCount === 0 ||
|
|
56
57
|
snapshot.localAabb === undefined ||
|
|
57
58
|
snapshot.skin !== undefined ||
|
|
58
59
|
snapshot.spriteInstances !== undefined
|
|
@@ -427,7 +427,6 @@ export class GpuDrivenProduction {
|
|
|
427
427
|
readonly meshes: ReadonlyMap<number, MeshGpuHandles>;
|
|
428
428
|
readonly viewBindGroupLayout: BindGroupLayout;
|
|
429
429
|
readonly meshResidencyEpoch: number;
|
|
430
|
-
readonly hdrp: boolean;
|
|
431
430
|
}): Result<PreparedGpuDrivenFrame | undefined, RhiError> {
|
|
432
431
|
this.gpuOwnedSnapshotsMaterialized = 0;
|
|
433
432
|
this.filteredPlanBuilds = 0;
|
|
@@ -435,7 +434,6 @@ export class GpuDrivenProduction {
|
|
|
435
434
|
this.validatedGpuOwnedRows = 0;
|
|
436
435
|
this.cpuFallbackDrawItems = 0;
|
|
437
436
|
if (
|
|
438
|
-
input.hdrp ||
|
|
439
437
|
input.scene === undefined ||
|
|
440
438
|
!this.device.caps.compute ||
|
|
441
439
|
!this.device.caps.storageBuffer ||
|
|
@@ -611,7 +609,7 @@ export class GpuDrivenProduction {
|
|
|
611
609
|
// shared by the GPU-driven raster pipeline, so even rigid draws
|
|
612
610
|
// must provide the binding-10 offset (zero selects the frame
|
|
613
611
|
// default slot).
|
|
614
|
-
pass.setBindGroup(0, viewBindGroup, [0]);
|
|
612
|
+
pass.setBindGroup(0, viewBindGroup, [0, 0]);
|
|
615
613
|
let currentPipeline: RenderPipeline | undefined;
|
|
616
614
|
let currentVertex: GraphBuffer | undefined;
|
|
617
615
|
let currentIndex: GraphBuffer | undefined;
|
package/src/gpu-scene.ts
CHANGED
|
@@ -633,7 +633,14 @@ export class GpuScene {
|
|
|
633
633
|
record: RenderSceneSlot,
|
|
634
634
|
writes: Record<GpuSceneTableName, number[]>,
|
|
635
635
|
): void {
|
|
636
|
-
|
|
636
|
+
// A present Instances component is authoritative even when its array is
|
|
637
|
+
// empty: preserve zero so neither the GPU Scene nor the indirect topology
|
|
638
|
+
// turns it into a synthetic identity instance. Entities without the
|
|
639
|
+
// component retain the ordinary one-instance identity path.
|
|
640
|
+
const instanceCount =
|
|
641
|
+
record.snapshot.instances === undefined
|
|
642
|
+
? 1
|
|
643
|
+
: Math.max(0, Math.floor(record.snapshot.instances.instanceCount));
|
|
637
644
|
const drawCount = Math.max(1, record.snapshot.gpuDrivenDraws?.length ?? 0);
|
|
638
645
|
const materialCount = Math.max(1, record.snapshot.materials.length);
|
|
639
646
|
const existing = this.allocations.get(record.slot);
|
package/src/gpu-usage.ts
CHANGED
|
@@ -12,3 +12,5 @@ export const GPU_BUFFER_USAGE_UNIFORM = 0x40;
|
|
|
12
12
|
export const GPU_BUFFER_USAGE_STORAGE = 0x80;
|
|
13
13
|
export const GPU_BUFFER_USAGE_INDIRECT = 0x100;
|
|
14
14
|
export const GPU_BUFFER_USAGE_MAP_READ = 0x01;
|
|
15
|
+
/** GPUBufferUsage.QUERY_RESOLVE, used by optional timestamp captures. */
|
|
16
|
+
export const GPU_BUFFER_USAGE_QUERY_RESOLVE = 0x200;
|