@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
@@ -1,7 +1,7 @@
1
1
  import { ThinEngine } from "../../Engines/thinEngine.js";
2
2
 
3
- ThinEngine.prototype.setAlphaMode = function (mode, noDepthWriteChange = false) {
4
- if (this._alphaMode === mode) {
3
+ ThinEngine.prototype.setAlphaMode = function (mode, noDepthWriteChange = false, targetIndex = 0) {
4
+ if (this._alphaMode[targetIndex] === mode) {
5
5
  if (!noDepthWriteChange) {
6
6
  // Make sure we still have the correct depth mask according to the alpha mode (a transparent material could have forced writting to the depth buffer, for instance)
7
7
  const depthMask = mode === 0;
@@ -11,83 +11,12 @@ ThinEngine.prototype.setAlphaMode = function (mode, noDepthWriteChange = false)
11
11
  }
12
12
  return;
13
13
  }
14
- switch (mode) {
15
- case 0:
16
- this._alphaState.alphaBlend = false;
17
- break;
18
- case 7:
19
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE);
20
- this._alphaState.alphaBlend = true;
21
- break;
22
- case 8:
23
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);
24
- this._alphaState.alphaBlend = true;
25
- break;
26
- case 2:
27
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE);
28
- this._alphaState.alphaBlend = true;
29
- break;
30
- case 6:
31
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ZERO, this._gl.ONE);
32
- this._alphaState.alphaBlend = true;
33
- break;
34
- case 1:
35
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ONE);
36
- this._alphaState.alphaBlend = true;
37
- break;
38
- case 3:
39
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.ZERO, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE);
40
- this._alphaState.alphaBlend = true;
41
- break;
42
- case 4:
43
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_COLOR, this._gl.ZERO, this._gl.ONE, this._gl.ONE);
44
- this._alphaState.alphaBlend = true;
45
- break;
46
- case 5:
47
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE);
48
- this._alphaState.alphaBlend = true;
49
- break;
50
- case 9:
51
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.CONSTANT_COLOR, this._gl.ONE_MINUS_CONSTANT_COLOR, this._gl.CONSTANT_ALPHA, this._gl.ONE_MINUS_CONSTANT_ALPHA);
52
- this._alphaState.alphaBlend = true;
53
- break;
54
- case 10:
55
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);
56
- this._alphaState.alphaBlend = true;
57
- break;
58
- case 11:
59
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ONE);
60
- this._alphaState.alphaBlend = true;
61
- break;
62
- case 12:
63
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ZERO);
64
- this._alphaState.alphaBlend = true;
65
- break;
66
- case 13:
67
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE_MINUS_DST_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA);
68
- this._alphaState.alphaBlend = true;
69
- break;
70
- case 14:
71
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);
72
- this._alphaState.alphaBlend = true;
73
- break;
74
- case 15:
75
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ZERO);
76
- this._alphaState.alphaBlend = true;
77
- break;
78
- case 16:
79
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ZERO, this._gl.ONE);
80
- this._alphaState.alphaBlend = true;
81
- break;
82
- case 17:
83
- // Same as ALPHA_COMBINE but accumulates (1 - alpha) values in the alpha channel for a later readout in order independant transparency
84
- this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);
85
- this._alphaState.alphaBlend = true;
86
- break;
87
- }
14
+ const alphaBlendDisabled = mode === 0;
15
+ this._alphaState.setAlphaBlend(!alphaBlendDisabled, targetIndex);
16
+ this._alphaState.setAlphaMode(mode, targetIndex);
88
17
  if (!noDepthWriteChange) {
89
- this.depthCullingState.depthMask = mode === 0;
18
+ this.depthCullingState.depthMask = alphaBlendDisabled;
90
19
  }
91
- this._alphaMode = mode;
20
+ this._alphaMode[targetIndex] = mode;
92
21
  };
