@babylonjs/core 7.42.0 → 7.43.0

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 (169) hide show
  1. package/Animations/animation.js +1 -1
  2. package/Animations/animation.js.map +1 -1
  3. package/Culling/Helper/computeShaderBoundingHelper.js +3 -4
  4. package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
  5. package/Culling/Helper/transformFeedbackBoundingHelper.js +27 -64
  6. package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -1
  7. package/Engines/Extensions/engine.multiRender.js +3 -2
  8. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  9. package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +1 -0
  10. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +5 -0
  11. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  12. package/Engines/WebGPU/webgpuTextureManager.js +6 -1
  13. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  14. package/Engines/abstractEngine.js +2 -2
  15. package/Engines/abstractEngine.js.map +1 -1
  16. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.d.ts +64 -0
  17. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.js +147 -0
  18. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.js.map +1 -0
  19. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +0 -15
  20. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  21. package/FrameGraph/Node/Blocks/Rendering/baseShadowGeneratorBlock.d.ts +4 -0
  22. package/FrameGraph/Node/Blocks/Rendering/baseShadowGeneratorBlock.js +9 -0
  23. package/FrameGraph/Node/Blocks/Rendering/baseShadowGeneratorBlock.js.map +1 -1
  24. package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.d.ts +1 -6
  25. package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.js +0 -13
  26. package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.js.map +1 -1
  27. package/FrameGraph/Node/Blocks/Rendering/shadowGeneratorBlock.js +0 -1
  28. package/FrameGraph/Node/Blocks/Rendering/shadowGeneratorBlock.js.map +1 -1
  29. package/FrameGraph/Node/Blocks/index.d.ts +1 -0
  30. package/FrameGraph/Node/Blocks/index.js +1 -0
  31. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  32. package/FrameGraph/Node/nodeRenderGraphBlock.js +17 -0
  33. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  34. package/FrameGraph/Passes/renderPass.d.ts +0 -8
  35. package/FrameGraph/Passes/renderPass.js +0 -10
  36. package/FrameGraph/Passes/renderPass.js.map +1 -1
  37. package/FrameGraph/Tasks/Layers/glowLayerTask.d.ts +57 -0
  38. package/FrameGraph/Tasks/Layers/glowLayerTask.js +173 -0
  39. package/FrameGraph/Tasks/Layers/glowLayerTask.js.map +1 -0
  40. package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.js +1 -1
  41. package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.js.map +1 -1
  42. package/FrameGraph/Tasks/PostProcesses/bloomTask.js +7 -0
  43. package/FrameGraph/Tasks/PostProcesses/bloomTask.js.map +1 -1
  44. package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js +1 -1
  45. package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js.map +1 -1
  46. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js +1 -1
  47. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js.map +1 -1
  48. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +5 -5
  49. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  50. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js +12 -4
  51. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js.map +1 -1
  52. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +1 -1
  53. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
  54. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +0 -8
  55. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +1 -17
  56. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
  57. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +3 -0
  58. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  59. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +4 -6
  60. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +20 -22
  61. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  62. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.d.ts +7 -1
  63. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +21 -5
  64. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
  65. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +4 -6
  66. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +1 -1
  67. package/FrameGraph/Tasks/Texture/copyToTextureTask.js +1 -1
  68. package/FrameGraph/Tasks/Texture/copyToTextureTask.js.map +1 -1
  69. package/FrameGraph/frameGraph.js +22 -11
  70. package/FrameGraph/frameGraph.js.map +1 -1
  71. package/FrameGraph/frameGraphRenderContext.d.ts +2 -1
  72. package/FrameGraph/frameGraphRenderContext.js +2 -1
  73. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  74. package/FrameGraph/frameGraphTask.d.ts +11 -1
  75. package/FrameGraph/frameGraphTask.js +8 -0
  76. package/FrameGraph/frameGraphTask.js.map +1 -1
  77. package/FrameGraph/frameGraphTextureManager.d.ts +8 -2
  78. package/FrameGraph/frameGraphTextureManager.js +10 -4
  79. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  80. package/FrameGraph/index.d.ts +1 -0
  81. package/FrameGraph/index.js +1 -0
  82. package/FrameGraph/index.js.map +1 -1
  83. package/Layers/effectLayer.d.ts +32 -33
  84. package/Layers/effectLayer.js +144 -530
  85. package/Layers/effectLayer.js.map +1 -1
  86. package/Layers/glowLayer.d.ts +14 -41
  87. package/Layers/glowLayer.js +92 -178
  88. package/Layers/glowLayer.js.map +1 -1
  89. package/Layers/highlightLayer.d.ts +0 -1
  90. package/Layers/highlightLayer.js +0 -1
  91. package/Layers/highlightLayer.js.map +1 -1
  92. package/Layers/index.d.ts +2 -0
  93. package/Layers/index.js +2 -0
  94. package/Layers/index.js.map +1 -1
  95. package/Layers/thinEffectLayer.d.ts +230 -0
  96. package/Layers/thinEffectLayer.js +734 -0
  97. package/Layers/thinEffectLayer.js.map +1 -0
  98. package/Layers/thinGlowLayer.d.ts +141 -0
  99. package/Layers/thinGlowLayer.js +292 -0
  100. package/Layers/thinGlowLayer.js.map +1 -0
  101. package/Lights/Shadows/shadowGenerator.js +40 -19
  102. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  103. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js +17 -11
  104. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js.map +1 -1
  105. package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js +18 -12
  106. package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js.map +1 -1
  107. package/Materials/Node/Blocks/Input/inputBlock.js +34 -2
  108. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  109. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +34 -24
  110. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
  111. package/Materials/Node/nodeMaterial.d.ts +10 -0
  112. package/Materials/Node/nodeMaterial.js +12 -0
  113. package/Materials/Node/nodeMaterial.js.map +1 -1
  114. package/Materials/PBR/pbrBaseMaterial.d.ts +5 -0
  115. package/Materials/PBR/pbrBaseMaterial.js +5 -0
  116. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  117. package/Materials/Textures/renderTargetTexture.d.ts +12 -0
  118. package/Materials/Textures/renderTargetTexture.js +29 -8
  119. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  120. package/Materials/materialHelper.functions.d.ts +17 -1
  121. package/Materials/materialHelper.functions.js +76 -4
  122. package/Materials/materialHelper.functions.js.map +1 -1
  123. package/Materials/shaderMaterial.d.ts +5 -4
  124. package/Materials/shaderMaterial.js +28 -51
  125. package/Materials/shaderMaterial.js.map +1 -1
  126. package/Materials/standardMaterial.d.ts +5 -0
  127. package/Materials/standardMaterial.js +5 -0
  128. package/Materials/standardMaterial.js.map +1 -1
  129. package/Meshes/Builders/greasedLineBuilder.d.ts +1 -1
  130. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +22 -22
  131. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  132. package/Meshes/GreasedLine/greasedLineBaseMesh.js +1 -0
  133. package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
  134. package/Meshes/abstractMesh.d.ts +1 -2
  135. package/Meshes/abstractMesh.js +1 -2
  136. package/Meshes/abstractMesh.js.map +1 -1
  137. package/Meshes/linesMesh.js +2 -2
  138. package/Meshes/linesMesh.js.map +1 -1
  139. package/Meshes/mesh.d.ts +30 -3
  140. package/Meshes/mesh.js +56 -29
  141. package/Meshes/mesh.js.map +1 -1
  142. package/Meshes/subMesh.js +16 -3
  143. package/Meshes/subMesh.js.map +1 -1
  144. package/Misc/fileTools.js +14 -7
  145. package/Misc/fileTools.js.map +1 -1
  146. package/Morph/morphTargetManager.d.ts +20 -0
  147. package/Morph/morphTargetManager.js +31 -1
  148. package/Morph/morphTargetManager.js.map +1 -1
  149. package/PostProcesses/volumetricLightScatteringPostProcess.js +15 -16
  150. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  151. package/Rendering/depthRenderer.js +13 -15
  152. package/Rendering/depthRenderer.js.map +1 -1
  153. package/Rendering/geometryBufferRenderer.js +13 -15
  154. package/Rendering/geometryBufferRenderer.js.map +1 -1
  155. package/Rendering/objectRenderer.d.ts +9 -2
  156. package/Rendering/objectRenderer.js +44 -7
  157. package/Rendering/objectRenderer.js.map +1 -1
  158. package/Rendering/outlineRenderer.js +13 -15
  159. package/Rendering/outlineRenderer.js.map +1 -1
  160. package/Shaders/ShadersInclude/morphTargetsVertex.js +16 -4
  161. package/Shaders/ShadersInclude/morphTargetsVertex.js.map +1 -1
  162. package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js +17 -5
  163. package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js.map +1 -1
  164. package/assetContainer.d.ts +43 -0
  165. package/assetContainer.js +67 -0
  166. package/assetContainer.js.map +1 -1
  167. package/package.json +1 -1
  168. package/scene.js +10 -3
  169. package/scene.js.map +1 -1
