@forgeax/engine-render 0.0.0-dev.8d955ade1c79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +647 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/__tests__/authoring-path.unit.test.d.ts +2 -0
- package/dist/__tests__/authoring-path.unit.test.d.ts.map +1 -0
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +2 -0
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +1 -0
- package/dist/__tests__/callback-inference.test-d.d.ts +2 -0
- package/dist/__tests__/callback-inference.test-d.d.ts.map +1 -0
- package/dist/__tests__/cluster-binner.test.d.ts +2 -0
- package/dist/__tests__/cluster-binner.test.d.ts.map +1 -0
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +2 -0
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +1 -0
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +2 -0
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +1 -0
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +2 -0
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +1 -0
- package/dist/__tests__/factory-contract.integration.test.d.ts +2 -0
- package/dist/__tests__/factory-contract.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/frame-observation.contract.test.d.ts +2 -0
- package/dist/__tests__/frame-observation.contract.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +2 -0
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +6 -0
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +18 -0
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view-reference.d.ts +15 -0
- package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +7 -0
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +2 -0
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +1 -0
- package/dist/__tests__/injection-kind-owner.test-d.d.ts +2 -0
- package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +2 -0
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts +2 -0
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts +2 -0
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts +2 -0
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +2 -0
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +1 -0
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +2 -0
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-stride-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +2 -0
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +2 -0
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +1 -0
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +2 -0
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +1 -0
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +2 -0
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +2 -0
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-default-off.test.d.ts +2 -0
- package/dist/__tests__/profiler-default-off.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-phase-catalog.test.d.ts +2 -0
- package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-phase-integration.test.d.ts +2 -0
- package/dist/__tests__/profiler-phase-integration.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-phase-token.test.d.ts +2 -0
- package/dist/__tests__/profiler-phase-token.test.d.ts.map +1 -0
- package/dist/__tests__/public-surface.test-d.d.ts +2 -0
- package/dist/__tests__/public-surface.test-d.d.ts.map +1 -0
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +2 -0
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-error-code-owner.test-d.d.ts +2 -0
- package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +2 -0
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts +2 -0
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-assembly.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-context.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-context.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-contract.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-contract.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-docs.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-errors.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +2 -0
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-retry.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +7 -0
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +1 -0
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +2 -0
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-hzb-gpu.d.ts +7 -0
- package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +1 -0
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts +2 -0
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts +2 -0
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +12 -0
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +1 -0
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +2 -0
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/render-scene-projection.unit.test.d.ts +2 -0
- package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +2 -0
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +2 -0
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +1 -0
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +2 -0
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +1 -0
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +2 -0
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +1 -0
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
- package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
- package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
- package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/surface-configuration.unit.test.d.ts +2 -0
- package/dist/__tests__/surface-configuration.unit.test.d.ts.map +1 -0
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +2 -0
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +1 -0
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +2 -0
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +1 -0
- package/dist/__tests__/urp-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +2 -0
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-extract.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-extract.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-extract.perf.test.d.ts +2 -0
- package/dist/__tests__/visibility-extract.perf.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-instances.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-instances.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-public-surface.test-d.d.ts +2 -0
- package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +1 -0
- package/dist/__tests__/visibility-resolver.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/vocabulary.unit.test.d.ts +2 -0
- package/dist/__tests__/vocabulary.unit.test.d.ts.map +1 -0
- package/dist/assembly/backend-contract.d.ts +37 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +207 -0
- package/dist/assembly/factory.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +84 -0
- package/dist/assembly/host-contract.d.ts.map +1 -0
- package/dist/assembly/material/assembly.d.ts +21 -0
- package/dist/assembly/material/assembly.d.ts.map +1 -0
- package/dist/assembly/material/pipeline-projection.d.ts +30 -0
- package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
- package/dist/assets/asset-decoders.d.ts +5 -0
- package/dist/assets/asset-decoders.d.ts.map +1 -0
- package/dist/assets/render-asset-port.d.ts +17 -0
- package/dist/assets/render-asset-port.d.ts.map +1 -0
- package/dist/assets/resolve-render-asset.d.ts +6 -0
- package/dist/assets/resolve-render-asset.d.ts.map +1 -0
- package/dist/authoring.d.ts +12 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.mjs +27 -0
- package/dist/authoring.mjs.map +1 -0
- package/dist/chunk-CQXZC5XI.mjs +182 -0
- package/dist/chunk-CQXZC5XI.mjs.map +1 -0
- package/dist/chunk-HCOGPHKS.mjs +93 -0
- package/dist/chunk-HCOGPHKS.mjs.map +1 -0
- package/dist/chunk-YEJIUW7D.mjs +1152 -0
- package/dist/chunk-YEJIUW7D.mjs.map +1 -0
- package/dist/cluster-binner.d.ts +152 -0
- package/dist/cluster-binner.d.ts.map +1 -0
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +2 -0
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +2 -0
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
- package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/schema-parity.unit.test.d.ts +2 -0
- package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts +2 -0
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +1 -0
- package/dist/components/camera.d.ts +311 -0
- package/dist/components/camera.d.ts.map +1 -0
- package/dist/components/directional-light.d.ts +76 -0
- package/dist/components/directional-light.d.ts.map +1 -0
- package/dist/components/glyph-text.d.ts +26 -0
- package/dist/components/glyph-text.d.ts.map +1 -0
- package/dist/components/index.d.ts +24 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/instances.d.ts +41 -0
- package/dist/components/instances.d.ts.map +1 -0
- package/dist/components/layer.d.ts +34 -0
- package/dist/components/layer.d.ts.map +1 -0
- package/dist/components/light-helpers.d.ts +53 -0
- package/dist/components/light-helpers.d.ts.map +1 -0
- package/dist/components/lines.d.ts +5 -0
- package/dist/components/lines.d.ts.map +1 -0
- package/dist/components/mesh-filter.d.ts +24 -0
- package/dist/components/mesh-filter.d.ts.map +1 -0
- package/dist/components/mesh-renderer.d.ts +33 -0
- package/dist/components/mesh-renderer.d.ts.map +1 -0
- package/dist/components/point-light-shadow.d.ts +27 -0
- package/dist/components/point-light-shadow.d.ts.map +1 -0
- package/dist/components/point-light.d.ts +35 -0
- package/dist/components/point-light.d.ts.map +1 -0
- package/dist/components/points.d.ts +15 -0
- package/dist/components/points.d.ts.map +1 -0
- package/dist/components/post-process-params.d.ts +5 -0
- package/dist/components/post-process-params.d.ts.map +1 -0
- package/dist/components/scene-instance.d.ts +140 -0
- package/dist/components/scene-instance.d.ts.map +1 -0
- package/dist/components/skybox-background.d.ts +56 -0
- package/dist/components/skybox-background.d.ts.map +1 -0
- package/dist/components/skylight.d.ts +55 -0
- package/dist/components/skylight.d.ts.map +1 -0
- package/dist/components/sort-key.d.ts +44 -0
- package/dist/components/sort-key.d.ts.map +1 -0
- package/dist/components/spot-light.d.ts +81 -0
- package/dist/components/spot-light.d.ts.map +1 -0
- package/dist/components/sprite-animation.d.ts +74 -0
- package/dist/components/sprite-animation.d.ts.map +1 -0
- package/dist/components/sprite-instances.d.ts +51 -0
- package/dist/components/sprite-instances.d.ts.map +1 -0
- package/dist/components/sprite-playback-mode.d.ts +42 -0
- package/dist/components/sprite-playback-mode.d.ts.map +1 -0
- package/dist/components/sprite-region-override.d.ts +46 -0
- package/dist/components/sprite-region-override.d.ts.map +1 -0
- package/dist/components/tile-layer.d.ts +106 -0
- package/dist/components/tile-layer.d.ts.map +1 -0
- package/dist/components/tilemap.d.ts +25 -0
- package/dist/components/tilemap.d.ts.map +1 -0
- package/dist/components/visibility.d.ts +22 -0
- package/dist/components/visibility.d.ts.map +1 -0
- package/dist/construct-renderer.d.ts +19 -0
- package/dist/construct-renderer.d.ts.map +1 -0
- package/dist/construct-renderer.mjs +27462 -0
- package/dist/construct-renderer.mjs.map +1 -0
- package/dist/debug-draw-glue.d.ts +5 -0
- package/dist/debug-draw-glue.d.ts.map +1 -0
- package/dist/device/device-scope.d.ts +83 -0
- package/dist/device/device-scope.d.ts.map +1 -0
- package/dist/device/gpu-residency.d.ts +337 -0
- package/dist/device/gpu-residency.d.ts.map +1 -0
- package/dist/device/resource-types.d.ts +8 -0
- package/dist/device/resource-types.d.ts.map +1 -0
- package/dist/engine-metrics.d.ts +23 -0
- package/dist/engine-metrics.d.ts.map +1 -0
- package/dist/errors/ecs-validation.d.ts +3 -0
- package/dist/errors/ecs-validation.d.ts.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/recover.d.ts +105 -0
- package/dist/errors/recover.d.ts.map +1 -0
- package/dist/errors/render.d.ts +705 -0
- package/dist/errors/render.d.ts.map +1 -0
- package/dist/extract/visibility.d.ts +26 -0
- package/dist/extract/visibility.d.ts.map +1 -0
- package/dist/features/fullscreen.d.ts +19 -0
- package/dist/features/fullscreen.d.ts.map +1 -0
- package/dist/features/host.d.ts +106 -0
- package/dist/features/host.d.ts.map +1 -0
- package/dist/features/morph/morph-feature.d.ts +79 -0
- package/dist/features/morph/morph-feature.d.ts.map +1 -0
- package/dist/features/plan.d.ts +182 -0
- package/dist/features/plan.d.ts.map +1 -0
- package/dist/features/prepared-gpu-work.d.ts +117 -0
- package/dist/features/prepared-gpu-work.d.ts.map +1 -0
- package/dist/features/prepared-graphics-store.d.ts +66 -0
- package/dist/features/prepared-graphics-store.d.ts.map +1 -0
- package/dist/features/prepared-graphics.d.ts +215 -0
- package/dist/features/prepared-graphics.d.ts.map +1 -0
- package/dist/features/render-graph-compute.d.ts +13 -0
- package/dist/features/render-graph-compute.d.ts.map +1 -0
- package/dist/features/render-graph-contribution.d.ts +12 -0
- package/dist/features/render-graph-contribution.d.ts.map +1 -0
- package/dist/features/render-graph-raster.d.ts +38 -0
- package/dist/features/render-graph-raster.d.ts.map +1 -0
- package/dist/features/render-graph-resources.d.ts +11 -0
- package/dist/features/render-graph-resources.d.ts.map +1 -0
- package/dist/features/targets.d.ts +32 -0
- package/dist/features/targets.d.ts.map +1 -0
- package/dist/features/types.d.ts +68 -0
- package/dist/features/types.d.ts.map +1 -0
- package/dist/features/vocabulary.d.ts +14 -0
- package/dist/features/vocabulary.d.ts.map +1 -0
- package/dist/fullscreen-post-process-pass.d.ts +157 -0
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -0
- package/dist/glyph-text-layout-system.d.ts +19 -0
- package/dist/glyph-text-layout-system.d.ts.map +1 -0
- package/dist/gpu-driven/batch-topology.d.ts +55 -0
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -0
- package/dist/gpu-driven/production-raster.d.ts +51 -0
- package/dist/gpu-driven/production-raster.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +85 -0
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -0
- package/dist/gpu-resource.d.ts +73 -0
- package/dist/gpu-resource.d.ts.map +1 -0
- package/dist/gpu-scene-schema.d.ts +78 -0
- package/dist/gpu-scene-schema.d.ts.map +1 -0
- package/dist/gpu-scene.d.ts +55 -0
- package/dist/gpu-scene.d.ts.map +1 -0
- package/dist/gpu-stage.d.ts +4 -0
- package/dist/gpu-stage.d.ts.map +1 -0
- package/dist/gpu-texture-usage.d.ts +6 -0
- package/dist/gpu-texture-usage.d.ts.map +1 -0
- package/dist/gpu-usage.d.ts +9 -0
- package/dist/gpu-usage.d.ts.map +1 -0
- package/dist/hdrp-buffers.d.ts +163 -0
- package/dist/hdrp-buffers.d.ts.map +1 -0
- package/dist/ibl/IblPipelineCache.d.ts +168 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -0
- package/dist/ibl/skylight-bind-group.d.ts +130 -0
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +169 -0
- package/dist/index.mjs.map +1 -0
- package/dist/inspection-types.d.ts +72 -0
- package/dist/inspection-types.d.ts.map +1 -0
- package/dist/instance-buffer-cache.d.ts +56 -0
- package/dist/instance-buffer-cache.d.ts.map +1 -0
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.mjs +3 -0
- package/dist/internal.mjs.map +1 -0
- package/dist/lifecycle.d.ts +62 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/light-buffer-layout.d.ts +164 -0
- package/dist/light-buffer-layout.d.ts.map +1 -0
- package/dist/materials.d.ts +47 -0
- package/dist/materials.d.ts.map +1 -0
- package/dist/mesh-material-bindings.d.ts +43 -0
- package/dist/mesh-material-bindings.d.ts.map +1 -0
- package/dist/pbr-pipeline.d.ts +301 -0
- package/dist/pbr-pipeline.d.ts.map +1 -0
- package/dist/pipeline/standard-forward-lane.d.ts +5 -0
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts +31 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
- package/dist/pipeline/standard-profile.d.ts +40 -0
- package/dist/pipeline/standard-profile.d.ts.map +1 -0
- package/dist/pipeline-builder.d.ts +122 -0
- package/dist/pipeline-builder.d.ts.map +1 -0
- package/dist/pipeline-spec-types.d.ts +24 -0
- package/dist/pipeline-spec-types.d.ts.map +1 -0
- package/dist/pipeline-spec.d.ts +367 -0
- package/dist/pipeline-spec.d.ts.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/points-lines.bench.d.ts +2 -0
- package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +1 -0
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +1 -0
- package/dist/points-lines/admission.d.ts +36 -0
- package/dist/points-lines/admission.d.ts.map +1 -0
- package/dist/points-lines/bounds.d.ts +8 -0
- package/dist/points-lines/bounds.d.ts.map +1 -0
- package/dist/points-lines/expansion-cache.d.ts +28 -0
- package/dist/points-lines/expansion-cache.d.ts.map +1 -0
- package/dist/points-lines/inspection.d.ts +53 -0
- package/dist/points-lines/inspection.d.ts.map +1 -0
- package/dist/points-lines/prepare.d.ts +67 -0
- package/dist/points-lines/prepare.d.ts.map +1 -0
- package/dist/points-lines/record.d.ts +60 -0
- package/dist/points-lines/record.d.ts.map +1 -0
- package/dist/points-lines/snapshot.d.ts +49 -0
- package/dist/points-lines/snapshot.d.ts.map +1 -0
- package/dist/post-process-errors.d.ts +182 -0
- package/dist/post-process-errors.d.ts.map +1 -0
- package/dist/prepare/prepared-graphics-resolver.d.ts +59 -0
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -0
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +2 -0
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +1 -0
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +2 -0
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +1 -0
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts +2 -0
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +121 -0
- package/dist/record/frame-lighting.d.ts.map +1 -0
- package/dist/record/frame-snapshot.d.ts +429 -0
- package/dist/record/frame-snapshot.d.ts.map +1 -0
- package/dist/record/frame-targets.d.ts +20 -0
- package/dist/record/frame-targets.d.ts.map +1 -0
- package/dist/record/frame.d.ts +71 -0
- package/dist/record/frame.d.ts.map +1 -0
- package/dist/record/helpers.d.ts +102 -0
- package/dist/record/helpers.d.ts.map +1 -0
- package/dist/record/main-pass-geometry.d.ts +28 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -0
- package/dist/record/main-pass-material.d.ts +204 -0
- package/dist/record/main-pass-material.d.ts.map +1 -0
- package/dist/record/main-pass-sprite-draws.d.ts +43 -0
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -0
- package/dist/record/main-pass.d.ts +20 -0
- package/dist/record/main-pass.d.ts.map +1 -0
- package/dist/record/mesh-ssbo.d.ts +446 -0
- package/dist/record/mesh-ssbo.d.ts.map +1 -0
- package/dist/record/render-context.d.ts +252 -0
- package/dist/record/render-context.d.ts.map +1 -0
- package/dist/record/shadow-pass.d.ts +52 -0
- package/dist/record/shadow-pass.d.ts.map +1 -0
- package/dist/record/skybox-post-pass.d.ts +33 -0
- package/dist/record/skybox-post-pass.d.ts.map +1 -0
- package/dist/record/typed-frame-graph.d.ts +35 -0
- package/dist/record/typed-frame-graph.d.ts.map +1 -0
- package/dist/record/view-ubo.d.ts +45 -0
- package/dist/record/view-ubo.d.ts.map +1 -0
- package/dist/render-contract.d.ts +424 -0
- package/dist/render-contract.d.ts.map +1 -0
- package/dist/render-data.d.ts +143 -0
- package/dist/render-data.d.ts.map +1 -0
- package/dist/render-graph-primitives.d.ts +76 -0
- package/dist/render-graph-primitives.d.ts.map +1 -0
- package/dist/render-pipeline.d.ts +110 -0
- package/dist/render-pipeline.d.ts.map +1 -0
- package/dist/render-system-extract.d.ts +868 -0
- package/dist/render-system-extract.d.ts.map +1 -0
- package/dist/render-system.d.ts +125 -0
- package/dist/render-system.d.ts.map +1 -0
- package/dist/scene/render-scene-types.d.ts +61 -0
- package/dist/scene/render-scene-types.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +112 -0
- package/dist/scene/render-scene.d.ts.map +1 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts +30 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -0
- package/dist/shadow-atlas.d.ts +117 -0
- package/dist/shadow-atlas.d.ts.map +1 -0
- package/dist/ssao-buffers.d.ts +50 -0
- package/dist/ssao-buffers.d.ts.map +1 -0
- package/dist/ssao-config.d.ts +28 -0
- package/dist/ssao-config.d.ts.map +1 -0
- package/dist/systems/active-camera.d.ts +53 -0
- package/dist/systems/active-camera.d.ts.map +1 -0
- package/dist/systems/pass-selector.d.ts +24 -0
- package/dist/systems/pass-selector.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +49 -0
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -0
- package/dist/systems/skin-palette-types.d.ts +14 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -0
- package/dist/systems/transparent-sort-config.d.ts +112 -0
- package/dist/systems/transparent-sort-config.d.ts.map +1 -0
- package/dist/tilemap-chunk-extract-system.d.ts +143 -0
- package/dist/tilemap-chunk-extract-system.d.ts.map +1 -0
- package/dist/typed-render-graph-primitives.d.ts +57 -0
- package/dist/typed-render-graph-primitives.d.ts.map +1 -0
- package/dist/typed-shadow-passes.d.ts +11 -0
- package/dist/typed-shadow-passes.d.ts.map +1 -0
- package/package.json +94 -0
- package/src/__tests__/authoring-path.unit.test.ts +23 -0
- package/src/__tests__/backend-selection-rhi-capture.test-d.ts +21 -0
- package/src/__tests__/callback-inference.test-d.ts +8 -0
- package/src/__tests__/cluster-binner.test.ts +272 -0
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +20 -0
- package/src/__tests__/construct-renderer-identity.unit.test.ts +23 -0
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
- package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
- package/src/__tests__/direct-extract-consumer-contract.test-d.ts +23 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +61 -0
- package/src/__tests__/factory-contract.integration.test.ts +280 -0
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +15 -0
- package/src/__tests__/frame-observation.contract.test.ts +112 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
- package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +167 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +350 -0
- package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +12 -0
- package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +16 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +436 -0
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +87 -0
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +271 -0
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +290 -0
- package/src/__tests__/gpu-driven-view-reference.ts +111 -0
- package/src/__tests__/gpu-driven-view.browser.test.ts +30 -0
- package/src/__tests__/gpu-driven-view.dawn.test.ts +28 -0
- package/src/__tests__/gpu-driven-view.unit.test.ts +199 -0
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +59 -0
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +308 -0
- package/src/__tests__/gpu-scene-render-graph.browser.test.ts +19 -0
- package/src/__tests__/gpu-scene-render-graph.dawn.test.ts +19 -0
- package/src/__tests__/gpu-scene-schema.unit.test.ts +16 -0
- package/src/__tests__/gpu-scene.dawn.test.ts +205 -0
- package/src/__tests__/gpu-scene.unit.test.ts +147 -0
- package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
- package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +92 -0
- package/src/__tests__/injection-kind-owner.test-d.ts +14 -0
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +728 -0
- package/src/__tests__/light-buffer-layout.unit.test.ts +40 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +24 -0
- package/src/__tests__/material-cooked-projection.unit.test.ts +150 -0
- package/src/__tests__/material-snapshot-mutation.integration.test.ts +53 -0
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +94 -0
- package/src/__tests__/material-stride-surface.unit.test.ts +32 -0
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +106 -0
- package/src/__tests__/mesh-material-bindings.unit.test.ts +89 -0
- package/src/__tests__/mesh-stride-surface.unit.test.ts +16 -0
- package/src/__tests__/morph-culling-reentry.dawn.test.ts +157 -0
- package/src/__tests__/morph-feature-gpu-work.integration.test.ts +80 -0
- package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
- package/src/__tests__/morph-visual-evidence.integration.test.ts +80 -0
- package/src/__tests__/nineslice-handle-surface.unit.test.ts +19 -0
- package/src/__tests__/post-process-error-policy-owner.unit.test.ts +201 -0
- package/src/__tests__/prepared-buffer-kind-owner.test-d.ts +29 -0
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +65 -0
- package/src/__tests__/prepared-graphics-generation.unit.test.ts +161 -0
- package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +138 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +29 -0
- package/src/__tests__/prepared-graphics-resolver.unit.test.ts +285 -0
- package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +105 -0
- package/src/__tests__/prepared-graphics-store.unit.test.ts +154 -0
- package/src/__tests__/prepared-graphics-validation.unit.test.ts +176 -0
- package/src/__tests__/profiler-default-off.test.ts +22 -0
- package/src/__tests__/profiler-phase-catalog.test.ts +66 -0
- package/src/__tests__/profiler-phase-integration.test.ts +62 -0
- package/src/__tests__/profiler-phase-token.test.ts +79 -0
- package/src/__tests__/public-surface.test-d.ts +94 -0
- package/src/__tests__/recover-error-policy-owner.unit.test.ts +107 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +116 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +139 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +110 -0
- package/src/__tests__/render-feature-assembly.test-d.ts +43 -0
- package/src/__tests__/render-feature-context.test-d.ts +57 -0
- package/src/__tests__/render-feature-contract.test-d.ts +49 -0
- package/src/__tests__/render-feature-diagnostics.unit.test.ts +149 -0
- package/src/__tests__/render-feature-docs.unit.test.ts +89 -0
- package/src/__tests__/render-feature-errors.unit.test.ts +47 -0
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +316 -0
- package/src/__tests__/render-feature-plan.test-d.ts +161 -0
- package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
- package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +90 -0
- package/src/__tests__/render-feature-prepared-errors.test-d.ts +79 -0
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +80 -0
- package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +72 -0
- package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +36 -0
- package/src/__tests__/render-feature-prepared-graphics.test-d.ts +74 -0
- package/src/__tests__/render-feature-prepared-graphics.unit.test.ts +121 -0
- package/src/__tests__/render-feature-public-surface.test-d.ts +57 -0
- package/src/__tests__/render-feature-retry.unit.test.ts +87 -0
- package/src/__tests__/render-feature-scheduling.unit.test.ts +110 -0
- package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +137 -0
- package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +146 -0
- package/src/__tests__/render-feature-visibility-context.test-d.ts +33 -0
- package/src/__tests__/render-feature-visibility-context.unit.test.ts +37 -0
- package/src/__tests__/render-feature-zero-work.unit.test.ts +76 -0
- package/src/__tests__/render-graph-compute-raster-gpu.ts +342 -0
- package/src/__tests__/render-graph-compute-raster.browser.test.ts +16 -0
- package/src/__tests__/render-graph-compute-raster.dawn.test.ts +22 -0
- package/src/__tests__/render-graph-hzb-gpu.ts +239 -0
- package/src/__tests__/render-graph-hzb.browser.test.ts +16 -0
- package/src/__tests__/render-graph-hzb.dawn.test.ts +23 -0
- package/src/__tests__/render-graph-primitives.unit.test.ts +22 -0
- package/src/__tests__/render-graph-storage-indirect-gpu.ts +162 -0
- package/src/__tests__/render-graph-storage-indirect.browser.test.ts +21 -0
- package/src/__tests__/render-graph-storage-indirect.dawn.test.ts +28 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +168 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +121 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +58 -0
- package/src/__tests__/rhi-backend-package-boundary.unit.test.ts +11 -0
- package/src/__tests__/scriptable-pack-consumer.test-d.ts +14 -0
- package/src/__tests__/shader-stage-surface.unit.test.ts +43 -0
- package/src/__tests__/ssao-config.unit.test.ts +36 -0
- package/src/__tests__/ssao-kernel-surface.unit.test.ts +14 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
- package/src/__tests__/standard-descriptors.test-d.ts +22 -0
- package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
- package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
- package/src/__tests__/surface-configuration.unit.test.ts +91 -0
- package/src/__tests__/texture-usage-surface.unit.test.ts +58 -0
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +223 -0
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +42 -0
- package/src/__tests__/urp-pipeline.unit.test.ts +14 -0
- package/src/__tests__/vertex-color-pipeline.unit.test.ts +132 -0
- package/src/__tests__/vertex-layout-consumer.unit.test.ts +25 -0
- package/src/__tests__/visibility-diagnostics.integration.test.ts +62 -0
- package/src/__tests__/visibility-extract.integration.test.ts +98 -0
- package/src/__tests__/visibility-extract.perf.test.ts +130 -0
- package/src/__tests__/visibility-feature-dedup.integration.test.ts +55 -0
- package/src/__tests__/visibility-hidden-report.unit.test.ts +36 -0
- package/src/__tests__/visibility-instances.integration.test.ts +46 -0
- package/src/__tests__/visibility-multi-world.integration.test.ts +86 -0
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +168 -0
- package/src/__tests__/visibility-producer-matrix.unit.test.ts +96 -0
- package/src/__tests__/visibility-public-surface.test-d.ts +27 -0
- package/src/__tests__/visibility-resolver.unit.test.ts +85 -0
- package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
- package/src/__tests__/visibility-snapshot-contract.unit.test.ts +60 -0
- package/src/__tests__/vocabulary.unit.test.ts +21 -0
- package/src/assembly/backend-contract.ts +57 -0
- package/src/assembly/factory.ts +8130 -0
- package/src/assembly/host-contract.ts +101 -0
- package/src/assembly/material/assembly.ts +48 -0
- package/src/assembly/material/pipeline-projection.ts +63 -0
- package/src/assets/asset-decoders.ts +158 -0
- package/src/assets/render-asset-port.ts +44 -0
- package/src/assets/resolve-render-asset.ts +13 -0
- package/src/authoring.ts +17 -0
- package/src/cluster-binner.ts +700 -0
- package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
- package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
- package/src/components/__tests__/schema-parity.unit.test.ts +25 -0
- package/src/components/__tests__/visibility-schema.unit.test.ts +35 -0
- package/src/components/camera.ts +512 -0
- package/src/components/directional-light.ts +120 -0
- package/src/components/glyph-text.ts +64 -0
- package/src/components/index.ts +54 -0
- package/src/components/instances.ts +206 -0
- package/src/components/layer.ts +69 -0
- package/src/components/light-helpers.ts +188 -0
- package/src/components/lines.ts +18 -0
- package/src/components/mesh-filter.ts +60 -0
- package/src/components/mesh-renderer.ts +61 -0
- package/src/components/point-light-shadow.ts +43 -0
- package/src/components/point-light.ts +65 -0
- package/src/components/points.ts +40 -0
- package/src/components/post-process-params.ts +35 -0
- package/src/components/scene-instance.ts +193 -0
- package/src/components/skybox-background.ts +103 -0
- package/src/components/skylight.ts +97 -0
- package/src/components/sort-key.ts +75 -0
- package/src/components/spot-light.ts +124 -0
- package/src/components/sprite-animation.ts +168 -0
- package/src/components/sprite-instances.ts +179 -0
- package/src/components/sprite-playback-mode.ts +79 -0
- package/src/components/sprite-region-override.ts +105 -0
- package/src/components/tile-layer.ts +167 -0
- package/src/components/tilemap.ts +48 -0
- package/src/components/visibility.ts +53 -0
- package/src/construct-renderer.ts +67 -0
- package/src/debug-draw-glue.ts +48 -0
- package/src/device/device-scope.ts +306 -0
- package/src/device/gpu-residency.ts +1822 -0
- package/src/device/resource-types.ts +20 -0
- package/src/engine-metrics.ts +82 -0
- package/src/errors/ecs-validation.ts +16 -0
- package/src/errors/index.ts +3 -0
- package/src/errors/recover.ts +161 -0
- package/src/errors/render.ts +1284 -0
- package/src/extract/visibility.ts +120 -0
- package/src/features/fullscreen.ts +46 -0
- package/src/features/host.ts +1363 -0
- package/src/features/morph/morph-feature.ts +377 -0
- package/src/features/plan.ts +447 -0
- package/src/features/prepared-gpu-work.ts +959 -0
- package/src/features/prepared-graphics-store.ts +449 -0
- package/src/features/prepared-graphics.ts +420 -0
- package/src/features/render-graph-compute.ts +69 -0
- package/src/features/render-graph-contribution.ts +75 -0
- package/src/features/render-graph-raster.ts +332 -0
- package/src/features/render-graph-resources.ts +38 -0
- package/src/features/targets.ts +70 -0
- package/src/features/types.ts +103 -0
- package/src/features/vocabulary.ts +24 -0
- package/src/fullscreen-post-process-pass.ts +363 -0
- package/src/glyph-text-layout-system.ts +421 -0
- package/src/gpu-driven/batch-topology.ts +245 -0
- package/src/gpu-driven/production-raster.ts +695 -0
- package/src/gpu-driven/view-gpu.ts +703 -0
- package/src/gpu-resource.ts +159 -0
- package/src/gpu-scene-schema.ts +136 -0
- package/src/gpu-scene.ts +722 -0
- package/src/gpu-stage.ts +9 -0
- package/src/gpu-texture-usage.ts +12 -0
- package/src/gpu-usage.ts +14 -0
- package/src/hdrp-buffers.ts +480 -0
- package/src/ibl/IblPipelineCache.ts +1006 -0
- package/src/ibl/skylight-bind-group.ts +513 -0
- package/src/index.ts +129 -0
- package/src/inspection-types.ts +80 -0
- package/src/instance-buffer-cache.ts +95 -0
- package/src/internal.ts +9 -0
- package/src/lifecycle.ts +168 -0
- package/src/light-buffer-layout.ts +346 -0
- package/src/materials.ts +214 -0
- package/src/mesh-material-bindings.ts +103 -0
- package/src/pbr-pipeline.ts +1137 -0
- package/src/pipeline/standard-forward-lane.ts +229 -0
- package/src/pipeline/standard-pipeline.ts +555 -0
- package/src/pipeline/standard-profile.ts +65 -0
- package/src/pipeline-builder.ts +382 -0
- package/src/pipeline-spec-types.ts +28 -0
- package/src/pipeline-spec.ts +1231 -0
- package/src/plugin.ts +69 -0
- package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
- package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
- package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
- package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
- package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
- package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
- package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
- package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
- package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
- package/src/points-lines/admission.ts +238 -0
- package/src/points-lines/bounds.ts +23 -0
- package/src/points-lines/expansion-cache.ts +215 -0
- package/src/points-lines/inspection.ts +97 -0
- package/src/points-lines/prepare.ts +177 -0
- package/src/points-lines/record.ts +125 -0
- package/src/points-lines/snapshot.ts +130 -0
- package/src/post-process-errors.ts +302 -0
- package/src/prepare/prepared-graphics-resolver.ts +456 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +41 -0
- package/src/record/__tests__/material-slot-plan.unit.test.ts +44 -0
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
- package/src/record/__tests__/video-texture-view.unit.test.ts +90 -0
- package/src/record/frame-lighting.ts +1074 -0
- package/src/record/frame-snapshot.ts +500 -0
- package/src/record/frame-targets.ts +137 -0
- package/src/record/frame.ts +1598 -0
- package/src/record/helpers.ts +284 -0
- package/src/record/main-pass-geometry.ts +1065 -0
- package/src/record/main-pass-material.ts +1043 -0
- package/src/record/main-pass-sprite-draws.ts +1137 -0
- package/src/record/main-pass.ts +610 -0
- package/src/record/mesh-ssbo.ts +885 -0
- package/src/record/render-context.ts +384 -0
- package/src/record/shadow-pass.ts +698 -0
- package/src/record/skybox-post-pass.ts +593 -0
- package/src/record/typed-frame-graph.ts +461 -0
- package/src/record/view-ubo.ts +222 -0
- package/src/render-contract.ts +582 -0
- package/src/render-data.ts +385 -0
- package/src/render-graph-primitives.ts +811 -0
- package/src/render-pipeline.ts +259 -0
- package/src/render-system-extract.ts +4585 -0
- package/src/render-system.ts +1933 -0
- package/src/scene/render-scene-types.ts +67 -0
- package/src/scene/render-scene.ts +1087 -0
- package/src/scene-instances/post-spawn-resolve-joints.ts +165 -0
- package/src/shadow-atlas.ts +244 -0
- package/src/ssao-buffers.ts +334 -0
- package/src/ssao-config.ts +61 -0
- package/src/systems/active-camera.ts +116 -0
- package/src/systems/pass-selector.ts +49 -0
- package/src/systems/skin-palette-allocator.ts +251 -0
- package/src/systems/skin-palette-types.ts +14 -0
- package/src/systems/transparent-sort-config.ts +233 -0
- package/src/tilemap-chunk-extract-system.ts +1290 -0
- package/src/typed-render-graph-primitives.ts +541 -0
- package/src/typed-shadow-passes.ts +165 -0
|
@@ -0,0 +1,1284 @@
|
|
|
1
|
+
// @forgeax/engine-render -- render cluster error classes.
|
|
2
|
+
//
|
|
3
|
+
// feat-20260704-runtime-tier1-decomposition M2 / w8 (D-3): the monolithic
|
|
4
|
+
// errors.ts RuntimeErrorCode / RuntimeError top-level aggregate unions are
|
|
5
|
+
// decomposed into five per-cluster files (render / asset / skin / recover /
|
|
6
|
+
// environment). Each cluster owns a closed *ErrorCode code union + a closed
|
|
7
|
+
// *Error class union; error class names, .code literals, and .detail shapes
|
|
8
|
+
// are preserved byte-for-byte (OOS-4: zero semantic change).
|
|
9
|
+
//
|
|
10
|
+
// The render cluster holds the shadow / HDRP cluster-forward + deferred /
|
|
11
|
+
// g-buffer / point-shadow-atlas / video-upload / vertex-storage-buffer render
|
|
12
|
+
// path errors. ShadowInvalidConfigError is consumed by the DirectionalLight /
|
|
13
|
+
// SpotLight / PointLightShadow component validators (forward cross-directory
|
|
14
|
+
// import, no cycle -- research Finding C2).
|
|
15
|
+
|
|
16
|
+
import type { DeviceResourceKind, DeviceScopeReceipt } from '../device/resource-types';
|
|
17
|
+
import type {
|
|
18
|
+
PreparedKind,
|
|
19
|
+
RenderFeatureCapabilityKey,
|
|
20
|
+
RenderFeatureRecovery,
|
|
21
|
+
RenderFeatureStage,
|
|
22
|
+
} from '../features/vocabulary';
|
|
23
|
+
|
|
24
|
+
export interface LifecycleConstructionFailureDetail {
|
|
25
|
+
readonly owner: string;
|
|
26
|
+
readonly generation: number;
|
|
27
|
+
readonly operation: 'create' | 'dispose';
|
|
28
|
+
readonly resourceKind: DeviceResourceKind;
|
|
29
|
+
readonly cause: unknown;
|
|
30
|
+
readonly cleanupFailures: readonly {
|
|
31
|
+
readonly resourceKind: DeviceResourceKind;
|
|
32
|
+
readonly cause: unknown;
|
|
33
|
+
}[];
|
|
34
|
+
readonly receipt: DeviceScopeReceipt;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export class LifecycleConstructionError extends Error {
|
|
38
|
+
readonly code = 'lifecycle-construction-failed' as const;
|
|
39
|
+
readonly expected = 'all DeviceScope resources establish and terminate in order';
|
|
40
|
+
readonly hint = 'inspect detail and cleanupFailures, then recover or rebuild the DeviceScope';
|
|
41
|
+
readonly detail: LifecycleConstructionFailureDetail;
|
|
42
|
+
|
|
43
|
+
constructor(detail: LifecycleConstructionFailureDetail) {
|
|
44
|
+
super(`lifecycle-construction-failed: ${detail.resourceKind} lifecycle transaction failed`);
|
|
45
|
+
this.name = 'LifecycleConstructionError';
|
|
46
|
+
this.detail = detail;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ── ShadowInvalidConfigError ──────────────────────────────────────────────
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Detail for `RuntimeErrorCode 'shadow-invalid-config'`.
|
|
54
|
+
*
|
|
55
|
+
* Emitted by `DirectionalLight.validate` shadow-field path when a field value violates
|
|
56
|
+
* runtime constraints (e.g. mapSize < 1, cascadeCount not in {1..4}).
|
|
57
|
+
* AI users access `.detail.field` / `.detail.value` / `.detail.min` /
|
|
58
|
+
* `.detail.max` via property access — no string parsing.
|
|
59
|
+
*
|
|
60
|
+
* `max` is `undefined` for lower-bound-only validations (e.g. mapSize < 1).
|
|
61
|
+
* feat-20260613-csm: max added for upper-bound cascade validations
|
|
62
|
+
* (cascadeCount max=4, splitLambda max=1, cascadeBlend max=0.5).
|
|
63
|
+
*/
|
|
64
|
+
export interface ShadowInvalidConfigDetail {
|
|
65
|
+
readonly field: string;
|
|
66
|
+
readonly value: number;
|
|
67
|
+
readonly min: number;
|
|
68
|
+
readonly max?: number;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Structured error for shadow component config validation failures.
|
|
73
|
+
*
|
|
74
|
+
* Emitted by `DirectionalLight.validate()` shadow-field path (mapSize / cascadeCount /
|
|
75
|
+
* splitLambda / cascadeBlend / shadowDistance) and `PointLightShadow.validate()`
|
|
76
|
+
* (mapSize / farPlane > nearPlane / pcfKernelSize); both shadow component
|
|
77
|
+
* types share this single error class so `switch (err.code)` on
|
|
78
|
+
* `RuntimeErrorCode` only needs one branch (charter P4 — closed-union SSOT).
|
|
79
|
+
* Four-field surface per AGENTS.md error model:
|
|
80
|
+
* - `.code = 'shadow-invalid-config'` (closed RuntimeErrorCode)
|
|
81
|
+
* - `.expected` — expected-state description (programmatic predicate form)
|
|
82
|
+
* - `.hint` — actionable recovery guidance (imperative; AI users paste into
|
|
83
|
+
* spawn calls). Integer-typed fields (e.g. `cascadeCount`, `pcfKernelSize`)
|
|
84
|
+
* get an "integer in [min, max]" hint; otherwise "[min, max]" range or
|
|
85
|
+
* "<comparator> min".
|
|
86
|
+
* - `.detail = { field, value, min, max? }` — structured values (charter P4)
|
|
87
|
+
*
|
|
88
|
+
* 4th constructor parameter is a union over the two range shapes:
|
|
89
|
+
* - `number` — `max` for a closed `[min, max]` range (CSM cascadeCount /
|
|
90
|
+
* splitLambda / cascadeBlend). hint uses "in [min, max]"; integer-typed
|
|
91
|
+
* fields get "integer in [min, max]".
|
|
92
|
+
* - `'>' | '>='` — comparator for an open lower-bound predicate. `'>'` is
|
|
93
|
+
* used when `min` carries dynamic context (e.g. `farPlane > nearPlane` —
|
|
94
|
+
* the surfaced hint reads "must be > nearPlane" so AI users setting
|
|
95
|
+
* farPlane=nearPlane don't re-fail the spawn loop with the wrong cue).
|
|
96
|
+
* - `undefined` — defaults to `'>='`. Callsites for mapSize < 1 validation
|
|
97
|
+
* stay backward-compatible (3-arg form).
|
|
98
|
+
*/
|
|
99
|
+
export class ShadowInvalidConfigError extends Error {
|
|
100
|
+
readonly code = 'shadow-invalid-config' as const;
|
|
101
|
+
readonly expected: string;
|
|
102
|
+
readonly hint: string;
|
|
103
|
+
readonly detail: ShadowInvalidConfigDetail;
|
|
104
|
+
|
|
105
|
+
constructor(field: string, value: number, min: number, maxOrComparator?: number | '>' | '>=') {
|
|
106
|
+
const isComparator = maxOrComparator === '>' || maxOrComparator === '>=';
|
|
107
|
+
const max = !isComparator && typeof maxOrComparator === 'number' ? maxOrComparator : undefined;
|
|
108
|
+
const comparator: '>' | '>=' = isComparator ? (maxOrComparator as '>' | '>=') : '>=';
|
|
109
|
+
// Integer-typed fields get an "integer in [min, max]" hint when a range
|
|
110
|
+
// is supplied. Expand this set as new integer-typed shadow fields land.
|
|
111
|
+
const isInteger = field === 'cascadeCount' || field === 'pcfKernelSize';
|
|
112
|
+
// pcfKernelSize must be odd (kernel is symmetric around the center tap).
|
|
113
|
+
// Naming "odd" in the hint stops an AI retry from looping min->min+1 (4->6).
|
|
114
|
+
const isOdd = field === 'pcfKernelSize';
|
|
115
|
+
const hint =
|
|
116
|
+
max !== undefined
|
|
117
|
+
? isInteger
|
|
118
|
+
? `set ${field} to an integer in [${min}, ${max}]; got ${value}`
|
|
119
|
+
: `set ${field} to a value in [${min}, ${max}]; got ${value}`
|
|
120
|
+
: isOdd
|
|
121
|
+
? `set ${field} to an odd integer ${comparator} ${min}; got ${value}`
|
|
122
|
+
: `set ${field} to a value ${comparator} ${min}; got ${value}`;
|
|
123
|
+
const expected =
|
|
124
|
+
max !== undefined ? `${field} in [${min}, ${max}]` : `${field} ${comparator} ${min}`;
|
|
125
|
+
super(
|
|
126
|
+
max !== undefined
|
|
127
|
+
? `shadow component .${field} must be in [${min}, ${max}], got ${value}`
|
|
128
|
+
: `shadow component .${field} must be ${comparator} ${min}, got ${value}`,
|
|
129
|
+
);
|
|
130
|
+
this.name = 'ShadowInvalidConfigError';
|
|
131
|
+
this.hint = hint;
|
|
132
|
+
this.expected = expected;
|
|
133
|
+
this.detail = { field, value, min, ...(max !== undefined ? { max } : {}) };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ── EquirectProjectionFailedError ────────────────────────────────────────────
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Detail for `RuntimeErrorCode 'equirect-projection-failed'`.
|
|
141
|
+
*
|
|
142
|
+
* Emitted when the equirect-to-cubemap IBL projection fails for the equirect
|
|
143
|
+
* handle referenced by a `Skylight` / `SkyboxBackground` component. The handle
|
|
144
|
+
* id is carried so AI users can trace which equirect source failed projection.
|
|
145
|
+
* Degradation: the record arm records `status:'failed'`, binds the white-cube
|
|
146
|
+
* fallback, fires this error ONCE, and does NOT retry the projection.
|
|
147
|
+
*
|
|
148
|
+
* feat-20260630 D-5: structured error with detail carrying the handle id.
|
|
149
|
+
*/
|
|
150
|
+
export interface EquirectProjectionFailedDetail {
|
|
151
|
+
readonly handle: number;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Structured error for a failed equirect-to-cubemap IBL projection.
|
|
156
|
+
*
|
|
157
|
+
* Emitted by the record stage when the internal cubemap projection for an
|
|
158
|
+
* equirect handle returns a failure (or records `status:'failed'`). Four-field
|
|
159
|
+
* surface per AGENTS.md error model:
|
|
160
|
+
* - `.code = 'equirect-projection-failed'` (closed RuntimeErrorCode)
|
|
161
|
+
* - `.expected` — equirect-to-cubemap projection + IBL precompute succeeds
|
|
162
|
+
* - `.hint` — declare `Skylight{equirect}` with a valid HDR equirect source;
|
|
163
|
+
* check `device.caps.rgba16floatRenderable`. The projection is internal —
|
|
164
|
+
* there is no user upload call to retry
|
|
165
|
+
* - `.detail = { handle }` — the numeric equirect handle id for diagnostics
|
|
166
|
+
*/
|
|
167
|
+
export class EquirectProjectionFailedError extends Error {
|
|
168
|
+
readonly code = 'equirect-projection-failed' as const;
|
|
169
|
+
readonly expected: string;
|
|
170
|
+
readonly hint: string;
|
|
171
|
+
readonly detail: EquirectProjectionFailedDetail;
|
|
172
|
+
|
|
173
|
+
constructor(handle: number) {
|
|
174
|
+
const expected = `equirect handle ${handle} projects to a GPU cubemap + IBL precompute`;
|
|
175
|
+
const hint =
|
|
176
|
+
`equirect handle ${handle} referenced by Skylight/SkyboxBackground failed projection; ` +
|
|
177
|
+
`declare Skylight{equirect} with a valid HDR equirect source and check device.caps.rgba16floatRenderable. ` +
|
|
178
|
+
`The projection is internal (no user upload call); the record arm does not retry`;
|
|
179
|
+
super(`equirect handle ${handle} cubemap projection failed`);
|
|
180
|
+
this.name = 'EquirectProjectionFailedError';
|
|
181
|
+
this.expected = expected;
|
|
182
|
+
this.hint = hint;
|
|
183
|
+
this.detail = { handle };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ── HdrpLightBudgetExceededError ───────────────────────────────────────────
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Detail for `RuntimeErrorCode 'hdrp-light-budget-exceeded'`.
|
|
191
|
+
*
|
|
192
|
+
* Emitted per-frame (once-per-frame fire) when light count exceeds HDRP budget.
|
|
193
|
+
*/
|
|
194
|
+
export interface HdrpLightBudgetExceededDetail {
|
|
195
|
+
readonly actual: number;
|
|
196
|
+
readonly budget: number;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Structured error for HDRP light budget exceeded (AC-06/AC-07).
|
|
201
|
+
*
|
|
202
|
+
* Emitted per-frame in recordFrame when the total punctual light count
|
|
203
|
+
* exceeds the HDRP budget (256). Fail-soft: fire once per frame, truncate to 256.
|
|
204
|
+
* - `.code = 'hdrp-light-budget-exceeded'` (closed RuntimeErrorCode)
|
|
205
|
+
* - `.expected` — 'light count <= 256'
|
|
206
|
+
* - `.hint` — 'reduce world light count or increase budget (OOS-hdrp-larger-budget)'
|
|
207
|
+
* - `.detail = { actual, budget }`
|
|
208
|
+
*/
|
|
209
|
+
export class HdrpLightBudgetExceededError extends Error {
|
|
210
|
+
readonly code = 'hdrp-light-budget-exceeded' as const;
|
|
211
|
+
readonly expected: string;
|
|
212
|
+
readonly hint: string;
|
|
213
|
+
readonly detail: HdrpLightBudgetExceededDetail;
|
|
214
|
+
|
|
215
|
+
constructor(actual: number, budget: number) {
|
|
216
|
+
const expected = `light count <= ${budget}`;
|
|
217
|
+
const hint =
|
|
218
|
+
`${actual} lights exceed HDRP budget ${budget}; ` +
|
|
219
|
+
'truncating to 256. Reduce light count or wait for OOS-hdrp-larger-budget';
|
|
220
|
+
super(`HDRP light budget exceeded: ${actual} > ${budget}`);
|
|
221
|
+
this.name = 'HdrpLightBudgetExceededError';
|
|
222
|
+
this.expected = expected;
|
|
223
|
+
this.hint = hint;
|
|
224
|
+
this.detail = { actual, budget };
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// ── HdrpIndexListOverflowError ─────────────────────────────────────────────
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Detail for `RuntimeErrorCode 'hdrp-index-list-overflow'`.
|
|
232
|
+
*
|
|
233
|
+
* Emitted per-frame (once-per-frame fire) when the cluster binner overflows
|
|
234
|
+
* the light index list capacity (65536). Upgraded from ClusterBinError.
|
|
235
|
+
*/
|
|
236
|
+
export interface HdrpIndexListOverflowDetail {
|
|
237
|
+
readonly actual: number;
|
|
238
|
+
readonly capacity: number;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Structured error for HDRP cluster binner index list overflow (AC-24).
|
|
243
|
+
*
|
|
244
|
+
* Emitted per-frame in recordFrame when the CPU binner returns
|
|
245
|
+
* `ClusterBinError('index-overflow')`. Fail-soft: fire once per frame,
|
|
246
|
+
* continue rendering with what fit.
|
|
247
|
+
* - `.code = 'hdrp-index-list-overflow'` (closed RuntimeErrorCode)
|
|
248
|
+
* - `.expected` — 'light index list entries <= 65536'
|
|
249
|
+
* - `.hint` — 'reduce lights, shrink cluster grid, or increase capacity'
|
|
250
|
+
* - `.detail = { actual, capacity }`
|
|
251
|
+
*/
|
|
252
|
+
export class HdrpIndexListOverflowError extends Error {
|
|
253
|
+
readonly code = 'hdrp-index-list-overflow' as const;
|
|
254
|
+
readonly expected: string;
|
|
255
|
+
readonly hint: string;
|
|
256
|
+
readonly detail: HdrpIndexListOverflowDetail;
|
|
257
|
+
|
|
258
|
+
constructor(actual: number, capacity: number) {
|
|
259
|
+
const expected = `light index list entries <= ${capacity}`;
|
|
260
|
+
const hint =
|
|
261
|
+
`cluster binner overflow: writeCount ${actual} exceeds capacity ${capacity}; ` +
|
|
262
|
+
'reduce lights, shrink cluster grid, or increase LIGHT_INDEX_LIST_CAPACITY';
|
|
263
|
+
super(`HDRP index list overflow: ${actual} > ${capacity}`);
|
|
264
|
+
this.name = 'HdrpIndexListOverflowError';
|
|
265
|
+
this.expected = expected;
|
|
266
|
+
this.hint = hint;
|
|
267
|
+
this.detail = { actual, capacity };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// ── HdrpDeferredCapsInsufficientError ──────────────────────────────────────
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Detail for `RuntimeErrorCode 'hdrp-deferred-caps-insufficient'`.
|
|
275
|
+
*
|
|
276
|
+
* Emitted when the Standard clustered lane has fewer than 4 color attachments,
|
|
277
|
+
* meaning the deferred path cannot allocate 3 g-buffer color targets + depth.
|
|
278
|
+
*/
|
|
279
|
+
export interface HdrpDeferredCapsInsufficientDetail {
|
|
280
|
+
readonly actual: number;
|
|
281
|
+
readonly expected: number;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Structured error for deferred-path capability gate failure.
|
|
286
|
+
*
|
|
287
|
+
* Emitted during Standard clustered lane validation — synchronous throw.
|
|
288
|
+
* - `.code = 'hdrp-deferred-caps-insufficient'` (closed RuntimeErrorCode)
|
|
289
|
+
* - `.expected` — 'maxColorAttachments >= 4'
|
|
290
|
+
* - `.hint` — actionable guidance to upgrade browser or select URP
|
|
291
|
+
* - `.detail = { actual, expected }`
|
|
292
|
+
*
|
|
293
|
+
* @see plan-strategy D-5 (capability validation, no silent fallback)
|
|
294
|
+
*/
|
|
295
|
+
export class HdrpDeferredCapsInsufficientError extends Error {
|
|
296
|
+
readonly code = 'hdrp-deferred-caps-insufficient' as const;
|
|
297
|
+
readonly expected: string;
|
|
298
|
+
readonly hint: string;
|
|
299
|
+
readonly detail: HdrpDeferredCapsInsufficientDetail;
|
|
300
|
+
|
|
301
|
+
constructor(actual: number) {
|
|
302
|
+
const _expected = 4;
|
|
303
|
+
const _expectedStr = `maxColorAttachments >= ${_expected}`;
|
|
304
|
+
const hint =
|
|
305
|
+
`WebGPU maxColorAttachments = ${actual} (need >= ${_expected}). ` +
|
|
306
|
+
'Upgrade browser to latest Chrome/Edge/Safari, or use URP (forgeax::urp) instead of HDRP.';
|
|
307
|
+
super(
|
|
308
|
+
`HDRP deferred caps insufficient: maxColorAttachments = ${actual} (need >= ${_expected})`,
|
|
309
|
+
);
|
|
310
|
+
this.name = 'HdrpDeferredCapsInsufficientError';
|
|
311
|
+
this.expected = _expectedStr;
|
|
312
|
+
this.hint = hint;
|
|
313
|
+
this.detail = { actual, expected: _expected };
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// ── PointShadowAtlasUninitializedError ─────────────────────────────────────
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Structured error for `ShadowAtlas.faceView` called before `ensure()`
|
|
321
|
+
* allocated the cube_array texture. Replaces the prior bare
|
|
322
|
+
* `throw new Error()` (Round-2 F-4: P3 closed-union compliance).
|
|
323
|
+
*
|
|
324
|
+
* - `.code = 'point-shadow-atlas-uninitialized'`
|
|
325
|
+
* - `.expected` — call `ensure()` before iterating face views
|
|
326
|
+
* - `.hint` — gate `faceView` on `isAllocated()` or call `ensure()` once
|
|
327
|
+
* in the per-frame extract step before recording the 6 x N caster passes
|
|
328
|
+
* - `.detail = undefined` (no per-call data needed)
|
|
329
|
+
*/
|
|
330
|
+
export class PointShadowAtlasUninitializedError extends Error {
|
|
331
|
+
readonly code = 'point-shadow-atlas-uninitialized' as const;
|
|
332
|
+
readonly expected: string;
|
|
333
|
+
readonly hint: string;
|
|
334
|
+
|
|
335
|
+
constructor() {
|
|
336
|
+
const expected = 'ShadowAtlas.ensure() invoked before faceView()';
|
|
337
|
+
const hint =
|
|
338
|
+
'Gate faceView on isAllocated() or call ensure() once in the per-frame extract step before iterating face views';
|
|
339
|
+
super('ShadowAtlas.faceView called before ensure(); the cube_array texture is not allocated');
|
|
340
|
+
this.name = 'PointShadowAtlasUninitializedError';
|
|
341
|
+
this.expected = expected;
|
|
342
|
+
this.hint = hint;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// ── PointShadowAtlasBoundsViolationError ───────────────────────────────────
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Detail for `RuntimeErrorCode 'point-shadow-atlas-bounds-violation'`.
|
|
350
|
+
*
|
|
351
|
+
* Emitted by `ShadowAtlas.faceView` when `layer` falls outside `[0, layers)`
|
|
352
|
+
* or `face` falls outside `[0, 6)`. Both axes are reported as
|
|
353
|
+
* `{ axis, value, max }` so AI users discriminate without parsing the message.
|
|
354
|
+
*/
|
|
355
|
+
export interface PointShadowAtlasBoundsViolationDetail {
|
|
356
|
+
readonly axis: 'layer' | 'face';
|
|
357
|
+
readonly value: number;
|
|
358
|
+
readonly max: number;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Structured error for `ShadowAtlas.faceView(layer, face)` arguments outside
|
|
363
|
+
* the allocated atlas range. Replaces the prior bare `throw new Error()`
|
|
364
|
+
* (Round-2 F-4: P3 closed-union compliance).
|
|
365
|
+
*
|
|
366
|
+
* - `.code = 'point-shadow-atlas-bounds-violation'`
|
|
367
|
+
* - `.expected` — `0 <= layer < layers && 0 <= face < 6`
|
|
368
|
+
* - `.hint` — clamp `shadowAtlasLayer` or face index before calling
|
|
369
|
+
* `faceView`; the cap on layers is `PointLightShadow` cardinality (4)
|
|
370
|
+
* - `.detail = { axis, value, max }` — discriminates layer vs face
|
|
371
|
+
*/
|
|
372
|
+
export class PointShadowAtlasBoundsViolationError extends Error {
|
|
373
|
+
readonly code = 'point-shadow-atlas-bounds-violation' as const;
|
|
374
|
+
readonly expected: string;
|
|
375
|
+
readonly hint: string;
|
|
376
|
+
readonly detail: PointShadowAtlasBoundsViolationDetail;
|
|
377
|
+
|
|
378
|
+
constructor(axis: 'layer' | 'face', value: number, max: number) {
|
|
379
|
+
const expected = `0 <= ${axis} < ${max}`;
|
|
380
|
+
const hint =
|
|
381
|
+
axis === 'layer'
|
|
382
|
+
? `clamp PointLight.shadowAtlasLayer to [0, ${max}); the cap on layers equals PointLightShadow cardinality (4)`
|
|
383
|
+
: `clamp face index to [0, ${max}); cube faces are indexed 0..5 in +X/-X/+Y/-Y/+Z/-Z order`;
|
|
384
|
+
super(`ShadowAtlas.faceView ${axis} out of range: ${value} (must be in [0, ${max}))`);
|
|
385
|
+
this.name = 'PointShadowAtlasBoundsViolationError';
|
|
386
|
+
this.expected = expected;
|
|
387
|
+
this.hint = hint;
|
|
388
|
+
this.detail = { axis, value, max };
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// ── VideoUploadUnsupportedError ─────────────────────────────────────────
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Structured error for `RuntimeErrorCode 'video-upload-unsupported'`
|
|
396
|
+
* (feat-20260623-world-space-video-asset M3 / w11 — AC-10).
|
|
397
|
+
*
|
|
398
|
+
* Fired by the per-frame record stage (`videoTextureView`) when a VideoPlayer
|
|
399
|
+
* entity can reach neither video upload path this frame: the general
|
|
400
|
+
* `copyExternalImageToTexture` path (no host HTMLVideoElement resolved via
|
|
401
|
+
* `VideoElementProvider`) AND the high-perf `GPUExternalTexture` path
|
|
402
|
+
* (capability absent). The engine surfaces this explicit failure rather than
|
|
403
|
+
* silently rendering a stale/garbage texture (charter P3, plan-strategy D-6).
|
|
404
|
+
* - `.code = 'video-upload-unsupported'`
|
|
405
|
+
* - `.expected` — at least one upload path available (host element or
|
|
406
|
+
* GPUExternalTexture capability)
|
|
407
|
+
* - `.hint` — actionable recovery: use a static texture or switch backend
|
|
408
|
+
* - `.detail` — undefined (no narrowed detail variant)
|
|
409
|
+
*/
|
|
410
|
+
export class VideoUploadUnsupportedError extends Error {
|
|
411
|
+
readonly code = 'video-upload-unsupported' as const;
|
|
412
|
+
readonly expected: string;
|
|
413
|
+
readonly hint: string;
|
|
414
|
+
|
|
415
|
+
constructor() {
|
|
416
|
+
const expected =
|
|
417
|
+
'at least one video upload path available: a host HTMLVideoElement (general copyExternalImageToTexture path) or GPUExternalTexture capability (high-perf path)';
|
|
418
|
+
const hint =
|
|
419
|
+
'this backend exposes no usable video upload path; render a static texture instead, or switch to a WebGPU backend that supports video texture upload';
|
|
420
|
+
super('video upload unsupported — no general or high-perf path available');
|
|
421
|
+
this.name = 'VideoUploadUnsupportedError';
|
|
422
|
+
this.expected = expected;
|
|
423
|
+
this.hint = hint;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// ── VertexStorageBufferUnavailableError ─────────────────────────────────
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* Structured error for missing vertex-stage storage buffer capability.
|
|
431
|
+
*
|
|
432
|
+
* Emitted at createRenderer time (cap-gate).
|
|
433
|
+
* - `.code = 'vertex-storage-buffer-unavailable'`
|
|
434
|
+
* - `.expected` — device.caps supports vertex-stage storage buffer
|
|
435
|
+
* - `.hint` — switch to a WebGPU adapter with vertex storage buffer support or use uniform-buffer fallback (OOS-uniform-palette)
|
|
436
|
+
* - `.detail` — undefined (no narrowed detail variant)
|
|
437
|
+
*/
|
|
438
|
+
export class VertexStorageBufferUnavailableError extends Error {
|
|
439
|
+
readonly code = 'vertex-storage-buffer-unavailable' as const;
|
|
440
|
+
readonly expected: string;
|
|
441
|
+
readonly hint: string;
|
|
442
|
+
|
|
443
|
+
constructor() {
|
|
444
|
+
const expected =
|
|
445
|
+
'device.caps supports vertex-stage storage buffer (maxStorageBuffersPerShaderStage >= 1)';
|
|
446
|
+
const hint =
|
|
447
|
+
'this device does not support vertex-stage storage buffers; skinning requires vertex-stage storage buffer access (OOS-uniform-palette fallback not implemented)';
|
|
448
|
+
super('vertex-stage storage buffer unavailable — skinning cannot operate');
|
|
449
|
+
this.name = 'VertexStorageBufferUnavailableError';
|
|
450
|
+
this.expected = expected;
|
|
451
|
+
this.hint = hint;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// ── VertexColorVariantConflictError ───────────────────────────────────────
|
|
456
|
+
|
|
457
|
+
export interface VertexColorVariantConflictDetail {
|
|
458
|
+
readonly authored: true;
|
|
459
|
+
readonly authoredValue: string;
|
|
460
|
+
readonly projected: boolean;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/** The authored color axis disagrees with the canonical geometry projection. */
|
|
464
|
+
export class VertexColorVariantConflictError extends Error {
|
|
465
|
+
readonly code = 'vertex-color-variant-conflict' as const;
|
|
466
|
+
readonly expected: string;
|
|
467
|
+
readonly hint: string;
|
|
468
|
+
readonly detail: VertexColorVariantConflictDetail;
|
|
469
|
+
|
|
470
|
+
constructor(authoredValue: string, projected: boolean) {
|
|
471
|
+
const expected = `VERTEX_COLOR_AVAILABLE=${projected ? 'true' : 'false'}`;
|
|
472
|
+
const hint =
|
|
473
|
+
'derive the shader variant from the mesh VertexLayoutProjection; COLOR_0 presence is a geometry fact';
|
|
474
|
+
super(`authored vertex-color variant ${authoredValue} disagrees with projected ${expected}`);
|
|
475
|
+
this.name = 'VertexColorVariantConflictError';
|
|
476
|
+
this.expected = expected;
|
|
477
|
+
this.hint = hint;
|
|
478
|
+
this.detail = { authored: true, authoredValue, projected };
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// ── Skin palette/material validation errors ────────────────────────────────
|
|
483
|
+
|
|
484
|
+
/** Detail for a palette buffer that exceeds the device storage limit. */
|
|
485
|
+
export interface SkinPaletteOverflowDetail {
|
|
486
|
+
readonly requestedBytes: number;
|
|
487
|
+
readonly limit: number;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* Structured render error for a skin palette allocation that exceeds the
|
|
492
|
+
* device storage-buffer binding limit. The allocator that emits this error
|
|
493
|
+
* lives in render, so the error belongs to the render union rather than the
|
|
494
|
+
* renderer-independent skinning binding package.
|
|
495
|
+
*/
|
|
496
|
+
export class SkinPaletteOverflowError extends Error {
|
|
497
|
+
readonly code = 'skin-palette-overflow' as const;
|
|
498
|
+
readonly expected: string;
|
|
499
|
+
readonly hint: string;
|
|
500
|
+
readonly detail: SkinPaletteOverflowDetail;
|
|
501
|
+
|
|
502
|
+
constructor(requestedBytes: number, limit: number) {
|
|
503
|
+
const expected = `skinned joint palette (${requestedBytes} B) fits within device.limits.maxStorageBufferBindingSize (${limit} B)`;
|
|
504
|
+
const hint =
|
|
505
|
+
'palette buffer exceeds device maxStorageBufferBindingSize; reduce skinned entity count or split into multiple palette buffers (OOS-skin-palette-batch)';
|
|
506
|
+
super(`skin palette buffer needs ${requestedBytes} B, exceeds device limit ${limit} B`);
|
|
507
|
+
this.name = 'SkinPaletteOverflowError';
|
|
508
|
+
this.expected = expected;
|
|
509
|
+
this.hint = hint;
|
|
510
|
+
this.detail = { requestedBytes, limit };
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/** Detail for a skinned entity using a non-skin material shader. */
|
|
515
|
+
export interface SkinMaterialMismatchDetail {
|
|
516
|
+
readonly entity: number;
|
|
517
|
+
readonly actualShader: string | undefined;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/** Structured render error for a Skin/non-skin-material mismatch. */
|
|
521
|
+
export class SkinMaterialMismatchError extends Error {
|
|
522
|
+
readonly code = 'skin-material-mismatch' as const;
|
|
523
|
+
readonly expected: string;
|
|
524
|
+
readonly hint: string;
|
|
525
|
+
readonly detail: SkinMaterialMismatchDetail;
|
|
526
|
+
|
|
527
|
+
constructor(entity: number, actualShader: string | undefined) {
|
|
528
|
+
const expected = "Skin entity's first material program module === 'forgeax::pbr-skin'";
|
|
529
|
+
const hint = `entity ${entity} has Skin but the first material program module is ${actualShader ?? '<empty>'}; load the mesh via the gltf importer (cooker auto-routes 'forgeax::pbr-skin' for skinned primitives), or remove the Skin component to render the entity unskinned with Materials.standard / Materials.unlit`;
|
|
530
|
+
super(
|
|
531
|
+
`Skin / material mismatch on entity ${entity}: expected forgeax::pbr-skin, got ${actualShader ?? '<empty>'}`,
|
|
532
|
+
);
|
|
533
|
+
this.name = 'SkinMaterialMismatchError';
|
|
534
|
+
this.expected = expected;
|
|
535
|
+
this.hint = hint;
|
|
536
|
+
this.detail = { entity, actualShader };
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/** Detail for a pbr-skin material whose mesh lacks skin attributes. */
|
|
541
|
+
export interface MaterialSkinAttrMissingDetail {
|
|
542
|
+
readonly entity: number;
|
|
543
|
+
readonly missing: 'skinIndex' | 'skinWeight' | 'both';
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/** Structured render error for a pbr-skin material/mesh attribute mismatch. */
|
|
547
|
+
export class MaterialSkinAttrMissingError extends Error {
|
|
548
|
+
readonly code = 'material-skin-attr-missing' as const;
|
|
549
|
+
readonly expected: string;
|
|
550
|
+
readonly hint: string;
|
|
551
|
+
readonly detail: MaterialSkinAttrMissingDetail;
|
|
552
|
+
|
|
553
|
+
constructor(entity: number, missing: 'skinIndex' | 'skinWeight' | 'both') {
|
|
554
|
+
const expected = 'pbr-skin material requires mesh.attributes.skinIndex + skinWeight';
|
|
555
|
+
const hint = `entity ${entity} uses forgeax::pbr-skin but its MeshAsset is missing ${missing}; switch the entity to a skinned glTF mesh authored with JOINTS_0 + WEIGHTS_0, or change the material to a non-skin shader via Materials.standard / Materials.unlit`;
|
|
556
|
+
super(
|
|
557
|
+
`material/skin attribute mismatch on entity ${entity}: pbr-skin material with mesh missing ${missing}`,
|
|
558
|
+
);
|
|
559
|
+
this.name = 'MaterialSkinAttrMissingError';
|
|
560
|
+
this.expected = expected;
|
|
561
|
+
this.hint = hint;
|
|
562
|
+
this.detail = { entity, missing };
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// -- RenderFeature errors ---------------------------------------------------
|
|
567
|
+
|
|
568
|
+
export type RenderFeatureErrorCode =
|
|
569
|
+
| 'render-feature-registration-conflict'
|
|
570
|
+
| 'render-feature-stage-failed'
|
|
571
|
+
| 'render-feature-capability-missing'
|
|
572
|
+
| 'render-feature-pass-order-conflict'
|
|
573
|
+
| 'render-feature-preparation-failed'
|
|
574
|
+
| 'render-feature-prepared-state-mismatch'
|
|
575
|
+
| 'render-feature-draw-recording-failed';
|
|
576
|
+
|
|
577
|
+
export interface RenderFeatureRegistrationConflictDetail {
|
|
578
|
+
readonly featureIdentity: string;
|
|
579
|
+
readonly order: number;
|
|
580
|
+
readonly conflictingOrder: number;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
export interface RenderFeatureCleanupFailure {
|
|
584
|
+
readonly featureIdentity: string;
|
|
585
|
+
readonly order: number;
|
|
586
|
+
readonly code: string;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
export interface RenderFeatureStageFailedDetail {
|
|
590
|
+
readonly featureIdentity: string;
|
|
591
|
+
readonly order: number;
|
|
592
|
+
readonly stage: RenderFeatureStage;
|
|
593
|
+
readonly recovery: RenderFeatureRecovery;
|
|
594
|
+
readonly cleanupFailures?: readonly RenderFeatureCleanupFailure[];
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
export interface RenderFeatureCapabilityMissingDetail {
|
|
598
|
+
readonly featureIdentity: string;
|
|
599
|
+
readonly order: number;
|
|
600
|
+
readonly capability: RenderFeatureCapabilityKey;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
export interface RenderFeaturePassOrderConflictDetail {
|
|
604
|
+
readonly featureIdentity: string;
|
|
605
|
+
readonly order: number;
|
|
606
|
+
readonly passIdentity: string;
|
|
607
|
+
readonly dependencyIdentity: string;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
export interface RenderFeaturePreparationFailedDetail {
|
|
611
|
+
readonly featureIdentity: string;
|
|
612
|
+
readonly order: number;
|
|
613
|
+
readonly stage: 'prepare';
|
|
614
|
+
readonly operation: string;
|
|
615
|
+
readonly resourceKind: PreparedKind;
|
|
616
|
+
readonly resourceName: string;
|
|
617
|
+
readonly reason: string;
|
|
618
|
+
readonly recovery: RenderFeatureRecovery;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
export type RenderFeaturePreparedStateMismatchDetail =
|
|
622
|
+
| {
|
|
623
|
+
readonly featureIdentity: string;
|
|
624
|
+
readonly order: number;
|
|
625
|
+
readonly stage: 'contribute';
|
|
626
|
+
readonly operation: string;
|
|
627
|
+
readonly resourceKind: PreparedKind;
|
|
628
|
+
readonly reason: 'missing-prepared-state';
|
|
629
|
+
readonly missingResource: string;
|
|
630
|
+
readonly recovery: RenderFeatureRecovery;
|
|
631
|
+
}
|
|
632
|
+
| {
|
|
633
|
+
readonly featureIdentity: string;
|
|
634
|
+
readonly order: number;
|
|
635
|
+
readonly stage: 'contribute';
|
|
636
|
+
readonly operation: string;
|
|
637
|
+
readonly resourceKind: PreparedKind;
|
|
638
|
+
readonly reason: 'foreign-feature';
|
|
639
|
+
readonly expectedFeatureIdentity: string;
|
|
640
|
+
readonly actualFeatureIdentity: string;
|
|
641
|
+
readonly recovery: RenderFeatureRecovery;
|
|
642
|
+
}
|
|
643
|
+
| {
|
|
644
|
+
readonly featureIdentity: string;
|
|
645
|
+
readonly order: number;
|
|
646
|
+
readonly stage: 'contribute';
|
|
647
|
+
readonly operation: string;
|
|
648
|
+
readonly resourceKind: PreparedKind;
|
|
649
|
+
readonly reason: 'foreign-kind';
|
|
650
|
+
readonly expectedKind: PreparedKind;
|
|
651
|
+
readonly actualKind: PreparedKind;
|
|
652
|
+
readonly recovery: RenderFeatureRecovery;
|
|
653
|
+
}
|
|
654
|
+
| {
|
|
655
|
+
readonly featureIdentity: string;
|
|
656
|
+
readonly order: number;
|
|
657
|
+
readonly stage: 'contribute';
|
|
658
|
+
readonly operation: string;
|
|
659
|
+
readonly resourceKind: PreparedKind;
|
|
660
|
+
readonly reason: 'generation-mismatch';
|
|
661
|
+
readonly expectedGeneration: number;
|
|
662
|
+
readonly actualGeneration: number;
|
|
663
|
+
readonly recovery: RenderFeatureRecovery;
|
|
664
|
+
}
|
|
665
|
+
| {
|
|
666
|
+
readonly featureIdentity: string;
|
|
667
|
+
readonly order: number;
|
|
668
|
+
readonly stage: 'contribute';
|
|
669
|
+
readonly operation: string;
|
|
670
|
+
readonly resourceKind: PreparedKind;
|
|
671
|
+
readonly reason: 'layout-mismatch';
|
|
672
|
+
readonly expectedLayout: string;
|
|
673
|
+
readonly actualLayout: string;
|
|
674
|
+
readonly recovery: RenderFeatureRecovery;
|
|
675
|
+
}
|
|
676
|
+
| {
|
|
677
|
+
readonly featureIdentity: string;
|
|
678
|
+
readonly order: number;
|
|
679
|
+
readonly stage: 'contribute';
|
|
680
|
+
readonly operation: string;
|
|
681
|
+
readonly resourceKind: PreparedKind;
|
|
682
|
+
readonly reason: 'format-mismatch';
|
|
683
|
+
readonly expectedFormat: string;
|
|
684
|
+
readonly actualFormat: string;
|
|
685
|
+
readonly recovery: RenderFeatureRecovery;
|
|
686
|
+
};
|
|
687
|
+
|
|
688
|
+
export interface RenderFeatureDrawRecordingFailedDetail {
|
|
689
|
+
readonly featureIdentity: string;
|
|
690
|
+
readonly order: number;
|
|
691
|
+
readonly stage: 'record';
|
|
692
|
+
readonly operation: string;
|
|
693
|
+
readonly resourceKind: PreparedKind;
|
|
694
|
+
readonly reason: string;
|
|
695
|
+
readonly backendReason: string;
|
|
696
|
+
readonly recovery: RenderFeatureRecovery;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
export type RenderFeatureErrorDetailByCode = {
|
|
700
|
+
'render-feature-registration-conflict': RenderFeatureRegistrationConflictDetail;
|
|
701
|
+
'render-feature-stage-failed': RenderFeatureStageFailedDetail;
|
|
702
|
+
'render-feature-capability-missing': RenderFeatureCapabilityMissingDetail;
|
|
703
|
+
'render-feature-pass-order-conflict': RenderFeaturePassOrderConflictDetail;
|
|
704
|
+
'render-feature-preparation-failed': RenderFeaturePreparationFailedDetail;
|
|
705
|
+
'render-feature-prepared-state-mismatch': RenderFeaturePreparedStateMismatchDetail;
|
|
706
|
+
'render-feature-draw-recording-failed': RenderFeatureDrawRecordingFailedDetail;
|
|
707
|
+
};
|
|
708
|
+
|
|
709
|
+
/** Machine-readable four-field diagnostic exposed by every feature error. */
|
|
710
|
+
export type RenderFeatureErrorDescriptor = {
|
|
711
|
+
[Code in RenderFeatureErrorCode]: {
|
|
712
|
+
readonly code: Code;
|
|
713
|
+
readonly expected: string;
|
|
714
|
+
readonly hint: string;
|
|
715
|
+
readonly detail: RenderFeatureErrorDetailByCode[Code];
|
|
716
|
+
};
|
|
717
|
+
}[RenderFeatureErrorCode];
|
|
718
|
+
|
|
719
|
+
const renderFeatureRecoveryHintByRecovery = {
|
|
720
|
+
'next-frame': (featureIdentity: string, stage: RenderFeatureStage) =>
|
|
721
|
+
`correct '${featureIdentity}' ${stage} data and retry on the next frame`,
|
|
722
|
+
'renderer-recover': (featureIdentity: string, _stage: RenderFeatureStage) =>
|
|
723
|
+
`wait for renderer recovery before retrying '${featureIdentity}'`,
|
|
724
|
+
registration: (featureIdentity: string, _stage: RenderFeatureStage) =>
|
|
725
|
+
`correct '${featureIdentity}' registration before retrying`,
|
|
726
|
+
} satisfies Record<
|
|
727
|
+
RenderFeatureRecovery,
|
|
728
|
+
(featureIdentity: string, stage: RenderFeatureStage) => string
|
|
729
|
+
>;
|
|
730
|
+
|
|
731
|
+
export class RenderFeatureRegistrationConflictError extends Error {
|
|
732
|
+
readonly code = 'render-feature-registration-conflict' as const;
|
|
733
|
+
readonly expected: string;
|
|
734
|
+
readonly hint: string;
|
|
735
|
+
readonly detail: RenderFeatureRegistrationConflictDetail;
|
|
736
|
+
|
|
737
|
+
constructor(featureIdentity: string, order: number, conflictingOrder: number) {
|
|
738
|
+
const expected = `feature identity '${featureIdentity}' is unique`;
|
|
739
|
+
const hint = `rename '${featureIdentity}' or remove the duplicate feature before registration`;
|
|
740
|
+
super(`render feature registration conflict for '${featureIdentity}'`);
|
|
741
|
+
this.name = 'RenderFeatureRegistrationConflictError';
|
|
742
|
+
this.expected = expected;
|
|
743
|
+
this.hint = hint;
|
|
744
|
+
this.detail = { featureIdentity, order, conflictingOrder };
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
export class RenderFeatureStageFailedError extends Error {
|
|
749
|
+
readonly code = 'render-feature-stage-failed' as const;
|
|
750
|
+
readonly expected: string;
|
|
751
|
+
readonly hint: string;
|
|
752
|
+
readonly detail: RenderFeatureStageFailedDetail;
|
|
753
|
+
|
|
754
|
+
constructor(
|
|
755
|
+
featureIdentity: string,
|
|
756
|
+
order: number,
|
|
757
|
+
stage: RenderFeatureStage,
|
|
758
|
+
recovery: RenderFeatureRecovery,
|
|
759
|
+
) {
|
|
760
|
+
const expected = `feature '${featureIdentity}' completes its ${stage} stage without an error`;
|
|
761
|
+
const hint = renderFeatureRecoveryHintByRecovery[recovery](featureIdentity, stage);
|
|
762
|
+
super(`render feature '${featureIdentity}' failed during ${stage}`);
|
|
763
|
+
this.name = 'RenderFeatureStageFailedError';
|
|
764
|
+
this.expected = expected;
|
|
765
|
+
this.hint = hint;
|
|
766
|
+
this.detail = { featureIdentity, order, stage, recovery };
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
export class RenderFeatureCapabilityMissingError extends Error {
|
|
771
|
+
readonly code = 'render-feature-capability-missing' as const;
|
|
772
|
+
readonly expected: string;
|
|
773
|
+
readonly hint: string;
|
|
774
|
+
readonly detail: RenderFeatureCapabilityMissingDetail;
|
|
775
|
+
|
|
776
|
+
constructor(
|
|
777
|
+
featureIdentity: string,
|
|
778
|
+
order: number,
|
|
779
|
+
capability: RenderFeatureCapabilityMissingDetail['capability'],
|
|
780
|
+
) {
|
|
781
|
+
const expected = `device capability '${capability}' is available for feature '${featureIdentity}'`;
|
|
782
|
+
const hint = `disable '${featureIdentity}' or use a device with '${capability}' capability`;
|
|
783
|
+
super(`render feature '${featureIdentity}' requires missing capability '${capability}'`);
|
|
784
|
+
this.name = 'RenderFeatureCapabilityMissingError';
|
|
785
|
+
this.expected = expected;
|
|
786
|
+
this.hint = hint;
|
|
787
|
+
this.detail = { featureIdentity, order, capability };
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
export class RenderFeaturePassOrderConflictError extends Error {
|
|
792
|
+
readonly code = 'render-feature-pass-order-conflict' as const;
|
|
793
|
+
readonly expected: string;
|
|
794
|
+
readonly hint: string;
|
|
795
|
+
readonly detail: RenderFeaturePassOrderConflictDetail;
|
|
796
|
+
|
|
797
|
+
constructor(
|
|
798
|
+
featureIdentity: string,
|
|
799
|
+
order: number,
|
|
800
|
+
passIdentity: string,
|
|
801
|
+
dependencyIdentity: string,
|
|
802
|
+
) {
|
|
803
|
+
const expected = `feature pass '${passIdentity}' follows dependency '${dependencyIdentity}'`;
|
|
804
|
+
const hint = `reorder '${featureIdentity}' passes so '${passIdentity}' follows '${dependencyIdentity}'`;
|
|
805
|
+
super(`render feature '${featureIdentity}' pass order conflict`);
|
|
806
|
+
this.name = 'RenderFeaturePassOrderConflictError';
|
|
807
|
+
this.expected = expected;
|
|
808
|
+
this.hint = hint;
|
|
809
|
+
this.detail = { featureIdentity, order, passIdentity, dependencyIdentity };
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
export class RenderFeaturePreparationFailedError extends Error {
|
|
814
|
+
readonly code = 'render-feature-preparation-failed' as const;
|
|
815
|
+
readonly expected: string;
|
|
816
|
+
readonly hint: string;
|
|
817
|
+
readonly detail: RenderFeaturePreparationFailedDetail;
|
|
818
|
+
|
|
819
|
+
constructor(
|
|
820
|
+
featureIdentity: string,
|
|
821
|
+
order: number,
|
|
822
|
+
operation: string,
|
|
823
|
+
resourceKind: RenderFeaturePreparationFailedDetail['resourceKind'],
|
|
824
|
+
resourceName: string,
|
|
825
|
+
reason: string,
|
|
826
|
+
recovery: RenderFeatureRecovery,
|
|
827
|
+
) {
|
|
828
|
+
const expected = `${resourceKind} '${resourceName}' is prepared during ${operation}`;
|
|
829
|
+
const hint = `repair '${resourceName}' and retry feature '${featureIdentity}' on ${recovery}`;
|
|
830
|
+
super(`render feature '${featureIdentity}' preparation failed for '${resourceName}'`);
|
|
831
|
+
this.name = 'RenderFeaturePreparationFailedError';
|
|
832
|
+
this.expected = expected;
|
|
833
|
+
this.hint = hint;
|
|
834
|
+
this.detail = {
|
|
835
|
+
featureIdentity,
|
|
836
|
+
order,
|
|
837
|
+
stage: 'prepare',
|
|
838
|
+
operation,
|
|
839
|
+
resourceKind,
|
|
840
|
+
resourceName,
|
|
841
|
+
reason,
|
|
842
|
+
recovery,
|
|
843
|
+
};
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
export class RenderFeaturePreparedStateMismatchError extends Error {
|
|
848
|
+
readonly code = 'render-feature-prepared-state-mismatch' as const;
|
|
849
|
+
readonly expected: string;
|
|
850
|
+
readonly hint: string;
|
|
851
|
+
readonly detail: RenderFeaturePreparedStateMismatchDetail;
|
|
852
|
+
|
|
853
|
+
constructor(detail: RenderFeaturePreparedStateMismatchDetail) {
|
|
854
|
+
const expected = `${detail.resourceKind} state is compatible for '${detail.operation}'`;
|
|
855
|
+
const hint = `repair '${detail.reason}' for feature '${detail.featureIdentity}' and retry`;
|
|
856
|
+
super(`render feature '${detail.featureIdentity}' prepared state mismatch`);
|
|
857
|
+
this.name = 'RenderFeaturePreparedStateMismatchError';
|
|
858
|
+
this.expected = expected;
|
|
859
|
+
this.hint = hint;
|
|
860
|
+
this.detail = detail;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
export class RenderFeatureDrawRecordingFailedError extends Error {
|
|
865
|
+
readonly code = 'render-feature-draw-recording-failed' as const;
|
|
866
|
+
readonly expected: string;
|
|
867
|
+
readonly hint: string;
|
|
868
|
+
readonly detail: RenderFeatureDrawRecordingFailedDetail;
|
|
869
|
+
|
|
870
|
+
constructor(
|
|
871
|
+
featureIdentity: string,
|
|
872
|
+
order: number,
|
|
873
|
+
operation: string,
|
|
874
|
+
resourceKind: RenderFeatureDrawRecordingFailedDetail['resourceKind'],
|
|
875
|
+
reason: string,
|
|
876
|
+
backendReason: string,
|
|
877
|
+
recovery: RenderFeatureRecovery,
|
|
878
|
+
) {
|
|
879
|
+
const expected = `${resourceKind} recording succeeds for '${operation}'`;
|
|
880
|
+
const hint = `repair '${reason}' and retry feature '${featureIdentity}' after ${recovery}`;
|
|
881
|
+
super(`render feature '${featureIdentity}' draw recording failed`);
|
|
882
|
+
this.name = 'RenderFeatureDrawRecordingFailedError';
|
|
883
|
+
this.expected = expected;
|
|
884
|
+
this.hint = hint;
|
|
885
|
+
this.detail = {
|
|
886
|
+
featureIdentity,
|
|
887
|
+
order,
|
|
888
|
+
stage: 'record',
|
|
889
|
+
operation,
|
|
890
|
+
resourceKind,
|
|
891
|
+
reason,
|
|
892
|
+
backendReason,
|
|
893
|
+
recovery,
|
|
894
|
+
};
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
// ── ObservationUnavailableError ───────────────────────────────────────────
|
|
899
|
+
|
|
900
|
+
export type ObservationUnavailableReason =
|
|
901
|
+
| 'no-frame'
|
|
902
|
+
| 'resource'
|
|
903
|
+
| 'copy-src'
|
|
904
|
+
| 'stale'
|
|
905
|
+
| 'identity'
|
|
906
|
+
| 'format'
|
|
907
|
+
| 'readback-failed';
|
|
908
|
+
|
|
909
|
+
export interface ObservationUnavailableDetail {
|
|
910
|
+
readonly reason: ObservationUnavailableReason;
|
|
911
|
+
readonly recovery: 'draw-current-frame' | 'enable-copy-src' | 'retry-readback';
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
/** A producer-owned current-frame observation could not be made available. */
|
|
915
|
+
export class ObservationUnavailableError extends Error {
|
|
916
|
+
readonly code = 'observation-unavailable' as const;
|
|
917
|
+
readonly expected: string;
|
|
918
|
+
readonly hint: string;
|
|
919
|
+
readonly detail: ObservationUnavailableDetail;
|
|
920
|
+
|
|
921
|
+
constructor(reason: ObservationUnavailableReason, hint: string) {
|
|
922
|
+
let recovery: ObservationUnavailableDetail['recovery'];
|
|
923
|
+
if (reason === 'copy-src') recovery = 'enable-copy-src';
|
|
924
|
+
else if (reason === 'resource' || reason === 'readback-failed') recovery = 'retry-readback';
|
|
925
|
+
else recovery = 'draw-current-frame';
|
|
926
|
+
super(`current-frame observation unavailable: ${reason}`);
|
|
927
|
+
this.name = 'ObservationUnavailableError';
|
|
928
|
+
this.expected = 'a fresh producer-owned rgba16float current-frame observation';
|
|
929
|
+
this.hint = hint;
|
|
930
|
+
this.detail = { reason, recovery };
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
export interface FrameReceiptStaleDetail {
|
|
935
|
+
readonly frameId: number;
|
|
936
|
+
readonly receiptGeneration: number;
|
|
937
|
+
readonly currentGeneration: number;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
/** Receipt-bound observation failed closed at a generation fence. */
|
|
941
|
+
export class FrameReceiptStaleError extends Error {
|
|
942
|
+
readonly code = 'frame-receipt-stale' as const;
|
|
943
|
+
readonly expected = 'the observation receipt belongs to the active device generation';
|
|
944
|
+
readonly hint = 'draw a new frame and call observe with its returned FrameReceipt';
|
|
945
|
+
readonly detail: FrameReceiptStaleDetail;
|
|
946
|
+
|
|
947
|
+
constructor(detail: FrameReceiptStaleDetail) {
|
|
948
|
+
super('frame receipt belongs to a retired device generation');
|
|
949
|
+
this.name = 'FrameReceiptStaleError';
|
|
950
|
+
this.detail = detail;
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
export interface RendererContractFailureDetail {
|
|
955
|
+
readonly operation: 'construct' | 'attach' | 'draw' | 'observe';
|
|
956
|
+
readonly cause: string;
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
/** Structured boundary failure while adapting an owner contract. */
|
|
960
|
+
export class RendererContractFailureError extends Error {
|
|
961
|
+
readonly code = 'renderer-contract-failed' as const;
|
|
962
|
+
readonly expected = 'renderer owner contracts remain valid at the public boundary';
|
|
963
|
+
readonly hint = 'repair the owner contract and retry the operation';
|
|
964
|
+
readonly detail: RendererContractFailureDetail;
|
|
965
|
+
|
|
966
|
+
constructor(operation: RendererContractFailureDetail['operation'], cause: string) {
|
|
967
|
+
super(`renderer ${operation} contract failed: ${cause}`);
|
|
968
|
+
this.name = 'RendererContractFailureError';
|
|
969
|
+
this.detail = { operation, cause };
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
export interface RendererOperationCause {
|
|
974
|
+
readonly code: string;
|
|
975
|
+
readonly expected: string;
|
|
976
|
+
readonly hint: string;
|
|
977
|
+
readonly detail?: unknown;
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
export interface RendererOperationDetailByCode {
|
|
981
|
+
readonly 'world-lease-invalid': {
|
|
982
|
+
readonly operation: 'attach' | 'draw';
|
|
983
|
+
readonly cause: RendererOperationCause;
|
|
984
|
+
};
|
|
985
|
+
readonly 'frame-input-invalid': {
|
|
986
|
+
readonly operation: 'draw' | 'set-profile';
|
|
987
|
+
readonly cause: RendererOperationCause;
|
|
988
|
+
};
|
|
989
|
+
readonly 'scene-projection-failed': {
|
|
990
|
+
readonly operation: 'draw';
|
|
991
|
+
readonly cause: RendererOperationCause;
|
|
992
|
+
};
|
|
993
|
+
readonly 'asset-binding-failed': {
|
|
994
|
+
readonly operation: 'draw';
|
|
995
|
+
readonly cause: RendererOperationCause;
|
|
996
|
+
};
|
|
997
|
+
readonly 'feature-plan-failed': {
|
|
998
|
+
readonly operation: 'draw';
|
|
999
|
+
readonly cause: RendererOperationCause;
|
|
1000
|
+
};
|
|
1001
|
+
readonly 'graph-build-failed': {
|
|
1002
|
+
readonly operation: 'draw' | 'set-profile';
|
|
1003
|
+
readonly cause: RendererOperationCause;
|
|
1004
|
+
};
|
|
1005
|
+
readonly 'device-operation-failed': {
|
|
1006
|
+
readonly operation: 'draw' | 'complete-frame' | 'renderer-event';
|
|
1007
|
+
readonly frameId?: number;
|
|
1008
|
+
readonly deviceGeneration?: number;
|
|
1009
|
+
readonly cause: RendererOperationCause;
|
|
1010
|
+
};
|
|
1011
|
+
readonly 'surface-unavailable': {
|
|
1012
|
+
readonly operation: 'release-surface' | 'restore-surface';
|
|
1013
|
+
readonly cause: RendererOperationCause;
|
|
1014
|
+
};
|
|
1015
|
+
readonly 'renderer-state-invalid': {
|
|
1016
|
+
readonly operation: 'draw' | 'set-profile' | 'recover' | 'dispose';
|
|
1017
|
+
readonly state: string;
|
|
1018
|
+
readonly cause?: RendererOperationCause;
|
|
1019
|
+
};
|
|
1020
|
+
readonly 'recovery-failed': {
|
|
1021
|
+
readonly operation: 'recover';
|
|
1022
|
+
readonly oldGeneration: number;
|
|
1023
|
+
readonly cause: RendererOperationCause;
|
|
1024
|
+
};
|
|
1025
|
+
readonly 'cleanup-failed': {
|
|
1026
|
+
readonly operation: 'dispose';
|
|
1027
|
+
readonly causes: readonly RendererOperationCause[];
|
|
1028
|
+
};
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
export type RendererOperationErrorCode = keyof RendererOperationDetailByCode;
|
|
1032
|
+
|
|
1033
|
+
const RENDERER_OPERATION_ERROR_POLICY = {
|
|
1034
|
+
'world-lease-invalid': {
|
|
1035
|
+
expected: 'every render World is represented by a live lease owned by this Renderer',
|
|
1036
|
+
hint: 'attach the World to this Renderer and use the returned lease',
|
|
1037
|
+
},
|
|
1038
|
+
'frame-input-invalid': {
|
|
1039
|
+
expected: 'the frame input references attached leases and a valid immutable RenderProfile',
|
|
1040
|
+
hint: 'repair the frame input and retry draw or setProfile',
|
|
1041
|
+
},
|
|
1042
|
+
'scene-projection-failed': {
|
|
1043
|
+
expected: 'the attached World projects into the renderer-owned RenderScene',
|
|
1044
|
+
hint: 'inspect the structured cause, repair the World publication, and retry draw',
|
|
1045
|
+
},
|
|
1046
|
+
'asset-binding-failed': {
|
|
1047
|
+
expected: 'all frame assets resolve to valid renderer-owned bindings',
|
|
1048
|
+
hint: 'inspect the structured cause, rebuild or cold-cook the asset, and retry draw',
|
|
1049
|
+
},
|
|
1050
|
+
'feature-plan-failed': {
|
|
1051
|
+
expected: 'every installed RenderFeature produces a valid declarative plan',
|
|
1052
|
+
hint: 'inspect the feature cause, repair its plan, and retry draw',
|
|
1053
|
+
},
|
|
1054
|
+
'graph-build-failed': {
|
|
1055
|
+
expected: 'the Standard graph builds from the active profile and feature plans',
|
|
1056
|
+
hint: 'inspect the graph cause, repair the profile or plan, and retry',
|
|
1057
|
+
},
|
|
1058
|
+
'device-operation-failed': {
|
|
1059
|
+
expected: 'the active device generation completes the renderer-owned operation',
|
|
1060
|
+
hint: 'inspect renderer state and the structured cause, then retry or recover',
|
|
1061
|
+
},
|
|
1062
|
+
'surface-unavailable': {
|
|
1063
|
+
expected: 'the presentation surface accepts the requested lifecycle operation',
|
|
1064
|
+
hint: 'inspect renderer state, then restore the surface or create a new Renderer',
|
|
1065
|
+
},
|
|
1066
|
+
'renderer-state-invalid': {
|
|
1067
|
+
expected: 'the Renderer is in a state that accepts the requested operation',
|
|
1068
|
+
hint: 'inspect renderer state and choose retry, restoreSurface, recover, or stop',
|
|
1069
|
+
},
|
|
1070
|
+
'recovery-failed': {
|
|
1071
|
+
expected: 'one recovery attempt publishes a complete replacement device generation',
|
|
1072
|
+
hint: 'inspect the structured cause and retry recover after the host-selected delay',
|
|
1073
|
+
},
|
|
1074
|
+
'cleanup-failed': {
|
|
1075
|
+
expected: 'Renderer disposal completes every registered cleanup in reverse ownership order',
|
|
1076
|
+
hint: 'inspect the ordered cleanup causes; the Renderer remains disposed and must not be reused',
|
|
1077
|
+
},
|
|
1078
|
+
} as const satisfies Readonly<
|
|
1079
|
+
Record<RendererOperationErrorCode, { readonly expected: string; readonly hint: string }>
|
|
1080
|
+
>;
|
|
1081
|
+
|
|
1082
|
+
/** Public renderer-operation failure with a code-narrowed structured detail. */
|
|
1083
|
+
export class RendererOperationError<Code extends RendererOperationErrorCode> extends Error {
|
|
1084
|
+
readonly code: Code;
|
|
1085
|
+
readonly expected: string;
|
|
1086
|
+
readonly hint: string;
|
|
1087
|
+
readonly detail: RendererOperationDetailByCode[Code];
|
|
1088
|
+
|
|
1089
|
+
constructor(code: Code, detail: RendererOperationDetailByCode[Code]) {
|
|
1090
|
+
const policy = RENDERER_OPERATION_ERROR_POLICY[code];
|
|
1091
|
+
super(`${code}: ${policy.expected}`);
|
|
1092
|
+
this.name = 'RendererOperationError';
|
|
1093
|
+
this.code = code;
|
|
1094
|
+
this.expected = policy.expected;
|
|
1095
|
+
this.hint = policy.hint;
|
|
1096
|
+
this.detail = detail;
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
export type RendererExpectedOperationError = {
|
|
1101
|
+
readonly [Code in RendererOperationErrorCode]: RendererOperationError<Code>;
|
|
1102
|
+
}[RendererOperationErrorCode];
|
|
1103
|
+
|
|
1104
|
+
// -- Points/Lines admission errors -------------------------------------------
|
|
1105
|
+
|
|
1106
|
+
export interface PointsLinesInvalidStyleDetail {
|
|
1107
|
+
readonly entity: number;
|
|
1108
|
+
readonly component: 'Points' | 'Lines' | 'Points/Lines';
|
|
1109
|
+
readonly field: string;
|
|
1110
|
+
readonly value: number | string | undefined;
|
|
1111
|
+
readonly expected: string;
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
export class PointsLinesInvalidStyleError extends Error {
|
|
1115
|
+
readonly code = 'points-lines-invalid-style' as const;
|
|
1116
|
+
readonly expected: string;
|
|
1117
|
+
readonly hint: string;
|
|
1118
|
+
readonly detail: PointsLinesInvalidStyleDetail;
|
|
1119
|
+
|
|
1120
|
+
constructor(detail: PointsLinesInvalidStyleDetail) {
|
|
1121
|
+
super(`invalid ${detail.component} style at ${detail.field}`);
|
|
1122
|
+
this.name = 'PointsLinesInvalidStyleError';
|
|
1123
|
+
this.expected = detail.expected;
|
|
1124
|
+
this.hint = `repair entity ${detail.entity} ${detail.component}.${detail.field} and retry admission`;
|
|
1125
|
+
this.detail = detail;
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
export interface PointsLinesTopologyMismatchDetail {
|
|
1130
|
+
readonly entity: number;
|
|
1131
|
+
readonly submesh: number;
|
|
1132
|
+
readonly expected: string;
|
|
1133
|
+
readonly actual: string;
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
export class PointsLinesTopologyMismatchError extends Error {
|
|
1137
|
+
readonly code = 'points-lines-topology-mismatch' as const;
|
|
1138
|
+
readonly expected: string;
|
|
1139
|
+
readonly hint: string;
|
|
1140
|
+
readonly detail: PointsLinesTopologyMismatchDetail;
|
|
1141
|
+
|
|
1142
|
+
constructor(detail: PointsLinesTopologyMismatchDetail) {
|
|
1143
|
+
super(`Points/Lines topology mismatch at submesh ${detail.submesh}`);
|
|
1144
|
+
this.name = 'PointsLinesTopologyMismatchError';
|
|
1145
|
+
this.expected = `submesh ${detail.submesh} topology is ${detail.expected}`;
|
|
1146
|
+
this.hint = `rebuild entity ${detail.entity} with ${detail.expected} geometry before retrying Points/Lines admission`;
|
|
1147
|
+
this.detail = detail;
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
export interface PointsLinesStyleUnsupportedDetail {
|
|
1152
|
+
readonly lane: string;
|
|
1153
|
+
readonly field: string;
|
|
1154
|
+
readonly member: string;
|
|
1155
|
+
readonly supported: readonly string[];
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
export class PointsLinesStyleUnsupportedError extends Error {
|
|
1159
|
+
readonly code = 'points-lines-style-unsupported' as const;
|
|
1160
|
+
readonly expected: string;
|
|
1161
|
+
readonly hint: string;
|
|
1162
|
+
readonly detail: PointsLinesStyleUnsupportedDetail;
|
|
1163
|
+
|
|
1164
|
+
constructor(detail: PointsLinesStyleUnsupportedDetail) {
|
|
1165
|
+
super(`unsupported Points/Lines ${detail.field} member ${detail.member}`);
|
|
1166
|
+
this.name = 'PointsLinesStyleUnsupportedError';
|
|
1167
|
+
this.expected = `${detail.field} is one of ${detail.supported.join(', ')}`;
|
|
1168
|
+
this.hint = `use a supported Points/Lines ${detail.field} member or wait for a later milestone`;
|
|
1169
|
+
this.detail = detail;
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
export interface PointsLinesMaterialUnsupportedDetail {
|
|
1174
|
+
readonly entity: number;
|
|
1175
|
+
readonly material: string;
|
|
1176
|
+
readonly pass: string;
|
|
1177
|
+
readonly module: string;
|
|
1178
|
+
readonly reason: string;
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
export class PointsLinesMaterialUnsupportedError extends Error {
|
|
1182
|
+
readonly code = 'points-lines-material-unsupported' as const;
|
|
1183
|
+
readonly expected = 'one engine-owned unlit forward MaterialAsset pass';
|
|
1184
|
+
readonly hint: string;
|
|
1185
|
+
readonly detail: PointsLinesMaterialUnsupportedDetail;
|
|
1186
|
+
|
|
1187
|
+
constructor(detail: PointsLinesMaterialUnsupportedDetail) {
|
|
1188
|
+
super(`Points/Lines material is unsupported on entity ${detail.entity}`);
|
|
1189
|
+
this.name = 'PointsLinesMaterialUnsupportedError';
|
|
1190
|
+
this.hint = `use Materials.unlit without a shadow-caster pass for entity ${detail.entity}`;
|
|
1191
|
+
this.detail = detail;
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
export interface PointsLinesBudgetExceededDetail {
|
|
1196
|
+
readonly lane: string;
|
|
1197
|
+
readonly requested: number;
|
|
1198
|
+
readonly limit: number;
|
|
1199
|
+
readonly unit: 'points' | 'segments' | 'vertices' | 'indices' | 'bytes' | 'draws';
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
export class PointsLinesBudgetExceededError extends Error {
|
|
1203
|
+
readonly code = 'points-lines-budget-exceeded' as const;
|
|
1204
|
+
readonly expected: string;
|
|
1205
|
+
readonly hint: string;
|
|
1206
|
+
readonly detail: PointsLinesBudgetExceededDetail;
|
|
1207
|
+
|
|
1208
|
+
constructor(detail: PointsLinesBudgetExceededDetail) {
|
|
1209
|
+
super(`Points/Lines ${detail.unit} budget exceeded`);
|
|
1210
|
+
this.name = 'PointsLinesBudgetExceededError';
|
|
1211
|
+
this.expected = `${detail.unit} <= ${detail.limit}`;
|
|
1212
|
+
this.hint = `reduce Points/Lines ${detail.unit} or split the entity into bounded equivalent batches`;
|
|
1213
|
+
this.detail = detail;
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
export interface PointsLinesPrepareFailedDetail {
|
|
1218
|
+
readonly owner: string;
|
|
1219
|
+
readonly generation: number;
|
|
1220
|
+
readonly stage: 'prepare';
|
|
1221
|
+
readonly cause: string;
|
|
1222
|
+
readonly lastKnownGood: boolean;
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
export class PointsLinesPrepareFailedError extends Error {
|
|
1226
|
+
readonly code = 'points-lines-prepare-failed' as const;
|
|
1227
|
+
readonly expected = 'the complete Points/Lines candidate validates before publication';
|
|
1228
|
+
readonly hint: string;
|
|
1229
|
+
readonly detail: PointsLinesPrepareFailedDetail;
|
|
1230
|
+
|
|
1231
|
+
constructor(detail: PointsLinesPrepareFailedDetail) {
|
|
1232
|
+
super(`Points/Lines prepare failed at generation ${detail.generation}`);
|
|
1233
|
+
this.name = 'PointsLinesPrepareFailedError';
|
|
1234
|
+
this.hint = detail.lastKnownGood
|
|
1235
|
+
? 'retain the last known good candidate, repair the producer, and retry prepare'
|
|
1236
|
+
: 'repair the producer and retry prepare; the failed first candidate produces zero draw';
|
|
1237
|
+
this.detail = detail;
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
|
|
1241
|
+
// -- RenderErrorCode / RenderError closed unions --------------------------------
|
|
1242
|
+
|
|
1243
|
+
/**
|
|
1244
|
+
* Closed union of render-cluster error codes. AI users perform exhaustive
|
|
1245
|
+
* `switch (err.code)` without default; TS guards completeness.
|
|
1246
|
+
*/
|
|
1247
|
+
export type RenderErrorCode = RenderError['code'];
|
|
1248
|
+
|
|
1249
|
+
/**
|
|
1250
|
+
* Closed union of the render-cluster structured error classes, each carrying a
|
|
1251
|
+
* `RenderErrorCode` discriminant on `.code`.
|
|
1252
|
+
*/
|
|
1253
|
+
export type RenderError =
|
|
1254
|
+
| LifecycleConstructionError
|
|
1255
|
+
| RendererExpectedOperationError
|
|
1256
|
+
| FrameReceiptStaleError
|
|
1257
|
+
| RendererContractFailureError
|
|
1258
|
+
| ObservationUnavailableError
|
|
1259
|
+
| ShadowInvalidConfigError
|
|
1260
|
+
| EquirectProjectionFailedError
|
|
1261
|
+
| HdrpLightBudgetExceededError
|
|
1262
|
+
| HdrpIndexListOverflowError
|
|
1263
|
+
| HdrpDeferredCapsInsufficientError
|
|
1264
|
+
| PointShadowAtlasUninitializedError
|
|
1265
|
+
| PointShadowAtlasBoundsViolationError
|
|
1266
|
+
| VideoUploadUnsupportedError
|
|
1267
|
+
| VertexStorageBufferUnavailableError
|
|
1268
|
+
| VertexColorVariantConflictError
|
|
1269
|
+
| SkinPaletteOverflowError
|
|
1270
|
+
| SkinMaterialMismatchError
|
|
1271
|
+
| MaterialSkinAttrMissingError
|
|
1272
|
+
| RenderFeatureRegistrationConflictError
|
|
1273
|
+
| RenderFeatureStageFailedError
|
|
1274
|
+
| RenderFeatureCapabilityMissingError
|
|
1275
|
+
| RenderFeaturePassOrderConflictError
|
|
1276
|
+
| RenderFeaturePreparationFailedError
|
|
1277
|
+
| RenderFeaturePreparedStateMismatchError
|
|
1278
|
+
| RenderFeatureDrawRecordingFailedError
|
|
1279
|
+
| PointsLinesInvalidStyleError
|
|
1280
|
+
| PointsLinesTopologyMismatchError
|
|
1281
|
+
| PointsLinesStyleUnsupportedError
|
|
1282
|
+
| PointsLinesMaterialUnsupportedError
|
|
1283
|
+
| PointsLinesBudgetExceededError
|
|
1284
|
+
| PointsLinesPrepareFailedError;
|