93
22
  //# sourceMappingURL=engine.alpha.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.alpha.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Extensions/engine.alpha.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAezC,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,IAAY,EAAE,qBAA8B,KAAK;IAC3F,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACtB,mKAAmK;YACnK,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC,aAAa,CAAC;YACnD,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACjD,IAAI,CAAC,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;YACjD,CAAC;QACL,CAAC;QACD,OAAO;IACX,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,SAAS,CAAC,aAAa;YACxB,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,KAAK,CAAC;YACpC,MAAM;QACV,KAAK,SAAS,CAAC,mBAAmB;YAC9B,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzH,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,8BAA8B;YACzC,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACzI,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,aAAa;YACxB,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/H,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,YAAY;YACvB,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1G,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,SAAS;YACpB,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChH,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,cAAc;YACzB,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1H,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,cAAc;YACzB,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChH,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,eAAe;YAC1B,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/H,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,iBAAiB;YAC5B,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAC5C,IAAI,CAAC,GAAG,CAAC,cAAc,EACvB,IAAI,CAAC,GAAG,CAAC,wBAAwB,EACjC,IAAI,CAAC,GAAG,CAAC,cAAc,EACvB,IAAI,CAAC,GAAG,CAAC,wBAAwB,CACpC,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,gBAAgB;YAC3B,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACzI,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,mBAAmB;YAC9B,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzG,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,kBAAkB;YAC7B,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjH,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,qBAAqB;YAChC,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAC5C,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAC5B,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAC5B,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAC5B,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAC/B,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,6BAA6B;YACxC,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACzI,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,oBAAoB;YAC/B,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1G,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,eAAe;YAC1B,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1I,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;QACV,KAAK,SAAS,CAAC,sBAAsB;YACjC,sIAAsI;YACtI,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAC/I,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YACnC,MAAM;IACd,CAAC;IACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtB,IAAI,CAAC,iBAAiB,CAAC,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC,aAAa,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AAC3B,CAAC,CAAC","sourcesContent":["import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { Constants } from \"../constants\";\r\n\r\ndeclare module \"../abstractEngine\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractEngine {\r\n /**\r\n * Sets the current alpha mode\r\n * @param mode defines the mode to use (one of the Engine.ALPHA_XXX)\r\n * @param noDepthWriteChange defines if depth writing state should remains unchanged (false by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering\r\n */\r\n setAlphaMode(mode: number, noDepthWriteChange?: boolean): void;\r\n }\r\n}\r\n\r\nThinEngine.prototype.setAlphaMode = function (mode: number, noDepthWriteChange: boolean = false): void {\r\n if (this._alphaMode === mode) {\r\n if (!noDepthWriteChange) {\r\n // Make sure we still have the correct depth mask according to the alpha mode (a transparent material could have forced writting to the depth buffer, for instance)\r\n const depthMask = mode === Constants.ALPHA_DISABLE;\r\n if (this.depthCullingState.depthMask !== depthMask) {\r\n this.depthCullingState.depthMask = depthMask;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n switch (mode) {\r\n case Constants.ALPHA_DISABLE:\r\n this._alphaState.alphaBlend = false;\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED_PORTERDUFF:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_COMBINE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ZERO, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ADD:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SUBTRACT:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ZERO, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_MULTIPLY:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_COLOR, this._gl.ZERO, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_MAXIMIZED:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_INTERPOLATE:\r\n this._alphaState.setAlphaBlendFunctionParameters(\r\n this._gl.CONSTANT_COLOR,\r\n this._gl.ONE_MINUS_CONSTANT_COLOR,\r\n this._gl.CONSTANT_ALPHA,\r\n this._gl.ONE_MINUS_CONSTANT_ALPHA\r\n );\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SCREENMODE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEONE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ALPHATOCOLOR:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ZERO);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_REVERSEONEMINUS:\r\n this._alphaState.setAlphaBlendFunctionParameters(\r\n this._gl.ONE_MINUS_DST_COLOR,\r\n this._gl.ONE_MINUS_SRC_COLOR,\r\n this._gl.ONE_MINUS_DST_ALPHA,\r\n this._gl.ONE_MINUS_SRC_ALPHA\r\n );\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEZERO:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ZERO);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_EXCLUSION:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ZERO, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_LAYER_ACCUMULATE:\r\n // Same as ALPHA_COMBINE but accumulates (1 - alpha) values in the alpha channel for a later readout in order independant transparency\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n }\r\n if (!noDepthWriteChange) {\r\n this.depthCullingState.depthMask = mode === Constants.ALPHA_DISABLE;\r\n }\r\n this._alphaMode = mode;\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.alpha.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Extensions/engine.alpha.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAgBzC,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,IAAY,EAAE,qBAA8B,KAAK,EAAE,cAAsB,CAAC;IACpH,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACtB,mKAAmK;YACnK,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC,aAAa,CAAC;YACnD,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACjD,IAAI,CAAC,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;YACjD,CAAC;QACL,CAAC;QACD,OAAO;IACX,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAI,KAAK,SAAS,CAAC,aAAa,CAAC;IAE5D,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IACjE,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAEjD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtB,IAAI,CAAC,iBAAiB,CAAC,SAAS,GAAG,kBAAkB,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;AACxC,CAAC,CAAC","sourcesContent":["import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { Constants } from \"../constants\";\r\n\r\ndeclare module \"../abstractEngine\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractEngine {\r\n /**\r\n * Sets the current alpha mode\r\n * @param mode defines the mode to use (one of the Engine.ALPHA_XXX)\r\n * @param noDepthWriteChange defines if depth writing state should remains unchanged (false by default)\r\n * @param targetIndex defines the index of the target to set the alpha mode for (default is 0)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering\r\n */\r\n setAlphaMode(mode: number, noDepthWriteChange?: boolean, targetIndex?: number): void;\r\n }\r\n}\r\n\r\nThinEngine.prototype.setAlphaMode = function (mode: number, noDepthWriteChange: boolean = false, targetIndex: number = 0): void {\r\n if (this._alphaMode[targetIndex] === mode) {\r\n if (!noDepthWriteChange) {\r\n // Make sure we still have the correct depth mask according to the alpha mode (a transparent material could have forced writting to the depth buffer, for instance)\r\n const depthMask = mode === Constants.ALPHA_DISABLE;\r\n if (this.depthCullingState.depthMask !== depthMask) {\r\n this.depthCullingState.depthMask = depthMask;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const alphaBlendDisabled = mode === Constants.ALPHA_DISABLE;\r\n\r\n this._alphaState.setAlphaBlend(!alphaBlendDisabled, targetIndex);\r\n this._alphaState.setAlphaMode(mode, targetIndex);\r\n\r\n if (!noDepthWriteChange) {\r\n this.depthCullingState.depthMask = alphaBlendDisabled;\r\n }\r\n this._alphaMode[targetIndex] = mode;\r\n};\r\n"]}