@@ -0,0 +1,734 @@
1
+ import { Observable } from "../Misc/observable.js";
2
+ import { Color4 } from "../Maths/math.color.js";
3
+ import { EngineStore } from "../Engines/engineStore.js";
4
+ import { VertexBuffer } from "../Buffers/buffer.js";
5
+ import { Material } from "../Materials/material.js";
6
+
7
+ import { EffectFallbacks } from "../Materials/effectFallbacks.js";
8
+ import { DrawWrapper } from "../Materials/drawWrapper.js";
9
+ import { addClipPlaneUniforms, bindClipPlane, prepareStringDefinesForClipPlanes } from "../Materials/clipPlaneMaterialHelper.js";
10
+ import { BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from "../Materials/materialHelper.functions.js";
11
+ import { ObjectRenderer } from "../Rendering/objectRenderer.js";
12
+ /**
13
+ * @internal
14
+ */
15
+ export class ThinEffectLayer {
16
+ /**
17
+ * Gets/sets the camera attached to the layer.
18
+ */
19
+ get camera() {
20
+ return this._options.camera;
21
+ }
22
+ set camera(camera) {
23
+ this._options.camera = camera;
24
+ }
25
+ /**
26
+ * Gets the rendering group id the layer should render in.
27
+ */
28
+ get renderingGroupId() {
29
+ return this._options.renderingGroupId;
30
+ }
31
+ set renderingGroupId(renderingGroupId) {
32
+ this._options.renderingGroupId = renderingGroupId;
33
+ }
34
+ /**
35
+ * Gets the object renderer used to render objects in the layer
36
+ */
37
+ get objectRenderer() {
38
+ return this._objectRenderer;
39
+ }
40
+ /**
41
+ * Gets the shader language used in this material.
42
+ */
43
+ get shaderLanguage() {
44
+ return this._shaderLanguage;
45
+ }
46
+ /**
47
+ * Sets a specific material to be used to render a mesh/a list of meshes in the layer
48
+ * @param mesh mesh or array of meshes
49
+ * @param material material to use by the layer when rendering the mesh(es). If undefined is passed, the specific material created by the layer will be used.
50
+ */
51
+ setMaterialForRendering(mesh, material) {
52
+ this._objectRenderer.setMaterialForRendering(mesh, material);
53
+ if (Array.isArray(mesh)) {
54
+ for (let i = 0; i < mesh.length; ++i) {
55
+ const currentMesh = mesh[i];
56
+ if (!material) {
57
+ delete this._materialForRendering[currentMesh.uniqueId];
58
+ }
59
+ else {
60
+ this._materialForRendering[currentMesh.uniqueId] = [currentMesh, material];
61
+ }
62
+ }
63
+ }
64
+ else {
65
+ if (!material) {
66
+ delete this._materialForRendering[mesh.uniqueId];
67
+ }
68
+ else {
69
+ this._materialForRendering[mesh.uniqueId] = [mesh, material];
70
+ }
71
+ }
72
+ }
73
+ /**
74
+ * Gets the intensity of the effect for a specific mesh.
75
+ * @param mesh The mesh to get the effect intensity for
76
+ * @returns The intensity of the effect for the mesh
77
+ */
78
+ getEffectIntensity(mesh) {
79
+ return this._effectIntensity[mesh.uniqueId] ?? 1;
80
+ }
81
+ /**
82
+ * Sets the intensity of the effect for a specific mesh.
83
+ * @param mesh The mesh to set the effect intensity for
84
+ * @param intensity The intensity of the effect for the mesh
85
+ */
86
+ setEffectIntensity(mesh, intensity) {
87
+ this._effectIntensity[mesh.uniqueId] = intensity;
88
+ }
89
+ /**
90
+ * Instantiates a new effect Layer
91
+ * @param name The name of the layer
92
+ * @param scene The scene to use the layer in
93
+ * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false
94
+ * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.
95
+ * @param _additionalImportShadersAsync Additional shaders to import when the layer is created
96
+ */
97
+ constructor(name, scene, forceGLSL = false, dontCheckIfReady = false, _additionalImportShadersAsync) {
98
+ this._additionalImportShadersAsync = _additionalImportShadersAsync;
99
+ this._vertexBuffers = {};
100
+ this._dontCheckIfReady = false;
101
+ /** @internal */
102
+ this._shouldRender = true;
103
+ /** @internal */
104
+ this._emissiveTextureAndColor = { texture: null, color: new Color4() };
105
+ /** @internal */
106
+ this._effectIntensity = {};
107
+ /** @internal */
108
+ this._postProcesses = [];
109
+ /**
110
+ * The clear color of the texture used to generate the glow map.
111
+ */
112
+ this.neutralColor = new Color4();
113
+ /**
114
+ * Specifies whether the effect layer is enabled or not.
115
+ */
116
+ this.isEnabled = true;
117
+ /**
118
+ * Specifies if the bounding boxes should be rendered normally or if they should undergo the effect of the layer
119
+ */
120
+ this.disableBoundingBoxesFromEffectLayer = false;
121
+ /**
122
+ * An event triggered when the effect layer has been disposed.
123
+ */
124
+ this.onDisposeObservable = new Observable();
125
+ /**
126
+ * An event triggered when the effect layer is about rendering the main texture with the glowy parts.
127
+ */
128
+ this.onBeforeRenderLayerObservable = new Observable();
129
+ /**
130
+ * An event triggered when the generated texture is being merged in the scene.
131
+ */
132
+ this.onBeforeComposeObservable = new Observable();
133
+ /**
134
+ * An event triggered when the mesh is rendered into the effect render target.
135
+ */
136
+ this.onBeforeRenderMeshToEffect = new Observable();
137
+ /**
138
+ * An event triggered after the mesh has been rendered into the effect render target.
139
+ */
140
+ this.onAfterRenderMeshToEffect = new Observable();
141
+ /**
142
+ * An event triggered when the generated texture has been merged in the scene.
143
+ */
144
+ this.onAfterComposeObservable = new Observable();
145
+ this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;
146
+ this._materialForRendering = {};
147
+ /** @internal */
148
+ this._shadersLoaded = false;
149
+ this.name = name;
150
+ this._scene = scene || EngineStore.LastCreatedScene;
151
+ this._dontCheckIfReady = dontCheckIfReady;
152
+ const engine = this._scene.getEngine();
153
+ if (engine.isWebGPU && !forceGLSL && !ThinEffectLayer.ForceGLSL) {
154
+ this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;
155
+ }
156
+ this._engine = this._scene.getEngine();
157
+ this._mergeDrawWrapper = [];
158
+ // Generate Buffers
159
+ this._generateIndexBuffer();
160
+ this._generateVertexBuffer();
161
+ }
162
+ /**
163
+ * Get the effect name of the layer.
164
+ * @returns The effect name
165
+ */
166
+ getEffectName() {
167
+ return "";
168
+ }
169
+ /**
170
+ * Checks for the readiness of the element composing the layer.
171
+ * @param _subMesh the mesh to check for
172
+ * @param _useInstances specify whether or not to use instances to render the mesh
173
+ * @returns true if ready otherwise, false
174
+ */
175
+ isReady(_subMesh, _useInstances) {
176
+ return true;
177
+ }
178
+ /** @internal */
179
+ _createMergeEffect() {
180
+ throw new Error("Effect Layer: no merge effect defined");
181
+ }
182
+ /** @internal */
183
+ _createTextureAndPostProcesses() { }
184
+ /** @internal */
185
+ _internalCompose(_effect, _renderIndex) { }
186
+ /** @internal */
187
+ _setEmissiveTextureAndColor(_mesh, _subMesh, _material) { }
188
+ /** @internal */
189
+ _numInternalDraws() {
190
+ return 1;
191
+ }
192
+ /** @internal */
193
+ _init(options) {
194
+ // Adapt options
195
+ this._options = {
196
+ alphaBlendingMode: 2,
197
+ camera: null,
198
+ renderingGroupId: -1,
199
+ ...options,
200
+ };
201
+ this._createObjectRenderer();
202
+ }
203
+ _generateIndexBuffer() {
204
+ // Indices
205
+ const indices = [];
206
+ indices.push(0);
207
+ indices.push(1);
208
+ indices.push(2);
209
+ indices.push(0);
210
+ indices.push(2);
211
+ indices.push(3);
212
+ this._indexBuffer = this._engine.createIndexBuffer(indices);
213
+ }
214
+ _generateVertexBuffer() {
215
+ // VBO
216
+ const vertices = [];
217
+ vertices.push(1, 1);
218
+ vertices.push(-1, 1);
219
+ vertices.push(-1, -1);
220
+ vertices.push(1, -1);
221
+ const vertexBuffer = new VertexBuffer(this._engine, vertices, VertexBuffer.PositionKind, false, false, 2);
222
+ this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer;
223
+ }
224
+ _createObjectRenderer() {
225
+ this._objectRenderer = new ObjectRenderer(`ObjectRenderer for thin effect layer ${this.name}`, this._scene, {
226
+ doNotChangeAspectRatio: true,
227
+ });
228
+ this._objectRenderer.activeCamera = this._options.camera;
229
+ this._objectRenderer.renderParticles = false;
230
+ this._objectRenderer.renderList = null;
231
+ // Prevent package size in es6 (getBoundingBoxRenderer might not be present)
232
+ const hasBoundingBoxRenderer = !!this._scene.getBoundingBoxRenderer;
233
+ let boundingBoxRendererEnabled = false;
234
+ if (hasBoundingBoxRenderer) {
235
+ this._objectRenderer.onBeforeRenderObservable.add(() => {
236
+ boundingBoxRendererEnabled = this._scene.getBoundingBoxRenderer().enabled;
237
+ this._scene.getBoundingBoxRenderer().enabled = !this.disableBoundingBoxesFromEffectLayer && boundingBoxRendererEnabled;
238
+ });
239
+ this._objectRenderer.onAfterRenderObservable.add(() => {
240
+ this._scene.getBoundingBoxRenderer().enabled = boundingBoxRendererEnabled;
241
+ });
242
+ }
243
+ this._objectRenderer.customIsReadyFunction = (mesh, refreshRate, preWarm) => {
244
+ if ((preWarm || refreshRate === 0) && mesh.subMeshes) {
245
+ for (let i = 0; i < mesh.subMeshes.length; ++i) {
246
+ const subMesh = mesh.subMeshes[i];
247
+ const material = subMesh.getMaterial();
248
+ const renderingMesh = subMesh.getRenderingMesh();
249
+ if (!material) {
250
+ continue;
251
+ }
252
+ const batch = renderingMesh._getInstancesRenderList(subMesh._id, !!subMesh.getReplacementMesh());
253
+ const hardwareInstancedRendering = batch.hardwareInstancedRendering[subMesh._id] || renderingMesh.hasThinInstances;
254
+ this._setEmissiveTextureAndColor(renderingMesh, subMesh, material);
255
+ if (!this._isSubMeshReady(subMesh, hardwareInstancedRendering, this._emissiveTextureAndColor.texture)) {
256
+ return false;
257
+ }
258
+ }
259
+ }
260
+ return true;
261
+ };
262
+ // Custom render function
263
+ this._objectRenderer.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {
264
+ this.onBeforeRenderLayerObservable.notifyObservers(this);
265
+ let index;
266
+ const engine = this._scene.getEngine();
267
+ if (depthOnlySubMeshes.length) {
268
+ engine.setColorWrite(false);
269
+ for (index = 0; index < depthOnlySubMeshes.length; index++) {
270
+ this._renderSubMesh(depthOnlySubMeshes.data[index]);
271
+ }
272
+ engine.setColorWrite(true);
273
+ }
274
+ for (index = 0; index < opaqueSubMeshes.length; index++) {
275
+ this._renderSubMesh(opaqueSubMeshes.data[index]);
276
+ }
277
+ for (index = 0; index < alphaTestSubMeshes.length; index++) {
278
+ this._renderSubMesh(alphaTestSubMeshes.data[index]);
279
+ }
280
+ const previousAlphaMode = engine.getAlphaMode();
281
+ for (index = 0; index < transparentSubMeshes.length; index++) {
282
+ const subMesh = transparentSubMeshes.data[index];
283
+ const material = subMesh.getMaterial();
284
+ if (material && material.needDepthPrePass) {
285
+ const engine = material.getScene().getEngine();
286
+ engine.setColorWrite(false);
287
+ this._renderSubMesh(subMesh);
288
+ engine.setColorWrite(true);
289
+ }
290
+ this._renderSubMesh(subMesh, true);
291
+ }
292
+ engine.setAlphaMode(previousAlphaMode);
293
+ };
294
+ }
295
+ /** @internal */
296
+ _addCustomEffectDefines(_defines) { }
297
+ /** @internal */
298
+ _internalIsSubMeshReady(subMesh, useInstances, emissiveTexture) {
299
+ const engine = this._scene.getEngine();
300
+ const mesh = subMesh.getMesh();
301
+ const renderingMaterial = mesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];
302
+ if (renderingMaterial) {
303
+ return renderingMaterial.isReadyForSubMesh(mesh, subMesh, useInstances);
304
+ }
305
+ const material = subMesh.getMaterial();
306
+ if (!material) {
307
+ return false;
308
+ }
309
+ if (this._useMeshMaterial(subMesh.getRenderingMesh())) {
310
+ return material.isReadyForSubMesh(subMesh.getMesh(), subMesh, useInstances);
311
+ }
312
+ const defines = [];
313
+ const attribs = [VertexBuffer.PositionKind];
314
+ let uv1 = false;
315
+ let uv2 = false;
316
+ // Diffuse
317
+ if (material) {
318
+ const needAlphaTest = material.needAlphaTesting();
319
+ const diffuseTexture = material.getAlphaTestTexture();
320
+ const needAlphaBlendFromDiffuse = diffuseTexture && diffuseTexture.hasAlpha && (material.useAlphaFromDiffuseTexture || material._useAlphaFromAlbedoTexture);
321
+ if (diffuseTexture && (needAlphaTest || needAlphaBlendFromDiffuse)) {
322
+ defines.push("#define DIFFUSE");
323
+ if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) && diffuseTexture.coordinatesIndex === 1) {
324
+ defines.push("#define DIFFUSEUV2");
325
+ uv2 = true;
326
+ }
327
+ else if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {
328
+ defines.push("#define DIFFUSEUV1");
329
+ uv1 = true;
330
+ }
331
+ if (needAlphaTest) {
332
+ defines.push("#define ALPHATEST");
333
+ defines.push("#define ALPHATESTVALUE 0.4");
334
+ }
335
+ if (!diffuseTexture.gammaSpace) {
336
+ defines.push("#define DIFFUSE_ISLINEAR");
337
+ }
338
+ }
339
+ const opacityTexture = material.opacityTexture;
340
+ if (opacityTexture) {
341
+ defines.push("#define OPACITY");
342
+ if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) && opacityTexture.coordinatesIndex === 1) {
343
+ defines.push("#define OPACITYUV2");
344
+ uv2 = true;
345
+ }
346
+ else if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {
347
+ defines.push("#define OPACITYUV1");
348
+ uv1 = true;
349
+ }
350
+ }
351
+ }
352
+ // Emissive
353
+ if (emissiveTexture) {
354
+ defines.push("#define EMISSIVE");
355
+ if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) && emissiveTexture.coordinatesIndex === 1) {
356
+ defines.push("#define EMISSIVEUV2");
357
+ uv2 = true;
358
+ }
359
+ else if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {
360
+ defines.push("#define EMISSIVEUV1");
361
+ uv1 = true;
362
+ }
363
+ if (!emissiveTexture.gammaSpace) {
364
+ defines.push("#define EMISSIVE_ISLINEAR");
365
+ }
366
+ }
367
+ // Vertex
368
+ if (mesh.useVertexColors && mesh.isVerticesDataPresent(VertexBuffer.ColorKind) && mesh.hasVertexAlpha && material.transparencyMode !== Material.MATERIAL_OPAQUE) {
369
+ attribs.push(VertexBuffer.ColorKind);
370
+ defines.push("#define VERTEXALPHA");
371
+ }
372
+ if (uv1) {
373
+ attribs.push(VertexBuffer.UVKind);
374
+ defines.push("#define UV1");
375
+ }
376
+ if (uv2) {
377
+ attribs.push(VertexBuffer.UV2Kind);
378
+ defines.push("#define UV2");
379
+ }
380
+ // Bones
381
+ const fallbacks = new EffectFallbacks();
382
+ if (mesh.useBones && mesh.computeBonesUsingShaders) {
383
+ attribs.push(VertexBuffer.MatricesIndicesKind);
384
+ attribs.push(VertexBuffer.MatricesWeightsKind);
385
+ if (mesh.numBoneInfluencers > 4) {
386
+ attribs.push(VertexBuffer.MatricesIndicesExtraKind);
387
+ attribs.push(VertexBuffer.MatricesWeightsExtraKind);
388
+ }
389
+ defines.push("#define NUM_BONE_INFLUENCERS " + mesh.numBoneInfluencers);
390
+ const skeleton = mesh.skeleton;
391
+ if (skeleton && skeleton.isUsingTextureForMatrices) {
392
+ defines.push("#define BONETEXTURE");
393
+ }
394
+ else {
395
+ defines.push("#define BonesPerMesh " + (skeleton ? skeleton.bones.length + 1 : 0));
396
+ }
397
+ if (mesh.numBoneInfluencers > 0) {
398
+ fallbacks.addCPUSkinningFallback(0, mesh);
399
+ }
400
+ }
401
+ else {
402
+ defines.push("#define NUM_BONE_INFLUENCERS 0");
403
+ }
404
+ // Morph targets
405
+ const numMorphInfluencers = mesh.morphTargetManager
406
+ ? PrepareDefinesAndAttributesForMorphTargets(mesh.morphTargetManager, defines, attribs, mesh, true, // usePositionMorph
407
+ false, // useNormalMorph
408
+ false, // useTangentMorph
409
+ uv1, // useUVMorph
410
+ uv2 // useUV2Morph
411
+ )
412
+ : 0;
413
+ // Instances
414
+ if (useInstances) {
415
+ defines.push("#define INSTANCES");
416
+ PushAttributesForInstances(attribs);
417
+ if (subMesh.getRenderingMesh().hasThinInstances) {
418
+ defines.push("#define THIN_INSTANCES");
419
+ }
420
+ }
421
+ // ClipPlanes
422
+ prepareStringDefinesForClipPlanes(material, this._scene, defines);
423
+ this._addCustomEffectDefines(defines);
424
+ // Get correct effect
425
+ const drawWrapper = subMesh._getDrawWrapper(undefined, true);
426
+ const cachedDefines = drawWrapper.defines;
427
+ const join = defines.join("\n");
428
+ if (cachedDefines !== join) {
429
+ const uniforms = [
430
+ "world",
431
+ "mBones",
432
+ "viewProjection",
433
+ "glowColor",
434
+ "morphTargetInfluences",
435
+ "morphTargetCount",
436
+ "boneTextureWidth",
437
+ "diffuseMatrix",
438
+ "emissiveMatrix",
439
+ "opacityMatrix",
440
+ "opacityIntensity",
441
+ "morphTargetTextureInfo",
442
+ "morphTargetTextureIndices",
443
+ "glowIntensity",
444
+ ];
445
+ addClipPlaneUniforms(uniforms);
446
+ drawWrapper.setEffect(this._engine.createEffect("glowMapGeneration", attribs, uniforms, ["diffuseSampler", "emissiveSampler", "opacitySampler", "boneSampler", "morphTargets"], join, fallbacks, undefined, undefined, { maxSimultaneousMorphTargets: numMorphInfluencers }, this._shaderLanguage, this._shadersLoaded
447
+ ? undefined
448
+ : async () => {
449
+ await this._importShadersAsync();
450
+ this._shadersLoaded = true;
451
+ }), join);
452
+ }
453
+ const effectIsReady = drawWrapper.effect.isReady();
454
+ return effectIsReady && (this._dontCheckIfReady || (!this._dontCheckIfReady && this.isLayerReady()));
455
+ }
456
+ /** @internal */
457
+ _isSubMeshReady(subMesh, useInstances, emissiveTexture) {
458
+ return this._internalIsSubMeshReady(subMesh, useInstances, emissiveTexture);
459
+ }
460
+ async _importShadersAsync() {
461
+ if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
462
+ await Promise.all([import("../ShadersWGSL/glowMapGeneration.vertex.js"), import("../ShadersWGSL/glowMapGeneration.fragment.js")]);
463
+ }
464
+ else {
465
+ await Promise.all([import("../Shaders/glowMapGeneration.vertex.js"), import("../Shaders/glowMapGeneration.fragment.js")]);
466
+ }
467
+ this._additionalImportShadersAsync?.();
468
+ }
469
+ /** @internal */
470
+ _internalIsLayerReady() {
471
+ let isReady = true;
472
+ for (let i = 0; i < this._postProcesses.length; i++) {
473
+ isReady = this._postProcesses[i].isReady() && isReady;
474
+ }
475
+ const numDraws = this._numInternalDraws();
476
+ for (let i = 0; i < numDraws; ++i) {
477
+ let currentEffect = this._mergeDrawWrapper[i];
478
+ if (!currentEffect) {
479
+ currentEffect = this._mergeDrawWrapper[i] = new DrawWrapper(this._engine);
480
+ currentEffect.setEffect(this._createMergeEffect());
481
+ }
482
+ isReady = currentEffect.effect.isReady() && isReady;
483
+ }
484
+ return isReady;
485
+ }
486
+ /**
487
+ * Checks if the layer is ready to be used.
488
+ * @returns true if the layer is ready to be used
489
+ */
490
+ isLayerReady() {
491
+ return this._internalIsLayerReady();
492
+ }
493
+ /**
494
+ * Renders the glowing part of the scene by blending the blurred glowing meshes on top of the rendered scene.
495
+ * @returns true if the rendering was successful
496
+ */
497
+ compose() {
498
+ if (!this._dontCheckIfReady && !this.isLayerReady()) {
499
+ return false;
500
+ }
501
+ const engine = this._scene.getEngine();
502
+ const numDraws = this._numInternalDraws();
503
+ this.onBeforeComposeObservable.notifyObservers(this);
504
+ const previousAlphaMode = engine.getAlphaMode();
505
+ for (let i = 0; i < numDraws; ++i) {
506
+ const currentEffect = this._mergeDrawWrapper[i];
507
+ // Render
508
+ engine.enableEffect(currentEffect);
509
+ engine.setState(false);
510
+ // VBOs
511
+ engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect.effect);
512
+ // Go Blend.
513
+ engine.setAlphaMode(this._options.alphaBlendingMode);
514
+ // Blends the map on the main canvas.
515
+ this._internalCompose(currentEffect.effect, i);
516
+ }
517
+ // Restore Alpha
518
+ engine.setAlphaMode(previousAlphaMode);
519
+ this.onAfterComposeObservable.notifyObservers(this);
520
+ return true;
521
+ }
522
+ /** @internal */
523
+ _internalHasMesh(mesh) {
524
+ if (this.renderingGroupId === -1 || mesh.renderingGroupId === this.renderingGroupId) {
525
+ return true;
526
+ }
527
+ return false;
528
+ }
529
+ /**
530
+ * Determine if a given mesh will be used in the current effect.
531
+ * @param mesh mesh to test
532
+ * @returns true if the mesh will be used
533
+ */
534
+ hasMesh(mesh) {
535
+ return this._internalHasMesh(mesh);
536
+ }
537
+ /** @internal */
538
+ _internalShouldRender() {
539
+ return this.isEnabled && this._shouldRender;
540
+ }
541
+ /**
542
+ * Returns true if the layer contains information to display, otherwise false.
543
+ * @returns true if the glow layer should be rendered
544
+ */
545
+ shouldRender() {
546
+ return this._internalShouldRender();
547
+ }
548
+ /** @internal */
549
+ _shouldRenderMesh(_mesh) {
550
+ return true;
551
+ }
552
+ /** @internal */
553
+ _internalCanRenderMesh(mesh, material) {
554
+ return !material.needAlphaBlendingForMesh(mesh);
555
+ }
556
+ /** @internal */
557
+ _canRenderMesh(mesh, material) {
558
+ return this._internalCanRenderMesh(mesh, material);
559
+ }
560
+ _renderSubMesh(subMesh, enableAlphaMode = false) {
561
+ if (!this._internalShouldRender()) {
562
+ return;
563
+ }
564
+ const material = subMesh.getMaterial();
565
+ const ownerMesh = subMesh.getMesh();
566
+ const replacementMesh = subMesh.getReplacementMesh();
567
+ const renderingMesh = subMesh.getRenderingMesh();
568
+ const effectiveMesh = subMesh.getEffectiveMesh();
569
+ const scene = this._scene;
570
+ const engine = scene.getEngine();
571
+ effectiveMesh._internalAbstractMeshDataInfo._isActiveIntermediate = false;
572
+ if (!material) {
573
+ return;
574
+ }
575
+ // Do not block in blend mode.
576
+ if (!this._canRenderMesh(renderingMesh, material)) {
577
+ return;
578
+ }
579
+ // Culling
580
+ let sideOrientation = material._getEffectiveOrientation(renderingMesh);
581
+ const mainDeterminant = effectiveMesh._getWorldMatrixDeterminant();
582
+ if (mainDeterminant < 0) {
583
+ sideOrientation = sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;
584
+ }
585
+ const reverse = sideOrientation === Material.ClockWiseSideOrientation;
586
+ engine.setState(material.backFaceCulling, material.zOffset, undefined, reverse, material.cullBackFaces, undefined, material.zOffsetUnits);
587
+ // Managing instances
588
+ const batch = renderingMesh._getInstancesRenderList(subMesh._id, !!replacementMesh);
589
+ if (batch.mustReturn) {
590
+ return;
591
+ }
592
+ // Early Exit per mesh
593
+ if (!this._shouldRenderMesh(renderingMesh)) {
594
+ return;
595
+ }
596
+ const hardwareInstancedRendering = batch.hardwareInstancedRendering[subMesh._id] || renderingMesh.hasThinInstances;
597
+ this._setEmissiveTextureAndColor(renderingMesh, subMesh, material);
598
+ this.onBeforeRenderMeshToEffect.notifyObservers(ownerMesh);
599
+ if (this._useMeshMaterial(renderingMesh)) {
600
+ subMesh.getMaterial()._glowModeEnabled = true;
601
+ renderingMesh.render(subMesh, enableAlphaMode, replacementMesh || undefined);
602
+ subMesh.getMaterial()._glowModeEnabled = false;
603
+ }
604
+ else if (this._isSubMeshReady(subMesh, hardwareInstancedRendering, this._emissiveTextureAndColor.texture)) {
605
+ const renderingMaterial = effectiveMesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];
606
+ let drawWrapper = subMesh._getDrawWrapper();
607
+ if (!drawWrapper && renderingMaterial) {
608
+ drawWrapper = renderingMaterial._getDrawWrapper();
609
+ }
610
+ if (!drawWrapper) {
611
+ return;
612
+ }
613
+ const effect = drawWrapper.effect;
614
+ engine.enableEffect(drawWrapper);
615
+ if (!hardwareInstancedRendering) {
616
+ renderingMesh._bind(subMesh, effect, material.fillMode);
617
+ }
618
+ if (!renderingMaterial) {
619
+ effect.setMatrix("viewProjection", scene.getTransformMatrix());
620
+ effect.setMatrix("world", effectiveMesh.getWorldMatrix());
621
+ effect.setFloat4("glowColor", this._emissiveTextureAndColor.color.r, this._emissiveTextureAndColor.color.g, this._emissiveTextureAndColor.color.b, this._emissiveTextureAndColor.color.a);
622
+ }
623
+ else {
624
+ renderingMaterial.bindForSubMesh(effectiveMesh.getWorldMatrix(), effectiveMesh, subMesh);
625
+ }
626
+ if (!renderingMaterial) {
627
+ const needAlphaTest = material.needAlphaTesting();
628
+ const diffuseTexture = material.getAlphaTestTexture();
629
+ const needAlphaBlendFromDiffuse = diffuseTexture && diffuseTexture.hasAlpha && (material.useAlphaFromDiffuseTexture || material._useAlphaFromAlbedoTexture);
630
+ if (diffuseTexture && (needAlphaTest || needAlphaBlendFromDiffuse)) {
631
+ effect.setTexture("diffuseSampler", diffuseTexture);
632
+ const textureMatrix = diffuseTexture.getTextureMatrix();
633
+ if (textureMatrix) {
634
+ effect.setMatrix("diffuseMatrix", textureMatrix);
635
+ }
636
+ }
637
+ const opacityTexture = material.opacityTexture;
638
+ if (opacityTexture) {
639
+ effect.setTexture("opacitySampler", opacityTexture);
640
+ effect.setFloat("opacityIntensity", opacityTexture.level);
641
+ const textureMatrix = opacityTexture.getTextureMatrix();
642
+ if (textureMatrix) {
643
+ effect.setMatrix("opacityMatrix", textureMatrix);
644
+ }
645
+ }
646
+ // Glow emissive only
647
+ if (this._emissiveTextureAndColor.texture) {
648
+ effect.setTexture("emissiveSampler", this._emissiveTextureAndColor.texture);
649
+ effect.setMatrix("emissiveMatrix", this._emissiveTextureAndColor.texture.getTextureMatrix());
650
+ }
651
+ // Bones
652
+ if (renderingMesh.useBones && renderingMesh.computeBonesUsingShaders && renderingMesh.skeleton) {
653
+ const skeleton = renderingMesh.skeleton;
654
+ if (skeleton.isUsingTextureForMatrices) {
655
+ const boneTexture = skeleton.getTransformMatrixTexture(renderingMesh);
656
+ if (!boneTexture) {
657
+ return;
658
+ }
659
+ effect.setTexture("boneSampler", boneTexture);
660
+ effect.setFloat("boneTextureWidth", 4.0 * (skeleton.bones.length + 1));
661
+ }
662
+ else {
663
+ effect.setMatrices("mBones", skeleton.getTransformMatrices(renderingMesh));
664
+ }
665
+ }
666
+ // Morph targets
667
+ BindMorphTargetParameters(renderingMesh, effect);
668
+ if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {
669
+ renderingMesh.morphTargetManager._bind(effect);
670
+ }
671
+ // Alpha mode
672
+ if (enableAlphaMode) {
673
+ engine.setAlphaMode(material.alphaMode);
674
+ }
675
+ // Intensity of effect
676
+ effect.setFloat("glowIntensity", this.getEffectIntensity(renderingMesh));
677
+ // Clip planes
678
+ bindClipPlane(effect, material, scene);
679
+ }
680
+ // Draw
681
+ renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering, (isInstance, world) => effect.setMatrix("world", world));
682
+ }
683
+ else {
684
+ // Need to reset refresh rate of the main map
685
+ this._objectRenderer.resetRefreshCounter();
686
+ }
687
+ this.onAfterRenderMeshToEffect.notifyObservers(ownerMesh);
688
+ }
689
+ /** @internal */
690
+ _useMeshMaterial(_mesh) {
691
+ return false;
692
+ }
693
+ /** @internal */
694
+ _rebuild() {
695
+ const vb = this._vertexBuffers[VertexBuffer.PositionKind];
696
+ if (vb) {
697
+ vb._rebuild();
698
+ }
699
+ this._generateIndexBuffer();
700
+ }
701
+ /**
702
+ * Dispose the effect layer and free resources.
703
+ */
704
+ dispose() {
705
+ const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];
706
+ if (vertexBuffer) {
707
+ vertexBuffer.dispose();
708
+ this._vertexBuffers[VertexBuffer.PositionKind] = null;
709
+ }
710
+ if (this._indexBuffer) {
711
+ this._scene.getEngine()._releaseBuffer(this._indexBuffer);
712
+ this._indexBuffer = null;
713
+ }
714
+ for (const drawWrapper of this._mergeDrawWrapper) {
715
+ drawWrapper.dispose();
716
+ }
717
+ this._mergeDrawWrapper = [];
718
+ this._objectRenderer.dispose();
719
+ // Callback
720
+ this.onDisposeObservable.notifyObservers(this);
721
+ this.onDisposeObservable.clear();
722
+ this.onBeforeRenderLayerObservable.clear();
723
+ this.onBeforeComposeObservable.clear();
724
+ this.onBeforeRenderMeshToEffect.clear();
725
+ this.onAfterRenderMeshToEffect.clear();
726
+ this.onAfterComposeObservable.clear();
727
+ }
728
+ }
729
+ /**
730
+ * Force all the effect layers to compile to glsl even on WebGPU engines.
731
+ * False by default. This is mostly meant for backward compatibility.
732
+ */
733
+ ThinEffectLayer.ForceGLSL = false;
734
+ //# sourceMappingURL=thinEffectLayer.js.map