@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
package/README.md
ADDED
|
@@ -0,0 +1,1019 @@
|
|
|
1
|
+
# `@forgeax/engine-render`
|
|
2
|
+
|
|
3
|
+
## MaterialAsset 唯一成功路径
|
|
4
|
+
|
|
5
|
+
Render 只消费 `paramSchema -> derive -> compile/reflect -> cook/load -> extract/record`
|
|
6
|
+
主线的 extract/record 阶段:从已验证的 material artifact 取得 slot 数据,按
|
|
7
|
+
`coordinateSet`、transform 与 `physicalUvScale` 写入 record,并以
|
|
8
|
+
`layoutIdentity` 选择匹配的 bind-group layout。发现 identity 或坐标不一致时,
|
|
9
|
+
回到 producer inspect/repair/recook,不在 game-side 添加 padding 或 fallback。
|
|
10
|
+
|
|
11
|
+
| 阶段 | 唯一 owner | 结果 |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| schema / derive | material producer | 派生参数与纹理字段 |
|
|
14
|
+
| compile / reflect | shader compiler | 与 WGSL 一致的 artifact 输入 |
|
|
15
|
+
| cook / load | pack 与 assets-runtime | 带 receipt 的 GUID payload |
|
|
16
|
+
| extract / record | render | 与 identity 对齐的 draw bindings |
|
|
17
|
+
|
|
18
|
+
> [!IMPORTANT]
|
|
19
|
+
> Render 错误通过结构化 `code`、`detail`、`hint` 恢复;不要把非结构化文本、
|
|
20
|
+
> app 侧安装或替代材质当作 contract。
|
|
21
|
+
|
|
22
|
+
## Direct-light parity contract
|
|
23
|
+
|
|
24
|
+
The direct-light proposition is: one public `DirectionalLight`/`PointLight`/
|
|
25
|
+
`SpotLight` semantic snapshot must produce the same analytic result in URP and
|
|
26
|
+
HDRP. The M4 authority is the revision-pinned
|
|
27
|
+
[`three-r184-finite-range-authority.json`](../../apps/parity/color-lighting/cases/direct-light/calibration/three-r184-finite-range-authority.json).
|
|
28
|
+
It is `ready` only when its Three revision, source hash, config, and expected
|
|
29
|
+
samples are present. Missing authority or paired GPU captures is `blocked`; do
|
|
30
|
+
not repair that state with a multiplier, a backend profile, or a demo asset.
|
|
31
|
+
|
|
32
|
+
Run the focused contract checks with:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
pnpm exec vitest run apps/parity/color-lighting/src/analytic/__tests__/three-r184-finite-range.test.ts
|
|
36
|
+
pnpm exec vitest run apps/parity/color-lighting/src/integration/__tests__/light-snapshot.test.ts
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The public mapping is deliberately small:
|
|
40
|
+
|
|
41
|
+
| Fact | Contract | Owner or evidence |
|
|
42
|
+
|:--|:--|:--|
|
|
43
|
+
| World scale | `1` world unit is `1` meter | Light components and glTF bridge |
|
|
44
|
+
| Exposure | `1` by default; applied after lighting at tone/output | Camera tone contract and paired capture |
|
|
45
|
+
| Intensity | Directional uses lux; point and spot use candela | `DirectionalLight`, `PointLight`, `SpotLight` |
|
|
46
|
+
| Color | Linear RGB; no hidden global multiplier | Light snapshot and buffer layout |
|
|
47
|
+
| Range and decay | Positive range is meters; `Infinity` means no cutoff; runtime uses `e=2` | Three r184 authority |
|
|
48
|
+
| Cone | KHR radians import to component degrees; snapshot stores `cosInner` and `cosOuter` | glTF bridge and extract |
|
|
49
|
+
| Direction | KHR local `-Z` after world rotation; extract normalizes once; downstream shaders consume the result | Extract snapshot and URP/HDRP shaders |
|
|
50
|
+
|
|
51
|
+
The runtime finite-range factor is the Three r184 squared window:
|
|
52
|
+
`clamp(1 - (d / c)^4, 0, 1)^2`. The KHR
|
|
53
|
+
[`three-r184-khr-calibration.json`](../../apps/parity/color-lighting/cases/direct-light/calibration/three-r184-khr-calibration.json)
|
|
54
|
+
curve is an explicit unsquared import/reference curve only; it is not a
|
|
55
|
+
substitute for the runtime authority. The squared and unsquared samples are
|
|
56
|
+
kept separate so a replacement remains a visible falsification.
|
|
57
|
+
|
|
58
|
+
For a blocked case, inspect the authority fixture first, then the normalized
|
|
59
|
+
light snapshot and the independent Forge/Three captures. The parity report
|
|
60
|
+
must retain `provenance`, `captures`, `raw hash`, `analyticMax`, `roiMax`, and
|
|
61
|
+
`verdict` for each backend x pipeline x case. A same-canvas self-comparison or
|
|
62
|
+
analytic-only green result is not direct-light parity evidence.
|
|
63
|
+
|
|
64
|
+
## Fog: authoring, inspection, and recovery
|
|
65
|
+
|
|
66
|
+
> [!IMPORTANT]
|
|
67
|
+
> Fog is the one public scene-radiance component. Spawn it in the World that
|
|
68
|
+
> is passed as resourceOwner; the renderer selects zero or one Fog entity,
|
|
69
|
+
> validates the fields, publishes a candidate, and commits it only after a
|
|
70
|
+
> successful frame submission. Applications do not register a post effect,
|
|
71
|
+
> pack a Fog buffer, import Fog WGSL, or maintain Fog history.
|
|
72
|
+
|
|
73
|
+
The shortest authoring route is one public import plus the existing draw owner:
|
|
74
|
+
The minimum form is world.spawn({ component: Fog, data: {} }) when defaults are sufficient.
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
import { Fog } from '@forgeax/engine-render';
|
|
78
|
+
import type { RenderError } from '@forgeax/engine-render';
|
|
79
|
+
|
|
80
|
+
const fogEntity = world.spawn({
|
|
81
|
+
component: Fog,
|
|
82
|
+
data: {
|
|
83
|
+
color: [0.45, 0.52, 0.6],
|
|
84
|
+
density: 0.018,
|
|
85
|
+
heightFalloff: 0.15,
|
|
86
|
+
maxOpacity: 0.85,
|
|
87
|
+
},
|
|
88
|
+
}).unwrap();
|
|
89
|
+
|
|
90
|
+
const drawn = renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
|
|
91
|
+
if (!drawn.ok) reportRenderError(drawn.error as RenderError);
|
|
92
|
+
const fogInspection = renderer.renderScene.fog;
|
|
93
|
+
void fogEntity;
|
|
94
|
+
void fogInspection;
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Authoring domain
|
|
98
|
+
|
|
99
|
+
| Field | Valid domain | Default | Meaning |
|
|
100
|
+
|:--|:--|--:|:--|
|
|
101
|
+
| color | three finite non-negative numbers | [0.5, 0.5, 0.5] | Linear Fog radiance color; HDR values are valid |
|
|
102
|
+
| density | finite number >= 0 | 0.01 | Base optical density |
|
|
103
|
+
| heightFalloff | finite number >= 0 | 0 | Exponential density falloff along world y |
|
|
104
|
+
| maxOpacity | finite number in [0, 1] | 1 | Upper bound for the Fog mix; surface alpha is preserved |
|
|
105
|
+
|
|
106
|
+
The component has no mode, profile, baseHeight, start, or end field.
|
|
107
|
+
heightFalloff = 0 is the uniform-density lane. A missing Fog entity means
|
|
108
|
+
disabled scene Fog and adds no Fog-owned graph resource, pass, texture, bind
|
|
109
|
+
group, or history. A second Fog entity in the same resourceOwner is a
|
|
110
|
+
structured conflict, not a winner-selection policy.
|
|
111
|
+
|
|
112
|
+
resourceOwner is an existing numeric World owner, not a string resource:
|
|
113
|
+
|
|
114
|
+
| Fog cardinality in the selected owner | Renderer fact | Recovery |
|
|
115
|
+
|:--:|:--|:--|
|
|
116
|
+
| 0 | enabled=false; no accepted Fog snapshot | Continue without scene Fog |
|
|
117
|
+
| 1 | Candidate is validated and becomes last-known-good after submit | Read renderer.renderScene.fog |
|
|
118
|
+
| N | fog-owner-conflict; no new candidate is published | Remove every extra Fog entity, then retry draw |
|
|
119
|
+
|
|
120
|
+
### Bounded inspection
|
|
121
|
+
|
|
122
|
+
Read the accepted facts after draw:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
const fog = renderer.renderScene.fog;
|
|
126
|
+
const accepted = {
|
|
127
|
+
enabled: fog.enabled,
|
|
128
|
+
resourceOwner: fog.resourceOwner,
|
|
129
|
+
entity: fog.entity,
|
|
130
|
+
revision: fog.revision,
|
|
131
|
+
reactive: fog.reactive,
|
|
132
|
+
failure: fog.failure,
|
|
133
|
+
};
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The inspection is bounded and read-only. revision changes when a successful
|
|
137
|
+
Fog authoring candidate changes; reactive is true on the current frame when
|
|
138
|
+
the accepted revision changed. A failed candidate does not replace the
|
|
139
|
+
last-known-good snapshot. failure is either fog-owner-conflict,
|
|
140
|
+
fog-parameters-invalid, or undefined; it is not a free-form diagnostic
|
|
141
|
+
registry.
|
|
142
|
+
|
|
143
|
+
### Structured errors and exhaustive recovery
|
|
144
|
+
|
|
145
|
+
Fog failures are members of the closed RenderError union:
|
|
146
|
+
FogOwnerConflictError has code fog-owner-conflict, while
|
|
147
|
+
FogParametersInvalidError has code fog-parameters-invalid. Both errors expose
|
|
148
|
+
code, detail, expected, and hint; detail carries the bounded values needed for
|
|
149
|
+
a retry.
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
function recoverFog(error: RenderError): 'retry' | 'forward' {
|
|
153
|
+
switch (error.code) {
|
|
154
|
+
case 'fog-owner-conflict':
|
|
155
|
+
// Remove all but one Fog entity in error.detail.resourceOwner.
|
|
156
|
+
return 'retry';
|
|
157
|
+
case 'fog-parameters-invalid':
|
|
158
|
+
// Set error.detail.field to a value satisfying error.expected.
|
|
159
|
+
return 'retry';
|
|
160
|
+
default:
|
|
161
|
+
return 'forward';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
For fog-owner-conflict, inspect error.detail.entities and
|
|
167
|
+
error.detail.omitted; remove every extra entity from that resourceOwner, then
|
|
168
|
+
retry draw. For fog-parameters-invalid, inspect error.detail.entity,
|
|
169
|
+
error.detail.field, error.detail.actual, and the structured expected domain;
|
|
170
|
+
repair the ECS field and retry. Do not parse the error message, create a
|
|
171
|
+
fallback material, or silently disable Fog.
|
|
172
|
+
|
|
173
|
+
### Height-aware scene-radiance formula
|
|
174
|
+
|
|
175
|
+
The shared forgeax_view::fog module integrates optical depth along a
|
|
176
|
+
producer-supplied world-space ray. Let y0 be the ray origin height, dy its
|
|
177
|
+
world-space vertical direction, d its linear distance, h the height falloff,
|
|
178
|
+
and rho the authored density:
|
|
179
|
+
|
|
180
|
+
$$
|
|
181
|
+
\rho_0 = \rho e^{-h y_0},\qquad
|
|
182
|
+
q = h\,dy,\qquad
|
|
183
|
+
\tau =
|
|
184
|
+
\begin{cases}
|
|
185
|
+
\rho_0 d & |q| < \epsilon,\\
|
|
186
|
+
\rho_0 \dfrac{1-e^{-qd}}{q} & |q| \geq \epsilon.
|
|
187
|
+
\end{cases}
|
|
188
|
+
$$
|
|
189
|
+
|
|
190
|
+
$$
|
|
191
|
+
T = e^{-\tau},\qquad
|
|
192
|
+
\alpha_f = \operatorname{clamp}(m(1-T), 0, 1),\qquad
|
|
193
|
+
C' = \operatorname{mix}(C, C_f, \alpha_f),
|
|
194
|
+
$$
|
|
195
|
+
|
|
196
|
+
where m is maxOpacity, C is the producer color, and Cf is the authored
|
|
197
|
+
linear Fog color. The output keeps the producer alpha unchanged. CPU
|
|
198
|
+
extraction and WGSL share the same field order and ray contract; near/far
|
|
199
|
+
values and non-linear depth are not Fog inputs.
|
|
200
|
+
|
|
201
|
+
### Producer and pipeline responsibility
|
|
202
|
+
|
|
203
|
+
Fog is applied exactly once to linear scene radiance before the
|
|
204
|
+
renderer-owned temporal resolve. URP and HDRP keep their existing pipeline
|
|
205
|
+
order; opaque, masked, unlit, Standard PBR, transparent, Sprite, Text,
|
|
206
|
+
Skybox, and the five VFX render paths supply their own ray facts and call the
|
|
207
|
+
shared module. G-buffer facts, shadow maps, and overlay/debug output are not
|
|
208
|
+
Fog inputs. Alpha is preserved for transparent and VFX output.
|
|
209
|
+
|
|
210
|
+
```mermaid
|
|
211
|
+
flowchart TD
|
|
212
|
+
Author["World spawns one Fog entity"] --> Extract["extract selects resourceOwner"]
|
|
213
|
+
Extract --> Candidate["validate and stage candidate"]
|
|
214
|
+
Candidate --> Submit{"successful frame submit"}
|
|
215
|
+
Submit -->|yes| Accepted["publish revision and bounded inspection"]
|
|
216
|
+
Submit -->|no| Lkg["retain last-known-good snapshot"]
|
|
217
|
+
Accepted --> Scene["linear scene-radiance Fog exactly once"]
|
|
218
|
+
Scene --> Temporal["existing temporal resolve"]
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
No Fog-specific pass, texture, bind group, upload, history, registry, or
|
|
222
|
+
fullscreen fallback is part of this route. TAA remains the sole history owner;
|
|
223
|
+
Fog revision changes use its existing current-frame reactive lane.
|
|
224
|
+
|
|
225
|
+
### Real evidence commands
|
|
226
|
+
|
|
227
|
+
Run the focused contracts first, then the two independent feature carriers:
|
|
228
|
+
|
|
229
|
+
```sh
|
|
230
|
+
pnpm exec vitest run --project='@forgeax/engine-render' packages/render/src/__tests__/fog-public-surface.integration.test.ts packages/render/src/__tests__/fog-source-absence.integration.test.ts packages/render/src/__tests__/fog-custom-render-feature.integration.test.ts
|
|
231
|
+
pnpm --filter @forgeax/bevy-fog smoke
|
|
232
|
+
pnpm --filter @forgeax/bevy-fog smoke:browser
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Each carrier must write case-wise expected, observed, delta, verdict, and
|
|
236
|
+
confidence fields plus revision/reactive/recovery facts. The Dawn artifact is
|
|
237
|
+
evidence/dawn-fog-trace.json; the Browser artifact is
|
|
238
|
+
evidence/browser-fog-trace.json. PNG is auxiliary evidence: it never replaces
|
|
239
|
+
linear readback or the case-wise verdict.
|
|
240
|
+
|
|
241
|
+
> [!CAUTION]
|
|
242
|
+
> The current M4 Dawn and Browser 300-frame artifacts are real executions but
|
|
243
|
+
> remain verdict: fail because their RGB deltas exceed 0.02. This README
|
|
244
|
+
> records the failure rather than promoting it to green. Preserve the
|
|
245
|
+
> artifacts and repair the Engine owner before claiming visual parity.
|
|
246
|
+
|
|
247
|
+
### Custom RenderFeature responsibility
|
|
248
|
+
|
|
249
|
+
A custom RenderFeature can consume the renderer-owned scene-color target and
|
|
250
|
+
contribute an overlay through the existing graph seam. It must not become a
|
|
251
|
+
second Fog owner or create fog-texture, fog-history, fog-bind-group,
|
|
252
|
+
Fog-specific upload state, or a parallel formula. The executable fixture is
|
|
253
|
+
src/__tests__/fog-custom-render-feature.fixture.ts; its compile/import/overlay
|
|
254
|
+
evidence is evidence/custom-render-feature-compile.json and contains the
|
|
255
|
+
fixture path, compiler command, exitCode, moduleImport, and overlay verdict.
|
|
256
|
+
|
|
257
|
+
<details>
|
|
258
|
+
<summary>Custom feature boundary checklist</summary>
|
|
259
|
+
|
|
260
|
+
- [x] Consume existing graph targets instead of allocating a Fog resource.
|
|
261
|
+
- [x] Keep engine-render as the Fog owner.
|
|
262
|
+
- [x] Use the public RenderFeature lifecycle and opaque staging references.
|
|
263
|
+
- [ ] Add a new public capability only through a separate design and owner review.
|
|
264
|
+
|
|
265
|
+
</details>
|
|
266
|
+
|
|
267
|
+
### Out of scope for this Fog contract
|
|
268
|
+
|
|
269
|
+
| Deferred capability | Boundary |
|
|
270
|
+
|:--|:--|
|
|
271
|
+
| Linear start/end, Exp2, baseHeight, public mode/profile, or a second Fog component | Reopen design only if a real scene proves the single density field insufficient |
|
|
272
|
+
| Froxel/raymarch volume, 3D density, phase/scattering, light/shadow injection, or temporal volume denoise | Separate volume and lighting owner |
|
|
273
|
+
| Local Fog volumes, overlap/blend, or directional phase | Separate volume composition authority |
|
|
274
|
+
| Atmosphere, Sun, analytic sky, clouds, weather, or cloud shadow | Separate sky/weather/environment owner |
|
|
275
|
+
| OIT, layered media, volume compositing, or automatic exposure | Separate transparency and color-management owners |
|
|
276
|
+
| Fog-specific pass, texture, bind group, upload, history, or coverage registry | Explicitly forbidden because they duplicate RenderGraph/View/TAA SSOT |
|
|
277
|
+
| Frozen GPU epsilon, exponent, or full diagnostic UI | Keep implementation details behind ABI and bounded evidence |
|
|
278
|
+
|
|
279
|
+
M5 closure remains explicit:
|
|
280
|
+
|
|
281
|
+
- [x] Public Fog schema and bounded inspection are documented.
|
|
282
|
+
- [x] One-cut app source absence and two closed recovery errors are indexed.
|
|
283
|
+
- [x] Real Dawn/Browser evidence paths and their current failed verdicts are linked.
|
|
284
|
+
- [ ] RGB tolerance repair and full smoke-fleet gates remain required.
|
|
285
|
+
|
|
286
|
+
## Particle feature boundary
|
|
287
|
+
|
|
288
|
+
Particle rendering is provided by
|
|
289
|
+
[`@forgeax/engine-vfx-render`](../vfx-render/README.md). This package owns the
|
|
290
|
+
generic RenderFeature host, prepared graphics resolver, pipeline readiness
|
|
291
|
+
contract, and structured renderer errors; it does not own VFX simulation or
|
|
292
|
+
particle asset authoring.
|
|
293
|
+
|
|
294
|
+
## Deferred membership timing
|
|
295
|
+
|
|
296
|
+
Render owns the opt-in `membershipTiming` contract for the real
|
|
297
|
+
`hdrp-cluster-membership` compute pass. App and Runtime only forward the option;
|
|
298
|
+
they do not define a second profiler or reason vocabulary.
|
|
299
|
+
|
|
300
|
+
| Mode | Work | Result |
|
|
301
|
+
|:--|:--|:--|
|
|
302
|
+
| omitted | No query set, resolve buffer, map, or queue wait | No timing record |
|
|
303
|
+
| `cpu-control` | Existing CPU binner remains the control path | Accepted control record with `gpu: null` |
|
|
304
|
+
| `gpu` | Bounded timestamp query, resolve, async queue completion, and map | GPU ticks plus backend period, or a terminal refusal/error |
|
|
305
|
+
|
|
306
|
+
> [!IMPORTANT]
|
|
307
|
+
> A GPU request is refused when the backend does not advertise timestamp
|
|
308
|
+
> queries or a positive timestamp period. RhiNull and the wgpu WebGL2 path are
|
|
309
|
+
> intentionally non-timing backends. They never synthesize GPU duration.
|
|
310
|
+
|
|
311
|
+
The controller timestamps immediately around the existing membership dispatch,
|
|
312
|
+
keeps GPU ticks separate from CPU encode/submit and async readback, and
|
|
313
|
+
terminalizes captures on timeout, submit failure, queue completion failure,
|
|
314
|
+
readback failure, device recovery, or disposal. The closed
|
|
315
|
+
`MembershipTimingReasonCode` union and its exhaustive mapping live in
|
|
316
|
+
[`src/record/membership-timing.ts`](src/record/membership-timing.ts).
|
|
317
|
+
|
|
318
|
+
Timestamp-capable backends must execute both raw timestamp writes. A missing or
|
|
319
|
+
throwing write is a structured `timestamp-write-unavailable` refusal; Render
|
|
320
|
+
never publishes a zero, reversed, or non-finite GPU interval as a report.
|
|
321
|
+
|
|
322
|
+
## Deferred membership evidence closure
|
|
323
|
+
|
|
324
|
+
> [!IMPORTANT]
|
|
325
|
+
> The close condition is `acceptedGpu=16`, with five accepted Dawn GPU
|
|
326
|
+
> records at each of 32, 64, and 128 lights, one 256-light record, positive
|
|
327
|
+
> tick intervals, per-light-count variance, and the 256-light overflow
|
|
328
|
+
> fingerprint. `acceptedGpu=0` is a blocker. CPU control, WebKit refusal,
|
|
329
|
+
> RhiNull refusal, PNG screenshots, and capability bits never count as GPU
|
|
330
|
+
> evidence.
|
|
331
|
+
|
|
332
|
+
The producer and validator are deliberately separate from the public Render
|
|
333
|
+
API. Generate the exact manifest, run the full producer matrix, and inspect
|
|
334
|
+
the machine-readable report in this order:
|
|
335
|
+
|
|
336
|
+
```sh
|
|
337
|
+
node scripts/dev-verify/generate-deferred-membership-manifest.mjs --output=report/deferred-membership-timing/full-matrix-manifest.json
|
|
338
|
+
node scripts/dev-verify/capture-deferred-membership-corpus.mjs --manifest=report/deferred-membership-timing/full-matrix-manifest.json --output-root=report/deferred-membership-timing --webkit-download=webkit-evidence --report=report/deferred-membership-timing
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
The manifest contract is [`full-matrix-contract.json`](../../scripts/dev-verify/membership-timing/full-matrix-contract.json); the WebKit subset is validated by [`webkit-subset.schema.json`](../../scripts/dev-verify/membership-timing/webkit-subset.schema.json). The stable identity is `sourceHead`, `carrier`, `workload`, `profile`, and `artifactHashes`. The exact target is 20 top-level records and 32 nested references, with `record`, `profile`, `membership`, and `pixel` SHA-256 descriptors.
|
|
342
|
+
|
|
343
|
+
The report exposes `valid`, `truthfulnessReady`, `completeMatrixReady`,
|
|
344
|
+
`optimizationReleaseReady`, `counts`, `errors`, and `blocker`. A blocker uses
|
|
345
|
+
`code`, `expected`, `hint`, and the observed `acceptedGpu` count so an AI user
|
|
346
|
+
can recover by inspecting per-attempt refusal, profile, identity, and artifact
|
|
347
|
+
hash records. The owner reason union remains closed; for example,
|
|
348
|
+
`timestamp-query-unsupported` is a refusal, while `timestamp-write-unavailable`
|
|
349
|
+
is a terminal producer failure. Neither is a successful GPU sample.
|
|
350
|
+
|
|
351
|
+
## RenderFeature: the producer seam (first-read index)
|
|
352
|
+
|
|
353
|
+
The public route remains `RenderFeature` through `RenderPipeline` and the
|
|
354
|
+
active RenderGraph pass. This is the RenderGraph pass for a `type FrameData`
|
|
355
|
+
producer, which uses
|
|
356
|
+
`createRenderer(canvas, { features: [feature] })`,
|
|
357
|
+
`context.staging.addPass('named-pass'`, `execute: ({ pass })`, and the
|
|
358
|
+
`Material pass` boundary. This is the graph-only Wave 1 feature route.
|
|
359
|
+
|
|
360
|
+
> [!IMPORTANT]
|
|
361
|
+
> Render consumes the effective MaterialAsset snapshot produced by extract. Each texture slot carries its own coordinate set and transform into the built-in PBR binding layout; render records do not reinterpret authoring fields or manufacture shader artifacts. The effective `passes` are already validated.
|
|
362
|
+
|
|
363
|
+
## MaterialAsset render contract
|
|
364
|
+
|
|
365
|
+
Render owns this consumption route:
|
|
366
|
+
|
|
367
|
+
| Input | Render responsibility |
|
|
368
|
+
|:--|:--|
|
|
369
|
+
| `passes` and `values` | Consume the effective snapshot; do not reinterpret authoring data. |
|
|
370
|
+
| `parent` | Consume the already-resolved inheritance result. |
|
|
371
|
+
| texture `coordinates` | Bind the selected coordinate set and transform. |
|
|
372
|
+
| `cook` output | Record only validated shader artifacts. |
|
|
373
|
+
| `recovery` | Preserve the structured failure so the source contract or cooked module can be repaired. |
|
|
374
|
+
|
|
375
|
+
### Mesh material binding resolution
|
|
376
|
+
|
|
377
|
+
Render resolves one effective material table per logical mesh slot before
|
|
378
|
+
recording submesh draws. `MeshRenderer.materials[]` is a sparse per-instance
|
|
379
|
+
override vector: a missing entry or `0` inherits the corresponding
|
|
380
|
+
`MeshAsset.materialSlots[]` default. A slot without a declared mesh default
|
|
381
|
+
uses the neutral engine material.
|
|
382
|
+
|
|
383
|
+
> [!IMPORTANT]
|
|
384
|
+
> A declared mesh default is a required asset dependency. If it is unavailable,
|
|
385
|
+
> extract fails closed with the mesh GUID, slot index, and material GUID instead
|
|
386
|
+
> of silently painting the mesh gray. Invalid instance overrides fall back with
|
|
387
|
+
> a structured diagnostic; entries beyond the slot table are ignored and
|
|
388
|
+
> diagnosed.
|
|
389
|
+
|
|
390
|
+
The render path is `MaterialAsset` -> extract snapshot -> prepare resources -> record the per-slot `coordinates` and values. The effective `parent` is already resolved before extract. If a material contract or reflection binding fails, preserve the structured error and repair the source contract or cooked module before drawing again; that is the recovery route. The render package owns consumption, not material import or cook policy.
|
|
391
|
+
|
|
392
|
+
> [!IMPORTANT]
|
|
393
|
+
> Owner: render vocabulary and the extract → prepare → record frame boundary. Runtime selects concrete services and calls this package; it does not re-own these tokens.
|
|
394
|
+
|
|
395
|
+
```ts
|
|
396
|
+
import {
|
|
397
|
+
Camera,
|
|
398
|
+
materialTextureValue,
|
|
399
|
+
MeshFilter,
|
|
400
|
+
MeshRenderer,
|
|
401
|
+
} from '@forgeax/engine-render';
|
|
402
|
+
import { createRenderer } from '@forgeax/engine-runtime';
|
|
403
|
+
|
|
404
|
+
const renderer = await createRenderer(canvas);
|
|
405
|
+
const ready = await renderer.ready;
|
|
406
|
+
const attached = renderer.attachWorld(world);
|
|
407
|
+
if (ready.ok && attached.ok) {
|
|
408
|
+
world.update(1 / 60).unwrap();
|
|
409
|
+
renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// A numeric texture handle is normalized into the structured material slot.
|
|
413
|
+
const values = { baseColorTexture: materialTextureValue(textureHandle) };
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
For the full slot contract, read [`MaterialTextureValue`](../types/src/material/asset.ts)
|
|
417
|
+
and keep `baseColorTexture` on the same `paramSchema -> derive -> cook/load ->
|
|
418
|
+
extract/record` path.
|
|
419
|
+
|
|
420
|
+
`attachWorld` installs renderer-required derived-state systems once. Hosts built
|
|
421
|
+
with `createApp` get this wiring automatically. A custom loop attaches each
|
|
422
|
+
World before its first update, then keeps `draw` as a read-only consumer of the
|
|
423
|
+
state published by `World.update()`.
|
|
424
|
+
|
|
425
|
+
## Persistent render scene
|
|
426
|
+
|
|
427
|
+
The ordinary single-World path bootstraps one renderer-owned CPU projection,
|
|
428
|
+
then drains the World's bounded change journal. Each attached World generation
|
|
429
|
+
receives one renderer-local `WorldRenderId`; draw-array reordering cannot change
|
|
430
|
+
that identity, while detach retires it before the same World object can
|
|
431
|
+
reattach. A no-change frame reuses the last visible snapshot without traversing
|
|
432
|
+
renderable archetypes; transform changes update only their stable projection
|
|
433
|
+
slots. Unrelated gameplay component writes do not invalidate render state.
|
|
434
|
+
|
|
435
|
+
Mutable shared payloads use the same explicit-dirty rule: mutate the resolved
|
|
436
|
+
payload, then call `world.sharedRefs.markChanged(handle)`. The renderer compares
|
|
437
|
+
one monotonic shared-ref epoch on the no-change path, drains the bounded exact
|
|
438
|
+
mutation journal when it advances, and refreshes only projection slots indexed
|
|
439
|
+
by the changed material handle. Journal overflow and topology-changing material
|
|
440
|
+
edits remain explicit full-reconcile reasons rather than silent partial state.
|
|
441
|
+
|
|
442
|
+
When `RhiCaps.storageBuffer` is available, the same projection owns persistent
|
|
443
|
+
Primitive, Instance, Transform, DrawTemplate, and Material GPU tables. The
|
|
444
|
+
tables use independent stable ranges: one primitive can reference ordinary
|
|
445
|
+
instance-local transforms, multiple draw items, and multiple prepared material
|
|
446
|
+
records. The schema in `src/gpu-scene-schema.ts` derives byte offsets, signed
|
|
447
|
+
and unsigned scalar forms, strides, and WGSL declarations; dirty ranges become
|
|
448
|
+
coalesced `queue.writeBuffer` writes and no-change frames upload zero scene
|
|
449
|
+
bytes. Device recovery discards only device-owned tables and rebuilds them from
|
|
450
|
+
the retained CPU projection.
|
|
451
|
+
|
|
452
|
+
The typed render-graph evidence path imports those persistent tables without
|
|
453
|
+
transferring ownership, runs compute cull → compact → indirect args, and consumes
|
|
454
|
+
the result through a graph-owned raster pass. Companion Dawn and Chromium gates
|
|
455
|
+
also cover storage-buffer ping-pong, compute-generated indirect dispatch and draw
|
|
456
|
+
arguments, storage-texture sampling in raster, and per-mip HZB reduction. These
|
|
457
|
+
are real driver/pixel proofs for the GPU-driven boundary; they do not make
|
|
458
|
+
RhiNull a pixel backend or make the CPU projection cease to be the scene
|
|
459
|
+
authority.
|
|
460
|
+
|
|
461
|
+
Inspect the current path through `renderer.renderScene`. Its CPU counters expose
|
|
462
|
+
full rebuilds, no-change and delta frames, transform/material/instance updates,
|
|
463
|
+
removals, the journal cursor, projection cardinality, and the last resync
|
|
464
|
+
reason. The nested `gpu` status is one of `inactive`, `unsupported`, `resident`,
|
|
465
|
+
`rebuild-pending`, or `error`; resident state additionally reports capacity,
|
|
466
|
+
upload ranges and bytes, grows, clears, rebuilds, and no-change frames. The
|
|
467
|
+
`gpuDriven` inspection reports whether stable frames materialized or validated
|
|
468
|
+
GPU-owned rows and whether candidate or batch topology bytes were uploaded.
|
|
469
|
+
GPU errors also use the existing `renderer.onError` channel.
|
|
470
|
+
|
|
471
|
+
## GPU-driven view kernel
|
|
472
|
+
|
|
473
|
+
`BatchTopology` groups eligible rigid draw items by immutable geometry,
|
|
474
|
+
material, render-state, and command compatibility. One primitive can contribute
|
|
475
|
+
multiple submesh draw items, and each draw item uses a closed indexed or
|
|
476
|
+
non-indexed five-word indirect command. A per-view typed graph records
|
|
477
|
+
`reset -> frustum/compact -> finalize` over persistent candidate and batch
|
|
478
|
+
buffers. The compute path validates generation and active flags, composes the
|
|
479
|
+
primitive world transform with each ordinary instance-local transform, writes a
|
|
480
|
+
compact `(instanceIndex, materialIndex)` stream, sets explicit overflow flags,
|
|
481
|
+
and emits indirect arguments with `firstInstance = 0`.
|
|
482
|
+
|
|
483
|
+
The URP frame activates the production raster lane when compute, storage
|
|
484
|
+
buffers, and indirect drawing are available. The current lane accepts opaque,
|
|
485
|
+
rigid default-unlit passes with batch-stable render state, ordinary instances,
|
|
486
|
+
indexed or non-indexed geometry, multiple submeshes and material slots, and the
|
|
487
|
+
canonical `12F` vertex layout. It also accepts persistent rigid multi-World
|
|
488
|
+
composition keyed by stable renderer-local World identity instead of the
|
|
489
|
+
current `draw(worlds)` order. Candidates come from the complete persistent
|
|
490
|
+
projection rather than the CPU-visible snapshot. The same typed graph imports the scene and mesh
|
|
491
|
+
buffers, runs the three compute passes, and consumes generated arguments with
|
|
492
|
+
`drawIndexedIndirect` or `drawIndirect`. Entities accepted by that lane are not
|
|
493
|
+
also validated, uploaded, or recorded by the CPU forward loop on a stable
|
|
494
|
+
frame.
|
|
495
|
+
|
|
496
|
+
HDRP, PBR and custom shader variants, texture/sampler/video resource bindings,
|
|
497
|
+
transparent meshes, skinning, morphing, non-canonical layouts, and shadow views
|
|
498
|
+
keep explicit CPU or specialized lanes. WebGL2 selects capability fallback from
|
|
499
|
+
the same persistent projection; it does not emulate compute. Visibility and
|
|
500
|
+
hierarchy changes, non-rigid multi-World composition, and some prepared-resource
|
|
501
|
+
changes still require bounded reconcile work. The implemented lane proves a
|
|
502
|
+
zero-upload stable data path and broad rigid geometry coverage, but hardware
|
|
503
|
+
100k timing, schema-derived material variants, visibility/hierarchy-local
|
|
504
|
+
routing, and GPU-driven shadows remain required before declaring P3 complete.
|
|
505
|
+
|
|
506
|
+
The bounded inspection reports topology revision, candidates, batches, visible
|
|
507
|
+
capacity, buffer capacities, update count, upload bytes, rebuild count, and CPU
|
|
508
|
+
fallback rows. RhiNull verifies graph dependency order and stable-frame zero
|
|
509
|
+
work; Dawn and Chromium verification consume indexed, non-indexed,
|
|
510
|
+
multi-submesh, and instanced arguments, read persistent scene tables in the
|
|
511
|
+
vertex path, and compare the resulting pixel. The renderer-level RhiNull
|
|
512
|
+
integration also proves that the built-in URP graph contains the compute chain
|
|
513
|
+
before `main`, including rigid multi-World composition, without GPU plus CPU
|
|
514
|
+
duplicate draws. The renderer retains one graph, one compile owner, one
|
|
515
|
+
encoder, and one submit route.
|
|
516
|
+
|
|
517
|
+
> [!NOTE]
|
|
518
|
+
> Non-rigid multi-World composition, skinned lanes, visibility/hierarchy
|
|
519
|
+
> changes, and unsupported render-relevant structural changes currently take
|
|
520
|
+
> an explicit reconcile path. The projection and GPU tables already define
|
|
521
|
+
> stable slot, generation, create, update, remove, grow, clear, and rebuild
|
|
522
|
+
> semantics; later coverage can make those changes entity-local without adding
|
|
523
|
+
> another scene authority.
|
|
524
|
+
|
|
525
|
+
When a host constructs a feature only after its World or asset catalogue is
|
|
526
|
+
ready, use `await renderer.installRenderFeature(feature)`. The late path inserts into
|
|
527
|
+
the same lifecycle host and RenderGraph ordering as boot-time features; it is
|
|
528
|
+
not a second renderer. Installing the same object twice is idempotent, while a
|
|
529
|
+
different object with the same identity returns the structured registration
|
|
530
|
+
conflict. Awaiting also completes the feature's declared material-shader
|
|
531
|
+
prewarm, so its first prepared draw observes the same ready barrier as a
|
|
532
|
+
boot-time feature.
|
|
533
|
+
|
|
534
|
+
This is the graph-only Wave 1 feature route; prepared graphics and late shader
|
|
535
|
+
prewarm extend the same lifecycle for production asset features.
|
|
536
|
+
|
|
537
|
+
When a late-installed feature remains registered through device loss, its declared material
|
|
538
|
+
shaders remain part of the renderer's live prewarm set. `await renderer.recover()` therefore
|
|
539
|
+
rebuilds those modules before the next prepared draw rather than relying on a one-frame retry.
|
|
540
|
+
|
|
541
|
+
For capability composition, `rendererPlugin(renderer)` provides the Host-owned
|
|
542
|
+
renderer and `renderFeaturePlugin(feature)` binds installation to a Cordis
|
|
543
|
+
Fiber. Fiber disposal calls `uninstallRenderFeature`, waits for submitted GPU
|
|
544
|
+
work, releases prepared batches/resources, and removes the feature's shader
|
|
545
|
+
prewarm declarations before the disposer resolves. The Fiber is never queried
|
|
546
|
+
inside extract, prepare, record, RenderGraph execution, or an RHI command loop.
|
|
547
|
+
|
|
548
|
+
When an App or Engine Worker owns the host-created Renderer itself, it installs
|
|
549
|
+
`ownedRendererPlugin(renderer)`. The same Provider publishes the renderer
|
|
550
|
+
Service and calls `Renderer.dispose()` after dependent capability Fibers have
|
|
551
|
+
unwound. Assemble-form Apps use borrowed `rendererPlugin(renderer)` instead.
|
|
552
|
+
|
|
553
|
+
```ts
|
|
554
|
+
const fiber = await app.pluginContext.plugin(renderFeaturePlugin(feature));
|
|
555
|
+
await fiber.dispose();
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
Boot-time `features: [...]` remains the direct renderer-construction path. Use
|
|
559
|
+
the plugin helper when the feature belongs to an optional or reloadable
|
|
560
|
+
capability whose lifetime must be reversible.
|
|
561
|
+
|
|
562
|
+
### Built-in pipeline identity and cleanup
|
|
563
|
+
|
|
564
|
+
The built-in Universal Render Pipeline is registered under the stable public
|
|
565
|
+
identifier `URP_PIPELINE_ID` (`'forgeax::urp'`). Import the identifier from the
|
|
566
|
+
public `@forgeax/engine-render` entry when constructing a
|
|
567
|
+
`RenderPipelineAsset`; the `urpPipeline` implementation remains engine-owned.
|
|
568
|
+
|
|
569
|
+
```ts
|
|
570
|
+
import { URP_PIPELINE_ID } from '@forgeax/engine-render';
|
|
571
|
+
|
|
572
|
+
const asset = {
|
|
573
|
+
kind: 'render-pipeline',
|
|
574
|
+
pipelineId: URP_PIPELINE_ID,
|
|
575
|
+
config: {},
|
|
576
|
+
};
|
|
577
|
+
const cleanup = renderer.installPipeline(asset);
|
|
578
|
+
if (cleanup.ok) {
|
|
579
|
+
// Keep this disposer with the Renderer / Fiber that installed the asset.
|
|
580
|
+
cleanup.value();
|
|
581
|
+
}
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
> [!IMPORTANT]
|
|
585
|
+
> Pipeline, post-process, and RenderFeature registrations belong to a
|
|
586
|
+
> Renderer instance and must be disposed with that instance or its owning
|
|
587
|
+
> Fiber. Do not add a module-level `installed` set or reach through
|
|
588
|
+
> `renderer.store`; those are lifecycle and allocation internals, not public
|
|
589
|
+
> extension state.
|
|
590
|
+
|
|
591
|
+
| This package owns | Excluded concepts |
|
|
592
|
+
|:--|:--|
|
|
593
|
+
| Camera/light/mesh vocabulary, `Renderer`, render errors, documented pipeline operations | Backend selection, asset import, ECS scheduling, animation playback, optional text/tile/sprite authoring |
|
|
594
|
+
|
|
595
|
+
The stable surface is [`src/index.ts`](src/index.ts). `RenderError` is closed and carries actionable detail. Runtime alone owns host assembly and its `EngineEnvironmentError` rejection contract; render's construction seam is internal to that dependency path.
|
|
596
|
+
|
|
597
|
+
## Tone mapping output contract
|
|
598
|
+
|
|
599
|
+
The public mode names are the same names used by the Three r184 oracle:
|
|
600
|
+
|
|
601
|
+
| Mode | Public constant | Output behavior |
|
|
602
|
+
|:--|:--|:--|
|
|
603
|
+
| `linear` | `TONEMAP_LINEAR` | Exposure, then clamp to LDR |
|
|
604
|
+
| `reinhard` | `TONEMAP_REINHARD` | Per-channel Reinhard |
|
|
605
|
+
| `cineon` | `TONEMAP_CINEON` | Cineon filmic curve |
|
|
606
|
+
| `aces-filmic` | `TONEMAP_ACES_FILMIC` | ACES filmic curve |
|
|
607
|
+
| `agx` | `TONEMAP_AGX` | AgX curve |
|
|
608
|
+
| `neutral` | `TONEMAP_NEUTRAL` | Khronos neutral curve |
|
|
609
|
+
|
|
610
|
+
`TONEMAP_REINHARD_EXTENDED` is the existing ForgeaX luminance-domain curve. Its
|
|
611
|
+
separate `reinhard-extended` name is intentional: it is not a second formula
|
|
612
|
+
hidden behind the Three `reinhard` name.
|
|
613
|
+
|
|
614
|
+
Tone-enabled cameras use one output contract:
|
|
615
|
+
|
|
616
|
+
```text
|
|
617
|
+
linearHdr -- exposure + named tone curve --> linearLdr --> displayEncoded
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
The final capture is the encoded surface result. A linear capture, when a
|
|
621
|
+
parity adapter exposes one, remains a separate `linearHdr` or `linearLdr`
|
|
622
|
+
sample and must not be compared as if it were the final display capture. The
|
|
623
|
+
contract is available as `resolveToneOutputContract(camera.tonemap)` from the
|
|
624
|
+
render package. The camera remains the runtime entry point:
|
|
625
|
+
|
|
626
|
+
```ts
|
|
627
|
+
import { Camera, TONEMAP_AGX, perspective } from '@forgeax/engine-render';
|
|
628
|
+
|
|
629
|
+
world.spawn({
|
|
630
|
+
component: Camera,
|
|
631
|
+
data: {
|
|
632
|
+
...perspective({ fov: Math.PI / 4, aspect: 1 }),
|
|
633
|
+
tonemap: TONEMAP_AGX,
|
|
634
|
+
exposure: 1,
|
|
635
|
+
},
|
|
636
|
+
}).unwrap();
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
The built-in pass samples the HDR target and writes the LDR result through the
|
|
640
|
+
registered `forgeax::tonemap` fullscreen shader. Shader source authority is
|
|
641
|
+
[`packages/shader/src/tonemap.wgsl`](../shader/src/tonemap.wgsl); the render
|
|
642
|
+
package does not duplicate those formulas.
|
|
643
|
+
|
|
644
|
+
## Optional CPU profiling
|
|
645
|
+
|
|
646
|
+
Render accepts the host-owned `Profiler` capability through App assembly. It writes bounded CPU
|
|
647
|
+
phase evidence only while a capture is active; it does not add GPU timestamps, ECS spans, a UI, or
|
|
648
|
+
a remote method. The artifact and its owner-declared catalog are documented by
|
|
649
|
+
[`@forgeax/engine-profiler`](../profiler/README.md).
|
|
650
|
+
|
|
651
|
+
```ts
|
|
652
|
+
import { createProfiler, type Profiler } from '@forgeax/engine-profiler';
|
|
653
|
+
import { createRenderer } from '@forgeax/engine-runtime';
|
|
654
|
+
|
|
655
|
+
const profiler: Profiler = createProfiler();
|
|
656
|
+
const renderer = await createRenderer(canvas, { profiler });
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
Use the package's `validateProfileCapture` and `buildProfileModel` entries for offline analysis.
|
|
660
|
+
The render package remains the owner of render vocabulary and extract/prepare/record execution.
|
|
661
|
+
|
|
662
|
+
## RenderFeature: the producer seam
|
|
663
|
+
|
|
664
|
+
Register one producer-owned feature at the renderer assembly boundary. The
|
|
665
|
+
same `FrameData` type flows through `extract`, `prepare`, and `contribute`;
|
|
666
|
+
the host supplies ordering, capability projection, graph composition, and
|
|
667
|
+
lifecycle isolation.
|
|
668
|
+
Both paths execute inside the active RenderGraph and the frame's single
|
|
669
|
+
execute/submit boundary.
|
|
670
|
+
|
|
671
|
+
The smallest graph-only feature can still use `addResource` plus `addPass` for
|
|
672
|
+
CPU callbacks. GPU work uses the typed methods on the same staging object:
|
|
673
|
+
|
|
674
|
+
```ts
|
|
675
|
+
contribute: (_frame, context) => {
|
|
676
|
+
context.staging.addComputePass('compact', computeDescriptor).unwrap();
|
|
677
|
+
context.staging.addGraphicsPass('draw', graphicsDescriptor).unwrap();
|
|
678
|
+
return ok(undefined);
|
|
679
|
+
}
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
`computeDescriptor` contains only prepared program/binding references and
|
|
683
|
+
dispatches. `graphicsDescriptor` contains logical feature targets, prepared
|
|
684
|
+
pipeline/binding/data references, and draw or indirect-draw commands. The host
|
|
685
|
+
projects both into one typed `RenderGraph`; neither descriptor owns an encoder.
|
|
686
|
+
|
|
687
|
+
### Five render terms
|
|
688
|
+
|
|
689
|
+
| Term | Meaning | Owner |
|
|
690
|
+
|:--|:--|:--|
|
|
691
|
+
| `RenderFeature` | Producer-owned extract/prepare/contribute callbacks and frame data | Feature producer |
|
|
692
|
+
| `RenderPipeline` | Full frame policy selected or switched by the host | Render host |
|
|
693
|
+
| RenderGraph pass | One declared graph execution node contributed to the active pipeline | Graph host |
|
|
694
|
+
| Material pass | One shader-facing pass in a `MaterialAsset` | Material asset |
|
|
695
|
+
| Prepared graphics | Opaque pipeline, binding, vertex/index, and attachment references prepared by the host | Render host |
|
|
696
|
+
| Prepared GPU work | Opaque persistent compute program, binding, buffer, dispatch, and indirect-draw references | Render host |
|
|
697
|
+
|
|
698
|
+
### Prepared compute resources
|
|
699
|
+
|
|
700
|
+
`RenderFeature` producers prepare cooked compute pipelines, reflected name-based bindings,
|
|
701
|
+
uniform/storage buffers, and dispatches. The renderer joins reflection with prepared binding
|
|
702
|
+
entries, imports the persistent buffers into the render graph, and derives `uniform-read`,
|
|
703
|
+
`storage-read`, or `storage-read-write` access. Producers do not repeat a string `reads/writes`
|
|
704
|
+
ledger and do not receive an encoder.
|
|
705
|
+
|
|
706
|
+
Compute and graphics passes use the same contribution graph and submission boundary. The graph
|
|
707
|
+
owns `beginComputePass` / `end`; prepared GPU work records only pipeline, bind group, and dispatch
|
|
708
|
+
commands into the lent pass encoder. Persistent buffers retain device identity across frames,
|
|
709
|
+
rebuild with the feature-host generation, and retire only after queue completion. A storage buffer
|
|
710
|
+
may also be consumed as renderer-declared vertex data.
|
|
711
|
+
|
|
712
|
+
Feature contexts never expose raw GPU graphics state, a complete pipeline
|
|
713
|
+
context, submit authority, or a command encoder. They expose an immutable
|
|
714
|
+
`Readonly<RhiCaps>` capability snapshot for capability-gated preparation. The
|
|
715
|
+
graph-only `addPass`
|
|
716
|
+
surface still exposes only named pass and frame identity; use the prepared
|
|
717
|
+
graphics surface below when a feature needs pipelines, bindings, vertex/index
|
|
718
|
+
data, attachments, and draw records. Both paths execute inside the active
|
|
719
|
+
RenderGraph and the frame's single execute/submit boundary. The active RenderGraph
|
|
720
|
+
owns that frame boundary. Do not cast either context to a raw device or encoder. See
|
|
721
|
+
[`features/graph-contribution.ts`](src/features/graph-contribution.ts) for the
|
|
722
|
+
staging shape.
|
|
723
|
+
|
|
724
|
+
The copyable recipe above is therefore a graph-only Wave 1 feature; it stops at
|
|
725
|
+
the graph seam and does not provide a production particle draw path.
|
|
726
|
+
|
|
727
|
+
### Prepared graphics recipe
|
|
728
|
+
|
|
729
|
+
Prepared graphics extends the existing graph-owned staging seam with five
|
|
730
|
+
opaque reference kinds. A producer requests preparation during `prepare`,
|
|
731
|
+
retains only the returned references, and contributes declarative records. The
|
|
732
|
+
render host owns generation checks, graph composition, recording, and submit.
|
|
733
|
+
|
|
734
|
+
Persistent GPU work follows the same ownership rule. A feature may retain opaque bindings for an
|
|
735
|
+
active producer; bindings retain their transitive program and buffers. Untouched resources are
|
|
736
|
+
detached after a successful feature frame and destroyed after queue completion, never while an
|
|
737
|
+
in-flight command can still reference them.
|
|
738
|
+
|
|
739
|
+
Prepare opaque references through `context.graphics` and, when compute is
|
|
740
|
+
available, `context.gpu`; retain those references in producer-owned frame data
|
|
741
|
+
and consume them only through `addComputePass` and `addGraphicsPass` during
|
|
742
|
+
`contribute`. The executable contract examples live in
|
|
743
|
+
[`render-feature-graph.integration.test.ts`](src/__tests__/render-feature-graph.integration.test.ts)
|
|
744
|
+
and
|
|
745
|
+
[`render-feature-gpu-work.integration.test.ts`](src/__tests__/render-feature-gpu-work.integration.test.ts).
|
|
746
|
+
|
|
747
|
+
### Failure and recovery
|
|
748
|
+
|
|
749
|
+
`RenderError` is a closed union. Switch on `error.code`, then read
|
|
750
|
+
`error.expected`, `error.hint`, and the code-specific `error.detail`.
|
|
751
|
+
|
|
752
|
+
Feature capability checks are based on `Readonly<RhiCaps>`, and recovery actions
|
|
753
|
+
consume the structured `error.detail` context.
|
|
754
|
+
|
|
755
|
+
| Diagnostic state or code | Recovery action |
|
|
756
|
+
|:--|:--|
|
|
757
|
+
| `active` | Continue the next frame |
|
|
758
|
+
| `failed` / `render-feature-stage-failed` | Correct producer data and retry on the next frame |
|
|
759
|
+
| `disabled` / `render-feature-capability-missing` | Provide the capability on a replacement device; after device-loss recovery call `await renderer.recover()`. On a live renderer, `recover()` returns `recover-not-needed`, so rebuild on a capable device instead. |
|
|
760
|
+
| `render-feature-registration-conflict` | Fix identity/order at registration |
|
|
761
|
+
| `render-feature-pass-order-conflict` | Reorder the declared dependency and retry contribution |
|
|
762
|
+
| `render-feature-preparation-failed` | Repair the named prepared resource and retry on the action in `error.detail.recovery`; after device loss, verify that the feature's declared shader was included in the recovery prewarm set |
|
|
763
|
+
| `render-feature-prepared-state-mismatch` | Read the discriminated `error.detail.reason`, repair the generation/layout/format mismatch, and retry |
|
|
764
|
+
| `render-feature-draw-recording-failed` | Read `error.detail.backendReason`, then retry after the host reports renderer recovery |
|
|
765
|
+
| `disposed` | Terminal; create a new renderer/feature registration |
|
|
766
|
+
|
|
767
|
+
Use `renderer.renderFeatureDiagnostics()` for a read-only snapshot. Call
|
|
768
|
+
`renderer.dispose()` once or repeatedly; disposal is idempotent. A pipeline
|
|
769
|
+
switch keeps the feature registration list and rebuilds the active graph.
|
|
770
|
+
The host still uses `renderer.registerPipeline(id, pipeline)` for a full
|
|
771
|
+
pipeline change.
|
|
772
|
+
|
|
773
|
+
For a temporary presentation-owner handoff, call `renderer.releaseSurface()`.
|
|
774
|
+
It unconfigures the canvas and makes `draw()` fail closed without disposing the
|
|
775
|
+
Renderer, AssetRegistry, or GPU declarations. After the temporary owner is
|
|
776
|
+
gone, `renderer.restoreSurface()` re-enables lazy surface configuration on the
|
|
777
|
+
next draw. Both calls are idempotent; `dispose()` remains the terminal path.
|
|
778
|
+
|
|
779
|
+
For the complete declaration shape, read
|
|
780
|
+
[`features/types.ts`](src/features/types.ts) and
|
|
781
|
+
[`features/prepared-graphics.ts`](src/features/prepared-graphics.ts). For graph
|
|
782
|
+
contribution details, read [`features/graph-contribution.ts`](src/features/graph-contribution.ts);
|
|
783
|
+
for pipeline switching, read [`renderer.ts`](src/renderer.ts). The producer
|
|
784
|
+
asset contract is [`@forgeax/engine-vfx`](../vfx/README.md), while graph
|
|
785
|
+
ownership is [`@forgeax/engine-render-graph`](../render-graph/README.md).
|
|
786
|
+
|
|
787
|
+
> [!WARNING]
|
|
788
|
+
> Wave 2 delivered this generic prepared public seam. A downstream Wave 3 VFX
|
|
789
|
+
> integration owns visible particle draws; render must not gain a
|
|
790
|
+
> particle-kind switch or VFX production dependency. See the
|
|
791
|
+
> [VFX Wave 3 handoff](https://github.com/ForgeaXGame/forgeax-engine-harness/blob/main/docs/vfx-particle-runtime-design.md).
|
|
792
|
+
|
|
793
|
+
Dynamic consumers use the same boundary explicitly:
|
|
794
|
+
|
|
795
|
+
```ts
|
|
796
|
+
const { Camera, MeshFilter, MeshRenderer } = await import('@forgeax/engine-render');
|
|
797
|
+
```
|
|
798
|
+
|
|
799
|
+
`@forgeax/engine-runtime` remains the host assembly entry for `createRenderer` and backend policy. Import `Materials` from this package. Runtime is not a compatibility barrel for render components.
|
|
800
|
+
|
|
801
|
+
Optional text, tilemap, and sprite authoring is intentionally isolated from the
|
|
802
|
+
base vocabulary:
|
|
803
|
+
|
|
804
|
+
```ts
|
|
805
|
+
import {
|
|
806
|
+
GlyphText,
|
|
807
|
+
SpriteAnimation,
|
|
808
|
+
Tilemap,
|
|
809
|
+
setTransparentSortConfig,
|
|
810
|
+
TRANSPARENT_SORT_MODE_LAYER_Y,
|
|
811
|
+
} from '@forgeax/engine-render/authoring';
|
|
812
|
+
```
|
|
813
|
+
|
|
814
|
+
`authoring` also owns the public transparent-bucket configuration helpers and
|
|
815
|
+
their four named modes. A consumer that composes sprites with an existing 3D
|
|
816
|
+
game may set the world-level mode here; it should not reach into `/internal`.
|
|
817
|
+
|
|
818
|
+
The root barrel does not expose frame stores or extract/prepare/record owners.
|
|
819
|
+
Custom pipelines use `RenderPipeline.build`, typed targets, and typed graph
|
|
820
|
+
primitives; the renderer owns graph compilation and submission.
|
|
821
|
+
|
|
822
|
+
`@forgeax/engine-render/internal` is an engine-owned assembly seam, not an
|
|
823
|
+
application API or a compatibility route. Imports from `/internal` under the
|
|
824
|
+
private `apps/` tree are engine dogfood for assembly coverage, not application
|
|
825
|
+
recipes. First-party packages may use it while the engine is assembled;
|
|
826
|
+
application code should not copy those imports. Its
|
|
827
|
+
surface can change without a consumer migration promise. If a custom renderer
|
|
828
|
+
needs a capability absent from the supported root operations, treat that as a
|
|
829
|
+
request for an explicit public design rather than importing `/internal`.
|
|
830
|
+
|
|
831
|
+
For a custom `RenderPipeline` with `Camera.antialias = ANTIALIAS_MSAA`, create
|
|
832
|
+
count-4 scene colour/depth targets plus a single-sample resolve target, then pass
|
|
833
|
+
the typed resolve target to `addTypedScenePass`. Downstream passes read that
|
|
834
|
+
resolved handle; single-sample pipelines omit it.
|
|
835
|
+
|
|
836
|
+
## Temporal antialiasing contract
|
|
837
|
+
|
|
838
|
+
`Camera.antialias = ANTIALIAS_TAA` selects the renderer-owned temporal path. The fixed v1 order is linear scene color -> temporal raster -> one TAA resolve -> bloom -> tone/output/debug/UI. `Camera.historyVersion` is the explicit reset authority; increment it after a camera cut or other discontinuity.
|
|
839
|
+
|
|
840
|
+
> [!IMPORTANT]
|
|
841
|
+
> Read `renderer.renderScene.temporal` after `draw()`. It is the bounded inspection SSOT for history bytes, reset reason, coverage, failure, and recovery. Applications must not retain graph textures or create a parallel history registry.
|
|
842
|
+
|
|
843
|
+
The none, FXAA, and MSAA lanes allocate zero TAA history and record neither `scene-temporal-clear` nor `taa-resolve`. The permanent real-backend oracle is [`apps/hello/taa`](../../apps/hello/taa/README.md).
|
|
844
|
+
|
|
845
|
+
The main scene raster is the only jittered domain. Temporal replay uses unjittered current and previous view projection matrices plus its own cleared depth attachment; reusing main depth would compare unjittered fragments against jittered visibility. The packed `rgba16float` payload is `(currentUv - previousUv, log2(1 + viewDepth), reactive)`. Clip payloads use linear interpolation so previous projection remains a geometric authority rather than a perspective-correct material varying.
|
|
846
|
+
|
|
847
|
+
Resolve and both history textures live in the unjittered output domain. Current scene color is therefore sampled at `uv + currentJitterUv`, while history is sampled at `uv - velocity`. This is the same coordinate transform as the jittered-domain form `uvJittered - velocity + (previousJitter - currentJitter)`: storing the previous resolve unjittered removes the previous-jitter term instead of dropping jitter correction. The v1 preset keeps hard UV/depth rejection, 3 x 3 current-neighborhood clipping, alpha preservation, and a fixed luminance-adaptive feedback range of 0.88 through 0.97 further reduced by reactive, velocity, depth, and startup factors.
|
|
848
|
+
|
|
849
|
+
### AI-user recipe: TAA, reset, and recovery
|
|
850
|
+
|
|
851
|
+
Enable TAA on the existing `Camera` and treat `historyVersion` as an explicit discontinuity counter. Do not increment it for ordinary camera motion.
|
|
852
|
+
|
|
853
|
+
```ts
|
|
854
|
+
import { ANTIALIAS_TAA, Camera } from '@forgeax/engine-render';
|
|
855
|
+
|
|
856
|
+
const camera = world.spawn({
|
|
857
|
+
component: Camera,
|
|
858
|
+
data: {
|
|
859
|
+
fov: Math.PI / 4,
|
|
860
|
+
aspect: 16 / 9,
|
|
861
|
+
near: 0.1,
|
|
862
|
+
far: 100,
|
|
863
|
+
antialias: ANTIALIAS_TAA,
|
|
864
|
+
historyVersion: 0,
|
|
865
|
+
},
|
|
866
|
+
}).unwrap();
|
|
867
|
+
|
|
868
|
+
let historyVersion = 0;
|
|
869
|
+
function resetHistoryAfterCameraCut(): void {
|
|
870
|
+
historyVersion += 1;
|
|
871
|
+
world.set(camera, Camera, { historyVersion }).unwrap();
|
|
872
|
+
}
|
|
873
|
+
```
|
|
874
|
+
|
|
875
|
+
Register `onError` before the first draw, handle the returned `Result`, then read the bounded inspection after the draw. The inspection is the recovery authority; the error listener preserves the exact structured failure that caused it.
|
|
876
|
+
|
|
877
|
+
```ts
|
|
878
|
+
const stopErrors = renderer.onError((error) => reportRenderError(error));
|
|
879
|
+
const drawn = renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
|
|
880
|
+
if (!drawn.ok) reportRenderError(drawn.error);
|
|
881
|
+
|
|
882
|
+
const temporal = renderer.renderScene.temporal;
|
|
883
|
+
if (temporal.recovery !== 'none') {
|
|
884
|
+
reportTemporalRecovery(temporal.recovery, temporal.failure, temporal.coverage);
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
stopErrors();
|
|
888
|
+
```
|
|
889
|
+
|
|
890
|
+
| `temporal.recovery` | Owner action |
|
|
891
|
+
|:--|:--|
|
|
892
|
+
| `none` | Continue; a stable submitted frame owns valid history. |
|
|
893
|
+
| `seed-history` | Submit the next continuous frame; increment `historyVersion` only for a real discontinuity. |
|
|
894
|
+
| `enable-temporal-capabilities` | Recreate the renderer on a device with `rgba16float` rendering and at least two color attachments. |
|
|
895
|
+
| `fix-temporal-pipeline-topology` | Repair the custom pipeline's target domain, attachment, or resolve count. |
|
|
896
|
+
| `complete-temporal-coverage` | Find `coverage.missingContributorIds`; make each producer exact or reactive. |
|
|
897
|
+
| `retry-frame` | Retry after the submit failure; aborted frames never advance history. |
|
|
898
|
+
| `rebuild-renderer` | Call `await renderer.recover()` after device loss and handle its `Result`. |
|
|
899
|
+
|
|
900
|
+
### Custom pipeline temporal seam
|
|
901
|
+
|
|
902
|
+
A custom pipeline uses the same graph owner and follows one narrow order: scene color -> unjittered temporal raster -> feature contributions -> exactly one `context.resolveTemporal(...)` -> bloom/tone/output. For a TAA topology, allocate `scene-color` and `scene-temporal` as single-sample `rgba16float`; allocate a separate single-sample temporal depth target; clear temporal color to `(0, 0, -1, 1)` before replay; and call the public resolve seam exactly once. A non-TAA topology allocates and records none of those temporal resources or passes; calling the seam without `sceneTemporal` is optional and returns `undefined`.
|
|
903
|
+
|
|
904
|
+
```ts
|
|
905
|
+
const features = context.contributeFeatures([
|
|
906
|
+
sceneColorTarget,
|
|
907
|
+
sceneDepthTarget,
|
|
908
|
+
sceneTemporalTarget,
|
|
909
|
+
]);
|
|
910
|
+
if (!features.ok) return features;
|
|
911
|
+
|
|
912
|
+
const resolved = context.resolveTemporal({
|
|
913
|
+
sceneColor: sceneColorTarget,
|
|
914
|
+
sceneDepth: sceneDepthTarget,
|
|
915
|
+
sceneTemporal: sceneTemporalTarget,
|
|
916
|
+
});
|
|
917
|
+
if (!resolved.ok) return resolved;
|
|
918
|
+
|
|
919
|
+
const postInput = resolved.value?.resolvedColor ?? sceneColorTarget;
|
|
920
|
+
```
|
|
921
|
+
|
|
922
|
+
The snippet assumes the pipeline has already recorded its scene and temporal raster passes. `exact` feature coverage must write the provided `scene-temporal` target from current/previous producer state. `reactive` is conservative but complete coverage: declaring `temporalCoverage: 'reactive'` permits current-frame fallback, while writing `w = 1` to the target gives pixel-local rejection. A visible graphics producer that declares neither is `missing`; the renderer rejects that frame's history instead of guessing.
|
|
923
|
+
|
|
924
|
+
```mermaid
|
|
925
|
+
flowchart LR
|
|
926
|
+
World["World data"] --> Extract["extract"]
|
|
927
|
+
Extract --> Prepare["prepare"]
|
|
928
|
+
Prepare --> Record["record"]
|
|
929
|
+
Record --> Rhi["RHI submission"]
|
|
930
|
+
```
|
|
931
|
+
|
|
932
|
+
## Visibility contract
|
|
933
|
+
|
|
934
|
+
Quick start:
|
|
935
|
+
|
|
936
|
+
```ts
|
|
937
|
+
import { Visibility, VisibilityStateValue, resolveVisibility } from '@forgeax/engine-render';
|
|
938
|
+
|
|
939
|
+
world.spawn({
|
|
940
|
+
component: Visibility,
|
|
941
|
+
data: { state: VisibilityStateValue.hidden },
|
|
942
|
+
}).unwrap();
|
|
943
|
+
const snapshot = resolveVisibility(world);
|
|
944
|
+
```
|
|
945
|
+
|
|
946
|
+
| Stage | Truth | Diagnostic |
|
|
947
|
+
|:--|:--|:--|
|
|
948
|
+
| Author intent | `Visibility.state` is `inherited`, `hidden`, or `visible` | Read the ECS field or reflected `labels` |
|
|
949
|
+
| Effective state | `resolveVisibility(world).effective(entity)` applies valid scene parents | Inspect `snapshot.diagnostics` and `VisibilityResolution.source` |
|
|
950
|
+
| Render result | Render producers skip hidden candidates before material work | Read `renderer.visibilityStats`; it is not a frustum or picking metric |
|
|
951
|
+
|
|
952
|
+
If the state write returns an error, preserve `code`, `expected`, `hint`, and
|
|
953
|
+
`detail`, correct the enum value, and retry through `world.set`. If hierarchy
|
|
954
|
+
diagnostics are present, repair the scene relation and resolve again. Do not
|
|
955
|
+
hide the issue with a custom mesh, camera workaround, or material substitute.
|
|
956
|
+
|
|
957
|
+
Out of scope: camera frustum policy, picking, app lifecycle, asset import, and
|
|
958
|
+
VFX shadow behavior. `@forgeax/engine-vfx-render` remains the producer-owned
|
|
959
|
+
particle bridge and consumes the same effective visibility boundary.
|
|
960
|
+
|
|
961
|
+
## Analytic atmosphere: one source, one submitted generation
|
|
962
|
+
|
|
963
|
+
The analytic environment route has one authoring source and one renderer-owned
|
|
964
|
+
submission transaction. `Atmosphere` contains exactly five medium fields; the
|
|
965
|
+
resource-owner selector enforces one Atmosphere source per World (the ECS schema
|
|
966
|
+
does not carry cardinality policy);
|
|
967
|
+
Sun direction, colour and illuminance belong to the co-located
|
|
968
|
+
`DirectionalLight` entity. The app never selects an atmosphere Skybox mode and
|
|
969
|
+
never owns an evaluator, cache, lifecycle ledger, encoder or queue submit.
|
|
970
|
+
|
|
971
|
+
```ts
|
|
972
|
+
const sunEntity = world.spawn(
|
|
973
|
+
{ component: Atmosphere, data: {
|
|
974
|
+
turbidity: 2.4,
|
|
975
|
+
rayleigh: 1.1,
|
|
976
|
+
mieCoefficient: 0.006,
|
|
977
|
+
mieDirectionalG: 0.78,
|
|
978
|
+
sunAngularRadius: 0.004675,
|
|
979
|
+
} },
|
|
980
|
+
{ component: DirectionalLight, data: {
|
|
981
|
+
direction: [0.35, -0.88, -0.2],
|
|
982
|
+
color: [1, 0.93, 0.82],
|
|
983
|
+
intensity: 2.2,
|
|
984
|
+
} },
|
|
985
|
+
).unwrap();
|
|
986
|
+
|
|
987
|
+
world.update(1 / 60).unwrap();
|
|
988
|
+
const frame = renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
|
|
989
|
+
if (!frame.ok) reportRenderError(frame.error);
|
|
990
|
+
const submitted = renderer.renderScene.environment;
|
|
991
|
+
```
|
|
992
|
+
|
|
993
|
+
The final line is a bounded projection of the existing Renderer generation
|
|
994
|
+
transaction. It reports state, source World/entity, desired/active signature,
|
|
995
|
+
device generation, bytes, rebuild facts, failure/LKG and temporal publish/reset
|
|
996
|
+
facts. It does not expose GPU handles or mutable caches.
|
|
997
|
+
|
|
998
|
+
| Failure observation | Exhaustive recovery action |
|
|
999
|
+
|:--|:--|
|
|
1000
|
+
| `environment-source-conflict` | Keep exactly one image or Atmosphere source and retry extract. |
|
|
1001
|
+
| `atmosphere-sun-missing` | Add the co-located `DirectionalLight`; do not invent a second Sun store. |
|
|
1002
|
+
| `atmosphere-capability-insufficient` | Admit only the M0 capability matrix result or fail closed. |
|
|
1003
|
+
| `atmosphere-producer-failed` | Read the stage, preserve LKG, repair the producer and retry the same Renderer owner. |
|
|
1004
|
+
| `render-feature-*` / `webgpu-runtime-error` | Read the discriminated `code`/`detail`, abort the frame transaction and follow its explicit recovery. |
|
|
1005
|
+
|
|
1006
|
+
> [!WARNING]
|
|
1007
|
+
> `Fog`, day/night automation, clouds, aerial perspective, astronomy, auto
|
|
1008
|
+
> exposure and a high-frequency time-of-day system are not implemented by this
|
|
1009
|
+
> route. A compatibility alias, conceptual wrapper, second evaluator/cache or
|
|
1010
|
+
> second submit/lifecycle owner would fail the one-cut audit.
|
|
1011
|
+
|
|
1012
|
+
<details>
|
|
1013
|
+
<summary>U-12 comparative-only boundary</summary>
|
|
1014
|
+
|
|
1015
|
+
Three r184 and PMREM references may appear in comparative calibration evidence,
|
|
1016
|
+
but they are not an implementation dependency, runtime import, evaluator, or
|
|
1017
|
+
public API owner. Comparative observations cannot turn an unavailable
|
|
1018
|
+
Browser/Dawn readback into a ForgeaX pixel verdict.
|
|
1019
|
+
</details>
|