@babylonjs/core 8.15.1 → 8.16.1

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 (157) hide show
  1. package/Animations/animationGroup.d.ts +13 -1
  2. package/Animations/animationGroup.js +16 -3
  3. package/Animations/animationGroup.js.map +1 -1
  4. package/AudioV2/webAudio/components/webAudioParameterComponent.d.ts +8 -0
  5. package/AudioV2/webAudio/components/webAudioParameterComponent.js +36 -3
  6. package/AudioV2/webAudio/components/webAudioParameterComponent.js.map +1 -1
  7. package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js +10 -0
  8. package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js.map +1 -1
  9. package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js +11 -0
  10. package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js.map +1 -1
  11. package/AudioV2/webAudio/webAudioEngine.d.ts +7 -0
  12. package/AudioV2/webAudio/webAudioEngine.js +45 -0
  13. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  14. package/Behaviors/Cameras/framingBehavior.js +3 -3
  15. package/Behaviors/Cameras/framingBehavior.js.map +1 -1
  16. package/Debug/directionalLightFrustumViewer.d.ts +6 -0
  17. package/Debug/directionalLightFrustumViewer.js +39 -1
  18. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  19. package/Engines/AbstractEngine/abstractEngine.alpha.d.ts +2 -1
  20. package/Engines/AbstractEngine/abstractEngine.alpha.js +9 -9
  21. package/Engines/AbstractEngine/abstractEngine.alpha.js.map +1 -1
  22. package/Engines/AbstractEngine/abstractEngine.states.d.ts +4 -104
  23. package/Engines/AbstractEngine/abstractEngine.states.js +4 -70
  24. package/Engines/AbstractEngine/abstractEngine.states.js.map +1 -1
  25. package/Engines/AbstractEngine/abstractEngine.stencil.d.ts +147 -0
  26. package/Engines/AbstractEngine/abstractEngine.stencil.js +93 -0
  27. package/Engines/AbstractEngine/abstractEngine.stencil.js.map +1 -0
  28. package/Engines/AbstractEngine/index.d.ts +1 -0
  29. package/Engines/AbstractEngine/index.js +1 -0
  30. package/Engines/AbstractEngine/index.js.map +1 -1
  31. package/Engines/Extensions/engine.alpha.d.ts +2 -1
  32. package/Engines/Extensions/engine.alpha.js +7 -78
  33. package/Engines/Extensions/engine.alpha.js.map +1 -1
  34. package/Engines/WebGL/webGL2ShaderProcessors.js +8 -1
  35. package/Engines/WebGL/webGL2ShaderProcessors.js.map +1 -1
  36. package/Engines/WebGPU/Extensions/engine.alpha.d.ts +2 -1
  37. package/Engines/WebGPU/Extensions/engine.alpha.js +12 -82
  38. package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
  39. package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +12 -5
  40. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +139 -72
  41. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  42. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +13 -1
  43. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  44. package/Engines/WebGPU/webgpuStencilStateComposer.d.ts +8 -0
  45. package/Engines/WebGPU/webgpuStencilStateComposer.js +40 -0
  46. package/Engines/WebGPU/webgpuStencilStateComposer.js.map +1 -1
  47. package/Engines/abstractEngine.d.ts +7 -3
  48. package/Engines/abstractEngine.js +12 -5
  49. package/Engines/abstractEngine.js.map +1 -1
  50. package/Engines/constants.d.ts +30 -28
  51. package/Engines/constants.js +30 -28
  52. package/Engines/constants.js.map +1 -1
  53. package/Engines/engine.d.ts +10 -0
  54. package/Engines/engine.js +1 -0
  55. package/Engines/engine.js.map +1 -1
  56. package/Engines/engineCapabilities.d.ts +4 -0
  57. package/Engines/engineCapabilities.js.map +1 -1
  58. package/Engines/nativeEngine.d.ts +2 -1
  59. package/Engines/nativeEngine.js +6 -3
  60. package/Engines/nativeEngine.js.map +1 -1
  61. package/Engines/nullEngine.d.ts +2 -1
  62. package/Engines/nullEngine.js +7 -4
  63. package/Engines/nullEngine.js.map +1 -1
  64. package/Engines/thinEngine.js +16 -3
  65. package/Engines/thinEngine.js.map +1 -1
  66. package/Engines/webgpuEngine.d.ts +1 -0
  67. package/Engines/webgpuEngine.js +6 -4
  68. package/Engines/webgpuEngine.js.map +1 -1
  69. package/FrameGraph/Tasks/PostProcesses/passTask.d.ts +1 -1
  70. package/FrameGraph/Tasks/PostProcesses/passTask.js.map +1 -1
  71. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +8 -1
  72. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +14 -6
  73. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  74. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +3 -0
  75. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
  76. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +6 -5
  77. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +1 -1
  78. package/FrameGraph/Tasks/Texture/clearTextureTask.d.ts +1 -1
  79. package/FrameGraph/Tasks/Texture/clearTextureTask.js +7 -5
  80. package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
  81. package/FrameGraph/frameGraph.d.ts +10 -0
  82. package/FrameGraph/frameGraph.js +15 -5
  83. package/FrameGraph/frameGraph.js.map +1 -1
  84. package/FrameGraph/frameGraphContext.d.ts +16 -0
  85. package/FrameGraph/frameGraphContext.js +23 -0
  86. package/FrameGraph/frameGraphContext.js.map +1 -1
  87. package/FrameGraph/frameGraphRenderContext.d.ts +9 -16
  88. package/FrameGraph/frameGraphRenderContext.js +15 -23
  89. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  90. package/FrameGraph/frameGraphUtils.d.ts +52 -0
  91. package/FrameGraph/frameGraphUtils.js +99 -0
  92. package/FrameGraph/frameGraphUtils.js.map +1 -0
  93. package/FrameGraph/index.d.ts +1 -0
  94. package/FrameGraph/index.js +1 -0
  95. package/FrameGraph/index.js.map +1 -1
  96. package/Loading/Plugins/babylonFileLoader.js +35 -2
  97. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  98. package/Materials/material.d.ts +32 -12
  99. package/Materials/material.js +49 -17
  100. package/Materials/material.js.map +1 -1
  101. package/Materials/materialStencilState.d.ts +24 -0
  102. package/Materials/materialStencilState.js +53 -1
  103. package/Materials/materialStencilState.js.map +1 -1
  104. package/Meshes/geometry.js +1 -1
  105. package/Meshes/geometry.js.map +1 -1
  106. package/Meshes/instancedMesh.d.ts +5 -0
  107. package/Meshes/instancedMesh.js +3 -3
  108. package/Meshes/instancedMesh.js.map +1 -1
  109. package/Meshes/mesh.d.ts +28 -5
  110. package/Meshes/mesh.js +127 -57
  111. package/Meshes/mesh.js.map +1 -1
  112. package/Meshes/thinInstanceMesh.js +4 -0
  113. package/Meshes/thinInstanceMesh.js.map +1 -1
  114. package/Misc/snapshotRenderingHelper.js +2 -1
  115. package/Misc/snapshotRenderingHelper.js.map +1 -1
  116. package/Particles/IParticleSystem.d.ts +4 -0
  117. package/Particles/IParticleSystem.js.map +1 -1
  118. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.d.ts +1 -0
  119. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +32 -10
  120. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
  121. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.d.ts +4 -0
  122. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js +5 -0
  123. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  124. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.d.ts +12 -3
  125. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.js +22 -1
  126. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.js.map +1 -1
  127. package/PostProcesses/thinPassPostProcess.js +7 -3
  128. package/PostProcesses/thinPassPostProcess.js.map +1 -1
  129. package/Rendering/edgesRenderer.js +3 -2
  130. package/Rendering/edgesRenderer.js.map +1 -1
  131. package/Rendering/geometryBufferRenderer.js +1 -1
  132. package/Rendering/geometryBufferRenderer.js.map +1 -1
  133. package/Rendering/outlineRenderer.js +1 -1
  134. package/Rendering/outlineRenderer.js.map +1 -1
  135. package/Shaders/lod.fragment.js +2 -3
  136. package/Shaders/lod.fragment.js.map +1 -1
  137. package/ShadersWGSL/lod.fragment.js +2 -2
  138. package/ShadersWGSL/lod.fragment.js.map +1 -1
  139. package/Sprites/spriteManager.d.ts +1 -1
  140. package/Sprites/spriteManager.js.map +1 -1
  141. package/States/IStencilState.d.ts +6 -2
  142. package/States/IStencilState.js.map +1 -1
  143. package/States/alphaCullingState.d.ts +7 -5
  144. package/States/alphaCullingState.js +144 -33
  145. package/States/alphaCullingState.js.map +1 -1
  146. package/States/stencilState.d.ts +12 -0
  147. package/States/stencilState.js +29 -1
  148. package/States/stencilState.js.map +1 -1
  149. package/States/stencilStateComposer.d.ts +12 -0
  150. package/States/stencilStateComposer.js +48 -2
  151. package/States/stencilStateComposer.js.map +1 -1
  152. package/assetContainer.js +29 -8
  153. package/assetContainer.js.map +1 -1
  154. package/package.json +1 -1
  155. package/scene.d.ts +37 -1
  156. package/scene.js +56 -0
  157. package/scene.js.map +1 -1
