@forgeax/engine-render 0.1.21 → 0.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +150 -29
- package/dist/assembly/backend-contract.d.ts +13 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -1
- package/dist/assembly/device-feature-admission.d.ts.map +1 -1
- package/dist/assembly/factory.d.ts +14 -6
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +10 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/authoring.mjs +1 -1
- package/dist/{chunk-PCHBPYML.mjs → chunk-4L3P6DT5.mjs} +2 -2
- package/dist/chunk-4L3P6DT5.mjs.map +1 -0
- package/dist/{chunk-VFPLTKCU.mjs → chunk-4NPUASZR.mjs} +15 -4
- package/dist/chunk-4NPUASZR.mjs.map +1 -0
- package/dist/chunk-DIYW3M5D.mjs +5085 -0
- package/dist/chunk-DIYW3M5D.mjs.map +1 -0
- package/dist/chunk-FBC4R44J.mjs +1003 -0
- package/dist/chunk-FBC4R44J.mjs.map +1 -0
- package/dist/{chunk-FS2KNUQH.mjs → chunk-FF7K3FSO.mjs} +253 -489
- package/dist/chunk-FF7K3FSO.mjs.map +1 -0
- package/dist/chunk-HZUPSYW7.mjs +1104 -0
- package/dist/chunk-HZUPSYW7.mjs.map +1 -0
- package/dist/{chunk-6OPXDQ2E.mjs → chunk-QODA5UKU.mjs} +33 -294
- package/dist/chunk-QODA5UKU.mjs.map +1 -0
- package/dist/chunk-YALPS44A.mjs +296 -0
- package/dist/chunk-YALPS44A.mjs.map +1 -0
- package/dist/{chunk-5YADUCA7.mjs → chunk-ZUWKAZ2I.mjs} +585 -991
- package/dist/chunk-ZUWKAZ2I.mjs.map +1 -0
- package/dist/cluster-binner.d.ts +5 -0
- package/dist/cluster-binner.d.ts.map +1 -1
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts +4 -0
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/light-probe.d.ts +9 -0
- package/dist/components/light-probe.d.ts.map +1 -0
- package/dist/components/rect-area-light.d.ts +12 -0
- package/dist/components/rect-area-light.d.ts.map +1 -0
- package/dist/components/scene-instance.d.ts +4 -0
- package/dist/components/scene-instance.d.ts.map +1 -1
- package/dist/components/spot-light.d.ts +3 -0
- package/dist/components/spot-light.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +10437 -10044
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +8 -1
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/device/lifecycle-transaction.d.ts +2 -0
- package/dist/device/lifecycle-transaction.d.ts.map +1 -0
- package/dist/environment/lifecycle.d.ts.map +1 -1
- package/dist/errors/gpu-driven.d.ts +26 -0
- package/dist/errors/gpu-driven.d.ts.map +1 -0
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/recover.d.ts +9 -1
- package/dist/errors/recover.d.ts.map +1 -1
- package/dist/errors/render.d.ts +26 -1
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/gpu-driven.d.ts +50 -0
- package/dist/extract/gpu-driven.d.ts.map +1 -0
- package/dist/extract/visibility.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +34 -0
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/prepared-draw.d.ts +63 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -0
- package/dist/gpu-driven/production-raster.d.ts +98 -2
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/view-gpu.d.ts +64 -1
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-scene-schema.d.ts +14 -0
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +8 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-usage.d.ts +0 -1
- package/dist/gpu-usage.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +3 -3
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +90 -5
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +163 -1
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/internal.d.ts +9 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +23 -2
- package/dist/internal.mjs.map +1 -1
- package/dist/light-buffer-layout.d.ts +58 -149
- package/dist/light-buffer-layout.d.ts.map +1 -1
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +26 -12
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/light-frame.d.ts +3 -3
- package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/topology.d.ts +1 -1
- package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -1
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +2 -0
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +1 -1
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/prepare/extended-lighting/ltc-resources.d.ts +31 -0
- package/dist/prepare/extended-lighting/ltc-resources.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/resources.d.ts +72 -0
- package/dist/prepare/extended-lighting/resources.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/spot-modifiers.d.ts +42 -0
- package/dist/prepare/extended-lighting/spot-modifiers.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/state.d.ts +24 -0
- package/dist/prepare/extended-lighting/state.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +8 -6
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +50 -10
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame.d.ts +7 -3
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/gpu-timing.d.ts +19 -7
- package/dist/record/gpu-timing.d.ts.map +1 -1
- package/dist/record/helpers.d.ts +0 -20
- package/dist/record/helpers.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +6 -1
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +3 -1
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +57 -6
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +49 -2
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +1 -2
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/reflection/inspection.d.ts +10 -0
- package/dist/reflection/inspection.d.ts.map +1 -0
- package/dist/reflection/projection.d.ts +49 -0
- package/dist/reflection/projection.d.ts.map +1 -1
- package/dist/reflection/record-owner.d.ts +60 -0
- package/dist/reflection/record-owner.d.ts.map +1 -0
- package/dist/render-contract.d.ts +14 -8
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +7 -0
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +104 -16
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +12 -1
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/probe-blend-record.d.ts +22 -0
- package/dist/scene/probe-blend-record.d.ts.map +1 -0
- package/dist/scene/probe-blend.d.ts +142 -0
- package/dist/scene/probe-blend.d.ts.map +1 -0
- package/dist/scene/render-scene-types.d.ts +0 -6
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +103 -9
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/scene/visibility/bounds.d.ts +20 -0
- package/dist/scene/visibility/bounds.d.ts.map +1 -0
- package/dist/scene/visibility/budget.d.ts +16 -0
- package/dist/scene/visibility/budget.d.ts.map +1 -0
- package/dist/scene/visibility/facet.d.ts +73 -0
- package/dist/scene/visibility/facet.d.ts.map +1 -0
- package/dist/scene/visibility/gpu-frame-timing.d.ts +41 -0
- package/dist/scene/visibility/gpu-frame-timing.d.ts.map +1 -0
- package/dist/scene/visibility/gpu-lod.d.ts +46 -0
- package/dist/scene/visibility/gpu-lod.d.ts.map +1 -0
- package/dist/scene/visibility/inspection.d.ts +132 -0
- package/dist/scene/visibility/inspection.d.ts.map +1 -0
- package/dist/scene/visibility/lod-selector.d.ts +25 -0
- package/dist/scene/visibility/lod-selector.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-confidence.d.ts +81 -0
- package/dist/scene/visibility/occlusion-confidence.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-pass.d.ts +57 -0
- package/dist/scene/visibility/occlusion-pass.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-query-pool.d.ts +57 -0
- package/dist/scene/visibility/occlusion-query-pool.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-runtime.d.ts +96 -0
- package/dist/scene/visibility/occlusion-runtime.d.ts.map +1 -0
- package/dist/scene/visibility/types.d.ts +34 -0
- package/dist/scene/visibility/types.d.ts.map +1 -0
- package/dist/ssr/admission.d.ts +122 -0
- package/dist/ssr/admission.d.ts.map +1 -0
- package/dist/ssr/composition.d.ts +32 -0
- package/dist/ssr/composition.d.ts.map +1 -0
- package/dist/ssr/errors.d.ts +39 -0
- package/dist/ssr/errors.d.ts.map +1 -0
- package/dist/ssr/identity.d.ts +13 -0
- package/dist/ssr/identity.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +1 -1
- package/dist/temporal/frame-coordinator.d.ts +13 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -1
- package/dist/temporal/frame.d.ts +2 -0
- package/dist/temporal/frame.d.ts.map +1 -1
- package/dist/temporal/index.mjs +6 -5
- package/dist/temporal/view.d.ts +7 -0
- package/dist/temporal/view.d.ts.map +1 -1
- package/dist/tilemap-chunk-extract-system.d.ts +1 -1
- package/dist/typed-render-graph-primitives.d.ts +4 -0
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/volume/passes.d.ts +8 -4
- package/dist/volume/passes.d.ts.map +1 -1
- package/package.json +20 -20
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +5 -0
- package/src/__tests__/detached-inspection.integration.test.ts +6 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +13 -1
- package/src/__tests__/direct-light-snapshot.unit.test.ts +59 -3
- package/src/__tests__/environment-generation.integration.test.ts +16 -0
- package/src/__tests__/evidence-identity.ts +13 -0
- package/src/__tests__/evidence-identity.unit.test.ts +24 -0
- package/src/__tests__/extended-lighting-recovery.browser.test.ts +14 -0
- package/src/__tests__/extended-lighting-recovery.dawn.test.ts +14 -0
- package/src/__tests__/extended-lighting-recovery.integration.test.ts +81 -0
- package/src/__tests__/extended-lighting-resources.unit.test.ts +51 -0
- package/src/__tests__/extended-lighting-zero-feature.integration.test.ts +52 -0
- package/src/__tests__/factory-contract.integration.test.ts +33 -0
- package/src/__tests__/frame-observation.contract.test.ts +15 -0
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +146 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +1 -0
- package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +1 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +572 -9
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +66 -2
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +26 -1
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +89 -2
- package/src/__tests__/gpu-driven-view.browser.test.ts +3 -3
- package/src/__tests__/gpu-driven-view.dawn.test.ts +3 -3
- package/src/__tests__/gpu-driven-view.unit.test.ts +50 -0
- package/src/__tests__/gpu-lod-evidence.ts +188 -0
- package/src/__tests__/gpu-lod-fallback.integration.test.ts +10 -0
- package/src/__tests__/gpu-lod-indirect.integration.test.ts +40 -0
- package/src/__tests__/gpu-lod-parity.dawn.test.ts +29 -0
- package/src/__tests__/gpu-lod-readiness.integration.test.ts +52 -0
- package/src/__tests__/gpu-lod-schema.unit.test.ts +66 -0
- package/src/__tests__/gpu-lod-selector.unit.test.ts +28 -0
- package/src/__tests__/gpu-lod-silhouette.browser.test.ts +13 -0
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +66 -1
- package/src/__tests__/gpu-scene.dawn.test.ts +8 -1
- package/src/__tests__/gpu-scene.unit.test.ts +49 -3
- package/src/__tests__/light-buffer-layout.unit.test.ts +113 -3
- package/src/__tests__/light-inspection.unit.test.ts +55 -0
- package/src/__tests__/light-resource-error.unit.test.ts +43 -0
- package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +109 -0
- package/src/__tests__/lod-bounds.unit.test.ts +42 -0
- package/src/__tests__/lod-cpu-lane.integration.test.ts +55 -0
- package/src/__tests__/lod-cpu-no-change.perf.test.ts +19 -0
- package/src/__tests__/lod-gpu-frame-timing.unit.test.ts +49 -0
- package/src/__tests__/lod-multi-view.integration.test.ts +63 -0
- package/src/__tests__/lod-occlusion-device-loss.integration.test.ts +27 -0
- package/src/__tests__/lod-occlusion-final-decision.integration.test.ts +47 -0
- package/src/__tests__/lod-occlusion-inspection.integration.test.ts +217 -0
- package/src/__tests__/lod-occlusion-inspection.schema.test-d.ts +14 -0
- package/src/__tests__/lod-occlusion-inspection.unit.test.ts +72 -0
- package/src/__tests__/lod-occlusion-visual-evidence.ts +91 -0
- package/src/__tests__/lod-occlusion.browser.test.ts +15 -0
- package/src/__tests__/lod-occlusion.dawn.test.ts +20 -0
- package/src/__tests__/lod-selector.profile.test.ts +35 -0
- package/src/__tests__/lod-selector.unit.test.ts +68 -0
- package/src/__tests__/lod-visibility-identity.unit.test.ts +198 -0
- package/src/__tests__/lod-visibility-lifecycle.integration.test.ts +132 -0
- package/src/__tests__/ltc-resources.unit.test.ts +32 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +17 -0
- package/src/__tests__/occlusion-confidence.unit.test.ts +168 -0
- package/src/__tests__/occlusion-invalidation.integration.test.ts +37 -0
- package/src/__tests__/occlusion-pass-routing.unit.test.ts +16 -0
- package/src/__tests__/occlusion-pass.dawn.test.ts +20 -0
- package/src/__tests__/occlusion-pass.integration.test.ts +43 -0
- package/src/__tests__/occlusion-pass.rhi-null.test.ts +22 -0
- package/src/__tests__/occlusion-query-pool.rhi-null.test.ts +21 -0
- package/src/__tests__/occlusion-query-pool.unit.test.ts +95 -0
- package/src/__tests__/occlusion-query-ticket.integration.test.ts +47 -0
- package/src/__tests__/occlusion-query.dawn.test.ts +16 -0
- package/src/__tests__/occlusion-query.evidence.ts +178 -0
- package/src/__tests__/occlusion-query.rhi-null.test.ts +31 -0
- package/src/__tests__/occlusion-runtime.unit.test.ts +120 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
- package/src/__tests__/probe-bindings.unit.test.ts +200 -0
- package/src/__tests__/probe-blend-numeric.unit.test.ts +67 -0
- package/src/__tests__/probe-blend-oracle.unit.test.ts +136 -0
- package/src/__tests__/probe-capacity.integration.test.ts +97 -0
- package/src/__tests__/probe-recovery.integration.test.ts +104 -0
- package/src/__tests__/probe-scene-dirty.integration.test.ts +211 -0
- package/src/__tests__/profiler-phase-catalog.test.ts +4 -1
- package/src/__tests__/profiler-phase-token.test.ts +1 -0
- package/src/__tests__/rect-area-boundary.unit.test.ts +24 -0
- package/src/__tests__/reflection-fallback-graph.unit.test.ts +67 -0
- package/src/__tests__/reflection-fallback-inspection.unit.test.ts +77 -0
- package/src/__tests__/reflection-fallback-lifecycle.integration.test.ts +21 -0
- package/src/__tests__/reflection-fallback-projection.unit.test.ts +90 -0
- package/src/__tests__/reflection-fallback-source.unit.test.ts +32 -0
- package/src/__tests__/reflection-probe-owner-placement.unit.test.ts +39 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +120 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +1 -0
- package/src/__tests__/render-feature-docs.unit.test.ts +12 -7
- package/src/__tests__/render-graph-fallback.integration.test.ts +24 -0
- package/src/__tests__/render-perf/extended-lighting.bench.test.ts +66 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +447 -18
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +76 -0
- package/src/__tests__/skin-motion-regression.unit.test.ts +22 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +2 -2
- package/src/__tests__/spot-modifier-projection.unit.test.ts +70 -0
- package/src/__tests__/ssr-admission-matrix.integration.test.ts +206 -0
- package/src/__tests__/ssr-composition.unit.test.ts +46 -0
- package/src/__tests__/ssr-fallback-zero-work.bench.test.ts +94 -0
- package/src/__tests__/ssr-recovery-errors.unit.test.ts +58 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +67 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +7 -0
- package/src/__tests__/standard-lighting-inspection.integration.test.ts +1 -1
- package/src/__tests__/standard-lighting-write.unit.test.ts +66 -2
- package/src/__tests__/temporal-fallback-generation.integration.test.ts +16 -0
- package/src/__tests__/temporal-view.unit.test.ts +3 -3
- package/src/__tests__/transmission-prewarm.unit.test.ts +69 -0
- package/src/__tests__/visibility-budget.integration.test.ts +140 -0
- package/src/__tests__/visibility-budget.unit.test.ts +70 -0
- package/src/__tests__/visibility-extract.integration.test.ts +11 -6
- package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +6 -3
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +31 -28
- package/src/assembly/backend-contract.ts +13 -0
- package/src/assembly/device-feature-admission.ts +16 -9
- package/src/assembly/factory.ts +547 -93
- package/src/assembly/host-contract.ts +10 -0
- package/src/cluster-binner.ts +31 -0
- package/src/components/__tests__/lighting-authoring.unit.test.ts +39 -0
- package/src/components/__tests__/rect-area-light.unit.test.ts +33 -0
- package/src/components/index.ts +3 -0
- package/src/components/light-helpers.ts +52 -1
- package/src/components/light-probe.ts +13 -0
- package/src/components/rect-area-light.ts +15 -0
- package/src/components/scene-instance.ts +6 -0
- package/src/components/spot-light.ts +3 -0
- package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
- package/src/device/gpu-residency.ts +140 -9
- package/src/device/lifecycle-transaction.ts +12 -0
- package/src/environment/lifecycle.ts +8 -1
- package/src/errors/gpu-driven.ts +92 -0
- package/src/errors/index.ts +1 -0
- package/src/errors/recover.ts +32 -0
- package/src/errors/render.ts +55 -1
- package/src/extract/camera.ts +3 -3
- package/src/extract/gpu-driven.ts +108 -0
- package/src/extract/visibility.ts +0 -23
- package/src/gpu-driven/batch-topology.ts +206 -28
- package/src/gpu-driven/prepared-draw.ts +208 -0
- package/src/gpu-driven/production-raster.ts +953 -41
- package/src/gpu-driven/view-gpu.ts +411 -29
- package/src/gpu-scene-schema.ts +13 -0
- package/src/gpu-scene.ts +134 -65
- package/src/gpu-usage.ts +0 -1
- package/src/hdrp-buffers.ts +6 -6
- package/src/index.ts +74 -0
- package/src/inspection-types.ts +220 -1
- package/src/internal.ts +38 -0
- package/src/light-buffer-layout.ts +154 -324
- package/src/materials.ts +16 -2
- package/src/pbr-pipeline.ts +151 -45
- package/src/pipeline/standard-forward-lane.ts +47 -0
- package/src/pipeline/standard-lighting/graph.ts +2 -1
- package/src/pipeline/standard-lighting/light-frame.ts +3 -2
- package/src/pipeline/standard-lighting/topology.ts +1 -1
- package/src/pipeline/standard-lighting/transport.ts +2 -1
- package/src/pipeline/standard-pipeline.ts +2 -0
- package/src/pipeline-builder.ts +5 -2
- package/src/pipeline-spec.ts +12 -1
- package/src/plugin.ts +4 -0
- package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +56 -0
- package/src/prepare/extended-lighting/ltc-resources.ts +136 -0
- package/src/prepare/extended-lighting/resources.ts +389 -0
- package/src/prepare/extended-lighting/spot-modifiers.ts +194 -0
- package/src/prepare/extended-lighting/state.ts +92 -0
- package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
- package/src/record/__tests__/temporal-payload.unit.test.ts +23 -1
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +20 -1
- package/src/record/frame-lighting.ts +252 -53
- package/src/record/frame-snapshot.ts +57 -12
- package/src/record/frame.ts +410 -93
- package/src/record/gpu-timing.ts +108 -44
- package/src/record/helpers.ts +0 -58
- package/src/record/main-pass-geometry.ts +204 -39
- package/src/record/main-pass-material.ts +8 -1
- package/src/record/main-pass-sprite-draws.ts +52 -85
- package/src/record/mesh-ssbo.ts +47 -36
- package/src/record/render-context.ts +65 -4
- package/src/record/shadow-pass.ts +66 -40
- package/src/record/typed-frame-graph.ts +225 -83
- package/src/record/view-ubo.ts +14 -24
- package/src/reflection/inspection.ts +67 -0
- package/src/reflection/projection.ts +196 -1
- package/src/reflection/record-owner.ts +1283 -0
- package/src/render-contract.ts +17 -5
- package/src/render-pipeline.ts +5 -0
- package/src/render-system-extract.ts +493 -134
- package/src/render-system.ts +811 -615
- package/src/scene/__tests__/changed-block-summary.candidate.test.ts +36 -0
- package/src/scene/probe-blend-record.ts +54 -0
- package/src/scene/probe-blend.ts +813 -0
- package/src/scene/render-scene-types.ts +0 -7
- package/src/scene/render-scene.ts +848 -183
- package/src/scene/visibility/bounds.ts +57 -0
- package/src/scene/visibility/budget.ts +40 -0
- package/src/scene/visibility/facet.ts +400 -0
- package/src/scene/visibility/gpu-frame-timing.ts +101 -0
- package/src/scene/visibility/gpu-lod.ts +119 -0
- package/src/scene/visibility/inspection.ts +313 -0
- package/src/scene/visibility/lod-selector.ts +84 -0
- package/src/scene/visibility/occlusion-confidence.ts +478 -0
- package/src/scene/visibility/occlusion-pass.ts +165 -0
- package/src/scene/visibility/occlusion-query-pool.ts +178 -0
- package/src/scene/visibility/occlusion-runtime.ts +672 -0
- package/src/scene/visibility/types.ts +50 -0
- package/src/ssr/admission.ts +451 -0
- package/src/ssr/composition.ts +73 -0
- package/src/ssr/errors.ts +76 -0
- package/src/ssr/identity.ts +12 -0
- package/src/systems/skin-palette-allocator.ts +1 -1
- package/src/temporal/frame-coordinator.ts +26 -0
- package/src/temporal/frame.ts +14 -1
- package/src/temporal/view.ts +11 -0
- package/src/tilemap-chunk-extract-system.ts +4 -4
- package/src/typed-render-graph-primitives.ts +48 -0
- package/src/volume/passes.ts +46 -49
- package/dist/.tsbuildinfo +0 -1
- package/dist/chunk-5YADUCA7.mjs.map +0 -1
- package/dist/chunk-6OPXDQ2E.mjs.map +0 -1
- package/dist/chunk-BXBQQKFQ.mjs +0 -67
- package/dist/chunk-BXBQQKFQ.mjs.map +0 -1
- package/dist/chunk-FS2KNUQH.mjs.map +0 -1
- package/dist/chunk-PCHBPYML.mjs.map +0 -1
- package/dist/chunk-VFPLTKCU.mjs.map +0 -1
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { RenderIntentInvalidError,
|
|
1
|
+
import { RenderIntentInvalidError, ShadowInvalidConfigError, VolumeOwnerConflictError, VolumeDensityShapeMismatchError, VolumeInvalidBoundsError, VolumeInvalidParametersError } from './chunk-QODA5UKU.mjs';
|
|
2
2
|
import { defineComponent, Entity } from '@forgeax/engine-ecs';
|
|
3
3
|
import { TONEMAP_SHADER_MODE } from '@forgeax/engine-shader';
|
|
4
|
-
import { err, ok } from '@forgeax/engine-types';
|
|
5
|
-
import {
|
|
4
|
+
import { R_MIN, err, ok } from '@forgeax/engine-types';
|
|
5
|
+
import { SpawnLightInvalidBoundsError } from '@forgeax/engine-ecs/projection';
|
|
6
6
|
import { Transform, projectHierarchy } from '@forgeax/engine-scene';
|
|
7
|
-
import { createWorldProjection } from '@forgeax/engine-ecs/projection';
|
|
8
7
|
|
|
9
8
|
var Atmosphere = defineComponent("Atmosphere", {
|
|
10
9
|
turbidity: { type: "f32", default: 2 },
|
|
@@ -283,6 +282,221 @@ var Instances = defineComponent("Instances", {
|
|
|
283
282
|
var Layer = defineComponent("Layer", {
|
|
284
283
|
value: { type: "i32", default: 0 }
|
|
285
284
|
});
|
|
285
|
+
|
|
286
|
+
// src/components/light-helpers.ts
|
|
287
|
+
var RANGE_ZERO_FALLBACK_INV_R2 = 1e8;
|
|
288
|
+
var DEG_TO_RAD = Math.PI / 180;
|
|
289
|
+
var PCSS_RADIUS_MIN = 1e-4;
|
|
290
|
+
var PCSS_RADIUS_MAX = 0.05;
|
|
291
|
+
var PCSS_PENUMBRA_MIN = 1;
|
|
292
|
+
var PCSS_PENUMBRA_MAX = 64;
|
|
293
|
+
function degToCos(deg) {
|
|
294
|
+
return Math.cos(deg * DEG_TO_RAD);
|
|
295
|
+
}
|
|
296
|
+
function computeInvRangeSquared(range) {
|
|
297
|
+
if (range === Number.POSITIVE_INFINITY) return 0;
|
|
298
|
+
if (range === 0) return RANGE_ZERO_FALLBACK_INV_R2;
|
|
299
|
+
return 1 / (range * range);
|
|
300
|
+
}
|
|
301
|
+
function validateDirection(componentName, direction) {
|
|
302
|
+
const dir = direction;
|
|
303
|
+
if (dir === void 0 || (dir[0] ?? 0) === 0 && (dir[1] ?? 0) === 0 && (dir[2] ?? 0) === 0) {
|
|
304
|
+
return new SpawnLightInvalidBoundsError(
|
|
305
|
+
componentName,
|
|
306
|
+
"direction",
|
|
307
|
+
dir === void 0 ? [0, 0, 0] : [dir[0] ?? 0, dir[1] ?? 0, dir[2] ?? 0]
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
function validateDirectionalLightData(data) {
|
|
313
|
+
const directionError = validateDirection(
|
|
314
|
+
"DirectionalLight",
|
|
315
|
+
data.direction
|
|
316
|
+
);
|
|
317
|
+
if (directionError !== null) return err(directionError);
|
|
318
|
+
if (data.castShadow === false) return ok(void 0);
|
|
319
|
+
const mapSize = data.mapSize ?? 2048;
|
|
320
|
+
if (mapSize < 1) {
|
|
321
|
+
return err(new ShadowInvalidConfigError("mapSize", mapSize, 1));
|
|
322
|
+
}
|
|
323
|
+
const cascadeCount = data.cascadeCount ?? 4;
|
|
324
|
+
if (cascadeCount < 1 || cascadeCount > 4 || !Number.isInteger(cascadeCount)) {
|
|
325
|
+
return err(new ShadowInvalidConfigError("cascadeCount", cascadeCount, 1, 4));
|
|
326
|
+
}
|
|
327
|
+
const splitLambda = data.splitLambda ?? 0.75;
|
|
328
|
+
if (splitLambda < 0 || splitLambda > 1) {
|
|
329
|
+
return err(new ShadowInvalidConfigError("splitLambda", splitLambda, 0, 1));
|
|
330
|
+
}
|
|
331
|
+
const cascadeBlend = data.cascadeBlend ?? 0.2;
|
|
332
|
+
if (cascadeBlend < 0 || cascadeBlend > 0.5) {
|
|
333
|
+
return err(new ShadowInvalidConfigError("cascadeBlend", cascadeBlend, 0, 0.5));
|
|
334
|
+
}
|
|
335
|
+
const shadowDistance = data.shadowDistance ?? 200;
|
|
336
|
+
if (shadowDistance <= 0) {
|
|
337
|
+
return err(new ShadowInvalidConfigError("shadowDistance", shadowDistance, 0, ">"));
|
|
338
|
+
}
|
|
339
|
+
const shadowFilter = data.shadowFilter ?? DirectionalShadowFilterValue.pcf3;
|
|
340
|
+
const allowedFilters = Object.values(DirectionalShadowFilterValue);
|
|
341
|
+
if (!Number.isFinite(shadowFilter) || !allowedFilters.includes(shadowFilter)) {
|
|
342
|
+
return err(
|
|
343
|
+
new ShadowInvalidConfigError(
|
|
344
|
+
"shadowFilter",
|
|
345
|
+
shadowFilter,
|
|
346
|
+
{ kind: "allowed-values", values: allowedFilters },
|
|
347
|
+
void 0,
|
|
348
|
+
"one of [pcf1, pcf3, pcf5, pcssMedium, pcssHigh]"
|
|
349
|
+
)
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
if (shadowFilter === DirectionalShadowFilterValue.pcssMedium || shadowFilter === DirectionalShadowFilterValue.pcssHigh) {
|
|
353
|
+
const shadowAngularRadius = data.shadowAngularRadius ?? 465e-5;
|
|
354
|
+
if (!Number.isFinite(shadowAngularRadius)) {
|
|
355
|
+
return err(
|
|
356
|
+
new ShadowInvalidConfigError("shadowAngularRadius", shadowAngularRadius, {
|
|
357
|
+
kind: "range",
|
|
358
|
+
min: PCSS_RADIUS_MIN,
|
|
359
|
+
max: PCSS_RADIUS_MAX
|
|
360
|
+
})
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
if (shadowAngularRadius < PCSS_RADIUS_MIN || shadowAngularRadius > PCSS_RADIUS_MAX) {
|
|
364
|
+
return err(
|
|
365
|
+
new ShadowInvalidConfigError("shadowAngularRadius", shadowAngularRadius, {
|
|
366
|
+
kind: "range",
|
|
367
|
+
min: PCSS_RADIUS_MIN,
|
|
368
|
+
max: PCSS_RADIUS_MAX
|
|
369
|
+
})
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
const maxPenumbraTexels = data.maxPenumbraTexels ?? 32;
|
|
373
|
+
if (!Number.isFinite(maxPenumbraTexels) || !Number.isInteger(maxPenumbraTexels) || maxPenumbraTexels < PCSS_PENUMBRA_MIN || maxPenumbraTexels > PCSS_PENUMBRA_MAX) {
|
|
374
|
+
return err(
|
|
375
|
+
new ShadowInvalidConfigError(
|
|
376
|
+
"maxPenumbraTexels",
|
|
377
|
+
maxPenumbraTexels,
|
|
378
|
+
{ kind: "range", min: PCSS_PENUMBRA_MIN, max: PCSS_PENUMBRA_MAX },
|
|
379
|
+
void 0,
|
|
380
|
+
"a finite integer in [1, 64]"
|
|
381
|
+
)
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return ok(void 0);
|
|
386
|
+
}
|
|
387
|
+
function validateSpotLightData(data) {
|
|
388
|
+
const directionError = validateDirection(
|
|
389
|
+
"SpotLight",
|
|
390
|
+
data.direction
|
|
391
|
+
);
|
|
392
|
+
if (directionError !== null) return err(directionError);
|
|
393
|
+
if (data.castShadow === false) return ok(void 0);
|
|
394
|
+
const range = data.range ?? 10;
|
|
395
|
+
if (typeof range !== "number" || Number.isNaN(range) || range < 0) {
|
|
396
|
+
return err(new SpawnLightInvalidBoundsError("SpotLight", "range", range));
|
|
397
|
+
}
|
|
398
|
+
const innerConeDeg = data.innerConeDeg ?? 0;
|
|
399
|
+
const outerConeDeg = data.outerConeDeg ?? 45;
|
|
400
|
+
if (outerConeDeg > 90) {
|
|
401
|
+
return err(new SpawnLightInvalidBoundsError("SpotLight", "outerNinety", outerConeDeg));
|
|
402
|
+
}
|
|
403
|
+
if (outerConeDeg <= innerConeDeg) {
|
|
404
|
+
return err(new SpawnLightInvalidBoundsError("SpotLight", "innerOuter", outerConeDeg));
|
|
405
|
+
}
|
|
406
|
+
const mapSize = data.mapSize ?? 2048;
|
|
407
|
+
if (mapSize < 1) return err(new ShadowInvalidConfigError("mapSize", mapSize, 1));
|
|
408
|
+
const nearPlane = data.nearPlane;
|
|
409
|
+
const farPlane = data.farPlane;
|
|
410
|
+
if (nearPlane !== void 0 && farPlane !== void 0 && farPlane <= nearPlane) {
|
|
411
|
+
return err(new ShadowInvalidConfigError("farPlane", farPlane, nearPlane));
|
|
412
|
+
}
|
|
413
|
+
const pcfKernelSize = data.pcfKernelSize ?? 3;
|
|
414
|
+
if (pcfKernelSize < 1 || pcfKernelSize % 2 === 0) {
|
|
415
|
+
return err(
|
|
416
|
+
new ShadowInvalidConfigError(
|
|
417
|
+
"pcfKernelSize",
|
|
418
|
+
pcfKernelSize,
|
|
419
|
+
{ kind: "lower-bound", operator: ">=", value: 1 },
|
|
420
|
+
void 0,
|
|
421
|
+
"an odd integer >= 1"
|
|
422
|
+
)
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
const shadowIntensity = data.shadowIntensity ?? 1;
|
|
426
|
+
if (!Number.isFinite(shadowIntensity) || shadowIntensity < 0 || shadowIntensity > 1) {
|
|
427
|
+
return err(new ShadowInvalidConfigError("shadowIntensity", shadowIntensity, 0, 1));
|
|
428
|
+
}
|
|
429
|
+
return ok(void 0);
|
|
430
|
+
}
|
|
431
|
+
function validatePointLightData(data) {
|
|
432
|
+
const range = data.range ?? 10;
|
|
433
|
+
if (typeof range !== "number" || Number.isNaN(range) || range < 0) {
|
|
434
|
+
return err(new SpawnLightInvalidBoundsError("PointLight", "range", range));
|
|
435
|
+
}
|
|
436
|
+
return ok(void 0);
|
|
437
|
+
}
|
|
438
|
+
function validatePointLightShadowData(data) {
|
|
439
|
+
const mapSize = data.mapSize ?? 512;
|
|
440
|
+
if (mapSize < 1) return err(new ShadowInvalidConfigError("mapSize", mapSize, 1));
|
|
441
|
+
const nearPlane = data.nearPlane ?? 0.1;
|
|
442
|
+
const farPlane = data.farPlane ?? 25;
|
|
443
|
+
if (farPlane <= nearPlane) {
|
|
444
|
+
return err(new ShadowInvalidConfigError("farPlane", farPlane, nearPlane));
|
|
445
|
+
}
|
|
446
|
+
const pcfKernelSize = data.pcfKernelSize ?? 3;
|
|
447
|
+
if (pcfKernelSize < 1 || pcfKernelSize % 2 === 0) {
|
|
448
|
+
return err(
|
|
449
|
+
new ShadowInvalidConfigError(
|
|
450
|
+
"pcfKernelSize",
|
|
451
|
+
pcfKernelSize,
|
|
452
|
+
{ kind: "lower-bound", operator: ">=", value: 1 },
|
|
453
|
+
void 0,
|
|
454
|
+
"an odd integer >= 1"
|
|
455
|
+
)
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
return ok(void 0);
|
|
459
|
+
}
|
|
460
|
+
function validateRectAreaLightData(data) {
|
|
461
|
+
const intensity = data.intensity ?? 1;
|
|
462
|
+
if (typeof intensity !== "number" || !Number.isFinite(intensity) || intensity < 0) {
|
|
463
|
+
return err(new SpawnLightInvalidBoundsError("RectAreaLight", "intensity", intensity));
|
|
464
|
+
}
|
|
465
|
+
const color = data.color ?? [1, 1, 1];
|
|
466
|
+
if (color.length !== 3 || Array.from(color).some(
|
|
467
|
+
(value) => typeof value !== "number" || !Number.isFinite(value) || value < 0
|
|
468
|
+
)) {
|
|
469
|
+
return err(new SpawnLightInvalidBoundsError("RectAreaLight", "color", Array.from(color)));
|
|
470
|
+
}
|
|
471
|
+
for (const field of ["width", "height", "range"]) {
|
|
472
|
+
const value = data[field] ?? (field === "range" ? 10 : 1);
|
|
473
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
|
|
474
|
+
return err(new SpawnLightInvalidBoundsError("RectAreaLight", field, value));
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
return ok(void 0);
|
|
478
|
+
}
|
|
479
|
+
function validateLightProbeData(data) {
|
|
480
|
+
const irradiance = data.irradiance;
|
|
481
|
+
if (irradiance === void 0 || irradiance.length !== 27 || Array.from(irradiance).some((value) => typeof value !== "number" || !Number.isFinite(value))) {
|
|
482
|
+
return err(
|
|
483
|
+
new SpawnLightInvalidBoundsError(
|
|
484
|
+
"LightProbe",
|
|
485
|
+
"irradiance",
|
|
486
|
+
irradiance === void 0 ? [] : Array.from(irradiance)
|
|
487
|
+
)
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
const radius = data.radius ?? R_MIN;
|
|
491
|
+
if (typeof radius !== "number" || !Number.isFinite(radius) || radius < R_MIN) {
|
|
492
|
+
return err(new SpawnLightInvalidBoundsError("LightProbe", "radius", radius));
|
|
493
|
+
}
|
|
494
|
+
return ok(void 0);
|
|
495
|
+
}
|
|
496
|
+
var LightProbe = defineComponent("LightProbe", {
|
|
497
|
+
irradiance: { type: "array<f32, 27>" },
|
|
498
|
+
radius: { type: "f32", default: R_MIN }
|
|
499
|
+
});
|
|
286
500
|
var Lines = defineComponent(
|
|
287
501
|
"Lines",
|
|
288
502
|
{
|
|
@@ -357,6 +571,13 @@ var schema = {
|
|
|
357
571
|
data: "buffer"
|
|
358
572
|
};
|
|
359
573
|
var PostProcessParams = defineComponent("PostProcessParams", schema);
|
|
574
|
+
var RectAreaLight = defineComponent("RectAreaLight", {
|
|
575
|
+
color: { type: "array<f32, 3>", default: new Float32Array([1, 1, 1]) },
|
|
576
|
+
intensity: { type: "f32", default: 1 },
|
|
577
|
+
width: { type: "f32", default: 1 },
|
|
578
|
+
height: { type: "f32", default: 1 },
|
|
579
|
+
range: { type: "f32", default: 10 }
|
|
580
|
+
});
|
|
360
581
|
var REFLECTION_PROBE_UPDATE_ONCE = 0;
|
|
361
582
|
var REFLECTION_PROBE_UPDATE_ON_CHANGE = 1;
|
|
362
583
|
var REFLECTION_PROBE_UPDATE_CONTINUOUS = 2;
|
|
@@ -434,6 +655,9 @@ var SpotLight = defineComponent("SpotLight", {
|
|
|
434
655
|
range: { type: "f32", default: 10 },
|
|
435
656
|
innerConeDeg: { type: "f32", default: 0 },
|
|
436
657
|
outerConeDeg: { type: "f32", default: 45 },
|
|
658
|
+
iesProfile: { type: "shared<IesProfileAsset>" },
|
|
659
|
+
cookie: { type: "shared<TextureAsset>" },
|
|
660
|
+
rollDeg: { type: "f32", default: 0 },
|
|
437
661
|
// Shadow opt-out gate: defaults to true so zero-config spawns cast shadows.
|
|
438
662
|
castShadow: { type: "bool", default: true },
|
|
439
663
|
// 7 shadow fields aligned with the shared light shadow vocabulary.
|
|
@@ -486,217 +710,32 @@ var Visibility = defineComponent(
|
|
|
486
710
|
}
|
|
487
711
|
}
|
|
488
712
|
);
|
|
489
|
-
function invalidStyle(input, component, field, value, expected) {
|
|
490
|
-
return err(new PointsLinesInvalidStyleError({ entity: input.entity, component, field, value, expected }));
|
|
491
|
-
}
|
|
492
|
-
function topologyMismatch(input, submesh, expected, actual) {
|
|
493
|
-
return err(new PointsLinesTopologyMismatchError({ entity: input.entity, submesh, expected, actual }));
|
|
494
|
-
}
|
|
495
|
-
function checkStyle(input) {
|
|
496
|
-
const hasPoints = input.points !== void 0;
|
|
497
|
-
const hasLines = input.lines !== void 0;
|
|
498
|
-
if (hasPoints && hasLines) {
|
|
499
|
-
return invalidStyle(
|
|
500
|
-
input,
|
|
501
|
-
"Points/Lines",
|
|
502
|
-
"components",
|
|
503
|
-
"Points + Lines",
|
|
504
|
-
"exactly one style component"
|
|
505
|
-
);
|
|
506
|
-
}
|
|
507
|
-
if (!hasPoints && !hasLines) {
|
|
508
|
-
return invalidStyle(input, "Points/Lines", "components", void 0, "one style component");
|
|
509
|
-
}
|
|
510
|
-
if (hasPoints) {
|
|
511
|
-
const sizePx = input.points?.sizePx ?? 4;
|
|
512
|
-
const shapeValue = input.points?.shape ?? PointShapeValue.square;
|
|
513
|
-
const shape = pointShapeFromU32(shapeValue);
|
|
514
|
-
if (!Number.isFinite(sizePx) || sizePx <= 0) {
|
|
515
|
-
return invalidStyle(input, "Points", "sizePx", sizePx, "finite sizePx > 0");
|
|
516
|
-
}
|
|
517
|
-
if (shape === void 0) {
|
|
518
|
-
return invalidStyle(input, "Points", "shape", shapeValue, "shape is 'square' or 'circle'");
|
|
519
|
-
}
|
|
520
|
-
return ok({ component: "Points", shape, sizePx });
|
|
521
|
-
}
|
|
522
|
-
const widthPx = input.lines?.widthPx ?? 1;
|
|
523
|
-
if (!Number.isFinite(widthPx) || widthPx <= 0) {
|
|
524
|
-
return invalidStyle(input, "Lines", "widthPx", widthPx, "finite widthPx > 0");
|
|
525
|
-
}
|
|
526
|
-
return ok({ component: "Lines", widthPx });
|
|
527
|
-
}
|
|
528
|
-
function checkTopology(input, component) {
|
|
529
|
-
const expected = component === "Points" ? "point-list" : "line-list";
|
|
530
|
-
let pointCount = 0;
|
|
531
|
-
let segmentCount = 0;
|
|
532
|
-
const acceptedSubmeshes = [];
|
|
533
|
-
let sawNonEmpty = false;
|
|
534
|
-
for (const [submeshIndex, submesh] of input.mesh.submeshes.entries()) {
|
|
535
|
-
const indexed = input.mesh.indices !== void 0 && submesh.indexCount > 0;
|
|
536
|
-
const elementCount = indexed ? submesh.indexCount : submesh.vertexCount;
|
|
537
|
-
if (elementCount === 0) continue;
|
|
538
|
-
sawNonEmpty = true;
|
|
539
|
-
if (component === "Lines" && submesh.topology === "line-strip") {
|
|
540
|
-
return err(
|
|
541
|
-
new PointsLinesStyleUnsupportedError({
|
|
542
|
-
lane: "admission",
|
|
543
|
-
field: "topology",
|
|
544
|
-
member: "line-strip",
|
|
545
|
-
supported: ["line-list"]
|
|
546
|
-
})
|
|
547
|
-
);
|
|
548
|
-
}
|
|
549
|
-
if (submesh.topology !== expected) {
|
|
550
|
-
return topologyMismatch(input, submeshIndex, expected, submesh.topology);
|
|
551
|
-
}
|
|
552
|
-
if (component === "Lines" && elementCount % 2 !== 0) {
|
|
553
|
-
return topologyMismatch(input, submeshIndex, "line-list pairs", "line-list odd tail");
|
|
554
|
-
}
|
|
555
|
-
acceptedSubmeshes.push(submeshIndex);
|
|
556
|
-
if (component === "Points") pointCount += elementCount;
|
|
557
|
-
else segmentCount += elementCount / 2;
|
|
558
|
-
}
|
|
559
|
-
if (!sawNonEmpty) return topologyMismatch(input, 0, expected, "empty-range");
|
|
560
|
-
return ok({ pointCount, segmentCount, submeshes: acceptedSubmeshes });
|
|
561
|
-
}
|
|
562
|
-
function checkMaterial(input) {
|
|
563
|
-
const passes = input.material.passes ?? [];
|
|
564
|
-
const unlitModules = /* @__PURE__ */ new Set(["forgeax_material::unlit", "forgeax::default-unlit"]);
|
|
565
|
-
if (passes.length !== 1 || passes[0] === void 0) {
|
|
566
|
-
const pass2 = passes.find(
|
|
567
|
-
(candidate) => candidate.name === "deferred" || candidate.name === "shadow-caster"
|
|
568
|
-
) ?? passes[0];
|
|
569
|
-
return err(
|
|
570
|
-
new PointsLinesMaterialUnsupportedError({
|
|
571
|
-
entity: input.entity,
|
|
572
|
-
material: input.materialId ?? "<anonymous>",
|
|
573
|
-
pass: pass2?.name ?? "<empty>",
|
|
574
|
-
module: pass2?.program.module ?? "<empty>",
|
|
575
|
-
reason: "points-lines admission requires one unlit forward pass"
|
|
576
|
-
})
|
|
577
|
-
);
|
|
578
|
-
}
|
|
579
|
-
const pass = passes[0];
|
|
580
|
-
const lightMode = pass.renderState?.tags?.LightMode;
|
|
581
|
-
if (!unlitModules.has(pass.program.module) || pass.name !== "forward" || lightMode === "ShadowCaster") {
|
|
582
|
-
return err(
|
|
583
|
-
new PointsLinesMaterialUnsupportedError({
|
|
584
|
-
entity: input.entity,
|
|
585
|
-
material: input.materialId ?? "<anonymous>",
|
|
586
|
-
pass: pass.name,
|
|
587
|
-
module: pass.program.module,
|
|
588
|
-
reason: "points-lines admission requires an engine-owned unlit forward pass"
|
|
589
|
-
})
|
|
590
|
-
);
|
|
591
|
-
}
|
|
592
|
-
return ok(void 0);
|
|
593
|
-
}
|
|
594
|
-
function admitPointsLines(input) {
|
|
595
|
-
const style = checkStyle(input);
|
|
596
|
-
if (!style.ok) return style;
|
|
597
|
-
const topology = checkTopology(input, style.value.component);
|
|
598
|
-
if (!topology.ok) return topology;
|
|
599
|
-
const material = checkMaterial(input);
|
|
600
|
-
if (!material.ok) return material;
|
|
601
|
-
if (style.value.component === "Points" && input.limits?.maxPoints !== void 0) {
|
|
602
|
-
if (topology.value.pointCount > input.limits.maxPoints) {
|
|
603
|
-
return err(
|
|
604
|
-
new PointsLinesBudgetExceededError({
|
|
605
|
-
lane: "admission",
|
|
606
|
-
requested: topology.value.pointCount,
|
|
607
|
-
limit: input.limits.maxPoints,
|
|
608
|
-
unit: "points"
|
|
609
|
-
})
|
|
610
|
-
);
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
if (style.value.component === "Lines" && input.limits?.maxSegments !== void 0) {
|
|
614
|
-
if (topology.value.segmentCount > input.limits.maxSegments) {
|
|
615
|
-
return err(
|
|
616
|
-
new PointsLinesBudgetExceededError({
|
|
617
|
-
lane: "admission",
|
|
618
|
-
requested: topology.value.segmentCount,
|
|
619
|
-
limit: input.limits.maxSegments,
|
|
620
|
-
unit: "segments"
|
|
621
|
-
})
|
|
622
|
-
);
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
return ok({ ...style.value, ...topology.value });
|
|
626
|
-
}
|
|
627
713
|
|
|
628
|
-
// src/
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
const
|
|
638
|
-
const
|
|
714
|
+
// src/scene/visibility/budget.ts
|
|
715
|
+
var DEFAULT_CONFIGURED_QUERY_BUDGET = 2048;
|
|
716
|
+
var MAX_QUERY_BUDGET = 4096;
|
|
717
|
+
var VISIBILITY_CANDIDATE_COUNT = 1e5;
|
|
718
|
+
var VISIBILITY_OCCLUDED_COUNT = 9e4;
|
|
719
|
+
function createVisibilityBudget(configuredQueryBudget = DEFAULT_CONFIGURED_QUERY_BUDGET) {
|
|
720
|
+
if (!Number.isSafeInteger(configuredQueryBudget) || configuredQueryBudget <= 0) {
|
|
721
|
+
throw new RangeError("configuredQueryBudget must be a positive safe integer");
|
|
722
|
+
}
|
|
723
|
+
const effectiveQueryBudget = Math.min(configuredQueryBudget, MAX_QUERY_BUDGET);
|
|
724
|
+
const oneSweepCandidates = oneSweep(VISIBILITY_CANDIDATE_COUNT, effectiveQueryBudget);
|
|
725
|
+
const oneSweepOccluded = oneSweep(VISIBILITY_OCCLUDED_COUNT, effectiveQueryBudget);
|
|
726
|
+
const retestSubmits = Math.max(6, oneSweepOccluded);
|
|
639
727
|
return Object.freeze({
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
lkgGeneration: recovery?.lkgGeneration,
|
|
648
|
-
candidateFailure: recovery?.candidateFailure,
|
|
649
|
-
deviceEpoch: recovery?.deviceEpoch ?? 0,
|
|
650
|
-
format: input.format,
|
|
651
|
-
passCount: input.passCount ?? 0,
|
|
652
|
-
sampleCount: input.sampleCount ?? 0,
|
|
653
|
-
memoryBytes: input.memoryBytes ?? 0,
|
|
654
|
-
resourceFacts: input.resourceFacts,
|
|
655
|
-
selectedLight: recovery?.selectedLight,
|
|
656
|
-
candidateSelectedLight: recovery?.candidateSelectedLight
|
|
728
|
+
configuredQueryBudget,
|
|
729
|
+
effectiveQueryBudget,
|
|
730
|
+
oneSweepCandidates,
|
|
731
|
+
oneSweepOccluded,
|
|
732
|
+
settleSubmits: 2 * oneSweepCandidates,
|
|
733
|
+
retestSubmits,
|
|
734
|
+
expirySubmits: Math.max(8, retestSubmits + oneSweepOccluded)
|
|
657
735
|
});
|
|
658
736
|
}
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
{ direction: [-1, 0, 0], up: [0, 1, 0] },
|
|
662
|
-
{ direction: [0, 1, 0], up: [0, 0, -1] },
|
|
663
|
-
{ direction: [0, -1, 0], up: [0, 0, 1] },
|
|
664
|
-
{ direction: [0, 0, 1], up: [0, 1, 0] },
|
|
665
|
-
{ direction: [0, 0, -1], up: [0, 1, 0] }
|
|
666
|
-
];
|
|
667
|
-
function assertRange(near, far) {
|
|
668
|
-
if (!Number.isFinite(near) || near <= 0 || !Number.isFinite(far) || far <= near) {
|
|
669
|
-
throw new RangeError("CubeCamera requires finite near > 0 and far > near.");
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
function buildCubeCameraFaceViews(input) {
|
|
673
|
-
assertRange(input.near, input.far);
|
|
674
|
-
const views = [];
|
|
675
|
-
for (const [index, face] of CUBE_CAMERA_FACE_ORDER.entries()) {
|
|
676
|
-
const orientation = FACE_ORIENTATION[index];
|
|
677
|
-
if (orientation === void 0)
|
|
678
|
-
throw new Error(`CubeCamera face orientation missing at ${index}`);
|
|
679
|
-
const target = [
|
|
680
|
-
(input.position[0] ?? 0) + orientation.direction[0],
|
|
681
|
-
(input.position[1] ?? 0) + orientation.direction[1],
|
|
682
|
-
(input.position[2] ?? 0) + orientation.direction[2]
|
|
683
|
-
];
|
|
684
|
-
const view = mat4.lookAt(mat4.create(), input.position, target, orientation.up);
|
|
685
|
-
const projection = mat4.perspective(mat4.create(), Math.PI / 2, 1, input.near, input.far);
|
|
686
|
-
const viewProjection = mat4.multiply(mat4.create(), projection, view);
|
|
687
|
-
views.push({
|
|
688
|
-
position: input.position,
|
|
689
|
-
face,
|
|
690
|
-
direction: orientation.direction,
|
|
691
|
-
up: orientation.up,
|
|
692
|
-
near: input.near,
|
|
693
|
-
far: input.far,
|
|
694
|
-
view,
|
|
695
|
-
projection,
|
|
696
|
-
viewProjection
|
|
697
|
-
});
|
|
698
|
-
}
|
|
699
|
-
return views;
|
|
737
|
+
function oneSweep(candidateCount, effectiveQueryBudget) {
|
|
738
|
+
return Math.ceil(candidateCount / effectiveQueryBudget);
|
|
700
739
|
}
|
|
701
740
|
|
|
702
741
|
// src/mesh-material-bindings.ts
|
|
@@ -808,27 +847,6 @@ function resolveMeshMaterialBindings(mesh, rendererOverrides, deps) {
|
|
|
808
847
|
}
|
|
809
848
|
return { ok: true, bindings, diagnostics };
|
|
810
849
|
}
|
|
811
|
-
|
|
812
|
-
// src/point-shadow-inspection.ts
|
|
813
|
-
function inspectPointShadow(snapshots, shadowAtlasCapacity) {
|
|
814
|
-
const requested = snapshots.length;
|
|
815
|
-
const admitted = snapshots.reduce(
|
|
816
|
-
(count, snapshot) => snapshot.shadowAtlasLayer >= 0 && snapshot.shadowAtlasLayer < shadowAtlasCapacity ? count + 1 : count,
|
|
817
|
-
0
|
|
818
|
-
);
|
|
819
|
-
const status = requested === 0 ? "inactive" : requested > shadowAtlasCapacity || admitted !== requested ? "over-budget" : "ready";
|
|
820
|
-
return Object.freeze({
|
|
821
|
-
status,
|
|
822
|
-
requested,
|
|
823
|
-
admitted,
|
|
824
|
-
// A point shadow only samples an atlas after it owns an atlas layer. Keep
|
|
825
|
-
// these names explicit for AI diagnostics while deriving both from the
|
|
826
|
-
// one layer projection above.
|
|
827
|
-
shadowed: admitted,
|
|
828
|
-
shadowAtlasOccupancy: admitted,
|
|
829
|
-
shadowAtlasCapacity
|
|
830
|
-
});
|
|
831
|
-
}
|
|
832
850
|
function hasVolumetricFogCapability(caps, shaders) {
|
|
833
851
|
return caps.compute && caps.storageTexture && shaders !== void 0;
|
|
834
852
|
}
|
|
@@ -915,260 +933,7 @@ function resolveSelectedVolumetricLight(world, entity) {
|
|
|
915
933
|
function resolveIntegratedVolumeConsumer(resource, consumer) {
|
|
916
934
|
return { consumer, resource };
|
|
917
935
|
}
|
|
918
|
-
|
|
919
|
-
// src/reflection/filter.ts
|
|
920
|
-
function createProbeFilterState(input) {
|
|
921
|
-
return {
|
|
922
|
-
probeIndex: input.probeIndex,
|
|
923
|
-
faceCount: input.faceCount ?? 6,
|
|
924
|
-
mipCount: input.mipCount,
|
|
925
|
-
cursor: 0,
|
|
926
|
-
activeGeneration: input.activeGeneration ?? 0
|
|
927
|
-
};
|
|
928
|
-
}
|
|
929
|
-
function advanceProbeFilter(state) {
|
|
930
|
-
const total = state.faceCount * state.mipCount;
|
|
931
|
-
if (state.cursor >= total) return void 0;
|
|
932
|
-
return {
|
|
933
|
-
probeIndex: state.probeIndex,
|
|
934
|
-
faceIndex: state.cursor % state.faceCount,
|
|
935
|
-
mipLevel: Math.floor(state.cursor / state.faceCount)
|
|
936
|
-
};
|
|
937
|
-
}
|
|
938
|
-
function commitProbeFilterStep(state, success) {
|
|
939
|
-
if (!success) return state;
|
|
940
|
-
const nextCursor = state.cursor + 1;
|
|
941
|
-
const complete = nextCursor >= state.faceCount * state.mipCount;
|
|
942
|
-
return {
|
|
943
|
-
...state,
|
|
944
|
-
cursor: nextCursor,
|
|
945
|
-
activeGeneration: complete ? state.activeGeneration + 1 : state.activeGeneration
|
|
946
|
-
};
|
|
947
|
-
}
|
|
948
|
-
function probeFilterIsSteady(state) {
|
|
949
|
-
return state.cursor >= state.faceCount * state.mipCount;
|
|
950
|
-
}
|
|
951
|
-
function normalize(vector) {
|
|
952
|
-
const length = Math.hypot(vector[0], vector[1], vector[2]);
|
|
953
|
-
if (length === 0) return [0, 0, 1];
|
|
954
|
-
return [vector[0] / length, vector[1] / length, vector[2] / length];
|
|
955
|
-
}
|
|
956
|
-
function boxProjectReflectionDirection(direction, boxCenter, halfExtents, point) {
|
|
957
|
-
const ray = normalize(direction);
|
|
958
|
-
let distance = Number.POSITIVE_INFINITY;
|
|
959
|
-
for (let axis = 0; axis < 3; axis += 1) {
|
|
960
|
-
const component = ray[axis] ?? 0;
|
|
961
|
-
if (component === 0) continue;
|
|
962
|
-
const extent = halfExtents[axis] ?? 0;
|
|
963
|
-
const edge = component > 0 ? (boxCenter[axis] ?? 0) + extent : (boxCenter[axis] ?? 0) - extent;
|
|
964
|
-
const candidate = (edge - (point[axis] ?? 0)) / component;
|
|
965
|
-
if (candidate > 0) distance = Math.min(distance, candidate);
|
|
966
|
-
}
|
|
967
|
-
if (!Number.isFinite(distance)) return ray;
|
|
968
|
-
return normalize([
|
|
969
|
-
(point[0] ?? 0) + ray[0] * distance - (boxCenter[0] ?? 0),
|
|
970
|
-
(point[1] ?? 0) + ray[1] * distance - (boxCenter[1] ?? 0),
|
|
971
|
-
(point[2] ?? 0) + ray[2] * distance - (boxCenter[2] ?? 0)
|
|
972
|
-
]);
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
// src/reflection/gpu-table.ts
|
|
976
|
-
function buildReflectionProbeTable(rows) {
|
|
977
|
-
const ordered = rows.slice().sort((a, b) => a.index - b.index);
|
|
978
|
-
const indices = /* @__PURE__ */ new Map();
|
|
979
|
-
for (const row of ordered) {
|
|
980
|
-
if (row.primitiveKey !== void 0) indices.set(row.primitiveKey, row.index);
|
|
981
|
-
}
|
|
982
|
-
const indexFor = (primitiveKey2) => indices.get(primitiveKey2);
|
|
983
|
-
return {
|
|
984
|
-
rows: Object.freeze(ordered),
|
|
985
|
-
cpuIndexByPrimitive: indexFor,
|
|
986
|
-
gpuIndexByPrimitive: indexFor
|
|
987
|
-
};
|
|
988
|
-
}
|
|
989
|
-
function reflectionProbeTableBytes(table) {
|
|
990
|
-
return table.rows.length * 48;
|
|
991
|
-
}
|
|
992
|
-
|
|
993
|
-
// src/reflection/projection.ts
|
|
994
|
-
var REFLECTION_PROBE_BYTES_PER_TEXEL = 8;
|
|
995
|
-
var DEFAULT_REFLECTION_PROBE_LIMITS = Object.freeze({
|
|
996
|
-
maxProbes: 16,
|
|
997
|
-
maxResolution: 256,
|
|
998
|
-
maxBytes: 64 * 1024 * 1024
|
|
999
|
-
});
|
|
1000
|
-
function validateReflectionProbeInput(input) {
|
|
1001
|
-
for (let index = 0; index < input.halfExtents.length; index += 1) {
|
|
1002
|
-
const value = input.halfExtents[index];
|
|
1003
|
-
if (value === void 0 || !Number.isFinite(value) || value <= 0) {
|
|
1004
|
-
return {
|
|
1005
|
-
ok: false,
|
|
1006
|
-
error: {
|
|
1007
|
-
code: "reflection-probe-input-invalid",
|
|
1008
|
-
field: `halfExtents[${index}]`,
|
|
1009
|
-
value,
|
|
1010
|
-
expected: "a finite number greater than zero"
|
|
1011
|
-
}
|
|
1012
|
-
};
|
|
1013
|
-
}
|
|
1014
|
-
}
|
|
1015
|
-
if (!Number.isFinite(input.priority)) {
|
|
1016
|
-
return {
|
|
1017
|
-
ok: false,
|
|
1018
|
-
error: {
|
|
1019
|
-
code: "reflection-probe-input-invalid",
|
|
1020
|
-
field: "priority",
|
|
1021
|
-
value: input.priority,
|
|
1022
|
-
expected: "a finite number"
|
|
1023
|
-
}
|
|
1024
|
-
};
|
|
1025
|
-
}
|
|
1026
|
-
if (!Number.isFinite(input.intensity) || input.intensity < 0) {
|
|
1027
|
-
return {
|
|
1028
|
-
ok: false,
|
|
1029
|
-
error: {
|
|
1030
|
-
code: "reflection-probe-input-invalid",
|
|
1031
|
-
field: "intensity",
|
|
1032
|
-
value: input.intensity,
|
|
1033
|
-
expected: "a finite number greater than or equal to zero"
|
|
1034
|
-
}
|
|
1035
|
-
};
|
|
1036
|
-
}
|
|
1037
|
-
if (!Number.isInteger(input.resolution) || input.resolution <= 0) {
|
|
1038
|
-
return {
|
|
1039
|
-
ok: false,
|
|
1040
|
-
error: {
|
|
1041
|
-
code: "reflection-probe-input-invalid",
|
|
1042
|
-
field: "resolution",
|
|
1043
|
-
value: input.resolution,
|
|
1044
|
-
expected: "a positive integer"
|
|
1045
|
-
}
|
|
1046
|
-
};
|
|
1047
|
-
}
|
|
1048
|
-
return { ok: true };
|
|
1049
|
-
}
|
|
1050
|
-
function estimateReflectionProbeBytes(resolution, limits = DEFAULT_REFLECTION_PROBE_LIMITS) {
|
|
1051
|
-
const maxResolution = limits.maxResolution ?? DEFAULT_REFLECTION_PROBE_LIMITS.maxResolution;
|
|
1052
|
-
const clamped = Math.min(resolution, maxResolution);
|
|
1053
|
-
let mipTexels = 0;
|
|
1054
|
-
for (let size = clamped; size >= 1; size = Math.floor(size / 2)) {
|
|
1055
|
-
mipTexels += size * size;
|
|
1056
|
-
}
|
|
1057
|
-
return mipTexels * 6 * REFLECTION_PROBE_BYTES_PER_TEXEL;
|
|
1058
|
-
}
|
|
1059
|
-
function admitReflectionProbe(input, current, limits = DEFAULT_REFLECTION_PROBE_LIMITS) {
|
|
1060
|
-
const maxProbes = limits.maxProbes ?? DEFAULT_REFLECTION_PROBE_LIMITS.maxProbes;
|
|
1061
|
-
const maxBytes = limits.maxBytes ?? DEFAULT_REFLECTION_PROBE_LIMITS.maxBytes;
|
|
1062
|
-
const maxResolution = limits.maxResolution ?? DEFAULT_REFLECTION_PROBE_LIMITS.maxResolution;
|
|
1063
|
-
const requested = estimateReflectionProbeBytes(input.resolution, { maxResolution });
|
|
1064
|
-
if (input.resolution > maxResolution || current.acceptedCount >= maxProbes || current.acceptedBytes + requested > maxBytes) {
|
|
1065
|
-
return {
|
|
1066
|
-
ok: false,
|
|
1067
|
-
error: {
|
|
1068
|
-
code: "reflection-probe-budget-exceeded",
|
|
1069
|
-
requested,
|
|
1070
|
-
activeCount: current.acceptedCount,
|
|
1071
|
-
activeBytes: current.acceptedBytes,
|
|
1072
|
-
maxProbes,
|
|
1073
|
-
maxBytes
|
|
1074
|
-
}
|
|
1075
|
-
};
|
|
1076
|
-
}
|
|
1077
|
-
return { ok: true, acceptedBytes: current.acceptedBytes + requested };
|
|
1078
|
-
}
|
|
1079
|
-
function contains(fact, point) {
|
|
1080
|
-
return fact.halfExtents.every((extent, axis) => {
|
|
1081
|
-
const center = fact.center[axis] ?? 0;
|
|
1082
|
-
const coordinate = point[axis] ?? 0;
|
|
1083
|
-
return Math.abs(coordinate - center) <= extent;
|
|
1084
|
-
});
|
|
1085
|
-
}
|
|
1086
|
-
function normalizedDistance(fact, point) {
|
|
1087
|
-
let squared = 0;
|
|
1088
|
-
for (let axis = 0; axis < 3; axis += 1) {
|
|
1089
|
-
const delta = (point[axis] ?? 0) - (fact.center[axis] ?? 0);
|
|
1090
|
-
const extent = fact.halfExtents[axis] ?? 1;
|
|
1091
|
-
squared += (delta / extent) ** 2;
|
|
1092
|
-
}
|
|
1093
|
-
return squared;
|
|
1094
|
-
}
|
|
1095
|
-
function isBetter(candidate, current, facts) {
|
|
1096
|
-
const candidateFact = facts.find(
|
|
1097
|
-
(fact) => fact.worldId === candidate.worldId && fact.entityKey === candidate.entityKey
|
|
1098
|
-
);
|
|
1099
|
-
const currentFact = facts.find(
|
|
1100
|
-
(fact) => fact.worldId === current.worldId && fact.entityKey === current.entityKey
|
|
1101
|
-
);
|
|
1102
|
-
if (candidateFact === void 0 || currentFact === void 0) return false;
|
|
1103
|
-
if (candidateFact.priority !== currentFact.priority)
|
|
1104
|
-
return candidateFact.priority > currentFact.priority;
|
|
1105
|
-
if (candidate.normalizedDistance !== current.normalizedDistance) {
|
|
1106
|
-
return candidate.normalizedDistance < current.normalizedDistance;
|
|
1107
|
-
}
|
|
1108
|
-
return candidate.worldId < current.worldId || candidate.worldId === current.worldId && candidate.entityKey < current.entityKey;
|
|
1109
|
-
}
|
|
1110
|
-
function selectReflectionProbe(facts, primitiveCenter) {
|
|
1111
|
-
let selected;
|
|
1112
|
-
for (const fact of facts) {
|
|
1113
|
-
if (!contains(fact, primitiveCenter)) continue;
|
|
1114
|
-
const candidate = {
|
|
1115
|
-
kind: "probe",
|
|
1116
|
-
worldId: fact.worldId,
|
|
1117
|
-
entityKey: fact.entityKey,
|
|
1118
|
-
normalizedDistance: normalizedDistance(fact, primitiveCenter)
|
|
1119
|
-
};
|
|
1120
|
-
if (selected === void 0 || isBetter(candidate, selected, facts)) selected = candidate;
|
|
1121
|
-
}
|
|
1122
|
-
return selected ?? { kind: "skylight" };
|
|
1123
|
-
}
|
|
1124
|
-
function primitiveKey(worldId, entityKey) {
|
|
1125
|
-
return `${worldId}:${entityKey}`;
|
|
1126
|
-
}
|
|
1127
|
-
var ReflectionProbeProjection = class {
|
|
1128
|
-
revision = 0;
|
|
1129
|
-
facts = [];
|
|
1130
|
-
selected = /* @__PURE__ */ new Map();
|
|
1131
|
-
signature = "";
|
|
1132
|
-
scannedPrimitives = 0;
|
|
1133
|
-
update(facts, primitives) {
|
|
1134
|
-
const nextFacts = facts.slice().sort((a, b) => a.worldId - b.worldId || a.entityKey - b.entityKey);
|
|
1135
|
-
const signature = JSON.stringify({ facts: nextFacts, primitives });
|
|
1136
|
-
if (signature === this.signature) return this.snapshot();
|
|
1137
|
-
this.signature = signature;
|
|
1138
|
-
this.facts = nextFacts;
|
|
1139
|
-
this.selected = /* @__PURE__ */ new Map();
|
|
1140
|
-
for (const primitive of primitives) {
|
|
1141
|
-
this.selected.set(
|
|
1142
|
-
primitiveKey(primitive.worldId, primitive.entityKey),
|
|
1143
|
-
selectReflectionProbe(nextFacts, primitive.center)
|
|
1144
|
-
);
|
|
1145
|
-
}
|
|
1146
|
-
this.scannedPrimitives = primitives.length;
|
|
1147
|
-
this.revision += 1;
|
|
1148
|
-
return this.snapshot();
|
|
1149
|
-
}
|
|
1150
|
-
snapshot() {
|
|
1151
|
-
return {
|
|
1152
|
-
revision: this.revision,
|
|
1153
|
-
facts: this.facts,
|
|
1154
|
-
selected: this.selected,
|
|
1155
|
-
scannedPrimitives: this.scannedPrimitives
|
|
1156
|
-
};
|
|
1157
|
-
}
|
|
1158
|
-
selection(worldId, entityKey) {
|
|
1159
|
-
return this.selected.get(primitiveKey(worldId, entityKey)) ?? { kind: "skylight" };
|
|
1160
|
-
}
|
|
1161
|
-
};
|
|
1162
|
-
var VISIBILITY_CACHE = /* @__PURE__ */ new WeakMap();
|
|
1163
936
|
function resolveVisibility(world, hierarchy = projectHierarchy(world)) {
|
|
1164
|
-
const cached = VISIBILITY_CACHE.get(world);
|
|
1165
|
-
const changes = cached?.changes ?? createWorldProjection(world, { components: [Visibility] });
|
|
1166
|
-
if (cached !== void 0) {
|
|
1167
|
-
const evidence = changes.poll();
|
|
1168
|
-
if (evidence.status === "delta" && evidence.changes.length === 0 && cached.hierarchy === hierarchy) {
|
|
1169
|
-
return cached.snapshot;
|
|
1170
|
-
}
|
|
1171
|
-
}
|
|
1172
937
|
const query = world.query({ read: [Visibility] });
|
|
1173
938
|
const visitVisibilityRows = (visit) => {
|
|
1174
939
|
if (!query.ok) return;
|
|
@@ -1242,7 +1007,6 @@ function resolveVisibility(world, hierarchy = projectHierarchy(world)) {
|
|
|
1242
1007
|
return resolveEntity?.(entity)?.effective ?? "visible";
|
|
1243
1008
|
}
|
|
1244
1009
|
};
|
|
1245
|
-
VISIBILITY_CACHE.set(world, { changes, hierarchy, snapshot });
|
|
1246
1010
|
return snapshot;
|
|
1247
1011
|
}
|
|
1248
1012
|
var VolumetricFog = defineComponent("VolumetricFog", {
|
|
@@ -1289,6 +1053,6 @@ function extractVolumetricFog(inputs) {
|
|
|
1289
1053
|
return ok({ status: "available", fog: validated.value });
|
|
1290
1054
|
}
|
|
1291
1055
|
|
|
1292
|
-
export { ANTIALIAS_FXAA, ANTIALIAS_MSAA, ANTIALIAS_NONE, ANTIALIAS_TAA, Atmosphere, BLOOM_DISABLED, BLOOM_ENABLED, CAMERA_PROJECTION_ORTHOGRAPHIC, CAMERA_PROJECTION_PERSPECTIVE, CUBE_CAMERA_FACE_ORDER, CUBE_CAMERA_UPDATE_CONTINUOUS, CUBE_CAMERA_UPDATE_ONCE, CUBE_CAMERA_UPDATE_ON_DEMAND, Camera, CubeCamera,
|
|
1293
|
-
//# sourceMappingURL=chunk-
|
|
1294
|
-
//# sourceMappingURL=chunk-
|
|
1056
|
+
export { ANTIALIAS_FXAA, ANTIALIAS_MSAA, ANTIALIAS_NONE, ANTIALIAS_TAA, Atmosphere, BLOOM_DISABLED, BLOOM_ENABLED, CAMERA_PROJECTION_ORTHOGRAPHIC, CAMERA_PROJECTION_PERSPECTIVE, CUBE_CAMERA_FACE_ORDER, CUBE_CAMERA_UPDATE_CONTINUOUS, CUBE_CAMERA_UPDATE_ONCE, CUBE_CAMERA_UPDATE_ON_DEMAND, Camera, CubeCamera, DirectionalLight, DirectionalShadowFilterValue, Fog, Instances, Layer, LightProbe, Lines, MeshFilter, MeshRenderer, MotionBlur, PointLight, PointLightShadow, PointShapeValue, Points, PostProcessParams, REFLECTION_PROBE_UPDATE_CONTINUOUS, REFLECTION_PROBE_UPDATE_ONCE, REFLECTION_PROBE_UPDATE_ON_CHANGE, RectAreaLight, ReflectionProbe, SKYBOX_MODE_CUBEMAP, SceneInstance, SkyboxBackground, Skylight, SortKey, SpotLight, TONEMAP_ACES_FILMIC, TONEMAP_AGX, TONEMAP_CINEON, TONEMAP_LINEAR, TONEMAP_NEUTRAL, TONEMAP_NONE, TONEMAP_REINHARD, TONEMAP_REINHARD_EXTENDED, Visibility, VisibilityStateValue, VolumetricFog, antialiasFromF32, bloomEnabledFromF32, cameraProjectionFromF32, computeInvRangeSquared, createVisibilityBudget, cubeCameraUpdateIntentFromF32, cubeCameraUpdateIntentToF32, degToCos, directionalShadowQualityFromF32, extractVolumetricFog, hasVolumetricFogCapability, orthographic, perspective, pointShapeFromU32, projectMeshMaterialBindingObservation, reflectionProbeUpdateIntentFromF32, reflectionProbeUpdateIntentToF32, resolveIntegratedVolumeConsumer, resolveMeshMaterialBindings, resolveSelectedVolumetricLight, resolveVisibility, resolveVolumetricFogLightPair, summarizeMeshMaterialBindings, tonemapFromF32, tonemapToU32, validateDirection, validateDirectionalLightData, validateLightProbeData, validatePointLightData, validatePointLightShadowData, validateRectAreaLightData, validateSpotLightData, validateVolumetricFog, visibilityStateFromU32 };
|
|
1057
|
+
//# sourceMappingURL=chunk-FF7K3FSO.mjs.map
|
|
1058
|
+
//# sourceMappingURL=chunk-FF7K3FSO.mjs.map
|