@forgeax/engine-render 0.1.21 → 0.1.24
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 +281 -38
- package/dist/assembly/backend-contract.d.ts +13 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -1
- package/dist/assembly/bundler-contract.d.ts +9 -0
- package/dist/assembly/bundler-contract.d.ts.map +1 -0
- package/dist/assembly/device-feature-admission.d.ts +8 -0
- package/dist/assembly/device-feature-admission.d.ts.map +1 -1
- package/dist/assembly/extended-lighting-fallback.d.ts +13 -0
- package/dist/assembly/extended-lighting-fallback.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +7 -235
- 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/assembly/material/assembly.d.ts +3 -2
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/standard-layer-projection.d.ts +10 -0
- package/dist/assembly/material/standard-layer-projection.d.ts.map +1 -0
- package/dist/assembly/material-shader-policy.d.ts +168 -0
- package/dist/assembly/material-shader-policy.d.ts.map +1 -0
- package/dist/assembly/material-shader-prewarm.d.ts +21 -0
- package/dist/assembly/material-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/mesh-ssbo-grow.d.ts +88 -0
- package/dist/assembly/mesh-ssbo-grow.d.ts.map +1 -0
- package/dist/assembly/recovery/device-loss-fanout.d.ts +14 -0
- package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -0
- package/dist/assembly/recovery/generation.d.ts +46 -0
- package/dist/assembly/recovery/generation.d.ts.map +1 -0
- package/dist/assembly/recovery/recovery-attempt.d.ts +63 -0
- package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -0
- package/dist/assembly/recovery/renderer-recover.d.ts +115 -0
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -0
- package/dist/assembly/renderer-facade.d.ts +10 -0
- package/dist/assembly/renderer-facade.d.ts.map +1 -0
- package/dist/assembly/renderer-frame-transaction.d.ts +17 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
- package/dist/assembly/renderer-helpers.d.ts +19 -0
- package/dist/assembly/renderer-helpers.d.ts.map +1 -0
- package/dist/assembly/renderer-lifecycle.d.ts +34 -0
- package/dist/assembly/renderer-lifecycle.d.ts.map +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts +15 -0
- package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready-contract.d.ts +9 -0
- package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready.d.ts +55 -0
- package/dist/assembly/webgpu-ready.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer.d.ts +152 -0
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -0
- package/dist/authoring.mjs +1 -1
- package/dist/{chunk-PCHBPYML.mjs → chunk-GE3SDD72.mjs} +37 -5
- package/dist/chunk-GE3SDD72.mjs.map +1 -0
- package/dist/chunk-KZFTK6DO.mjs +1191 -0
- package/dist/chunk-KZFTK6DO.mjs.map +1 -0
- package/dist/{chunk-FS2KNUQH.mjs → chunk-Q752SHI5.mjs} +332 -568
- package/dist/chunk-Q752SHI5.mjs.map +1 -0
- package/dist/{chunk-6OPXDQ2E.mjs → chunk-RR5L4SRS.mjs} +33 -294
- package/dist/chunk-RR5L4SRS.mjs.map +1 -0
- package/dist/chunk-TFH5I7JJ.mjs +296 -0
- package/dist/chunk-TFH5I7JJ.mjs.map +1 -0
- package/dist/chunk-UQYS7FRM.mjs +1003 -0
- package/dist/chunk-UQYS7FRM.mjs.map +1 -0
- package/dist/chunk-YKB5DQV7.mjs +345 -0
- package/dist/chunk-YKB5DQV7.mjs.map +1 -0
- package/dist/{chunk-5YADUCA7.mjs → chunk-YRUYGA4A.mjs} +1189 -1217
- package/dist/chunk-YRUYGA4A.mjs.map +1 -0
- package/dist/chunk-Z3YYH2MB.mjs +5082 -0
- package/dist/chunk-Z3YYH2MB.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 +27276 -23232
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/device-scope.d.ts +2 -0
- package/dist/device/device-scope.d.ts.map +1 -1
- package/dist/device/gpu-residency.d.ts +32 -5
- 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/frame.d.ts +5 -0
- package/dist/environment/frame.d.ts.map +1 -1
- package/dist/environment/inspection.d.ts +7 -0
- package/dist/environment/inspection.d.ts.map +1 -1
- package/dist/environment/lifecycle.d.ts +20 -2
- 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 +67 -3
- package/dist/errors/recover.d.ts.map +1 -1
- package/dist/errors/render.d.ts +39 -1
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/contracts.d.ts +899 -0
- package/dist/extract/contracts.d.ts.map +1 -0
- 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/features/host.d.ts +2 -0
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +3 -0
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics-store.d.ts +2 -0
- package/dist/features/prepared-graphics-store.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 +126 -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 +9 -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/ibl/IblPipelineCache.d.ts +7 -6
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +7 -1
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +13 -2
- 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 +60 -148
- package/dist/light-buffer-layout.d.ts.map +1 -1
- package/dist/materials.d.ts +34 -10
- package/dist/materials.d.ts.map +1 -1
- package/dist/mesh-material-bindings.d.ts +56 -0
- package/dist/mesh-material-bindings.d.ts.map +1 -1
- package/dist/occlusion-proxy.d.ts +4 -0
- package/dist/occlusion-proxy.d.ts.map +1 -0
- package/dist/pbr-pipeline.d.ts +58 -21
- 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/points-lines/prepare.d.ts +3 -0
- package/dist/points-lines/prepare.d.ts.map +1 -1
- package/dist/points-lines/standard-owner.d.ts +33 -0
- package/dist/points-lines/standard-owner.d.ts.map +1 -0
- 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 +55 -10
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +21 -5
- 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 +20 -2
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +10 -18
- 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.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +11 -3
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/recovery-pipeline.d.ts +30 -0
- package/dist/record/recovery-pipeline.d.ts.map +1 -0
- package/dist/record/render-context.d.ts +82 -9
- 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/recovery/render-system-candidate.d.ts +65 -0
- package/dist/recovery/render-system-candidate.d.ts.map +1 -0
- 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 +78 -15
- 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-tail.d.ts +12 -0
- package/dist/render-system-extract-tail.d.ts.map +1 -0
- package/dist/render-system-extract.d.ts +252 -30
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +140 -5
- 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 +122 -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/taa-history-store.d.ts +15 -1
- package/dist/temporal/taa-history-store.d.ts.map +1 -1
- package/dist/temporal/transaction.d.ts +5 -0
- package/dist/temporal/transaction.d.ts.map +1 -1
- 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 +19 -1
- package/src/__tests__/device-loss-fanout.unit.test.ts +107 -0
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +21 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +59 -3
- package/src/__tests__/environment-generation.integration.test.ts +39 -0
- package/src/__tests__/evidence-identity.ts +13 -0
- package/src/__tests__/evidence-identity.unit.test.ts +24 -0
- package/src/__tests__/expose-renderer-errors.unit.test.ts +34 -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 +154 -6
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +4 -1
- 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__/ibl/face-uniforms.unit.test.ts +2 -0
- package/src/__tests__/ibl-residency-publication.unit.test.ts +113 -0
- 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 +41 -9
- package/src/__tests__/material-cooked-projection.unit.test.ts +19 -1
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +29 -0
- package/src/__tests__/material-stride-surface.unit.test.ts +7 -3
- package/src/__tests__/materials-standard-contract.unit.test.ts +104 -0
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
- 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__/physical-clearcoat.integration.test.ts +89 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +1 -1
- 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__/recover-error-policy-owner.unit.test.ts +6 -3
- package/src/__tests__/recovery-candidate-prepare.contract.test.ts +140 -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 +160 -17
- package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +47 -0
- package/src/__tests__/renderer-generation-assembly.unit.test.ts +77 -0
- package/src/__tests__/renderer-generation-failure.unit.test.ts +108 -0
- package/src/__tests__/renderer-producer-root-matrix.integration.test.ts +33 -0
- package/src/__tests__/renderer-recovery-capability-matrix.unit.test.ts +59 -0
- package/src/__tests__/renderer-recovery-contract.unit.test.ts +73 -0
- package/src/__tests__/renderer-recovery-lifecycle.unit.test.ts +216 -0
- package/src/__tests__/renderer-target-history-recovery.integration.test.ts +80 -0
- package/src/__tests__/shader-manifest-fixture.ts +13 -16
- package/src/__tests__/shader-stage-surface.unit.test.ts +1 -1
- 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-layer-projection.unit.test.ts +23 -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 +111 -32
- 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/__tests__/volumetric-fog-topology.unit.test.ts +3 -1
- package/src/assembly/backend-contract.ts +13 -0
- package/src/assembly/bundler-contract.ts +9 -0
- package/src/assembly/device-feature-admission.ts +26 -9
- package/src/assembly/extended-lighting-fallback.ts +216 -0
- package/src/assembly/factory.ts +81 -9634
- package/src/assembly/host-contract.ts +10 -0
- package/src/assembly/material/assembly.ts +18 -2
- package/src/assembly/material/standard-layer-projection.ts +16 -0
- package/src/assembly/material-shader-policy.ts +854 -0
- package/src/assembly/material-shader-prewarm.ts +88 -0
- package/src/assembly/mesh-ssbo-grow.ts +270 -0
- package/src/assembly/recovery/device-loss-fanout.ts +89 -0
- package/src/assembly/recovery/generation.ts +141 -0
- package/src/assembly/recovery/recovery-attempt.ts +800 -0
- package/src/assembly/recovery/renderer-recover.ts +906 -0
- package/src/assembly/renderer-facade.ts +342 -0
- package/src/assembly/renderer-frame-transaction.ts +45 -0
- package/src/assembly/renderer-helpers.ts +99 -0
- package/src/assembly/renderer-lifecycle.ts +159 -0
- package/src/assembly/shader-prewarm-policy.ts +157 -0
- package/src/assembly/webgpu-ready-contract.ts +14 -0
- package/src/assembly/webgpu-ready.ts +4079 -0
- package/src/assembly/webgpu-renderer.ts +4095 -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/camera.ts +1 -1
- 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/debug-draw-glue.ts +1 -1
- package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
- package/src/device/device-scope.ts +35 -6
- package/src/device/gpu-residency.ts +334 -35
- package/src/device/lifecycle-transaction.ts +12 -0
- package/src/environment/frame.ts +6 -0
- package/src/environment/inspection.ts +10 -0
- package/src/environment/lifecycle.ts +122 -9
- package/src/errors/gpu-driven.ts +92 -0
- package/src/errors/index.ts +1 -0
- package/src/errors/recover.ts +108 -5
- package/src/errors/render.ts +72 -1
- package/src/extract/camera.ts +3 -3
- package/src/extract/contracts.ts +974 -0
- package/src/extract/gpu-driven.ts +108 -0
- package/src/extract/visibility.ts +0 -23
- package/src/features/host.ts +16 -0
- package/src/features/prepared-gpu-work.ts +20 -2
- package/src/features/prepared-graphics-store.ts +17 -0
- 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 +1046 -39
- package/src/gpu-driven/view-gpu.ts +411 -29
- package/src/gpu-scene-schema.ts +13 -0
- package/src/gpu-scene.ts +137 -67
- package/src/gpu-usage.ts +0 -1
- package/src/hdrp-buffers.ts +6 -6
- package/src/ibl/IblPipelineCache.ts +134 -50
- package/src/ibl/skylight-bind-group.ts +26 -0
- package/src/index.ts +83 -1
- package/src/inspection-types.ts +220 -1
- package/src/internal.ts +38 -0
- package/src/light-buffer-layout.ts +157 -324
- package/src/materials.ts +278 -47
- package/src/mesh-material-bindings.ts +59 -0
- package/src/occlusion-proxy.ts +64 -0
- package/src/pbr-pipeline.ts +290 -60
- 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/points-lines/__tests__/cache-recovery.unit.test.ts +22 -0
- package/src/points-lines/prepare.ts +9 -0
- package/src/points-lines/standard-owner.ts +403 -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__/frame-targets-recovery.unit.test.ts +60 -0
- package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +26 -1
- package/src/record/__tests__/mesh-ssbo.unit.test.ts +38 -0
- package/src/record/__tests__/recovery-pipeline.unit.test.ts +124 -0
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +28 -13
- package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +47 -4
- package/src/record/__tests__/temporal-payload.unit.test.ts +29 -28
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +21 -2
- package/src/record/frame-lighting.ts +252 -53
- package/src/record/frame-snapshot.ts +72 -12
- package/src/record/frame-targets.ts +11 -1
- package/src/record/frame.ts +416 -95
- package/src/record/gpu-timing.ts +108 -44
- package/src/record/helpers.ts +1 -59
- package/src/record/main-pass-geometry.ts +434 -44
- package/src/record/main-pass-material.ts +324 -210
- package/src/record/main-pass-sprite-draws.ts +58 -92
- package/src/record/main-pass.ts +94 -6
- package/src/record/mesh-ssbo.ts +79 -46
- package/src/record/recovery-pipeline.ts +695 -0
- package/src/record/render-context.ts +99 -7
- package/src/record/shadow-pass.ts +66 -40
- package/src/record/typed-frame-graph.ts +270 -84
- package/src/record/view-ubo.ts +17 -27
- package/src/recovery/render-system-candidate.ts +839 -0
- 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 +82 -12
- package/src/render-pipeline.ts +5 -0
- package/src/render-system-extract-tail.ts +2983 -0
- package/src/render-system-extract.ts +290 -2784
- package/src/render-system.ts +1597 -1192
- 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 +972 -184
- 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 +30 -1
- package/src/temporal/frame.ts +14 -1
- package/src/temporal/taa-history-store.ts +46 -2
- package/src/temporal/temporal-view.ts +1 -1
- package/src/temporal/transaction.ts +9 -0
- package/src/temporal/view.ts +11 -0
- package/src/tilemap-chunk-extract-system.ts +5 -5
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +19 -12
- 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 +0 -192
- package/dist/chunk-VFPLTKCU.mjs.map +0 -1
package/src/materials.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { color } from '@forgeax/engine-math';
|
|
1
2
|
import { DEFAULT_STANDARD_PBR_PARAM_SCHEMA } from '@forgeax/engine-shader';
|
|
2
3
|
import type {
|
|
3
4
|
MaterialAsset,
|
|
@@ -7,6 +8,7 @@ import type {
|
|
|
7
8
|
MaterialRenderState,
|
|
8
9
|
MaterialValue,
|
|
9
10
|
} from '@forgeax/engine-types';
|
|
11
|
+
import { deriveStandardLayerPlan } from '@forgeax/engine-types';
|
|
10
12
|
|
|
11
13
|
export type MaterialTransmissionValidationReason =
|
|
12
14
|
| 'non-finite'
|
|
@@ -60,6 +62,49 @@ const STANDARD_MODULE = 'forgeax_material::standard';
|
|
|
60
62
|
const UNLIT_MODULE = 'forgeax_material::unlit';
|
|
61
63
|
const SPRITE_MODULE = 'forgeax_material::sprite';
|
|
62
64
|
|
|
65
|
+
export type MaterialColorTuple3 = readonly [number, number, number];
|
|
66
|
+
export type MaterialColorTuple4 = readonly [number, number, number, number];
|
|
67
|
+
export type MaterialColorInput3 = MaterialColorTuple3 | string | number;
|
|
68
|
+
export type MaterialColorInput4 = MaterialColorTuple4 | string | number;
|
|
69
|
+
|
|
70
|
+
function colorHexFromNumber(value: number): string {
|
|
71
|
+
if (!Number.isInteger(value) || value < 0 || value > 0xffffff) {
|
|
72
|
+
throw new Error(`material color number must be an integer in [0, 0xffffff], got ${value}`);
|
|
73
|
+
}
|
|
74
|
+
return `#${value.toString(16).padStart(6, '0')}`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function linearColorFromInput(
|
|
78
|
+
input: MaterialColorInput3 | MaterialColorInput4,
|
|
79
|
+
channels: 3 | 4,
|
|
80
|
+
): readonly number[] {
|
|
81
|
+
if (typeof input === 'number' || typeof input === 'string') {
|
|
82
|
+
const parsed = color.create();
|
|
83
|
+
color.fromCss(parsed, typeof input === 'number' ? colorHexFromNumber(input) : input);
|
|
84
|
+
return channels === 3
|
|
85
|
+
? [parsed[0] as number, parsed[1] as number, parsed[2] as number]
|
|
86
|
+
: Array.from(parsed);
|
|
87
|
+
}
|
|
88
|
+
if (input.length !== channels) {
|
|
89
|
+
throw new Error(`material color tuple must contain ${channels} channels, got ${input.length}`);
|
|
90
|
+
}
|
|
91
|
+
return [...input];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Convert an explicit sRGB numeric tuple into the linear tuple factories store. */
|
|
95
|
+
export function srgb(input: MaterialColorTuple3): MaterialColorTuple3;
|
|
96
|
+
export function srgb(input: MaterialColorTuple4): MaterialColorTuple4;
|
|
97
|
+
export function srgb(input: readonly number[]): readonly number[] {
|
|
98
|
+
if (input.length !== 3 && input.length !== 4) {
|
|
99
|
+
throw new Error(`sRGB material color tuple must contain 3 or 4 channels, got ${input.length}`);
|
|
100
|
+
}
|
|
101
|
+
const parsed = color.create(input[0] ?? 0, input[1] ?? 0, input[2] ?? 0, input[3] ?? 1);
|
|
102
|
+
color.srgbToLinear(parsed, parsed);
|
|
103
|
+
return input.length === 3
|
|
104
|
+
? [parsed[0] as number, parsed[1] as number, parsed[2] as number]
|
|
105
|
+
: [parsed[0] as number, parsed[1] as number, parsed[2] as number, parsed[3] as number];
|
|
106
|
+
}
|
|
107
|
+
|
|
63
108
|
function authoredColorParameter(
|
|
64
109
|
name: string,
|
|
65
110
|
type: 'color' | 'vec3',
|
|
@@ -74,27 +119,148 @@ function authoredColorParameter(
|
|
|
74
119
|
};
|
|
75
120
|
}
|
|
76
121
|
|
|
77
|
-
function standardParameters(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
122
|
+
function standardParameters(
|
|
123
|
+
colorSpace: MaterialColorSpace,
|
|
124
|
+
opts: StandardOpts,
|
|
125
|
+
): readonly MaterialParameter[] {
|
|
126
|
+
const physicalNames = new Set<string>();
|
|
127
|
+
const addPhysical = (...names: readonly string[]) => {
|
|
128
|
+
for (const name of names) physicalNames.add(name);
|
|
129
|
+
};
|
|
130
|
+
if (
|
|
131
|
+
opts.clearcoat !== undefined ||
|
|
132
|
+
opts.clearcoatRoughness !== undefined ||
|
|
133
|
+
opts.clearcoatNormalScale !== undefined ||
|
|
134
|
+
opts.clearcoatTexture !== undefined ||
|
|
135
|
+
opts.clearcoatRoughnessTexture !== undefined ||
|
|
136
|
+
opts.clearcoatNormalTexture !== undefined
|
|
137
|
+
) {
|
|
138
|
+
addPhysical(
|
|
139
|
+
'clearcoat',
|
|
140
|
+
'clearcoatRoughness',
|
|
141
|
+
'clearcoatNormalScale',
|
|
142
|
+
...(opts.clearcoatTexture === undefined ? [] : ['clearcoatTexture']),
|
|
143
|
+
...(opts.clearcoatRoughnessTexture === undefined ? [] : ['clearcoatRoughnessTexture']),
|
|
144
|
+
...(opts.clearcoatNormalTexture === undefined ? [] : ['clearcoatNormalTexture']),
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
if (
|
|
148
|
+
opts.anisotropyStrength !== undefined ||
|
|
149
|
+
opts.anisotropyRotation !== undefined ||
|
|
150
|
+
opts.anisotropyTexture !== undefined
|
|
151
|
+
) {
|
|
152
|
+
addPhysical('anisotropyStrength', 'anisotropyRotation');
|
|
153
|
+
if (opts.anisotropyTexture !== undefined) addPhysical('anisotropyTexture');
|
|
154
|
+
}
|
|
155
|
+
if (
|
|
156
|
+
opts.sheenColor !== undefined ||
|
|
157
|
+
opts.sheenRoughness !== undefined ||
|
|
158
|
+
opts.sheenColorTexture !== undefined ||
|
|
159
|
+
opts.sheenRoughnessTexture !== undefined
|
|
160
|
+
) {
|
|
161
|
+
addPhysical('sheenColor', 'sheenRoughness');
|
|
162
|
+
if (opts.sheenColorTexture !== undefined) addPhysical('sheenColorTexture');
|
|
163
|
+
if (opts.sheenRoughnessTexture !== undefined) addPhysical('sheenRoughnessTexture');
|
|
164
|
+
}
|
|
165
|
+
if (
|
|
166
|
+
opts.iridescence !== undefined ||
|
|
167
|
+
opts.iridescenceIor !== undefined ||
|
|
168
|
+
opts.iridescenceThicknessMinimum !== undefined ||
|
|
169
|
+
opts.iridescenceThicknessMaximum !== undefined ||
|
|
170
|
+
opts.iridescenceTexture !== undefined ||
|
|
171
|
+
opts.iridescenceThicknessTexture !== undefined
|
|
172
|
+
) {
|
|
173
|
+
addPhysical(
|
|
174
|
+
'iridescence',
|
|
175
|
+
'iridescenceIor',
|
|
176
|
+
'iridescenceThicknessMinimum',
|
|
177
|
+
'iridescenceThicknessMaximum',
|
|
178
|
+
...(opts.iridescenceTexture === undefined ? [] : ['iridescenceTexture']),
|
|
179
|
+
...(opts.iridescenceThicknessTexture === undefined ? [] : ['iridescenceThicknessTexture']),
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
const baseNames = new Set([
|
|
183
|
+
'baseColor',
|
|
184
|
+
'metallic',
|
|
185
|
+
'roughness',
|
|
186
|
+
'metallicChannel',
|
|
187
|
+
'roughnessChannel',
|
|
188
|
+
'aoChannel',
|
|
189
|
+
'extraChannel',
|
|
190
|
+
'emissive',
|
|
191
|
+
'emissiveIntensity',
|
|
192
|
+
'occlusionStrength',
|
|
193
|
+
'alphaCutoff',
|
|
194
|
+
'normalScale',
|
|
195
|
+
'baseColorTexture',
|
|
196
|
+
'metallicRoughnessTexture',
|
|
197
|
+
'normalTexture',
|
|
198
|
+
'emissiveTexture',
|
|
199
|
+
'occlusionTexture',
|
|
200
|
+
'specular',
|
|
201
|
+
'specularColor',
|
|
202
|
+
// IOR is part of the always-present dielectric F0 contract. The
|
|
203
|
+
// transmission layer may be absent, but the Standard shader still
|
|
204
|
+
// consumes this scalar for the base reflection path.
|
|
205
|
+
'ior',
|
|
206
|
+
]);
|
|
207
|
+
if (opts.specularTexture !== undefined) baseNames.add('specularTexture');
|
|
208
|
+
if (opts.specularColorTexture !== undefined) baseNames.add('specularColorTexture');
|
|
209
|
+
if (
|
|
210
|
+
opts.transmission !== undefined ||
|
|
211
|
+
opts.ior !== undefined ||
|
|
212
|
+
opts.thickness !== undefined ||
|
|
213
|
+
opts.transmissionTexture !== undefined ||
|
|
214
|
+
opts.thicknessTexture !== undefined ||
|
|
215
|
+
opts.attenuationColor !== undefined ||
|
|
216
|
+
opts.attenuationDistance !== undefined
|
|
217
|
+
) {
|
|
218
|
+
for (const name of [
|
|
219
|
+
'transmission',
|
|
220
|
+
'ior',
|
|
221
|
+
'thickness',
|
|
222
|
+
'attenuationColor',
|
|
223
|
+
'attenuationDistance',
|
|
224
|
+
'transmissionTexture',
|
|
225
|
+
'thicknessTexture',
|
|
226
|
+
]) {
|
|
227
|
+
baseNames.add(name);
|
|
90
228
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
229
|
+
}
|
|
230
|
+
// All Standard fields come from one root schema. Physical fields are
|
|
231
|
+
// projected by the authored option membership above; appending a second
|
|
232
|
+
// physical schema would create a parallel ABI authority.
|
|
233
|
+
const availableSchema = DEFAULT_STANDARD_PBR_PARAM_SCHEMA;
|
|
234
|
+
// Keep the generated Standard UBO's numeric run contiguous before any
|
|
235
|
+
// texture coordinate records. The built-in WGSL places the complete
|
|
236
|
+
// physical root (including clearcoat scalars) after the base numeric run
|
|
237
|
+
// and before all coordinate pairs; appending physical entries after the
|
|
238
|
+
// base texture records would otherwise derive a different ABI.
|
|
239
|
+
const numericSchema = availableSchema.filter((entry) => !entry.type.startsWith('texture'));
|
|
240
|
+
const textureSchema = availableSchema.filter((entry) => entry.type.startsWith('texture'));
|
|
241
|
+
const orderedSchema = [...numericSchema, ...textureSchema];
|
|
242
|
+
return orderedSchema
|
|
243
|
+
.filter((entry) => baseNames.has(entry.name) || physicalNames.has(entry.name))
|
|
244
|
+
.map((entry) => {
|
|
245
|
+
const type = entry.type.startsWith('texture') ? 'texture' : entry.type;
|
|
246
|
+
const isRequired =
|
|
247
|
+
entry.name === 'baseColor' || entry.name === 'metallic' || entry.name === 'roughness';
|
|
248
|
+
const authoredColor =
|
|
249
|
+
entry.type === 'color' || (entry.type === 'vec3' && entry.name !== 'attenuationColor');
|
|
250
|
+
const schemaColorSpace = 'colorSpace' in entry ? entry.colorSpace : undefined;
|
|
251
|
+
const colorSpaceProjection: { colorSpace?: MaterialColorSpace } = {};
|
|
252
|
+
if (authoredColor && !(type === 'color' && colorSpace === 'srgb')) {
|
|
253
|
+
colorSpaceProjection.colorSpace = colorSpace;
|
|
254
|
+
} else if (!authoredColor && schemaColorSpace !== undefined) {
|
|
255
|
+
colorSpaceProjection.colorSpace = schemaColorSpace;
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
name: entry.name,
|
|
259
|
+
type,
|
|
260
|
+
...colorSpaceProjection,
|
|
261
|
+
...(isRequired ? {} : { optional: true }),
|
|
262
|
+
} as MaterialParameter;
|
|
263
|
+
});
|
|
98
264
|
}
|
|
99
265
|
|
|
100
266
|
function unlitParameters(colorSpace: MaterialColorSpace): readonly MaterialParameter[] {
|
|
@@ -130,9 +296,17 @@ function pass(
|
|
|
130
296
|
};
|
|
131
297
|
}
|
|
132
298
|
|
|
299
|
+
function shadowCasterRenderState(
|
|
300
|
+
renderState: MaterialRenderState | undefined,
|
|
301
|
+
): MaterialRenderState | undefined {
|
|
302
|
+
if (renderState?.cullMode === undefined && renderState?.frontFace === undefined) return undefined;
|
|
303
|
+
return {
|
|
304
|
+
...(renderState.cullMode === undefined ? {} : { cullMode: renderState.cullMode }),
|
|
305
|
+
...(renderState.frontFace === undefined ? {} : { frontFace: renderState.frontFace }),
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
|
|
133
309
|
interface UnlitOpts {
|
|
134
|
-
/** Asset-side authored color space. Defaults to sRGB. */
|
|
135
|
-
readonly colorSpace?: MaterialColorSpace;
|
|
136
310
|
readonly castShadow?: boolean;
|
|
137
311
|
readonly baseColorTexture?: MaterialValue;
|
|
138
312
|
readonly alphaCutoff?: number;
|
|
@@ -140,32 +314,31 @@ interface UnlitOpts {
|
|
|
140
314
|
readonly queue?: number;
|
|
141
315
|
}
|
|
142
316
|
|
|
143
|
-
function unlit(rgba:
|
|
317
|
+
function unlit(rgba: MaterialColorInput4, opts?: UnlitOpts): MaterialAsset {
|
|
144
318
|
if (opts?.alphaCutoff !== undefined && (opts.alphaCutoff < 0 || opts.alphaCutoff > 1)) {
|
|
145
319
|
throw new Error(`Materials.unlit: alphaCutoff must be in [0, 1], got ${opts.alphaCutoff}`);
|
|
146
320
|
}
|
|
147
|
-
const values: Record<string, MaterialValue> = { baseColor: rgba };
|
|
321
|
+
const values: Record<string, MaterialValue> = { baseColor: linearColorFromInput(rgba, 4) };
|
|
148
322
|
if (opts?.baseColorTexture !== undefined) values.baseColorTexture = opts.baseColorTexture;
|
|
149
323
|
if (opts?.alphaCutoff !== undefined) values.alphaCutoff = opts.alphaCutoff;
|
|
150
324
|
const passes: [MaterialPass, ...MaterialPass[]] = [
|
|
151
325
|
pass('forward', UNLIT_MODULE, opts?.renderState, undefined, opts?.queue),
|
|
152
326
|
];
|
|
153
|
-
if (opts?.castShadow !== false)
|
|
327
|
+
if (opts?.castShadow !== false) {
|
|
328
|
+
passes.push(pass('shadow-caster', UNLIT_MODULE, shadowCasterRenderState(opts?.renderState)));
|
|
329
|
+
}
|
|
154
330
|
return {
|
|
155
331
|
kind: 'material',
|
|
156
|
-
|
|
157
|
-
? {}
|
|
158
|
-
: { colorSpace: opts.colorSpace }),
|
|
332
|
+
colorSpace: 'linear',
|
|
159
333
|
passes,
|
|
160
|
-
parameters: unlitParameters(
|
|
334
|
+
parameters: unlitParameters('linear'),
|
|
161
335
|
values,
|
|
162
336
|
};
|
|
163
337
|
}
|
|
164
338
|
|
|
165
339
|
interface StandardOpts {
|
|
166
|
-
/**
|
|
167
|
-
readonly
|
|
168
|
-
readonly baseColor: readonly [number, number, number, number];
|
|
340
|
+
/** Numeric tuples are linear; Hex/CSS strings and numbers are sRGB inputs. */
|
|
341
|
+
readonly baseColor: MaterialColorInput4;
|
|
169
342
|
readonly metallic?: number;
|
|
170
343
|
readonly roughness?: number;
|
|
171
344
|
/** Texture channel used for the metallic factor; glTF defaults to B (2). */
|
|
@@ -174,9 +347,28 @@ interface StandardOpts {
|
|
|
174
347
|
readonly roughnessChannel?: number;
|
|
175
348
|
readonly clearcoat?: number;
|
|
176
349
|
readonly clearcoatRoughness?: number;
|
|
177
|
-
readonly
|
|
178
|
-
readonly
|
|
179
|
-
readonly
|
|
350
|
+
readonly clearcoatTexture?: MaterialValue;
|
|
351
|
+
readonly clearcoatRoughnessTexture?: MaterialValue;
|
|
352
|
+
readonly clearcoatNormalTexture?: MaterialValue;
|
|
353
|
+
readonly clearcoatNormalScale?: number;
|
|
354
|
+
readonly anisotropyStrength?: number;
|
|
355
|
+
readonly anisotropyRotation?: number;
|
|
356
|
+
readonly anisotropyTexture?: MaterialValue;
|
|
357
|
+
readonly sheenColor?: MaterialColorInput3;
|
|
358
|
+
readonly sheenRoughness?: number;
|
|
359
|
+
readonly sheenColorTexture?: MaterialValue;
|
|
360
|
+
readonly sheenRoughnessTexture?: MaterialValue;
|
|
361
|
+
readonly iridescence?: number;
|
|
362
|
+
readonly iridescenceIor?: number;
|
|
363
|
+
readonly iridescenceThicknessMinimum?: number;
|
|
364
|
+
readonly iridescenceThicknessMaximum?: number;
|
|
365
|
+
readonly iridescenceTexture?: MaterialValue;
|
|
366
|
+
readonly iridescenceThicknessTexture?: MaterialValue;
|
|
367
|
+
readonly specular?: number;
|
|
368
|
+
readonly specularColor?: MaterialColorInput3;
|
|
369
|
+
readonly specularTexture?: MaterialValue;
|
|
370
|
+
readonly specularColorTexture?: MaterialValue;
|
|
371
|
+
readonly emissive?: MaterialColorInput3;
|
|
180
372
|
readonly emissiveIntensity?: number;
|
|
181
373
|
readonly emissiveTexture?: MaterialValue;
|
|
182
374
|
readonly baseColorTexture?: MaterialValue;
|
|
@@ -254,11 +446,13 @@ function standard(opts: StandardOpts): MaterialAsset {
|
|
|
254
446
|
throw new MaterialTransmissionContractError('transmission', 'depth-write', true);
|
|
255
447
|
}
|
|
256
448
|
const values: Record<string, MaterialValue> = {
|
|
257
|
-
baseColor: opts.baseColor,
|
|
449
|
+
baseColor: linearColorFromInput(opts.baseColor, 4),
|
|
258
450
|
metallic: opts.metallic ?? 0,
|
|
259
451
|
roughness: opts.roughness ?? 0.5,
|
|
260
452
|
occlusionStrength,
|
|
261
|
-
|
|
453
|
+
specular: opts.specular ?? 1,
|
|
454
|
+
specularColor:
|
|
455
|
+
opts.specularColor === undefined ? [1, 1, 1] : linearColorFromInput(opts.specularColor, 3),
|
|
262
456
|
transmission,
|
|
263
457
|
ior,
|
|
264
458
|
thickness,
|
|
@@ -268,7 +462,37 @@ function standard(opts: StandardOpts): MaterialAsset {
|
|
|
268
462
|
if (opts.roughnessChannel !== undefined) values.roughnessChannel = opts.roughnessChannel;
|
|
269
463
|
if (opts.clearcoat !== undefined) values.clearcoat = opts.clearcoat;
|
|
270
464
|
if (opts.clearcoatRoughness !== undefined) values.clearcoatRoughness = opts.clearcoatRoughness;
|
|
271
|
-
if (opts.
|
|
465
|
+
if (opts.clearcoatTexture !== undefined) values.clearcoatTexture = opts.clearcoatTexture;
|
|
466
|
+
if (opts.clearcoatRoughnessTexture !== undefined) {
|
|
467
|
+
values.clearcoatRoughnessTexture = opts.clearcoatRoughnessTexture;
|
|
468
|
+
}
|
|
469
|
+
if (opts.clearcoatNormalTexture !== undefined) {
|
|
470
|
+
values.clearcoatNormalTexture = opts.clearcoatNormalTexture;
|
|
471
|
+
}
|
|
472
|
+
if (opts.clearcoatNormalScale !== undefined)
|
|
473
|
+
values.clearcoatNormalScale = opts.clearcoatNormalScale;
|
|
474
|
+
if (opts.anisotropyStrength !== undefined) values.anisotropyStrength = opts.anisotropyStrength;
|
|
475
|
+
if (opts.anisotropyRotation !== undefined) values.anisotropyRotation = opts.anisotropyRotation;
|
|
476
|
+
if (opts.anisotropyTexture !== undefined) values.anisotropyTexture = opts.anisotropyTexture;
|
|
477
|
+
if (opts.sheenColor !== undefined) values.sheenColor = linearColorFromInput(opts.sheenColor, 3);
|
|
478
|
+
if (opts.sheenRoughness !== undefined) values.sheenRoughness = opts.sheenRoughness;
|
|
479
|
+
if (opts.sheenColorTexture !== undefined) values.sheenColorTexture = opts.sheenColorTexture;
|
|
480
|
+
if (opts.sheenRoughnessTexture !== undefined) {
|
|
481
|
+
values.sheenRoughnessTexture = opts.sheenRoughnessTexture;
|
|
482
|
+
}
|
|
483
|
+
if (opts.iridescence !== undefined) values.iridescence = opts.iridescence;
|
|
484
|
+
if (opts.iridescenceIor !== undefined) values.iridescenceIor = opts.iridescenceIor;
|
|
485
|
+
if (opts.iridescenceThicknessMinimum !== undefined) {
|
|
486
|
+
values.iridescenceThicknessMinimum = opts.iridescenceThicknessMinimum;
|
|
487
|
+
}
|
|
488
|
+
if (opts.iridescenceThicknessMaximum !== undefined) {
|
|
489
|
+
values.iridescenceThicknessMaximum = opts.iridescenceThicknessMaximum;
|
|
490
|
+
}
|
|
491
|
+
if (opts.iridescenceTexture !== undefined) values.iridescenceTexture = opts.iridescenceTexture;
|
|
492
|
+
if (opts.iridescenceThicknessTexture !== undefined) {
|
|
493
|
+
values.iridescenceThicknessTexture = opts.iridescenceThicknessTexture;
|
|
494
|
+
}
|
|
495
|
+
if (opts.emissive !== undefined) values.emissive = linearColorFromInput(opts.emissive, 3);
|
|
272
496
|
if (opts.emissiveIntensity !== undefined) values.emissiveIntensity = opts.emissiveIntensity;
|
|
273
497
|
if (opts.emissiveTexture !== undefined) values.emissiveTexture = opts.emissiveTexture;
|
|
274
498
|
if (opts.baseColorTexture !== undefined) values.baseColorTexture = opts.baseColorTexture;
|
|
@@ -277,8 +501,9 @@ function standard(opts: StandardOpts): MaterialAsset {
|
|
|
277
501
|
}
|
|
278
502
|
if (opts.normalTexture !== undefined) values.normalTexture = opts.normalTexture;
|
|
279
503
|
if (opts.occlusionTexture !== undefined) values.occlusionTexture = opts.occlusionTexture;
|
|
280
|
-
if (opts.
|
|
281
|
-
|
|
504
|
+
if (opts.specularTexture !== undefined) values.specularTexture = opts.specularTexture;
|
|
505
|
+
if (opts.specularColorTexture !== undefined) {
|
|
506
|
+
values.specularColorTexture = opts.specularColorTexture;
|
|
282
507
|
}
|
|
283
508
|
if (opts.alphaCutoff !== undefined) values.alphaCutoff = opts.alphaCutoff;
|
|
284
509
|
if (opts.transmissionTexture !== undefined) values.transmissionTexture = opts.transmissionTexture;
|
|
@@ -286,24 +511,30 @@ function standard(opts: StandardOpts): MaterialAsset {
|
|
|
286
511
|
if (opts.attenuationDistance !== undefined) values.attenuationDistance = opts.attenuationDistance;
|
|
287
512
|
const forwardRenderState =
|
|
288
513
|
transmission > 0 ? { ...(opts.renderState ?? {}), depthWriteEnabled: false } : opts.renderState;
|
|
514
|
+
const parameters = standardParameters('linear', opts);
|
|
515
|
+
const declaredNames = new Set(parameters.map((parameter) => parameter.name));
|
|
516
|
+
for (const name of Object.keys(values)) {
|
|
517
|
+
if (!declaredNames.has(name)) delete values[name];
|
|
518
|
+
}
|
|
519
|
+
const physical = deriveStandardLayerPlan(parameters).mode === 'physical';
|
|
289
520
|
const passes: [MaterialPass, ...MaterialPass[]] = [
|
|
290
521
|
pass('forward', STANDARD_MODULE, forwardRenderState, 'fs_main', opts.queue),
|
|
291
522
|
];
|
|
292
|
-
if (transmission === 0) {
|
|
523
|
+
if (!physical && transmission === 0) {
|
|
293
524
|
passes.push(pass('deferred', STANDARD_MODULE, opts.renderState, 'fs_gbuffer', opts.queue));
|
|
294
525
|
}
|
|
295
|
-
if (opts.castShadow !== false)
|
|
526
|
+
if (opts.castShadow !== false) {
|
|
527
|
+
passes.push(pass('shadow-caster', STANDARD_MODULE, shadowCasterRenderState(opts.renderState)));
|
|
528
|
+
}
|
|
296
529
|
return {
|
|
297
530
|
kind: 'material',
|
|
298
|
-
|
|
299
|
-
? {}
|
|
300
|
-
: { colorSpace: opts.colorSpace }),
|
|
531
|
+
colorSpace: 'linear',
|
|
301
532
|
passes,
|
|
302
|
-
parameters
|
|
533
|
+
parameters,
|
|
303
534
|
values,
|
|
304
535
|
};
|
|
305
536
|
}
|
|
306
537
|
|
|
307
|
-
export const Materials = { unlit, standard } as const;
|
|
538
|
+
export const Materials = { unlit, standard, srgb } as const;
|
|
308
539
|
|
|
309
540
|
export { SPRITE_MODULE };
|
|
@@ -12,6 +12,65 @@ export interface MeshMaterialBindingDiagnostic {
|
|
|
12
12
|
readonly detail?: Readonly<AssetErrorDetail>;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
/** Detached final-frame receipt for the Standard material IBL binding chain. */
|
|
16
|
+
export interface IblBindingResourceInspection {
|
|
17
|
+
readonly viewIdentity: number;
|
|
18
|
+
readonly samplerIdentity: number;
|
|
19
|
+
readonly deviceGeneration: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface IblBindingEntryInspection {
|
|
23
|
+
readonly binding: number;
|
|
24
|
+
readonly kind: 'textureView' | 'sampler' | 'buffer';
|
|
25
|
+
readonly resourceIdentity: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface IblBindingInspection {
|
|
29
|
+
readonly status: 'binding-chain-consistent' | 'binding-chain-mismatch';
|
|
30
|
+
readonly frameId: number;
|
|
31
|
+
readonly deviceGeneration: number;
|
|
32
|
+
readonly active: 'active' | 'fallback';
|
|
33
|
+
readonly cache: {
|
|
34
|
+
readonly identity: number;
|
|
35
|
+
readonly generation: number;
|
|
36
|
+
readonly prefilterMipCount: number;
|
|
37
|
+
readonly prefilterViewMipCount: number;
|
|
38
|
+
};
|
|
39
|
+
readonly sampler: {
|
|
40
|
+
readonly expected: {
|
|
41
|
+
readonly magFilter: 'linear';
|
|
42
|
+
readonly minFilter: 'linear';
|
|
43
|
+
readonly mipmapFilter: 'linear';
|
|
44
|
+
readonly addressModeU: 'clamp-to-edge';
|
|
45
|
+
readonly addressModeV: 'clamp-to-edge';
|
|
46
|
+
readonly addressModeW: 'clamp-to-edge';
|
|
47
|
+
};
|
|
48
|
+
readonly identities: readonly number[];
|
|
49
|
+
};
|
|
50
|
+
readonly resources: {
|
|
51
|
+
readonly irradiance: IblBindingResourceInspection;
|
|
52
|
+
readonly prefilter: IblBindingResourceInspection;
|
|
53
|
+
readonly brdfLut: IblBindingResourceInspection;
|
|
54
|
+
readonly intensityBufferIdentity: number;
|
|
55
|
+
};
|
|
56
|
+
readonly material?: {
|
|
57
|
+
readonly bindGroupIdentity: number;
|
|
58
|
+
readonly materialBglIdentity: number;
|
|
59
|
+
readonly cache: 'hit' | 'miss';
|
|
60
|
+
readonly skylightBindingStart: number;
|
|
61
|
+
readonly entries: readonly IblBindingEntryInspection[];
|
|
62
|
+
readonly reflectionBindings: readonly number[];
|
|
63
|
+
};
|
|
64
|
+
readonly pipeline?: {
|
|
65
|
+
readonly pipelineIdentity: number;
|
|
66
|
+
readonly effectiveMaterialLayoutIdentity: string | undefined;
|
|
67
|
+
readonly materialBglIdentity: number;
|
|
68
|
+
readonly bindGroupIdentity: number;
|
|
69
|
+
readonly drawFrameId: number;
|
|
70
|
+
};
|
|
71
|
+
readonly errors: readonly string[];
|
|
72
|
+
}
|
|
73
|
+
|
|
15
74
|
export interface ResolvedMeshMaterialBinding {
|
|
16
75
|
readonly handle: number;
|
|
17
76
|
readonly source: MeshMaterialBindingSource;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { mat4 } from '@forgeax/engine-math';
|
|
2
|
+
import { computeProjectionMatrix, computeViewMatrix } from './record/helpers';
|
|
3
|
+
import type { CameraSnapshot } from './render-contract';
|
|
4
|
+
|
|
5
|
+
/** Build the camera-facing proxy geometry used by GPU occlusion queries. */
|
|
6
|
+
export function buildOcclusionProxyVertices(
|
|
7
|
+
aabb: ArrayLike<number>,
|
|
8
|
+
world: ArrayLike<number>,
|
|
9
|
+
camera: CameraSnapshot,
|
|
10
|
+
): Float32Array {
|
|
11
|
+
const view = computeViewMatrix(camera);
|
|
12
|
+
const projection = computeProjectionMatrix(camera);
|
|
13
|
+
const viewProjection = mat4.create();
|
|
14
|
+
mat4.multiply(viewProjection, projection, view);
|
|
15
|
+
const corners = [
|
|
16
|
+
[aabb[0] ?? 0, aabb[1] ?? 0, aabb[2] ?? 0],
|
|
17
|
+
[aabb[3] ?? 0, aabb[1] ?? 0, aabb[2] ?? 0],
|
|
18
|
+
[aabb[3] ?? 0, aabb[4] ?? 0, aabb[2] ?? 0],
|
|
19
|
+
[aabb[0] ?? 0, aabb[4] ?? 0, aabb[2] ?? 0],
|
|
20
|
+
[aabb[0] ?? 0, aabb[1] ?? 0, aabb[5] ?? 0],
|
|
21
|
+
[aabb[3] ?? 0, aabb[1] ?? 0, aabb[5] ?? 0],
|
|
22
|
+
[aabb[3] ?? 0, aabb[4] ?? 0, aabb[5] ?? 0],
|
|
23
|
+
[aabb[0] ?? 0, aabb[4] ?? 0, aabb[5] ?? 0],
|
|
24
|
+
];
|
|
25
|
+
const triangles = [
|
|
26
|
+
0, 1, 2, 0, 2, 3, 4, 6, 5, 4, 7, 6, 0, 4, 5, 0, 5, 1, 3, 2, 6, 3, 6, 7, 0, 3, 7, 0, 7, 4, 1, 5,
|
|
27
|
+
6, 1, 6, 2,
|
|
28
|
+
];
|
|
29
|
+
const output = new Float32Array(triangles.length * 4);
|
|
30
|
+
for (let index = 0; index < triangles.length; index += 1) {
|
|
31
|
+
const corner = corners[triangles[index] ?? 0] ?? [0, 0, 0];
|
|
32
|
+
const cx = corner[0] ?? 0;
|
|
33
|
+
const cy = corner[1] ?? 0;
|
|
34
|
+
const cz = corner[2] ?? 0;
|
|
35
|
+
const x = (world[0] ?? 0) * cx + (world[4] ?? 0) * cy + (world[8] ?? 0) * cz + (world[12] ?? 0);
|
|
36
|
+
const y = (world[1] ?? 0) * cx + (world[5] ?? 0) * cy + (world[9] ?? 0) * cz + (world[13] ?? 0);
|
|
37
|
+
const z =
|
|
38
|
+
(world[2] ?? 0) * cx + (world[6] ?? 0) * cy + (world[10] ?? 0) * cz + (world[14] ?? 0);
|
|
39
|
+
const w =
|
|
40
|
+
(world[3] ?? 0) * cx + (world[7] ?? 0) * cy + (world[11] ?? 0) * cz + (world[15] ?? 1);
|
|
41
|
+
const base = index * 4;
|
|
42
|
+
output[base] =
|
|
43
|
+
(viewProjection[0] ?? 0) * x +
|
|
44
|
+
(viewProjection[4] ?? 0) * y +
|
|
45
|
+
(viewProjection[8] ?? 0) * z +
|
|
46
|
+
(viewProjection[12] ?? 0) * w;
|
|
47
|
+
output[base + 1] =
|
|
48
|
+
(viewProjection[1] ?? 0) * x +
|
|
49
|
+
(viewProjection[5] ?? 0) * y +
|
|
50
|
+
(viewProjection[9] ?? 0) * z +
|
|
51
|
+
(viewProjection[13] ?? 0) * w;
|
|
52
|
+
output[base + 2] =
|
|
53
|
+
(viewProjection[2] ?? 0) * x +
|
|
54
|
+
(viewProjection[6] ?? 0) * y +
|
|
55
|
+
(viewProjection[10] ?? 0) * z +
|
|
56
|
+
(viewProjection[14] ?? 0) * w;
|
|
57
|
+
output[base + 3] =
|
|
58
|
+
(viewProjection[3] ?? 0) * x +
|
|
59
|
+
(viewProjection[7] ?? 0) * y +
|
|
60
|
+
(viewProjection[11] ?? 0) * z +
|
|
61
|
+
(viewProjection[15] ?? 0) * w;
|
|
62
|
+
}
|
|
63
|
+
return output;
|
|
64
|
+
}
|