@forgeax/engine-render 0.1.35 → 0.1.36

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.
Files changed (87) hide show
  1. package/README.md +17 -0
  2. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  3. package/dist/{chunk-MXTWKZO4.mjs → chunk-2OZAS3WU.mjs} +225 -4
  4. package/dist/chunk-2OZAS3WU.mjs.map +1 -0
  5. package/dist/{chunk-G6HDNGY7.mjs → chunk-BZQ4CDRF.mjs} +24 -230
  6. package/dist/chunk-BZQ4CDRF.mjs.map +1 -0
  7. package/dist/{chunk-LNIUIKQ7.mjs → chunk-CJOV2XLO.mjs} +77 -19
  8. package/dist/chunk-CJOV2XLO.mjs.map +1 -0
  9. package/dist/{chunk-3XUBWRY2.mjs → chunk-D6WSBXJ2.mjs} +4 -4
  10. package/dist/{chunk-3XUBWRY2.mjs.map → chunk-D6WSBXJ2.mjs.map} +1 -1
  11. package/dist/{chunk-LM5IE7GF.mjs → chunk-DRF6OULX.mjs} +3 -3
  12. package/dist/{chunk-LM5IE7GF.mjs.map → chunk-DRF6OULX.mjs.map} +1 -1
  13. package/dist/{chunk-SGPUJW3F.mjs → chunk-OB5WAFYH.mjs} +3 -3
  14. package/dist/{chunk-SGPUJW3F.mjs.map → chunk-OB5WAFYH.mjs.map} +1 -1
  15. package/dist/{chunk-MZ4C7EHF.mjs → chunk-OEYKKMXG.mjs} +5 -5
  16. package/dist/{chunk-MZ4C7EHF.mjs.map → chunk-OEYKKMXG.mjs.map} +1 -1
  17. package/dist/construct-renderer.mjs +130 -71
  18. package/dist/construct-renderer.mjs.map +1 -1
  19. package/dist/device/device-scope.d.ts.map +1 -1
  20. package/dist/features/particle-mesh-layout.d.ts +19 -0
  21. package/dist/features/particle-mesh-layout.d.ts.map +1 -0
  22. package/dist/features/types.d.ts +5 -1
  23. package/dist/features/types.d.ts.map +1 -1
  24. package/dist/gpu-driven/production-raster.d.ts +1 -1
  25. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  26. package/dist/gpu-driven/shadow-views.d.ts +1 -1
  27. package/dist/gpu-driven/shadow-views.d.ts.map +1 -1
  28. package/dist/gpu-driven/view-gpu.d.ts +1 -1
  29. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  30. package/dist/index.mjs +48 -36
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/internal.mjs +5 -5
  33. package/dist/pbr-pipeline.d.ts.map +1 -1
  34. package/dist/publication/publisher.d.ts +1 -0
  35. package/dist/publication/publisher.d.ts.map +1 -1
  36. package/dist/record/frame.d.ts.map +1 -1
  37. package/dist/record/prepared-material-bindings.d.ts +1 -2
  38. package/dist/record/prepared-material-bindings.d.ts.map +1 -1
  39. package/dist/record/render-context.d.ts +2 -0
  40. package/dist/record/render-context.d.ts.map +1 -1
  41. package/dist/record/shadow-pass.d.ts +2 -2
  42. package/dist/record/shadow-pass.d.ts.map +1 -1
  43. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  44. package/dist/recovery/render-system-candidate.d.ts +1 -8
  45. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  46. package/dist/render-system-extract-tail.d.ts.map +1 -1
  47. package/dist/render-system-extract.d.ts.map +1 -1
  48. package/dist/render-system.d.ts.map +1 -1
  49. package/dist/temporal/index.mjs +4 -4
  50. package/dist/typed-shadow-passes.d.ts.map +1 -1
  51. package/package.json +21 -21
  52. package/src/__tests__/device-scope-lifecycle.unit.test.ts +26 -0
  53. package/src/__tests__/gpu-driven-production.integration.test.ts +18 -1
  54. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +23 -0
  55. package/src/__tests__/material-vertex-texture.browser.test.ts +7 -0
  56. package/src/__tests__/material-vertex-texture.dawn.test.ts +7 -0
  57. package/src/__tests__/material-vertex-texture.fixture.ts +31 -0
  58. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +5 -0
  59. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +106 -4
  60. package/src/__tests__/runtime-material-program.integration.test.ts +79 -0
  61. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +23 -3
  62. package/src/assembly/webgpu-renderer.ts +12 -9
  63. package/src/assembly/webgpu-vertex-layouts.ts +2 -9
  64. package/src/device/device-scope.ts +3 -0
  65. package/src/features/particle-mesh-layout.ts +25 -0
  66. package/src/features/types.ts +5 -1
  67. package/src/gpu-driven/production-raster.ts +9 -3
  68. package/src/gpu-driven/shadow-views.ts +27 -2
  69. package/src/gpu-driven/view-gpu.ts +5 -0
  70. package/src/pbr-pipeline.ts +4 -1
  71. package/src/publication/__tests__/features.integration.test.ts +51 -0
  72. package/src/publication/__tests__/publication.integration.test.ts +45 -0
  73. package/src/publication/publisher.ts +56 -29
  74. package/src/record/__tests__/prepared-runtime-material.integration.test.ts +134 -0
  75. package/src/record/frame.ts +45 -6
  76. package/src/record/prepared-material-bindings.ts +11 -37
  77. package/src/record/render-context.ts +2 -0
  78. package/src/record/shadow-pass.ts +65 -4
  79. package/src/record/typed-frame-graph.ts +5 -1
  80. package/src/recovery/render-system-candidate.ts +1 -9
  81. package/src/render-system-extract-tail.ts +15 -6
  82. package/src/render-system-extract.ts +9 -2
  83. package/src/render-system.ts +0 -1
  84. package/src/typed-shadow-passes.ts +36 -5
  85. package/dist/chunk-G6HDNGY7.mjs.map +0 -1
  86. package/dist/chunk-LNIUIKQ7.mjs.map +0 -1
  87. package/dist/chunk-MXTWKZO4.mjs.map +0 -1
