@forgeax/engine-render 0.0.0-dev.8d955ade1c79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +647 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/__tests__/authoring-path.unit.test.d.ts +2 -0
- package/dist/__tests__/authoring-path.unit.test.d.ts.map +1 -0
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +2 -0
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +1 -0
- package/dist/__tests__/callback-inference.test-d.d.ts +2 -0
- package/dist/__tests__/callback-inference.test-d.d.ts.map +1 -0
- package/dist/__tests__/cluster-binner.test.d.ts +2 -0
- package/dist/__tests__/cluster-binner.test.d.ts.map +1 -0
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +2 -0
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +1 -0
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +2 -0
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +1 -0
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +2 -0
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +1 -0
- package/dist/__tests__/factory-contract.integration.test.d.ts +2 -0
- package/dist/__tests__/factory-contract.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/frame-observation.contract.test.d.ts +2 -0
- package/dist/__tests__/frame-observation.contract.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +2 -0
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +6 -0
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +18 -0
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view-reference.d.ts +15 -0
- package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +7 -0
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +2 -0
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +1 -0
- package/dist/__tests__/injection-kind-owner.test-d.d.ts +2 -0
- package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +2 -0
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts +2 -0
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts +2 -0
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts +2 -0
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +2 -0
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +1 -0
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +2 -0
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-stride-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +2 -0
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +2 -0
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +1 -0
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +2 -0
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +1 -0
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +2 -0
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +2 -0
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-default-off.test.d.ts +2 -0
- package/dist/__tests__/profiler-default-off.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-phase-catalog.test.d.ts +2 -0
- package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-phase-integration.test.d.ts +2 -0
- package/dist/__tests__/profiler-phase-integration.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-phase-token.test.d.ts +2 -0
- package/dist/__tests__/profiler-phase-token.test.d.ts.map +1 -0
- package/dist/__tests__/public-surface.test-d.d.ts +2 -0
- package/dist/__tests__/public-surface.test-d.d.ts.map +1 -0
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +2 -0
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-error-code-owner.test-d.d.ts +2 -0
- package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +2 -0
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts +2 -0
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-assembly.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-context.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-context.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-contract.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-contract.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-docs.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-errors.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +2 -0
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-retry.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +7 -0
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +1 -0
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +2 -0
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-hzb-gpu.d.ts +7 -0
- package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +1 -0
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts +2 -0
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts +2 -0
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +12 -0
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +1 -0
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +2 -0
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/render-scene-projection.unit.test.d.ts +2 -0
- package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +2 -0
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +2 -0
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +1 -0
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +2 -0
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +1 -0
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +2 -0
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +1 -0
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
- package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
- package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
- package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/surface-configuration.unit.test.d.ts +2 -0
- package/dist/__tests__/surface-configuration.unit.test.d.ts.map +1 -0
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +2 -0
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +1 -0
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +2 -0
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +1 -0
- package/dist/__tests__/urp-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +2 -0
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-extract.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-extract.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-extract.perf.test.d.ts +2 -0
- package/dist/__tests__/visibility-extract.perf.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-instances.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-instances.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-public-surface.test-d.d.ts +2 -0
- package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +1 -0
- package/dist/__tests__/visibility-resolver.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/vocabulary.unit.test.d.ts +2 -0
- package/dist/__tests__/vocabulary.unit.test.d.ts.map +1 -0
- package/dist/assembly/backend-contract.d.ts +37 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +207 -0
- package/dist/assembly/factory.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +84 -0
- package/dist/assembly/host-contract.d.ts.map +1 -0
- package/dist/assembly/material/assembly.d.ts +21 -0
- package/dist/assembly/material/assembly.d.ts.map +1 -0
- package/dist/assembly/material/pipeline-projection.d.ts +30 -0
- package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
- package/dist/assets/asset-decoders.d.ts +5 -0
- package/dist/assets/asset-decoders.d.ts.map +1 -0
- package/dist/assets/render-asset-port.d.ts +17 -0
- package/dist/assets/render-asset-port.d.ts.map +1 -0
- package/dist/assets/resolve-render-asset.d.ts +6 -0
- package/dist/assets/resolve-render-asset.d.ts.map +1 -0
- package/dist/authoring.d.ts +12 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.mjs +27 -0
- package/dist/authoring.mjs.map +1 -0
- package/dist/chunk-CQXZC5XI.mjs +182 -0
- package/dist/chunk-CQXZC5XI.mjs.map +1 -0
- package/dist/chunk-HCOGPHKS.mjs +93 -0
- package/dist/chunk-HCOGPHKS.mjs.map +1 -0
- package/dist/chunk-YEJIUW7D.mjs +1152 -0
- package/dist/chunk-YEJIUW7D.mjs.map +1 -0
- package/dist/cluster-binner.d.ts +152 -0
- package/dist/cluster-binner.d.ts.map +1 -0
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +2 -0
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +2 -0
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
- package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/schema-parity.unit.test.d.ts +2 -0
- package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts +2 -0
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +1 -0
- package/dist/components/camera.d.ts +311 -0
- package/dist/components/camera.d.ts.map +1 -0
- package/dist/components/directional-light.d.ts +76 -0
- package/dist/components/directional-light.d.ts.map +1 -0
- package/dist/components/glyph-text.d.ts +26 -0
- package/dist/components/glyph-text.d.ts.map +1 -0
- package/dist/components/index.d.ts +24 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/instances.d.ts +41 -0
- package/dist/components/instances.d.ts.map +1 -0
- package/dist/components/layer.d.ts +34 -0
- package/dist/components/layer.d.ts.map +1 -0
- package/dist/components/light-helpers.d.ts +53 -0
- package/dist/components/light-helpers.d.ts.map +1 -0
- package/dist/components/lines.d.ts +5 -0
- package/dist/components/lines.d.ts.map +1 -0
- package/dist/components/mesh-filter.d.ts +24 -0
- package/dist/components/mesh-filter.d.ts.map +1 -0
- package/dist/components/mesh-renderer.d.ts +33 -0
- package/dist/components/mesh-renderer.d.ts.map +1 -0
- package/dist/components/point-light-shadow.d.ts +27 -0
- package/dist/components/point-light-shadow.d.ts.map +1 -0
- package/dist/components/point-light.d.ts +35 -0
- package/dist/components/point-light.d.ts.map +1 -0
- package/dist/components/points.d.ts +15 -0
- package/dist/components/points.d.ts.map +1 -0
- package/dist/components/post-process-params.d.ts +5 -0
- package/dist/components/post-process-params.d.ts.map +1 -0
- package/dist/components/scene-instance.d.ts +140 -0
- package/dist/components/scene-instance.d.ts.map +1 -0
- package/dist/components/skybox-background.d.ts +56 -0
- package/dist/components/skybox-background.d.ts.map +1 -0
- package/dist/components/skylight.d.ts +55 -0
- package/dist/components/skylight.d.ts.map +1 -0
- package/dist/components/sort-key.d.ts +44 -0
- package/dist/components/sort-key.d.ts.map +1 -0
- package/dist/components/spot-light.d.ts +81 -0
- package/dist/components/spot-light.d.ts.map +1 -0
- package/dist/components/sprite-animation.d.ts +74 -0
- package/dist/components/sprite-animation.d.ts.map +1 -0
- package/dist/components/sprite-instances.d.ts +51 -0
- package/dist/components/sprite-instances.d.ts.map +1 -0
- package/dist/components/sprite-playback-mode.d.ts +42 -0
- package/dist/components/sprite-playback-mode.d.ts.map +1 -0
- package/dist/components/sprite-region-override.d.ts +46 -0
- package/dist/components/sprite-region-override.d.ts.map +1 -0
- package/dist/components/tile-layer.d.ts +106 -0
- package/dist/components/tile-layer.d.ts.map +1 -0
- package/dist/components/tilemap.d.ts +25 -0
- package/dist/components/tilemap.d.ts.map +1 -0
- package/dist/components/visibility.d.ts +22 -0
- package/dist/components/visibility.d.ts.map +1 -0
- package/dist/construct-renderer.d.ts +19 -0
- package/dist/construct-renderer.d.ts.map +1 -0
- package/dist/construct-renderer.mjs +27462 -0
- package/dist/construct-renderer.mjs.map +1 -0
- package/dist/debug-draw-glue.d.ts +5 -0
- package/dist/debug-draw-glue.d.ts.map +1 -0
- package/dist/device/device-scope.d.ts +83 -0
- package/dist/device/device-scope.d.ts.map +1 -0
- package/dist/device/gpu-residency.d.ts +337 -0
- package/dist/device/gpu-residency.d.ts.map +1 -0
- package/dist/device/resource-types.d.ts +8 -0
- package/dist/device/resource-types.d.ts.map +1 -0
- package/dist/engine-metrics.d.ts +23 -0
- package/dist/engine-metrics.d.ts.map +1 -0
- package/dist/errors/ecs-validation.d.ts +3 -0
- package/dist/errors/ecs-validation.d.ts.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/recover.d.ts +105 -0
- package/dist/errors/recover.d.ts.map +1 -0
- package/dist/errors/render.d.ts +705 -0
- package/dist/errors/render.d.ts.map +1 -0
- package/dist/extract/visibility.d.ts +26 -0
- package/dist/extract/visibility.d.ts.map +1 -0
- package/dist/features/fullscreen.d.ts +19 -0
- package/dist/features/fullscreen.d.ts.map +1 -0
- package/dist/features/host.d.ts +106 -0
- package/dist/features/host.d.ts.map +1 -0
- package/dist/features/morph/morph-feature.d.ts +79 -0
- package/dist/features/morph/morph-feature.d.ts.map +1 -0
- package/dist/features/plan.d.ts +182 -0
- package/dist/features/plan.d.ts.map +1 -0
- package/dist/features/prepared-gpu-work.d.ts +117 -0
- package/dist/features/prepared-gpu-work.d.ts.map +1 -0
- package/dist/features/prepared-graphics-store.d.ts +66 -0
- package/dist/features/prepared-graphics-store.d.ts.map +1 -0
- package/dist/features/prepared-graphics.d.ts +215 -0
- package/dist/features/prepared-graphics.d.ts.map +1 -0
- package/dist/features/render-graph-compute.d.ts +13 -0
- package/dist/features/render-graph-compute.d.ts.map +1 -0
- package/dist/features/render-graph-contribution.d.ts +12 -0
- package/dist/features/render-graph-contribution.d.ts.map +1 -0
- package/dist/features/render-graph-raster.d.ts +38 -0
- package/dist/features/render-graph-raster.d.ts.map +1 -0
- package/dist/features/render-graph-resources.d.ts +11 -0
- package/dist/features/render-graph-resources.d.ts.map +1 -0
- package/dist/features/targets.d.ts +32 -0
- package/dist/features/targets.d.ts.map +1 -0
- package/dist/features/types.d.ts +68 -0
- package/dist/features/types.d.ts.map +1 -0
- package/dist/features/vocabulary.d.ts +14 -0
- package/dist/features/vocabulary.d.ts.map +1 -0
- package/dist/fullscreen-post-process-pass.d.ts +157 -0
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -0
- package/dist/glyph-text-layout-system.d.ts +19 -0
- package/dist/glyph-text-layout-system.d.ts.map +1 -0
- package/dist/gpu-driven/batch-topology.d.ts +55 -0
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -0
- package/dist/gpu-driven/production-raster.d.ts +51 -0
- package/dist/gpu-driven/production-raster.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +85 -0
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -0
- package/dist/gpu-resource.d.ts +73 -0
- package/dist/gpu-resource.d.ts.map +1 -0
- package/dist/gpu-scene-schema.d.ts +78 -0
- package/dist/gpu-scene-schema.d.ts.map +1 -0
- package/dist/gpu-scene.d.ts +55 -0
- package/dist/gpu-scene.d.ts.map +1 -0
- package/dist/gpu-stage.d.ts +4 -0
- package/dist/gpu-stage.d.ts.map +1 -0
- package/dist/gpu-texture-usage.d.ts +6 -0
- package/dist/gpu-texture-usage.d.ts.map +1 -0
- package/dist/gpu-usage.d.ts +9 -0
- package/dist/gpu-usage.d.ts.map +1 -0
- package/dist/hdrp-buffers.d.ts +163 -0
- package/dist/hdrp-buffers.d.ts.map +1 -0
- package/dist/ibl/IblPipelineCache.d.ts +168 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -0
- package/dist/ibl/skylight-bind-group.d.ts +130 -0
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +169 -0
- package/dist/index.mjs.map +1 -0
- package/dist/inspection-types.d.ts +72 -0
- package/dist/inspection-types.d.ts.map +1 -0
- package/dist/instance-buffer-cache.d.ts +56 -0
- package/dist/instance-buffer-cache.d.ts.map +1 -0
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.mjs +3 -0
- package/dist/internal.mjs.map +1 -0
- package/dist/lifecycle.d.ts +62 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/light-buffer-layout.d.ts +164 -0
- package/dist/light-buffer-layout.d.ts.map +1 -0
- package/dist/materials.d.ts +47 -0
- package/dist/materials.d.ts.map +1 -0
- package/dist/mesh-material-bindings.d.ts +43 -0
- package/dist/mesh-material-bindings.d.ts.map +1 -0
- package/dist/pbr-pipeline.d.ts +301 -0
- package/dist/pbr-pipeline.d.ts.map +1 -0
- package/dist/pipeline/standard-forward-lane.d.ts +5 -0
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts +31 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
- package/dist/pipeline/standard-profile.d.ts +40 -0
- package/dist/pipeline/standard-profile.d.ts.map +1 -0
- package/dist/pipeline-builder.d.ts +122 -0
- package/dist/pipeline-builder.d.ts.map +1 -0
- package/dist/pipeline-spec-types.d.ts +24 -0
- package/dist/pipeline-spec-types.d.ts.map +1 -0
- package/dist/pipeline-spec.d.ts +367 -0
- package/dist/pipeline-spec.d.ts.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/points-lines.bench.d.ts +2 -0
- package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +1 -0
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +1 -0
- package/dist/points-lines/admission.d.ts +36 -0
- package/dist/points-lines/admission.d.ts.map +1 -0
- package/dist/points-lines/bounds.d.ts +8 -0
- package/dist/points-lines/bounds.d.ts.map +1 -0
- package/dist/points-lines/expansion-cache.d.ts +28 -0
- package/dist/points-lines/expansion-cache.d.ts.map +1 -0
- package/dist/points-lines/inspection.d.ts +53 -0
- package/dist/points-lines/inspection.d.ts.map +1 -0
- package/dist/points-lines/prepare.d.ts +67 -0
- package/dist/points-lines/prepare.d.ts.map +1 -0
- package/dist/points-lines/record.d.ts +60 -0
- package/dist/points-lines/record.d.ts.map +1 -0
- package/dist/points-lines/snapshot.d.ts +49 -0
- package/dist/points-lines/snapshot.d.ts.map +1 -0
- package/dist/post-process-errors.d.ts +182 -0
- package/dist/post-process-errors.d.ts.map +1 -0
- package/dist/prepare/prepared-graphics-resolver.d.ts +59 -0
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -0
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +2 -0
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +1 -0
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +2 -0
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +1 -0
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts +2 -0
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +121 -0
- package/dist/record/frame-lighting.d.ts.map +1 -0
- package/dist/record/frame-snapshot.d.ts +429 -0
- package/dist/record/frame-snapshot.d.ts.map +1 -0
- package/dist/record/frame-targets.d.ts +20 -0
- package/dist/record/frame-targets.d.ts.map +1 -0
- package/dist/record/frame.d.ts +71 -0
- package/dist/record/frame.d.ts.map +1 -0
- package/dist/record/helpers.d.ts +102 -0
- package/dist/record/helpers.d.ts.map +1 -0
- package/dist/record/main-pass-geometry.d.ts +28 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -0
- package/dist/record/main-pass-material.d.ts +204 -0
- package/dist/record/main-pass-material.d.ts.map +1 -0
- package/dist/record/main-pass-sprite-draws.d.ts +43 -0
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -0
- package/dist/record/main-pass.d.ts +20 -0
- package/dist/record/main-pass.d.ts.map +1 -0
- package/dist/record/mesh-ssbo.d.ts +446 -0
- package/dist/record/mesh-ssbo.d.ts.map +1 -0
- package/dist/record/render-context.d.ts +252 -0
- package/dist/record/render-context.d.ts.map +1 -0
- package/dist/record/shadow-pass.d.ts +52 -0
- package/dist/record/shadow-pass.d.ts.map +1 -0
- package/dist/record/skybox-post-pass.d.ts +33 -0
- package/dist/record/skybox-post-pass.d.ts.map +1 -0
- package/dist/record/typed-frame-graph.d.ts +35 -0
- package/dist/record/typed-frame-graph.d.ts.map +1 -0
- package/dist/record/view-ubo.d.ts +45 -0
- package/dist/record/view-ubo.d.ts.map +1 -0
- package/dist/render-contract.d.ts +424 -0
- package/dist/render-contract.d.ts.map +1 -0
- package/dist/render-data.d.ts +143 -0
- package/dist/render-data.d.ts.map +1 -0
- package/dist/render-graph-primitives.d.ts +76 -0
- package/dist/render-graph-primitives.d.ts.map +1 -0
- package/dist/render-pipeline.d.ts +110 -0
- package/dist/render-pipeline.d.ts.map +1 -0
- package/dist/render-system-extract.d.ts +868 -0
- package/dist/render-system-extract.d.ts.map +1 -0
- package/dist/render-system.d.ts +125 -0
- package/dist/render-system.d.ts.map +1 -0
- package/dist/scene/render-scene-types.d.ts +61 -0
- package/dist/scene/render-scene-types.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +112 -0
- package/dist/scene/render-scene.d.ts.map +1 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts +30 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -0
- package/dist/shadow-atlas.d.ts +117 -0
- package/dist/shadow-atlas.d.ts.map +1 -0
- package/dist/ssao-buffers.d.ts +50 -0
- package/dist/ssao-buffers.d.ts.map +1 -0
- package/dist/ssao-config.d.ts +28 -0
- package/dist/ssao-config.d.ts.map +1 -0
- package/dist/systems/active-camera.d.ts +53 -0
- package/dist/systems/active-camera.d.ts.map +1 -0
- package/dist/systems/pass-selector.d.ts +24 -0
- package/dist/systems/pass-selector.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +49 -0
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -0
- package/dist/systems/skin-palette-types.d.ts +14 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -0
- package/dist/systems/transparent-sort-config.d.ts +112 -0
- package/dist/systems/transparent-sort-config.d.ts.map +1 -0
- package/dist/tilemap-chunk-extract-system.d.ts +143 -0
- package/dist/tilemap-chunk-extract-system.d.ts.map +1 -0
- package/dist/typed-render-graph-primitives.d.ts +57 -0
- package/dist/typed-render-graph-primitives.d.ts.map +1 -0
- package/dist/typed-shadow-passes.d.ts +11 -0
- package/dist/typed-shadow-passes.d.ts.map +1 -0
- package/package.json +94 -0
- package/src/__tests__/authoring-path.unit.test.ts +23 -0
- package/src/__tests__/backend-selection-rhi-capture.test-d.ts +21 -0
- package/src/__tests__/callback-inference.test-d.ts +8 -0
- package/src/__tests__/cluster-binner.test.ts +272 -0
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +20 -0
- package/src/__tests__/construct-renderer-identity.unit.test.ts +23 -0
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
- package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
- package/src/__tests__/direct-extract-consumer-contract.test-d.ts +23 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +61 -0
- package/src/__tests__/factory-contract.integration.test.ts +280 -0
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +15 -0
- package/src/__tests__/frame-observation.contract.test.ts +112 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
- package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +167 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +350 -0
- package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +12 -0
- package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +16 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +436 -0
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +87 -0
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +271 -0
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +290 -0
- package/src/__tests__/gpu-driven-view-reference.ts +111 -0
- package/src/__tests__/gpu-driven-view.browser.test.ts +30 -0
- package/src/__tests__/gpu-driven-view.dawn.test.ts +28 -0
- package/src/__tests__/gpu-driven-view.unit.test.ts +199 -0
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +59 -0
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +308 -0
- package/src/__tests__/gpu-scene-render-graph.browser.test.ts +19 -0
- package/src/__tests__/gpu-scene-render-graph.dawn.test.ts +19 -0
- package/src/__tests__/gpu-scene-schema.unit.test.ts +16 -0
- package/src/__tests__/gpu-scene.dawn.test.ts +205 -0
- package/src/__tests__/gpu-scene.unit.test.ts +147 -0
- package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
- package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +92 -0
- package/src/__tests__/injection-kind-owner.test-d.ts +14 -0
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +728 -0
- package/src/__tests__/light-buffer-layout.unit.test.ts +40 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +24 -0
- package/src/__tests__/material-cooked-projection.unit.test.ts +150 -0
- package/src/__tests__/material-snapshot-mutation.integration.test.ts +53 -0
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +94 -0
- package/src/__tests__/material-stride-surface.unit.test.ts +32 -0
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +106 -0
- package/src/__tests__/mesh-material-bindings.unit.test.ts +89 -0
- package/src/__tests__/mesh-stride-surface.unit.test.ts +16 -0
- package/src/__tests__/morph-culling-reentry.dawn.test.ts +157 -0
- package/src/__tests__/morph-feature-gpu-work.integration.test.ts +80 -0
- package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
- package/src/__tests__/morph-visual-evidence.integration.test.ts +80 -0
- package/src/__tests__/nineslice-handle-surface.unit.test.ts +19 -0
- package/src/__tests__/post-process-error-policy-owner.unit.test.ts +201 -0
- package/src/__tests__/prepared-buffer-kind-owner.test-d.ts +29 -0
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +65 -0
- package/src/__tests__/prepared-graphics-generation.unit.test.ts +161 -0
- package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +138 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +29 -0
- package/src/__tests__/prepared-graphics-resolver.unit.test.ts +285 -0
- package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +105 -0
- package/src/__tests__/prepared-graphics-store.unit.test.ts +154 -0
- package/src/__tests__/prepared-graphics-validation.unit.test.ts +176 -0
- package/src/__tests__/profiler-default-off.test.ts +22 -0
- package/src/__tests__/profiler-phase-catalog.test.ts +66 -0
- package/src/__tests__/profiler-phase-integration.test.ts +62 -0
- package/src/__tests__/profiler-phase-token.test.ts +79 -0
- package/src/__tests__/public-surface.test-d.ts +94 -0
- package/src/__tests__/recover-error-policy-owner.unit.test.ts +107 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +116 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +139 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +110 -0
- package/src/__tests__/render-feature-assembly.test-d.ts +43 -0
- package/src/__tests__/render-feature-context.test-d.ts +57 -0
- package/src/__tests__/render-feature-contract.test-d.ts +49 -0
- package/src/__tests__/render-feature-diagnostics.unit.test.ts +149 -0
- package/src/__tests__/render-feature-docs.unit.test.ts +89 -0
- package/src/__tests__/render-feature-errors.unit.test.ts +47 -0
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +316 -0
- package/src/__tests__/render-feature-plan.test-d.ts +161 -0
- package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
- package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +90 -0
- package/src/__tests__/render-feature-prepared-errors.test-d.ts +79 -0
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +80 -0
- package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +72 -0
- package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +36 -0
- package/src/__tests__/render-feature-prepared-graphics.test-d.ts +74 -0
- package/src/__tests__/render-feature-prepared-graphics.unit.test.ts +121 -0
- package/src/__tests__/render-feature-public-surface.test-d.ts +57 -0
- package/src/__tests__/render-feature-retry.unit.test.ts +87 -0
- package/src/__tests__/render-feature-scheduling.unit.test.ts +110 -0
- package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +137 -0
- package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +146 -0
- package/src/__tests__/render-feature-visibility-context.test-d.ts +33 -0
- package/src/__tests__/render-feature-visibility-context.unit.test.ts +37 -0
- package/src/__tests__/render-feature-zero-work.unit.test.ts +76 -0
- package/src/__tests__/render-graph-compute-raster-gpu.ts +342 -0
- package/src/__tests__/render-graph-compute-raster.browser.test.ts +16 -0
- package/src/__tests__/render-graph-compute-raster.dawn.test.ts +22 -0
- package/src/__tests__/render-graph-hzb-gpu.ts +239 -0
- package/src/__tests__/render-graph-hzb.browser.test.ts +16 -0
- package/src/__tests__/render-graph-hzb.dawn.test.ts +23 -0
- package/src/__tests__/render-graph-primitives.unit.test.ts +22 -0
- package/src/__tests__/render-graph-storage-indirect-gpu.ts +162 -0
- package/src/__tests__/render-graph-storage-indirect.browser.test.ts +21 -0
- package/src/__tests__/render-graph-storage-indirect.dawn.test.ts +28 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +168 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +121 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +58 -0
- package/src/__tests__/rhi-backend-package-boundary.unit.test.ts +11 -0
- package/src/__tests__/scriptable-pack-consumer.test-d.ts +14 -0
- package/src/__tests__/shader-stage-surface.unit.test.ts +43 -0
- package/src/__tests__/ssao-config.unit.test.ts +36 -0
- package/src/__tests__/ssao-kernel-surface.unit.test.ts +14 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
- package/src/__tests__/standard-descriptors.test-d.ts +22 -0
- package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
- package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
- package/src/__tests__/surface-configuration.unit.test.ts +91 -0
- package/src/__tests__/texture-usage-surface.unit.test.ts +58 -0
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +223 -0
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +42 -0
- package/src/__tests__/urp-pipeline.unit.test.ts +14 -0
- package/src/__tests__/vertex-color-pipeline.unit.test.ts +132 -0
- package/src/__tests__/vertex-layout-consumer.unit.test.ts +25 -0
- package/src/__tests__/visibility-diagnostics.integration.test.ts +62 -0
- package/src/__tests__/visibility-extract.integration.test.ts +98 -0
- package/src/__tests__/visibility-extract.perf.test.ts +130 -0
- package/src/__tests__/visibility-feature-dedup.integration.test.ts +55 -0
- package/src/__tests__/visibility-hidden-report.unit.test.ts +36 -0
- package/src/__tests__/visibility-instances.integration.test.ts +46 -0
- package/src/__tests__/visibility-multi-world.integration.test.ts +86 -0
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +168 -0
- package/src/__tests__/visibility-producer-matrix.unit.test.ts +96 -0
- package/src/__tests__/visibility-public-surface.test-d.ts +27 -0
- package/src/__tests__/visibility-resolver.unit.test.ts +85 -0
- package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
- package/src/__tests__/visibility-snapshot-contract.unit.test.ts +60 -0
- package/src/__tests__/vocabulary.unit.test.ts +21 -0
- package/src/assembly/backend-contract.ts +57 -0
- package/src/assembly/factory.ts +8130 -0
- package/src/assembly/host-contract.ts +101 -0
- package/src/assembly/material/assembly.ts +48 -0
- package/src/assembly/material/pipeline-projection.ts +63 -0
- package/src/assets/asset-decoders.ts +158 -0
- package/src/assets/render-asset-port.ts +44 -0
- package/src/assets/resolve-render-asset.ts +13 -0
- package/src/authoring.ts +17 -0
- package/src/cluster-binner.ts +700 -0
- package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
- package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
- package/src/components/__tests__/schema-parity.unit.test.ts +25 -0
- package/src/components/__tests__/visibility-schema.unit.test.ts +35 -0
- package/src/components/camera.ts +512 -0
- package/src/components/directional-light.ts +120 -0
- package/src/components/glyph-text.ts +64 -0
- package/src/components/index.ts +54 -0
- package/src/components/instances.ts +206 -0
- package/src/components/layer.ts +69 -0
- package/src/components/light-helpers.ts +188 -0
- package/src/components/lines.ts +18 -0
- package/src/components/mesh-filter.ts +60 -0
- package/src/components/mesh-renderer.ts +61 -0
- package/src/components/point-light-shadow.ts +43 -0
- package/src/components/point-light.ts +65 -0
- package/src/components/points.ts +40 -0
- package/src/components/post-process-params.ts +35 -0
- package/src/components/scene-instance.ts +193 -0
- package/src/components/skybox-background.ts +103 -0
- package/src/components/skylight.ts +97 -0
- package/src/components/sort-key.ts +75 -0
- package/src/components/spot-light.ts +124 -0
- package/src/components/sprite-animation.ts +168 -0
- package/src/components/sprite-instances.ts +179 -0
- package/src/components/sprite-playback-mode.ts +79 -0
- package/src/components/sprite-region-override.ts +105 -0
- package/src/components/tile-layer.ts +167 -0
- package/src/components/tilemap.ts +48 -0
- package/src/components/visibility.ts +53 -0
- package/src/construct-renderer.ts +67 -0
- package/src/debug-draw-glue.ts +48 -0
- package/src/device/device-scope.ts +306 -0
- package/src/device/gpu-residency.ts +1822 -0
- package/src/device/resource-types.ts +20 -0
- package/src/engine-metrics.ts +82 -0
- package/src/errors/ecs-validation.ts +16 -0
- package/src/errors/index.ts +3 -0
- package/src/errors/recover.ts +161 -0
- package/src/errors/render.ts +1284 -0
- package/src/extract/visibility.ts +120 -0
- package/src/features/fullscreen.ts +46 -0
- package/src/features/host.ts +1363 -0
- package/src/features/morph/morph-feature.ts +377 -0
- package/src/features/plan.ts +447 -0
- package/src/features/prepared-gpu-work.ts +959 -0
- package/src/features/prepared-graphics-store.ts +449 -0
- package/src/features/prepared-graphics.ts +420 -0
- package/src/features/render-graph-compute.ts +69 -0
- package/src/features/render-graph-contribution.ts +75 -0
- package/src/features/render-graph-raster.ts +332 -0
- package/src/features/render-graph-resources.ts +38 -0
- package/src/features/targets.ts +70 -0
- package/src/features/types.ts +103 -0
- package/src/features/vocabulary.ts +24 -0
- package/src/fullscreen-post-process-pass.ts +363 -0
- package/src/glyph-text-layout-system.ts +421 -0
- package/src/gpu-driven/batch-topology.ts +245 -0
- package/src/gpu-driven/production-raster.ts +695 -0
- package/src/gpu-driven/view-gpu.ts +703 -0
- package/src/gpu-resource.ts +159 -0
- package/src/gpu-scene-schema.ts +136 -0
- package/src/gpu-scene.ts +722 -0
- package/src/gpu-stage.ts +9 -0
- package/src/gpu-texture-usage.ts +12 -0
- package/src/gpu-usage.ts +14 -0
- package/src/hdrp-buffers.ts +480 -0
- package/src/ibl/IblPipelineCache.ts +1006 -0
- package/src/ibl/skylight-bind-group.ts +513 -0
- package/src/index.ts +129 -0
- package/src/inspection-types.ts +80 -0
- package/src/instance-buffer-cache.ts +95 -0
- package/src/internal.ts +9 -0
- package/src/lifecycle.ts +168 -0
- package/src/light-buffer-layout.ts +346 -0
- package/src/materials.ts +214 -0
- package/src/mesh-material-bindings.ts +103 -0
- package/src/pbr-pipeline.ts +1137 -0
- package/src/pipeline/standard-forward-lane.ts +229 -0
- package/src/pipeline/standard-pipeline.ts +555 -0
- package/src/pipeline/standard-profile.ts +65 -0
- package/src/pipeline-builder.ts +382 -0
- package/src/pipeline-spec-types.ts +28 -0
- package/src/pipeline-spec.ts +1231 -0
- package/src/plugin.ts +69 -0
- package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
- package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
- package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
- package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
- package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
- package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
- package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
- package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
- package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
- package/src/points-lines/admission.ts +238 -0
- package/src/points-lines/bounds.ts +23 -0
- package/src/points-lines/expansion-cache.ts +215 -0
- package/src/points-lines/inspection.ts +97 -0
- package/src/points-lines/prepare.ts +177 -0
- package/src/points-lines/record.ts +125 -0
- package/src/points-lines/snapshot.ts +130 -0
- package/src/post-process-errors.ts +302 -0
- package/src/prepare/prepared-graphics-resolver.ts +456 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +41 -0
- package/src/record/__tests__/material-slot-plan.unit.test.ts +44 -0
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
- package/src/record/__tests__/video-texture-view.unit.test.ts +90 -0
- package/src/record/frame-lighting.ts +1074 -0
- package/src/record/frame-snapshot.ts +500 -0
- package/src/record/frame-targets.ts +137 -0
- package/src/record/frame.ts +1598 -0
- package/src/record/helpers.ts +284 -0
- package/src/record/main-pass-geometry.ts +1065 -0
- package/src/record/main-pass-material.ts +1043 -0
- package/src/record/main-pass-sprite-draws.ts +1137 -0
- package/src/record/main-pass.ts +610 -0
- package/src/record/mesh-ssbo.ts +885 -0
- package/src/record/render-context.ts +384 -0
- package/src/record/shadow-pass.ts +698 -0
- package/src/record/skybox-post-pass.ts +593 -0
- package/src/record/typed-frame-graph.ts +461 -0
- package/src/record/view-ubo.ts +222 -0
- package/src/render-contract.ts +582 -0
- package/src/render-data.ts +385 -0
- package/src/render-graph-primitives.ts +811 -0
- package/src/render-pipeline.ts +259 -0
- package/src/render-system-extract.ts +4585 -0
- package/src/render-system.ts +1933 -0
- package/src/scene/render-scene-types.ts +67 -0
- package/src/scene/render-scene.ts +1087 -0
- package/src/scene-instances/post-spawn-resolve-joints.ts +165 -0
- package/src/shadow-atlas.ts +244 -0
- package/src/ssao-buffers.ts +334 -0
- package/src/ssao-config.ts +61 -0
- package/src/systems/active-camera.ts +116 -0
- package/src/systems/pass-selector.ts +49 -0
- package/src/systems/skin-palette-allocator.ts +251 -0
- package/src/systems/skin-palette-types.ts +14 -0
- package/src/systems/transparent-sort-config.ts +233 -0
- package/src/tilemap-chunk-extract-system.ts +1290 -0
- package/src/typed-render-graph-primitives.ts +541 -0
- package/src/typed-shadow-passes.ts +165 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
// @forgeax/engine-runtime — SSAO per-runtime persistent GPU buffers.
|
|
2
|
+
//
|
|
3
|
+
// feat-20260612-hdrp-ssao M1 / w4.
|
|
4
|
+
//
|
|
5
|
+
// Owner of 3 SSAO GPU resources, lazily allocated per RenderSystemRuntime,
|
|
6
|
+
// following the getOrCreateHdrpBuffers WeakMap pattern (research F12):
|
|
7
|
+
// (1) kernel UBO — 64 padded vec4 samples (1024 B), label hdrp-ssao-kernel
|
|
8
|
+
// (2) noise texture — 4x4 rgba32float, label hdrp-ssao-noise, NEAREST/REPEAT
|
|
9
|
+
// (3) uniform UBO — 3 mat4 + vec4 intensityPad (256 B aligned),
|
|
10
|
+
// label hdrp-ssao-uniform
|
|
11
|
+
//
|
|
12
|
+
// plan-strategy D-1: uniform carries view + projection + inverseProjection.
|
|
13
|
+
// plan-strategy D-C: intensity, radius, and bias are carried at offset 192
|
|
14
|
+
// (the existing vec4 slot), so the lighting shader can mix(1.0, ssao*ao,
|
|
15
|
+
// intensity) without a new UBO.
|
|
16
|
+
// The kernel uses a uniform buffer on every backend. 1024 B is below the
|
|
17
|
+
// WebGL2 minimum fragment UBO size, so SSAO does not need a storage-buffer
|
|
18
|
+
// capability gate.
|
|
19
|
+
|
|
20
|
+
import type { Buffer, Sampler, Texture, TextureView } from '@forgeax/engine-rhi';
|
|
21
|
+
import { GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_TEXTURE_BINDING } from './gpu-texture-usage';
|
|
22
|
+
import { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from './gpu-usage';
|
|
23
|
+
import type { RenderSystemRuntime } from './record/render-context';
|
|
24
|
+
|
|
25
|
+
// Deterministic host-side SSAO data is owned by the buffer allocator because
|
|
26
|
+
// these values have no consumer outside the resources they initialize.
|
|
27
|
+
export const SSAO_KERNEL_SAMPLE_COUNT = 64;
|
|
28
|
+
const NOISE_SIZE = 16;
|
|
29
|
+
|
|
30
|
+
function mulberry32(seed: number): () => number {
|
|
31
|
+
let state = seed | 0;
|
|
32
|
+
return () => {
|
|
33
|
+
state = (state + 0x6d2b79f5) | 0;
|
|
34
|
+
let t = Math.imul(state ^ (state >>> 15), 1 | state);
|
|
35
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
36
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function lerp(a: number, b: number, t: number): number {
|
|
41
|
+
return a + t * (b - a);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function generateSsaoKernel(seed: number = 0): readonly Float32Array[] {
|
|
45
|
+
const rand = mulberry32(seed);
|
|
46
|
+
const kernel: Float32Array[] = [];
|
|
47
|
+
for (let i = 0; i < SSAO_KERNEL_SAMPLE_COUNT; i++) {
|
|
48
|
+
let x = rand() * 2 - 1;
|
|
49
|
+
let y = rand() * 2 - 1;
|
|
50
|
+
let z = rand();
|
|
51
|
+
const len = Math.sqrt(x * x + y * y + z * z);
|
|
52
|
+
x /= len;
|
|
53
|
+
y /= len;
|
|
54
|
+
z /= len;
|
|
55
|
+
const r = rand();
|
|
56
|
+
x *= r;
|
|
57
|
+
y *= r;
|
|
58
|
+
z *= r;
|
|
59
|
+
const scale = lerp(0.1, 1.0, (i / SSAO_KERNEL_SAMPLE_COUNT) ** 2);
|
|
60
|
+
const sample = new Float32Array(3);
|
|
61
|
+
sample[0] = x * scale;
|
|
62
|
+
sample[1] = y * scale;
|
|
63
|
+
sample[2] = z * scale;
|
|
64
|
+
kernel.push(sample);
|
|
65
|
+
}
|
|
66
|
+
return kernel;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function generateSsaoNoise(seed: number = 0): Float32Array {
|
|
70
|
+
const rand = mulberry32(seed);
|
|
71
|
+
const noise = new Float32Array(NOISE_SIZE * 3);
|
|
72
|
+
for (let i = 0; i < NOISE_SIZE; i++) {
|
|
73
|
+
noise[i * 3 + 0] = rand() * 2 - 1;
|
|
74
|
+
noise[i * 3 + 1] = rand() * 2 - 1;
|
|
75
|
+
noise[i * 3 + 2] = 0;
|
|
76
|
+
}
|
|
77
|
+
return noise;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Each vec3<f32> in a WGSL array is 16B (12B payload + 4B padding).
|
|
81
|
+
// 64 samples * 16 B/sample = 1024 B.
|
|
82
|
+
const BYTES_PER_KERNEL_ELEMENT = 16;
|
|
83
|
+
|
|
84
|
+
// SSAO uniform layout (plan-strategy §D-1 + §D-C, M7 round-2):
|
|
85
|
+
// bytes [0..63] view mat4x4<f32>
|
|
86
|
+
// bytes [64..127] projection mat4x4<f32>
|
|
87
|
+
// bytes [128..191] inverseProjection mat4x4<f32>
|
|
88
|
+
// bytes [192..207] intensityPad vec4<f32> // x = intensity, y = radius, z = bias, w = pad
|
|
89
|
+
// bytes [208..255] padding // align to 256B WebGPU UBO offset
|
|
90
|
+
//
|
|
91
|
+
// The total is rounded to 256B so the same UBO can host an additional
|
|
92
|
+
// shader-side scalar binding at the tail without re-allocation.
|
|
93
|
+
const UNIFORM_INTENSITY_OFFSET_BYTES = 192;
|
|
94
|
+
const UNIFORM_BYTES = 256;
|
|
95
|
+
export const SSAO_UNIFORM_INTENSITY_OFFSET = UNIFORM_INTENSITY_OFFSET_BYTES;
|
|
96
|
+
export const SSAO_UNIFORM_BYTES = UNIFORM_BYTES;
|
|
97
|
+
|
|
98
|
+
// ── 1x1 white fallback texture (plan-strategy §D-B) ───────────────────────
|
|
99
|
+
//
|
|
100
|
+
// Single-PSO invariant: the HDRP unified BGL always declares a binding 7
|
|
101
|
+
// texture_2d<f32>. When SSAO is disabled (or its resources are not yet
|
|
102
|
+
// allocated), the bind group binds this 1x1 r8unorm texture filled with
|
|
103
|
+
// 0xFF. r8unorm normalizes 255 -> 1.0, so the lighting shader reads
|
|
104
|
+
// `ssaoFactor = 1.0`, and `mix(1.0, ssao*ao, intensity) = ao` collapses
|
|
105
|
+
// back to the round-1 baseline (ambient = baked-AO only). No shader
|
|
106
|
+
// recompile across enable/disable.
|
|
107
|
+
|
|
108
|
+
interface SsaoFallbackResources {
|
|
109
|
+
readonly texture: Texture;
|
|
110
|
+
readonly view: TextureView;
|
|
111
|
+
readonly sampler: Sampler;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const fallbackCache = new WeakMap<RenderSystemRuntime, SsaoFallbackResources>();
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Lazily allocate the 1x1 r8unorm white fallback texture + a sampler for
|
|
118
|
+
* SSAO disabled / resource-missing path. Cached per RenderSystemRuntime so
|
|
119
|
+
* subsequent calls reuse the same resources (charter P5 one-owner).
|
|
120
|
+
*
|
|
121
|
+
* Returns `null` if `device.createTexture` / `createTextureView` /
|
|
122
|
+
* `createSampler` / `queue.writeTexture` fails; the caller (createBindGroup)
|
|
123
|
+
* propagates the structured RhiError that landed on `runtime.errorRegistry`.
|
|
124
|
+
*/
|
|
125
|
+
export function getOrCreateSsaoFallbackTexture(
|
|
126
|
+
runtime: RenderSystemRuntime,
|
|
127
|
+
): SsaoFallbackResources | null {
|
|
128
|
+
const cached = fallbackCache.get(runtime);
|
|
129
|
+
if (cached !== undefined) return cached;
|
|
130
|
+
|
|
131
|
+
const device = runtime.device;
|
|
132
|
+
const texRes = device.createTexture({
|
|
133
|
+
label: 'hdrp-ssao-fallback-white',
|
|
134
|
+
size: { width: 1, height: 1, depthOrArrayLayers: 1 },
|
|
135
|
+
mipLevelCount: 1,
|
|
136
|
+
sampleCount: 1,
|
|
137
|
+
dimension: '2d',
|
|
138
|
+
format: 'r8unorm',
|
|
139
|
+
usage: GPU_TEXTURE_USAGE_TEXTURE_BINDING | GPU_TEXTURE_USAGE_COPY_DST,
|
|
140
|
+
textureBindingViewDimension: undefined,
|
|
141
|
+
});
|
|
142
|
+
if (!texRes.ok) {
|
|
143
|
+
runtime.errorRegistry.fire(texRes.error);
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// r8unorm: a single byte 0xFF normalizes to 1.0 (white => AO = 1.0).
|
|
148
|
+
const whitePixel = new Uint8Array([255]);
|
|
149
|
+
const writeRes = device.queue.writeTexture(
|
|
150
|
+
{
|
|
151
|
+
texture: texRes.value,
|
|
152
|
+
mipLevel: 0,
|
|
153
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
154
|
+
},
|
|
155
|
+
whitePixel,
|
|
156
|
+
{ offset: 0, bytesPerRow: 256, rowsPerImage: 1 },
|
|
157
|
+
{ width: 1, height: 1, depthOrArrayLayers: 1 },
|
|
158
|
+
);
|
|
159
|
+
if (!writeRes.ok) {
|
|
160
|
+
runtime.errorRegistry.fire(writeRes.error);
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const viewRes = device.createTextureView(texRes.value, {
|
|
165
|
+
label: 'hdrp-ssao-fallback-white-view',
|
|
166
|
+
format: 'r8unorm',
|
|
167
|
+
dimension: '2d',
|
|
168
|
+
aspect: 'all',
|
|
169
|
+
baseMipLevel: 0,
|
|
170
|
+
mipLevelCount: 1,
|
|
171
|
+
baseArrayLayer: 0,
|
|
172
|
+
arrayLayerCount: 1,
|
|
173
|
+
});
|
|
174
|
+
if (!viewRes.ok) {
|
|
175
|
+
runtime.errorRegistry.fire(viewRes.error);
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const samplerRes = device.createSampler({
|
|
180
|
+
label: 'hdrp-ssao-fallback-sampler',
|
|
181
|
+
magFilter: 'linear',
|
|
182
|
+
minFilter: 'linear',
|
|
183
|
+
mipmapFilter: 'linear',
|
|
184
|
+
addressModeU: 'clamp-to-edge',
|
|
185
|
+
addressModeV: 'clamp-to-edge',
|
|
186
|
+
addressModeW: 'clamp-to-edge',
|
|
187
|
+
});
|
|
188
|
+
if (!samplerRes.ok) {
|
|
189
|
+
runtime.errorRegistry.fire(samplerRes.error);
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const resources: SsaoFallbackResources = {
|
|
194
|
+
texture: texRes.value,
|
|
195
|
+
view: viewRes.value,
|
|
196
|
+
sampler: samplerRes.value,
|
|
197
|
+
};
|
|
198
|
+
fallbackCache.set(runtime, resources);
|
|
199
|
+
return resources;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* SSAO GPU resources owned by this module (plan-strategy D-1, D-4).
|
|
204
|
+
*
|
|
205
|
+
* Fields are readonly per charter P5: one resource, one owner.
|
|
206
|
+
*/
|
|
207
|
+
export interface SsaoBuffers {
|
|
208
|
+
/** 64 padded vec4 uniform buffer for hemisphere samples. */
|
|
209
|
+
readonly kernelBuffer: Buffer;
|
|
210
|
+
readonly kernelBytes: number;
|
|
211
|
+
/** 4x4 rgba32float noise texture for per-pixel TBN rotation. */
|
|
212
|
+
readonly noiseTexture: Texture;
|
|
213
|
+
/** SSAO uniform UBO: view (mat4) + projection (mat4) + inverseProjection (mat4). */
|
|
214
|
+
readonly uniformBuffer: Buffer;
|
|
215
|
+
readonly uniformBytes: number;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const cache = new WeakMap<RenderSystemRuntime, SsaoBuffers>();
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Lazily allocate the 3 SSAO GPU resources for `runtime`. Returns the
|
|
222
|
+
* same `SsaoBuffers` object on subsequent calls (per-RenderSystem
|
|
223
|
+
* stable identity, WeakMap).
|
|
224
|
+
*
|
|
225
|
+
* On `device.createBuffer` / `device.createTexture` failure, fires a
|
|
226
|
+
* structured error on the runtime's error registry and returns `null`.
|
|
227
|
+
*
|
|
228
|
+
* @returns SsaoBuffers on success, null if an allocation fails.
|
|
229
|
+
*/
|
|
230
|
+
export function getOrCreateSsaoBuffers(runtime: RenderSystemRuntime): SsaoBuffers | null {
|
|
231
|
+
const cached = cache.get(runtime);
|
|
232
|
+
if (cached !== undefined) return cached;
|
|
233
|
+
|
|
234
|
+
const device = runtime.device;
|
|
235
|
+
|
|
236
|
+
// (1) Kernel UBO — 64 padded vec4 samples (1024 B).
|
|
237
|
+
const kernelSamples = generateSsaoKernel();
|
|
238
|
+
const kernelData = new Float32Array(SSAO_KERNEL_SAMPLE_COUNT * 4); // 4 floats per padded vec3
|
|
239
|
+
for (let i = 0; i < SSAO_KERNEL_SAMPLE_COUNT; i++) {
|
|
240
|
+
const s = kernelSamples[i];
|
|
241
|
+
if (s === undefined) continue;
|
|
242
|
+
kernelData[i * 4 + 0] = s[0] ?? 0;
|
|
243
|
+
kernelData[i * 4 + 1] = s[1] ?? 0;
|
|
244
|
+
kernelData[i * 4 + 2] = s[2] ?? 0;
|
|
245
|
+
// kernelData[i * 4 + 3] = 0 (padding for std140 vec3 alignment)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const kernelBufferRes = device.createBuffer({
|
|
249
|
+
label: 'hdrp-ssao-kernel',
|
|
250
|
+
size: SSAO_KERNEL_SAMPLE_COUNT * BYTES_PER_KERNEL_ELEMENT,
|
|
251
|
+
usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,
|
|
252
|
+
mappedAtCreation: false,
|
|
253
|
+
});
|
|
254
|
+
if (!kernelBufferRes.ok) {
|
|
255
|
+
runtime.errorRegistry.fire(kernelBufferRes.error);
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Upload kernel data to the buffer.
|
|
260
|
+
const kernelWriteRes = device.queue.writeBuffer(kernelBufferRes.value, 0, kernelData);
|
|
261
|
+
if (!kernelWriteRes.ok) {
|
|
262
|
+
runtime.errorRegistry.fire(kernelWriteRes.error);
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// (2) Noise texture — 4x4 rgba32float, NEAREST/REPEAT.
|
|
267
|
+
const noiseData = generateSsaoNoise();
|
|
268
|
+
// Pad to rgba32float: 16 texels * 4 floats = 64 floats.
|
|
269
|
+
const noiseRgba = new Float32Array(16 * 4);
|
|
270
|
+
for (let i = 0; i < 16; i++) {
|
|
271
|
+
noiseRgba[i * 4 + 0] = noiseData[i * 3 + 0] ?? 0;
|
|
272
|
+
noiseRgba[i * 4 + 1] = noiseData[i * 3 + 1] ?? 0;
|
|
273
|
+
noiseRgba[i * 4 + 2] = 0;
|
|
274
|
+
noiseRgba[i * 4 + 3] = 1; // alpha = 1 for rgba32float
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const noiseTexRes = device.createTexture({
|
|
278
|
+
label: 'hdrp-ssao-noise',
|
|
279
|
+
size: { width: 4, height: 4, depthOrArrayLayers: 1 },
|
|
280
|
+
mipLevelCount: 1,
|
|
281
|
+
sampleCount: 1,
|
|
282
|
+
dimension: '2d',
|
|
283
|
+
format: 'rgba32float',
|
|
284
|
+
usage: GPU_TEXTURE_USAGE_COPY_DST | GPU_TEXTURE_USAGE_TEXTURE_BINDING,
|
|
285
|
+
textureBindingViewDimension: undefined,
|
|
286
|
+
});
|
|
287
|
+
if (!noiseTexRes.ok) {
|
|
288
|
+
runtime.errorRegistry.fire(noiseTexRes.error);
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Direct CPU-to-GPU upload via writeTexture (no alignment requirement
|
|
293
|
+
// unlike copyBufferToTexture; WebGPU spec §19.2). 4x4 rgba32float texture
|
|
294
|
+
// = 16 texels * 4 floats * 4 bytes/float = 256 bytes.
|
|
295
|
+
// The forgeax Texture brand wraps a raw GPUTexture; cast through unknown
|
|
296
|
+
// follows the createRenderer.ts fallback-pixel pattern (line 4330).
|
|
297
|
+
const noiseCopyRes = device.queue.writeTexture(
|
|
298
|
+
{
|
|
299
|
+
texture: noiseTexRes.value,
|
|
300
|
+
mipLevel: 0,
|
|
301
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
302
|
+
},
|
|
303
|
+
noiseRgba,
|
|
304
|
+
{ offset: 0, bytesPerRow: 4 * 4 * 4, rowsPerImage: 4 },
|
|
305
|
+
{ width: 4, height: 4, depthOrArrayLayers: 1 },
|
|
306
|
+
);
|
|
307
|
+
if (!noiseCopyRes.ok) {
|
|
308
|
+
runtime.errorRegistry.fire(noiseCopyRes.error);
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// (3) SSAO uniform UBO — 3 mat4 (192 B).
|
|
313
|
+
const uniformBufRes = device.createBuffer({
|
|
314
|
+
label: 'hdrp-ssao-uniform',
|
|
315
|
+
size: UNIFORM_BYTES,
|
|
316
|
+
usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,
|
|
317
|
+
mappedAtCreation: false,
|
|
318
|
+
});
|
|
319
|
+
if (!uniformBufRes.ok) {
|
|
320
|
+
runtime.errorRegistry.fire(uniformBufRes.error);
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const buffers: SsaoBuffers = {
|
|
325
|
+
kernelBuffer: kernelBufferRes.value,
|
|
326
|
+
kernelBytes: SSAO_KERNEL_SAMPLE_COUNT * BYTES_PER_KERNEL_ELEMENT,
|
|
327
|
+
noiseTexture: noiseTexRes.value,
|
|
328
|
+
uniformBuffer: uniformBufRes.value,
|
|
329
|
+
uniformBytes: UNIFORM_BYTES,
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
cache.set(runtime, buffers);
|
|
333
|
+
return buffers;
|
|
334
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// @forgeax/engine-render - SSAO parameter authority.
|
|
2
|
+
|
|
3
|
+
import { err, ok, type Result } from '@forgeax/engine-types';
|
|
4
|
+
import { PostProcessError } from './post-process-errors';
|
|
5
|
+
|
|
6
|
+
export const SSAO_DEFAULT_RADIUS = 0.5;
|
|
7
|
+
export const SSAO_DEFAULT_BIAS = 0.025;
|
|
8
|
+
export const SSAO_DEFAULT_INTENSITY = 1.0;
|
|
9
|
+
|
|
10
|
+
export interface SsaoParameterConfig {
|
|
11
|
+
readonly radius?: number | undefined;
|
|
12
|
+
readonly bias?: number | undefined;
|
|
13
|
+
readonly intensity?: number | undefined;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface ResolvedSsaoParameters {
|
|
17
|
+
readonly radius: number;
|
|
18
|
+
readonly bias: number;
|
|
19
|
+
readonly intensity: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Apply the public defaults without deciding whether the values are valid.
|
|
24
|
+
* The record stage uses this only after the graph build has validated the
|
|
25
|
+
* active HDRP configuration, or for the disabled/default fallback payload.
|
|
26
|
+
*/
|
|
27
|
+
export function getSsaoParameters(config: SsaoParameterConfig | undefined): ResolvedSsaoParameters {
|
|
28
|
+
return {
|
|
29
|
+
radius: config?.radius ?? SSAO_DEFAULT_RADIUS,
|
|
30
|
+
bias: config?.bias ?? SSAO_DEFAULT_BIAS,
|
|
31
|
+
intensity: config?.intensity ?? SSAO_DEFAULT_INTENSITY,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Resolve and validate the SSAO configuration used by both graph routes.
|
|
37
|
+
* Invalid values remain structured PostProcessErrors instead of becoming
|
|
38
|
+
* NaNs or silently falling back to shader literals.
|
|
39
|
+
*/
|
|
40
|
+
export function resolveSsaoParameters(
|
|
41
|
+
config: SsaoParameterConfig | undefined,
|
|
42
|
+
): Result<ResolvedSsaoParameters, PostProcessError> {
|
|
43
|
+
const resolved = getSsaoParameters(config);
|
|
44
|
+
if (resolved.radius <= 0) {
|
|
45
|
+
return err(
|
|
46
|
+
new PostProcessError({
|
|
47
|
+
code: 'ssao-radius-non-positive',
|
|
48
|
+
detail: { paramName: 'radius', value: resolved.radius },
|
|
49
|
+
}),
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
if (resolved.bias < 0) {
|
|
53
|
+
return err(
|
|
54
|
+
new PostProcessError({
|
|
55
|
+
code: 'ssao-bias-negative',
|
|
56
|
+
detail: { paramName: 'bias', value: resolved.bias },
|
|
57
|
+
}),
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
return ok(resolved);
|
|
61
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// @forgeax/engine-runtime - ActiveCamera KV resource + selection helper.
|
|
2
|
+
//
|
|
3
|
+
// feat-20260630-viewport-2x2-run-x-display-redesign M2 w12 / plan-strategy D-2.
|
|
4
|
+
//
|
|
5
|
+
// PROBLEM (research Finding 4): the render extract stage selects the camera by
|
|
6
|
+
// archetype-query FIRST-HIT (`cameras[0]`) and fires `render-system-multi-camera`
|
|
7
|
+
// when more than one [Camera, Transform, Entity] entity exists. A single engine
|
|
8
|
+
// world that carries BOTH an editor orbit camera AND a game camera therefore
|
|
9
|
+
// cannot pick which one renders. This module adds the minimum neutral mechanism:
|
|
10
|
+
// an `ActiveCamera { entity }` resource naming the entity to render through.
|
|
11
|
+
//
|
|
12
|
+
// ENGINE-NEUTRAL (requirements OOS-4 / AC-16): the engine knows only entity IDs.
|
|
13
|
+
// It does NOT know which entity is "editor" or "game" -- the caller (editor side)
|
|
14
|
+
// decides what `ActiveCamera.entity` points at. No editor concept enters this
|
|
15
|
+
// file or the engine layer.
|
|
16
|
+
//
|
|
17
|
+
// BACKWARD COMPATIBLE (plan-strategy D-2): when the resource is ABSENT, or the
|
|
18
|
+
// named entity is not among the queried cameras, selection falls back to the
|
|
19
|
+
// existing first-hit behavior unchanged. Single-camera scenes are unaffected.
|
|
20
|
+
//
|
|
21
|
+
// Surface:
|
|
22
|
+
// - interface ActiveCamera { entity: number }
|
|
23
|
+
// - constant ACTIVE_CAMERA_KEY = 'ActiveCamera'
|
|
24
|
+
// - helper getActiveCamera(world): ActiveCamera | undefined
|
|
25
|
+
// - helper setActiveCamera(world, entity): void
|
|
26
|
+
// - pure selectActiveCameraIndex(cameraEntities, activeEntity): number
|
|
27
|
+
//
|
|
28
|
+
// @new-surface KV resource: ECS has no defineResource factory; the TS POD
|
|
29
|
+
// interface + string KV key form is the minimum-new-surface route, mirroring
|
|
30
|
+
// TransparentSortConfig. The world resource store
|
|
31
|
+
// (insertResource / getResource / hasResource) is reused unchanged.
|
|
32
|
+
// @derives world.hasResource / world.insertResource / world.getResource KV API.
|
|
33
|
+
// @fallback getActiveCamera KV missing returns undefined; no warn; no throw
|
|
34
|
+
// (absent ActiveCamera is a legal state -> first-hit fallback in extract).
|
|
35
|
+
//
|
|
36
|
+
// charter mapping: F1 (single-import barrel + single entity pointer, smallest
|
|
37
|
+
// concept face vs a multi-field priority/enabled scheme) + P4 (consistent
|
|
38
|
+
// abstraction -- same world.{has,get,insert}Resource KV API as every other
|
|
39
|
+
// engine resource consumer).
|
|
40
|
+
|
|
41
|
+
import type { World } from '@forgeax/engine-ecs';
|
|
42
|
+
|
|
43
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
44
|
+
// POD interface + KV key
|
|
45
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Active-camera pointer (plain-data POD). Lives as a world-level resource keyed
|
|
49
|
+
* by `ACTIVE_CAMERA_KEY`. `entity` is the packed entity id (engine `EntityHandle`
|
|
50
|
+
* is a branded number) of the camera the renderer should use.
|
|
51
|
+
*
|
|
52
|
+
* The engine treats `entity` as an opaque id; whether it names an editor camera
|
|
53
|
+
* or a game camera is a caller-side decision (OOS-4 — engine stays neutral).
|
|
54
|
+
*/
|
|
55
|
+
export interface ActiveCamera {
|
|
56
|
+
readonly entity: number;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** World resource key for the `ActiveCamera` KV entry. */
|
|
60
|
+
export const ACTIVE_CAMERA_KEY = 'ActiveCamera' as const;
|
|
61
|
+
|
|
62
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
63
|
+
// Helpers
|
|
64
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Read the world's `ActiveCamera` resource.
|
|
68
|
+
*
|
|
69
|
+
* @fallback KV missing returns `undefined` — absent ActiveCamera is a legal
|
|
70
|
+
* state (the renderer falls back to archetype first-hit). NO warn, NO throw.
|
|
71
|
+
* The `hasResource` guard precedes the read so this helper never trips
|
|
72
|
+
* `ResourceNotFoundError` from `world.getResource`.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* const a = getActiveCamera(world); // undefined when not set
|
|
76
|
+
* if (a) { ... a.entity ... }
|
|
77
|
+
*/
|
|
78
|
+
export function getActiveCamera(world: World): ActiveCamera | undefined {
|
|
79
|
+
if (!world.hasResource(ACTIVE_CAMERA_KEY)) return undefined;
|
|
80
|
+
return world.getResource<ActiveCamera>(ACTIVE_CAMERA_KEY);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Write the world's `ActiveCamera` resource (idempotent last-write-wins via
|
|
85
|
+
* `world.insertResource`). The renderer will use the camera whose entity id
|
|
86
|
+
* equals `entity`, or fall back to first-hit if that id is not a queried camera.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* setActiveCamera(world, gameCameraEntity); // render through the game camera
|
|
90
|
+
*/
|
|
91
|
+
export function setActiveCamera(world: World, entity: number): void {
|
|
92
|
+
world.insertResource<ActiveCamera>(ACTIVE_CAMERA_KEY, { entity });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Pure selection: given the entity ids of every camera surfaced by the extract
|
|
97
|
+
* archetype query (in query order) and the optional active-camera entity id,
|
|
98
|
+
* return the index of the active camera in `cameraEntities`, or `-1` to signal
|
|
99
|
+
* "no selection — use first-hit fallback".
|
|
100
|
+
*
|
|
101
|
+
* `-1` is returned when `activeEntity` is `undefined` (resource absent) OR when
|
|
102
|
+
* the id is not present among `cameraEntities` (stale / non-camera entity).
|
|
103
|
+
* Both cases preserve the existing first-hit behavior (plan-strategy D-2).
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* selectActiveCameraIndex([10, 20, 30], 20) === 1 // pick the 2nd camera
|
|
107
|
+
* selectActiveCameraIndex([10, 20, 30], undefined) === -1 // first-hit
|
|
108
|
+
* selectActiveCameraIndex([10, 20, 30], 999) === -1 // first-hit
|
|
109
|
+
*/
|
|
110
|
+
export function selectActiveCameraIndex(
|
|
111
|
+
cameraEntities: readonly number[],
|
|
112
|
+
activeEntity: number | undefined,
|
|
113
|
+
): number {
|
|
114
|
+
if (activeEntity === undefined) return -1;
|
|
115
|
+
return cameraEntities.indexOf(activeEntity);
|
|
116
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// M3 / w19: PassSelector matching logic
|
|
2
|
+
// (feat-20260526-material-asset-multipass-renderstate)
|
|
3
|
+
//
|
|
4
|
+
// Pure-function helpers for matching MaterialPass tags against
|
|
5
|
+
// a PassSelector. Plan-strategy D-4: Tags free Record + PassSelector
|
|
6
|
+
// Record<string, string[]>. Requirements AC-05.
|
|
7
|
+
|
|
8
|
+
import type { MaterialPass, PassSelector } from '@forgeax/engine-types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Test whether a pass's tags match a {@link PassSelector}.
|
|
12
|
+
*
|
|
13
|
+
* Matching rule (AC-05): every key in the selector must exist in the pass's
|
|
14
|
+
* `tags` and the pass's tag value must be in the selector's value list for
|
|
15
|
+
* that key. An empty selector matches every pass.
|
|
16
|
+
*
|
|
17
|
+
* @param tags The pass-level tags (free key-value pairs)
|
|
18
|
+
* @param selector The selector to match against
|
|
19
|
+
*/
|
|
20
|
+
export function matchPass(tags: Record<string, string>, selector: PassSelector): boolean {
|
|
21
|
+
if (Object.keys(selector).length === 0) return true;
|
|
22
|
+
for (const [key, allowedValues] of Object.entries(selector)) {
|
|
23
|
+
const passValue = tags[key];
|
|
24
|
+
if (passValue === undefined) return false;
|
|
25
|
+
if ((allowedValues as readonly string[]).length === 0) return false;
|
|
26
|
+
if (!(allowedValues as readonly string[]).includes(passValue)) return false;
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Filter passes whose tags match the given {@link PassSelector}.
|
|
33
|
+
*
|
|
34
|
+
* An empty selector matches all passes (returns the input array reference).
|
|
35
|
+
* Otherwise each pass is checked via {@link matchPass}.
|
|
36
|
+
*
|
|
37
|
+
* @param passes The material's pass descriptors
|
|
38
|
+
* @param selector The pass selector
|
|
39
|
+
* @returns Filtered array of matching passes
|
|
40
|
+
*/
|
|
41
|
+
export function selectPasses(
|
|
42
|
+
passes: readonly MaterialPass[],
|
|
43
|
+
selector: PassSelector,
|
|
44
|
+
): readonly MaterialPass[] {
|
|
45
|
+
if (Object.keys(selector).length === 0) return passes;
|
|
46
|
+
return passes.filter((p) =>
|
|
47
|
+
matchPass((p.renderState?.tags as Record<string, string> | undefined) ?? {}, selector),
|
|
48
|
+
);
|
|
49
|
+
}
|