@zephyr3d/scene 0.9.15 → 0.9.16

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 (123) hide show
  1. package/dist/app/engine.js +3 -1
  2. package/dist/app/engine.js.map +1 -1
  3. package/dist/asset/assetmanager.js +1 -0
  4. package/dist/asset/assetmanager.js.map +1 -1
  5. package/dist/camera/camera.js +87 -0
  6. package/dist/camera/camera.js.map +1 -1
  7. package/dist/index.d.ts +152 -4
  8. package/dist/index.js +3 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/material/meshmaterial.js +8 -1
  11. package/dist/material/meshmaterial.js.map +1 -1
  12. package/dist/material/shader/helper.js +6 -0
  13. package/dist/material/shader/helper.js.map +1 -1
  14. package/dist/material/skin.js +263 -0
  15. package/dist/material/skin.js.map +1 -0
  16. package/dist/posteffect/compositor.js +3 -0
  17. package/dist/posteffect/compositor.js.map +1 -1
  18. package/dist/posteffect/skinsss.js +194 -0
  19. package/dist/posteffect/skinsss.js.map +1 -0
  20. package/dist/posteffect/ssr.js +26 -49
  21. package/dist/posteffect/ssr.js.map +1 -1
  22. package/dist/posteffect/sss.js +1 -0
  23. package/dist/posteffect/sss.js.map +1 -1
  24. package/dist/posteffect/taa.js +2 -40
  25. package/dist/posteffect/taa.js.map +1 -1
  26. package/dist/render/abuffer_oit.js +1 -0
  27. package/dist/render/abuffer_oit.js.map +1 -1
  28. package/dist/render/drawable_mixin.js +1 -0
  29. package/dist/render/drawable_mixin.js.map +1 -1
  30. package/dist/render/fbm_wavegenerator.js +1 -0
  31. package/dist/render/fbm_wavegenerator.js.map +1 -1
  32. package/dist/render/gerstner_wavegenerator.js +1 -0
  33. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  34. package/dist/render/globalbindgroup_allocator.js +1 -0
  35. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  36. package/dist/render/lightpass.js +4 -1
  37. package/dist/render/lightpass.js.map +1 -1
  38. package/dist/render/render_queue.js +1 -0
  39. package/dist/render/render_queue.js.map +1 -1
  40. package/dist/render/renderer.js +1 -0
  41. package/dist/render/renderer.js.map +1 -1
  42. package/dist/render/rendergraph/device_pool_allocator.js +41 -41
  43. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  44. package/dist/render/rendergraph/forward_plus_builder.js +78 -8
  45. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  46. package/dist/scene/basesprite.js +1 -0
  47. package/dist/scene/basesprite.js.map +1 -1
  48. package/dist/scene/batchgroup.js +1 -0
  49. package/dist/scene/batchgroup.js.map +1 -1
  50. package/dist/scene/environment.js +1 -0
  51. package/dist/scene/environment.js.map +1 -1
  52. package/dist/scene/light.js +6 -4
  53. package/dist/scene/light.js.map +1 -1
  54. package/dist/scene/mesh.js +1 -0
  55. package/dist/scene/mesh.js.map +1 -1
  56. package/dist/scene/msdftext.js +1 -0
  57. package/dist/scene/msdftext.js.map +1 -1
  58. package/dist/scene/msdftextsprite.js +1 -0
  59. package/dist/scene/msdftextsprite.js.map +1 -1
  60. package/dist/scene/particlesys.js +1 -0
  61. package/dist/scene/particlesys.js.map +1 -1
  62. package/dist/scene/scene.js +1 -0
  63. package/dist/scene/scene.js.map +1 -1
  64. package/dist/scene/terrain-cm/grass.js +1 -0
  65. package/dist/scene/terrain-cm/grass.js.map +1 -1
  66. package/dist/scene/terrain-cm/grassmaterial.js +1 -0
  67. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  68. package/dist/scene/terrain-cm/terrain-cm.js +1 -0
  69. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  70. package/dist/scene/water.js +1 -0
  71. package/dist/scene/water.js.map +1 -1
  72. package/dist/shaders/shadow.js +504 -1
  73. package/dist/shaders/shadow.js.map +1 -1
  74. package/dist/shadow/esm.js +1 -0
  75. package/dist/shadow/esm.js.map +1 -1
  76. package/dist/shadow/pcf_opt.js +1 -0
  77. package/dist/shadow/pcf_opt.js.map +1 -1
  78. package/dist/shadow/pcf_pd.js +1 -0
  79. package/dist/shadow/pcf_pd.js.map +1 -1
  80. package/dist/shadow/pcss.js +181 -0
  81. package/dist/shadow/pcss.js.map +1 -0
  82. package/dist/shadow/shader.js +1 -0
  83. package/dist/shadow/shader.js.map +1 -1
  84. package/dist/shadow/shadow_impl.js.map +1 -1
  85. package/dist/shadow/shadowmapper.js +86 -8
  86. package/dist/shadow/shadowmapper.js.map +1 -1
  87. package/dist/shadow/ssm.js +1 -0
  88. package/dist/shadow/ssm.js.map +1 -1
  89. package/dist/shadow/vsm.js +1 -0
  90. package/dist/shadow/vsm.js.map +1 -1
  91. package/dist/utility/serialization/manager.js +3 -1
  92. package/dist/utility/serialization/manager.js.map +1 -1
  93. package/dist/utility/serialization/scene/animation.js +1 -0
  94. package/dist/utility/serialization/scene/animation.js.map +1 -1
  95. package/dist/utility/serialization/scene/batch.js +1 -0
  96. package/dist/utility/serialization/scene/batch.js.map +1 -1
  97. package/dist/utility/serialization/scene/camera.js +122 -0
  98. package/dist/utility/serialization/scene/camera.js.map +1 -1
  99. package/dist/utility/serialization/scene/common.js +1 -0
  100. package/dist/utility/serialization/scene/common.js.map +1 -1
  101. package/dist/utility/serialization/scene/light.js +82 -21
  102. package/dist/utility/serialization/scene/light.js.map +1 -1
  103. package/dist/utility/serialization/scene/material.js +195 -3
  104. package/dist/utility/serialization/scene/material.js.map +1 -1
  105. package/dist/utility/serialization/scene/mesh.js +1 -0
  106. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  107. package/dist/utility/serialization/scene/node.js +1 -0
  108. package/dist/utility/serialization/scene/node.js.map +1 -1
  109. package/dist/utility/serialization/scene/particle.js +1 -0
  110. package/dist/utility/serialization/scene/particle.js.map +1 -1
  111. package/dist/utility/serialization/scene/primitive.js +1 -0
  112. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  113. package/dist/utility/serialization/scene/sprite.js +1 -0
  114. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  115. package/dist/utility/serialization/scene/terrain.js +1 -0
  116. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  117. package/dist/utility/serialization/scene/text.js +1 -0
  118. package/dist/utility/serialization/scene/text.js.map +1 -1
  119. package/dist/utility/serialization/scene/water.js +1 -0
  120. package/dist/utility/serialization/scene/water.js.map +1 -1
  121. package/dist/values.js +1 -0
  122. package/dist/values.js.map +1 -1
  123. package/package.json +2 -2