@@ -1,11 +1,11 @@
1
- import { DEFAULT_CLUSTER_GRID, DEFAULT_STANDARD_PROFILE, createIblKernelCache, STANDARD_PBR_UBO_SIZE, MATERIAL_PER_ENTITY_STRIDE, MAX_LIGHTS, CLUSTER_GRID_STRIDE_U32, LIGHT_INDEX_LIST_CAPACITY, createStandardClusterLayout } from './chunk-SGPUJW3F.mjs';
1
+ import { DEFAULT_CLUSTER_GRID, DEFAULT_STANDARD_PROFILE, createIblKernelCache, STANDARD_PBR_UBO_SIZE, MATERIAL_PER_ENTITY_STRIDE, MAX_LIGHTS, CLUSTER_GRID_STRIDE_U32, LIGHT_INDEX_LIST_CAPACITY, createStandardClusterLayout } from './chunk-OB5WAFYH.mjs';
2
2
  import { TRANSPARENT_SORT_MODE_LAYER_Z, TRANSPARENT_SORT_MODE_LAYER_Y, SPRITE_PREMULTIPLIED_ALPHA_BLEND } from './chunk-XSFB7XXQ.mjs';
3
3
  import { probeBlendRecordOffset, PROBE_BLEND_RECORD_BYTE_SIZE, PROBE_BLEND_RECORD_STRIDE } from './chunk-RIPAEGI6.mjs';
