@forgeax/engine-render 0.1.20 → 0.1.21
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 +215 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/assembly/device-feature-admission.d.ts +18 -0
- package/dist/assembly/device-feature-admission.d.ts.map +1 -0
- package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
- package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +21 -18
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +9 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/render-target-host.d.ts +46 -0
- package/dist/assembly/render-target-host.d.ts.map +1 -0
- package/dist/assets/render-asset-port.d.ts.map +1 -1
- package/dist/authoring.mjs +3 -0
- package/dist/authoring.mjs.map +1 -1
- package/dist/capture/cube-views.d.ts +21 -0
- package/dist/capture/cube-views.d.ts.map +1 -0
- package/dist/capture/scheduler.d.ts +54 -0
- package/dist/capture/scheduler.d.ts.map +1 -0
- package/dist/{chunk-4XINDLAY.mjs → chunk-5YADUCA7.mjs} +1552 -1361
- package/dist/chunk-5YADUCA7.mjs.map +1 -0
- package/dist/{chunk-TBQJOK2L.mjs → chunk-6OPXDQ2E.mjs} +364 -51
- package/dist/chunk-6OPXDQ2E.mjs.map +1 -0
- package/dist/{chunk-M2MP4ZOU.mjs → chunk-BXBQQKFQ.mjs} +3 -9
- package/dist/chunk-BXBQQKFQ.mjs.map +1 -0
- package/dist/{chunk-CDTWTHZR.mjs → chunk-FS2KNUQH.mjs} +548 -6
- package/dist/chunk-FS2KNUQH.mjs.map +1 -0
- package/dist/components/camera.d.ts +1 -0
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/cube-camera.d.ts +20 -0
- package/dist/components/cube-camera.d.ts.map +1 -0
- package/dist/components/directional-light.d.ts +11 -2
- package/dist/components/directional-light.d.ts.map +1 -1
- package/dist/components/directional-shadow-filter.d.ts +25 -0
- package/dist/components/directional-shadow-filter.d.ts.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/reflection-probe.d.ts +17 -0
- package/dist/components/reflection-probe.d.ts.map +1 -0
- package/dist/construct-renderer.mjs +5826 -1003
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/environment/frame.d.ts.map +1 -1
- package/dist/environment/lifecycle.d.ts +5 -0
- package/dist/environment/lifecycle.d.ts.map +1 -1
- package/dist/errors/render.d.ts +141 -93
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/directional-shadow-projection.d.ts +23 -0
- package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
- package/dist/extract/environment.d.ts +14 -0
- package/dist/extract/environment.d.ts.map +1 -1
- package/dist/extract/visibility.d.ts.map +1 -1
- package/dist/features/fullscreen.d.ts.map +1 -1
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +10 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +13 -2
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +0 -1
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +19 -17
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +4 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/kernel-cache.d.ts +36 -0
- package/dist/ibl/kernel-cache.d.ts.map +1 -0
- package/dist/index.d.ts +28 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +51 -0
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instances-derived-bounds.d.ts +50 -0
- package/dist/instances-derived-bounds.d.ts.map +1 -0
- package/dist/internal.mjs +1 -1
- package/dist/light-buffer-layout.d.ts +10 -1
- package/dist/light-buffer-layout.d.ts.map +1 -1
- package/dist/mesh-material-bindings.d.ts +54 -0
- package/dist/mesh-material-bindings.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +14 -4
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts +2 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/errors.d.ts +4 -0
- package/dist/pipeline/standard-lighting/errors.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/graph.d.ts +24 -0
- package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/inspection.d.ts +38 -0
- package/dist/pipeline/standard-lighting/inspection.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/layout.d.ts +28 -0
- package/dist/pipeline/standard-lighting/layout.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/light-frame.d.ts +33 -0
- package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/membership.d.ts +14 -0
- package/dist/pipeline/standard-lighting/membership.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/prepare.d.ts +16 -0
- package/dist/pipeline/standard-lighting/prepare.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/topology.d.ts +45 -0
- package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/transport.d.ts +36 -0
- package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts +4 -13
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline/standard-profile.d.ts +5 -26
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +40 -7
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/point-shadow-inspection.d.ts +21 -0
- package/dist/point-shadow-inspection.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +27 -32
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +28 -14
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts +5 -0
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +10 -4
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/gpu-pass-timing/contract.d.ts +96 -0
- package/dist/record/gpu-pass-timing/contract.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/errors.d.ts +18 -0
- package/dist/record/gpu-pass-timing/errors.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/index.d.ts +8 -0
- package/dist/record/gpu-pass-timing/index.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/parser.d.ts +11 -0
- package/dist/record/gpu-pass-timing/parser.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/session.d.ts +43 -0
- package/dist/record/gpu-pass-timing/session.d.ts.map +1 -0
- package/dist/record/gpu-timing.d.ts +8 -3
- package/dist/record/gpu-timing.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +22 -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/main-pass.d.ts +2 -0
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +43 -2
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +72 -4
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +7 -4
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/reflection/filter.d.ts +22 -0
- package/dist/reflection/filter.d.ts.map +1 -0
- package/dist/reflection/gpu-table.d.ts +25 -0
- package/dist/reflection/gpu-table.d.ts.map +1 -0
- package/dist/reflection/projection.d.ts +91 -0
- package/dist/reflection/projection.d.ts.map +1 -0
- package/dist/render-contract.d.ts +49 -7
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts +1 -0
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +42 -2
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +58 -17
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +17 -2
- package/dist/render-system.d.ts.map +1 -1
- package/dist/renderer.d.ts +43 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +14 -0
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/shadow-atlas.d.ts +3 -3
- package/dist/shadow-atlas.d.ts.map +1 -1
- package/dist/ssao-buffers.d.ts +3 -0
- package/dist/ssao-buffers.d.ts.map +1 -1
- package/dist/targets/contracts.d.ts +66 -0
- package/dist/targets/contracts.d.ts.map +1 -0
- package/dist/targets/graph-projection.d.ts +29 -0
- package/dist/targets/graph-projection.d.ts.map +1 -0
- package/dist/targets/material-source.d.ts +34 -0
- package/dist/targets/material-source.d.ts.map +1 -0
- package/dist/targets/owner.d.ts +32 -0
- package/dist/targets/owner.d.ts.map +1 -0
- package/dist/targets/physical.d.ts +18 -0
- package/dist/targets/physical.d.ts.map +1 -0
- package/dist/targets/readback.d.ts +39 -0
- package/dist/targets/readback.d.ts.map +1 -0
- package/dist/temporal/index.mjs +3 -3
- package/dist/typed-render-graph-primitives.d.ts +1 -1
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-passes.d.ts +1 -1
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/passes.d.ts +2 -2
- package/dist/volume/passes.d.ts.map +1 -1
- package/package.json +20 -20
- package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
- package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
- package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
- package/src/__tests__/cluster-binner.unit.test.ts +35 -0
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -2
- package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
- package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
- package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
- package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
- package/src/__tests__/cube-camera.integration.test.ts +42 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +73 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -3
- package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
- package/src/__tests__/factory-contract.integration.test.ts +255 -29
- package/src/__tests__/fog-component.unit.test.ts +67 -0
- package/src/__tests__/fog.integration.test.ts +86 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -9
- package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +17 -1
- package/src/__tests__/gpu-driven-production.integration.test.ts +16 -17
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +12 -4
- package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
- package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
- package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
- package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
- package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
- package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
- package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
- package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
- package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
- package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
- package/src/__tests__/instances-culling.integration.test.ts +94 -0
- package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
- package/src/__tests__/material-observation.integration.test.ts +101 -0
- package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
- package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
- package/src/__tests__/public-surface.test-d.ts +10 -0
- package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
- package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
- package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
- package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
- package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
- package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
- package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +18 -3
- package/src/__tests__/render-feature-docs.unit.test.ts +1 -1
- package/src/__tests__/render-target-admission.unit.test.ts +80 -0
- package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
- package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
- package/src/__tests__/render-target-material-source.test-d.ts +30 -0
- package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
- package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
- package/src/__tests__/render-target-owner.unit.test.ts +122 -0
- package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
- package/src/__tests__/render-target-public-schema.json +107 -0
- package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
- package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
- package/src/__tests__/render-target-readback.integration.test.ts +90 -0
- package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +48 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
- package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
- package/src/__tests__/skin-motion-regression.unit.test.ts +132 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +11 -2
- package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
- package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +232 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +8 -5
- package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
- package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
- package/src/__tests__/standard-lighting-write.unit.test.ts +377 -0
- package/src/__tests__/standard-lighting.integration.test.ts +67 -0
- package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
- package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
- package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
- package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -38
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
- package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
- package/src/assembly/device-feature-admission.ts +73 -0
- package/src/assembly/directional-shadow-inspection.ts +122 -0
- package/src/assembly/factory.ts +877 -286
- package/src/assembly/host-contract.ts +25 -0
- package/src/assembly/render-target-host.ts +847 -0
- package/src/assets/asset-decoders.ts +1 -1
- package/src/assets/render-asset-port.ts +7 -1
- package/src/capture/cube-views.ts +69 -0
- package/src/capture/scheduler.ts +265 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
- package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
- package/src/components/camera.ts +4 -0
- package/src/components/cube-camera.ts +52 -0
- package/src/components/directional-light.ts +22 -2
- package/src/components/directional-shadow-filter.ts +57 -0
- package/src/components/index.ts +2 -0
- package/src/components/light-helpers.ts +81 -7
- package/src/components/reflection-probe.ts +49 -0
- package/src/environment/frame.ts +6 -24
- package/src/environment/lifecycle.ts +12 -0
- package/src/errors/render.ts +286 -142
- package/src/extract/directional-shadow-projection.ts +61 -0
- package/src/extract/environment.ts +57 -0
- package/src/extract/visibility.ts +25 -1
- package/src/features/fullscreen.ts +3 -0
- package/src/features/targets.ts +4 -1
- package/src/features/types.ts +10 -0
- package/src/fullscreen-post-process-pass.ts +43 -2
- package/src/gpu-driven/batch-topology.ts +1 -0
- package/src/gpu-driven/production-raster.ts +1 -3
- package/src/gpu-scene.ts +8 -1
- package/src/hdrp-buffers.ts +165 -59
- package/src/ibl/IblPipelineCache.ts +11 -0
- package/src/ibl/kernel-cache.ts +88 -0
- package/src/index.ts +148 -0
- package/src/inspection-types.ts +56 -0
- package/src/instances-derived-bounds.ts +171 -0
- package/src/light-buffer-layout.ts +20 -5
- package/src/mesh-material-bindings.ts +132 -0
- package/src/pbr-pipeline.ts +106 -17
- package/src/pipeline/standard-forward-lane.ts +46 -16
- package/src/pipeline/standard-lighting/errors.ts +6 -0
- package/src/pipeline/standard-lighting/graph.ts +157 -0
- package/src/pipeline/standard-lighting/inspection.ts +88 -0
- package/src/pipeline/standard-lighting/layout.ts +31 -0
- package/src/pipeline/standard-lighting/light-frame.ts +34 -0
- package/src/pipeline/standard-lighting/membership.ts +43 -0
- package/src/pipeline/standard-lighting/prepare.ts +37 -0
- package/src/pipeline/standard-lighting/topology.ts +120 -0
- package/src/pipeline/standard-lighting/transport.ts +77 -0
- package/src/pipeline/standard-pipeline.ts +122 -193
- package/src/pipeline/standard-post.ts +26 -7
- package/src/pipeline/standard-profile.ts +17 -47
- package/src/pipeline-spec.ts +84 -21
- package/src/point-shadow-inspection.ts +55 -0
- package/src/record/__tests__/temporal-payload.unit.test.ts +42 -1
- package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
- package/src/record/frame-lighting.ts +367 -427
- package/src/record/frame-snapshot.ts +35 -27
- package/src/record/frame-targets.ts +17 -0
- package/src/record/frame.ts +261 -74
- package/src/record/gpu-pass-timing/contract.ts +180 -0
- package/src/record/gpu-pass-timing/errors.ts +34 -0
- package/src/record/gpu-pass-timing/index.ts +37 -0
- package/src/record/gpu-pass-timing/parser.ts +97 -0
- package/src/record/gpu-pass-timing/session.ts +938 -0
- package/src/record/gpu-timing.ts +21 -12
- package/src/record/main-pass-geometry.ts +120 -80
- package/src/record/main-pass-material.ts +95 -9
- package/src/record/main-pass-sprite-draws.ts +54 -25
- package/src/record/main-pass.ts +71 -15
- package/src/record/render-context.ts +72 -0
- package/src/record/shadow-pass.ts +17 -28
- package/src/record/skybox-post-pass.ts +20 -4
- package/src/record/typed-frame-graph.ts +893 -44
- package/src/record/view-ubo.ts +63 -28
- package/src/reflection/filter.ts +81 -0
- package/src/reflection/gpu-table.ts +44 -0
- package/src/reflection/projection.ts +281 -0
- package/src/render-contract.ts +76 -5
- package/src/render-graph-primitives.ts +9 -4
- package/src/render-pipeline.ts +117 -2
- package/src/render-system-extract.ts +557 -100
- package/src/render-system.ts +1095 -66
- package/src/renderer.ts +222 -0
- package/src/scene/render-scene.ts +115 -9
- package/src/shadow-atlas.ts +5 -5
- package/src/ssao-buffers.ts +9 -2
- package/src/targets/contracts.ts +182 -0
- package/src/targets/graph-projection.ts +169 -0
- package/src/targets/material-source.ts +143 -0
- package/src/targets/owner.ts +214 -0
- package/src/targets/physical.ts +18 -0
- package/src/targets/readback.ts +153 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +59 -20
- package/src/typed-render-graph-primitives.ts +5 -3
- package/src/typed-shadow-passes.ts +46 -40
- package/src/volume/passes.ts +15 -9
- package/dist/chunk-4XINDLAY.mjs.map +0 -1
- package/dist/chunk-CDTWTHZR.mjs.map +0 -1
- package/dist/chunk-M2MP4ZOU.mjs.map +0 -1
- package/dist/chunk-TBQJOK2L.mjs.map +0 -1
|
@@ -17,12 +17,17 @@
|
|
|
17
17
|
import { err, ok, type Result } from '@forgeax/engine-types';
|
|
18
18
|
import { SpawnLightInvalidBoundsError } from '../errors/ecs-validation';
|
|
19
19
|
import { ShadowInvalidConfigError } from '../errors/render';
|
|
20
|
+
import { DirectionalShadowFilterValue } from './directional-shadow-filter';
|
|
20
21
|
|
|
21
22
|
export type LightValidationError = SpawnLightInvalidBoundsError | ShadowInvalidConfigError;
|
|
22
23
|
export type LightValidationResult = Result<void, LightValidationError>;
|
|
23
24
|
|
|
24
25
|
const RANGE_ZERO_FALLBACK_INV_R2 = 1e8;
|
|
25
26
|
const DEG_TO_RAD = Math.PI / 180;
|
|
27
|
+
const PCSS_RADIUS_MIN = 0.0001;
|
|
28
|
+
const PCSS_RADIUS_MAX = 0.05;
|
|
29
|
+
const PCSS_PENUMBRA_MIN = 1;
|
|
30
|
+
const PCSS_PENUMBRA_MAX = 64;
|
|
26
31
|
|
|
27
32
|
/**
|
|
28
33
|
* Convert SpotLight cone half-angle (degrees) to its cosine.
|
|
@@ -97,7 +102,9 @@ export function validateDirectionalLightData(
|
|
|
97
102
|
if (data.castShadow === false) return ok(undefined);
|
|
98
103
|
|
|
99
104
|
const mapSize = (data.mapSize as number | undefined) ?? 2048;
|
|
100
|
-
if (mapSize < 1)
|
|
105
|
+
if (mapSize < 1) {
|
|
106
|
+
return err(new ShadowInvalidConfigError('mapSize', mapSize, 1));
|
|
107
|
+
}
|
|
101
108
|
const cascadeCount = (data.cascadeCount as number | undefined) ?? 4;
|
|
102
109
|
if (cascadeCount < 1 || cascadeCount > 4 || !Number.isInteger(cascadeCount)) {
|
|
103
110
|
return err(new ShadowInvalidConfigError('cascadeCount', cascadeCount, 1, 4));
|
|
@@ -110,14 +117,65 @@ export function validateDirectionalLightData(
|
|
|
110
117
|
if (cascadeBlend < 0 || cascadeBlend > 0.5) {
|
|
111
118
|
return err(new ShadowInvalidConfigError('cascadeBlend', cascadeBlend, 0, 0.5));
|
|
112
119
|
}
|
|
113
|
-
const pcfKernelSize = (data.pcfKernelSize as number | undefined) ?? 3;
|
|
114
|
-
if (pcfKernelSize < 1 || pcfKernelSize % 2 === 0) {
|
|
115
|
-
return err(new ShadowInvalidConfigError('pcfKernelSize', pcfKernelSize, 1));
|
|
116
|
-
}
|
|
117
120
|
const shadowDistance = (data.shadowDistance as number | undefined) ?? 200;
|
|
118
121
|
if (shadowDistance <= 0) {
|
|
119
122
|
return err(new ShadowInvalidConfigError('shadowDistance', shadowDistance, 0, '>'));
|
|
120
123
|
}
|
|
124
|
+
const shadowFilter =
|
|
125
|
+
(data.shadowFilter as number | undefined) ?? DirectionalShadowFilterValue.pcf3;
|
|
126
|
+
const allowedFilters = Object.values(DirectionalShadowFilterValue);
|
|
127
|
+
if (!Number.isFinite(shadowFilter) || !allowedFilters.includes(shadowFilter as never)) {
|
|
128
|
+
return err(
|
|
129
|
+
new ShadowInvalidConfigError(
|
|
130
|
+
'shadowFilter',
|
|
131
|
+
shadowFilter,
|
|
132
|
+
{ kind: 'allowed-values', values: allowedFilters },
|
|
133
|
+
undefined,
|
|
134
|
+
'one of [pcf1, pcf3, pcf5, pcssMedium, pcssHigh]',
|
|
135
|
+
),
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
if (
|
|
139
|
+
shadowFilter === DirectionalShadowFilterValue.pcssMedium ||
|
|
140
|
+
shadowFilter === DirectionalShadowFilterValue.pcssHigh
|
|
141
|
+
) {
|
|
142
|
+
const shadowAngularRadius = (data.shadowAngularRadius as number | undefined) ?? 0.00465;
|
|
143
|
+
if (!Number.isFinite(shadowAngularRadius)) {
|
|
144
|
+
return err(
|
|
145
|
+
new ShadowInvalidConfigError('shadowAngularRadius', shadowAngularRadius, {
|
|
146
|
+
kind: 'range',
|
|
147
|
+
min: PCSS_RADIUS_MIN,
|
|
148
|
+
max: PCSS_RADIUS_MAX,
|
|
149
|
+
}),
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
if (shadowAngularRadius < PCSS_RADIUS_MIN || shadowAngularRadius > PCSS_RADIUS_MAX) {
|
|
153
|
+
return err(
|
|
154
|
+
new ShadowInvalidConfigError('shadowAngularRadius', shadowAngularRadius, {
|
|
155
|
+
kind: 'range',
|
|
156
|
+
min: PCSS_RADIUS_MIN,
|
|
157
|
+
max: PCSS_RADIUS_MAX,
|
|
158
|
+
}),
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
const maxPenumbraTexels = (data.maxPenumbraTexels as number | undefined) ?? 32;
|
|
162
|
+
if (
|
|
163
|
+
!Number.isFinite(maxPenumbraTexels) ||
|
|
164
|
+
!Number.isInteger(maxPenumbraTexels) ||
|
|
165
|
+
maxPenumbraTexels < PCSS_PENUMBRA_MIN ||
|
|
166
|
+
maxPenumbraTexels > PCSS_PENUMBRA_MAX
|
|
167
|
+
) {
|
|
168
|
+
return err(
|
|
169
|
+
new ShadowInvalidConfigError(
|
|
170
|
+
'maxPenumbraTexels',
|
|
171
|
+
maxPenumbraTexels,
|
|
172
|
+
{ kind: 'range', min: PCSS_PENUMBRA_MIN, max: PCSS_PENUMBRA_MAX },
|
|
173
|
+
undefined,
|
|
174
|
+
'a finite integer in [1, 64]',
|
|
175
|
+
),
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
121
179
|
return ok(undefined);
|
|
122
180
|
}
|
|
123
181
|
|
|
@@ -153,7 +211,15 @@ export function validateSpotLightData(
|
|
|
153
211
|
}
|
|
154
212
|
const pcfKernelSize = (data.pcfKernelSize as number | undefined) ?? 3;
|
|
155
213
|
if (pcfKernelSize < 1 || pcfKernelSize % 2 === 0) {
|
|
156
|
-
return err(
|
|
214
|
+
return err(
|
|
215
|
+
new ShadowInvalidConfigError(
|
|
216
|
+
'pcfKernelSize',
|
|
217
|
+
pcfKernelSize,
|
|
218
|
+
{ kind: 'lower-bound', operator: '>=', value: 1 },
|
|
219
|
+
undefined,
|
|
220
|
+
'an odd integer >= 1',
|
|
221
|
+
),
|
|
222
|
+
);
|
|
157
223
|
}
|
|
158
224
|
const shadowIntensity = (data.shadowIntensity as number | undefined) ?? 1;
|
|
159
225
|
if (!Number.isFinite(shadowIntensity) || shadowIntensity < 0 || shadowIntensity > 1) {
|
|
@@ -186,7 +252,15 @@ export function validatePointLightShadowData(
|
|
|
186
252
|
}
|
|
187
253
|
const pcfKernelSize = (data.pcfKernelSize as number | undefined) ?? 3;
|
|
188
254
|
if (pcfKernelSize < 1 || pcfKernelSize % 2 === 0) {
|
|
189
|
-
return err(
|
|
255
|
+
return err(
|
|
256
|
+
new ShadowInvalidConfigError(
|
|
257
|
+
'pcfKernelSize',
|
|
258
|
+
pcfKernelSize,
|
|
259
|
+
{ kind: 'lower-bound', operator: '>=', value: 1 },
|
|
260
|
+
undefined,
|
|
261
|
+
'an odd integer >= 1',
|
|
262
|
+
),
|
|
263
|
+
);
|
|
190
264
|
}
|
|
191
265
|
return ok(undefined);
|
|
192
266
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// @forgeax/engine-render - local reflection probe vocabulary.
|
|
2
|
+
//
|
|
3
|
+
// A ReflectionProbe is an ECS authoring fact. The renderer owns its six-face
|
|
4
|
+
// capture, PMREM output, box selection, and Skylight fallback; this component
|
|
5
|
+
// never carries a GPU handle or an authored material reference.
|
|
6
|
+
|
|
7
|
+
import { defineComponent, type SchemaOf, type ShapeOf } from '@forgeax/engine-ecs';
|
|
8
|
+
import { RenderIntentInvalidError } from '../errors/render';
|
|
9
|
+
|
|
10
|
+
export const REFLECTION_PROBE_UPDATE_ONCE = 0;
|
|
11
|
+
export const REFLECTION_PROBE_UPDATE_ON_CHANGE = 1;
|
|
12
|
+
export const REFLECTION_PROBE_UPDATE_CONTINUOUS = 2;
|
|
13
|
+
|
|
14
|
+
export type ReflectionProbeUpdateIntent = 'once' | 'on-change' | 'continuous';
|
|
15
|
+
|
|
16
|
+
export function reflectionProbeUpdateIntentFromF32(value: number): ReflectionProbeUpdateIntent {
|
|
17
|
+
switch (value) {
|
|
18
|
+
case REFLECTION_PROBE_UPDATE_ONCE:
|
|
19
|
+
return 'once';
|
|
20
|
+
case REFLECTION_PROBE_UPDATE_ON_CHANGE:
|
|
21
|
+
return 'on-change';
|
|
22
|
+
case REFLECTION_PROBE_UPDATE_CONTINUOUS:
|
|
23
|
+
return 'continuous';
|
|
24
|
+
default:
|
|
25
|
+
throw new RenderIntentInvalidError('ReflectionProbe', value);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function reflectionProbeUpdateIntentToF32(intent: ReflectionProbeUpdateIntent): number {
|
|
30
|
+
switch (intent) {
|
|
31
|
+
case 'once':
|
|
32
|
+
return REFLECTION_PROBE_UPDATE_ONCE;
|
|
33
|
+
case 'on-change':
|
|
34
|
+
return REFLECTION_PROBE_UPDATE_ON_CHANGE;
|
|
35
|
+
case 'continuous':
|
|
36
|
+
return REFLECTION_PROBE_UPDATE_CONTINUOUS;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const ReflectionProbe = defineComponent('ReflectionProbe', {
|
|
41
|
+
halfExtents: { type: 'array<f32, 3>', default: new Float32Array([1, 1, 1]) },
|
|
42
|
+
priority: { type: 'f32', default: 0 },
|
|
43
|
+
intensity: { type: 'f32', default: 1 },
|
|
44
|
+
resolution: { type: 'u32', default: 256 },
|
|
45
|
+
updateIntent: { type: 'f32', default: REFLECTION_PROBE_UPDATE_ONCE },
|
|
46
|
+
invalidationVersion: { type: 'u32', default: 0 },
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
export type ReflectionProbeData = ShapeOf<SchemaOf<typeof ReflectionProbe>>;
|
package/src/environment/frame.ts
CHANGED
|
@@ -7,7 +7,7 @@ import type {
|
|
|
7
7
|
FogCandidate,
|
|
8
8
|
FogFrame,
|
|
9
9
|
} from '../extract/environment';
|
|
10
|
-
import { validateAtmosphereParameters } from '../extract/environment';
|
|
10
|
+
import { validateAtmosphereParameters, validateFogParameters } from '../extract/environment';
|
|
11
11
|
import { environmentFactSignatures } from './signature';
|
|
12
12
|
|
|
13
13
|
export type { EnvironmentCandidate, EnvironmentFrame, EnvironmentSource, FogCandidate, FogFrame };
|
|
@@ -103,19 +103,6 @@ function freezeFog(candidate: FogCandidate): FogFrame {
|
|
|
103
103
|
});
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
function validFog(candidate: FogCandidate): boolean {
|
|
107
|
-
return (
|
|
108
|
-
candidate.color.every(Number.isFinite) &&
|
|
109
|
-
Number.isFinite(candidate.density) &&
|
|
110
|
-
candidate.density >= 0 &&
|
|
111
|
-
Number.isFinite(candidate.heightFalloff) &&
|
|
112
|
-
candidate.heightFalloff >= 0 &&
|
|
113
|
-
Number.isFinite(candidate.maxOpacity) &&
|
|
114
|
-
candidate.maxOpacity >= 0 &&
|
|
115
|
-
candidate.maxOpacity <= 1
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
106
|
/** Select one immutable frame fact set for both Standard lighting lanes. */
|
|
120
107
|
export function selectEnvironment(
|
|
121
108
|
input: EnvironmentSelectionInput,
|
|
@@ -131,16 +118,11 @@ export function selectEnvironment(
|
|
|
131
118
|
}
|
|
132
119
|
if (input.fogs.length > 1) return err(new FogCardinalityError(input.fogs.length));
|
|
133
120
|
const selectedFog = input.fogs[0];
|
|
134
|
-
if (selectedFog !== undefined
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
? 'heightFalloff'
|
|
140
|
-
: 'maxOpacity';
|
|
141
|
-
return err(
|
|
142
|
-
new EnvironmentSelectionParameterError(field, selectedFog[field], 'finite and in range'),
|
|
143
|
-
);
|
|
121
|
+
if (selectedFog !== undefined) {
|
|
122
|
+
const issue = validateFogParameters(selectedFog);
|
|
123
|
+
if (issue !== undefined) {
|
|
124
|
+
return err(new EnvironmentSelectionParameterError(issue.field, issue.value, issue.expected));
|
|
125
|
+
}
|
|
144
126
|
}
|
|
145
127
|
const selected = input.environments[0];
|
|
146
128
|
if (selected?.kind === 'atmosphere') {
|
|
@@ -62,6 +62,18 @@ export class EnvironmentLifecycle {
|
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
/** Retain a structured authoring failure while the active/LKG frame stays live. */
|
|
66
|
+
recordSelectionFailure(error: {
|
|
67
|
+
readonly code: string;
|
|
68
|
+
readonly detail: Readonly<Record<string, unknown>>;
|
|
69
|
+
}): void {
|
|
70
|
+
this.lastCandidateFailure = Object.freeze({
|
|
71
|
+
stage: 'prepare',
|
|
72
|
+
code: error.code,
|
|
73
|
+
detail: Object.freeze({ ...error.detail }),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
65
77
|
recordStageFailure(
|
|
66
78
|
stage: EnvironmentInspectionFailure['stage'],
|
|
67
79
|
generation: EnvironmentGeneration,
|