@@ -33,7 +33,7 @@ const _clusters = [];
33
33
  const _devicePoolAllocator = new DevicePoolAllocator();
34
34
  let _backDepthColorState = null;
35
35
  let _frontDepthColorState = null;
36
- const SURFACE_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION;
36
+ const SURFACE_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION | MaterialVaryingFlags.SKIN_SSS_STORE;
37
37
  function getClusteredLight() {
38
38
  return _clusters.length > 0 ? _clusters.pop() : new ClusteredLight();
39
39
  }
@@ -46,6 +46,9 @@ function getCoreMaterial(material) {
46
46
  function hasSSSMaterialCore(material) {
47
47
  return !!getCoreMaterial(material)?.subsurfaceProfile;
48
48
  }
49
+ function hasSkinSSSMaterialCore(material) {
50
+ return !!getCoreMaterial(material)?.skinSSS;
51
+ }
49
52
  function renderQueueHasActiveSSS(renderQueue) {
50
53
  const itemList = renderQueue.itemList;
51
54
  if (!itemList) {
@@ -64,6 +67,24 @@ function renderQueueHasActiveSSS(renderQueue) {
64
67
  }
65
68
  return false;
66
69
  }
70
+ function renderQueueHasActiveSkinSSS(renderQueue) {
71
+ const itemList = renderQueue.itemList;
72
+ if (!itemList) {
73
+ return false;
74
+ }
75
+ const lists = [
76
+ ...itemList.opaque.lit,
77
+ ...itemList.opaque.unlit
78
+ ];
79
+ for (const list of lists){
80
+ for (const material of list.materialList){
81
+ if (hasSkinSSSMaterialCore(material)) {
82
+ return true;
83
+ }
84
+ }
85
+ }
86
+ return false;
87
+ }
67
88
  function filterActualSSSItemList(items) {
68
89
  return items.filter((item)=>hasSSSMaterialCore(item.drawable.getMaterial?.()));
69
90
  }
@@ -185,6 +206,9 @@ function getLightPassColorAttachments(ctx, colorAttachment) {
185
206
  if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {
186
207
  attachments.push(ctx.SSSTransmissionTexture);
187
208
  }
209
+ if (ctx.materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {
210
+ attachments.push(ctx.SkinSSSTexture);
211
+ }
188
212
  return attachments.length === 1 ? attachments[0] : attachments;
189
213
  }
190
214
  /**
@@ -193,6 +217,7 @@ function getLightPassColorAttachments(ctx, colorAttachment) {
193
217
  */ function deriveForwardPlusOptions(scene, camera, deviceType, renderQueue) {
194
218
  const ssr = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();
195
219
  const sss = camera.SSS && renderQueueHasActiveSSS(renderQueue);
220
+ const skinSSS = camera.skinSSS && renderQueueHasActiveSkinSSS(renderQueue);
196
221
  const needSceneColor = renderQueue.needSceneColor();
197
222
  const needSceneColorWithDepth = renderQueue.needSceneColorWithDepth();
198
223
  return {
@@ -205,7 +230,8 @@ function getLightPassColorAttachments(ctx, colorAttachment) {
205
230
  needSceneColor,
206
231
  needSceneColorWithDepth,
207
232
  needsTransmissionDepthForSSR: !!ssr && needSceneColor && !needSceneColorWithDepth,
208
- sss: !!sss
233
+ sss: !!sss,
234
+ skinSSS: !!skinSSS
209
235
  };
210
236
  }
211
237
  // ─── Forward+ Graph Builder ─────────────────────────────────────────
@@ -229,6 +255,7 @@ function getLightPassColorAttachments(ctx, colorAttachment) {
229
255
  function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
230
256
  const backbuffer = graph.importTexture('backbuffer');
231
257
  ctx.SSS = !!options.sss;
258
+ ctx.SkinSSSTexture = null;
232
259
  // Shared mutable frame state
233
260
  const frame = {
234
261
  ctx,
@@ -348,6 +375,7 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
348
375
  const depthHandle = depthPassResult.depthHandle;
349
376
  const motionVectorHandle = depthPassResult.motionVectorHandle;
350
377
  const renderDepthAttachment = depthPassResult.graphDepthAttachmentHandle ?? depthPassResult.externalDepthAttachment ?? null;
378
+ const useFinalFramebufferAsIntermediate = !!depthPassResult.externalDepthAttachment && depthPassResult.externalDepthAttachment === ctx.finalFramebuffer?.getDepthAttachment();
351
379
  let preLightTransmissionDepthToken;
352
380
  if (options.needsTransmissionDepthForSSR) {
353
381
  preLightTransmissionDepthToken = graph.addPass('TransmissionDepthForSSR', (builder)=>{
@@ -534,7 +562,8 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
534
562
  if (writeSSSDiffuse && writeSSSTransmission && includeSSRSurfaceMRT && getSSSLightingTextureFormat(ctx, 2, includeSSRSurfaceMRT) !== ctx.colorFormat) {
535
563
  writeSSSTransmission = false;
536
564
  }
537
- const sssLightingAttachmentCount = (writeSSSDiffuse ? 1 : 0) + (writeSSSTransmission ? 1 : 0);
565
+ const writeSkinSSS = options.skinSSS;
566
+ const sssLightingAttachmentCount = (writeSSSDiffuse ? 1 : 0) + (writeSSSTransmission ? 1 : 0) + (writeSkinSSS ? 1 : 0);
538
567
  const sssLightingFormat = getSSSLightingTextureFormat(ctx, sssLightingAttachmentCount, includeSSRSurfaceMRT);
539
568
  const sssDiffuseHandle = writeSSSDiffuse ? builder.createTexture({
540
569
  format: sssLightingFormat,
@@ -544,7 +573,10 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
544
573
  format: sssLightingFormat,
545
574
  label: 'sssTransmission'
546
575
  }) : undefined;
547
- const useFinalFramebufferAsIntermediate = !!depthPassResult.externalDepthAttachment && depthPassResult.externalDepthAttachment === ctx.finalFramebuffer?.getDepthAttachment();
576
+ const skinSSSHandle = writeSkinSSS ? builder.createTexture({
577
+ format: sssLightingFormat,
578
+ label: 'skinSSS'
579
+ }) : undefined;
548
580
  const sceneColorFramebufferHandle = useFinalFramebufferAsIntermediate ? undefined : builder.createFramebuffer({
549
581
  label: 'SceneColorFramebuffer',
550
582
  width: ctx.renderWidth,
@@ -575,6 +607,7 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
575
607
  }
576
608
  ctx.SSSDiffuseTexture = sssDiffuseHandle ? rgCtx.getTexture(sssDiffuseHandle) : null;
577
609
  ctx.SSSTransmissionTexture = sssTransmissionHandle ? rgCtx.getTexture(sssTransmissionHandle) : null;
610
+ ctx.SkinSSSTexture = skinSSSHandle ? rgCtx.getTexture(skinSSSHandle) : null;
578
611
  const renderLightPass = ()=>renderMainLightPass(frame, sceneColorTex, sceneColorCopyTex, rgCtx, sceneColorFramebufferHandle, sceneColorCopyFramebufferHandle);
579
612
  if (historyManager && lightHistoryReadBindings.length > 0) {
580
613
  historyManager.beginReadScope(lightHistoryReadBindings.map((binding)=>({
@@ -631,19 +664,24 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
631
664
  builder.read(binding.handle);
632
665
  }
633
666
  const outputBackbuffer = builder.write(backbuffer);
667
+ const taaHistoryColorHandle = useFinalFramebufferAsIntermediate ? outputBackbuffer : sceneColorHandle;
634
668
  builder.setExecute((rgCtx)=>{
669
+ const renderAndCommitComposite = ()=>{
670
+ renderComposite(frame);
671
+ queueTAAHistoryCommit(frame, rgCtx, historyManager, taaHistoryColorHandle, motionVectorHandle);
672
+ };
635
673
  if (historyManager && compositeHistoryReadBindings.length > 0) {
636
674
  historyManager.beginReadScope(compositeHistoryReadBindings.map((binding)=>({
637
675
  name: binding.name,
638
676
  texture: rgCtx.getTexture(binding.handle)
639
677
  })));
640
678
  try {
641
- renderComposite(frame);
679
+ renderAndCommitComposite();
642
680
  } finally{
643
681
  historyManager.endReadScope();
644
682
  }
645
683
  } else {
646
- renderComposite(frame);
684
+ renderAndCommitComposite();
647
685
  }
648
686
  });
649
687
  return outputBackbuffer;
@@ -702,7 +740,7 @@ function renderForwardSSSProfile(frame, profileFramebuffer, profileTexture, para
702
740
  ctx.SSRNormalTexture = normalTexture;
703
741
  ctx.compositor = null;
704
742
  ctx.camera.commandBufferReuse = false;
705
- ctx.materialFlags = ctx.materialFlags & ~(MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_TRANSMISSION) | profileFlags;
743
+ ctx.materialFlags = ctx.materialFlags & ~(MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_TRANSMISSION | MaterialVaryingFlags.SKIN_SSS_STORE) | profileFlags;
706
744
  _scenePass.transmission = false;
707
745
  _scenePass.renderOpaque = true;
708
746
  _scenePass.renderTransparent = false;
@@ -932,7 +970,7 @@ function blitToCurrentColorAttachment(ctx, source) {
932
970
  const device = ctx.device;
933
971
  // Use RenderGraph-allocated scene color texture
934
972
  const depthTex = frame.depthFramebuffer?.getDepthAttachment();
935
- ctx.materialFlags &= ~(MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION);
973
+ ctx.materialFlags &= ~(MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION | MaterialVaryingFlags.SKIN_SSS_STORE);
936
974
  if (ctx.SSR) {
937
975
  ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;
938
976
  }
@@ -944,6 +982,9 @@ function blitToCurrentColorAttachment(ctx, source) {
944
982
  ctx.materialFlags |= MaterialVaryingFlags.SSS_STORE_TRANSMISSION;
945
983
  }
946
984
  }
985
+ if (ctx.SkinSSSTexture) {
986
+ ctx.materialFlags |= MaterialVaryingFlags.SKIN_SSS_STORE;
987
+ }
947
988
  if (depthTex === ctx.finalFramebuffer?.getDepthAttachment()) {
948
989
  ctx.intermediateFramebuffer = ctx.finalFramebuffer;
949
990
  } else if (sceneColorFramebufferHandle && !hasSurfaceMRT(ctx)) {
@@ -1022,6 +1063,34 @@ function blitToCurrentColorAttachment(ctx, source) {
1022
1063
  /** @internal */ function renderTransmissionDepthPass(frame, rgCtx) {
1023
1064
  renderSceneDepth(frame, frame.depthFramebuffer, rgCtx);
1024
1065
  }
1066
+ function queueTAAHistoryCommit(frame, rgCtx, historyManager, colorHandle, motionVectorHandle) {
1067
+ const { ctx } = frame;
1068
+ if (!historyManager?.frameActive || !ctx.camera.TAA || !frame.options.motionVectors || !motionVectorHandle) {
1069
+ return;
1070
+ }
1071
+ const colorTexture = rgCtx.getTexture(colorHandle);
1072
+ const colorSize = {
1073
+ width: colorTexture.width,
1074
+ height: colorTexture.height
1075
+ };
1076
+ historyManager.queueRetainedCommit(RGHistoryResources.TAA_COLOR, {
1077
+ format: colorTexture.format,
1078
+ sizeMode: 'absolute',
1079
+ width: colorTexture.width,
1080
+ height: colorTexture.height
1081
+ }, colorSize, colorTexture);
1082
+ const motionVectorTexture = rgCtx.getTexture(motionVectorHandle);
1083
+ const motionVectorSize = {
1084
+ width: motionVectorTexture.width,
1085
+ height: motionVectorTexture.height
1086
+ };
1087
+ historyManager.queueRetainedCommit(RGHistoryResources.TAA_MOTION_VECTOR, {
1088
+ format: motionVectorTexture.format,
1089
+ sizeMode: 'absolute',
1090
+ width: motionVectorTexture.width,
1091
+ height: motionVectorTexture.height
1092
+ }, motionVectorSize, motionVectorTexture);
1093
+ }
1025
1094
  /** @internal */ function renderComposite(frame) {
1026
1095
  const { ctx } = frame;
1027
1096
  ctx.compositor?.drawPostEffects(ctx, PostEffectLayer.end, ctx.linearDepthTexture);
@@ -1032,6 +1101,7 @@ function blitToCurrentColorAttachment(ctx, source) {
1032
1101
  ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_DIFFUSE;
1033
1102
  ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_NORMAL;
1034
1103
  ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_TRANSMISSION;
1104
+ ctx.materialFlags &= ~MaterialVaryingFlags.SKIN_SSS_STORE;
1035
1105
  if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {
1036
1106
  const blitter = new CopyBlitter();
1037
1107
  blitter.srgbOut = !ctx.finalFramebuffer;