4
- import { GPU_TEXTURE_USAGE_RENDER_ATTACHMENT, GPU_TEXTURE_USAGE_COPY_SRC, VertexColorVariantConflictError, GPU_SHADER_STAGE_COMPUTE, GPU_BUFFER_USAGE_STORAGE, GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM, createHdrpBindGroupLayoutDescriptor, EquirectProjectionFailedError, SHADOW_ATLAS_DEFAULT_LAYERS, COOKIE_MATRIX_BYTES, SHADOW_ATLAS_DEFAULT_FACE_SIZE, ShadowAtlas, PointShadowAtlasUninitializedError, PointShadowAtlasBoundsViolationError, IES_SLICE_WIDTH, IES_SLICE_HEIGHT, COOKIE_SLICE_SIZE, StandardClusterTransportUnavailableError, GPU_SHADER_STAGE_VERTEX, GPU_SHADER_STAGE_FRAGMENT, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_TEXTURE_BINDING, GPU_BUFFER_USAGE_INDEX, GPU_BUFFER_USAGE_VERTEX, isStandardPbrMaterialShader, worldEntityKey, instanceCollectionCacheKey, instanceUploadRangesForResident, createVisibilityBudget, GPU_BUFFER_USAGE_MAP_READ, getOpaqueResourceIdentity, pbrSkinMeshDynamicOffsets, gpuDrivenShadowDrawKey, SHADOW_CASTER_SHADER_ID, shadowCasterVariantSet, buildPbrMaterialUserRegionEntries, buildBindGroupLayoutDescriptor, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, GPU_BUFFER_USAGE_COPY_SRC, GPU_BUFFER_USAGE_INDIRECT, StandardLightBudgetExceededError, EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES, gpuDrivenSourceDrawItemIndex, matchPass, createPbrSkinMeshBindGroupEntries, physicalTextureFields, isCanonicalStandardPbrMaterialShader, RendererOperationError, resolveRenderTargetMaterialSource, VideoUploadUnsupportedError, SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET, StandardClusterIndexOverflowError, isStandardPbrSkinMaterialShader, SKIN_MATERIAL_SHADER_ID, FXAA_POST_PROCESS_ID, gpuDrivenDrawKey, materialBindGroupLayoutIdentity } from './chunk-MXTWKZO4.mjs';
4
+ import { GPU_TEXTURE_USAGE_RENDER_ATTACHMENT, GPU_TEXTURE_USAGE_COPY_SRC, VertexColorVariantConflictError, GPU_SHADER_STAGE_COMPUTE, GPU_BUFFER_USAGE_STORAGE, GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM, createHdrpBindGroupLayoutDescriptor, EquirectProjectionFailedError, SHADOW_ATLAS_DEFAULT_LAYERS, COOKIE_MATRIX_BYTES, SHADOW_ATLAS_DEFAULT_FACE_SIZE, ShadowAtlas, PointShadowAtlasUninitializedError, PointShadowAtlasBoundsViolationError, IES_SLICE_WIDTH, IES_SLICE_HEIGHT, COOKIE_SLICE_SIZE, StandardClusterTransportUnavailableError, GPU_SHADER_STAGE_VERTEX, GPU_SHADER_STAGE_FRAGMENT, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_TEXTURE_BINDING, GPU_BUFFER_USAGE_INDEX, GPU_BUFFER_USAGE_VERTEX, isStandardPbrMaterialShader, worldEntityKey, instanceCollectionCacheKey, instanceUploadRangesForResident, createVisibilityBudget, GPU_BUFFER_USAGE_MAP_READ, getOpaqueResourceIdentity, pbrSkinMeshDynamicOffsets, gpuDrivenShadowDrawKey, SHADOW_CASTER_SHADER_ID, shadowCasterVariantSet, buildPbrMaterialUserRegionEntries, buildBindGroupLayoutDescriptor, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, GPU_BUFFER_USAGE_COPY_SRC, GPU_BUFFER_USAGE_INDIRECT, StandardLightBudgetExceededError, EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES, gpuDrivenSourceDrawItemIndex, matchPass, deriveInstancesUnionBounds, createPbrSkinMeshBindGroupEntries, physicalTextureFields, isCanonicalStandardPbrMaterialShader, RendererOperationError, resolveRenderTargetMaterialSource, VideoUploadUnsupportedError, SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET, StandardClusterIndexOverflowError, isStandardPbrSkinMaterialShader, SKIN_MATERIAL_SHADER_ID, FXAA_POST_PROCESS_ID, gpuDrivenDrawKey, materialBindGroupLayoutIdentity } from './chunk-2OZAS3WU.mjs';
5
5
  import { derive, ok, err as err$1, toShared, ASSET_ERROR_HINTS, deriveTextureLayout, handleSlot, resolveMaterialTextureCoordinates, KNOWN_PASS_KINDS } from '@forgeax/engine-types';
6
6
  import { RenderGraphError } from '@forgeax/engine-render-graph';
7
7
  import { ok as ok$1, err, RhiError } from '@forgeax/engine-rhi';
