@forgeax/engine-render 0.1.2
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 +1019 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/__tests__/analytic-sky-contract.test.d.ts +2 -0
- package/dist/__tests__/analytic-sky-contract.test.d.ts.map +1 -0
- package/dist/__tests__/analytic-sky-falsify.test.d.ts +2 -0
- package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +1 -0
- package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +2 -0
- package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +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__/backend-selection.integration.test.d.ts +2 -0
- package/dist/__tests__/backend-selection.integration.test.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__/camera-temporal.test-d.d.ts +2 -0
- package/dist/__tests__/camera-temporal.test-d.d.ts.map +1 -0
- package/dist/__tests__/camera-temporal.test.d.ts +2 -0
- package/dist/__tests__/camera-temporal.test.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__/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__/directional-shadow-probe-atlas-layout.unit.test.d.ts +2 -0
- package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +1 -0
- package/dist/__tests__/environment-inspection.test.d.ts +2 -0
- package/dist/__tests__/environment-inspection.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__/fog-ai-user.fixture.d.ts +2 -0
- package/dist/__tests__/fog-ai-user.fixture.d.ts.map +1 -0
- package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +16 -0
- package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +1 -0
- package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +2 -0
- package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fog-inspection.integration.test.d.ts +2 -0
- package/dist/__tests__/fog-inspection.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fog-owner-state.integration.test.d.ts +2 -0
- package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +2 -0
- package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fog-public-surface.integration.test.d.ts +2 -0
- package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fog-ray-contract.integration.test.d.ts +2 -0
- package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fog-source-absence.integration.test.d.ts +2 -0
- package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fog-temporal.integration.test.d.ts +2 -0
- package/dist/__tests__/fog-temporal.integration.test.d.ts.map +1 -0
- package/dist/__tests__/frame-chain.unit.test.d.ts +2 -0
- package/dist/__tests__/frame-chain.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__/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 +12 -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.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-field-type-owner.test-d.d.ts +2 -0
- package/dist/__tests__/gpu-scene-field-type-owner.test-d.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__/hdrp-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +2 -0
- package/dist/__tests__/ibl/ibl-fallback.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-derived-error-stop-draw.integration.test.d.ts +2 -0
- package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +1 -0
- package/dist/__tests__/material-derived-payload.integration.test.d.ts +2 -0
- package/dist/__tests__/material-derived-payload.integration.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__/materials.unit.test.d.ts +2 -0
- package/dist/__tests__/materials.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-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__/param-schema-projection-census.unit.test.d.ts +2 -0
- package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +1 -0
- package/dist/__tests__/persistent-render-scene.unit.test.d.ts +2 -0
- package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +2 -0
- package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-pass-trace.test.d.ts +2 -0
- package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +2 -0
- package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/plugin.test.d.ts +2 -0
- package/dist/__tests__/plugin.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-backend-matrix.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.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-recording.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-resolver-recording.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-pipeline-id.test-d.d.ts +2 -0
- package/dist/__tests__/public-pipeline-id.test-d.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-dispatch-membership.unit.test.d.ts +2 -0
- package/dist/__tests__/render-dispatch-membership.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-construction.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-construction.unit.test.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-error-code-owner.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-error-code-owner.test-d.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-buffer-usage-owner.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.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-graph.integration.test.d.ts +2 -0
- package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-order.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-order.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-recording.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.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-staging.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-staging.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__/renderer-render-scene-public.test-d.d.ts +2 -0
- package/dist/__tests__/renderer-render-scene-public.test-d.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__/scene-temporal-coverage.unit.test.d.ts +2 -0
- package/dist/__tests__/scene-temporal-coverage.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-kernel-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sun-snapshot-consumers.test.d.ts +2 -0
- package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +1 -0
- package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +2 -0
- package/dist/__tests__/surface-backend-kind-owner.test-d.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__/taa-history-store.unit.test.d.ts +2 -0
- package/dist/__tests__/taa-history-store.unit.test.d.ts.map +1 -0
- package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +2 -0
- package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +1 -0
- package/dist/__tests__/temporal-inspection.unit.test.d.ts +2 -0
- package/dist/__tests__/temporal-inspection.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-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/assets/__tests__/asset-decoders.unit.test.d.ts +2 -0
- package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +1 -0
- package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +2 -0
- package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +1 -0
- package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +2 -0
- package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +1 -0
- package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +2 -0
- package/dist/assets/__tests__/resolve-render-asset.unit.test.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 +5 -0
- package/dist/authoring.mjs.map +1 -0
- package/dist/chunk-33UF5SAO.mjs +7397 -0
- package/dist/chunk-33UF5SAO.mjs.map +1 -0
- package/dist/chunk-A5QCJSNL.mjs +29913 -0
- package/dist/chunk-A5QCJSNL.mjs.map +1 -0
- package/dist/chunk-JMSB7AR4.mjs +3 -0
- package/dist/chunk-JMSB7AR4.mjs.map +1 -0
- package/dist/chunk-LXNGO6AO.mjs +569 -0
- package/dist/chunk-LXNGO6AO.mjs.map +1 -0
- package/dist/chunk-QRXPSX4X.mjs +659 -0
- package/dist/chunk-QRXPSX4X.mjs.map +1 -0
- package/dist/chunk-YAKEQPWO.mjs +1439 -0
- package/dist/chunk-YAKEQPWO.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__/atmosphere-red.test.d.ts +2 -0
- package/dist/components/__tests__/atmosphere-red.test.d.ts.map +1 -0
- package/dist/components/__tests__/atmosphere.test.d.ts +2 -0
- package/dist/components/__tests__/atmosphere.test.d.ts.map +1 -0
- package/dist/components/__tests__/fog.test-d.d.ts +2 -0
- package/dist/components/__tests__/fog.test-d.d.ts.map +1 -0
- package/dist/components/__tests__/fog.test.d.ts +2 -0
- package/dist/components/__tests__/fog.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/atmosphere.d.ts +18 -0
- package/dist/components/atmosphere.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/environment.d.ts +116 -0
- package/dist/components/environment.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 +22 -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/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/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/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 +75 -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 +37 -0
- package/dist/components/sprite-playback-mode.d.ts.map +1 -0
- package/dist/components/sprite-region-override.d.ts +47 -0
- package/dist/components/sprite-region-override.d.ts.map +1 -0
- package/dist/components/tile-layer.d.ts +101 -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 +2 -0
- package/dist/construct-renderer.d.ts.map +1 -0
- package/dist/construct-renderer.mjs +6 -0
- package/dist/construct-renderer.mjs.map +1 -0
- package/dist/debug-draw-glue.d.ts +56 -0
- package/dist/debug-draw-glue.d.ts.map +1 -0
- package/dist/deferred-lighting.d.ts +13 -0
- package/dist/deferred-lighting.d.ts.map +1 -0
- package/dist/dynamic-texture-store.d.ts +42 -0
- package/dist/dynamic-texture-store.d.ts.map +1 -0
- package/dist/engine-metrics.d.ts +23 -0
- package/dist/engine-metrics.d.ts.map +1 -0
- package/dist/environment/__tests__/failure-injection.test.d.ts +2 -0
- package/dist/environment/__tests__/failure-injection.test.d.ts.map +1 -0
- package/dist/environment/__tests__/generation-red.test.d.ts +2 -0
- package/dist/environment/__tests__/generation-red.test.d.ts.map +1 -0
- package/dist/environment/__tests__/generation.test.d.ts +2 -0
- package/dist/environment/__tests__/generation.test.d.ts.map +1 -0
- package/dist/environment/__tests__/graph-transaction.test.d.ts +2 -0
- package/dist/environment/__tests__/graph-transaction.test.d.ts.map +1 -0
- package/dist/environment/__tests__/inspection-red.test.d.ts +2 -0
- package/dist/environment/__tests__/inspection-red.test.d.ts.map +1 -0
- package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +2 -0
- package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +1 -0
- package/dist/environment/__tests__/pipeline-topology.test.d.ts +2 -0
- package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +1 -0
- package/dist/environment/__tests__/readiness.test.d.ts +2 -0
- package/dist/environment/__tests__/readiness.test.d.ts.map +1 -0
- package/dist/environment/__tests__/recovery.test.d.ts +2 -0
- package/dist/environment/__tests__/recovery.test.d.ts.map +1 -0
- package/dist/environment/__tests__/resize-dispose.test.d.ts +2 -0
- package/dist/environment/__tests__/resize-dispose.test.d.ts.map +1 -0
- package/dist/environment/__tests__/signature-red.test.d.ts +2 -0
- package/dist/environment/__tests__/signature-red.test.d.ts.map +1 -0
- package/dist/environment/__tests__/signature.test.d.ts +2 -0
- package/dist/environment/__tests__/signature.test.d.ts.map +1 -0
- package/dist/environment/descriptors.d.ts +2 -0
- package/dist/environment/descriptors.d.ts.map +1 -0
- package/dist/environment/extracted-environment.d.ts +53 -0
- package/dist/environment/extracted-environment.d.ts.map +1 -0
- package/dist/environment/generation.d.ts +62 -0
- package/dist/environment/generation.d.ts.map +1 -0
- package/dist/environment/gpu-bundle.d.ts +23 -0
- package/dist/environment/gpu-bundle.d.ts.map +1 -0
- package/dist/environment/graph.d.ts +108 -0
- package/dist/environment/graph.d.ts.map +1 -0
- package/dist/environment/inspection.d.ts +48 -0
- package/dist/environment/inspection.d.ts.map +1 -0
- package/dist/environment/lifecycle.d.ts +22 -0
- package/dist/environment/lifecycle.d.ts.map +1 -0
- package/dist/environment/readiness.d.ts +29 -0
- package/dist/environment/readiness.d.ts.map +1 -0
- package/dist/environment/signature.d.ts +70 -0
- package/dist/environment/signature.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 +78 -0
- package/dist/errors/recover.d.ts.map +1 -0
- package/dist/errors/render.d.ts +633 -0
- package/dist/errors/render.d.ts.map +1 -0
- package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +2 -0
- package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +1 -0
- package/dist/extract/__tests__/environment-source.test.d.ts +2 -0
- package/dist/extract/__tests__/environment-source.test.d.ts.map +1 -0
- package/dist/extract/__tests__/schema-readers.unit.test.d.ts +2 -0
- package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +1 -0
- package/dist/extract/directional-csm.d.ts +129 -0
- package/dist/extract/directional-csm.d.ts.map +1 -0
- package/dist/extract/index.d.ts +5 -0
- package/dist/extract/index.d.ts.map +1 -0
- package/dist/extract/material-interface.d.ts +56 -0
- package/dist/extract/material-interface.d.ts.map +1 -0
- package/dist/extract/schema-readers.d.ts +20 -0
- package/dist/extract/schema-readers.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/graph-contribution.d.ts +64 -0
- package/dist/features/graph-contribution.d.ts.map +1 -0
- package/dist/features/host.d.ts +100 -0
- package/dist/features/host.d.ts.map +1 -0
- package/dist/features/index.d.ts +21 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/morph/index.d.ts +3 -0
- package/dist/features/morph/index.d.ts.map +1 -0
- package/dist/features/morph/morph-bounds.d.ts +42 -0
- package/dist/features/morph/morph-bounds.d.ts.map +1 -0
- package/dist/features/morph/morph-feature.d.ts +45 -0
- package/dist/features/morph/morph-feature.d.ts.map +1 -0
- package/dist/features/prepared-gpu-work.d.ts +113 -0
- package/dist/features/prepared-gpu-work.d.ts.map +1 -0
- package/dist/features/prepared-graphics-store.d.ts +65 -0
- package/dist/features/prepared-graphics-store.d.ts.map +1 -0
- package/dist/features/prepared-graphics.d.ts +225 -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 +15 -0
- package/dist/features/render-graph-contribution.d.ts.map +1 -0
- package/dist/features/render-graph-raster.d.ts +34 -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/scene-temporal.d.ts +45 -0
- package/dist/features/scene-temporal.d.ts.map +1 -0
- package/dist/features/taa-resolve.d.ts +21 -0
- package/dist/features/taa-resolve.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 +247 -0
- package/dist/features/types.d.ts.map +1 -0
- package/dist/frame-chain.d.ts +14 -0
- package/dist/frame-chain.d.ts.map +1 -0
- package/dist/fullscreen-post-process-pass.d.ts +178 -0
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -0
- package/dist/glyph-text-layout-system.d.ts +18 -0
- package/dist/glyph-text-layout-system.d.ts.map +1 -0
- package/dist/gpu-driven/batch-topology.d.ts +124 -0
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -0
- package/dist/gpu-driven/production-raster.d.ts +150 -0
- package/dist/gpu-driven/production-raster.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +141 -0
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -0
- package/dist/gpu-driven/view-reference.d.ts +15 -0
- package/dist/gpu-driven/view-reference.d.ts.map +1 -0
- package/dist/gpu-resource-store.d.ts +294 -0
- package/dist/gpu-resource-store.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 +171 -0
- package/dist/gpu-scene-schema.d.ts.map +1 -0
- package/dist/gpu-scene.d.ts +81 -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 +213 -0
- package/dist/hdrp-buffers.d.ts.map +1 -0
- package/dist/hdrp-cluster-membership.d.ts +2 -0
- package/dist/hdrp-cluster-membership.d.ts.map +1 -0
- package/dist/hdrp-pipeline.d.ts +36 -0
- package/dist/hdrp-pipeline.d.ts.map +1 -0
- package/dist/ibl/IblPipelineCache.d.ts +274 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -0
- package/dist/ibl/cubemap-projection.d.ts +23 -0
- package/dist/ibl/cubemap-projection.d.ts.map +1 -0
- package/dist/ibl/face-uniforms.d.ts +65 -0
- package/dist/ibl/face-uniforms.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 +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +5 -0
- package/dist/index.mjs.map +1 -0
- package/dist/instance-buffer-cache.d.ts +59 -0
- package/dist/instance-buffer-cache.d.ts.map +1 -0
- package/dist/internal.d.ts +74 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.mjs +45 -0
- package/dist/internal.mjs.map +1 -0
- package/dist/lifecycle.d.ts +28 -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 +50 -0
- package/dist/materials.d.ts.map +1 -0
- package/dist/mesh-material-bindings.d.ts +44 -0
- package/dist/mesh-material-bindings.d.ts.map +1 -0
- package/dist/mesh-update-errors.d.ts +71 -0
- package/dist/mesh-update-errors.d.ts.map +1 -0
- package/dist/mipmap-generator.d.ts +39 -0
- package/dist/mipmap-generator.d.ts.map +1 -0
- package/dist/param-schema-projection-census.d.ts +18 -0
- package/dist/param-schema-projection-census.d.ts.map +1 -0
- package/dist/pbr-pipeline.d.ts +253 -0
- package/dist/pbr-pipeline.d.ts.map +1 -0
- package/dist/persistent-render-scene.d.ts +158 -0
- package/dist/persistent-render-scene.d.ts.map +1 -0
- package/dist/pipeline/index.d.ts +11 -0
- package/dist/pipeline/index.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-errors.d.ts +110 -0
- package/dist/pipeline-errors.d.ts.map +1 -0
- package/dist/pipeline-spec.d.ts +506 -0
- package/dist/pipeline-spec.d.ts.map +1 -0
- package/dist/plugin.d.ts +17 -0
- package/dist/plugin.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/__tests__/schema-readers.unit.test.d.ts +2 -0
- package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +1 -0
- package/dist/prepare/index.d.ts +4 -0
- package/dist/prepare/index.d.ts.map +1 -0
- package/dist/prepare/prepared-graphics-resolver.d.ts +62 -0
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -0
- package/dist/prepare/schema-readers.d.ts +11 -0
- package/dist/prepare/schema-readers.d.ts.map +1 -0
- package/dist/record/__tests__/environment-record.test.d.ts +2 -0
- package/dist/record/__tests__/environment-record.test.d.ts.map +1 -0
- package/dist/record/__tests__/frame-targets.unit.test.d.ts +2 -0
- package/dist/record/__tests__/frame-targets.unit.test.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__/membership-timing.unit.test.d.ts +2 -0
- package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +1 -0
- package/dist/record/__tests__/render-submission.integration.test.d.ts +2 -0
- package/dist/record/__tests__/render-submission.integration.test.d.ts.map +1 -0
- package/dist/record/__tests__/render-submission.perf.test.d.ts +2 -0
- package/dist/record/__tests__/render-submission.perf.test.d.ts.map +1 -0
- package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +2 -0
- package/dist/record/__tests__/shadow-submit-mode.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/__tests__/view-ubo-layout.unit.test.d.ts +2 -0
- package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +187 -0
- package/dist/record/frame-lighting.d.ts.map +1 -0
- package/dist/record/frame-observation.d.ts +38 -0
- package/dist/record/frame-observation.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 +53 -0
- package/dist/record/frame-targets.d.ts.map +1 -0
- package/dist/record/frame.d.ts +59 -0
- package/dist/record/frame.d.ts.map +1 -0
- package/dist/record/helpers.d.ts +101 -0
- package/dist/record/helpers.d.ts.map +1 -0
- package/dist/record/index.d.ts +15 -0
- package/dist/record/index.d.ts.map +1 -0
- package/dist/record/main-pass-geometry.d.ts +20 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -0
- package/dist/record/main-pass-material.d.ts +173 -0
- package/dist/record/main-pass-material.d.ts.map +1 -0
- package/dist/record/main-pass-skin.d.ts +46 -0
- package/dist/record/main-pass-skin.d.ts.map +1 -0
- package/dist/record/main-pass-sprite-draws.d.ts +18 -0
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -0
- package/dist/record/main-pass-sprite.d.ts +69 -0
- package/dist/record/main-pass-sprite.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/material-payload.d.ts +43 -0
- package/dist/record/material-payload.d.ts.map +1 -0
- package/dist/record/material-slot-plan.d.ts +26 -0
- package/dist/record/material-slot-plan.d.ts.map +1 -0
- package/dist/record/membership-timing.d.ts +232 -0
- package/dist/record/membership-timing.d.ts.map +1 -0
- package/dist/record/mesh-ssbo.d.ts +173 -0
- package/dist/record/mesh-ssbo.d.ts.map +1 -0
- package/dist/record/shadow-caster-uniform.d.ts +8 -0
- package/dist/record/shadow-caster-uniform.d.ts.map +1 -0
- package/dist/record/shadow-pass.d.ts +125 -0
- package/dist/record/shadow-pass.d.ts.map +1 -0
- package/dist/record/shadow-submit-mode.d.ts +66 -0
- package/dist/record/shadow-submit-mode.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 +13 -0
- package/dist/record/typed-frame-graph.d.ts.map +1 -0
- package/dist/record/view-ubo.d.ts +39 -0
- package/dist/record/view-ubo.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-dispatch-membership.d.ts +47 -0
- package/dist/render-dispatch-membership.d.ts.map +1 -0
- package/dist/render-graph-primitives.d.ts +424 -0
- package/dist/render-graph-primitives.d.ts.map +1 -0
- package/dist/render-pipeline-context.d.ts +289 -0
- package/dist/render-pipeline-context.d.ts.map +1 -0
- package/dist/render-pipeline-target.d.ts +16 -0
- package/dist/render-pipeline-target.d.ts.map +1 -0
- package/dist/render-pipeline.d.ts +149 -0
- package/dist/render-pipeline.d.ts.map +1 -0
- package/dist/render-scene-projection.d.ts +174 -0
- package/dist/render-scene-projection.d.ts.map +1 -0
- package/dist/render-system-extract.d.ts +1096 -0
- package/dist/render-system-extract.d.ts.map +1 -0
- package/dist/render-system-fold.d.ts +266 -0
- package/dist/render-system-fold.d.ts.map +1 -0
- package/dist/render-system.d.ts +814 -0
- package/dist/render-system.d.ts.map +1 -0
- package/dist/renderer/asset-service.d.ts +10 -0
- package/dist/renderer/asset-service.d.ts.map +1 -0
- package/dist/renderer/backend-selection.d.ts +26 -0
- package/dist/renderer/backend-selection.d.ts.map +1 -0
- package/dist/renderer/environment-classify.d.ts +6 -0
- package/dist/renderer/environment-classify.d.ts.map +1 -0
- package/dist/renderer/environment-error.d.ts +13 -0
- package/dist/renderer/environment-error.d.ts.map +1 -0
- package/dist/renderer/material/assembly.d.ts +22 -0
- package/dist/renderer/material/assembly.d.ts.map +1 -0
- package/dist/renderer/material/pipeline-projection.d.ts +91 -0
- package/dist/renderer/material/pipeline-projection.d.ts.map +1 -0
- package/dist/renderer/renderer-factory.d.ts +283 -0
- package/dist/renderer/renderer-factory.d.ts.map +1 -0
- package/dist/renderer.d.ts +771 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts +33 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -0
- package/dist/scene-utils/collect-subtree.d.ts +11 -0
- package/dist/scene-utils/collect-subtree.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 +31 -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/ssao-data.d.ts +34 -0
- package/dist/ssao-data.d.ts.map +1 -0
- package/dist/surface-format.d.ts +10 -0
- package/dist/surface-format.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 +51 -0
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -0
- package/dist/systems/transparent-sort-config.d.ts +91 -0
- package/dist/systems/transparent-sort-config.d.ts.map +1 -0
- package/dist/taa-history-store.d.ts +88 -0
- package/dist/taa-history-store.d.ts.map +1 -0
- package/dist/temporal-coverage.d.ts +35 -0
- package/dist/temporal-coverage.d.ts.map +1 -0
- package/dist/temporal-frame-transaction.d.ts +92 -0
- package/dist/temporal-frame-transaction.d.ts.map +1 -0
- package/dist/temporal-inspection.d.ts +57 -0
- package/dist/temporal-inspection.d.ts.map +1 -0
- package/dist/temporal-view.d.ts +43 -0
- package/dist/temporal-view.d.ts.map +1 -0
- package/dist/tilemap/resolve-tileset-runtime.d.ts +23 -0
- package/dist/tilemap/resolve-tileset-runtime.d.ts.map +1 -0
- package/dist/tilemap-chunk-extract-system.d.ts +142 -0
- package/dist/tilemap-chunk-extract-system.d.ts.map +1 -0
- package/dist/typed-render-graph-primitives.d.ts +59 -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/dist/urp-pipeline.d.ts +4 -0
- package/dist/urp-pipeline.d.ts.map +1 -0
- package/package.json +94 -0
- package/src/__tests__/analytic-sky-contract.test.ts +27 -0
- package/src/__tests__/analytic-sky-falsify-carriers.mjs +43 -0
- package/src/__tests__/analytic-sky-falsify.test.ts +94 -0
- package/src/__tests__/assets-runtime-handoff.integration.test.ts +36 -0
- package/src/__tests__/authoring-path.unit.test.ts +14 -0
- package/src/__tests__/backend-selection-rhi-capture.test-d.ts +21 -0
- package/src/__tests__/backend-selection.integration.test.ts +11 -0
- package/src/__tests__/callback-inference.test-d.ts +5 -0
- package/src/__tests__/camera-temporal.test-d.ts +8 -0
- package/src/__tests__/camera-temporal.test.ts +188 -0
- package/src/__tests__/cluster-binner.test.ts +272 -0
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +17 -0
- package/src/__tests__/construct-renderer-identity.unit.test.ts +10 -0
- package/src/__tests__/direct-extract-consumer-contract.test-d.ts +34 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +71 -0
- package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +18 -0
- package/src/__tests__/environment-inspection.test.ts +45 -0
- package/src/__tests__/factory-contract.integration.test.ts +331 -0
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +18 -0
- package/src/__tests__/fog-ai-user.fixture.ts +350 -0
- package/src/__tests__/fog-custom-render-feature.fixture.ts +33 -0
- package/src/__tests__/fog-custom-render-feature.integration.test.ts +76 -0
- package/src/__tests__/fog-inspection.integration.test.ts +127 -0
- package/src/__tests__/fog-owner-state.integration.test.ts +112 -0
- package/src/__tests__/fog-pipeline-topology.integration.test.ts +93 -0
- package/src/__tests__/fog-public-surface.integration.test.ts +60 -0
- package/src/__tests__/fog-ray-contract.integration.test.ts +73 -0
- package/src/__tests__/fog-source-absence.integration.test.ts +51 -0
- package/src/__tests__/fog-temporal.integration.test.ts +115 -0
- package/src/__tests__/frame-chain.unit.test.ts +26 -0
- package/src/__tests__/frame-observation.contract.test.ts +103 -0
- package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +172 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +347 -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 +609 -0
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +90 -0
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +192 -0
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +128 -0
- package/src/__tests__/gpu-driven-view.browser.test.ts +19 -0
- package/src/__tests__/gpu-driven-view.dawn.test.ts +17 -0
- package/src/__tests__/gpu-driven-view.unit.test.ts +455 -0
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +59 -0
- package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +27 -0
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +309 -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 +209 -0
- package/src/__tests__/gpu-scene.unit.test.ts +161 -0
- package/src/__tests__/hdrp-pipeline.unit.test.ts +100 -0
- package/src/__tests__/ibl/ibl-fallback.unit.test.ts +23 -0
- package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +124 -0
- package/src/__tests__/injection-kind-owner.test-d.ts +14 -0
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +719 -0
- package/src/__tests__/light-buffer-layout.unit.test.ts +85 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +24 -0
- package/src/__tests__/material-cooked-projection.unit.test.ts +177 -0
- package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +69 -0
- package/src/__tests__/material-derived-payload.integration.test.ts +164 -0
- package/src/__tests__/material-snapshot-mutation.integration.test.ts +58 -0
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +113 -0
- package/src/__tests__/material-stride-surface.unit.test.ts +32 -0
- package/src/__tests__/materials.unit.test.ts +25 -0
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +107 -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 +166 -0
- package/src/__tests__/morph-feature-gpu-work.integration.test.ts +78 -0
- package/src/__tests__/morph-visual-evidence.integration.test.ts +66 -0
- package/src/__tests__/nineslice-handle-surface.unit.test.ts +14 -0
- package/src/__tests__/param-schema-projection-census.unit.test.ts +40 -0
- package/src/__tests__/persistent-render-scene.unit.test.ts +1311 -0
- package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +167 -0
- package/src/__tests__/pipeline-pass-trace.test.ts +92 -0
- package/src/__tests__/pipeline-stage-owner.test-d.ts +13 -0
- package/src/__tests__/plugin.test.ts +25 -0
- package/src/__tests__/post-process-error-policy-owner.unit.test.ts +208 -0
- package/src/__tests__/prepared-buffer-kind-owner.test-d.ts +29 -0
- package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +129 -0
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +140 -0
- package/src/__tests__/prepared-graphics-generation.unit.test.ts +175 -0
- package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +206 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +29 -0
- package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +180 -0
- package/src/__tests__/prepared-graphics-resolver.unit.test.ts +287 -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 +70 -0
- package/src/__tests__/profiler-phase-token.test.ts +84 -0
- package/src/__tests__/public-pipeline-id.test-d.ts +6 -0
- package/src/__tests__/public-surface.test-d.ts +32 -0
- package/src/__tests__/recover-error-policy-owner.unit.test.ts +127 -0
- package/src/__tests__/render-dispatch-membership.unit.test.ts +117 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +115 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +234 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +84 -0
- package/src/__tests__/render-feature-assembly.test-d.ts +51 -0
- package/src/__tests__/render-feature-construction.unit.test.ts +124 -0
- package/src/__tests__/render-feature-context.test-d.ts +81 -0
- package/src/__tests__/render-feature-contract.test-d.ts +58 -0
- package/src/__tests__/render-feature-diagnostics.unit.test.ts +151 -0
- package/src/__tests__/render-feature-docs.unit.test.ts +88 -0
- package/src/__tests__/render-feature-error-code-owner.test-d.ts +27 -0
- package/src/__tests__/render-feature-errors.unit.test.ts +47 -0
- package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +46 -0
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +377 -0
- package/src/__tests__/render-feature-graph.integration.test.ts +205 -0
- package/src/__tests__/render-feature-graphics-staging.unit.test.ts +200 -0
- package/src/__tests__/render-feature-order.unit.test.ts +66 -0
- package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +101 -0
- package/src/__tests__/render-feature-prepared-errors.test-d.ts +82 -0
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +141 -0
- package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +122 -0
- package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +59 -0
- package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +107 -0
- package/src/__tests__/render-feature-prepared-graphics.test-d.ts +96 -0
- package/src/__tests__/render-feature-prepared-graphics.unit.test.ts +121 -0
- package/src/__tests__/render-feature-public-surface.test-d.ts +75 -0
- package/src/__tests__/render-feature-retry.unit.test.ts +128 -0
- package/src/__tests__/render-feature-scheduling.unit.test.ts +122 -0
- package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +146 -0
- package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +236 -0
- package/src/__tests__/render-feature-staging.unit.test.ts +94 -0
- package/src/__tests__/render-feature-visibility-context.test-d.ts +38 -0
- package/src/__tests__/render-feature-visibility-context.unit.test.ts +38 -0
- package/src/__tests__/render-feature-zero-work.unit.test.ts +82 -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 +206 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +125 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +10 -0
- package/src/__tests__/renderer-render-scene-public.test-d.ts +27 -0
- package/src/__tests__/rhi-backend-package-boundary.unit.test.ts +11 -0
- package/src/__tests__/scene-temporal-coverage.unit.test.ts +259 -0
- package/src/__tests__/scriptable-pack-consumer.test-d.ts +14 -0
- package/src/__tests__/shader-stage-surface.unit.test.ts +38 -0
- package/src/__tests__/ssao-kernel-surface.unit.test.ts +15 -0
- package/src/__tests__/sun-snapshot-consumers.test.ts +35 -0
- package/src/__tests__/surface-backend-kind-owner.test-d.ts +42 -0
- package/src/__tests__/surface-configuration.unit.test.ts +92 -0
- package/src/__tests__/taa-history-store.unit.test.ts +196 -0
- package/src/__tests__/temporal-frame-transaction.integration.test.ts +537 -0
- package/src/__tests__/temporal-inspection.unit.test.ts +138 -0
- package/src/__tests__/texture-usage-surface.unit.test.ts +61 -0
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +389 -0
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +52 -0
- package/src/__tests__/urp-pipeline.unit.test.ts +14 -0
- package/src/__tests__/vertex-color-pipeline.unit.test.ts +124 -0
- package/src/__tests__/vertex-layout-consumer.unit.test.ts +25 -0
- package/src/__tests__/visibility-diagnostics.integration.test.ts +66 -0
- package/src/__tests__/visibility-extract.integration.test.ts +89 -0
- package/src/__tests__/visibility-extract.perf.test.ts +96 -0
- package/src/__tests__/visibility-feature-dedup.integration.test.ts +57 -0
- package/src/__tests__/visibility-hidden-report.unit.test.ts +37 -0
- package/src/__tests__/visibility-instances.integration.test.ts +50 -0
- package/src/__tests__/visibility-multi-world.integration.test.ts +54 -0
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +191 -0
- package/src/__tests__/visibility-producer-matrix.unit.test.ts +96 -0
- package/src/__tests__/visibility-public-surface.test-d.ts +26 -0
- package/src/__tests__/visibility-resolver.unit.test.ts +84 -0
- package/src/__tests__/visibility-snapshot-contract.unit.test.ts +59 -0
- package/src/__tests__/vocabulary.unit.test.ts +21 -0
- package/src/assets/__tests__/asset-decoders.unit.test.ts +92 -0
- package/src/assets/__tests__/mipmap-generator.unit.test.ts +52 -0
- package/src/assets/__tests__/render-asset-port.unit.test.ts +54 -0
- package/src/assets/__tests__/resolve-render-asset.unit.test.ts +47 -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 +24 -0
- package/src/cluster-binner.ts +700 -0
- package/src/components/__tests__/atmosphere-red.test.ts +51 -0
- package/src/components/__tests__/atmosphere.test.ts +79 -0
- package/src/components/__tests__/fog.test-d.ts +49 -0
- package/src/components/__tests__/fog.test.ts +60 -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/atmosphere.ts +64 -0
- package/src/components/camera.ts +512 -0
- package/src/components/directional-light.ts +120 -0
- package/src/components/environment.ts +206 -0
- package/src/components/glyph-text.ts +63 -0
- package/src/components/index.ts +49 -0
- package/src/components/instances.ts +207 -0
- package/src/components/layer.ts +69 -0
- package/src/components/light-helpers.ts +188 -0
- package/src/components/mesh-filter.ts +59 -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/post-process-params.ts +35 -0
- package/src/components/scene-instance.ts +193 -0
- package/src/components/sort-key.ts +75 -0
- package/src/components/spot-light.ts +124 -0
- package/src/components/sprite-animation.ts +169 -0
- package/src/components/sprite-instances.ts +179 -0
- package/src/components/sprite-playback-mode.ts +73 -0
- package/src/components/sprite-region-override.ts +106 -0
- package/src/components/tile-layer.ts +161 -0
- package/src/components/tilemap.ts +48 -0
- package/src/components/visibility.ts +53 -0
- package/src/construct-renderer.ts +4 -0
- package/src/debug-draw-glue.ts +169 -0
- package/src/deferred-lighting.ts +92 -0
- package/src/dynamic-texture-store.ts +111 -0
- package/src/engine-metrics.ts +89 -0
- package/src/environment/README.md +76 -0
- package/src/environment/__tests__/failure-injection.test.ts +50 -0
- package/src/environment/__tests__/generation-red.test.ts +64 -0
- package/src/environment/__tests__/generation.test.ts +37 -0
- package/src/environment/__tests__/graph-transaction.test.ts +85 -0
- package/src/environment/__tests__/inspection-red.test.ts +53 -0
- package/src/environment/__tests__/lifecycle-evidence.test.ts +40 -0
- package/src/environment/__tests__/pipeline-topology.test.ts +33 -0
- package/src/environment/__tests__/readiness.test.ts +42 -0
- package/src/environment/__tests__/recovery.test.ts +62 -0
- package/src/environment/__tests__/resize-dispose.test.ts +30 -0
- package/src/environment/__tests__/signature-red.test.ts +45 -0
- package/src/environment/__tests__/signature.test.ts +60 -0
- package/src/environment/descriptors.ts +7 -0
- package/src/environment/extracted-environment.ts +239 -0
- package/src/environment/generation.ts +158 -0
- package/src/environment/gpu-bundle.ts +144 -0
- package/src/environment/graph.ts +588 -0
- package/src/environment/inspection.ts +107 -0
- package/src/environment/lifecycle.ts +124 -0
- package/src/environment/readiness.ts +76 -0
- package/src/environment/signature.ts +185 -0
- package/src/errors/ecs-validation.ts +16 -0
- package/src/errors/index.ts +3 -0
- package/src/errors/recover.ts +119 -0
- package/src/errors/render.ts +1244 -0
- package/src/extract/__tests__/directional-csm-domain.unit.test.ts +391 -0
- package/src/extract/__tests__/environment-source.test.ts +105 -0
- package/src/extract/__tests__/schema-readers.unit.test.ts +16 -0
- package/src/extract/directional-csm.ts +959 -0
- package/src/extract/index.ts +10 -0
- package/src/extract/material-interface.ts +604 -0
- package/src/extract/schema-readers.ts +27 -0
- package/src/extract/visibility.ts +120 -0
- package/src/features/graph-contribution.ts +577 -0
- package/src/features/host.ts +1097 -0
- package/src/features/index.ts +100 -0
- package/src/features/morph/index.ts +24 -0
- package/src/features/morph/morph-bounds.ts +123 -0
- package/src/features/morph/morph-feature.ts +287 -0
- package/src/features/prepared-gpu-work.ts +902 -0
- package/src/features/prepared-graphics-store.ts +435 -0
- package/src/features/prepared-graphics.ts +479 -0
- package/src/features/render-graph-compute.ts +60 -0
- package/src/features/render-graph-contribution.ts +95 -0
- package/src/features/render-graph-raster.ts +308 -0
- package/src/features/render-graph-resources.ts +36 -0
- package/src/features/scene-temporal.ts +274 -0
- package/src/features/taa-resolve.ts +244 -0
- package/src/features/targets.ts +83 -0
- package/src/features/types.ts +291 -0
- package/src/frame-chain.ts +21 -0
- package/src/fullscreen-post-process-pass.ts +406 -0
- package/src/glyph-text-layout-system.ts +447 -0
- package/src/gpu-driven/batch-topology.ts +423 -0
- package/src/gpu-driven/production-raster.ts +1705 -0
- package/src/gpu-driven/view-gpu.ts +849 -0
- package/src/gpu-driven/view-reference.ts +110 -0
- package/src/gpu-resource-store.ts +1921 -0
- package/src/gpu-resource.ts +159 -0
- package/src/gpu-scene-schema.ts +224 -0
- package/src/gpu-scene.ts +855 -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 +689 -0
- package/src/hdrp-cluster-membership.ts +70 -0
- package/src/hdrp-pipeline.ts +525 -0
- package/src/ibl/IblPipelineCache.ts +1246 -0
- package/src/ibl/cubemap-projection.ts +60 -0
- package/src/ibl/face-uniforms.ts +150 -0
- package/src/ibl/skylight-bind-group.ts +513 -0
- package/src/index.ts +271 -0
- package/src/instance-buffer-cache.ts +123 -0
- package/src/internal.ts +88 -0
- package/src/lifecycle.ts +123 -0
- package/src/light-buffer-layout.ts +346 -0
- package/src/materials.ts +236 -0
- package/src/mesh-material-bindings.ts +104 -0
- package/src/mesh-update-errors.ts +113 -0
- package/src/mipmap-generator.ts +244 -0
- package/src/param-schema-projection-census.ts +73 -0
- package/src/pbr-pipeline.ts +749 -0
- package/src/persistent-render-scene.ts +1752 -0
- package/src/pipeline/index.ts +40 -0
- package/src/pipeline-builder.ts +386 -0
- package/src/pipeline-errors.ts +172 -0
- package/src/pipeline-spec.ts +1768 -0
- package/src/plugin.ts +137 -0
- package/src/post-process-errors.ts +304 -0
- package/src/prepare/__tests__/schema-readers.unit.test.ts +16 -0
- package/src/prepare/index.ts +8 -0
- package/src/prepare/prepared-graphics-resolver.ts +455 -0
- package/src/prepare/schema-readers.ts +20 -0
- package/src/record/__tests__/environment-record.test.ts +35 -0
- package/src/record/__tests__/frame-targets.unit.test.ts +54 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +41 -0
- package/src/record/__tests__/material-slot-plan.unit.test.ts +76 -0
- package/src/record/__tests__/membership-timing.unit.test.ts +524 -0
- package/src/record/__tests__/render-submission.integration.test.ts +76 -0
- package/src/record/__tests__/render-submission.perf.test.ts +141 -0
- package/src/record/__tests__/shadow-submit-mode.unit.test.ts +88 -0
- package/src/record/__tests__/video-texture-view.unit.test.ts +90 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +101 -0
- package/src/record/frame-lighting.ts +1183 -0
- package/src/record/frame-observation.ts +122 -0
- package/src/record/frame-snapshot.ts +515 -0
- package/src/record/frame-targets.ts +372 -0
- package/src/record/frame.ts +1874 -0
- package/src/record/helpers.ts +289 -0
- package/src/record/index.ts +15 -0
- package/src/record/main-pass-geometry.ts +1014 -0
- package/src/record/main-pass-material.ts +716 -0
- package/src/record/main-pass-skin.ts +51 -0
- package/src/record/main-pass-sprite-draws.ts +1056 -0
- package/src/record/main-pass-sprite.ts +166 -0
- package/src/record/main-pass.ts +588 -0
- package/src/record/material-payload.ts +292 -0
- package/src/record/material-slot-plan.ts +68 -0
- package/src/record/membership-timing.ts +1012 -0
- package/src/record/mesh-ssbo.ts +406 -0
- package/src/record/shadow-caster-uniform.ts +37 -0
- package/src/record/shadow-pass.ts +2387 -0
- package/src/record/shadow-submit-mode.ts +277 -0
- package/src/record/skybox-post-pass.ts +594 -0
- package/src/record/typed-frame-graph.ts +499 -0
- package/src/record/view-ubo.ts +206 -0
- package/src/render-data.ts +385 -0
- package/src/render-dispatch-membership.ts +155 -0
- package/src/render-graph-primitives.ts +1586 -0
- package/src/render-pipeline-context.ts +332 -0
- package/src/render-pipeline-target.ts +96 -0
- package/src/render-pipeline.ts +343 -0
- package/src/render-scene-projection.ts +1738 -0
- package/src/render-system-extract.ts +5203 -0
- package/src/render-system-fold.ts +531 -0
- package/src/render-system.ts +3258 -0
- package/src/renderer/asset-service.ts +32 -0
- package/src/renderer/backend-selection.ts +121 -0
- package/src/renderer/environment-classify.ts +30 -0
- package/src/renderer/environment-error.ts +19 -0
- package/src/renderer/material/assembly.ts +53 -0
- package/src/renderer/material/pipeline-projection.ts +140 -0
- package/src/renderer/renderer-factory.ts +9062 -0
- package/src/renderer.ts +940 -0
- package/src/scene-instances/post-spawn-resolve-joints.ts +168 -0
- package/src/scene-utils/collect-subtree.ts +40 -0
- package/src/shadow-atlas.ts +244 -0
- package/src/ssao-buffers.ts +175 -0
- package/src/ssao-config.ts +61 -0
- package/src/ssao-data.ts +106 -0
- package/src/surface-format.ts +37 -0
- package/src/systems/active-camera.ts +116 -0
- package/src/systems/pass-selector.ts +49 -0
- package/src/systems/skin-palette-allocator.ts +294 -0
- package/src/systems/transparent-sort-config.ts +211 -0
- package/src/taa-history-store.ts +429 -0
- package/src/temporal-coverage.ts +106 -0
- package/src/temporal-frame-transaction.ts +301 -0
- package/src/temporal-inspection.ts +194 -0
- package/src/temporal-view.ts +174 -0
- package/src/tilemap/resolve-tileset-runtime.ts +72 -0
- package/src/tilemap-chunk-extract-system.ts +1307 -0
- package/src/typed-render-graph-primitives.ts +530 -0
- package/src/typed-shadow-passes.ts +195 -0
- package/src/urp-pipeline.ts +340 -0
|
@@ -0,0 +1,1014 @@
|
|
|
1
|
+
// @forgeax/engine-runtime - RenderSystem record stage: main-pass geometry draws.
|
|
2
|
+
// feat-20260704 M5/w31: further-split from main-pass.ts (AC-05 <=1500 lines/file).
|
|
3
|
+
// recordGeometryDraws + resolveGeometryInstanceBuffer, moved verbatim.
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
type BindGroup,
|
|
7
|
+
type Buffer,
|
|
8
|
+
type RenderPipeline,
|
|
9
|
+
RhiError,
|
|
10
|
+
type RhiRenderPassEncoder,
|
|
11
|
+
} from '@forgeax/engine-rhi';
|
|
12
|
+
import type { PassKind, PrimitiveTopology } from '@forgeax/engine-types';
|
|
13
|
+
import { GpuBuffer } from '../gpu-resource';
|
|
14
|
+
import {
|
|
15
|
+
GPU_BUFFER_USAGE_COPY_DST,
|
|
16
|
+
GPU_BUFFER_USAGE_STORAGE,
|
|
17
|
+
GPU_BUFFER_USAGE_UNIFORM,
|
|
18
|
+
} from '../gpu-usage';
|
|
19
|
+
import {
|
|
20
|
+
type InstanceBufferCacheEntry,
|
|
21
|
+
packTemporalInstanceTransforms,
|
|
22
|
+
} from '../instance-buffer-cache';
|
|
23
|
+
import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '../materials';
|
|
24
|
+
import { SKIN_MATERIAL_SHADER_ID } from '../pbr-pipeline';
|
|
25
|
+
import { variantSetFromVertexLayoutProjection } from '../pipeline';
|
|
26
|
+
import { renderStateHash } from '../pipeline-spec';
|
|
27
|
+
import type { _InternalRenderPipelineContext } from '../render-pipeline-context';
|
|
28
|
+
import { MATERIAL_PER_ENTITY_STRIDE } from '../render-system';
|
|
29
|
+
import type { MaterialSnapshot } from '../render-system-extract';
|
|
30
|
+
import type { RenderRecordPhase } from '../renderer';
|
|
31
|
+
import { routeMaterialReadiness } from '../renderer/material/pipeline-projection';
|
|
32
|
+
import { rasterItemKey, worldEntityKey } from './frame-snapshot';
|
|
33
|
+
import { isEntityFullyTransparent, selectGeometryPipeline } from './main-pass-material';
|
|
34
|
+
import { interleaveSpriteInstanceBuffer } from './main-pass-sprite';
|
|
35
|
+
import {
|
|
36
|
+
getOrCreateFromChain,
|
|
37
|
+
INSTANCE_UBO_FULL_ARRAY_BYTES,
|
|
38
|
+
MAX_UNIFORM_INSTANCES,
|
|
39
|
+
MESH_PER_ENTITY_STRIDE,
|
|
40
|
+
MESH_SSBO_BYTES,
|
|
41
|
+
MESH_UBO_FULL_ARRAY_BYTES,
|
|
42
|
+
} from './mesh-ssbo';
|
|
43
|
+
|
|
44
|
+
type GeometryInstanceDraw = {
|
|
45
|
+
readonly instanceBuffer: Buffer;
|
|
46
|
+
readonly instanceBindGroup: BindGroup;
|
|
47
|
+
readonly instanceCount: number;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
type GeometryBindingState = {
|
|
51
|
+
pipeline: RenderPipeline | null;
|
|
52
|
+
instancesBuffer: Buffer | null;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
type MaterialPipelineLookup = {
|
|
56
|
+
readonly materialShaderId: string;
|
|
57
|
+
readonly tonemapActive: boolean;
|
|
58
|
+
readonly renderStateKey: string;
|
|
59
|
+
readonly topology: PrimitiveTopology;
|
|
60
|
+
readonly indexFormat: 'uint16' | 'uint32';
|
|
61
|
+
readonly variantSet: string | undefined;
|
|
62
|
+
readonly passKind: PassKind;
|
|
63
|
+
readonly layoutProjection: import('@forgeax/engine-geometry').VertexLayoutProjection;
|
|
64
|
+
readonly sampleCount: number;
|
|
65
|
+
readonly colorFormatOverride: GPUTextureFormat | undefined;
|
|
66
|
+
readonly handle: RenderPipeline | null;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
type GeometryRecordProfileSegment = 'material-bind-groups' | 'pipeline-selection' | 'draw-submit';
|
|
70
|
+
|
|
71
|
+
function geometryRecordPhase(
|
|
72
|
+
passKind: PassKind,
|
|
73
|
+
segment: GeometryRecordProfileSegment,
|
|
74
|
+
): RenderRecordPhase {
|
|
75
|
+
const pass =
|
|
76
|
+
passKind === 'deferred' ? 'g-buffer' : passKind === 'temporal' ? 'scene-temporal' : 'forward';
|
|
77
|
+
return `record/graph-execute/${pass}/${segment}` as RenderRecordPhase;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function profileGeometrySegment<T>(
|
|
81
|
+
c: _InternalRenderPipelineContext,
|
|
82
|
+
passKind: PassKind,
|
|
83
|
+
segment: GeometryRecordProfileSegment,
|
|
84
|
+
action: () => T,
|
|
85
|
+
): T {
|
|
86
|
+
const profilePhase = c.profilePhase;
|
|
87
|
+
return profilePhase === undefined
|
|
88
|
+
? action()
|
|
89
|
+
: profilePhase(geometryRecordPhase(passKind, segment), action);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function submitSubmeshDraws(
|
|
93
|
+
pass: RhiRenderPassEncoder,
|
|
94
|
+
state: GeometryBindingState,
|
|
95
|
+
pipeline: RenderPipeline,
|
|
96
|
+
instanceDraws: readonly GeometryInstanceDraw[],
|
|
97
|
+
indexed: boolean,
|
|
98
|
+
indexCount: number,
|
|
99
|
+
vertexCount: number,
|
|
100
|
+
indexOffset: number,
|
|
101
|
+
): void {
|
|
102
|
+
if (state.pipeline !== pipeline) {
|
|
103
|
+
pass.setPipeline(pipeline);
|
|
104
|
+
state.pipeline = pipeline;
|
|
105
|
+
}
|
|
106
|
+
for (const instanceDraw of instanceDraws) {
|
|
107
|
+
if (instanceDraw.instanceBuffer !== state.instancesBuffer) {
|
|
108
|
+
pass.setBindGroup(3, instanceDraw.instanceBindGroup);
|
|
109
|
+
state.instancesBuffer = instanceDraw.instanceBuffer;
|
|
110
|
+
}
|
|
111
|
+
if (indexed) {
|
|
112
|
+
pass.drawIndexed(indexCount, instanceDraw.instanceCount, indexOffset, 0, 0);
|
|
113
|
+
} else {
|
|
114
|
+
pass.draw(vertexCount, instanceDraw.instanceCount, 0, 0);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* feat-20260704 M3/w19: per-entity geometry (main colour) draw loop, extracted
|
|
121
|
+
* verbatim from recordMainPass. Walks `c.validatedOrdered`, selects the
|
|
122
|
+
* per-entity / per-submesh PBR / unlit / skin pipeline, uploads the per-submesh
|
|
123
|
+
* material UBO slices, binds view / material / mesh / instances bind groups, and
|
|
124
|
+
* issues the per-submesh draws into the already-begun geometry `pass`. Fully-
|
|
125
|
+
* transparent entities are skipped here (drawn in the LDR blend sub-pass);
|
|
126
|
+
* mixed meshes draw their opaque submeshes here and skip transparent submeshes.
|
|
127
|
+
* The pass-selector match set, per-entity material-slot start table, MSAA sample
|
|
128
|
+
* count, group(2) bind group, and the shared per-submesh material BG builder are
|
|
129
|
+
* threaded in explicitly.
|
|
130
|
+
*
|
|
131
|
+
* @internal
|
|
132
|
+
*/
|
|
133
|
+
export function recordGeometryDraws(
|
|
134
|
+
c: _InternalRenderPipelineContext,
|
|
135
|
+
pass: RhiRenderPassEncoder,
|
|
136
|
+
matchedIndices: Set<number> | null,
|
|
137
|
+
materialSlotIndices: readonly (readonly number[])[],
|
|
138
|
+
sampleCount: number,
|
|
139
|
+
meshGroup2: BindGroup | null,
|
|
140
|
+
resolveMaterialBindGroup: (
|
|
141
|
+
materialSlot: number,
|
|
142
|
+
submeshMaterial: MaterialSnapshot,
|
|
143
|
+
entityKey: number,
|
|
144
|
+
) => BindGroup,
|
|
145
|
+
passKind: PassKind = 'forward',
|
|
146
|
+
): void {
|
|
147
|
+
const {
|
|
148
|
+
runtime,
|
|
149
|
+
pipelineState,
|
|
150
|
+
frameState,
|
|
151
|
+
bindGroupCounts,
|
|
152
|
+
dispatchCounts,
|
|
153
|
+
tonemapActive,
|
|
154
|
+
msaaActive,
|
|
155
|
+
validatedOrdered,
|
|
156
|
+
splitLdrSprite,
|
|
157
|
+
} = c;
|
|
158
|
+
const colorFormatOverride = c.transparentColorFormat as GPUTextureFormat | undefined;
|
|
159
|
+
let lastVertexBuffer: GpuBuffer | null = null;
|
|
160
|
+
let lastIndexBuffer: GpuBuffer | null = null;
|
|
161
|
+
const bindingState: GeometryBindingState = {
|
|
162
|
+
pipeline: null,
|
|
163
|
+
instancesBuffer: null,
|
|
164
|
+
};
|
|
165
|
+
const identityInstanceBuffer = pipelineState.identityInstanceBuffer;
|
|
166
|
+
const identityInstanceDraws: readonly GeometryInstanceDraw[] = [
|
|
167
|
+
{
|
|
168
|
+
instanceBuffer: identityInstanceBuffer,
|
|
169
|
+
instanceBindGroup: resolveGeometryInstancesBindGroup(c, identityInstanceBuffer),
|
|
170
|
+
instanceCount: 1,
|
|
171
|
+
},
|
|
172
|
+
];
|
|
173
|
+
const profilePhase = c.profilePhase;
|
|
174
|
+
const materialGroup1DynamicOffsets = new Uint32Array(1);
|
|
175
|
+
const meshGroup2DynamicOffsets = [0];
|
|
176
|
+
const skinGroup2DynamicOffsets = [0, 0, 0];
|
|
177
|
+
let lastStencilReference: number | null = null;
|
|
178
|
+
// feat-20260625-refactor-sprite-as-transparent-mesh M3 / w14 (D-7):
|
|
179
|
+
// sprite PSO selection no longer maintains a dedicated tag — the
|
|
180
|
+
// generic materialShaderId path covers sprite via the same per-
|
|
181
|
+
// MaterialShader pipeline cache PBR / unlit use. The 4-placeholder
|
|
182
|
+
// BG bindings (D-1 candidate b) still apply via the generic per-
|
|
183
|
+
// submesh BG construction below; sprite's `forgeax::sprite` shader
|
|
184
|
+
// module ships through the same cache key formula.
|
|
185
|
+
// Pipeline identity does not include material parameters or the material
|
|
186
|
+
// asset handle. Keying this cache by material handle therefore misses for
|
|
187
|
+
// every distinct asset even when all assets use the same PSO. The nested
|
|
188
|
+
// table keeps lookup O(1) by shader and immutable render-state identity; the
|
|
189
|
+
// renderer's authoritative cache still owns lifetime/invalidation, while
|
|
190
|
+
// this frame-local table removes the hot call/lookup overhead.
|
|
191
|
+
const materialPipelineLookupCache = new Map<string, Map<string, MaterialPipelineLookup[]>>();
|
|
192
|
+
const resolveMaterialPipeline = (
|
|
193
|
+
materialShaderId: string,
|
|
194
|
+
renderState: MaterialSnapshot['renderState'],
|
|
195
|
+
topology: PrimitiveTopology,
|
|
196
|
+
indexFormat: 'uint16' | 'uint32',
|
|
197
|
+
variantSet: string | undefined,
|
|
198
|
+
colorFormat: GPUTextureFormat | undefined,
|
|
199
|
+
layoutProjection: import('@forgeax/engine-geometry').VertexLayoutProjection,
|
|
200
|
+
materialGuid?: string,
|
|
201
|
+
): RenderPipeline | null => {
|
|
202
|
+
const renderStateKey = renderStateHash(renderState);
|
|
203
|
+
const shaderLookupCache = materialPipelineLookupCache.get(materialShaderId);
|
|
204
|
+
const cachedLookups = shaderLookupCache?.get(renderStateKey);
|
|
205
|
+
if (cachedLookups !== undefined) {
|
|
206
|
+
for (const cached of cachedLookups) {
|
|
207
|
+
if (
|
|
208
|
+
cached.tonemapActive === tonemapActive &&
|
|
209
|
+
cached.renderStateKey === renderStateKey &&
|
|
210
|
+
cached.topology === topology &&
|
|
211
|
+
cached.indexFormat === indexFormat &&
|
|
212
|
+
cached.variantSet === variantSet &&
|
|
213
|
+
cached.passKind === passKind &&
|
|
214
|
+
cached.layoutProjection.digest === layoutProjection.digest &&
|
|
215
|
+
cached.sampleCount === sampleCount &&
|
|
216
|
+
cached.colorFormatOverride === colorFormat
|
|
217
|
+
) {
|
|
218
|
+
return cached.handle;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const resolvedVariantSetResult = variantSetFromVertexLayoutProjection(
|
|
223
|
+
layoutProjection,
|
|
224
|
+
variantSet,
|
|
225
|
+
);
|
|
226
|
+
if (!resolvedVariantSetResult.ok) {
|
|
227
|
+
runtime.errorRegistry.fire(resolvedVariantSetResult.error);
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
const resolvedVariantSet = resolvedVariantSetResult.value;
|
|
231
|
+
const resolvePipeline = () =>
|
|
232
|
+
runtime.getMaterialShaderPipeline?.(
|
|
233
|
+
materialShaderId,
|
|
234
|
+
tonemapActive,
|
|
235
|
+
renderState,
|
|
236
|
+
topology,
|
|
237
|
+
indexFormat,
|
|
238
|
+
resolvedVariantSet,
|
|
239
|
+
passKind,
|
|
240
|
+
undefined,
|
|
241
|
+
sampleCount,
|
|
242
|
+
colorFormat,
|
|
243
|
+
undefined,
|
|
244
|
+
undefined,
|
|
245
|
+
undefined,
|
|
246
|
+
materialGuid,
|
|
247
|
+
undefined,
|
|
248
|
+
layoutProjection,
|
|
249
|
+
) ?? null;
|
|
250
|
+
const handle =
|
|
251
|
+
profilePhase === undefined
|
|
252
|
+
? resolvePipeline()
|
|
253
|
+
: profileGeometrySegment(c, passKind, 'pipeline-selection', resolvePipeline);
|
|
254
|
+
const nextLookup: MaterialPipelineLookup = {
|
|
255
|
+
materialShaderId,
|
|
256
|
+
tonemapActive,
|
|
257
|
+
renderStateKey,
|
|
258
|
+
topology,
|
|
259
|
+
indexFormat,
|
|
260
|
+
variantSet: resolvedVariantSet,
|
|
261
|
+
passKind,
|
|
262
|
+
layoutProjection,
|
|
263
|
+
sampleCount,
|
|
264
|
+
colorFormatOverride: colorFormat,
|
|
265
|
+
handle,
|
|
266
|
+
};
|
|
267
|
+
if (shaderLookupCache === undefined) {
|
|
268
|
+
materialPipelineLookupCache.set(materialShaderId, new Map([[renderStateKey, [nextLookup]]]));
|
|
269
|
+
} else if (cachedLookups === undefined) {
|
|
270
|
+
shaderLookupCache.set(renderStateKey, [nextLookup]);
|
|
271
|
+
} else {
|
|
272
|
+
cachedLookups.push(nextLookup);
|
|
273
|
+
}
|
|
274
|
+
return handle;
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
for (let i = 0; i < validatedOrdered.length; i++) {
|
|
278
|
+
const entry = validatedOrdered[i];
|
|
279
|
+
if (entry === undefined) continue;
|
|
280
|
+
|
|
281
|
+
// feat-20260609 M2: skip entities that don't match the pass selector.
|
|
282
|
+
if (matchedIndices !== null && !matchedIndices.has(entry.renderableIndex)) continue;
|
|
283
|
+
|
|
284
|
+
// D-2 generalised feat-20260625 M2 / w7: transparent entities are
|
|
285
|
+
// dispatched in the separate sub-pass (bgra8unorm unorm view,
|
|
286
|
+
// loadOp=load) so they must NOT be drawn here in the geometry pass
|
|
287
|
+
// (bgra8unorm-srgb sRGB view, loadOp=clear). In the HDR path
|
|
288
|
+
// (tonemapActive=true) or when there are no transparent entries,
|
|
289
|
+
// splitLdrSprite=false and this guard is a no-op. Post-w13 the
|
|
290
|
+
// legacy shadingModel arm is gone; transparent is the single SSOT
|
|
291
|
+
// mirrored on `computeSplitLdrSprite`.
|
|
292
|
+
//
|
|
293
|
+
// feat-city-glb Bug 5 (per-submesh transparency): only skip the WHOLE
|
|
294
|
+
// entity here when EVERY submesh is transparent (the sprite / fully-
|
|
295
|
+
// transparent-mesh fast path, byte-identical to the pre-fix behavior for
|
|
296
|
+
// single-material entities). A mixed mesh (opaque road submesh + BLEND
|
|
297
|
+
// decal submesh) is NOT skipped at the entity level; its opaque submeshes
|
|
298
|
+
// draw here and the per-submesh loop below skips the transparent ones
|
|
299
|
+
// (they are drawn in the blend sub-pass instead).
|
|
300
|
+
if (passKind === 'forward' && splitLdrSprite && isEntityFullyTransparent(entry.source))
|
|
301
|
+
continue;
|
|
302
|
+
|
|
303
|
+
const pipelineTag: 'unlit' = 'unlit';
|
|
304
|
+
|
|
305
|
+
// w10: setStencilReference per draw when the dispatch entry carries
|
|
306
|
+
// a stencil reference value (plan-strategy D-3: draw-call dynamic
|
|
307
|
+
// state after setPipeline). Defaults to 0 when no reference is set
|
|
308
|
+
// (WebGPU stencil reference default, semantically a no-op).
|
|
309
|
+
const stencilReference = entry.stencilReference ?? 0;
|
|
310
|
+
if (stencilReference !== lastStencilReference) {
|
|
311
|
+
pass.setStencilReference(stencilReference);
|
|
312
|
+
lastStencilReference = stencilReference;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (entry.mesh.vertexBuffer !== lastVertexBuffer) {
|
|
316
|
+
pass.setVertexBuffer(0, entry.mesh.vertexBuffer.handle);
|
|
317
|
+
lastVertexBuffer = entry.mesh.vertexBuffer;
|
|
318
|
+
}
|
|
319
|
+
// feat-20260604 M4 / w11: vertex-only meshes (indexed === false) carry no
|
|
320
|
+
// index buffer; skip setIndexBuffer entirely and dispatch via pass.draw
|
|
321
|
+
// below. Indexed meshes keep the existing setIndexBuffer path unchanged.
|
|
322
|
+
if (entry.mesh.indexed && entry.mesh.indexBuffer !== lastIndexBuffer) {
|
|
323
|
+
if (entry.mesh.indexBuffer !== null) {
|
|
324
|
+
pass.setIndexBuffer(entry.mesh.indexBuffer.handle, entry.mesh.indexFormat);
|
|
325
|
+
lastIndexBuffer = entry.mesh.indexBuffer;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Dispatch counter bump — sprite folds into the same 2-bucket
|
|
330
|
+
// surface for now (`pipelineDispatchCounts.{unlit, standard}`
|
|
331
|
+
// mirror the original 2-pipeline scope; sprite-bucket counters
|
|
332
|
+
// can land in a follow-up if AI users need them separately).
|
|
333
|
+
// sprite entries do not bump either counter — the bench (M-4)
|
|
334
|
+
// can read sprite render counts via the transparent bucket
|
|
335
|
+
// length instead.
|
|
336
|
+
if (pipelineTag === 'unlit') dispatchCounts.unlit += 1;
|
|
337
|
+
|
|
338
|
+
const instanceDraws = resolveGeometryInstanceBuffer(c, entry, identityInstanceDraws);
|
|
339
|
+
if (instanceDraws === null) continue;
|
|
340
|
+
|
|
341
|
+
// feat-20260611 R2 / M8 / w28 (IS-14): skin entries need a 3-binding
|
|
342
|
+
// group(2) BG matching `pbr-skin-pl` (binding 0 mesh-array UBO plus
|
|
343
|
+
// bindings 1/2 current/previous palette UBOs). Building this here -- not in the
|
|
344
|
+
// `meshBindGroup` factory above -- because the binding-shape
|
|
345
|
+
// (1-entry vs 3-entry) is per-entry, not per-frame. URP / HDRP
|
|
346
|
+
// entries keep using `meshGroup2` (1-entry mesh-array or HDRP
|
|
347
|
+
// unified). The skin-variant cache key includes both buffer
|
|
348
|
+
// identities so a future allocator-driven palette buffer rotation
|
|
349
|
+
// invalidates the BG without manual eviction.
|
|
350
|
+
//
|
|
351
|
+
// PSO-availability gate: only swap to the skin BG when (a) the
|
|
352
|
+
// skin pipeline layout itself was built (charter P3 fail-stop on
|
|
353
|
+
// BGL-build failure), AND (b) the skin PSO cache returns a non-null
|
|
354
|
+
// pipeline for this entry. Without (b), the per-submesh selector
|
|
355
|
+
// below falls back to URP `standardPipeline` (`pbr-pl` layout,
|
|
356
|
+
// 1-entry mesh-array BGL); binding the 2-entry skin BG against
|
|
357
|
+
// that pipeline reproduces the exact `pbr-mesh-array-bgl ... does
|
|
358
|
+
// not match layout pbr-skin-mesh-array-bgl` device error R1
|
|
359
|
+
// captured. Mirrors the uniform null skip-draw pattern (M6-T1).
|
|
360
|
+
let group2BindGroup: BindGroup = meshGroup2 as BindGroup;
|
|
361
|
+
// feat-20260612-skin-palette-per-frame-upload M3 / m3-2: dyn-offset
|
|
362
|
+
// tuple sourced from `_computeSkinGroup2DynOffsets`. Defaults to the
|
|
363
|
+
// length-1 non-skin shape; the skin branch below re-computes with the
|
|
364
|
+
// per-entity `entry.source.skin.byteOffset` cursor.
|
|
365
|
+
meshGroup2DynamicOffsets[0] = i * MESH_PER_ENTITY_STRIDE;
|
|
366
|
+
let group2DynamicOffsets: readonly number[] = meshGroup2DynamicOffsets;
|
|
367
|
+
const isSkinEntry = entry.source.skin !== undefined;
|
|
368
|
+
// feat-20260612-skin-palette-per-frame-upload M1 / m1-3 + M6: the
|
|
369
|
+
// record stage reads the GPU buffer reference through
|
|
370
|
+
// `entry.source.skin.buffer` (per-slice carrier set at extract time
|
|
371
|
+
// by allocateSlice). On the storage path every slice carries the
|
|
372
|
+
// same shared buffer pointer, so the BG cache key collapses to one
|
|
373
|
+
// entry per frame (miss=1 + hit=N-1). On the uniform fallback path
|
|
374
|
+
// each slice carries its own per-entity 16320 B UBO, so the BG
|
|
375
|
+
// cache key naturally splits per entity (one BG per buffer pointer)
|
|
376
|
+
// -- there is no shared-buffer assumption to break under
|
|
377
|
+
// 16 KiB UBO cap. Charter P3 explicit failure preserved: skin
|
|
378
|
+
// entries skip when the pipeline layout is missing OR the slice
|
|
379
|
+
// failed to allocate (no buffer field). dynOffset[1] = byteOffset
|
|
380
|
+
// is 0 on the uniform path (entry already covers the full buffer)
|
|
381
|
+
// and walks 0, 1536, 3072, ... on the storage path.
|
|
382
|
+
const skinAllocator = pipelineState.skinPaletteAllocator;
|
|
383
|
+
const skinSlice = entry.source.skin;
|
|
384
|
+
const skinResources =
|
|
385
|
+
isSkinEntry &&
|
|
386
|
+
pipelineState.pbrSkinMeshBindGroupLayout !== null &&
|
|
387
|
+
skinAllocator !== null &&
|
|
388
|
+
skinSlice !== undefined
|
|
389
|
+
? {
|
|
390
|
+
meshArrayBgl: pipelineState.pbrSkinMeshBindGroupLayout,
|
|
391
|
+
paletteBuffer: skinSlice.buffer,
|
|
392
|
+
previousPaletteBuffer: skinSlice.previousBuffer ?? skinSlice.buffer,
|
|
393
|
+
paletteBindingWindowBytes: skinAllocator.bindingWindowBytes,
|
|
394
|
+
}
|
|
395
|
+
: null;
|
|
396
|
+
// Probe the skin PSO cache up front so we can decide whether to swap
|
|
397
|
+
// to the 3-binding skin BG. The same probe + selector is repeated in
|
|
398
|
+
// the per-submesh loop below (the loop's variantSet derivation is
|
|
399
|
+
// identical -- skin shader registers a single all-true variant so
|
|
400
|
+
// the canonical empty-key rule applies on HDRP and the URP key is
|
|
401
|
+
// the explicit expanded form, mirroring the standard PBR path).
|
|
402
|
+
const skinVariantSetResult = variantSetFromVertexLayoutProjection(
|
|
403
|
+
entry.mesh.layoutProjection,
|
|
404
|
+
frameState.isHdrpActive
|
|
405
|
+
? ''
|
|
406
|
+
: 'CLUSTER_FORWARD_AVAILABLE=false+STORAGE_BUFFER_AVAILABLE=true',
|
|
407
|
+
);
|
|
408
|
+
if (!skinVariantSetResult.ok) runtime.errorRegistry.fire(skinVariantSetResult.error);
|
|
409
|
+
const skinVariantSet = skinVariantSetResult.ok ? skinVariantSetResult.value : undefined;
|
|
410
|
+
const skinPsoProbe =
|
|
411
|
+
skinResources !== null && skinVariantSetResult.ok
|
|
412
|
+
? (runtime.getMaterialShaderPipeline?.(
|
|
413
|
+
SKIN_MATERIAL_SHADER_ID,
|
|
414
|
+
tonemapActive,
|
|
415
|
+
entry.source.material.renderState,
|
|
416
|
+
entry.mesh.submeshes[0]?.topology ?? 'triangle-list',
|
|
417
|
+
entry.mesh.indexFormat,
|
|
418
|
+
skinVariantSet,
|
|
419
|
+
passKind,
|
|
420
|
+
undefined, // meshAttributes — skin probe uses first submesh, derive from entry
|
|
421
|
+
sampleCount,
|
|
422
|
+
colorFormatOverride,
|
|
423
|
+
undefined,
|
|
424
|
+
undefined,
|
|
425
|
+
undefined,
|
|
426
|
+
undefined,
|
|
427
|
+
undefined,
|
|
428
|
+
entry.mesh.layoutProjection,
|
|
429
|
+
) ?? null)
|
|
430
|
+
: null;
|
|
431
|
+
if (skinResources !== null && skinPsoProbe !== null) {
|
|
432
|
+
const meshBindSize = runtime.device.caps.storageBuffer
|
|
433
|
+
? MESH_SSBO_BYTES
|
|
434
|
+
: MESH_UBO_FULL_ARRAY_BYTES;
|
|
435
|
+
// m3-2 / D-8: skin BG cache miss / hit instrumentation. The chain
|
|
436
|
+
// walk no longer exposes a string key to `.has()`, so we derive
|
|
437
|
+
// hit/miss from the w7 `bindGroupCounts.createBindGroup` accounting:
|
|
438
|
+
// snapshot the counter, run `getOrCreateFromChain`, and compare. A
|
|
439
|
+
// delta of 1 means the factory ran (miss); 0 means a chain hit. This
|
|
440
|
+
// publishes the per-frame counter the m3-1 acceptanceCheck reads
|
|
441
|
+
// (miss=1 + hit=N-1 across N skin entries sharing one allocator
|
|
442
|
+
// buffer + mesh SSBO). Field is optional + opt-in (read via
|
|
443
|
+
// structural cast so prod paths that omit the counter pay nothing).
|
|
444
|
+
const skinStats = (pipelineState as { _skinBgCacheStats?: { miss: number; hit: number } })
|
|
445
|
+
._skinBgCacheStats;
|
|
446
|
+
const skinMissesBefore = bindGroupCounts.createBindGroup;
|
|
447
|
+
const skinBindGroup: BindGroup = getOrCreateFromChain(
|
|
448
|
+
frameState.meshBindGroupCache,
|
|
449
|
+
[
|
|
450
|
+
pipelineState.meshStorageBuffer.buffer,
|
|
451
|
+
skinResources.paletteBuffer,
|
|
452
|
+
skinResources.previousPaletteBuffer,
|
|
453
|
+
],
|
|
454
|
+
'pbr-skin-mesh',
|
|
455
|
+
() => {
|
|
456
|
+
const result = runtime.device.createBindGroup({
|
|
457
|
+
label: 'pbr-skin-mesh-bg',
|
|
458
|
+
layout: skinResources.meshArrayBgl,
|
|
459
|
+
entries: [
|
|
460
|
+
{
|
|
461
|
+
binding: 0,
|
|
462
|
+
resource: {
|
|
463
|
+
kind: 'buffer',
|
|
464
|
+
value: {
|
|
465
|
+
buffer: pipelineState.meshStorageBuffer.buffer,
|
|
466
|
+
offset: 0,
|
|
467
|
+
size: meshBindSize,
|
|
468
|
+
},
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
binding: 1,
|
|
473
|
+
resource: {
|
|
474
|
+
kind: 'buffer',
|
|
475
|
+
value: {
|
|
476
|
+
buffer: skinResources.paletteBuffer,
|
|
477
|
+
offset: 0,
|
|
478
|
+
// M6 SSOT: static BG entry size (= MAX_JOINTS * 64 =
|
|
479
|
+
// 16320 B) sourced from the allocator. The per-draw
|
|
480
|
+
// window slides via `group2DynamicOffsets[1]`
|
|
481
|
+
// (= entry.source.skin.byteOffset) so this size
|
|
482
|
+
// stays at the worst case across all skin entries
|
|
483
|
+
// -- one BG covers every skinned draw in the frame
|
|
484
|
+
// (m3-1b miss=1 + hit=N-1 contract). The allocator
|
|
485
|
+
// guarantees `buffer.size >= byteOffset + this size`
|
|
486
|
+
// so dynOffset[1] passes WebGPU validation.
|
|
487
|
+
size: skinResources.paletteBindingWindowBytes,
|
|
488
|
+
},
|
|
489
|
+
},
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
binding: 2,
|
|
493
|
+
resource: {
|
|
494
|
+
kind: 'buffer',
|
|
495
|
+
value: {
|
|
496
|
+
buffer: skinResources.previousPaletteBuffer,
|
|
497
|
+
offset: 0,
|
|
498
|
+
size: skinResources.paletteBindingWindowBytes,
|
|
499
|
+
},
|
|
500
|
+
},
|
|
501
|
+
},
|
|
502
|
+
],
|
|
503
|
+
});
|
|
504
|
+
if (!result.ok) throw result.error;
|
|
505
|
+
return result.value;
|
|
506
|
+
},
|
|
507
|
+
bindGroupCounts,
|
|
508
|
+
);
|
|
509
|
+
if (skinStats !== undefined) {
|
|
510
|
+
if (bindGroupCounts.createBindGroup > skinMissesBefore) skinStats.miss += 1;
|
|
511
|
+
else skinStats.hit += 1;
|
|
512
|
+
}
|
|
513
|
+
group2BindGroup = skinBindGroup;
|
|
514
|
+
// m3-2: dyn-offset tuple via `_computeSkinGroup2DynOffsets` with the
|
|
515
|
+
// per-entity palette cursor M2 m2-6 wrote at the extract stage.
|
|
516
|
+
// Replaces the prior PR #353 hard-coded `0` second slot -- every
|
|
517
|
+
// skin entry now points the palette window at its own slice while
|
|
518
|
+
// sharing the worst-case BG entry size above.
|
|
519
|
+
skinGroup2DynamicOffsets[0] = i * MESH_PER_ENTITY_STRIDE;
|
|
520
|
+
skinGroup2DynamicOffsets[1] = entry.source.skin?.byteOffset ?? 0;
|
|
521
|
+
skinGroup2DynamicOffsets[2] = entry.source.skin?.byteOffset ?? 0;
|
|
522
|
+
group2DynamicOffsets = skinGroup2DynamicOffsets;
|
|
523
|
+
} else if (isSkinEntry) {
|
|
524
|
+
// Skin entry but skin PSO not ready (cache miss / async build pending,
|
|
525
|
+
// or skin pipeline layout failed at boot). Skip the draw rather than
|
|
526
|
+
// fall back to URP `pbr-pl` against the 6-attribute skin VBO -- that
|
|
527
|
+
// path produced the layer-3 / layer-4 device errors R1 captured. Once
|
|
528
|
+
// the async PSO compile resolves the cache hits and the next frame
|
|
529
|
+
// routes the skin BG + skin pipeline together. Mirrors the uniform
|
|
530
|
+
// null skip-draw shape (M6-T1, charter P3 explicit failure).
|
|
531
|
+
continue;
|
|
532
|
+
}
|
|
533
|
+
pass.setBindGroup(2, group2BindGroup, group2DynamicOffsets);
|
|
534
|
+
|
|
535
|
+
// feat-20260520-2d-sprite-layer-mvp M-3 / w25 (@fallback sprite
|
|
536
|
+
// bucket): sprite entries get a per-entity material BindGroup so
|
|
537
|
+
// each sprite carries its own texture binding at @group(1) @binding(2).
|
|
538
|
+
// Bindings 3..6 (metallicRoughness sampler/texture + normal
|
|
539
|
+
// sampler/texture) bind `pipelineState.defaultSampler` +
|
|
540
|
+
// `pipelineState.defaultWhiteTextureView` placeholders (D-1
|
|
541
|
+
// candidate b — zero new GPU resource; the 1x1 white view was
|
|
542
|
+
// already provisioned for unlit / standard fallback so the sprite
|
|
543
|
+
// path adds 4 binding references, no new resource code).
|
|
544
|
+
//
|
|
545
|
+
// Missing-texture fallback (AC-18 path 4 + R7 isolation): when the
|
|
546
|
+
// sprite texture has no GPU view, the binding uses
|
|
547
|
+
// `defaultWhiteTextureView` as the fallback texture and the
|
|
548
|
+
// material UBO upload above wrote debug-pink colorTint so the
|
|
549
|
+
// sprite is visually distinct. The warn-once + RhiError surface
|
|
550
|
+
// fires inside the upload loop. R7 isolation: this does NOT change
|
|
551
|
+
// the existing unlit / standard bucket missing-texture handling —
|
|
552
|
+
// those keep their silent-white fallback (a future
|
|
553
|
+
// `feat-future-pbr-missing-texture-fallback-explicit` will retrofit).
|
|
554
|
+
// bug-20260610 layer 7d: BG is per-submesh — each iteration of
|
|
555
|
+
// the submesh draw loop below builds (or cache-hits) a BG with
|
|
556
|
+
// matsForRebind[smIdx]'s 5 textureViews (baseColor / MR / normal /
|
|
557
|
+
// emissive / occlusion). Cache key is 14-handle-id only (entityKey
|
|
558
|
+
// dropped) so identical-material submeshes / entities dedup
|
|
559
|
+
// globally. Sprite path is unchanged (single spriteBg, sprite
|
|
560
|
+
// per-submesh OOS-1). The non-sprite branch leaves perSubmeshBg
|
|
561
|
+
// declared but null; the submesh loop reassigns it per iteration
|
|
562
|
+
// and the source-grep gate in skylight-fallback-path.test.ts /
|
|
563
|
+
// systems.unit.test.ts continues to match
|
|
564
|
+
// `setBindGroup\s*\(\s*1\s*,\s*perSubmeshBg\b` on the in-loop call.
|
|
565
|
+
// feat-20260625-refactor-sprite-as-transparent-mesh M3 / w13 (D-1
|
|
566
|
+
// candidate b): the sprite-specific BG construction is gone — sprite
|
|
567
|
+
// materials reuse the same per-submesh BG path PBR / unlit use. The
|
|
568
|
+
// 7-entry BGL is byte-for-byte shared (binding 0 = Material UBO,
|
|
569
|
+
// 1 = baseColorSampler, 2 = baseColorTexture, 3-6 = filler samplers /
|
|
570
|
+
// textureViews). Sprite's "no metallic/normal/emissive/occlusion
|
|
571
|
+
// texture" simply falls through to `defaultWhite` / `defaultNormal`
|
|
572
|
+
// — the same placeholders the unlit path already used. The generic
|
|
573
|
+
// branch below builds the per-submesh BG.
|
|
574
|
+
let perSubmeshBg: BindGroup | null = null;
|
|
575
|
+
// feat-20260608 M4 / w16: per-submesh pipeline selection + draw loop.
|
|
576
|
+
// Each submesh carries its own topology, so pipeline selection is per-submesh.
|
|
577
|
+
// Vertex/index buffers and bind groups are set once (shared across all submeshes).
|
|
578
|
+
// feat-20260608 M5 amend / w16-a: the material UBO bind (group=1)
|
|
579
|
+
// ALSO moves into the loop -- the j-th submesh sees the j-th
|
|
580
|
+
// material slot via dynamic offset (entitySlotStart + j) * 256.
|
|
581
|
+
const matsForRebind = entry.source.materials;
|
|
582
|
+
for (let smIdx = 0; smIdx < entry.mesh.submeshes.length; smIdx++) {
|
|
583
|
+
const sm = entry.mesh.submeshes[smIdx];
|
|
584
|
+
if (sm === undefined) continue;
|
|
585
|
+
const gpuDrivenDraw = entry.source.gpuDrivenDraws?.find(
|
|
586
|
+
(draw) => draw.submeshIndex === smIdx,
|
|
587
|
+
);
|
|
588
|
+
if (
|
|
589
|
+
passKind === 'forward' &&
|
|
590
|
+
gpuDrivenDraw !== undefined &&
|
|
591
|
+
c.gpuDrivenItemKeys.has(
|
|
592
|
+
rasterItemKey(
|
|
593
|
+
entry.source.worldId,
|
|
594
|
+
entry.source.entityKey,
|
|
595
|
+
gpuDrivenDraw.submeshIndex,
|
|
596
|
+
gpuDrivenDraw.passIndex,
|
|
597
|
+
),
|
|
598
|
+
)
|
|
599
|
+
) {
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
const matSlotIdx = sm.materialSlot;
|
|
603
|
+
const submeshMaterial = matsForRebind[matSlotIdx] ?? entry.source.material;
|
|
604
|
+
// feat-city-glb Bug 5 (per-submesh transparency): in the LDR split, a
|
|
605
|
+
// transparent submesh is drawn in the blend sub-pass (non-sRGB view),
|
|
606
|
+
// NOT here in the sRGB geometry pass. Skip it. Opaque submeshes of the
|
|
607
|
+
// same (mixed) mesh still draw here. Single-material / fully-opaque
|
|
608
|
+
// meshes are unaffected (their submesh materials are not transparent).
|
|
609
|
+
if (passKind === 'forward' && splitLdrSprite && submeshMaterial.transparent === true) {
|
|
610
|
+
continue;
|
|
611
|
+
}
|
|
612
|
+
// bug-20260610 layer 7d: per-submesh BG construction. Texture
|
|
613
|
+
// views resolve from `matsForRebind[smIdx]` so the j-th submesh
|
|
614
|
+
// sees its own materials[j] textures (baseColor / MR / normal /
|
|
615
|
+
// emissive / occlusion). Pick slot j when materials.length covers
|
|
616
|
+
// smIdx; otherwise fall back to slot 0 (count-mismatch already
|
|
617
|
+
// filtered by extract; this guard handles the materials.length=1
|
|
618
|
+
// single-material path mapped over multi-submesh meshes safely).
|
|
619
|
+
// This BG drops entityKey: identical-texture-set submeshes
|
|
620
|
+
// (whether on the same entity or different ones) share one BG via
|
|
621
|
+
// the shaderId-outer `materialBgShared` cache. The 14 handle
|
|
622
|
+
// objects form the WeakMap chain and fully discriminate the
|
|
623
|
+
// binding state since sampler/textureView/buffer handle identities
|
|
624
|
+
// are stable across frames.
|
|
625
|
+
//
|
|
626
|
+
// feat-20260625-refactor-sprite-as-transparent-mesh M3 / w13:
|
|
627
|
+
// sprite materials now use the same per-submesh BG construction
|
|
628
|
+
// (the sprite-specific BG branch above is deleted; sprite per-
|
|
629
|
+
// submesh single-slot is still enforced via materialSlotIndices
|
|
630
|
+
// and the sprite-shaped paramSnapshot fills the PBR-shaped BGL
|
|
631
|
+
// bindings via fallback textures for the 4 unused slots).
|
|
632
|
+
// feat-city-glb Bug 5: per-submesh material BG assembly extracted to
|
|
633
|
+
// the shared `buildPerSubmeshMaterialBg` closure (also called by the
|
|
634
|
+
// LDR blend sub-pass). Resolves the shader's user-region textures
|
|
635
|
+
// (baseColor/MR/normal + any custom Nth texture), emissive/occlusion
|
|
636
|
+
// injection, and Skylight merge; deduped cross-entity via the
|
|
637
|
+
// shaderId-outer `materialBgShared` cache.
|
|
638
|
+
const materialSlot = materialSlotIndices[i]?.[matSlotIdx] ?? materialSlotIndices[i]?.[0] ?? 0;
|
|
639
|
+
perSubmeshBg =
|
|
640
|
+
profilePhase === undefined
|
|
641
|
+
? resolveMaterialBindGroup(materialSlot, submeshMaterial, entry.source.entityKey)
|
|
642
|
+
: profileGeometrySegment(c, passKind, 'material-bind-groups', () =>
|
|
643
|
+
resolveMaterialBindGroup(materialSlot, submeshMaterial, entry.source.entityKey),
|
|
644
|
+
);
|
|
645
|
+
materialGroup1DynamicOffsets[0] = materialSlot * MATERIAL_PER_ENTITY_STRIDE;
|
|
646
|
+
pass.setBindGroup(1, perSubmeshBg, materialGroup1DynamicOffsets, 0, 1);
|
|
647
|
+
const smTopology = sm.topology;
|
|
648
|
+
const smMaterialShaderId =
|
|
649
|
+
entry.source.skin !== undefined
|
|
650
|
+
? SKIN_MATERIAL_SHADER_ID
|
|
651
|
+
: submeshMaterial.materialShaderId;
|
|
652
|
+
let materialReadyGuid: string | undefined;
|
|
653
|
+
if (
|
|
654
|
+
submeshMaterial.materialGuid !== undefined &&
|
|
655
|
+
runtime.getMaterialReadiness !== undefined
|
|
656
|
+
) {
|
|
657
|
+
const readiness = runtime.getMaterialReadiness(submeshMaterial.materialGuid);
|
|
658
|
+
if (readiness !== undefined) {
|
|
659
|
+
const readinessRoute = routeMaterialReadiness({
|
|
660
|
+
readiness,
|
|
661
|
+
reportedDiagnosticKeys: frameState.reportedMaterialDiagnosticKeys,
|
|
662
|
+
});
|
|
663
|
+
if (readinessRoute.kind === 'skip') {
|
|
664
|
+
if (readinessRoute.diagnostic !== undefined) {
|
|
665
|
+
runtime.errorRegistry.fire(
|
|
666
|
+
new RhiError({
|
|
667
|
+
code: 'webgpu-runtime-error',
|
|
668
|
+
expected: readinessRoute.diagnostic.expected,
|
|
669
|
+
hint: `${readinessRoute.diagnostic.hint} [materialGuid=${readinessRoute.diagnostic.materialGuid}; specializationKey=${readinessRoute.diagnostic.specializationKey}]`,
|
|
670
|
+
}),
|
|
671
|
+
);
|
|
672
|
+
}
|
|
673
|
+
continue;
|
|
674
|
+
}
|
|
675
|
+
materialReadyGuid = readinessRoute.readiness.materialGuid;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
const isSpriteShader =
|
|
679
|
+
smMaterialShaderId === 'forgeax::sprite' || smMaterialShaderId === 'forgeax::sprite-lit';
|
|
680
|
+
// Preserve the dedicated sprite-pass state when the linear-LDR graph
|
|
681
|
+
// routes a sprite through this generic geometry path. Negative scale
|
|
682
|
+
// flips winding, so back-face culling would erase the quad.
|
|
683
|
+
const temporalRenderState = (() => {
|
|
684
|
+
if (passKind !== 'temporal') return undefined;
|
|
685
|
+
const { blend: _blend, ...base } = submeshMaterial.renderState ?? {};
|
|
686
|
+
return {
|
|
687
|
+
...base,
|
|
688
|
+
depthWriteEnabled: false,
|
|
689
|
+
depthCompare: 'less-equal' as const,
|
|
690
|
+
...(isSpriteShader ? { cullMode: 'none' as const } : {}),
|
|
691
|
+
};
|
|
692
|
+
})();
|
|
693
|
+
const pipelineRenderState =
|
|
694
|
+
temporalRenderState ??
|
|
695
|
+
(isSpriteShader
|
|
696
|
+
? {
|
|
697
|
+
...submeshMaterial.renderState,
|
|
698
|
+
depthWriteEnabled: false,
|
|
699
|
+
depthCompare: 'less-equal' as const,
|
|
700
|
+
cullMode: 'none' as const,
|
|
701
|
+
blend: submeshMaterial.renderState?.blend ?? SPRITE_PREMULTIPLIED_ALPHA_BLEND,
|
|
702
|
+
}
|
|
703
|
+
: submeshMaterial.renderState);
|
|
704
|
+
let smPipelineHandle: typeof pipelineState.unlitPipeline;
|
|
705
|
+
if (smMaterialShaderId === undefined || smMaterialShaderId === 'forgeax::default-unlit') {
|
|
706
|
+
const unlitShaderId = smMaterialShaderId ?? 'forgeax::default-unlit';
|
|
707
|
+
const unlitProjectionVariantResult = variantSetFromVertexLayoutProjection(
|
|
708
|
+
entry.mesh.layoutProjection,
|
|
709
|
+
undefined,
|
|
710
|
+
);
|
|
711
|
+
if (!unlitProjectionVariantResult.ok) {
|
|
712
|
+
runtime.errorRegistry.fire(unlitProjectionVariantResult.error);
|
|
713
|
+
continue;
|
|
714
|
+
}
|
|
715
|
+
const unlitHasColor = unlitProjectionVariantResult.value === 'VERTEX_COLOR_AVAILABLE=true';
|
|
716
|
+
const unlitVariantSet = unlitHasColor
|
|
717
|
+
? ''
|
|
718
|
+
: 'STORAGE_BUFFER_AVAILABLE=true+VERTEX_COLOR_AVAILABLE=false';
|
|
719
|
+
const unlitRsp = resolveMaterialPipeline(
|
|
720
|
+
unlitShaderId,
|
|
721
|
+
pipelineRenderState,
|
|
722
|
+
smTopology,
|
|
723
|
+
entry.mesh.indexFormat,
|
|
724
|
+
unlitVariantSet,
|
|
725
|
+
colorFormatOverride,
|
|
726
|
+
entry.mesh.layoutProjection,
|
|
727
|
+
materialReadyGuid,
|
|
728
|
+
);
|
|
729
|
+
smPipelineHandle =
|
|
730
|
+
unlitRsp ??
|
|
731
|
+
(colorFormatOverride === undefined
|
|
732
|
+
? selectGeometryPipeline(pipelineState, tonemapActive, msaaActive)
|
|
733
|
+
: null);
|
|
734
|
+
} else if (smMaterialShaderId !== undefined) {
|
|
735
|
+
// feat-20260609 M4.5 / w38 (D-11): the variantSet handed to
|
|
736
|
+
// getMaterialShaderPipeline MUST mirror the boot-time
|
|
737
|
+
// `definesKey` rule at createRenderer.ts:2483-2485 (sortedEntries
|
|
738
|
+
// .every(v=>v===true) ? '' : 'A=v+...'). manifest variant.definesKey
|
|
739
|
+
// is `''` for the all-true variant, so HDRP (both axes true) must
|
|
740
|
+
// pass the canonical empty key to hit that variant via
|
|
741
|
+
// findVariantByKey. Passing the expanded form would produce a
|
|
742
|
+
// miss and silently fall back to the registered default WGSL,
|
|
743
|
+
// creating a layout/binding mismatch under HDRP.
|
|
744
|
+
//
|
|
745
|
+
// URP path passes the explicit expanded form because the URP
|
|
746
|
+
// variant's manifest definesKey IS that exact non-empty string
|
|
747
|
+
// (CLUSTER_FORWARD_AVAILABLE=false+STORAGE_BUFFER_AVAILABLE=true)
|
|
748
|
+
// -- the canonical-empty rule only applies to the all-true case.
|
|
749
|
+
const capabilityVariantSet = frameState.isHdrpActive
|
|
750
|
+
? ''
|
|
751
|
+
: 'CLUSTER_FORWARD_AVAILABLE=false+STORAGE_BUFFER_AVAILABLE=true';
|
|
752
|
+
const authoredVariantSet =
|
|
753
|
+
isSpriteShader && entry.source.spriteInstances !== undefined ? '' : entry.variantSet;
|
|
754
|
+
const variantSet =
|
|
755
|
+
authoredVariantSet === undefined
|
|
756
|
+
? capabilityVariantSet
|
|
757
|
+
: capabilityVariantSet === ''
|
|
758
|
+
? authoredVariantSet
|
|
759
|
+
: `${capabilityVariantSet}+${authoredVariantSet}`;
|
|
760
|
+
const projectionVariantSetResult = variantSetFromVertexLayoutProjection(
|
|
761
|
+
entry.mesh.layoutProjection,
|
|
762
|
+
variantSet,
|
|
763
|
+
);
|
|
764
|
+
if (!projectionVariantSetResult.ok) {
|
|
765
|
+
runtime.errorRegistry.fire(projectionVariantSetResult.error);
|
|
766
|
+
continue;
|
|
767
|
+
}
|
|
768
|
+
const projectionVariantSet = projectionVariantSetResult.value;
|
|
769
|
+
const cachedPipeline = resolveMaterialPipeline(
|
|
770
|
+
smMaterialShaderId,
|
|
771
|
+
pipelineRenderState,
|
|
772
|
+
smTopology,
|
|
773
|
+
entry.mesh.indexFormat,
|
|
774
|
+
projectionVariantSet,
|
|
775
|
+
colorFormatOverride,
|
|
776
|
+
entry.mesh.layoutProjection,
|
|
777
|
+
materialReadyGuid,
|
|
778
|
+
);
|
|
779
|
+
// feat-20260615-pipeline-spec-ssot M6-T1: cache miss resolves to
|
|
780
|
+
// null uniformly across URP / HDRP / skin shaders. Charter P3
|
|
781
|
+
// explicit failure: the pre-M6 URP-path silent fallback to the
|
|
782
|
+
// boot-time `pipelineState.standardPipeline*` (M4.5-followup w43)
|
|
783
|
+
// masked real PipelineSpecError build failures behind a
|
|
784
|
+
// layout-compatible-but-wrong PSO. The per-submesh
|
|
785
|
+
// `if (smPipelineHandle === null) continue` skip-draw (which
|
|
786
|
+
// already covered HDRP-active and skin miss paths) is now the
|
|
787
|
+
// single uniform recovery shape -- one frame of skip-draw on
|
|
788
|
+
// first-touch, then the cached PSO flows in once the async
|
|
789
|
+
// build resolves. The pre-loop skin-PSO probe still skips the
|
|
790
|
+
// entire entry on first-submesh probe miss; this site only
|
|
791
|
+
// fires on per-submesh topology variance miss.
|
|
792
|
+
smPipelineHandle = cachedPipeline ?? null;
|
|
793
|
+
} else {
|
|
794
|
+
smPipelineHandle = selectGeometryPipeline(pipelineState, tonemapActive, msaaActive);
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
if (smPipelineHandle === null) {
|
|
798
|
+
continue;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
if (profilePhase === undefined) {
|
|
802
|
+
submitSubmeshDraws(
|
|
803
|
+
pass,
|
|
804
|
+
bindingState,
|
|
805
|
+
smPipelineHandle,
|
|
806
|
+
instanceDraws,
|
|
807
|
+
entry.mesh.indexed,
|
|
808
|
+
sm.indexCount,
|
|
809
|
+
sm.vertexCount,
|
|
810
|
+
sm.indexOffset,
|
|
811
|
+
);
|
|
812
|
+
} else {
|
|
813
|
+
profileGeometrySegment(c, passKind, 'draw-submit', () =>
|
|
814
|
+
submitSubmeshDraws(
|
|
815
|
+
pass,
|
|
816
|
+
bindingState,
|
|
817
|
+
smPipelineHandle,
|
|
818
|
+
instanceDraws,
|
|
819
|
+
entry.mesh.indexed,
|
|
820
|
+
sm.indexCount,
|
|
821
|
+
sm.vertexCount,
|
|
822
|
+
sm.indexOffset,
|
|
823
|
+
),
|
|
824
|
+
);
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
/**
|
|
831
|
+
* Resolve the per-entity @group(3) instance buffers for the geometry pass.
|
|
832
|
+
*
|
|
833
|
+
* @internal
|
|
834
|
+
*/
|
|
835
|
+
function resolveGeometryInstanceBuffer(
|
|
836
|
+
c: _InternalRenderPipelineContext,
|
|
837
|
+
entry: _InternalRenderPipelineContext['validatedOrdered'][number],
|
|
838
|
+
identityInstanceDraws: readonly GeometryInstanceDraw[],
|
|
839
|
+
): readonly GeometryInstanceDraw[] | null {
|
|
840
|
+
const { runtime, pipelineState, frameState } = c;
|
|
841
|
+
const inst = entry.source.instances ?? entry.source.spriteInstances;
|
|
842
|
+
if (inst === undefined) return identityInstanceDraws;
|
|
843
|
+
const spriteInstances = entry.source.spriteInstances;
|
|
844
|
+
let instanceBuffer: Buffer = pipelineState.identityInstanceBuffer;
|
|
845
|
+
let instanceCount = 1;
|
|
846
|
+
{
|
|
847
|
+
// feat-20260526-pbr-uniform-fallback-no-storage-buffer M3 / w13:
|
|
848
|
+
// caps.storageBuffer===false -> uniform fallback with 128-instance
|
|
849
|
+
// cap (128 * 64B = 8192B < WebGL2 min 16384B UBO limit).
|
|
850
|
+
// caps.storageBuffer===true -> existing storage buffer path unchanged.
|
|
851
|
+
const uniformFallback = runtime.device.caps.storageBuffer === false;
|
|
852
|
+
let instanceBufferUsage = GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST;
|
|
853
|
+
|
|
854
|
+
if (uniformFallback && inst.instanceCount > MAX_UNIFORM_INSTANCES) {
|
|
855
|
+
const draws: GeometryInstanceDraw[] = [];
|
|
856
|
+
for (let start = 0; start < inst.instanceCount; start += MAX_UNIFORM_INSTANCES) {
|
|
857
|
+
const count = Math.min(MAX_UNIFORM_INSTANCES, inst.instanceCount - start);
|
|
858
|
+
const chunk = inst.transforms.subarray(start * 16, (start + count) * 16);
|
|
859
|
+
const bufRes = runtime.device.createBuffer({
|
|
860
|
+
size: INSTANCE_UBO_FULL_ARRAY_BYTES,
|
|
861
|
+
usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,
|
|
862
|
+
mappedAtCreation: false,
|
|
863
|
+
});
|
|
864
|
+
if (!bufRes.ok) {
|
|
865
|
+
runtime.errorRegistry.fire(bufRes.error);
|
|
866
|
+
return null;
|
|
867
|
+
}
|
|
868
|
+
const buffer = new GpuBuffer(runtime.device, bufRes.value);
|
|
869
|
+
frameState.transientInstanceBuffers.push({
|
|
870
|
+
buffer,
|
|
871
|
+
uploadedArchVersion: inst.archVersion,
|
|
872
|
+
uploadedByteLength: chunk.byteLength,
|
|
873
|
+
});
|
|
874
|
+
const writeRes = runtime.device.queue.writeBuffer(buffer.handle, 0, chunk);
|
|
875
|
+
if (!writeRes.ok) {
|
|
876
|
+
runtime.errorRegistry.fire(writeRes.error);
|
|
877
|
+
return null;
|
|
878
|
+
}
|
|
879
|
+
draws.push({
|
|
880
|
+
instanceBuffer: buffer.handle,
|
|
881
|
+
instanceBindGroup: resolveGeometryInstancesBindGroup(c, buffer.handle),
|
|
882
|
+
instanceCount: count,
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
return draws;
|
|
886
|
+
}
|
|
887
|
+
if (uniformFallback) {
|
|
888
|
+
instanceBufferUsage = GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
{
|
|
892
|
+
// Cap-gate (LimitExceededDetail single emit point — feat-20260514
|
|
893
|
+
// M3 / w15 anchor): `requestedBytes <= maxStorageBufferBindingSize`.
|
|
894
|
+
const upload =
|
|
895
|
+
spriteInstances === undefined
|
|
896
|
+
? uniformFallback
|
|
897
|
+
? inst.transforms
|
|
898
|
+
: packTemporalInstanceTransforms(
|
|
899
|
+
inst.transforms,
|
|
900
|
+
entry.source.temporal?.previousInstances?.transforms,
|
|
901
|
+
)
|
|
902
|
+
: interleaveSpriteInstanceBuffer(
|
|
903
|
+
spriteInstances.transforms,
|
|
904
|
+
spriteInstances.regions,
|
|
905
|
+
undefined,
|
|
906
|
+
!uniformFallback,
|
|
907
|
+
);
|
|
908
|
+
const requestedBytes = upload.byteLength;
|
|
909
|
+
const cap = runtime.device.limits.maxStorageBufferBindingSize;
|
|
910
|
+
if (!uniformFallback && typeof cap === 'number' && cap > 0 && requestedBytes > cap) {
|
|
911
|
+
runtime.errorRegistry.fire(
|
|
912
|
+
new RhiError({
|
|
913
|
+
code: 'limit-exceeded',
|
|
914
|
+
expected: `requestedBytes (${requestedBytes}) <= maxStorageBufferBindingSize (${cap})`,
|
|
915
|
+
hint: 'reduce instance count to fit within device.limits.maxStorageBufferBindingSize, or split transforms across multiple Instances entries',
|
|
916
|
+
detail: {
|
|
917
|
+
maxStorageBufferBindingSize: cap,
|
|
918
|
+
requestedBytes,
|
|
919
|
+
},
|
|
920
|
+
}),
|
|
921
|
+
);
|
|
922
|
+
return null;
|
|
923
|
+
} else {
|
|
924
|
+
// Look up the cached GPU buffer or create a fresh one when the
|
|
925
|
+
// archetype version bumped or the byte length changed.
|
|
926
|
+
const cached = frameState.instanceBuffers.get(
|
|
927
|
+
worldEntityKey(entry.source.worldId, inst.cacheKey),
|
|
928
|
+
);
|
|
929
|
+
let active: InstanceBufferCacheEntry | null = null;
|
|
930
|
+
if (
|
|
931
|
+
cached !== undefined &&
|
|
932
|
+
cached.uploadedArchVersion === inst.archVersion &&
|
|
933
|
+
cached.uploadedByteLength === requestedBytes
|
|
934
|
+
) {
|
|
935
|
+
active = cached;
|
|
936
|
+
} else if (requestedBytes > 0) {
|
|
937
|
+
const bufRes = runtime.device.createBuffer({
|
|
938
|
+
size: uniformFallback ? INSTANCE_UBO_FULL_ARRAY_BYTES : requestedBytes,
|
|
939
|
+
usage: instanceBufferUsage,
|
|
940
|
+
mappedAtCreation: false,
|
|
941
|
+
});
|
|
942
|
+
if (!bufRes.ok) {
|
|
943
|
+
runtime.errorRegistry.fire(bufRes.error);
|
|
944
|
+
} else {
|
|
945
|
+
// feat-20260619 M4 / F12: destroy the old cached buffer
|
|
946
|
+
// before replacing it with the new one (D-6).
|
|
947
|
+
if (cached !== undefined && !cached.buffer.isDestroyed) {
|
|
948
|
+
const r = cached.buffer.destroy();
|
|
949
|
+
if (!r.ok) runtime.errorRegistry.fire(r.error);
|
|
950
|
+
}
|
|
951
|
+
const newBuffer = new GpuBuffer(runtime.device, bufRes.value);
|
|
952
|
+
active = {
|
|
953
|
+
buffer: newBuffer,
|
|
954
|
+
uploadedArchVersion: inst.archVersion,
|
|
955
|
+
uploadedByteLength: requestedBytes,
|
|
956
|
+
};
|
|
957
|
+
frameState.instanceBuffers.set(
|
|
958
|
+
worldEntityKey(entry.source.worldId, inst.cacheKey),
|
|
959
|
+
active,
|
|
960
|
+
);
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
if (active !== null) {
|
|
964
|
+
const writeRes = runtime.device.queue.writeBuffer(active.buffer.handle, 0, upload);
|
|
965
|
+
if (!writeRes.ok) {
|
|
966
|
+
runtime.errorRegistry.fire(writeRes.error);
|
|
967
|
+
} else {
|
|
968
|
+
instanceBuffer = active.buffer.handle;
|
|
969
|
+
instanceCount = Math.max(1, inst.instanceCount);
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
// The cache write above is keyed by worldEntityKey(worldId, cacheKey)
|
|
974
|
+
// so separate worlds cannot alias their instance buffers.
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
return [
|
|
978
|
+
{
|
|
979
|
+
instanceBuffer,
|
|
980
|
+
instanceBindGroup: resolveGeometryInstancesBindGroup(c, instanceBuffer),
|
|
981
|
+
instanceCount,
|
|
982
|
+
},
|
|
983
|
+
];
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
function resolveGeometryInstancesBindGroup(
|
|
987
|
+
c: _InternalRenderPipelineContext,
|
|
988
|
+
instanceBuffer: Buffer,
|
|
989
|
+
): BindGroup {
|
|
990
|
+
const { runtime, pipelineState, frameState, bindGroupCounts } = c;
|
|
991
|
+
return getOrCreateFromChain(
|
|
992
|
+
frameState.instancesBgShared,
|
|
993
|
+
[pipelineState.instancesBindGroupLayout, instanceBuffer],
|
|
994
|
+
'instances',
|
|
995
|
+
() => {
|
|
996
|
+
const result = runtime.device.createBindGroup({
|
|
997
|
+
label: 'pbr-instances-bg',
|
|
998
|
+
layout: pipelineState.instancesBindGroupLayout,
|
|
999
|
+
entries: [
|
|
1000
|
+
{
|
|
1001
|
+
binding: 0,
|
|
1002
|
+
resource: {
|
|
1003
|
+
kind: 'buffer',
|
|
1004
|
+
value: { buffer: instanceBuffer },
|
|
1005
|
+
},
|
|
1006
|
+
},
|
|
1007
|
+
],
|
|
1008
|
+
});
|
|
1009
|
+
if (!result.ok) throw result.error;
|
|
1010
|
+
return result.value;
|
|
1011
|
+
},
|
|
1012
|
+
bindGroupCounts,
|
|
1013
|
+
);
|
|
1014
|
+
}
|