@@ -22,13 +22,20 @@ export class WebGL2ShaderProcessor {
22
22
  code = code.replace(/texture2D\s*\(/g, "texture(");
23
23
  if (isFragment) {
24
24
  const hasOutput = code.search(/layout *\(location *= *0\) *out/g) !== -1;
25
+ const hasDualSourceBlending = defines.indexOf("#define DUAL_SOURCE_BLENDING") !== -1;
26
+ const outputDeclaration = hasDualSourceBlending
27
+ ? "layout(location = 0, index = 0) out vec4 glFragColor;\nlayout(location = 0, index = 1) out vec4 glFragColor2;\n"
28
+ : "layout(location = 0) out vec4 glFragColor;\n";
29
+ if (hasDualSourceBlending) {
30
+ code = "#extension GL_EXT_blend_func_extended : require\n" + code;
31
+ }
25
32
  code = code.replace(/texture2DLodEXT\s*\(/g, "textureLod(");
26
33
  code = code.replace(/textureCubeLodEXT\s*\(/g, "textureLod(");
27
34
  code = code.replace(/textureCube\s*\(/g, "texture(");
28
35
  code = code.replace(/gl_FragDepthEXT/g, "gl_FragDepth");
29
36
  code = code.replace(/gl_FragColor/g, "glFragColor");
30
37
  code = code.replace(/gl_FragData/g, "glFragData");
31
- code = code.replace(/void\s+?main\s*\(/g, (hasDrawBuffersExtension || hasOutput ? "" : "layout(location = 0) out vec4 glFragColor;\n") + "void main(");
38
+ code = code.replace(/void\s+?main\s*\(/g, (hasDrawBuffersExtension || hasOutput ? "" : outputDeclaration) + "void main(");
32
39
  }
33
40
  else {
34
41
  const hasMultiviewExtension = defines.indexOf("#define MULTIVIEW") !== -1;
@@ -1 +1 @@
1
- {"version":3,"file":"webGL2ShaderProcessors.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGL/webGL2ShaderProcessors.ts"],"names":[],"mappings":"AAGA,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEhD,gBAAgB;AAChB,MAAM,OAAO,qBAAqB;IAAlC;QACW,mBAAc,+BAAuB;IA0ChD,CAAC;IAxCU,kBAAkB,CAAC,SAAiB;QACvC,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAEM,YAAY,CAAC,OAAe,EAAE,WAAoB;QACrD,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAEM,gBAAgB,CAAC,OAAe,EAAE,UAAmB;QACxD,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAEM,aAAa,CAAC,IAAY,EAAE,OAAiB,EAAE,UAAmB;QACrE,MAAM,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC,0CAA0C,CAAC,KAAK,CAAC,CAAC,CAAC;QAE/F,oBAAoB;QACpB,MAAM,KAAK,GAAG,gJAAgJ,CAAC;QAC/J,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE/B,uBAAuB;QACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,kCAAkC,CAAC,KAAK,CAAC,CAAC,CAAC;YAEzE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;YAC5D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;YAC9D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;YACxD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;YACpD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YAClD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,uBAAuB,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,8CAA8C,CAAC,GAAG,YAAY,CAAC,CAAC;QAC3J,CAAC;aAAM,CAAC;YACJ,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1E,IAAI,qBAAqB,EAAE,CAAC;gBACxB,OAAO,sEAAsE,GAAG,IAAI,CAAC;YACzF,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ","sourcesContent":["import { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\nimport type { IShaderProcessor } from \"../Processors/iShaderProcessor\";\r\n\r\nconst VaryingRegex = /(flat\\s)?\\s*varying\\s*.*/;\r\n\r\n/** @internal */\r\nexport class WebGL2ShaderProcessor implements IShaderProcessor {\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n public attributeProcessor(attribute: string) {\r\n return attribute.replace(\"attribute\", \"in\");\r\n }\r\n\r\n public varyingCheck(varying: string, _isFragment: boolean) {\r\n return VaryingRegex.test(varying);\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean) {\r\n return varying.replace(\"varying\", isFragment ? \"in\" : \"out\");\r\n }\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean) {\r\n const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1;\r\n\r\n // Remove extensions\r\n const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n\r\n // Replace instructions\r\n code = code.replace(/texture2D\\s*\\(/g, \"texture(\");\r\n if (isFragment) {\r\n const hasOutput = code.search(/layout *\\(location *= *0\\) *out/g) !== -1;\r\n\r\n code = code.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCube\\s*\\(/g, \"texture(\");\r\n code = code.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\");\r\n code = code.replace(/gl_FragColor/g, \"glFragColor\");\r\n code = code.replace(/gl_FragData/g, \"glFragData\");\r\n code = code.replace(/void\\s+?main\\s*\\(/g, (hasDrawBuffersExtension || hasOutput ? \"\" : \"layout(location = 0) out vec4 glFragColor;\\n\") + \"void main(\");\r\n } else {\r\n const hasMultiviewExtension = defines.indexOf(\"#define MULTIVIEW\") !== -1;\r\n if (hasMultiviewExtension) {\r\n return \"#extension GL_OVR_multiview2 : require\\nlayout (num_views = 2) in;\\n\" + code;\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webGL2ShaderProcessors.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGL/webGL2ShaderProcessors.ts"],"names":[],"mappings":"AAGA,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEhD,gBAAgB;AAChB,MAAM,OAAO,qBAAqB;IAAlC;QACW,mBAAc,+BAAuB;IAiDhD,CAAC;IA/CU,kBAAkB,CAAC,SAAiB;QACvC,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAEM,YAAY,CAAC,OAAe,EAAE,WAAoB;QACrD,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAEM,gBAAgB,CAAC,OAAe,EAAE,UAAmB;QACxD,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAEM,aAAa,CAAC,IAAY,EAAE,OAAiB,EAAE,UAAmB;QACrE,MAAM,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC,0CAA0C,CAAC,KAAK,CAAC,CAAC,CAAC;QAE/F,oBAAoB;QACpB,MAAM,KAAK,GAAG,gJAAgJ,CAAC;QAC/J,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE/B,uBAAuB;QACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,kCAAkC,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAC;YACrF,MAAM,iBAAiB,GAAG,qBAAqB;gBAC3C,CAAC,CAAC,iHAAiH;gBACnH,CAAC,CAAC,8CAA8C,CAAC;YAErD,IAAI,qBAAqB,EAAE,CAAC;gBACxB,IAAI,GAAG,mDAAmD,GAAG,IAAI,CAAC;YACtE,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;YAC5D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;YAC9D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;YACxD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;YACpD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YAClD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,uBAAuB,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,YAAY,CAAC,CAAC;QAC9H,CAAC;aAAM,CAAC;YACJ,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1E,IAAI,qBAAqB,EAAE,CAAC;gBACxB,OAAO,sEAAsE,GAAG,IAAI,CAAC;YACzF,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ","sourcesContent":["import { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\nimport type { IShaderProcessor } from \"../Processors/iShaderProcessor\";\r\n\r\nconst VaryingRegex = /(flat\\s)?\\s*varying\\s*.*/;\r\n\r\n/** @internal */\r\nexport class WebGL2ShaderProcessor implements IShaderProcessor {\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n public attributeProcessor(attribute: string) {\r\n return attribute.replace(\"attribute\", \"in\");\r\n }\r\n\r\n public varyingCheck(varying: string, _isFragment: boolean) {\r\n return VaryingRegex.test(varying);\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean) {\r\n return varying.replace(\"varying\", isFragment ? \"in\" : \"out\");\r\n }\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean) {\r\n const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1;\r\n\r\n // Remove extensions\r\n const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n\r\n // Replace instructions\r\n code = code.replace(/texture2D\\s*\\(/g, \"texture(\");\r\n if (isFragment) {\r\n const hasOutput = code.search(/layout *\\(location *= *0\\) *out/g) !== -1;\r\n const hasDualSourceBlending = defines.indexOf(\"#define DUAL_SOURCE_BLENDING\") !== -1;\r\n const outputDeclaration = hasDualSourceBlending\r\n ? \"layout(location = 0, index = 0) out vec4 glFragColor;\\nlayout(location = 0, index = 1) out vec4 glFragColor2;\\n\"\r\n : \"layout(location = 0) out vec4 glFragColor;\\n\";\r\n\r\n if (hasDualSourceBlending) {\r\n code = \"#extension GL_EXT_blend_func_extended : require\\n\" + code;\r\n }\r\n code = code.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCube\\s*\\(/g, \"texture(\");\r\n code = code.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\");\r\n code = code.replace(/gl_FragColor/g, \"glFragColor\");\r\n code = code.replace(/gl_FragData/g, \"glFragData\");\r\n code = code.replace(/void\\s+?main\\s*\\(/g, (hasDrawBuffersExtension || hasOutput ? \"\" : outputDeclaration) + \"void main(\");\r\n } else {\r\n const hasMultiviewExtension = defines.indexOf(\"#define MULTIVIEW\") !== -1;\r\n if (hasMultiviewExtension) {\r\n return \"#extension GL_OVR_multiview2 : require\\nlayout (num_views = 2) in;\\n\" + code;\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n"]}
@@ -5,8 +5,9 @@ declare module "../../abstractEngine.js" {
5
5
  * Sets the current alpha mode
6
6
  * @param mode defines the mode to use (one of the Engine.ALPHA_XXX)
7
7
  * @param noDepthWriteChange defines if depth writing state should remains unchanged (false by default)
8
+ * @param targetIndex defines the index of the target to set the alpha mode for (default is 0)
8
9
  * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering
9
10
  */
10
- setAlphaMode(mode: number, noDepthWriteChange?: boolean): void;
11
+ setAlphaMode(mode: number, noDepthWriteChange?: boolean, targetIndex?: number): void;
11
12
  }
12
13
  }
@@ -2,8 +2,9 @@ import { AbstractEngine } from "../../abstractEngine.js";
2
2
 
3
3
  import "../../AbstractEngine/abstractEngine.alpha.js";
4
4
  import { ThinWebGPUEngine } from "../../thinWebGPUEngine.js";
5
- ThinWebGPUEngine.prototype.setAlphaMode = function (mode, noDepthWriteChange = false) {
6
- if (this._alphaMode === mode && ((mode === 0 && !this._alphaState.alphaBlend) || (mode !== 0 && this._alphaState.alphaBlend))) {
5
+ ThinWebGPUEngine.prototype.setAlphaMode = function (mode, noDepthWriteChange = false, targetIndex = 0) {
6
+ const alphaBlend = this._alphaState._alphaBlend[targetIndex];
7
+ if (this._alphaMode[targetIndex] === mode && ((mode === 0 && !alphaBlend) || (mode !== 0 && alphaBlend))) {
7
8
  if (!noDepthWriteChange) {
8
9
  // Make sure we still have the correct depth mask according to the alpha mode (a transparent material could have forced writting to the depth buffer, for instance)
9
10
  const depthMask = mode === 0;
@@ -14,90 +15,19 @@ ThinWebGPUEngine.prototype.setAlphaMode = function (mode, noDepthWriteChange = f
14
15
  }
15
16
  return;
16
17
  }
17
- switch (mode) {
18
- case 0:
19
- this._alphaState.alphaBlend = false;
20
- break;
21
- case 7:
22
- this._alphaState.setAlphaBlendFunctionParameters(1, 771, 1, 1);
23
- this._alphaState.alphaBlend = true;
24
- break;
25
- case 8:
26
- this._alphaState.setAlphaBlendFunctionParameters(1, 771, 1, 771);
27
- this._alphaState.alphaBlend = true;
28
- break;
29
- case 2:
30
- this._alphaState.setAlphaBlendFunctionParameters(770, 771, 1, 1);
31
- this._alphaState.alphaBlend = true;
32
- break;
33
- case 6:
34
- this._alphaState.setAlphaBlendFunctionParameters(1, 1, 0, 1);
35
- this._alphaState.alphaBlend = true;
36
- break;
37
- case 1:
38
- this._alphaState.setAlphaBlendFunctionParameters(770, 1, 0, 1);
39
- this._alphaState.alphaBlend = true;
40
- break;
41
- case 3:
42
- this._alphaState.setAlphaBlendFunctionParameters(0, 769, 1, 1);
43
- this._alphaState.alphaBlend = true;
44
- break;
45
- case 4:
46
- this._alphaState.setAlphaBlendFunctionParameters(774, 0, 1, 1);
47
- this._alphaState.alphaBlend = true;
48
- break;
49
- case 5:
50
- this._alphaState.setAlphaBlendFunctionParameters(770, 769, 1, 1);
51
- this._alphaState.alphaBlend = true;
52
- break;
53
- case 9:
54
- this._alphaState.setAlphaBlendFunctionParameters(32769, 32770, 32771, 32772);
55
- this._alphaState.alphaBlend = true;
56
- break;
57
- case 10:
58
- this._alphaState.setAlphaBlendFunctionParameters(1, 769, 1, 771);
59
- this._alphaState.alphaBlend = true;
60
- break;
61
- case 11:
62
- this._alphaState.setAlphaBlendFunctionParameters(1, 1, 1, 1);
63
- this._alphaState.alphaBlend = true;
64
- break;
65
- case 12:
66
- this._alphaState.setAlphaBlendFunctionParameters(772, 1, 0, 0);
67
- this._alphaState.alphaBlend = true;
68
- break;
69
- case 13:
70
- this._alphaState.setAlphaBlendFunctionParameters(775, 769, 773, 771);
71
- this._alphaState.alphaBlend = true;
72
- break;
73
- case 14:
74
- this._alphaState.setAlphaBlendFunctionParameters(1, 771, 1, 771);
75
- this._alphaState.alphaBlend = true;
76
- break;
77
- case 15:
78
- this._alphaState.setAlphaBlendFunctionParameters(1, 1, 1, 0);
79
- this._alphaState.alphaBlend = true;
80
- break;
81
- case 16:
82
- this._alphaState.setAlphaBlendFunctionParameters(775, 769, 0, 1);
83
- this._alphaState.alphaBlend = true;
84
- break;
85
- case 17:
86
- // Same as ALPHA_COMBINE but accumulates (1 - alpha) values in the alpha channel for a later readout in order independant transparency
87
- this._alphaState.setAlphaBlendFunctionParameters(770, 771, 1, 771);
88
- this._alphaState.alphaBlend = true;
89
- break;
90
- }
18
+ const alphaBlendDisabled = mode === 0;
19
+ this._alphaState.setAlphaBlend(!alphaBlendDisabled, targetIndex);
20
+ this._alphaState.setAlphaMode(mode, targetIndex);
91
21
  if (!noDepthWriteChange) {
92
- this.setDepthWrite(mode === 0);
93
- this._cacheRenderPipeline.setDepthWriteEnabled(mode === 0);
22
+ this.setDepthWrite(alphaBlendDisabled);
23
+ this._cacheRenderPipeline.setDepthWriteEnabled(alphaBlendDisabled);
94
24
  }
95
- this._alphaMode = mode;
96
- this._cacheRenderPipeline.setAlphaBlendEnabled(this._alphaState.alphaBlend);
25
+ this._alphaMode[targetIndex] = mode;
26
+ this._cacheRenderPipeline.setAlphaBlendEnabled(this._alphaState._alphaBlend, this._alphaState._numTargetEnabled);
97
27
  this._cacheRenderPipeline.setAlphaBlendFactors(this._alphaState._blendFunctionParameters, this._alphaState._blendEquationParameters);
98
28
  };
99
- ThinWebGPUEngine.prototype.setAlphaEquation = function (equation) {
100
- AbstractEngine.prototype.setAlphaEquation.call(this, equation);
29
+ ThinWebGPUEngine.prototype.setAlphaEquation = function (equation, targetIndex = 0) {
30
+ AbstractEngine.prototype.setAlphaEquation.call(this, equation, targetIndex);
101
31
  this._cacheRenderPipeline.setAlphaBlendFactors(this._alphaState._blendFunctionParameters, this._alphaState._blendEquationParameters);
102
32
  };
103
33
  //# sourceMappingURL=engine.alpha.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.alpha.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.alpha.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { Constants } from \"../../constants\";\r\n\r\nimport \"../../AbstractEngine/abstractEngine.alpha\";\r\nimport { ThinWebGPUEngine } from \"core/Engines/thinWebGPUEngine\";\r\n\r\ndeclare module \"../../abstractEngine\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractEngine {\r\n /**\r\n * Sets the current alpha mode\r\n * @param mode defines the mode to use (one of the Engine.ALPHA_XXX)\r\n * @param noDepthWriteChange defines if depth writing state should remains unchanged (false by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering\r\n */\r\n setAlphaMode(mode: number, noDepthWriteChange?: boolean): void;\r\n }\r\n}\r\n\r\nThinWebGPUEngine.prototype.setAlphaMode = function (mode: number, noDepthWriteChange: boolean = false): void {\r\n if (this._alphaMode === mode && ((mode === Constants.ALPHA_DISABLE && !this._alphaState.alphaBlend) || (mode !== Constants.ALPHA_DISABLE && this._alphaState.alphaBlend))) {\r\n if (!noDepthWriteChange) {\r\n // Make sure we still have the correct depth mask according to the alpha mode (a transparent material could have forced writting to the depth buffer, for instance)\r\n const depthMask = mode === Constants.ALPHA_DISABLE;\r\n if (this.depthCullingState.depthMask !== depthMask) {\r\n this.setDepthWrite(depthMask);\r\n this._cacheRenderPipeline.setDepthWriteEnabled(depthMask);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n switch (mode) {\r\n case Constants.ALPHA_DISABLE:\r\n this._alphaState.alphaBlend = false;\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED:\r\n this._alphaState.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, 1);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED_PORTERDUFF:\r\n this._alphaState.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_COMBINE:\r\n this._alphaState.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, 1);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE:\r\n this._alphaState.setAlphaBlendFunctionParameters(1, 1, 0, 1);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ADD:\r\n this._alphaState.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, 1, 0, 1);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SUBTRACT:\r\n this._alphaState.setAlphaBlendFunctionParameters(0, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, 1);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_MULTIPLY:\r\n this._alphaState.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_DST_COLOR, 0, 1, 1);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_MAXIMIZED:\r\n this._alphaState.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, 1);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_INTERPOLATE:\r\n this._alphaState.setAlphaBlendFunctionParameters(\r\n Constants.GL_ALPHA_FUNCTION_CONSTANT_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_CONSTANT_ALPHA,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_ALPHA\r\n );\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SCREENMODE:\r\n this._alphaState.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEONE:\r\n this._alphaState.setAlphaBlendFunctionParameters(1, 1, 1, 1);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ALPHATOCOLOR:\r\n this._alphaState.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_DST_ALPHA, 1, 0, 0);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_REVERSEONEMINUS:\r\n this._alphaState.setAlphaBlendFunctionParameters(\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_ALPHA,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA\r\n );\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA:\r\n this._alphaState.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEZERO:\r\n this._alphaState.setAlphaBlendFunctionParameters(1, 1, 1, 0);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_EXCLUSION:\r\n this._alphaState.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 0, 1);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_LAYER_ACCUMULATE:\r\n // Same as ALPHA_COMBINE but accumulates (1 - alpha) values in the alpha channel for a later readout in order independant transparency\r\n this._alphaState.setAlphaBlendFunctionParameters(\r\n Constants.GL_ALPHA_FUNCTION_SRC_ALPHA,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA,\r\n 1,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA\r\n );\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n }\r\n if (!noDepthWriteChange) {\r\n this.setDepthWrite(mode === Constants.ALPHA_DISABLE);\r\n this._cacheRenderPipeline.setDepthWriteEnabled(mode === Constants.ALPHA_DISABLE);\r\n }\r\n this._alphaMode = mode;\r\n this._cacheRenderPipeline.setAlphaBlendEnabled(this._alphaState.alphaBlend);\r\n this._cacheRenderPipeline.setAlphaBlendFactors(this._alphaState._blendFunctionParameters, this._alphaState._blendEquationParameters);\r\n};\r\n\r\nThinWebGPUEngine.prototype.setAlphaEquation = function (equation: number): void {\r\n AbstractEngine.prototype.setAlphaEquation.call(this, equation);\r\n\r\n this._cacheRenderPipeline.setAlphaBlendFactors(this._alphaState._blendFunctionParameters, this._alphaState._blendEquationParameters);\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.alpha.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.alpha.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gCAAoC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,2CAA2C,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,kCAAsC;AAgBjE,gBAAgB,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,IAAY,EAAE,qBAA8B,KAAK,EAAE,cAAsB,CAAC;IAC1H,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAE7D,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,aAAa,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC;QACnJ,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACtB,mKAAmK;YACnK,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC,aAAa,CAAC;YACnD,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACjD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC9B,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAC9D,CAAC;QACL,CAAC;QACD,OAAO;IACX,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAI,KAAK,SAAS,CAAC,aAAa,CAAC;IAE5D,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IACjE,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAEjD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;QACvC,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IACpC,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACjH,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,wBAAwB,EAAE,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;AACzI,CAAC,CAAC;AAEF,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,QAAgB,EAAE,cAAsB,CAAC;IAC7F,cAAc,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE5E,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,wBAAwB,EAAE,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;AACzI,CAAC,CAAC","sourcesContent":["import { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { Constants } from \"../../constants\";\r\n\r\nimport \"../../AbstractEngine/abstractEngine.alpha\";\r\nimport { ThinWebGPUEngine } from \"core/Engines/thinWebGPUEngine\";\r\n\r\ndeclare module \"../../abstractEngine\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractEngine {\r\n /**\r\n * Sets the current alpha mode\r\n * @param mode defines the mode to use (one of the Engine.ALPHA_XXX)\r\n * @param noDepthWriteChange defines if depth writing state should remains unchanged (false by default)\r\n * @param targetIndex defines the index of the target to set the alpha mode for (default is 0)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering\r\n */\r\n setAlphaMode(mode: number, noDepthWriteChange?: boolean, targetIndex?: number): void;\r\n }\r\n}\r\n\r\nThinWebGPUEngine.prototype.setAlphaMode = function (mode: number, noDepthWriteChange: boolean = false, targetIndex: number = 0): void {\r\n const alphaBlend = this._alphaState._alphaBlend[targetIndex];\r\n\r\n if (this._alphaMode[targetIndex] === mode && ((mode === Constants.ALPHA_DISABLE && !alphaBlend) || (mode !== Constants.ALPHA_DISABLE && alphaBlend))) {\r\n if (!noDepthWriteChange) {\r\n // Make sure we still have the correct depth mask according to the alpha mode (a transparent material could have forced writting to the depth buffer, for instance)\r\n const depthMask = mode === Constants.ALPHA_DISABLE;\r\n if (this.depthCullingState.depthMask !== depthMask) {\r\n this.setDepthWrite(depthMask);\r\n this._cacheRenderPipeline.setDepthWriteEnabled(depthMask);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const alphaBlendDisabled = mode === Constants.ALPHA_DISABLE;\r\n\r\n this._alphaState.setAlphaBlend(!alphaBlendDisabled, targetIndex);\r\n this._alphaState.setAlphaMode(mode, targetIndex);\r\n\r\n if (!noDepthWriteChange) {\r\n this.setDepthWrite(alphaBlendDisabled);\r\n this._cacheRenderPipeline.setDepthWriteEnabled(alphaBlendDisabled);\r\n }\r\n this._alphaMode[targetIndex] = mode;\r\n this._cacheRenderPipeline.setAlphaBlendEnabled(this._alphaState._alphaBlend, this._alphaState._numTargetEnabled);\r\n this._cacheRenderPipeline.setAlphaBlendFactors(this._alphaState._blendFunctionParameters, this._alphaState._blendEquationParameters);\r\n};\r\n\r\nThinWebGPUEngine.prototype.setAlphaEquation = function (equation: number, targetIndex: number = 0): void {\r\n AbstractEngine.prototype.setAlphaEquation.call(this, equation, targetIndex);\r\n\r\n this._cacheRenderPipeline.setAlphaBlendFactors(this._alphaState._blendFunctionParameters, this._alphaState._blendEquationParameters);\r\n};\r\n"]}
@@ -33,15 +33,14 @@ export declare abstract class WebGPUCacheRenderPipeline {
33
33
  private _depthBiasSlopeScale;
34
34
  private _colorFormat;
35
35
  private _webgpuColorFormat;
36
- private _mrtAttachments1;
37
- private _mrtAttachments2;
36
+ private _mrtAttachments;
38
37
  private _mrtFormats;
39
38
  private _mrtEnabledMask;
40
39
  private _alphaBlendEnabled;
40
+ private _numAlphaBlendTargetsEnabled;
41
41
  private _alphaBlendFuncParams;
42
42
  private _alphaBlendEqParams;
43
43
  private _writeMask;
44
- private _colorStates;
45
44
  private _depthStencilFormat;
46
45
  private _webgpuDepthStencilFormat;
47
46
  private _depthTestEnabled;
@@ -52,6 +51,10 @@ export declare abstract class WebGPUCacheRenderPipeline {
52
51
  private _stencilFrontDepthFailOp;
53
52
  private _stencilFrontPassOp;
54
53
  private _stencilFrontFailOp;
54
+ private _stencilBackCompare;
55
+ private _stencilBackDepthFailOp;
56
+ private _stencilBackPassOp;
57
+ private _stencilBackFailOp;
55
58
  private _stencilReadMask;
56
59
  private _stencilWriteMask;
57
60
  private _depthStencilState;
@@ -89,7 +92,7 @@ export declare abstract class WebGPUCacheRenderPipeline {
89
92
  setColorFormat(format: GPUTextureFormat | null): void;
90
93
  setMRTAttachments(attachments: number[]): void;
91
94
  setMRT(textureArray: InternalTexture[], textureCount?: number): void;
92
- setAlphaBlendEnabled(enabled: boolean): void;
95
+ setAlphaBlendEnabled(enabled: boolean[], numAlphaBlendTargetsEnabled: number): void;
93
96
  setAlphaBlendFactors(factors: Array<Nullable<number>>, operations: Array<Nullable<number>>): void;
94
97
  setWriteMask(mask: number): void;
95
98
  setDepthStencilFormat(format: GPUTextureFormat | undefined): void;
@@ -101,10 +104,14 @@ export declare abstract class WebGPUCacheRenderPipeline {
101
104
  setStencilDepthFailOp(op: Nullable<number>): void;
102
105
  setStencilPassOp(op: Nullable<number>): void;
103
106
  setStencilFailOp(op: Nullable<number>): void;
107
+ setStencilBackCompare(func: Nullable<number>): void;
108
+ setStencilBackDepthFailOp(op: Nullable<number>): void;
109
+ setStencilBackPassOp(op: Nullable<number>): void;
110
+ setStencilBackFailOp(op: Nullable<number>): void;
104
111
  setStencilReadMask(mask: number): void;
105
112
  setStencilWriteMask(mask: number): void;
106
113
  resetStencilState(): void;
107
- setStencilState(stencilEnabled: boolean, compare: Nullable<number>, depthFailOp: Nullable<number>, passOp: Nullable<number>, failOp: Nullable<number>, readMask: number, writeMask: number): void;
114
+ setStencilState(stencilEnabled: boolean, compare: Nullable<number>, depthFailOp: Nullable<number>, passOp: Nullable<number>, failOp: Nullable<number>, readMask: number, writeMask: number, backCompare?: Nullable<number>, backDepthFailOp?: Nullable<number>, backPassOp?: Nullable<number>, backFailOp?: Nullable<number>): void;
108
115
  setBuffers(vertexBuffers: Nullable<{
109
116
  [key: string]: Nullable<VertexBuffer>;
110
117
  }>, indexBuffer: Nullable<DataBuffer>, overrideVertexBuffers: Nullable<{