8
- import { mat3, vec3, mat4 } from '@forgeax/engine-math';
8
+ import { mat3, vec3, mat4, box3, frustum } from '@forgeax/engine-math';
9
9
  import { deriveVertexLayoutProjection, DEFAULT_VERTEX_ATTRIBUTE_MAP, deriveVertexBufferLayout, deriveVertexBufferLayoutFromProjection } from '@forgeax/engine-geometry';
10
10
  import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
11
11
  import { probeVideoHighPerfUpload, VIDEO_SOURCE_PROVIDER_KEY, videoSourceExtent } from '@forgeax/engine-graphics-extras';
@@ -9892,7 +9892,7 @@ var GpuDrivenView = class _GpuDrivenView {
9892
9892
  mapped.value.unmap();
9893
9893
  }
9894
9894
  }
9895
- addPasses(builder, labelPrefix = "gpu-driven", includeCompute = true, surfaceSubmissionObservation) {
9895
+ addPasses(builder, labelPrefix = "gpu-driven", includeCompute = true, surfaceSubmissionObservation, executeIf) {
9896
9896
  const buffers = this.buffers;
9897
9897
  const bindGroup = this.bindGroup;
9898
9898
  const plan = this.plan;
@@ -10006,6 +10006,7 @@ var GpuDrivenView = class _GpuDrivenView {
10006
10006
  { resource: view.value, usage: "uniform-read" },
10007
10007
  { resource: counters.value, usage: "storage-read-write" }
10008
10008
  ],
10009
+ ...executeIf === void 0 ? {} : { executeIf },
10009
10010
  encode: ({ pass }) => {
10010
10011
  pass.setPipeline(this.resetPipeline);
10011
10012
  pass.setBindGroup(0, bindGroup);
@@ -10023,6 +10024,7 @@ var GpuDrivenView = class _GpuDrivenView {
10023
10024
  { resource: counters.value, usage: "storage-read-write" },
10024
10025
  { resource: visible.value, usage: "storage-read-write" }
10025
10026
  ],
10027
+ ...executeIf === void 0 ? {} : { executeIf },
10026
10028
  encode: ({ pass }) => {
10027
10029
  pass.setPipeline(this.cullPipeline);
10028
10030
  pass.setBindGroup(0, bindGroup);
@@ -10037,6 +10039,7 @@ var GpuDrivenView = class _GpuDrivenView {
10037
10039
  { resource: counters.value, usage: "storage-read" },
10038
10040
  { resource: indirect.value, usage: "storage-read-write" }
10039
10041
  ],
10042
+ ...executeIf === void 0 ? {} : { executeIf },
10040
10043
  encode: ({ pass }) => {
10041
10044
  pass.setPipeline(this.finalizePipeline);
10042
10045
  pass.setBindGroup(0, bindGroup);
@@ -10054,6 +10057,7 @@ var GpuDrivenView = class _GpuDrivenView {
10054
10057
  { resource: indirect.value, usage: "copy-src" },
10055
10058
  { resource: lodReadback.value, usage: "copy-dst" }
10056
10059
  ],
10060
+ ...executeIf === void 0 ? {} : { executeIf },
10057
10061
  encode: ({ encoder, resources }) => {
10058
10062
  const mapState = buffers.lodReadback.mapState;
10059
10063
  if (mapState !== void 0 && mapState !== "unmapped") return;
@@ -10484,14 +10488,29 @@ var ShadowViewStatePool = class _ShadowViewStatePool {
10484
10488
  view: record.view
10485
10489
  });
10486
10490
  }
10487
- project(builder, identity) {
10491
+ project(builder, identity, forceCompute = false) {
10488
10492
  const record = this.records.get(identityKey(identity));
10489
10493
  if (record === void 0) return err(graphStateError(identity));
10490
10494
  const cacheHit = record.cache === "hit" && !record.invalidated;
10495
+ const includeCompute = forceCompute || !cacheHit;
10496
+ let forceComputePending = forceCompute;
10497
+ let lastFrame;
10498
+ let executeForFrame = false;
10499
+ const executeCompute = (frame) => {
10500
+ if (frame !== lastFrame) {
10501
+ lastFrame = frame;
10502
+ const currentRecord = this.records.get(identityKey(record.identity));
10503
+ executeForFrame = forceComputePending || currentRecord === void 0 || currentRecord.cache !== "hit" || currentRecord.invalidated;
10504
+ forceComputePending = false;
10505
+ }
10506
+ return executeForFrame;
10507
+ };
10491
10508
  const projected = record.view.addPasses(
10492
10509
  builder,
10493
10510
  shadowViewLabelPrefix(record.identity),
10494
- !cacheHit
10511
+ includeCompute,
10512
+ void 0,
10513
+ includeCompute ? executeCompute : void 0
10495
10514
  );
10496
10515
  if (!projected.ok) return projected;
10497
10516
  return ok$1({
@@ -10500,7 +10519,7 @@ var ShadowViewStatePool = class _ShadowViewStatePool {
10500
10519
  generation: record.generation,
10501
10520
  plan: record.plan,
10502
10521
  view: record.view,
10503
- passNames: cacheHit ? Object.freeze([]) : passNames(record.identity),
10522
+ passNames: includeCompute ? passNames(record.identity) : Object.freeze([]),
10504
10523
  graphResources: projected.value
10505
10524
  });
10506
10525
  }
@@ -11053,20 +11072,53 @@ function shadowCasterKeys(c) {
11053
11072
  }
11054
11073
  return c.gpuDrivenShadowDrawKeys ?? /* @__PURE__ */ new Set();
11055
11074
  }
11075
+ function shadowViewContains(source, planes) {
11076
+ if (planes === void 0 || planes.length === 0 || source.localAabb === void 0) return true;
11077
+ if (source.skin !== void 0) return true;
11078
+ if (source.spriteInstances !== void 0) return true;
11079
+ let worldBounds;
11080
+ if (source.instances !== void 0) {
11081
+ if (source.instances.instanceCount === 0) return false;
11082
+ const derived = deriveInstancesUnionBounds({
11083
+ meshAabb: source.localAabb,
11084
+ entityWorld: source.transform.world,
11085
+ transforms: source.instances.transforms
11086
+ });
11087
+ if (derived === void 0) return true;
11088
+ worldBounds = derived;
11089
+ } else {
11090
+ worldBounds = box3.transformBox3(box3.create(), source.localAabb, source.transform.world);
11091
+ }
11092
+ return frustum.intersectsBox(planes, worldBounds);
11093
+ }
11056
11094
  function validateShadowOwnership(c, identity, claimedKeys, recordedKeys) {
11057
11095
  if (c.shadowCasterMembership === void 0 && (c.gpuDrivenShadowDrawKeys === void 0 || c.gpuDrivenShadowDrawKeys.size === 0))
11058
11096
  return;
11059
- const expectedKeys = shadowCasterKeys(c);
11097
+ const viewPlanes = c.shadowViewPlanesByView?.get(shadowViewIdentityKey(identity));
11098
+ const visibleRenderableIndices = viewPlanes === void 0 ? void 0 : new Set(
11099
+ (c.shadowValidatedOrdered ?? c.validatedOrdered).filter((entry) => shadowViewContains(entry.source, viewPlanes)).map((entry) => entry.renderableIndex)
11100
+ );
11101
+ const allExpectedKeys = shadowCasterKeys(c);
11102
+ const visibleExpectedKeys = visibleRenderableIndices === void 0 || c.shadowCasterMembership === void 0 ? allExpectedKeys : new Set(
11103
+ c.shadowCasterMembership.filter((membership) => visibleRenderableIndices.has(membership.renderableIndex)).map(
11104
+ (membership) => gpuDrivenShadowDrawKey(
11105
+ membership.worldEntity,
11106
+ membership.materialHandle,
11107
+ membership.drawItemIndex,
11108
+ membership.passIndex
11109
+ )
11110
+ )
11111
+ );
11060
11112
  const claimed = claimedKeys ?? /* @__PURE__ */ new Set();
11061
11113
  const overlap = [...claimed].filter((key) => recordedKeys.has(key));
11062
11114
  const union = /* @__PURE__ */ new Set([...claimed, ...recordedKeys]);
11063
- const missing = [...expectedKeys].filter((key) => !union.has(key));
11064
- const unexpectedClaims = [...claimed].filter((key) => !expectedKeys.has(key));
11115
+ const missing = [...visibleExpectedKeys].filter((key) => !union.has(key));
11116
+ const unexpectedClaims = [...claimed].filter((key) => !allExpectedKeys.has(key));
11065
11117
  if (overlap.length === 0 && missing.length === 0 && unexpectedClaims.length === 0) return;
11066
11118
  throw new RhiError({
11067
11119
  code: "internal-error",
11068
11120
  expected: `disjoint ShadowCaster ownership for ${shadowViewIdentityKey(identity)}`,
11069
- hint: `claimed=${[...claimed].sort().join(",")} recorded=${[...recordedKeys].sort().join(",")} missing=${missing.sort().join(",")} unexpectedClaims=${unexpectedClaims.sort().join(",")}`
11121
+ hint: `expected=${[...allExpectedKeys].sort().join(",")} visibleExpected=${[...visibleExpectedKeys].sort().join(",")} claimed=${[...claimed].sort().join(",")} recorded=${[...recordedKeys].sort().join(",")} missing=${missing.sort().join(",")} unexpectedClaims=${unexpectedClaims.sort().join(",")}`
11070
11122
  });
11071
11123
  }
11072
11124
  function hasUnclaimedShadowCasters(c, claimedKeys) {
@@ -11200,9 +11252,9 @@ function recordGpuDrivenShadowIfPublished(c, pass, identity) {
11200
11252
  claimedKeys: viewClaims === void 0 ? c.gpuDrivenShadowDrawKeys ?? /* @__PURE__ */ new Set() : viewClaims.get(viewKey) ?? /* @__PURE__ */ new Set()
11201
11253
  };
11202
11254
  }
11203
- function encodeDirectionalShadowPass(c, pass, cascadeIndex, viewport, drawFeatures) {
11255
+ function encodeDirectionalShadowPass(c, pass, cascadeIndex, viewport, drawFeatures, forceRaster = false) {
11204
11256
  const directionalIdentity = { kind: "directional", index: cascadeIndex };
11205
- if ((c.gpuDrivenShadowViews?.cacheHit(directionalIdentity) === true || c.gpuDrivenShadowViews === void 0 && c.directionalShadowCacheReuse) && drawFeatures === void 0)
11257
+ if (!forceRaster && (c.gpuDrivenShadowViews?.cacheHit(directionalIdentity) === true || c.gpuDrivenShadowViews === void 0 && c.directionalShadowCacheReuse) && drawFeatures === void 0)
11206
11258
  return;
11207
11259
  const pipeline = shadowPipeline(c);
11208
11260
  const viewBg = ensureTypedShadowViewBg(
@@ -11294,7 +11346,9 @@ function encodeDirectionalShadowPass(c, pass, cascadeIndex, viewport, drawFeatur
11294
11346
  LightMode: ["ShadowCaster"]
11295
11347
  }),
11296
11348
  shadowShaderMap(c),
11297
- claimedKeys
11349
+ claimedKeys,
11350
+ false,
11351
+ c.shadowViewPlanesByView?.get(shadowViewIdentityKey(directionalIdentity))
11298
11352
  );
11299
11353
  validateShadowOwnership(c, directionalIdentity, claimedKeys, recordedKeys);
11300
11354
  c.frameState.directionalShadowCacheRecorded = cascadeIndex === 0 ? true : c.frameState.directionalShadowCacheRecorded;
@@ -11392,7 +11446,8 @@ function encodePointShadowPass(c, pass, snapshotIndex, face, drawFeatures) {
11392
11446
  }),
11393
11447
  shadowShaderMap(c),
11394
11448
  claimedKeys,
11395
- true
11449
+ true,
11450
+ c.shadowViewPlanesByView?.get(shadowViewIdentityKey(pointIdentity))
11396
11451
  );
11397
11452
  validateShadowOwnership(c, pointIdentity, claimedKeys, recordedKeys);
11398
11453
  }
@@ -11502,7 +11557,9 @@ function encodeSpotShadowPass(c, pass, snapshotIndex, drawFeatures) {
11502
11557
  LightMode: ["ShadowCaster"]
11503
11558
  }),
11504
11559
  shadowShaderMap(c),
11505
- claimedKeys
11560
+ claimedKeys,
11561
+ false,
11562
+ c.shadowViewPlanesByView?.get(shadowViewIdentityKey(spotIdentity))
11506
11563
  );
11507
11564
  validateShadowOwnership(c, spotIdentity, claimedKeys, recordedKeys);
11508
11565
  }
