@forgeax/engine-render 0.1.4 → 0.1.7
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 +268 -640
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -1
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +6 -0
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -1
- package/dist/{gpu-driven/view-reference.d.ts → __tests__/gpu-driven-view-reference.d.ts} +4 -4
- package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -1
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
- package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
- package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
- package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
- package/dist/{renderer/backend-selection.d.ts → assembly/backend-contract.d.ts} +15 -4
- package/dist/assembly/backend-contract.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +214 -0
- package/dist/assembly/factory.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +84 -0
- package/dist/assembly/host-contract.d.ts.map +1 -0
- package/dist/{renderer → assembly}/material/assembly.d.ts +0 -1
- package/dist/{renderer → assembly}/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/pipeline-projection.d.ts +30 -0
- package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
- package/dist/authoring.d.ts +11 -11
- package/dist/authoring.d.ts.map +1 -1
- package/dist/authoring.mjs +25 -3
- package/dist/authoring.mjs.map +1 -1
- package/dist/chunk-CQXZC5XI.mjs +182 -0
- package/dist/chunk-CQXZC5XI.mjs.map +1 -0
- package/dist/chunk-HCOGPHKS.mjs +93 -0
- package/dist/chunk-HCOGPHKS.mjs.map +1 -0
- package/dist/chunk-YEJIUW7D.mjs +1152 -0
- package/dist/chunk-YEJIUW7D.mjs.map +1 -0
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +2 -0
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +2 -0
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
- package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
- package/dist/components/glyph-text.d.ts +1 -1
- package/dist/components/glyph-text.d.ts.map +1 -1
- package/dist/components/index.d.ts +4 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/instances.d.ts +1 -1
- package/dist/components/instances.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/lines.d.ts +5 -0
- package/dist/components/lines.d.ts.map +1 -0
- package/dist/components/mesh-filter.d.ts +7 -7
- package/dist/components/mesh-filter.d.ts.map +1 -1
- package/dist/components/points.d.ts +15 -0
- package/dist/components/points.d.ts.map +1 -0
- package/dist/components/scene-instance.d.ts +11 -11
- package/dist/components/skybox-background.d.ts +56 -0
- package/dist/components/skybox-background.d.ts.map +1 -0
- package/dist/components/skylight.d.ts +55 -0
- package/dist/components/skylight.d.ts.map +1 -0
- package/dist/components/sprite-animation.d.ts +2 -3
- package/dist/components/sprite-animation.d.ts.map +1 -1
- package/dist/components/sprite-instances.d.ts +1 -1
- package/dist/components/sprite-playback-mode.d.ts +6 -1
- package/dist/components/sprite-playback-mode.d.ts.map +1 -1
- package/dist/components/sprite-region-override.d.ts +2 -3
- package/dist/components/sprite-region-override.d.ts.map +1 -1
- package/dist/components/tile-layer.d.ts +5 -0
- package/dist/components/tile-layer.d.ts.map +1 -1
- package/dist/construct-renderer.d.ts +18 -1
- package/dist/construct-renderer.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +27463 -4
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/debug-draw-glue.d.ts +2 -53
- package/dist/debug-draw-glue.d.ts.map +1 -1
- package/dist/device/device-scope.d.ts +83 -0
- package/dist/device/device-scope.d.ts.map +1 -0
- package/dist/{gpu-resource-store.d.ts → device/gpu-residency.d.ts} +91 -48
- package/dist/device/gpu-residency.d.ts.map +1 -0
- package/dist/device/resource-types.d.ts +8 -0
- package/dist/device/resource-types.d.ts.map +1 -0
- package/dist/engine-metrics.d.ts +2 -2
- package/dist/engine-metrics.d.ts.map +1 -1
- package/dist/errors/recover.d.ts +28 -1
- package/dist/errors/recover.d.ts.map +1 -1
- package/dist/errors/render.d.ts +320 -248
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/features/fullscreen.d.ts +19 -0
- package/dist/features/fullscreen.d.ts.map +1 -0
- package/dist/features/host.d.ts +32 -26
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/morph/morph-feature.d.ts +39 -5
- package/dist/features/morph/morph-feature.d.ts.map +1 -1
- package/dist/features/plan.d.ts +182 -0
- package/dist/features/plan.d.ts.map +1 -0
- package/dist/features/prepared-gpu-work.d.ts +21 -17
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics-store.d.ts +2 -1
- package/dist/features/prepared-graphics-store.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +11 -21
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-compute.d.ts +2 -2
- package/dist/features/render-graph-compute.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts +4 -7
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +7 -3
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/render-graph-resources.d.ts +6 -6
- package/dist/features/render-graph-resources.d.ts.map +1 -1
- package/dist/features/targets.d.ts +5 -5
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +11 -190
- package/dist/features/types.d.ts.map +1 -1
- package/dist/features/vocabulary.d.ts +14 -0
- package/dist/features/vocabulary.d.ts.map +1 -0
- package/dist/fullscreen-post-process-pass.d.ts +4 -25
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/glyph-text-layout-system.d.ts +3 -2
- package/dist/glyph-text-layout-system.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +6 -75
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +13 -112
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/view-gpu.d.ts +10 -66
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-resource.d.ts +3 -3
- package/dist/gpu-scene-schema.d.ts +1 -94
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +7 -33
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +3 -53
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +74 -180
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +1 -1
- package/dist/index.d.ts +17 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +167 -3
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +72 -0
- package/dist/inspection-types.d.ts.map +1 -0
- package/dist/instance-buffer-cache.d.ts +1 -4
- package/dist/instance-buffer-cache.d.ts.map +1 -1
- package/dist/internal.d.ts +1 -73
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +1 -43
- package/dist/internal.mjs.map +1 -1
- package/dist/lifecycle.d.ts +36 -2
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/materials.d.ts +0 -3
- package/dist/materials.d.ts.map +1 -1
- package/dist/mesh-material-bindings.d.ts +0 -1
- package/dist/mesh-material-bindings.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +77 -29
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts +5 -0
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts +31 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
- package/dist/pipeline/standard-profile.d.ts +40 -0
- package/dist/pipeline/standard-profile.d.ts.map +1 -0
- package/dist/pipeline-builder.d.ts +3 -3
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec-types.d.ts +24 -0
- package/dist/pipeline-spec-types.d.ts.map +1 -0
- package/dist/pipeline-spec.d.ts +16 -155
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/plugin.d.ts +1 -14
- package/dist/plugin.d.ts.map +1 -1
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/points-lines.bench.d.ts +2 -0
- package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +1 -0
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +1 -0
- package/dist/points-lines/admission.d.ts +36 -0
- package/dist/points-lines/admission.d.ts.map +1 -0
- package/dist/points-lines/bounds.d.ts +8 -0
- package/dist/points-lines/bounds.d.ts.map +1 -0
- package/dist/points-lines/expansion-cache.d.ts +28 -0
- package/dist/points-lines/expansion-cache.d.ts.map +1 -0
- package/dist/points-lines/inspection.d.ts +53 -0
- package/dist/points-lines/inspection.d.ts.map +1 -0
- package/dist/points-lines/prepare.d.ts +67 -0
- package/dist/points-lines/prepare.d.ts.map +1 -0
- package/dist/points-lines/record.d.ts +60 -0
- package/dist/points-lines/record.d.ts.map +1 -0
- package/dist/points-lines/snapshot.d.ts +49 -0
- package/dist/points-lines/snapshot.d.ts.map +1 -0
- package/dist/post-process-errors.d.ts +18 -18
- package/dist/post-process-errors.d.ts.map +1 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts +2 -5
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +7 -73
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +44 -44
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts +5 -38
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +64 -52
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/helpers.d.ts +3 -2
- package/dist/record/helpers.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +12 -4
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +90 -59
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +28 -3
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +1 -1
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +276 -3
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +252 -0
- package/dist/record/render-context.d.ts.map +1 -0
- package/dist/record/shadow-pass.d.ts +15 -88
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +1 -1
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +29 -7
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +9 -3
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/render-contract.d.ts +424 -0
- package/dist/render-contract.d.ts.map +1 -0
- package/dist/render-data.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts +14 -362
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +25 -64
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +110 -338
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +24 -713
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +61 -0
- package/dist/scene/render-scene-types.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +112 -0
- package/dist/scene/render-scene.d.ts.map +1 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts +2 -5
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -1
- package/dist/ssao-buffers.d.ts +22 -3
- package/dist/ssao-buffers.d.ts.map +1 -1
- package/dist/systems/skin-palette-allocator.d.ts +2 -4
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
- package/dist/systems/skin-palette-types.d.ts +14 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -0
- package/dist/systems/transparent-sort-config.d.ts +23 -2
- package/dist/systems/transparent-sort-config.d.ts.map +1 -1
- package/dist/tilemap-chunk-extract-system.d.ts +4 -3
- package/dist/tilemap-chunk-extract-system.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +2 -4
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-passes.d.ts +3 -3
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/package.json +23 -23
- package/src/__tests__/authoring-path.unit.test.ts +9 -0
- package/src/__tests__/backend-selection-rhi-capture.test-d.ts +1 -1
- package/src/__tests__/callback-inference.test-d.ts +6 -3
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -4
- package/src/__tests__/construct-renderer-identity.unit.test.ts +15 -2
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
- package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
- package/src/__tests__/direct-extract-consumer-contract.test-d.ts +8 -19
- package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -13
- package/src/__tests__/factory-contract.integration.test.ts +158 -209
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +1 -4
- package/src/__tests__/frame-observation.contract.test.ts +17 -8
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
- package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +6 -11
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +21 -18
- package/src/__tests__/gpu-driven-production.integration.test.ts +32 -205
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +4 -7
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +87 -8
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +170 -8
- package/src/{gpu-driven/view-reference.ts → __tests__/gpu-driven-view-reference.ts} +4 -3
- package/src/__tests__/gpu-driven-view.browser.test.ts +12 -1
- package/src/__tests__/gpu-driven-view.dawn.test.ts +12 -1
- package/src/__tests__/gpu-driven-view.unit.test.ts +11 -267
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +3 -3
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +2 -3
- package/src/__tests__/gpu-scene.dawn.test.ts +2 -6
- package/src/__tests__/gpu-scene.unit.test.ts +10 -24
- package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
- package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +34 -66
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -5
- package/src/__tests__/light-buffer-layout.unit.test.ts +4 -49
- package/src/__tests__/material-cooked-projection.unit.test.ts +31 -58
- package/src/__tests__/material-snapshot-mutation.integration.test.ts +10 -15
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +31 -50
- package/src/__tests__/material-stride-surface.unit.test.ts +2 -2
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +7 -8
- package/src/__tests__/morph-culling-reentry.dawn.test.ts +29 -38
- package/src/__tests__/morph-feature-gpu-work.integration.test.ts +45 -43
- package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
- package/src/__tests__/morph-visual-evidence.integration.test.ts +47 -33
- package/src/__tests__/nineslice-handle-surface.unit.test.ts +11 -6
- package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -13
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +6 -81
- package/src/__tests__/prepared-graphics-generation.unit.test.ts +3 -17
- package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +6 -74
- package/src/__tests__/prepared-graphics-resolver.unit.test.ts +1 -3
- package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +2 -2
- package/src/__tests__/profiler-default-off.test.ts +1 -1
- package/src/__tests__/profiler-phase-catalog.test.ts +2 -2
- package/src/__tests__/profiler-phase-integration.test.ts +5 -13
- package/src/__tests__/profiler-phase-token.test.ts +3 -8
- package/src/__tests__/public-surface.test-d.ts +65 -3
- package/src/__tests__/recover-error-policy-owner.unit.test.ts +1 -21
- package/src/__tests__/render-error-code-owner.test-d.ts +24 -23
- package/src/__tests__/render-error-detail-ssot.test-d.ts +0 -95
- package/src/__tests__/render-error-exhaustive.test-d.ts +27 -1
- package/src/__tests__/render-feature-assembly.test-d.ts +8 -16
- package/src/__tests__/render-feature-context.test-d.ts +16 -40
- package/src/__tests__/render-feature-contract.test-d.ts +9 -18
- package/src/__tests__/render-feature-diagnostics.unit.test.ts +6 -8
- package/src/__tests__/render-feature-docs.unit.test.ts +8 -7
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +14 -75
- package/src/__tests__/render-feature-plan.test-d.ts +161 -0
- package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
- package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +8 -19
- package/src/__tests__/render-feature-prepared-errors.test-d.ts +3 -6
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +10 -71
- package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +11 -61
- package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +20 -43
- package/src/__tests__/render-feature-prepared-graphics.test-d.ts +56 -78
- package/src/__tests__/render-feature-public-surface.test-d.ts +6 -24
- package/src/__tests__/render-feature-retry.unit.test.ts +7 -48
- package/src/__tests__/render-feature-scheduling.unit.test.ts +15 -27
- package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +0 -9
- package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +19 -109
- package/src/__tests__/render-feature-visibility-context.test-d.ts +1 -6
- package/src/__tests__/render-feature-visibility-context.unit.test.ts +1 -2
- package/src/__tests__/render-feature-zero-work.unit.test.ts +14 -20
- package/src/__tests__/render-scene-projection.unit.test.ts +73 -111
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +82 -95
- package/src/__tests__/renderer-lifecycle.integration.test.ts +49 -1
- package/src/__tests__/shader-stage-surface.unit.test.ts +14 -9
- package/src/__tests__/ssao-config.unit.test.ts +36 -0
- package/src/__tests__/ssao-kernel-surface.unit.test.ts +4 -5
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
- package/src/__tests__/standard-descriptors.test-d.ts +22 -0
- package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
- package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
- package/src/__tests__/surface-configuration.unit.test.ts +1 -2
- package/src/__tests__/texture-usage-surface.unit.test.ts +3 -6
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +40 -206
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +1 -11
- package/src/__tests__/urp-pipeline.unit.test.ts +2 -2
- package/src/__tests__/vertex-color-pipeline.unit.test.ts +10 -2
- package/src/__tests__/vertex-layout-consumer.unit.test.ts +1 -1
- package/src/__tests__/visibility-diagnostics.integration.test.ts +7 -11
- package/src/__tests__/visibility-extract.integration.test.ts +20 -11
- package/src/__tests__/visibility-extract.perf.test.ts +66 -32
- package/src/__tests__/visibility-feature-dedup.integration.test.ts +2 -4
- package/src/__tests__/visibility-hidden-report.unit.test.ts +1 -2
- package/src/__tests__/visibility-instances.integration.test.ts +7 -11
- package/src/__tests__/visibility-multi-world.integration.test.ts +38 -6
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +18 -41
- package/src/__tests__/visibility-public-surface.test-d.ts +10 -9
- package/src/__tests__/visibility-resolver.unit.test.ts +2 -1
- package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
- package/src/__tests__/visibility-snapshot-contract.unit.test.ts +2 -1
- package/src/__tests__/vocabulary.unit.test.ts +1 -1
- package/src/assembly/backend-contract.ts +57 -0
- package/src/{renderer/renderer-factory.ts → assembly/factory.ts} +1741 -2699
- package/src/assembly/host-contract.ts +101 -0
- package/src/{renderer → assembly}/material/assembly.ts +2 -7
- package/src/assembly/material/pipeline-projection.ts +63 -0
- package/src/authoring.ts +15 -22
- package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
- package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
- package/src/components/glyph-text.ts +3 -2
- package/src/components/index.ts +14 -9
- package/src/components/instances.ts +4 -5
- package/src/components/light-helpers.ts +1 -1
- package/src/components/lines.ts +18 -0
- package/src/components/mesh-filter.ts +11 -10
- package/src/components/points.ts +40 -0
- package/src/components/post-process-params.ts +3 -3
- package/src/components/scene-instance.ts +12 -12
- package/src/components/skybox-background.ts +103 -0
- package/src/components/{environment.ts → skylight.ts} +2 -110
- package/src/components/sprite-animation.ts +3 -4
- package/src/components/sprite-instances.ts +2 -2
- package/src/components/sprite-playback-mode.ts +7 -1
- package/src/components/sprite-region-override.ts +2 -3
- package/src/components/tile-layer.ts +8 -2
- package/src/construct-renderer.ts +67 -4
- package/src/debug-draw-glue.ts +8 -129
- package/src/device/device-scope.ts +306 -0
- package/src/{gpu-resource-store.ts → device/gpu-residency.ts} +540 -639
- package/src/device/resource-types.ts +20 -0
- package/src/engine-metrics.ts +12 -19
- package/src/errors/recover.ts +45 -3
- package/src/errors/render.ts +469 -429
- package/src/features/fullscreen.ts +46 -0
- package/src/features/host.ts +575 -309
- package/src/features/morph/morph-feature.ts +195 -105
- package/src/features/plan.ts +447 -0
- package/src/features/prepared-gpu-work.ts +72 -15
- package/src/features/prepared-graphics-store.ts +20 -6
- package/src/features/prepared-graphics.ts +12 -71
- package/src/features/render-graph-compute.ts +14 -5
- package/src/features/render-graph-contribution.ts +43 -63
- package/src/features/render-graph-raster.ts +32 -8
- package/src/features/render-graph-resources.ts +25 -23
- package/src/features/targets.ts +8 -21
- package/src/features/types.ts +39 -227
- package/src/features/vocabulary.ts +24 -0
- package/src/fullscreen-post-process-pass.ts +14 -57
- package/src/glyph-text-layout-system.ts +70 -96
- package/src/gpu-driven/batch-topology.ts +24 -202
- package/src/gpu-driven/production-raster.ts +99 -1109
- package/src/gpu-driven/view-gpu.ts +46 -192
- package/src/gpu-resource.ts +4 -4
- package/src/gpu-scene-schema.ts +11 -99
- package/src/gpu-scene.ts +231 -364
- package/src/hdrp-buffers.ts +12 -221
- package/src/ibl/IblPipelineCache.ts +471 -711
- package/src/ibl/skylight-bind-group.ts +4 -4
- package/src/index.ts +75 -217
- package/src/inspection-types.ts +80 -0
- package/src/instance-buffer-cache.ts +1 -29
- package/src/internal.ts +6 -85
- package/src/lifecycle.ts +64 -19
- package/src/materials.ts +7 -29
- package/src/mesh-material-bindings.ts +0 -1
- package/src/pbr-pipeline.ts +441 -53
- package/src/{urp-pipeline.ts → pipeline/standard-forward-lane.ts} +38 -149
- package/src/{hdrp-pipeline.ts → pipeline/standard-pipeline.ts} +221 -191
- package/src/pipeline/standard-profile.ts +65 -0
- package/src/pipeline-builder.ts +60 -64
- package/src/pipeline-spec-types.ts +28 -0
- package/src/pipeline-spec.ts +72 -609
- package/src/plugin.ts +7 -75
- package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
- package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
- package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
- package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
- package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
- package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
- package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
- package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
- package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
- package/src/points-lines/admission.ts +238 -0
- package/src/points-lines/bounds.ts +23 -0
- package/src/points-lines/expansion-cache.ts +215 -0
- package/src/points-lines/inspection.ts +97 -0
- package/src/points-lines/prepare.ts +177 -0
- package/src/points-lines/record.ts +125 -0
- package/src/points-lines/snapshot.ts +130 -0
- package/src/post-process-errors.ts +31 -33
- package/src/prepare/prepared-graphics-resolver.ts +5 -4
- package/src/record/__tests__/material-slot-plan.unit.test.ts +1 -33
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
- package/src/record/__tests__/video-texture-view.unit.test.ts +1 -1
- package/src/record/frame-lighting.ts +88 -197
- package/src/record/frame-snapshot.ts +45 -60
- package/src/record/frame-targets.ts +8 -243
- package/src/record/frame.ts +521 -797
- package/src/record/helpers.ts +6 -11
- package/src/record/main-pass-geometry.ts +198 -147
- package/src/record/main-pass-material.ts +517 -190
- package/src/record/main-pass-sprite-draws.ts +199 -118
- package/src/record/main-pass.ts +166 -144
- package/src/record/mesh-ssbo.ts +517 -38
- package/src/record/render-context.ts +384 -0
- package/src/record/shadow-pass.ts +154 -1843
- package/src/record/skybox-post-pass.ts +14 -15
- package/src/record/typed-frame-graph.ts +224 -262
- package/src/record/view-ubo.ts +53 -37
- package/src/render-contract.ts +582 -0
- package/src/render-data.ts +3 -3
- package/src/render-graph-primitives.ts +76 -851
- package/src/render-pipeline.ts +104 -188
- package/src/render-system-extract.ts +1114 -1732
- package/src/render-system.ts +614 -1939
- package/src/scene/render-scene-types.ts +67 -0
- package/src/scene/render-scene.ts +1087 -0
- package/src/scene-instances/post-spawn-resolve-joints.ts +4 -7
- package/src/ssao-buffers.ts +167 -8
- package/src/systems/skin-palette-allocator.ts +21 -64
- package/src/systems/skin-palette-types.ts +14 -0
- package/src/systems/transparent-sort-config.ts +25 -3
- package/src/tilemap-chunk-extract-system.ts +53 -70
- package/src/typed-render-graph-primitives.ts +35 -24
- package/src/typed-shadow-passes.ts +26 -56
- package/dist/__tests__/analytic-sky-contract.test.d.ts +0 -2
- package/dist/__tests__/analytic-sky-contract.test.d.ts.map +0 -1
- package/dist/__tests__/analytic-sky-falsify.test.d.ts +0 -2
- package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +0 -1
- package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +0 -2
- package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +0 -1
- package/dist/__tests__/backend-selection.integration.test.d.ts +0 -2
- package/dist/__tests__/backend-selection.integration.test.d.ts.map +0 -1
- package/dist/__tests__/camera-temporal.test-d.d.ts +0 -2
- package/dist/__tests__/camera-temporal.test-d.d.ts.map +0 -1
- package/dist/__tests__/camera-temporal.test.d.ts +0 -2
- package/dist/__tests__/camera-temporal.test.d.ts.map +0 -1
- package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts +0 -2
- package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +0 -1
- package/dist/__tests__/environment-inspection.test.d.ts +0 -2
- package/dist/__tests__/environment-inspection.test.d.ts.map +0 -1
- package/dist/__tests__/fog-ai-user.fixture.d.ts +0 -2
- package/dist/__tests__/fog-ai-user.fixture.d.ts.map +0 -1
- package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +0 -16
- package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +0 -1
- package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-inspection.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-inspection.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-owner-state.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-public-surface.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-ray-contract.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-source-absence.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-temporal.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-temporal.integration.test.d.ts.map +0 -1
- package/dist/__tests__/frame-chain.unit.test.d.ts +0 -2
- package/dist/__tests__/frame-chain.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts +0 -2
- package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/hdrp-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +0 -2
- package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts +0 -2
- package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +0 -1
- package/dist/__tests__/material-derived-payload.integration.test.d.ts +0 -2
- package/dist/__tests__/material-derived-payload.integration.test.d.ts.map +0 -1
- package/dist/__tests__/materials.unit.test.d.ts +0 -2
- package/dist/__tests__/materials.unit.test.d.ts.map +0 -1
- package/dist/__tests__/param-schema-projection-census.unit.test.d.ts +0 -2
- package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +0 -1
- package/dist/__tests__/persistent-render-scene.unit.test.d.ts +0 -2
- package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-pass-trace.test.d.ts +0 -2
- package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +0 -2
- package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/plugin.test.d.ts +0 -2
- package/dist/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts.map +0 -1
- package/dist/__tests__/public-pipeline-id.test-d.d.ts +0 -2
- package/dist/__tests__/public-pipeline-id.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-dispatch-membership.unit.test.d.ts +0 -2
- package/dist/__tests__/render-dispatch-membership.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-construction.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-construction.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-graph.integration.test.d.ts +0 -2
- package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-order.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-order.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-staging.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-staging.unit.test.d.ts.map +0 -1
- package/dist/__tests__/renderer-render-scene-public.test-d.d.ts +0 -2
- package/dist/__tests__/renderer-render-scene-public.test-d.d.ts.map +0 -1
- package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts +0 -2
- package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts.map +0 -1
- package/dist/__tests__/sun-snapshot-consumers.test.d.ts +0 -2
- package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +0 -1
- package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +0 -2
- package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/taa-history-store.unit.test.d.ts +0 -2
- package/dist/__tests__/taa-history-store.unit.test.d.ts.map +0 -1
- package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +0 -2
- package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +0 -1
- package/dist/__tests__/temporal-inspection.unit.test.d.ts +0 -2
- package/dist/__tests__/temporal-inspection.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/asset-decoders.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts.map +0 -1
- package/dist/chunk-DJIMFYX6.mjs +0 -1439
- package/dist/chunk-DJIMFYX6.mjs.map +0 -1
- package/dist/chunk-F2SIOCRM.mjs +0 -7423
- package/dist/chunk-F2SIOCRM.mjs.map +0 -1
- package/dist/chunk-JMSB7AR4.mjs +0 -3
- package/dist/chunk-JMSB7AR4.mjs.map +0 -1
- package/dist/chunk-KHI6K4C6.mjs +0 -659
- package/dist/chunk-KHI6K4C6.mjs.map +0 -1
- package/dist/chunk-PORZOL2V.mjs +0 -569
- package/dist/chunk-PORZOL2V.mjs.map +0 -1
- package/dist/chunk-UOJGMDGP.mjs +0 -29913
- package/dist/chunk-UOJGMDGP.mjs.map +0 -1
- package/dist/components/__tests__/atmosphere-red.test.d.ts +0 -2
- package/dist/components/__tests__/atmosphere-red.test.d.ts.map +0 -1
- package/dist/components/__tests__/atmosphere.test.d.ts +0 -2
- package/dist/components/__tests__/atmosphere.test.d.ts.map +0 -1
- package/dist/components/__tests__/fog.test-d.d.ts +0 -2
- package/dist/components/__tests__/fog.test-d.d.ts.map +0 -1
- package/dist/components/__tests__/fog.test.d.ts +0 -2
- package/dist/components/__tests__/fog.test.d.ts.map +0 -1
- package/dist/components/atmosphere.d.ts +0 -18
- package/dist/components/atmosphere.d.ts.map +0 -1
- package/dist/components/environment.d.ts +0 -115
- package/dist/components/environment.d.ts.map +0 -1
- package/dist/deferred-lighting.d.ts +0 -13
- package/dist/deferred-lighting.d.ts.map +0 -1
- package/dist/dynamic-texture-store.d.ts +0 -42
- package/dist/dynamic-texture-store.d.ts.map +0 -1
- package/dist/environment/__tests__/failure-injection.test.d.ts +0 -2
- package/dist/environment/__tests__/failure-injection.test.d.ts.map +0 -1
- package/dist/environment/__tests__/generation-red.test.d.ts +0 -2
- package/dist/environment/__tests__/generation-red.test.d.ts.map +0 -1
- package/dist/environment/__tests__/generation.test.d.ts +0 -2
- package/dist/environment/__tests__/generation.test.d.ts.map +0 -1
- package/dist/environment/__tests__/graph-transaction.test.d.ts +0 -2
- package/dist/environment/__tests__/graph-transaction.test.d.ts.map +0 -1
- package/dist/environment/__tests__/inspection-red.test.d.ts +0 -2
- package/dist/environment/__tests__/inspection-red.test.d.ts.map +0 -1
- package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +0 -2
- package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +0 -1
- package/dist/environment/__tests__/pipeline-topology.test.d.ts +0 -2
- package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +0 -1
- package/dist/environment/__tests__/readiness.test.d.ts +0 -2
- package/dist/environment/__tests__/readiness.test.d.ts.map +0 -1
- package/dist/environment/__tests__/recovery.test.d.ts +0 -2
- package/dist/environment/__tests__/recovery.test.d.ts.map +0 -1
- package/dist/environment/__tests__/resize-dispose.test.d.ts +0 -2
- package/dist/environment/__tests__/resize-dispose.test.d.ts.map +0 -1
- package/dist/environment/__tests__/signature-red.test.d.ts +0 -2
- package/dist/environment/__tests__/signature-red.test.d.ts.map +0 -1
- package/dist/environment/__tests__/signature.test.d.ts +0 -2
- package/dist/environment/__tests__/signature.test.d.ts.map +0 -1
- package/dist/environment/descriptors.d.ts +0 -2
- package/dist/environment/descriptors.d.ts.map +0 -1
- package/dist/environment/extracted-environment.d.ts +0 -53
- package/dist/environment/extracted-environment.d.ts.map +0 -1
- package/dist/environment/generation.d.ts +0 -62
- package/dist/environment/generation.d.ts.map +0 -1
- package/dist/environment/gpu-bundle.d.ts +0 -23
- package/dist/environment/gpu-bundle.d.ts.map +0 -1
- package/dist/environment/graph.d.ts +0 -108
- package/dist/environment/graph.d.ts.map +0 -1
- package/dist/environment/inspection.d.ts +0 -48
- package/dist/environment/inspection.d.ts.map +0 -1
- package/dist/environment/lifecycle.d.ts +0 -22
- package/dist/environment/lifecycle.d.ts.map +0 -1
- package/dist/environment/readiness.d.ts +0 -29
- package/dist/environment/readiness.d.ts.map +0 -1
- package/dist/environment/signature.d.ts +0 -70
- package/dist/environment/signature.d.ts.map +0 -1
- package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +0 -2
- package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +0 -1
- package/dist/extract/__tests__/environment-source.test.d.ts +0 -2
- package/dist/extract/__tests__/environment-source.test.d.ts.map +0 -1
- package/dist/extract/__tests__/schema-readers.unit.test.d.ts +0 -2
- package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +0 -1
- package/dist/extract/directional-csm.d.ts +0 -129
- package/dist/extract/directional-csm.d.ts.map +0 -1
- package/dist/extract/index.d.ts +0 -5
- package/dist/extract/index.d.ts.map +0 -1
- package/dist/extract/material-interface.d.ts +0 -56
- package/dist/extract/material-interface.d.ts.map +0 -1
- package/dist/extract/schema-readers.d.ts +0 -20
- package/dist/extract/schema-readers.d.ts.map +0 -1
- package/dist/features/graph-contribution.d.ts +0 -64
- package/dist/features/graph-contribution.d.ts.map +0 -1
- package/dist/features/index.d.ts +0 -21
- package/dist/features/index.d.ts.map +0 -1
- package/dist/features/morph/index.d.ts +0 -3
- package/dist/features/morph/index.d.ts.map +0 -1
- package/dist/features/morph/morph-bounds.d.ts +0 -42
- package/dist/features/morph/morph-bounds.d.ts.map +0 -1
- package/dist/features/scene-temporal.d.ts +0 -45
- package/dist/features/scene-temporal.d.ts.map +0 -1
- package/dist/features/taa-resolve.d.ts +0 -21
- package/dist/features/taa-resolve.d.ts.map +0 -1
- package/dist/frame-chain.d.ts +0 -14
- package/dist/frame-chain.d.ts.map +0 -1
- package/dist/gpu-driven/view-reference.d.ts.map +0 -1
- package/dist/gpu-resource-store.d.ts.map +0 -1
- package/dist/hdrp-cluster-membership.d.ts +0 -2
- package/dist/hdrp-cluster-membership.d.ts.map +0 -1
- package/dist/hdrp-pipeline.d.ts +0 -36
- package/dist/hdrp-pipeline.d.ts.map +0 -1
- package/dist/ibl/cubemap-projection.d.ts +0 -23
- package/dist/ibl/cubemap-projection.d.ts.map +0 -1
- package/dist/ibl/face-uniforms.d.ts +0 -65
- package/dist/ibl/face-uniforms.d.ts.map +0 -1
- package/dist/mesh-update-errors.d.ts +0 -71
- package/dist/mesh-update-errors.d.ts.map +0 -1
- package/dist/mipmap-generator.d.ts +0 -39
- package/dist/mipmap-generator.d.ts.map +0 -1
- package/dist/param-schema-projection-census.d.ts +0 -18
- package/dist/param-schema-projection-census.d.ts.map +0 -1
- package/dist/persistent-render-scene.d.ts +0 -158
- package/dist/persistent-render-scene.d.ts.map +0 -1
- package/dist/pipeline/index.d.ts +0 -11
- package/dist/pipeline/index.d.ts.map +0 -1
- package/dist/pipeline-errors.d.ts +0 -110
- package/dist/pipeline-errors.d.ts.map +0 -1
- package/dist/prepare/__tests__/schema-readers.unit.test.d.ts +0 -2
- package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +0 -1
- package/dist/prepare/index.d.ts +0 -4
- package/dist/prepare/index.d.ts.map +0 -1
- package/dist/prepare/schema-readers.d.ts +0 -11
- package/dist/prepare/schema-readers.d.ts.map +0 -1
- package/dist/record/__tests__/environment-record.test.d.ts +0 -2
- package/dist/record/__tests__/environment-record.test.d.ts.map +0 -1
- package/dist/record/__tests__/frame-targets.unit.test.d.ts +0 -2
- package/dist/record/__tests__/frame-targets.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/membership-timing.unit.test.d.ts +0 -2
- package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/render-submission.integration.test.d.ts +0 -2
- package/dist/record/__tests__/render-submission.integration.test.d.ts.map +0 -1
- package/dist/record/__tests__/render-submission.perf.test.d.ts +0 -2
- package/dist/record/__tests__/render-submission.perf.test.d.ts.map +0 -1
- package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +0 -2
- package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts +0 -2
- package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +0 -1
- package/dist/record/frame-observation.d.ts +0 -38
- package/dist/record/frame-observation.d.ts.map +0 -1
- package/dist/record/index.d.ts +0 -15
- package/dist/record/index.d.ts.map +0 -1
- package/dist/record/main-pass-skin.d.ts +0 -46
- package/dist/record/main-pass-skin.d.ts.map +0 -1
- package/dist/record/main-pass-sprite.d.ts +0 -69
- package/dist/record/main-pass-sprite.d.ts.map +0 -1
- package/dist/record/material-payload.d.ts +0 -43
- package/dist/record/material-payload.d.ts.map +0 -1
- package/dist/record/material-slot-plan.d.ts +0 -26
- package/dist/record/material-slot-plan.d.ts.map +0 -1
- package/dist/record/membership-timing.d.ts +0 -232
- package/dist/record/membership-timing.d.ts.map +0 -1
- package/dist/record/shadow-caster-uniform.d.ts +0 -8
- package/dist/record/shadow-caster-uniform.d.ts.map +0 -1
- package/dist/record/shadow-submit-mode.d.ts +0 -66
- package/dist/record/shadow-submit-mode.d.ts.map +0 -1
- package/dist/render-dispatch-membership.d.ts +0 -47
- package/dist/render-dispatch-membership.d.ts.map +0 -1
- package/dist/render-pipeline-context.d.ts +0 -289
- package/dist/render-pipeline-context.d.ts.map +0 -1
- package/dist/render-pipeline-target.d.ts +0 -16
- package/dist/render-pipeline-target.d.ts.map +0 -1
- package/dist/render-scene-projection.d.ts +0 -174
- package/dist/render-scene-projection.d.ts.map +0 -1
- package/dist/render-system-fold.d.ts +0 -266
- package/dist/render-system-fold.d.ts.map +0 -1
- package/dist/renderer/asset-service.d.ts +0 -10
- package/dist/renderer/asset-service.d.ts.map +0 -1
- package/dist/renderer/backend-selection.d.ts.map +0 -1
- package/dist/renderer/environment-classify.d.ts +0 -6
- package/dist/renderer/environment-classify.d.ts.map +0 -1
- package/dist/renderer/environment-error.d.ts +0 -13
- package/dist/renderer/environment-error.d.ts.map +0 -1
- package/dist/renderer/material/pipeline-projection.d.ts +0 -91
- package/dist/renderer/material/pipeline-projection.d.ts.map +0 -1
- package/dist/renderer/renderer-factory.d.ts +0 -289
- package/dist/renderer/renderer-factory.d.ts.map +0 -1
- package/dist/renderer.d.ts +0 -771
- package/dist/renderer.d.ts.map +0 -1
- package/dist/scene-utils/collect-subtree.d.ts +0 -11
- package/dist/scene-utils/collect-subtree.d.ts.map +0 -1
- package/dist/ssao-data.d.ts +0 -34
- package/dist/ssao-data.d.ts.map +0 -1
- package/dist/surface-format.d.ts +0 -10
- package/dist/surface-format.d.ts.map +0 -1
- package/dist/taa-history-store.d.ts +0 -88
- package/dist/taa-history-store.d.ts.map +0 -1
- package/dist/temporal-coverage.d.ts +0 -35
- package/dist/temporal-coverage.d.ts.map +0 -1
- package/dist/temporal-frame-transaction.d.ts +0 -92
- package/dist/temporal-frame-transaction.d.ts.map +0 -1
- package/dist/temporal-inspection.d.ts +0 -57
- package/dist/temporal-inspection.d.ts.map +0 -1
- package/dist/temporal-view.d.ts +0 -43
- package/dist/temporal-view.d.ts.map +0 -1
- package/dist/tilemap/resolve-tileset-runtime.d.ts +0 -23
- package/dist/tilemap/resolve-tileset-runtime.d.ts.map +0 -1
- package/dist/urp-pipeline.d.ts +0 -4
- package/dist/urp-pipeline.d.ts.map +0 -1
- package/src/__tests__/analytic-sky-contract.test.ts +0 -27
- package/src/__tests__/analytic-sky-falsify-carriers.mjs +0 -43
- package/src/__tests__/analytic-sky-falsify.test.ts +0 -94
- package/src/__tests__/assets-runtime-handoff.integration.test.ts +0 -36
- package/src/__tests__/backend-selection.integration.test.ts +0 -11
- package/src/__tests__/camera-temporal.test-d.ts +0 -8
- package/src/__tests__/camera-temporal.test.ts +0 -188
- package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +0 -18
- package/src/__tests__/environment-inspection.test.ts +0 -45
- package/src/__tests__/fog-ai-user.fixture.ts +0 -350
- package/src/__tests__/fog-custom-render-feature.fixture.ts +0 -33
- package/src/__tests__/fog-custom-render-feature.integration.test.ts +0 -76
- package/src/__tests__/fog-inspection.integration.test.ts +0 -127
- package/src/__tests__/fog-owner-state.integration.test.ts +0 -112
- package/src/__tests__/fog-pipeline-topology.integration.test.ts +0 -93
- package/src/__tests__/fog-public-surface.integration.test.ts +0 -60
- package/src/__tests__/fog-ray-contract.integration.test.ts +0 -73
- package/src/__tests__/fog-source-absence.integration.test.ts +0 -51
- package/src/__tests__/fog-temporal.integration.test.ts +0 -115
- package/src/__tests__/frame-chain.unit.test.ts +0 -26
- package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +0 -27
- package/src/__tests__/hdrp-pipeline.unit.test.ts +0 -100
- package/src/__tests__/ibl/ibl-fallback.unit.test.ts +0 -23
- package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +0 -69
- package/src/__tests__/material-derived-payload.integration.test.ts +0 -164
- package/src/__tests__/materials.unit.test.ts +0 -25
- package/src/__tests__/param-schema-projection-census.unit.test.ts +0 -40
- package/src/__tests__/persistent-render-scene.unit.test.ts +0 -1311
- package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +0 -167
- package/src/__tests__/pipeline-pass-trace.test.ts +0 -92
- package/src/__tests__/pipeline-stage-owner.test-d.ts +0 -13
- package/src/__tests__/plugin.test.ts +0 -25
- package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +0 -129
- package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +0 -180
- package/src/__tests__/public-pipeline-id.test-d.ts +0 -6
- package/src/__tests__/render-dispatch-membership.unit.test.ts +0 -117
- package/src/__tests__/render-feature-construction.unit.test.ts +0 -124
- package/src/__tests__/render-feature-error-code-owner.test-d.ts +0 -27
- package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +0 -46
- package/src/__tests__/render-feature-graph.integration.test.ts +0 -205
- package/src/__tests__/render-feature-graphics-staging.unit.test.ts +0 -200
- package/src/__tests__/render-feature-order.unit.test.ts +0 -66
- package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +0 -107
- package/src/__tests__/render-feature-staging.unit.test.ts +0 -94
- package/src/__tests__/renderer-render-scene-public.test-d.ts +0 -27
- package/src/__tests__/scene-temporal-coverage.unit.test.ts +0 -259
- package/src/__tests__/sun-snapshot-consumers.test.ts +0 -35
- package/src/__tests__/surface-backend-kind-owner.test-d.ts +0 -42
- package/src/__tests__/taa-history-store.unit.test.ts +0 -196
- package/src/__tests__/temporal-frame-transaction.integration.test.ts +0 -537
- package/src/__tests__/temporal-inspection.unit.test.ts +0 -138
- package/src/assets/__tests__/asset-decoders.unit.test.ts +0 -92
- package/src/assets/__tests__/mipmap-generator.unit.test.ts +0 -52
- package/src/assets/__tests__/render-asset-port.unit.test.ts +0 -54
- package/src/assets/__tests__/resolve-render-asset.unit.test.ts +0 -47
- package/src/components/__tests__/atmosphere-red.test.ts +0 -51
- package/src/components/__tests__/atmosphere.test.ts +0 -79
- package/src/components/__tests__/fog.test-d.ts +0 -49
- package/src/components/__tests__/fog.test.ts +0 -60
- package/src/components/atmosphere.ts +0 -64
- package/src/deferred-lighting.ts +0 -92
- package/src/dynamic-texture-store.ts +0 -111
- package/src/environment/README.md +0 -76
- package/src/environment/__tests__/failure-injection.test.ts +0 -50
- package/src/environment/__tests__/generation-red.test.ts +0 -64
- package/src/environment/__tests__/generation.test.ts +0 -37
- package/src/environment/__tests__/graph-transaction.test.ts +0 -85
- package/src/environment/__tests__/inspection-red.test.ts +0 -53
- package/src/environment/__tests__/lifecycle-evidence.test.ts +0 -40
- package/src/environment/__tests__/pipeline-topology.test.ts +0 -33
- package/src/environment/__tests__/readiness.test.ts +0 -42
- package/src/environment/__tests__/recovery.test.ts +0 -62
- package/src/environment/__tests__/resize-dispose.test.ts +0 -30
- package/src/environment/__tests__/signature-red.test.ts +0 -45
- package/src/environment/__tests__/signature.test.ts +0 -60
- package/src/environment/descriptors.ts +0 -7
- package/src/environment/extracted-environment.ts +0 -239
- package/src/environment/generation.ts +0 -158
- package/src/environment/gpu-bundle.ts +0 -144
- package/src/environment/graph.ts +0 -588
- package/src/environment/inspection.ts +0 -107
- package/src/environment/lifecycle.ts +0 -124
- package/src/environment/readiness.ts +0 -76
- package/src/environment/signature.ts +0 -185
- package/src/extract/__tests__/directional-csm-domain.unit.test.ts +0 -391
- package/src/extract/__tests__/environment-source.test.ts +0 -105
- package/src/extract/__tests__/schema-readers.unit.test.ts +0 -16
- package/src/extract/directional-csm.ts +0 -959
- package/src/extract/index.ts +0 -10
- package/src/extract/material-interface.ts +0 -604
- package/src/extract/schema-readers.ts +0 -27
- package/src/features/graph-contribution.ts +0 -577
- package/src/features/index.ts +0 -100
- package/src/features/morph/index.ts +0 -24
- package/src/features/morph/morph-bounds.ts +0 -123
- package/src/features/scene-temporal.ts +0 -274
- package/src/features/taa-resolve.ts +0 -244
- package/src/frame-chain.ts +0 -21
- package/src/hdrp-cluster-membership.ts +0 -70
- package/src/ibl/cubemap-projection.ts +0 -60
- package/src/ibl/face-uniforms.ts +0 -150
- package/src/mesh-update-errors.ts +0 -113
- package/src/mipmap-generator.ts +0 -244
- package/src/param-schema-projection-census.ts +0 -73
- package/src/persistent-render-scene.ts +0 -1752
- package/src/pipeline/index.ts +0 -40
- package/src/pipeline-errors.ts +0 -172
- package/src/prepare/__tests__/schema-readers.unit.test.ts +0 -16
- package/src/prepare/index.ts +0 -8
- package/src/prepare/schema-readers.ts +0 -20
- package/src/record/__tests__/environment-record.test.ts +0 -35
- package/src/record/__tests__/frame-targets.unit.test.ts +0 -54
- package/src/record/__tests__/membership-timing.unit.test.ts +0 -524
- package/src/record/__tests__/render-submission.integration.test.ts +0 -76
- package/src/record/__tests__/render-submission.perf.test.ts +0 -141
- package/src/record/__tests__/shadow-submit-mode.unit.test.ts +0 -88
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +0 -101
- package/src/record/frame-observation.ts +0 -122
- package/src/record/index.ts +0 -15
- package/src/record/main-pass-skin.ts +0 -51
- package/src/record/main-pass-sprite.ts +0 -166
- package/src/record/material-payload.ts +0 -292
- package/src/record/material-slot-plan.ts +0 -68
- package/src/record/membership-timing.ts +0 -1012
- package/src/record/shadow-caster-uniform.ts +0 -37
- package/src/record/shadow-submit-mode.ts +0 -277
- package/src/render-dispatch-membership.ts +0 -155
- package/src/render-pipeline-context.ts +0 -332
- package/src/render-pipeline-target.ts +0 -96
- package/src/render-scene-projection.ts +0 -1738
- package/src/render-system-fold.ts +0 -531
- package/src/renderer/asset-service.ts +0 -32
- package/src/renderer/backend-selection.ts +0 -121
- package/src/renderer/environment-classify.ts +0 -30
- package/src/renderer/environment-error.ts +0 -19
- package/src/renderer/material/pipeline-projection.ts +0 -140
- package/src/renderer.ts +0 -940
- package/src/scene-utils/collect-subtree.ts +0 -40
- package/src/ssao-data.ts +0 -106
- package/src/surface-format.ts +0 -37
- package/src/taa-history-store.ts +0 -429
- package/src/temporal-coverage.ts +0 -106
- package/src/temporal-frame-transaction.ts +0 -301
- package/src/temporal-inspection.ts +0 -194
- package/src/temporal-view.ts +0 -174
- package/src/tilemap/resolve-tileset-runtime.ts +0 -72
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @forgeax/engine-runtime - RenderSystem record stage: main-pass-material.
|
|
2
2
|
// Extracted from render-system-record.ts (feat-20260704 M3/w17, pure move).
|
|
3
3
|
|
|
4
|
+
import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
|
|
4
5
|
import type { EntityHandle, World } from '@forgeax/engine-ecs';
|
|
5
6
|
import {
|
|
6
7
|
VIDEO_ELEMENT_PROVIDER_KEY,
|
|
@@ -11,62 +12,68 @@ import {
|
|
|
11
12
|
type BindGroupEntry,
|
|
12
13
|
type BindGroupLayout,
|
|
13
14
|
type Buffer,
|
|
14
|
-
err,
|
|
15
|
-
ok,
|
|
16
15
|
type RenderPipeline,
|
|
17
|
-
type Result,
|
|
18
16
|
RhiError,
|
|
19
17
|
type Sampler,
|
|
18
|
+
type TextureView,
|
|
20
19
|
} from '@forgeax/engine-rhi';
|
|
21
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
DEFAULT_MSDF_TEXT_PARAM_SCHEMA,
|
|
22
|
+
DEFAULT_SPRITE_PARAM_SCHEMA,
|
|
23
|
+
DEFAULT_UNLIT_PARAM_SCHEMA,
|
|
24
|
+
} from '@forgeax/engine-shader';
|
|
22
25
|
import type {
|
|
23
|
-
DerivedMaterialInterface,
|
|
24
26
|
Handle,
|
|
25
27
|
ImageError,
|
|
26
28
|
MaterialRenderState,
|
|
27
|
-
|
|
29
|
+
ParamSchemaEntry,
|
|
28
30
|
PrimitiveTopology,
|
|
29
31
|
SamplerAsset,
|
|
30
32
|
TextureAsset,
|
|
31
33
|
} from '@forgeax/engine-types';
|
|
32
|
-
import { derive, handleSlot } from '@forgeax/engine-types';
|
|
33
|
-
import {
|
|
34
|
-
import type { DynamicTextureStore } from '../dynamic-texture-store';
|
|
34
|
+
import { derive, handleSlot, resolveMaterialTextureCoordinates } from '@forgeax/engine-types';
|
|
35
|
+
import type { GpuResidencyCache } from '../device/gpu-residency';
|
|
35
36
|
import { VideoUploadUnsupportedError } from '../errors/render';
|
|
36
|
-
import type { GpuResourceStore } from '../gpu-resource-store';
|
|
37
37
|
import {
|
|
38
38
|
assembleMaterialWithSkylightEntries,
|
|
39
|
+
type EmissiveAoBindGroupResources,
|
|
39
40
|
type SkylightBindGroupResources,
|
|
40
41
|
} from '../ibl/skylight-bind-group';
|
|
41
|
-
import
|
|
42
|
+
import { isStandardPbrMaterialShader } from '../pbr-pipeline';
|
|
43
|
+
import { deriveTextureExtent } from '../render-data';
|
|
42
44
|
import type { MaterialSnapshot } from '../render-system-extract';
|
|
43
|
-
import type { MaterialRenderProjection } from '../renderer/material/assembly.js';
|
|
44
|
-
import {
|
|
45
|
-
type MaterialDrawRoute,
|
|
46
|
-
type MaterialPipelineMiss,
|
|
47
|
-
type MaterialPipelineReady,
|
|
48
|
-
type MaterialReadiness,
|
|
49
|
-
type MaterialRenderReady,
|
|
50
|
-
routeMaterialDraw,
|
|
51
|
-
routeMaterialPipeline,
|
|
52
|
-
} from '../renderer/material/pipeline-projection.js';
|
|
53
45
|
import type { BindGroupCounts, MaterialBgAssemblyCacheEntry } from './frame-snapshot';
|
|
54
|
-
import {
|
|
55
|
-
|
|
56
|
-
|
|
46
|
+
import { extractEntryResourceHandle, getOrCreatePerEntity } from './mesh-ssbo';
|
|
47
|
+
import {
|
|
48
|
+
type PipelineState,
|
|
49
|
+
type RenderSystemRuntime,
|
|
50
|
+
STANDARD_PBR_UBO_SIZE,
|
|
51
|
+
} from './render-context';
|
|
57
52
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
53
|
+
// Param schemas are immutable runtime contracts: the shader registry installs
|
|
54
|
+
// them once and material snapshots only retain the same array reference. Keep
|
|
55
|
+
// the expensive pure derivation on that identity so the per-submesh record
|
|
56
|
+
// path does not rebuild the same UBO/texture maps for every visible material
|
|
57
|
+
// on every frame. A WeakMap keeps this optimization bounded by the lifetime of
|
|
58
|
+
// the schema owner and adds no global strong-reference lifetime.
|
|
59
|
+
const DERIVED_PARAM_SCHEMA_CACHE = new WeakMap<
|
|
60
|
+
readonly ParamSchemaEntry[],
|
|
61
|
+
ReturnType<typeof derive>
|
|
62
|
+
>();
|
|
62
63
|
|
|
63
|
-
|
|
64
|
+
function derivedParamSchema(schema: readonly ParamSchemaEntry[]): ReturnType<typeof derive> {
|
|
65
|
+
const cached = DERIVED_PARAM_SCHEMA_CACHE.get(schema);
|
|
66
|
+
if (cached !== undefined) return cached;
|
|
67
|
+
const derived = derive(schema);
|
|
68
|
+
DERIVED_PARAM_SCHEMA_CACHE.set(schema, derived);
|
|
69
|
+
return derived;
|
|
70
|
+
}
|
|
64
71
|
|
|
65
72
|
// feat-20260601-customizable-render-pipeline-seam M2 / w12: the former
|
|
66
73
|
// `RecordPassContext` (26-field full surface, including the `internals` kitchen-sink and
|
|
67
74
|
// the 0-consumed `skyboxCount` residual) is DELETED. The per-frame shared state injected
|
|
68
75
|
// into the render-graph pass execute closures is now the clean `RenderPipelineContext`
|
|
69
|
-
// (defined in `render-
|
|
76
|
+
// (defined in `render-system.ts`): `internals` is gone (replaced by the named
|
|
70
77
|
// `assets` / `store` / `pipelineState` / `runtime` surfaces) so a pipeline author cannot
|
|
71
78
|
// reach the runtime kitchen-sink through the public ctx (AC-08). The graph is
|
|
72
79
|
// `RenderGraph<RenderPipelineContext>` so `execute(ctx)` forwards the object to each
|
|
@@ -84,6 +91,24 @@ import { extractEntryResourceHandle, getOrCreatePerEntity } from './mesh-ssbo';
|
|
|
84
91
|
// the last-used views for bindgroup-invalidation self-checks (D-3 physical texture
|
|
85
92
|
// identity), but the graph owns the create/destroy lifecycle.
|
|
86
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Keep line primitives visible when they share a depth plane with filled
|
|
96
|
+
* geometry. The same topology policy is consumed by the CPU and GPU-driven
|
|
97
|
+
* raster lanes so a mixed mesh does not change appearance when ownership
|
|
98
|
+
* moves between them.
|
|
99
|
+
*/
|
|
100
|
+
export function geometryRenderStateForTopology(
|
|
101
|
+
topology: PrimitiveTopology,
|
|
102
|
+
renderState: MaterialRenderState | undefined,
|
|
103
|
+
): MaterialRenderState | undefined {
|
|
104
|
+
if (topology !== 'line-list' && topology !== 'line-strip') return renderState;
|
|
105
|
+
return {
|
|
106
|
+
...renderState,
|
|
107
|
+
depthWriteEnabled: false,
|
|
108
|
+
depthCompare: 'less-equal',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
87
112
|
/**
|
|
88
113
|
* feat-20260604-learn-render-4.10-anti-aliasing-msaa M2 / w9: pick the static
|
|
89
114
|
* unlit geometry pipeline handle for a (tonemapActive x msaaActive)
|
|
@@ -117,31 +142,6 @@ export function selectGeometryPipeline(
|
|
|
117
142
|
return msaaActive ? pipelineState.unlitPipelineMsaa : pipelineState.unlitPipeline;
|
|
118
143
|
}
|
|
119
144
|
|
|
120
|
-
/**
|
|
121
|
-
* Resolve a cooked material projection for record. The record stage receives
|
|
122
|
-
* the already-resolved projection and an immutable artifact lookup; it never
|
|
123
|
-
* follows parent GUIDs, reads authored material state, or invokes a compiler.
|
|
124
|
-
* A missing or mismatched artifact is an explicit route miss so callers cannot
|
|
125
|
-
* silently substitute a default shader.
|
|
126
|
-
*/
|
|
127
|
-
export function selectCookedMaterialPipelineForRender(args: {
|
|
128
|
-
readonly projection: MaterialRenderProjection;
|
|
129
|
-
readonly lookupArtifact: (
|
|
130
|
-
key: string,
|
|
131
|
-
) => import('@forgeax/engine-shader').MaterialRuntimeArtifact | undefined;
|
|
132
|
-
}): MaterialPipelineReady | MaterialPipelineMiss {
|
|
133
|
-
return routeMaterialPipeline(args);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/** Route a record-stage draw through the canonical readiness result. */
|
|
137
|
-
export function selectMaterialDrawForRender<TPipeline>(args: {
|
|
138
|
-
readonly readiness: MaterialReadiness;
|
|
139
|
-
readonly buildPipeline: (ready: MaterialRenderReady) => TPipeline;
|
|
140
|
-
readonly reportedDiagnosticKeys: Set<string>;
|
|
141
|
-
}): MaterialDrawRoute<TPipeline> {
|
|
142
|
-
return routeMaterialDraw(args);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
145
|
/**
|
|
146
146
|
* feat-city-glb Bug 5 (per-submesh transparency): true when EVERY submesh
|
|
147
147
|
* material of the entity is transparent (blend). Used by the geometry pass to
|
|
@@ -189,79 +189,7 @@ export function entityHasTransparentSubmesh(source: {
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
/**
|
|
192
|
-
*
|
|
193
|
-
* via the runtime's per-MaterialShader pipeline cache. Returns a
|
|
194
|
-
* structured RhiError on cache miss / pending build -- the caller MUST
|
|
195
|
-
* surface this via the error registry rather than substituting a silent
|
|
196
|
-
* fallback (charter P3 explicit failure).
|
|
197
|
-
*
|
|
198
|
-
* The `getMaterialShaderPipeline` argument mirrors
|
|
199
|
-
* {@link RenderSystemRuntime.getMaterialShaderPipeline}'s 9-arg signature
|
|
200
|
-
* but is injected so the helper is unit-testable with a plain
|
|
201
|
-
* `() => null` stand-in. The helper threads only the inputs the caller
|
|
202
|
-
* already has on the dispatch entry -- it never reads from
|
|
203
|
-
* MaterialAsset internals (plan-strategy section 5.6 gate R-H).
|
|
204
|
-
*
|
|
205
|
-
* @internal
|
|
206
|
-
*/
|
|
207
|
-
export function selectMaterialPipelineForRender(args: {
|
|
208
|
-
readonly materialShaderId: string;
|
|
209
|
-
readonly isHdr: boolean;
|
|
210
|
-
readonly renderState?: MaterialRenderState | undefined;
|
|
211
|
-
readonly topology?: PrimitiveTopology | undefined;
|
|
212
|
-
readonly indexFormat?: 'uint16' | 'uint32' | undefined;
|
|
213
|
-
readonly variantSet?: string | undefined;
|
|
214
|
-
readonly sampleCount?: number | undefined;
|
|
215
|
-
readonly getMaterialShaderPipeline:
|
|
216
|
-
| ((
|
|
217
|
-
materialShaderId: string,
|
|
218
|
-
isHdr: boolean,
|
|
219
|
-
renderState?: MaterialRenderState,
|
|
220
|
-
topology?: PrimitiveTopology,
|
|
221
|
-
indexFormat?: 'uint16' | 'uint32',
|
|
222
|
-
variantSet?: string,
|
|
223
|
-
passKind?: PassKind,
|
|
224
|
-
meshAttributes?: import('@forgeax/engine-types').VertexAttributeMap,
|
|
225
|
-
sampleCount?: number,
|
|
226
|
-
) => RenderPipeline | null)
|
|
227
|
-
| undefined;
|
|
228
|
-
}): Result<RenderPipeline, RhiError> {
|
|
229
|
-
if (args.getMaterialShaderPipeline === undefined) {
|
|
230
|
-
return err(
|
|
231
|
-
new RhiError({
|
|
232
|
-
code: 'internal-error',
|
|
233
|
-
expected: `runtime.getMaterialShaderPipeline registered before draw of ${args.materialShaderId}`,
|
|
234
|
-
hint: `material shader ${args.materialShaderId} has no resolver; the renderer was not initialised with a pipeline cache`,
|
|
235
|
-
}),
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
const pipeline = args.getMaterialShaderPipeline(
|
|
239
|
-
args.materialShaderId,
|
|
240
|
-
args.isHdr,
|
|
241
|
-
args.renderState,
|
|
242
|
-
args.topology,
|
|
243
|
-
args.indexFormat,
|
|
244
|
-
args.variantSet,
|
|
245
|
-
undefined, // passKind defaults to 'forward'
|
|
246
|
-
undefined, // meshAttributes -- transparent path uses the default vertex layout
|
|
247
|
-
args.sampleCount,
|
|
248
|
-
);
|
|
249
|
-
if (pipeline === null) {
|
|
250
|
-
return err(
|
|
251
|
-
new RhiError({
|
|
252
|
-
code: 'internal-error',
|
|
253
|
-
expected: `pipeline cache hit for ${args.materialShaderId} (renderState=${args.renderState ? 'set' : 'unset'}, isHdr=${args.isHdr})`,
|
|
254
|
-
hint: `material shader pipeline ${args.materialShaderId} missed the runtime cache; the underlying shader-module build may still be pending, or the id is not registered in ShaderRegistry`,
|
|
255
|
-
}),
|
|
256
|
-
);
|
|
257
|
-
}
|
|
258
|
-
return ok(pipeline);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// === end feat-20260625 M2 / w7 transparent-aware helpers ========================
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* feat-20260601-gpu-resource-store-extraction M1 / D-9: resolve a texture's
|
|
192
|
+
* feat-20260601-device/gpu-residency-extraction M1 / D-9: resolve a texture's
|
|
265
193
|
* GPU view through the pull-model residency store. The three steps replace the
|
|
266
194
|
* pre-extraction single-call accessor on the registry:
|
|
267
195
|
* 1. fetch the TextureAsset POD off the registry (CPU; registry keeps PODs)
|
|
@@ -281,13 +209,12 @@ function isImageError(error: unknown): error is ImageError {
|
|
|
281
209
|
|
|
282
210
|
export function residentTextureView(
|
|
283
211
|
world: World,
|
|
284
|
-
store:
|
|
212
|
+
store: GpuResidencyCache,
|
|
285
213
|
runtime: RenderSystemRuntime,
|
|
286
214
|
handle: Handle<'TextureAsset', 'shared'>,
|
|
287
|
-
worldId: number =
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
const podRes = resolveRenderAsset<TextureAsset>(world, handle);
|
|
215
|
+
worldId: World | number = world,
|
|
216
|
+
): TextureView | undefined {
|
|
217
|
+
const podRes = resolveAssetHandle<TextureAsset>(world, handle);
|
|
291
218
|
if (!podRes.ok) return undefined;
|
|
292
219
|
const residentRes = store.ensureResident(handle, podRes.value, worldId);
|
|
293
220
|
if (!residentRes.ok) {
|
|
@@ -304,13 +231,14 @@ export function residentTextureView(
|
|
|
304
231
|
|
|
305
232
|
function residentSampler(
|
|
306
233
|
world: World,
|
|
307
|
-
store:
|
|
234
|
+
store: GpuResidencyCache,
|
|
308
235
|
runtime: RenderSystemRuntime,
|
|
309
236
|
handle: Handle<'SamplerAsset', 'shared'>,
|
|
237
|
+
worldId: World | number = world,
|
|
310
238
|
): Sampler | undefined {
|
|
311
|
-
const podRes =
|
|
239
|
+
const podRes = resolveAssetHandle<SamplerAsset>(world, handle);
|
|
312
240
|
if (!podRes.ok) return undefined;
|
|
313
|
-
const residentRes = store.ensureSamplerResident(handle, podRes.value);
|
|
241
|
+
const residentRes = store.ensureSamplerResident(handle, podRes.value, worldId);
|
|
314
242
|
if (!residentRes.ok) {
|
|
315
243
|
runtime.errorRegistry.fire(residentRes.error);
|
|
316
244
|
return undefined;
|
|
@@ -327,7 +255,7 @@ function residentSampler(
|
|
|
327
255
|
// D-1) for this entity's HTMLVideoElement, upload its current frame via
|
|
328
256
|
// `store.uploadFrame` (copyExternalImageToTexture), and return the resulting
|
|
329
257
|
// view. When the provider is absent / returns no element / the element has no
|
|
330
|
-
// decodable dimensions yet, fall back to
|
|
258
|
+
// decodable dimensions yet, fall back to a previously-uploaded view and
|
|
331
259
|
// finally to `undefined` (caller binds the default view this frame — charter
|
|
332
260
|
// P3 graceful, no garbage sampling). A failed GPU upload fires the structured
|
|
333
261
|
// RhiError on the engine channel and degrades to the default view.
|
|
@@ -336,6 +264,8 @@ function residentSampler(
|
|
|
336
264
|
// GPUExternalTexture branch is a reserved hook (OOS-5) — when it ever becomes
|
|
337
265
|
// available the upload would route there. Today it is always false so the
|
|
338
266
|
// general copyExternalImageToTexture path is the only one taken.
|
|
267
|
+
type DynamicTextureStore = import('@forgeax/engine-assets-runtime').DynamicTextureStore;
|
|
268
|
+
|
|
339
269
|
type VideoUploadFailureEpisodes = Map<number, Set<number>>;
|
|
340
270
|
|
|
341
271
|
// The store is renderer-owned, so this keeps one failure episode per
|
|
@@ -387,13 +317,12 @@ export function videoTextureView(
|
|
|
387
317
|
entityKey: number,
|
|
388
318
|
clip: Handle<'VideoAsset', 'shared'>,
|
|
389
319
|
highPerfAvailable: boolean,
|
|
390
|
-
|
|
391
|
-
): any | undefined {
|
|
320
|
+
): TextureView | undefined {
|
|
392
321
|
if (store === undefined) return undefined;
|
|
393
322
|
const provider = world.hasResource(VIDEO_ELEMENT_PROVIDER_KEY)
|
|
394
323
|
? world.getResource<VideoElementProvider>(VIDEO_ELEMENT_PROVIDER_KEY)
|
|
395
324
|
: undefined;
|
|
396
|
-
const element = provider?.getElement(entityKey as
|
|
325
|
+
const element = provider?.getElement(entityKey as EntityHandle, clip);
|
|
397
326
|
// AC-10 double-miss: a VideoPlayer entity can reach NEITHER upload path this
|
|
398
327
|
// frame — no host HTMLVideoElement (general copyExternalImageToTexture path)
|
|
399
328
|
// AND no high-perf GPUExternalTexture path. This is the genuine "this backend
|
|
@@ -436,18 +365,193 @@ export function videoTextureView(
|
|
|
436
365
|
return uploaded.value;
|
|
437
366
|
}
|
|
438
367
|
|
|
368
|
+
// feat-20260621-learn-render-5-5-parallax M2 / w8 (D-3): the built-in
|
|
369
|
+
// standard-PBR user-region texture field order, used when the shader is not
|
|
370
|
+
// resolvable through getParamSchema (cross-worktree late-register). Mirrors
|
|
371
|
+
// derive(default-standard-pbr).textureFieldNames.
|
|
372
|
+
export const BUILTIN_USER_REGION_TEXTURE_FIELDS: readonly string[] = [
|
|
373
|
+
'baseColorTexture',
|
|
374
|
+
'metallicRoughnessTexture',
|
|
375
|
+
'normalTexture',
|
|
376
|
+
'specularTintTexture',
|
|
377
|
+
'emissiveTexture',
|
|
378
|
+
'occlusionTexture',
|
|
379
|
+
];
|
|
380
|
+
|
|
381
|
+
const LEGACY_MATERIAL_TEXTURE_SCALE_OFFSET = 80;
|
|
382
|
+
const STANDARD_PBR_TEXTURE_SCALE_OFFSET = 96;
|
|
383
|
+
const MATERIAL_TEXTURE_SCALE_FIELDS = [
|
|
384
|
+
'baseColorTexture',
|
|
385
|
+
'metallicRoughnessTexture',
|
|
386
|
+
'normalTexture',
|
|
387
|
+
'specularTintTexture',
|
|
388
|
+
'emissiveTexture',
|
|
389
|
+
'occlusionTexture',
|
|
390
|
+
] as const;
|
|
391
|
+
const LEGACY_MATERIAL_TEXTURE_SCALE_FIELDS = [
|
|
392
|
+
'baseColorTexture',
|
|
393
|
+
'metallicRoughnessTexture',
|
|
394
|
+
'normalTexture',
|
|
395
|
+
'emissiveTexture',
|
|
396
|
+
'occlusionTexture',
|
|
397
|
+
] as const;
|
|
398
|
+
const STANDARD_PBR_TEXTURE_COORDINATE_OFFSET = 96;
|
|
399
|
+
const STANDARD_PBR_TEXTURE_COORDINATE_STRIDE = 8;
|
|
400
|
+
const DEFAULT_LEGACY_TEXTURE_SCALES = new Float32Array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
|
|
401
|
+
const DEFAULT_STANDARD_TEXTURE_COORDINATES = new Float32Array([
|
|
402
|
+
0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0,
|
|
403
|
+
0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
|
|
404
|
+
]);
|
|
405
|
+
|
|
406
|
+
/** Derives the logical-content UV scale for an uploaded material texture. */
|
|
407
|
+
export function materialTextureUvScale(
|
|
408
|
+
texture: Pick<TextureAsset, 'width' | 'height' | 'format'> | undefined,
|
|
409
|
+
): readonly [number, number] {
|
|
410
|
+
if (texture === undefined) return [1, 1];
|
|
411
|
+
return deriveTextureExtent(texture.format, texture.width, texture.height).uvScale;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function materialTextureForField(
|
|
415
|
+
material: MaterialSnapshot,
|
|
416
|
+
field: string,
|
|
417
|
+
): Handle<'TextureAsset', 'shared'> | undefined {
|
|
418
|
+
if (field === 'emissiveTexture') return material.emissiveTexture;
|
|
419
|
+
if (field === 'occlusionTexture') return material.occlusionTexture;
|
|
420
|
+
return material.textureHandles?.get(field);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Appends the engine-owned scale for every built-in material texture binding.
|
|
425
|
+
* Asset dimensions remain logical; this is the sole record-stage projection
|
|
426
|
+
* from a bound texture asset to its shader sampling coordinates.
|
|
427
|
+
*/
|
|
428
|
+
type MaterialUboPayload = ArrayBuffer | Uint8Array | Float32Array;
|
|
429
|
+
|
|
430
|
+
function materialUboFloatView(payload: MaterialUboPayload): Float32Array {
|
|
431
|
+
if (payload instanceof Float32Array) return payload;
|
|
432
|
+
return payload instanceof Uint8Array
|
|
433
|
+
? new Float32Array(payload.buffer, payload.byteOffset, payload.byteLength / 4)
|
|
434
|
+
: new Float32Array(payload);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export function applyMaterialTextureUvScales(
|
|
438
|
+
payload: MaterialUboPayload,
|
|
439
|
+
material: MaterialSnapshot,
|
|
440
|
+
world: World,
|
|
441
|
+
): void {
|
|
442
|
+
const f32 = materialUboFloatView(payload);
|
|
443
|
+
const coordinateSchema = materialCoordinateSchema(material);
|
|
444
|
+
if (coordinateSchema !== undefined) {
|
|
445
|
+
const coordinateRecords = derivedParamSchema(coordinateSchema).coordinateRecords;
|
|
446
|
+
for (const record of coordinateRecords) {
|
|
447
|
+
const field = record.parameter;
|
|
448
|
+
const handle = materialTextureForField(material, field);
|
|
449
|
+
const resolvedTexture =
|
|
450
|
+
handle === undefined ? undefined : resolveAssetHandle<TextureAsset>(world, handle);
|
|
451
|
+
const texture = resolvedTexture?.ok === true ? resolvedTexture.value : undefined;
|
|
452
|
+
const [u, v] = materialTextureUvScale(texture);
|
|
453
|
+
const coordinates = resolveMaterialTextureCoordinates(
|
|
454
|
+
material.textureCoordinates?.get(field),
|
|
455
|
+
);
|
|
456
|
+
const offset = record.offset / 4;
|
|
457
|
+
f32[offset] = coordinates.transform.offset[0];
|
|
458
|
+
f32[offset + 1] = coordinates.transform.offset[1];
|
|
459
|
+
f32[offset + 2] = coordinates.transform.scale[0];
|
|
460
|
+
f32[offset + 3] = coordinates.transform.scale[1];
|
|
461
|
+
f32[offset + 4] = coordinates.set;
|
|
462
|
+
f32[offset + 5] = coordinates.transform.rotation;
|
|
463
|
+
f32[offset + 6] = u;
|
|
464
|
+
f32[offset + 7] = v;
|
|
465
|
+
}
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
// Standard PBR grew two authored coat fields before the engine-owned UV
|
|
469
|
+
// tail. Sprite, sprite-lit, unlit, and text keep their own 80-byte tail
|
|
470
|
+
// position because their WGSL layouts do not carry clearcoat.
|
|
471
|
+
const textureScaleOffset = isStandardPbrMaterialShader(material.materialShaderId)
|
|
472
|
+
? STANDARD_PBR_TEXTURE_SCALE_OFFSET
|
|
473
|
+
: LEGACY_MATERIAL_TEXTURE_SCALE_OFFSET;
|
|
474
|
+
const isStandardPbr = textureScaleOffset === STANDARD_PBR_TEXTURE_SCALE_OFFSET;
|
|
475
|
+
const hasTextureMetadata =
|
|
476
|
+
material.textureCoordinates !== undefined ||
|
|
477
|
+
material.textureHandles !== undefined ||
|
|
478
|
+
material.videoTextureFields !== undefined ||
|
|
479
|
+
material.baseColorTexture !== undefined ||
|
|
480
|
+
material.metallicRoughnessTexture !== undefined ||
|
|
481
|
+
material.normalTexture !== undefined ||
|
|
482
|
+
material.emissiveTexture !== undefined ||
|
|
483
|
+
material.occlusionTexture !== undefined;
|
|
484
|
+
if (!hasTextureMetadata) {
|
|
485
|
+
f32.set(
|
|
486
|
+
isStandardPbr ? DEFAULT_STANDARD_TEXTURE_COORDINATES : DEFAULT_LEGACY_TEXTURE_SCALES,
|
|
487
|
+
textureScaleOffset / 4,
|
|
488
|
+
);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
const fields = isStandardPbr
|
|
492
|
+
? MATERIAL_TEXTURE_SCALE_FIELDS
|
|
493
|
+
: LEGACY_MATERIAL_TEXTURE_SCALE_FIELDS;
|
|
494
|
+
for (let index = 0; index < fields.length; index++) {
|
|
495
|
+
const field = fields[index];
|
|
496
|
+
if (field === undefined) continue;
|
|
497
|
+
const handle = materialTextureForField(material, field);
|
|
498
|
+
const resolved =
|
|
499
|
+
handle === undefined ? undefined : resolveAssetHandle<TextureAsset>(world, handle);
|
|
500
|
+
const texture = resolved?.ok === true ? resolved.value : undefined;
|
|
501
|
+
const [u, v] = materialTextureUvScale(texture);
|
|
502
|
+
if (isStandardPbr) {
|
|
503
|
+
const coordinates = material.textureCoordinates?.get(field);
|
|
504
|
+
const transform = coordinates?.transform;
|
|
505
|
+
const offset =
|
|
506
|
+
STANDARD_PBR_TEXTURE_COORDINATE_OFFSET / 4 + index * STANDARD_PBR_TEXTURE_COORDINATE_STRIDE;
|
|
507
|
+
f32[offset] = transform?.offset?.[0] ?? 0;
|
|
508
|
+
f32[offset + 1] = transform?.offset?.[1] ?? 0;
|
|
509
|
+
f32[offset + 2] = transform?.scale?.[0] ?? 1;
|
|
510
|
+
f32[offset + 3] = transform?.scale?.[1] ?? 1;
|
|
511
|
+
f32[offset + 4] = coordinates?.set ?? 0;
|
|
512
|
+
f32[offset + 5] = transform?.rotation ?? 0;
|
|
513
|
+
f32[offset + 6] = u;
|
|
514
|
+
f32[offset + 7] = v;
|
|
515
|
+
} else {
|
|
516
|
+
const offset = textureScaleOffset / 4 + index * 2;
|
|
517
|
+
f32[offset] = u;
|
|
518
|
+
f32[offset + 1] = v;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
function materialCoordinateSchema(
|
|
524
|
+
material: MaterialSnapshot,
|
|
525
|
+
): readonly ParamSchemaEntry[] | undefined {
|
|
526
|
+
if (material.materialParamSchema !== undefined && material.materialParamSchema.length > 0) {
|
|
527
|
+
return material.materialParamSchema;
|
|
528
|
+
}
|
|
529
|
+
switch (material.materialShaderId) {
|
|
530
|
+
case 'forgeax::default-unlit':
|
|
531
|
+
return DEFAULT_UNLIT_PARAM_SCHEMA;
|
|
532
|
+
case 'forgeax::sprite':
|
|
533
|
+
case 'forgeax::sprite-lit':
|
|
534
|
+
return DEFAULT_SPRITE_PARAM_SCHEMA;
|
|
535
|
+
case 'forgeax::msdf-text':
|
|
536
|
+
return DEFAULT_MSDF_TEXT_PARAM_SCHEMA;
|
|
537
|
+
default:
|
|
538
|
+
return undefined;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
439
542
|
/**
|
|
440
543
|
* feat-20260621-learn-render-5-5-parallax M2 / w8 (D-3): ordered user-region
|
|
441
544
|
* texture field names for a material's bind-group assembly, derived from the
|
|
442
545
|
* shader's paramSchema via the `derive()` SSOT (insertion order = sampler/
|
|
443
|
-
* texture pair order in derive().bglEntries).
|
|
444
|
-
*
|
|
546
|
+
* texture pair order in derive().bglEntries). Falls back to the built-in 4
|
|
547
|
+
* fields when the schema is unavailable.
|
|
445
548
|
*/
|
|
446
549
|
export function userRegionTextureFieldOrder(
|
|
447
|
-
|
|
550
|
+
schema: Parameters<typeof derive>[0] | undefined,
|
|
448
551
|
): readonly string[] {
|
|
449
|
-
if (
|
|
450
|
-
|
|
552
|
+
if (schema === undefined || schema.length === 0) return BUILTIN_USER_REGION_TEXTURE_FIELDS;
|
|
553
|
+
const fields = [...derivedParamSchema(schema).textureFieldNames];
|
|
554
|
+
return fields.length === 0 ? BUILTIN_USER_REGION_TEXTURE_FIELDS : fields;
|
|
451
555
|
}
|
|
452
556
|
|
|
453
557
|
/**
|
|
@@ -459,8 +563,7 @@ export function userRegionTextureFieldOrder(
|
|
|
459
563
|
export function defaultViewForUserRegionField(
|
|
460
564
|
field: string,
|
|
461
565
|
pipelineState: PipelineState,
|
|
462
|
-
|
|
463
|
-
): any {
|
|
566
|
+
): TextureView {
|
|
464
567
|
if (field === 'normalTexture') return pipelineState.defaultNormalTextureView;
|
|
465
568
|
if (field === 'baseColorTexture') return pipelineState.fallbackTextureView;
|
|
466
569
|
return pipelineState.defaultWhiteTextureView;
|
|
@@ -485,7 +588,7 @@ export function defaultViewForUserRegionField(
|
|
|
485
588
|
* (sentinel `bottom < 0` for tile mode is consumed via abs()).
|
|
486
589
|
* @param renderableIndex The entity index into the validated renderables list.
|
|
487
590
|
* @param seenIndices The per-frame-state guard Set; entries are added on increment.
|
|
488
|
-
* @param metrics The
|
|
591
|
+
* @param metrics The owner-provided EngineMetrics counter.
|
|
489
592
|
* @internal — exported for unit-test access (w17).
|
|
490
593
|
*/
|
|
491
594
|
export function detectNineSliceScaleTooSmall(
|
|
@@ -509,6 +612,203 @@ export function detectNineSliceScaleTooSmall(
|
|
|
509
612
|
}
|
|
510
613
|
}
|
|
511
614
|
|
|
615
|
+
/**
|
|
616
|
+
* Build the 128-byte Material UBO payload for a PBR / unlit material entry
|
|
617
|
+
* (feat-20260527-sprite-nineslice M2 / w11; D-7 regression-net helper).
|
|
618
|
+
*
|
|
619
|
+
* Byte-for-byte equivalent to the legacy hard-coded PBR write path; each
|
|
620
|
+
* deviation is caught by `render-system-record-pbr-ubo-stable.test.ts`.
|
|
621
|
+
* The schema-driven paramSnapshot overlay (feat-20260523 M9-T05; AC-14)
|
|
622
|
+
* positions vec4 / f32 slots onto std140 [slot0 vec4, slot1 f32 metallic,
|
|
623
|
+
* slot1 f32 roughness] mirroring the engine-shipped default-standard-pbr
|
|
624
|
+
* Material struct.
|
|
625
|
+
*/
|
|
626
|
+
export function buildPbrMaterialUboPayload(material: MaterialSnapshot): Uint8Array {
|
|
627
|
+
const buf = new Uint8Array(STANDARD_PBR_UBO_SIZE);
|
|
628
|
+
writePbrMaterialUboPayload(buf, material);
|
|
629
|
+
return buf;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/**
|
|
633
|
+
* Write the standard material payload into caller-owned storage.
|
|
634
|
+
*
|
|
635
|
+
* The allocating wrapper above remains the byte-stable test/helper surface,
|
|
636
|
+
* while the frame recorder reuses one scratch slot for all materials. A
|
|
637
|
+
* scene with thousands of submeshes otherwise allocates one 304-byte
|
|
638
|
+
* Uint8Array per material per frame, creating avoidable GC pressure without
|
|
639
|
+
* changing GPU-visible bytes.
|
|
640
|
+
*/
|
|
641
|
+
export function writePbrMaterialUboPayload(
|
|
642
|
+
buf: Uint8Array | Float32Array,
|
|
643
|
+
material: MaterialSnapshot,
|
|
644
|
+
): void {
|
|
645
|
+
if (buf.byteLength < STANDARD_PBR_UBO_SIZE) {
|
|
646
|
+
throw new RangeError(
|
|
647
|
+
`writePbrMaterialUboPayload: expected at least ${STANDARD_PBR_UBO_SIZE} bytes, got ${buf.byteLength}`,
|
|
648
|
+
);
|
|
649
|
+
}
|
|
650
|
+
buf.fill(0);
|
|
651
|
+
const f32 = materialUboFloatView(buf);
|
|
652
|
+
// Layout (issue-1: channelMap split per D-8) -- byte-equivalent to the
|
|
653
|
+
// post-split sidecar paramSchema for default-standard-pbr (12 numeric
|
|
654
|
+
// entries packed std140 into one merged UBO at binding(0)).
|
|
655
|
+
// f32[0..3] baseColor (offset 0, vec4)
|
|
656
|
+
// f32[4] metallic (offset 16)
|
|
657
|
+
// f32[5] roughness (offset 20)
|
|
658
|
+
// f32[6] metallicChannel (offset 24) -- glTF 2.0 default = B = 2
|
|
659
|
+
// f32[7] roughnessChannel (offset 28) -- glTF 2.0 default = G = 1
|
|
660
|
+
// f32[8] aoChannel (offset 32) -- glTF 2.0 default = R = 0
|
|
661
|
+
// f32[9] extraChannel (offset 36) -- reserved = 0
|
|
662
|
+
// (offset 40..47 implicit pad: vec3 align=16)
|
|
663
|
+
// f32[12..14] emissive (offset 48, vec3)
|
|
664
|
+
// f32[15] emissiveIntensity (offset 60)
|
|
665
|
+
// f32[16] occlusionStrength (offset 64)
|
|
666
|
+
// f32[17] alphaCutoff (offset 68)
|
|
667
|
+
// f32[18] clearcoat (offset 72)
|
|
668
|
+
// f32[19] clearcoatRoughness (offset 76)
|
|
669
|
+
// f32[20..22] specularTint (offset 80, vec3)
|
|
670
|
+
// (offset 92..95 alignment pad)
|
|
671
|
+
// f32[24..71] engine-owned texture coordinate records (offset 96)
|
|
672
|
+
// f32[72] normalScale (offset 288)
|
|
673
|
+
f32[0] = material.baseColor[0] ?? 0;
|
|
674
|
+
f32[1] = material.baseColor[1] ?? 0;
|
|
675
|
+
f32[2] = material.baseColor[2] ?? 0;
|
|
676
|
+
f32[3] = 1;
|
|
677
|
+
f32[4] = material.metallic;
|
|
678
|
+
f32[5] = material.roughness;
|
|
679
|
+
// channelMap default = (B, G, R, _) per AGENTS.md + glTF 2.0
|
|
680
|
+
// KHR_materials_pbrSpecularGlossiness ARM packing -- now 4 independent
|
|
681
|
+
// f32 selectors; fragment casts each to u32 at the pick site.
|
|
682
|
+
f32[6] = 2; // metallicChannel <- B
|
|
683
|
+
f32[7] = 1; // roughnessChannel <- G
|
|
684
|
+
f32[8] = 0; // aoChannel <- R
|
|
685
|
+
f32[9] = 0; // extraChannel <- reserved
|
|
686
|
+
// emissive vec3 + emissiveIntensity (offset 48..63)
|
|
687
|
+
const em = material.emissive;
|
|
688
|
+
f32[12] = em?.[0] ?? 0;
|
|
689
|
+
f32[13] = em?.[1] ?? 0;
|
|
690
|
+
f32[14] = em?.[2] ?? 0;
|
|
691
|
+
f32[15] = material.emissiveIntensity ?? 0;
|
|
692
|
+
// occlusionStrength (offset 64)
|
|
693
|
+
f32[16] = material.occlusionStrength ?? 1;
|
|
694
|
+
// alphaCutoff (offset 68).
|
|
695
|
+
const alphaCutoff = material.paramSnapshot?.alphaCutoff;
|
|
696
|
+
f32[17] = typeof alphaCutoff === 'number' ? alphaCutoff : 0;
|
|
697
|
+
f32[18] = material.clearcoat ?? 0;
|
|
698
|
+
f32[19] = material.clearcoatRoughness ?? 0.5;
|
|
699
|
+
const specularTint = material.specularTint;
|
|
700
|
+
f32[20] = specularTint?.[0] ?? 1;
|
|
701
|
+
f32[21] = specularTint?.[1] ?? 1;
|
|
702
|
+
f32[22] = specularTint?.[2] ?? 1;
|
|
703
|
+
f32[72] = material.normalScale ?? 1;
|
|
704
|
+
// Schema-driven paramSnapshot overlay (feat-20260523 M9-T05, AC-14):
|
|
705
|
+
// for user-shaders with a paramSnapshot, project the first vec4/color
|
|
706
|
+
// entry onto slot 0 and the first two f32 entries onto slot 1's first
|
|
707
|
+
// two floats. The default-standard-pbr path lands on the same offsets
|
|
708
|
+
// via the explicit fields above, so the overlay is a no-op for the
|
|
709
|
+
// engine's stock PBR shader (charter P4 + R-H regression fence).
|
|
710
|
+
const paramSnap = material.paramSnapshot;
|
|
711
|
+
if (paramSnap !== undefined) {
|
|
712
|
+
const f32Snap = (name: string): number | undefined => {
|
|
713
|
+
const v = paramSnap[name];
|
|
714
|
+
return typeof v === 'number' ? v : undefined;
|
|
715
|
+
};
|
|
716
|
+
const colorSnap = (name: string): readonly number[] | undefined => {
|
|
717
|
+
const v = paramSnap[name];
|
|
718
|
+
return Array.isArray(v) && v.every((x) => typeof x === 'number')
|
|
719
|
+
? (v as readonly number[])
|
|
720
|
+
: undefined;
|
|
721
|
+
};
|
|
722
|
+
// Walk schema in declared order, fill positional UBO slots.
|
|
723
|
+
const materialShaderId = material.materialShaderId;
|
|
724
|
+
// Note: schema lookup is the caller's job (it owns the runtime ref);
|
|
725
|
+
// when the helper has no access to runtime, paramSnap is consumed
|
|
726
|
+
// positionally without a schema walk. The inline caller (recordFrame)
|
|
727
|
+
// still performs the schema-driven walk and writes the overlay before
|
|
728
|
+
// queueing this payload, so this helper is only the byte-stable
|
|
729
|
+
// baseline. To preserve byte-for-byte equivalence in the helper-only
|
|
730
|
+
// unit-test path, the overlay pass is skipped when the helper is
|
|
731
|
+
// called without an external schema reference.
|
|
732
|
+
void materialShaderId;
|
|
733
|
+
void f32Snap;
|
|
734
|
+
void colorSnap;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/**
|
|
739
|
+
* Generic std140 UBO writer driven by `derive(paramSchema).uboLayout.entries`
|
|
740
|
+
* (feat-20260625-refactor-sprite-as-transparent-mesh M1 / w3, plan-strategy
|
|
741
|
+
* section 2 D-2).
|
|
742
|
+
*
|
|
743
|
+
* For each numeric entry in the schema, looks up the matching value in
|
|
744
|
+
* `paramSnapshot` and writes it at the std140 offset `derive` computed.
|
|
745
|
+
* Vec / color entries pull from `paramSnapshot[name]` as a `readonly number[]`
|
|
746
|
+
* (writes `min(size/4, value.length)` floats, padding with 0 if shorter for
|
|
747
|
+
* the field's declared width); scalar entries pull a single number.
|
|
748
|
+
*
|
|
749
|
+
* Behaviour:
|
|
750
|
+
* - schema or snapshot `undefined` -> no writes (caller may keep payload
|
|
751
|
+
* baseline).
|
|
752
|
+
* - missing snapshot field -> that field's bytes are left untouched
|
|
753
|
+
* (overlay semantics; same shape the legacy inline overlay had).
|
|
754
|
+
* - field type the writer cannot interpret (texture / sampler / storage_
|
|
755
|
+
* buffer / value-type mismatch) -> skipped silently; `derive` strips
|
|
756
|
+
* non-numeric entries from `uboLayout.entries` so the loop only iterates
|
|
757
|
+
* numeric fields.
|
|
758
|
+
*
|
|
759
|
+
* The writer reads `paramSnapshot` only -- it does NOT call
|
|
760
|
+
* `runtime.assets.get<MaterialAsset>` or cast `firstMaterial`. Gate R-H
|
|
761
|
+
* (plan-strategy section 5.6) bans those paths through
|
|
762
|
+
* `scripts/forgeax/check-render-record-no-material-asset-get.mjs`.
|
|
763
|
+
*
|
|
764
|
+
* standard-pbr remains byte-identical to `buildPbrMaterialUboPayload`: the
|
|
765
|
+
* engine's stock PBR material ships `paramSnapshot: undefined`, so this
|
|
766
|
+
* writer is a no-op on that path; the explicit field writes in the helper
|
|
767
|
+
* above cover every byte. User shaders (sprite-shaped 4 x vec4 or another
|
|
768
|
+
* paramSchema) get their fields written at the offsets declared by derive.
|
|
769
|
+
*
|
|
770
|
+
* @internal export-for-test (consumed inside `recordFrame` + render-system-
|
|
771
|
+
* record.test.ts; not part of the package's public surface).
|
|
772
|
+
*/
|
|
773
|
+
export function applyParamSnapshotToUbo(
|
|
774
|
+
payload: MaterialUboPayload,
|
|
775
|
+
paramSchema: readonly ParamSchemaEntry[] | undefined,
|
|
776
|
+
paramSnapshot:
|
|
777
|
+
| Readonly<Record<string, number | readonly number[] | string | undefined>>
|
|
778
|
+
| undefined,
|
|
779
|
+
): void {
|
|
780
|
+
if (paramSchema === undefined) return;
|
|
781
|
+
if (paramSnapshot === undefined) return;
|
|
782
|
+
const f32 = materialUboFloatView(payload);
|
|
783
|
+
const { uboLayout } = derivedParamSchema(paramSchema);
|
|
784
|
+
for (const entry of uboLayout.entries) {
|
|
785
|
+
const value = paramSnapshot[entry.name];
|
|
786
|
+
if (value === undefined) continue;
|
|
787
|
+
const f32Offset = entry.offset / 4;
|
|
788
|
+
const f32Width = entry.size / 4;
|
|
789
|
+
if (typeof value === 'number') {
|
|
790
|
+
// Scalar f32 / i32 / u32 -- single-slot write. (i32 / u32 still arrive
|
|
791
|
+
// as a JS number; the GPU side reads the four bytes as the declared
|
|
792
|
+
// type, so an f32 write is the correct bit pattern when the caller
|
|
793
|
+
// already produced an integer value.)
|
|
794
|
+
if (f32Width >= 1) f32[f32Offset] = value;
|
|
795
|
+
continue;
|
|
796
|
+
}
|
|
797
|
+
if (Array.isArray(value)) {
|
|
798
|
+
const arr = value as readonly number[];
|
|
799
|
+
const writeCount = Math.min(arr.length, f32Width);
|
|
800
|
+
for (let i = 0; i < writeCount; i++) {
|
|
801
|
+
const v = arr[i];
|
|
802
|
+
if (typeof v === 'number') f32[f32Offset + i] = v;
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
// string values (texture GUIDs) belong to texture bindings, not the
|
|
806
|
+
// UBO; derive's uboLayout.entries already strips non-numeric schema
|
|
807
|
+
// entries, so we will not see a uboLayout entry whose snapshot value
|
|
808
|
+
// is a string under normal flow. Skip defensively if we do.
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
|
|
512
812
|
/**
|
|
513
813
|
* feat-20260704 M3/w19: shared per-submesh material bind-group assembly, hoisted
|
|
514
814
|
* from the `buildPerSubmeshMaterialBg` closure inside recordMainPass so both the
|
|
@@ -530,13 +830,13 @@ export interface PerSubmeshMaterialBgDeps {
|
|
|
530
830
|
readonly runtime: RenderSystemRuntime;
|
|
531
831
|
readonly pipelineState: PipelineState;
|
|
532
832
|
readonly world: World;
|
|
533
|
-
readonly store:
|
|
833
|
+
readonly store: GpuResidencyCache;
|
|
534
834
|
readonly materialSlice: number;
|
|
535
835
|
readonly videoHighPerfAvailable: boolean;
|
|
536
836
|
readonly skylightResources: SkylightBindGroupResources;
|
|
537
837
|
readonly materialBgShared: Map<string, WeakMap<object, unknown>>;
|
|
538
838
|
/** Cross-frame final BG reuse keyed by the stable source material handle. */
|
|
539
|
-
readonly materialBgAssemblyCache: Map<
|
|
839
|
+
readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
|
|
540
840
|
readonly bindGroupCounts: BindGroupCounts;
|
|
541
841
|
}
|
|
542
842
|
|
|
@@ -568,11 +868,11 @@ export function buildPerSubmeshMaterialBg(
|
|
|
568
868
|
deps: PerSubmeshMaterialBgDeps,
|
|
569
869
|
submeshMaterial: MaterialSnapshot,
|
|
570
870
|
entityKey: number,
|
|
871
|
+
materialWorld: World = deps.world,
|
|
571
872
|
): BindGroup {
|
|
572
873
|
const {
|
|
573
874
|
runtime,
|
|
574
875
|
pipelineState,
|
|
575
|
-
world,
|
|
576
876
|
store,
|
|
577
877
|
materialSlice,
|
|
578
878
|
videoHighPerfAvailable,
|
|
@@ -582,14 +882,16 @@ export function buildPerSubmeshMaterialBg(
|
|
|
582
882
|
bindGroupCounts,
|
|
583
883
|
} = deps;
|
|
584
884
|
const smMaterialHandle = submeshMaterial.materialHandle;
|
|
885
|
+
const materialCacheKey =
|
|
886
|
+
smMaterialHandle === undefined ? undefined : `${materialWorld.identity}:${smMaterialHandle}`;
|
|
585
887
|
const smHasVideoFields = (submeshMaterial.videoTextureFields?.size ?? 0) > 0;
|
|
586
888
|
const smShaderId = submeshMaterial.materialShaderId;
|
|
587
889
|
const smPerShaderBgl =
|
|
588
890
|
smShaderId !== undefined ? runtime.getMaterialBindGroupLayout?.(smShaderId) : undefined;
|
|
589
|
-
const usesSharedPbrMaterialLayout = smPerShaderBgl === undefined;
|
|
590
891
|
const smMaterialBgl = smPerShaderBgl ?? pipelineState.materialBindGroupLayout;
|
|
591
892
|
if (smMaterialHandle !== undefined && !smHasVideoFields) {
|
|
592
|
-
const cached =
|
|
893
|
+
const cached =
|
|
894
|
+
materialCacheKey === undefined ? undefined : materialBgAssemblyCache.get(materialCacheKey);
|
|
593
895
|
if (
|
|
594
896
|
isMaterialBgAssemblyCacheHit(
|
|
595
897
|
cached,
|
|
@@ -603,32 +905,24 @@ export function buildPerSubmeshMaterialBg(
|
|
|
603
905
|
return cached.bindGroup;
|
|
604
906
|
}
|
|
605
907
|
}
|
|
606
|
-
const
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
? DEFAULT_STANDARD_PBR_DERIVED_INTERFACE
|
|
620
|
-
: (submeshMaterial.derivedMaterialSlot?.derivedInterface ??
|
|
621
|
-
smRegisteredProjection?.derivedInterface ??
|
|
622
|
-
(smSchema === undefined
|
|
623
|
-
? undefined
|
|
624
|
-
: derivedParamSchema(smSchema, runtime.paramSchemaProjectionCensus)));
|
|
625
|
-
const smMaterialByteLength = smProjection?.totalBytes || materialSlice;
|
|
626
|
-
const smUserRegionFields = userRegionTextureFieldOrder(smProjection);
|
|
908
|
+
const smSchema =
|
|
909
|
+
submeshMaterial.materialParamSchema ??
|
|
910
|
+
(smShaderId !== undefined ? runtime.getParamSchema?.(smShaderId) : undefined);
|
|
911
|
+
// The shipped PBR shaders always own the six texture pairs declared by the
|
|
912
|
+
// standard shader artifact. Authored material snapshots may intentionally
|
|
913
|
+
// carry a compact four-field schema because emissive/occlusion are engine
|
|
914
|
+
// injected values, but the runtime PBR BGL still exposes bindings 9..12 for
|
|
915
|
+
// those pairs. Keep the record projection on the shader-owned layout so IBL
|
|
916
|
+
// starts at binding 13 rather than colliding with emissiveSampler.
|
|
917
|
+
const smUserRegionFields =
|
|
918
|
+
smPerShaderBgl === undefined || isStandardPbrMaterialShader(smShaderId)
|
|
919
|
+
? BUILTIN_USER_REGION_TEXTURE_FIELDS
|
|
920
|
+
: userRegionTextureFieldOrder(smSchema);
|
|
627
921
|
let materialResourcesResident = true;
|
|
628
922
|
const smSamplerForField = (field: string | undefined): Sampler => {
|
|
629
923
|
const handle = field === undefined ? undefined : submeshMaterial.samplerHandles?.get(field);
|
|
630
924
|
if (handle === undefined) return pipelineState.defaultSampler;
|
|
631
|
-
const sampler = residentSampler(
|
|
925
|
+
const sampler = residentSampler(materialWorld, store, runtime, handle);
|
|
632
926
|
if (sampler === undefined) materialResourcesResident = false;
|
|
633
927
|
return sampler ?? pipelineState.defaultSampler;
|
|
634
928
|
};
|
|
@@ -640,7 +934,7 @@ export function buildPerSubmeshMaterialBg(
|
|
|
640
934
|
value: {
|
|
641
935
|
buffer: pipelineState.materialUniformBuffer.buffer,
|
|
642
936
|
offset: 0,
|
|
643
|
-
size:
|
|
937
|
+
size: materialSlice,
|
|
644
938
|
},
|
|
645
939
|
},
|
|
646
940
|
},
|
|
@@ -650,7 +944,7 @@ export function buildPerSubmeshMaterialBg(
|
|
|
650
944
|
const field = smUserRegionFields[fi];
|
|
651
945
|
const samplerBinding = 1 + fi * 2;
|
|
652
946
|
const textureBinding = samplerBinding + 1;
|
|
653
|
-
let smView:
|
|
947
|
+
let smView: TextureView =
|
|
654
948
|
field !== undefined
|
|
655
949
|
? defaultViewForUserRegionField(field, pipelineState)
|
|
656
950
|
: pipelineState.defaultWhiteTextureView;
|
|
@@ -658,7 +952,7 @@ export function buildPerSubmeshMaterialBg(
|
|
|
658
952
|
field !== undefined ? submeshMaterial.videoTextureFields?.get(field) : undefined;
|
|
659
953
|
if (smVideoClip !== undefined) {
|
|
660
954
|
const view = videoTextureView(
|
|
661
|
-
|
|
955
|
+
materialWorld,
|
|
662
956
|
runtime.dynamicTextureStore,
|
|
663
957
|
runtime,
|
|
664
958
|
entityKey,
|
|
@@ -667,9 +961,16 @@ export function buildPerSubmeshMaterialBg(
|
|
|
667
961
|
);
|
|
668
962
|
if (view !== undefined) smView = view;
|
|
669
963
|
} else {
|
|
670
|
-
const smHandle =
|
|
964
|
+
const smHandle =
|
|
965
|
+
field === 'emissiveTexture'
|
|
966
|
+
? submeshMaterial.emissiveTexture
|
|
967
|
+
: field === 'occlusionTexture'
|
|
968
|
+
? submeshMaterial.occlusionTexture
|
|
969
|
+
: field !== undefined
|
|
970
|
+
? submeshMaterial.textureHandles?.get(field)
|
|
971
|
+
: undefined;
|
|
671
972
|
if (smHandle !== undefined) {
|
|
672
|
-
const view = residentTextureView(
|
|
973
|
+
const view = residentTextureView(materialWorld, store, runtime, smHandle);
|
|
673
974
|
if (view !== undefined) smView = view;
|
|
674
975
|
else materialResourcesResident = false;
|
|
675
976
|
}
|
|
@@ -681,11 +982,35 @@ export function buildPerSubmeshMaterialBg(
|
|
|
681
982
|
},
|
|
682
983
|
{
|
|
683
984
|
binding: textureBinding,
|
|
684
|
-
resource: { kind: 'textureView' as const, value: smView
|
|
985
|
+
resource: { kind: 'textureView' as const, value: smView },
|
|
685
986
|
},
|
|
686
987
|
);
|
|
687
988
|
}
|
|
688
|
-
|
|
989
|
+
let smEmissiveView: TextureView = pipelineState.defaultWhiteTextureView;
|
|
990
|
+
const smEmissiveHandle = submeshMaterial.emissiveTexture;
|
|
991
|
+
if (smEmissiveHandle !== undefined) {
|
|
992
|
+
const view = residentTextureView(materialWorld, store, runtime, smEmissiveHandle);
|
|
993
|
+
if (view !== undefined) smEmissiveView = view;
|
|
994
|
+
else materialResourcesResident = false;
|
|
995
|
+
}
|
|
996
|
+
let smOcclusionView: TextureView = pipelineState.defaultWhiteTextureView;
|
|
997
|
+
const smOcclusionHandle = submeshMaterial.occlusionTexture;
|
|
998
|
+
if (smOcclusionHandle !== undefined) {
|
|
999
|
+
const view = residentTextureView(materialWorld, store, runtime, smOcclusionHandle);
|
|
1000
|
+
if (view !== undefined) smOcclusionView = view;
|
|
1001
|
+
else materialResourcesResident = false;
|
|
1002
|
+
}
|
|
1003
|
+
const smEmissiveAo: EmissiveAoBindGroupResources = {
|
|
1004
|
+
emissiveSampler: smSamplerForField('emissiveTexture'),
|
|
1005
|
+
emissiveView: smEmissiveView,
|
|
1006
|
+
occlusionSampler: smSamplerForField('occlusionTexture'),
|
|
1007
|
+
occlusionView: smOcclusionView,
|
|
1008
|
+
};
|
|
1009
|
+
const smMergedEntries = assembleMaterialWithSkylightEntries(
|
|
1010
|
+
smBaseEntries,
|
|
1011
|
+
skylightResources,
|
|
1012
|
+
smEmissiveAo,
|
|
1013
|
+
);
|
|
689
1014
|
const smBindGroup = getOrCreatePerEntity(
|
|
690
1015
|
materialBgShared,
|
|
691
1016
|
smShaderId ?? '',
|
|
@@ -703,14 +1028,16 @@ export function buildPerSubmeshMaterialBg(
|
|
|
703
1028
|
bindGroupCounts,
|
|
704
1029
|
);
|
|
705
1030
|
if (smMaterialHandle !== undefined && !smHasVideoFields && materialResourcesResident) {
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
1031
|
+
if (materialCacheKey !== undefined) {
|
|
1032
|
+
materialBgAssemblyCache.set(materialCacheKey, {
|
|
1033
|
+
material: submeshMaterial,
|
|
1034
|
+
materialResourceEpoch: store.materialResourceEpoch,
|
|
1035
|
+
materialBgl: smMaterialBgl,
|
|
1036
|
+
materialBuffer: pipelineState.materialUniformBuffer.buffer,
|
|
1037
|
+
skylightResources,
|
|
1038
|
+
bindGroup: smBindGroup,
|
|
1039
|
+
});
|
|
1040
|
+
}
|
|
714
1041
|
}
|
|
715
1042
|
return smBindGroup;
|
|
716
1043
|
}
|