package/Meshes/mesh.js CHANGED
@@ -30,19 +30,27 @@ export class _CreationDataStorage {
30
30
  /**
31
31
  * @internal
32
32
  **/
33
- class _InstanceDataStorage {
33
+ class _InstanceDataStorageRenderPass {
34
34
  constructor() {
35
- this.visibleInstances = {};
36
- this.batchCache = new _InstancesBatch();
37
- this.batchCacheReplacementModeInFrozenMode = new _InstancesBatch();
35
+ this.batchCache = new _InstancesBatch(this);
36
+ this.batchCacheReplacementModeInFrozenMode = new _InstancesBatch(this);
38
37
  this.instancesBufferSize = 32 * 16 * 4; // let's start with a maximum of 32 instances
39
38
  }
40
39
  }
41
40
  /**
42
41
  * @internal
43
42
  **/
44
- export class _InstancesBatch {
43
+ class _InstanceDataStorage {
45
44
  constructor() {
45
+ this.renderPasses = {};
46
+ }
47
+ }
48
+ /**
49
+ * @internal
50
+ **/
51
+ export class _InstancesBatch {
52
+ constructor(parent) {
53
+ this.parent = parent;
46
54
  this.mustReturn = false;
47
55
  this.visibleInstances = new Array();
48
56
  this.renderSelf = [];
@@ -217,6 +225,10 @@ export class Mesh extends AbstractMesh {
217
225
  (this._scene.useRightHandedSystem && value === 1) ||
218
226
  (!this._scene.useRightHandedSystem && value === 0);
219
227
  }
228
+ /** @internal */
229
+ get _effectiveSideOrientation() {
230
+ return this._internalMeshDataInfo._effectiveSideOrientation;
231
+ }
220
232
  /**
221
233
  * @deprecated Please use sideOrientation instead.
222
234
  * @see https://doc.babylonjs.com/breaking-changes#7110
@@ -276,11 +288,13 @@ export class Mesh extends AbstractMesh {
276
288
  }
277
289
  /** Gets the array buffer used to store the instanced buffer used for instances' world matrices */
278
290
  get worldMatrixInstancedBuffer() {
279
- return this._instanceDataStorage.instancesData;
291
+ const instanceDataStorage = this._instanceDataStorage.renderPasses[this._instanceDataStorage.engine.isWebGPU ? this._instanceDataStorage.engine.currentRenderPassId : 0];
292
+ return instanceDataStorage ? instanceDataStorage.instancesData : undefined;
280
293
  }
281
294
  /** Gets the array buffer used to store the instanced buffer used for instances' previous world matrices */
282
295
  get previousWorldMatrixInstancedBuffer() {
283
- return this._instanceDataStorage.instancesPreviousData;
296
+ const instanceDataStorage = this._instanceDataStorage.renderPasses[this._instanceDataStorage.engine.isWebGPU ? this._instanceDataStorage.engine.currentRenderPassId : 0];
297
+ return instanceDataStorage ? instanceDataStorage.instancesPreviousData : undefined;
284
298
  }
285
299
  /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */
286
300
  get manualUpdateOfWorldMatrixInstancedBuffer() {
@@ -489,8 +503,6 @@ export class Mesh extends AbstractMesh {
489
503
  /** @internal */
490
504
  this._geometry = null;
491
505
  /** @internal */
492
- this._instanceDataStorage = new _InstanceDataStorage();
493
- /** @internal */
494
506
  this._thinInstanceDataStorage = new _ThinInstanceDataStorage();
495
507
  /** @internal */
496
508
  this._shouldGenerateFlatShading = false;
@@ -506,6 +518,8 @@ export class Mesh extends AbstractMesh {
506
518
  */
507
519
  this.ignoreCameraMaxZ = false;
508
520
  scene = this.getScene();
521
+ this._instanceDataStorage = new _InstanceDataStorage();
522
+ this._instanceDataStorage.engine = scene.getEngine();
509
523
  if (this._scene.useRightHandedSystem) {
510
524
  this.sideOrientation = 0;
511
525
  }
@@ -1080,6 +1094,16 @@ export class Mesh extends AbstractMesh {
1080
1094
  set overridenInstanceCount(count) {
1081
1095
  this._instanceDataStorage.overridenInstanceCount = count;
1082
1096
  }
1097
+ /** @internal */
1098
+ _getInstanceDataStorage() {
1099
+ const renderPassId = this._instanceDataStorage.engine.isWebGPU ? this._instanceDataStorage.engine.currentRenderPassId : 0;
1100
+ let instanceDataStorage = this._instanceDataStorage.renderPasses[renderPassId];
1101
+ if (!instanceDataStorage) {
1102
+ instanceDataStorage = new _InstanceDataStorageRenderPass();
1103
+ this._instanceDataStorage.renderPasses[renderPassId] = instanceDataStorage;
1104
+ }
1105
+ return instanceDataStorage;
1106
+ }
1083
1107
  // Methods
1084
1108
  /** @internal */
1085
1109
  _preActivate() {
@@ -1089,15 +1113,21 @@ export class Mesh extends AbstractMesh {
1089
1113
  return this;
1090
1114
  }
1091
1115
  internalDataInfo._preActivateId = sceneRenderId;
1092
- this._instanceDataStorage.visibleInstances = null;
1116
+ if (this.hasInstances) {
1117
+ this._getInstanceDataStorage().visibleInstances = null;
1118
+ }
1093
1119
  return this;
1094
1120
  }
1095
1121
  /**
1096
1122
  * @internal
1097
1123
  */
1098
1124
  _preActivateForIntermediateRendering(renderId) {
1099
- if (this._instanceDataStorage.visibleInstances) {
1100
- this._instanceDataStorage.visibleInstances.intermediateDefaultRenderId = renderId;
1125
+ if (!this.hasInstances) {
1126
+ return this;
1127
+ }
1128
+ const instanceDataStorage = this._getInstanceDataStorage();
1129
+ if (instanceDataStorage.visibleInstances) {
1130
+ instanceDataStorage.visibleInstances.intermediateDefaultRenderId = renderId;
1101
1131
  }
1102
1132
  return this;
1103
1133
  }
@@ -1105,20 +1135,22 @@ export class Mesh extends AbstractMesh {
1105
1135
  * @internal
1106
1136
  */
1107
1137
  _registerInstanceForRenderId(instance, renderId) {
1108
- if (!this._instanceDataStorage.visibleInstances) {
1109
- this._instanceDataStorage.visibleInstances = {
1138
+ const instanceDataStorage = this._getInstanceDataStorage();
1139
+ if (!instanceDataStorage.visibleInstances) {
1140
+ instanceDataStorage.visibleInstances = {
1110
1141
  defaultRenderId: renderId,
1111
1142
  selfDefaultRenderId: this._renderId,
1143
+ intermediateDefaultRenderId: -1,
1112
1144
  };
1113
1145
  }
1114
- if (!this._instanceDataStorage.visibleInstances[renderId]) {
1115
- if (this._instanceDataStorage.previousRenderId !== undefined && this._instanceDataStorage.isFrozen) {
1116
- this._instanceDataStorage.visibleInstances[this._instanceDataStorage.previousRenderId] = null;
1146
+ if (!instanceDataStorage.visibleInstances[renderId]) {
1147
+ if (instanceDataStorage.previousRenderId !== undefined && this._instanceDataStorage.isFrozen) {
1148
+ instanceDataStorage.visibleInstances[instanceDataStorage.previousRenderId] = null;
1117
1149
  }
1118
- this._instanceDataStorage.previousRenderId = renderId;
1119
- this._instanceDataStorage.visibleInstances[renderId] = new Array();
1150
+ instanceDataStorage.previousRenderId = renderId;
1151
+ instanceDataStorage.visibleInstances[renderId] = new Array();
1120
1152
  }
1121
- this._instanceDataStorage.visibleInstances[renderId].push(instance);
1153
+ instanceDataStorage.visibleInstances[renderId].push(instance);
1122
1154
  return this;
1123
1155
  }
1124
1156
  _afterComputeWorldMatrix() {
@@ -1503,6 +1535,14 @@ export class Mesh extends AbstractMesh {
1503
1535
  this._geometry._bind(effect, indexToBind);
1504
1536
  }
1505
1537
  else {
1538
+ if (this._instanceDataStorage.engine.isWebGPU &&
1539
+ this._userInstancedBuffersStorage.renderPasses &&
1540
+ this._userInstancedBuffersStorage.renderPasses[this._instanceDataStorage.engine.currentRenderPassId]) {
1541
+ const vertexBuffers = this._userInstancedBuffersStorage.renderPasses[this._instanceDataStorage.engine.currentRenderPassId];
1542
+ for (const kind in vertexBuffers) {
1543
+ this._userInstancedBuffersStorage.vertexBuffers[kind] = vertexBuffers[kind];
1544
+ }
1545
+ }
1506
1546
  this._geometry._bind(effect, indexToBind, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects);
1507
1547
  }
1508
1548
  return this;
@@ -1572,14 +1612,15 @@ export class Mesh extends AbstractMesh {
1572
1612
  * @internal
1573
1613
  */
1574
1614
  _getInstancesRenderList(subMeshId, isReplacementMode = false) {
1615
+ const instanceDataStorage = this._getInstanceDataStorage();
1575
1616
  if (this._instanceDataStorage.isFrozen) {
1576
1617
  if (isReplacementMode) {
1577
- this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.hardwareInstancedRendering[subMeshId] = false;
1578
- this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.renderSelf[subMeshId] = true;
1579
- return this._instanceDataStorage.batchCacheReplacementModeInFrozenMode;
1618
+ instanceDataStorage.batchCacheReplacementModeInFrozenMode.hardwareInstancedRendering[subMeshId] = false;
1619
+ instanceDataStorage.batchCacheReplacementModeInFrozenMode.renderSelf[subMeshId] = true;
1620
+ return instanceDataStorage.batchCacheReplacementModeInFrozenMode;
1580
1621
  }
1581
- if (this._instanceDataStorage.previousBatch) {
1582
- return this._instanceDataStorage.previousBatch;
1622
+ if (instanceDataStorage.previousBatch) {
1623
+ return instanceDataStorage.previousBatch;
1583
1624
  }
1584
1625
  }
1585
1626
  const scene = this.getScene();
@@ -1587,12 +1628,12 @@ export class Mesh extends AbstractMesh {
1587
1628
  const onlyForInstances = isInIntermediateRendering
1588
1629
  ? this._internalAbstractMeshDataInfo._onlyForInstancesIntermediate
1589
1630
  : this._internalAbstractMeshDataInfo._onlyForInstances;
1590
- const batchCache = this._instanceDataStorage.batchCache;
1631
+ const batchCache = instanceDataStorage.batchCache;
1591
1632
  batchCache.mustReturn = false;
1592
1633
  batchCache.renderSelf[subMeshId] = isReplacementMode || (!onlyForInstances && this.isEnabled() && this.isVisible);
1593
1634
  batchCache.visibleInstances[subMeshId] = null;
1594
- if (this._instanceDataStorage.visibleInstances && !isReplacementMode) {
1595
- const visibleInstances = this._instanceDataStorage.visibleInstances;
1635
+ if (instanceDataStorage.visibleInstances && !isReplacementMode) {
1636
+ const visibleInstances = instanceDataStorage.visibleInstances;
1596
1637
  const currentRenderId = scene.getRenderId();
1597
1638
  const defaultRenderId = isInIntermediateRendering ? visibleInstances.intermediateDefaultRenderId : visibleInstances.defaultRenderId;
1598
1639
  batchCache.visibleInstances[subMeshId] = visibleInstances[currentRenderId];
@@ -1605,7 +1646,7 @@ export class Mesh extends AbstractMesh {
1605
1646
  this._instanceDataStorage.hardwareInstancedRendering &&
1606
1647
  batchCache.visibleInstances[subMeshId] !== null &&
1607
1648
  batchCache.visibleInstances[subMeshId] !== undefined;
1608
- this._instanceDataStorage.previousBatch = batchCache;
1649
+ instanceDataStorage.previousBatch = batchCache;
1609
1650
  return batchCache;
1610
1651
  }
1611
1652
  /**
@@ -1615,7 +1656,8 @@ export class Mesh extends AbstractMesh {
1615
1656
  _updateInstancedBuffers(subMesh, batch, currentInstancesBufferSize, engine, fillMode, effect) {
1616
1657
  const visibleInstances = batch.visibleInstances[subMesh._id];
1617
1658
  const visibleInstanceCount = visibleInstances ? visibleInstances.length : 0;
1618
- const instanceStorage = this._instanceDataStorage;
1659
+ const instanceStorage = batch.parent;
1660
+ const instanceDataStorage = this._instanceDataStorage;
1619
1661
  let instancesBuffer = instanceStorage.instancesBuffer;
1620
1662
  let instancesPreviousBuffer = instanceStorage.instancesPreviousBuffer;
1621
1663
  let offset = 0;
@@ -1624,17 +1666,17 @@ export class Mesh extends AbstractMesh {
1624
1666
  const needUpdateBuffer = !instancesBuffer ||
1625
1667
  currentInstancesBufferSize !== instanceStorage.instancesBufferSize ||
1626
1668
  (this._scene.needsPreviousWorldMatrices && !instanceStorage.instancesPreviousBuffer);
1627
- if (!this._instanceDataStorage.manualUpdate && (!instanceStorage.isFrozen || needUpdateBuffer)) {
1669
+ if (!this._instanceDataStorage.manualUpdate && (!instanceDataStorage.isFrozen || needUpdateBuffer)) {
1628
1670
  const world = this.getWorldMatrix();
1629
1671
  if (renderSelf) {
1630
1672
  if (this._scene.needsPreviousWorldMatrices) {
1631
- if (!instanceStorage.masterMeshPreviousWorldMatrix) {
1632
- instanceStorage.masterMeshPreviousWorldMatrix = world.clone();
1633
- instanceStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);
1673
+ if (!instanceDataStorage.masterMeshPreviousWorldMatrix) {
1674
+ instanceDataStorage.masterMeshPreviousWorldMatrix = world.clone();
1675
+ instanceDataStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);
1634
1676
  }
1635
1677
  else {
1636
- instanceStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);
1637
- instanceStorage.masterMeshPreviousWorldMatrix.copyFrom(world);
1678
+ instanceDataStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);
1679
+ instanceDataStorage.masterMeshPreviousWorldMatrix.copyFrom(world);
1638
1680
  }
1639
1681
  }
1640
1682
  world.copyToArray(instanceStorage.instancesData, offset);
@@ -1692,17 +1734,31 @@ export class Mesh extends AbstractMesh {
1692
1734
  vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : undefined,
1693
1735
  };
1694
1736
  }
1695
- this._userInstancedBuffersStorage.vertexBuffers["world0"] = instancesBuffer.createVertexBuffer("world0", 0, 4);
1696
- this._userInstancedBuffersStorage.vertexBuffers["world1"] = instancesBuffer.createVertexBuffer("world1", 4, 4);
1697
- this._userInstancedBuffersStorage.vertexBuffers["world2"] = instancesBuffer.createVertexBuffer("world2", 8, 4);
1698
- this._userInstancedBuffersStorage.vertexBuffers["world3"] = instancesBuffer.createVertexBuffer("world3", 12, 4);
1737
+ let vertexAndArrayObjectBuffers;
1738
+ if (this._instanceDataStorage.engine.isWebGPU) {
1739
+ if (!this._userInstancedBuffersStorage.renderPasses) {
1740
+ this._userInstancedBuffersStorage.renderPasses = {};
1741
+ }
1742
+ const currentRenderPassId = this._instanceDataStorage.engine.currentRenderPassId;
1743
+ vertexAndArrayObjectBuffers = this._userInstancedBuffersStorage.renderPasses[currentRenderPassId];
1744
+ if (!vertexAndArrayObjectBuffers) {
1745
+ this._userInstancedBuffersStorage.renderPasses[currentRenderPassId] = vertexAndArrayObjectBuffers = {};
1746
+ }
1747
+ }
1748
+ else {
1749
+ vertexAndArrayObjectBuffers = this._userInstancedBuffersStorage.vertexBuffers;
1750
+ }
1751
+ vertexAndArrayObjectBuffers["world0"] = instancesBuffer.createVertexBuffer("world0", 0, 4);
1752
+ vertexAndArrayObjectBuffers["world1"] = instancesBuffer.createVertexBuffer("world1", 4, 4);
1753
+ vertexAndArrayObjectBuffers["world2"] = instancesBuffer.createVertexBuffer("world2", 8, 4);
1754
+ vertexAndArrayObjectBuffers["world3"] = instancesBuffer.createVertexBuffer("world3", 12, 4);
1699
1755
  if (this._scene.needsPreviousWorldMatrices) {
1700
1756
  instancesPreviousBuffer = new Buffer(engine, instanceStorage.instancesPreviousData, true, 16, false, true);
1701
1757
  instanceStorage.instancesPreviousBuffer = instancesPreviousBuffer;
1702
- this._userInstancedBuffersStorage.vertexBuffers["previousWorld0"] = instancesPreviousBuffer.createVertexBuffer("previousWorld0", 0, 4);
1703
- this._userInstancedBuffersStorage.vertexBuffers["previousWorld1"] = instancesPreviousBuffer.createVertexBuffer("previousWorld1", 4, 4);
1704
- this._userInstancedBuffersStorage.vertexBuffers["previousWorld2"] = instancesPreviousBuffer.createVertexBuffer("previousWorld2", 8, 4);
1705
- this._userInstancedBuffersStorage.vertexBuffers["previousWorld3"] = instancesPreviousBuffer.createVertexBuffer("previousWorld3", 12, 4);
1758
+ vertexAndArrayObjectBuffers["previousWorld0"] = instancesPreviousBuffer.createVertexBuffer("previousWorld0", 0, 4);
1759
+ vertexAndArrayObjectBuffers["previousWorld1"] = instancesPreviousBuffer.createVertexBuffer("previousWorld1", 4, 4);
1760
+ vertexAndArrayObjectBuffers["previousWorld2"] = instancesPreviousBuffer.createVertexBuffer("previousWorld2", 8, 4);
1761
+ vertexAndArrayObjectBuffers["previousWorld3"] = instancesPreviousBuffer.createVertexBuffer("previousWorld3", 12, 4);
1706
1762
  }
1707
1763
  this._invalidateInstanceVertexArrayObject();
1708
1764
  }
@@ -1742,7 +1798,7 @@ export class Mesh extends AbstractMesh {
1742
1798
  _renderWithInstances(subMesh, fillMode, batch, effect, engine) {
1743
1799
  const visibleInstances = batch.visibleInstances[subMesh._id];
1744
1800
  const visibleInstanceCount = visibleInstances ? visibleInstances.length : 0;
1745
- const instanceStorage = this._instanceDataStorage;
1801
+ const instanceStorage = batch.parent;
1746
1802
  const currentInstancesBufferSize = instanceStorage.instancesBufferSize;
1747
1803
  const matricesCount = visibleInstanceCount + 1;
1748
1804
  const bufferSize = matricesCount * 16 * 4;
@@ -1844,12 +1900,15 @@ export class Mesh extends AbstractMesh {
1844
1900
  * @internal
1845
1901
  */
1846
1902
  _rebuild(dispose = false) {
1847
- if (this._instanceDataStorage.instancesBuffer) {
1848
- // Dispose instance buffer to be recreated in _renderWithInstances when rendered
1849
- if (dispose) {
1850
- this._instanceDataStorage.instancesBuffer.dispose();
1903
+ for (const renderPassId in this._instanceDataStorage.renderPasses) {
1904
+ const instanceDataStorage = this._instanceDataStorage.renderPasses[renderPassId];
1905
+ if (instanceDataStorage.instancesBuffer) {
1906
+ // Dispose instance buffer to be recreated in _renderWithInstances when rendered
1907
+ if (dispose) {
1908
+ instanceDataStorage.instancesBuffer.dispose();
1909
+ }
1910
+ instanceDataStorage.instancesBuffer = null;
1851
1911
  }
1852
- this._instanceDataStorage.instancesBuffer = null;
1853
1912
  }
1854
1913
  if (this._userInstancedBuffersStorage) {
1855
1914
  for (const kind in this._userInstancedBuffersStorage.vertexBuffers) {
@@ -1884,7 +1943,10 @@ export class Mesh extends AbstractMesh {
1884
1943
  /** @internal */
1885
1944
  _unFreeze() {
1886
1945
  this._instanceDataStorage.isFrozen = false;
1887
- this._instanceDataStorage.previousBatch = null;
1946
+ for (const renderPassId in this._instanceDataStorage.renderPasses) {
1947
+ const instanceDataStorage = this._instanceDataStorage.renderPasses[renderPassId];
1948
+ instanceDataStorage.previousBatch = null;
1949
+ }
1888
1950
  }
1889
1951
  /**
1890
1952
  * Triggers the draw call for the mesh (or a submesh), for a specific render pass id
@@ -2018,7 +2080,16 @@ export class Mesh extends AbstractMesh {
2018
2080
  }
2019
2081
  // Alpha mode
2020
2082
  if (enableAlphaMode) {
2021
- engine.setAlphaMode(this._internalMeshDataInfo._effectiveMaterial.alphaMode);
2083
+ const effectiveMaterial = this._internalMeshDataInfo._effectiveMaterial;
2084
+ if (effectiveMaterial.alphaModes.length === 1) {
2085
+ engine.setAlphaMode(effectiveMaterial.alphaMode);
2086
+ }
2087
+ else {
2088
+ for (let i = 0; i < effectiveMaterial.alphaModes.length; i++) {
2089
+ const alphaMode = effectiveMaterial.alphaModes[i];
2090
+ engine.setAlphaMode(alphaMode !== undefined ? alphaMode : 2, false, i);
2091
+ }
2092
+ }
2022
2093
  }
2023
2094
  let drawWrapper;
2024
2095
  if (this._internalMeshDataInfo._effectiveMaterial._storeEffectOnSubMeshes) {
@@ -2050,12 +2121,12 @@ export class Mesh extends AbstractMesh {
2050
2121
  if (mainDeterminant < 0) {
2051
2122
  sideOrientation = sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;
2052
2123
  }
2053
- instanceDataStorage.sideOrientation = sideOrientation;
2124
+ this._internalMeshDataInfo._effectiveSideOrientation = sideOrientation;
2054
2125
  }
2055
- else {
2056
- sideOrientation = instanceDataStorage.sideOrientation;
2126
+ else if (this.hasInstances) {
2127
+ sideOrientation = this._internalMeshDataInfo._effectiveSideOrientation;
2057
2128
  }
2058
- const reverse = this._internalMeshDataInfo._effectiveMaterial._preBind(drawWrapper, sideOrientation);
2129
+ const reverse = this._internalMeshDataInfo._effectiveMaterial._preBind(drawWrapper, this._internalMeshDataInfo._effectiveSideOrientation);
2059
2130
  if (this._internalMeshDataInfo._effectiveMaterial.forceDepthWrite) {
2060
2131
  engine.setDepthWrite(true);
2061
2132
  }
@@ -2515,7 +2586,6 @@ export class Mesh extends AbstractMesh {
2515
2586
  }
2516
2587
  }
2517
2588
  internalDataInfo._source = null;
2518
- this._instanceDataStorage.visibleInstances = {};
2519
2589
  // Instances
2520
2590
  this._disposeInstanceSpecificData();
2521
2591
  // Thin instances