@@ -11546,7 +11603,7 @@ function buildMatchedMaterialHandlesByRenderable(dispatch, selector, excludeSele
11546
11603
  }
11547
11604
  return handlesByRenderable;
11548
11605
  }
11549
- function recordShadowCasterDraws(c, shadowPass, shadowPipeline2, shadowMeshBindGroup, matchedIndices, matchedMaterialHandles, shadowDispatchByRenderableIdx, gpuDrivenShadowDrawKeys, reflected = false) {
11606
+ function recordShadowCasterDraws(c, shadowPass, shadowPipeline2, shadowMeshBindGroup, matchedIndices, matchedMaterialHandles, shadowDispatchByRenderableIdx, gpuDrivenShadowDrawKeys, reflected = false, viewPlanes) {
11550
11607
  const {
11551
11608
  runtime,
11552
11609
  pipelineState,
@@ -11563,6 +11620,7 @@ function recordShadowCasterDraws(c, shadowPass, shadowPipeline2, shadowMeshBindG
11563
11620
  for (let i = 0; i < validatedOrdered.length; i++) {
11564
11621
  const entry = validatedOrdered[i];
11565
11622
  if (entry === void 0) continue;
11623
+ if (!shadowViewContains(entry.source, viewPlanes)) continue;
11566
11624
  if (matchedIndices !== null && !matchedIndices.has(entry.renderableIndex)) continue;
11567
11625
  const drawIndices = shadowDrawIndicesBySubmesh(entry.source, entry.mesh);
11568
11626
  const shadowSubmeshes = entry.mesh.submeshes.flatMap((submesh, submeshIndex) => {
@@ -14814,5 +14872,5 @@ function addTaaResolvePass(graph, current, currentTemporal, previousColor, previ
14814
14872
  }
14815
14873
 
14816
14874
  export { BLOOM_COMPOSITE_PARAMS_BYTES, BLOOM_DOWNSAMPLE_PARAMS_BYTES, BLOOM_UPSAMPLE_PARAMS_BYTES, BYTES_PER_DIRECT_LIGHT_SLOT, BatchTopology, CAPTURE_VIEW_PROJS, CLOUD_HISTORY_FORMATS, CUBEMAP_FACE_VERTICES, CUBE_CAPTURE_VIEW_SLOT_BASE, DEFERRED_COLOR_FORMATS, DEPTH_MIN_PARAMS_BYTE_SIZE, DEPTH_TEXTURE_FORMAT, FALLBACK_BYTES_PER_ROW, GPU_DRIVEN_VIEW_WGSL, GPU_SCENE_LAYOUTS, GpuBuffer, GpuDrivenView, GpuResourceAllocationLedger, GpuTexture, HDR_COLOR_ATTACHMENT_FORMAT, MESH_PER_ENTITY_STRIDE, MESH_SSBO_BYTES, MIPMAP_PREWARM_FORMATS, OcclusionConfidenceScheduler, POINTS_LINES_MATERIAL_SHADER_ID, POINTS_LINES_VIEW_BUFFER_SIZE, PREFILTER_MIP_LEVELS, PREFILTER_SIZE, PipelineSpecError, PostProcessError, REFLECTION_PROBE_VIEW_SLOT_BASE, SHADOW_CASTER_BUFFER_SIZE, STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES, ShadowViewStatePool, SurfaceSubmissionObservationOwner, TEMPORAL_HISTORY_FORMATS, TYPED_BLOOM_PASS_NAMES, VIEW_UBO_BYTES, VIEW_UNIFORM_BYTES, VIEW_UNIFORM_SLOT_STRIDE, abortTemporalGpuSubmit, addReflectionFallbackObservationPass, addStandardSceneDataPass, addTaaResolvePass, addTypedBloomPasses, addTypedCompositePostEffects, addTypedFrameObservationPass, addTypedFullscreenPass, addTypedOutputTransformPass, addTypedScenePass, addTypedSkyboxPass, addTypedSsaoPasses, addTypedTemporalResolvePass, aggregateTemporalDemand, applyMaterialTextureUvScales, applyParamSchemaDefaultsToUbo, applyParamSnapshotToUbo, assembleMaterialWithSkylightEntries, assertStorageBufferCap, buildFoldDispatchPlan, buildFullscreenPostProcessPass, buildLinearLdrMaterialSpecTable, buildPerFrameBindGroups, buildSpecConstTable, cacheKeyOf, cleanPerEntityCache, colorFormatsForPassKind, combineGpuResourceAllocationInspections, commitTemporalGpuSubmit, computeProjectionMatrix, computeSplitLdrSprite, computeViewMatrix, createClusterBinScratch, createFullscreenBindGroup, createHdrpClusterMembershipBindGroupLayoutDescriptor, createIblPipelines, createPointsLinesLaneAdapter, createPointsLinesLaneContract, createRenderPipelineTarget, createSkylightFallback, createStandardSceneDataTarget, createStandardSurfaceLightingBindGroup, decideVisibility, defaultViewForUserRegionField, deriveRenderDataCubemap, deriveRenderDataMesh, deriveRenderDataTexture, deriveRenderExtent, describeTemporalDemand, detectNineSliceScaleTooSmall, deviceOptionsForAdapter, driveLazyEquirectProjection, encodeDirectionalShadowPass, encodeMainPass, encodePointShadowPass, encodeSpotShadowPass, ensureMeshSsboCapacity, ensureProbeBlendRecordBuffer, entryHasDepthRead, evaluateFoldBucketUniformCap, foldDispatchBuckets, geometryRenderStateForPass, geometryRenderStateForTopology, getIblProbeBackgroundSource, getOrBuildPipeline, getOrCreateFromChain, getOrCreateHdrpBuffers, getOrCreateIblCache, getTemporalBindGroupResources, getTemporalGpuState, getTemporalParamsBuffer, gpuSceneFieldOffset, hasPendingTemporalGpuSubmit, importRenderPipelineSurface, incrementFoldedDrawsMetric, inspectResourceClassSplits, isTemporalFullscreenBinding, packInstanceStorageBuffer, passKindPolicyTable, postProcessShaderEntrySignature, postProcessShaderModuleLabel, postProcessShaderPipelineLabel, prepareFrameLighting, prepareMaterialSkylight, prewarmMaterialShaderVariants, projectedHeightForCandidate, renderExtentSize, renderPipelineCloudHistoryTargets, resetHdrpBuffers, resetSsaoResources, residentTextureView, resolveGeometryInstanceBuffer, resolveMaterialSkylight, resolveOutputDither, resolveReflectionProbeBinding, resolveSkyboxActive, resolveSsaoParameters, retireTemporalGpuState, retireTemporalGpuStateAfterFence, runIblPrecompute, selectGpuDrivenSceneIndexVariant, selectGpuLodLane, selectHdrpPbrPrewarmVariants, selectLazyEquirectHandle, selectLod, selectProbePrewarmVariants, selectSkinPrewarmVariants, selectStandardPbrTransmissionPrewarmVariants, setIblComposedShaders, shadowViewIdentityKey, shadowViewRasterAccesses, shouldIssueRetest, stageTemporalGpuSubmit, standardBloomAdmitted, standardStorageVariantSet, standardTemporalLaneAdmission, standardTemporalPostOrder, standardTopologyVariantSet, temporalReadIndex, temporalWriteIndex, transmissionBackdropAvailable, uploadMeshSsboBatch, variantSetFromDefines, variantSetFromVertexLayoutProjection, warnMultiSkybox, warnMultiSkylight, warnZeroLightStandard, writeHdrpClusterAndSsaoBuffers, writePbrMaterialUboPayload, writePointsLinesViewUbo, writeShadowCasterUniforms, writeShadowParamsBuffer, writeSpotModifierTextures, writeViewUbo };
14817
- //# sourceMappingURL=chunk-LNIUIKQ7.mjs.map
14818
- //# sourceMappingURL=chunk-LNIUIKQ7.mjs.map
14875
+ //# sourceMappingURL=chunk-CJOV2XLO.mjs.map
14876
+ //# sourceMappingURL=chunk-CJOV2XLO.mjs.map