@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.
- package/Animations/animationGroup.d.ts +13 -1
- package/Animations/animationGroup.js +16 -3
- package/Animations/animationGroup.js.map +1 -1
- package/AudioV2/webAudio/components/webAudioParameterComponent.d.ts +8 -0
- package/AudioV2/webAudio/components/webAudioParameterComponent.js +36 -3
- package/AudioV2/webAudio/components/webAudioParameterComponent.js.map +1 -1
- package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js +10 -0
- package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js.map +1 -1
- package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js +11 -0
- package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js.map +1 -1
- package/AudioV2/webAudio/webAudioEngine.d.ts +7 -0
- package/AudioV2/webAudio/webAudioEngine.js +45 -0
- package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
- package/Behaviors/Cameras/framingBehavior.js +3 -3
- package/Behaviors/Cameras/framingBehavior.js.map +1 -1
- package/Debug/directionalLightFrustumViewer.d.ts +6 -0
- package/Debug/directionalLightFrustumViewer.js +39 -1
- package/Debug/directionalLightFrustumViewer.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.alpha.d.ts +2 -1
- package/Engines/AbstractEngine/abstractEngine.alpha.js +9 -9
- package/Engines/AbstractEngine/abstractEngine.alpha.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.states.d.ts +4 -104
- package/Engines/AbstractEngine/abstractEngine.states.js +4 -70
- package/Engines/AbstractEngine/abstractEngine.states.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.stencil.d.ts +147 -0
- package/Engines/AbstractEngine/abstractEngine.stencil.js +93 -0
- package/Engines/AbstractEngine/abstractEngine.stencil.js.map +1 -0
- package/Engines/AbstractEngine/index.d.ts +1 -0
- package/Engines/AbstractEngine/index.js +1 -0
- package/Engines/AbstractEngine/index.js.map +1 -1
- package/Engines/Extensions/engine.alpha.d.ts +2 -1
- package/Engines/Extensions/engine.alpha.js +7 -78
- package/Engines/Extensions/engine.alpha.js.map +1 -1
- package/Engines/WebGL/webGL2ShaderProcessors.js +8 -1
- package/Engines/WebGL/webGL2ShaderProcessors.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.alpha.d.ts +2 -1
- package/Engines/WebGPU/Extensions/engine.alpha.js +12 -82
- package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +12 -5
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +139 -72
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +13 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/WebGPU/webgpuStencilStateComposer.d.ts +8 -0
- package/Engines/WebGPU/webgpuStencilStateComposer.js +40 -0
- package/Engines/WebGPU/webgpuStencilStateComposer.js.map +1 -1
- package/Engines/abstractEngine.d.ts +7 -3
- package/Engines/abstractEngine.js +12 -5
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +30 -28
- package/Engines/constants.js +30 -28
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +10 -0
- package/Engines/engine.js +1 -0
- package/Engines/engine.js.map +1 -1
- package/Engines/engineCapabilities.d.ts +4 -0
- package/Engines/engineCapabilities.js.map +1 -1
- package/Engines/nativeEngine.d.ts +2 -1
- package/Engines/nativeEngine.js +6 -3
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/nullEngine.d.ts +2 -1
- package/Engines/nullEngine.js +7 -4
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/thinEngine.js +16 -3
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +1 -0
- package/Engines/webgpuEngine.js +6 -4
- package/Engines/webgpuEngine.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/passTask.d.ts +1 -1
- package/FrameGraph/Tasks/PostProcesses/passTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +8 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js +14 -6
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +3 -0
- package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +6 -5
- package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Texture/clearTextureTask.d.ts +1 -1
- package/FrameGraph/Tasks/Texture/clearTextureTask.js +7 -5
- package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
- package/FrameGraph/frameGraph.d.ts +10 -0
- package/FrameGraph/frameGraph.js +15 -5
- package/FrameGraph/frameGraph.js.map +1 -1
- package/FrameGraph/frameGraphContext.d.ts +16 -0
- package/FrameGraph/frameGraphContext.js +23 -0
- package/FrameGraph/frameGraphContext.js.map +1 -1
- package/FrameGraph/frameGraphRenderContext.d.ts +9 -16
- package/FrameGraph/frameGraphRenderContext.js +15 -23
- package/FrameGraph/frameGraphRenderContext.js.map +1 -1
- package/FrameGraph/frameGraphUtils.d.ts +52 -0
- package/FrameGraph/frameGraphUtils.js +99 -0
- package/FrameGraph/frameGraphUtils.js.map +1 -0
- package/FrameGraph/index.d.ts +1 -0
- package/FrameGraph/index.js +1 -0
- package/FrameGraph/index.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.js +35 -2
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Materials/material.d.ts +32 -12
- package/Materials/material.js +49 -17
- package/Materials/material.js.map +1 -1
- package/Materials/materialStencilState.d.ts +24 -0
- package/Materials/materialStencilState.js +53 -1
- package/Materials/materialStencilState.js.map +1 -1
- package/Meshes/geometry.js +1 -1
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/instancedMesh.d.ts +5 -0
- package/Meshes/instancedMesh.js +3 -3
- package/Meshes/instancedMesh.js.map +1 -1
- package/Meshes/mesh.d.ts +28 -5
- package/Meshes/mesh.js +127 -57
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/thinInstanceMesh.js +4 -0
- package/Meshes/thinInstanceMesh.js.map +1 -1
- package/Misc/snapshotRenderingHelper.js +2 -1
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Particles/IParticleSystem.d.ts +4 -0
- package/Particles/IParticleSystem.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +32 -10
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/postProcessRenderPipeline.d.ts +4 -0
- package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js +5 -0
- package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.d.ts +12 -3
- package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.js +22 -1
- package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.js.map +1 -1
- package/PostProcesses/thinPassPostProcess.js +7 -3
- package/PostProcesses/thinPassPostProcess.js.map +1 -1
- package/Rendering/edgesRenderer.js +3 -2
- package/Rendering/edgesRenderer.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +1 -1
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/outlineRenderer.js +1 -1
- package/Rendering/outlineRenderer.js.map +1 -1
- package/Shaders/lod.fragment.js +2 -3
- package/Shaders/lod.fragment.js.map +1 -1
- package/ShadersWGSL/lod.fragment.js +2 -2
- package/ShadersWGSL/lod.fragment.js.map +1 -1
- package/Sprites/spriteManager.d.ts +1 -1
- package/Sprites/spriteManager.js.map +1 -1
- package/States/IStencilState.d.ts +6 -2
- package/States/IStencilState.js.map +1 -1
- package/States/alphaCullingState.d.ts +7 -5
- package/States/alphaCullingState.js +144 -33
- package/States/alphaCullingState.js.map +1 -1
- package/States/stencilState.d.ts +12 -0
- package/States/stencilState.js +29 -1
- package/States/stencilState.js.map +1 -1
- package/States/stencilStateComposer.d.ts +12 -0
- package/States/stencilStateComposer.js +48 -2
- package/States/stencilStateComposer.js.map +1 -1
- package/assetContainer.js +29 -8
- package/assetContainer.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +37 -1
- package/scene.js +56 -0
- 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
|
|
33
|
+
class _InstanceDataStorageRenderPass {
|
|
34
34
|
constructor() {
|
|
35
|
-
this.
|
|
36
|
-
this.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
1100
|
-
this
|
|
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
|
-
|
|
1109
|
-
|
|
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 (!
|
|
1115
|
-
if (
|
|
1116
|
-
|
|
1146
|
+
if (!instanceDataStorage.visibleInstances[renderId]) {
|
|
1147
|
+
if (instanceDataStorage.previousRenderId !== undefined && this._instanceDataStorage.isFrozen) {
|
|
1148
|
+
instanceDataStorage.visibleInstances[instanceDataStorage.previousRenderId] = null;
|
|
1117
1149
|
}
|
|
1118
|
-
|
|
1119
|
-
|
|
1150
|
+
instanceDataStorage.previousRenderId = renderId;
|
|
1151
|
+
instanceDataStorage.visibleInstances[renderId] = new Array();
|
|
1120
1152
|
}
|
|
1121
|
-
|
|
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
|
-
|
|
1578
|
-
|
|
1579
|
-
return
|
|
1618
|
+
instanceDataStorage.batchCacheReplacementModeInFrozenMode.hardwareInstancedRendering[subMeshId] = false;
|
|
1619
|
+
instanceDataStorage.batchCacheReplacementModeInFrozenMode.renderSelf[subMeshId] = true;
|
|
1620
|
+
return instanceDataStorage.batchCacheReplacementModeInFrozenMode;
|
|
1580
1621
|
}
|
|
1581
|
-
if (
|
|
1582
|
-
return
|
|
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 =
|
|
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 (
|
|
1595
|
-
const 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
|
-
|
|
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 =
|
|
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 && (!
|
|
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 (!
|
|
1632
|
-
|
|
1633
|
-
|
|
1673
|
+
if (!instanceDataStorage.masterMeshPreviousWorldMatrix) {
|
|
1674
|
+
instanceDataStorage.masterMeshPreviousWorldMatrix = world.clone();
|
|
1675
|
+
instanceDataStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);
|
|
1634
1676
|
}
|
|
1635
1677
|
else {
|
|
1636
|
-
|
|
1637
|
-
|
|
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
|
-
|
|
1696
|
-
this.
|
|
1697
|
-
|
|
1698
|
-
|
|
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
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
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 =
|
|
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
|
-
|
|
1848
|
-
|
|
1849
|
-
if (
|
|
1850
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
2124
|
+
this._internalMeshDataInfo._effectiveSideOrientation = sideOrientation;
|
|
2054
2125
|
}
|
|
2055
|
-
else {
|
|
2056
|
-
sideOrientation =
|
|
2126
|
+
else if (this.hasInstances) {
|
|
2127
|
+
sideOrientation = this._internalMeshDataInfo._effectiveSideOrientation;
|
|
2057
2128
|
}
|
|
2058
|
-
const reverse = this._internalMeshDataInfo._effectiveMaterial._preBind(drawWrapper,
|
|
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
|