@babylonjs/core 8.15.1 → 8.16.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 (153) hide show
  1. package/Animations/animationGroup.d.ts +3 -1
  2. package/Animations/animationGroup.js +3 -2
  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 +6 -0
  82. package/FrameGraph/frameGraph.js +8 -0
  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/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.d.ts +1 -0
  117. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +32 -10
  118. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
  119. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.d.ts +4 -0
  120. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js +5 -0
  121. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  122. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.d.ts +12 -3
  123. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.js +22 -1
  124. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.js.map +1 -1
  125. package/PostProcesses/thinPassPostProcess.js +7 -3
  126. package/PostProcesses/thinPassPostProcess.js.map +1 -1
  127. package/Rendering/edgesRenderer.js +3 -2
  128. package/Rendering/edgesRenderer.js.map +1 -1
  129. package/Rendering/geometryBufferRenderer.js +1 -1
  130. package/Rendering/geometryBufferRenderer.js.map +1 -1
  131. package/Rendering/outlineRenderer.js +1 -1
  132. package/Rendering/outlineRenderer.js.map +1 -1
  133. package/Shaders/lod.fragment.js +2 -3
  134. package/Shaders/lod.fragment.js.map +1 -1
  135. package/ShadersWGSL/lod.fragment.js +2 -2
  136. package/ShadersWGSL/lod.fragment.js.map +1 -1
  137. package/States/IStencilState.d.ts +6 -2
  138. package/States/IStencilState.js.map +1 -1
  139. package/States/alphaCullingState.d.ts +7 -5
  140. package/States/alphaCullingState.js +144 -33
  141. package/States/alphaCullingState.js.map +1 -1
  142. package/States/stencilState.d.ts +12 -0
  143. package/States/stencilState.js +29 -1
  144. package/States/stencilState.js.map +1 -1
  145. package/States/stencilStateComposer.d.ts +12 -0
  146. package/States/stencilStateComposer.js +48 -2
  147. package/States/stencilStateComposer.js.map +1 -1
  148. package/assetContainer.js +29 -8
  149. package/assetContainer.js.map +1 -1
  150. package/package.json +1 -1
  151. package/scene.d.ts +2 -1
  152. package/scene.js +1 -0
  153. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"outlineRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/outlineRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { _InstancesBatch } from \"../Meshes/mesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Scene } from \"../scene\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { ISceneComponent } from \"../sceneComponent\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\nimport { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from \"core/Materials/clipPlaneMaterialHelper\";\r\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from \"../Materials/materialHelper.functions\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport type { IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\ndeclare module \"../scene\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Scene {\r\n /** @internal */\r\n _outlineRenderer: OutlineRenderer;\r\n\r\n /**\r\n * Gets the outline renderer associated with the scene\r\n * @returns a OutlineRenderer\r\n */\r\n getOutlineRenderer(): OutlineRenderer;\r\n }\r\n}\r\n\r\n/**\r\n * Gets the outline renderer associated with the scene\r\n * @returns a OutlineRenderer\r\n */\r\nScene.prototype.getOutlineRenderer = function (): OutlineRenderer {\r\n if (!this._outlineRenderer) {\r\n this._outlineRenderer = new OutlineRenderer(this);\r\n }\r\n return this._outlineRenderer;\r\n};\r\n\r\ndeclare module \"../Meshes/abstractMesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractMesh {\r\n /** @internal (Backing field) */\r\n _renderOutline: boolean;\r\n /**\r\n * Gets or sets a boolean indicating if the outline must be rendered as well\r\n * @see https://www.babylonjs-playground.com/#10WJ5S#3\r\n */\r\n renderOutline: boolean;\r\n\r\n /** @internal (Backing field) */\r\n _renderOverlay: boolean;\r\n /**\r\n * Gets or sets a boolean indicating if the overlay must be rendered as well\r\n * @see https://www.babylonjs-playground.com/#10WJ5S#2\r\n */\r\n renderOverlay: boolean;\r\n }\r\n}\r\n\r\nObject.defineProperty(Mesh.prototype, \"renderOutline\", {\r\n get: function (this: Mesh) {\r\n return this._renderOutline;\r\n },\r\n set: function (this: Mesh, value: boolean) {\r\n if (value) {\r\n // Lazy Load the component.\r\n this.getScene().getOutlineRenderer();\r\n }\r\n this._renderOutline = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\nObject.defineProperty(Mesh.prototype, \"renderOverlay\", {\r\n get: function (this: Mesh) {\r\n return this._renderOverlay;\r\n },\r\n set: function (this: Mesh, value: boolean) {\r\n if (value) {\r\n // Lazy Load the component.\r\n this.getScene().getOutlineRenderer();\r\n }\r\n this._renderOverlay = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\n/**\r\n * This class is responsible to draw the outline/overlay of meshes.\r\n * It should not be used directly but through the available method on mesh.\r\n */\r\nexport class OutlineRenderer implements ISceneComponent {\r\n /**\r\n * Stencil value used to avoid outline being seen within the mesh when the mesh is transparent\r\n */\r\n private static _StencilReference = 0x04;\r\n /**\r\n * The name of the component. Each component must have a unique name.\r\n */\r\n public name = SceneComponentConstants.NAME_OUTLINERENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Defines a zOffset default Factor to prevent zFighting between the overlay and the mesh.\r\n */\r\n public zOffset = 1;\r\n\r\n /**\r\n * Defines a zOffset default Unit to prevent zFighting between the overlay and the mesh.\r\n */\r\n public zOffsetUnits = 4; // 4 to account for projection a bit by default\r\n\r\n private _engine: AbstractEngine;\r\n private _savedDepthWrite: boolean;\r\n private _passIdForDrawWrapper: number[];\r\n\r\n /** Shader language used by the Outline renderer. */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in the Outline renderer.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a new outline renderer. (There could be only one per scene).\r\n * @param scene Defines the scene it belongs to\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n this._engine = scene.getEngine();\r\n this.scene._addComponent(this);\r\n this._passIdForDrawWrapper = [];\r\n for (let i = 0; i < 4; ++i) {\r\n this._passIdForDrawWrapper[i] = this._engine.createRenderPassId(`Outline Renderer (${i})`);\r\n }\r\n\r\n const engine = this._engine;\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n }\r\n\r\n /**\r\n * Register the component to one instance of a scene.\r\n */\r\n public register(): void {\r\n this.scene._beforeRenderingMeshStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERINGMESH_OUTLINE, this, this._beforeRenderingMesh);\r\n this.scene._afterRenderingMeshStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERINGMESH_OUTLINE, this, this._afterRenderingMesh);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do here.\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources.\r\n */\r\n public dispose(): void {\r\n for (let i = 0; i < this._passIdForDrawWrapper.length; ++i) {\r\n this._engine.releaseRenderPassId(this._passIdForDrawWrapper[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Renders the outline in the canvas.\r\n * @param subMesh Defines the sumesh to render\r\n * @param batch Defines the batch of meshes in case of instances\r\n * @param useOverlay Defines if the rendering is for the overlay or the outline\r\n * @param renderPassId Render pass id to use to render the mesh\r\n */\r\n public render(subMesh: SubMesh, batch: _InstancesBatch, useOverlay: boolean = false, renderPassId?: number): void {\r\n renderPassId = renderPassId ?? this._passIdForDrawWrapper[0];\r\n\r\n const scene = this.scene;\r\n const engine = scene.getEngine();\r\n\r\n const hardwareInstancedRendering =\r\n engine.getCaps().instancedArrays &&\r\n ((batch.visibleInstances[subMesh._id] !== null && batch.visibleInstances[subMesh._id] !== undefined) || subMesh.getRenderingMesh().hasThinInstances);\r\n\r\n if (!this.isReady(subMesh, hardwareInstancedRendering, renderPassId)) {\r\n return;\r\n }\r\n\r\n const ownerMesh = subMesh.getMesh();\r\n const replacementMesh = ownerMesh._internalAbstractMeshDataInfo._actAsRegularMesh ? ownerMesh : null;\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n const effectiveMesh = replacementMesh ? replacementMesh : renderingMesh;\r\n const material = subMesh.getMaterial();\r\n\r\n if (!material || !scene.activeCamera) {\r\n return;\r\n }\r\n\r\n const drawWrapper = subMesh._getDrawWrapper(renderPassId)!;\r\n const effect = DrawWrapper.GetEffect(drawWrapper)!;\r\n\r\n engine.enableEffect(drawWrapper);\r\n\r\n // Logarithmic depth\r\n if ((<any>material).useLogarithmicDepth) {\r\n effect.setFloat(\"logarithmicDepthConstant\", 2.0 / (Math.log(scene.activeCamera.maxZ + 1.0) / Math.LN2));\r\n }\r\n\r\n effect.setFloat(\"offset\", useOverlay ? 0 : renderingMesh.outlineWidth);\r\n effect.setColor4(\"color\", useOverlay ? renderingMesh.overlayColor : renderingMesh.outlineColor, useOverlay ? renderingMesh.overlayAlpha : material.alpha);\r\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n effect.setMatrix(\"world\", effectiveMesh.getWorldMatrix());\r\n\r\n // Bones\r\n BindBonesParameters(renderingMesh, effect);\r\n\r\n // Morph targets\r\n BindMorphTargetParameters(renderingMesh, effect);\r\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\r\n renderingMesh.morphTargetManager._bind(effect);\r\n }\r\n\r\n if (!hardwareInstancedRendering) {\r\n renderingMesh._bind(subMesh, effect, material.fillMode);\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n bvaManager.bind(effect, hardwareInstancedRendering);\r\n }\r\n\r\n // Alpha test\r\n if (material && material.needAlphaTestingForMesh(effectiveMesh)) {\r\n const alphaTexture = material.getAlphaTestTexture();\r\n if (alphaTexture) {\r\n effect.setTexture(\"diffuseSampler\", alphaTexture);\r\n effect.setMatrix(\"diffuseMatrix\", alphaTexture.getTextureMatrix());\r\n }\r\n }\r\n\r\n // Clip plane\r\n BindClipPlane(effect, material, scene);\r\n\r\n engine.setZOffset(-this.zOffset);\r\n engine.setZOffsetUnits(-this.zOffsetUnits);\r\n\r\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering, (isInstance, world) => {\r\n effect.setMatrix(\"world\", world);\r\n });\r\n\r\n engine.setZOffset(0);\r\n engine.setZOffsetUnits(0);\r\n }\r\n\r\n /**\r\n * Returns whether or not the outline renderer is ready for a given submesh.\r\n * All the dependencies e.g. submeshes, texture, effect... mus be ready\r\n * @param subMesh Defines the submesh to check readiness for\r\n * @param useInstances Defines whether wee are trying to render instances or not\r\n * @param renderPassId Render pass id to use to render the mesh\r\n * @returns true if ready otherwise false\r\n */\r\n public isReady(subMesh: SubMesh, useInstances: boolean, renderPassId?: number): boolean {\r\n renderPassId = renderPassId ?? this._passIdForDrawWrapper[0];\r\n\r\n const defines = [];\r\n const attribs = [VertexBuffer.PositionKind, VertexBuffer.NormalKind];\r\n\r\n const mesh = subMesh.getMesh();\r\n const material = subMesh.getMaterial();\r\n\r\n if (!material) {\r\n return false;\r\n }\r\n\r\n const scene = mesh.getScene();\r\n\r\n let uv1 = false;\r\n let uv2 = false;\r\n const color = false;\r\n\r\n // Alpha test\r\n if (material.needAlphaTestingForMesh(mesh)) {\r\n defines.push(\"#define ALPHATEST\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n attribs.push(VertexBuffer.UVKind);\r\n defines.push(\"#define UV1\");\r\n uv1 = true;\r\n }\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n defines.push(\"#define UV2\");\r\n uv2 = true;\r\n }\r\n }\r\n //Logarithmic depth\r\n if ((<any>material).useLogarithmicDepth) {\r\n defines.push(\"#define LOGARITHMICDEPTH\");\r\n }\r\n // Clip planes\r\n PrepareStringDefinesForClipPlanes(material, scene, defines);\r\n\r\n // Bones\r\n const fallbacks = new EffectFallbacks();\r\n if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n attribs.push(VertexBuffer.MatricesIndicesKind);\r\n attribs.push(VertexBuffer.MatricesWeightsKind);\r\n if (mesh.numBoneInfluencers > 4) {\r\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\r\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\r\n }\r\n const skeleton = mesh.skeleton;\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n if (mesh.numBoneInfluencers > 0) {\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n }\r\n\r\n if (skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton.bones.length + 1));\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph targets\r\n const numMorphInfluencers = mesh.morphTargetManager\r\n ? PrepareDefinesAndAttributesForMorphTargets(\r\n mesh.morphTargetManager,\r\n defines,\r\n attribs,\r\n mesh,\r\n true, // usePositionMorph\r\n true, // useNormalMorph\r\n false, // useTangentMorph\r\n uv1, // useUVMorph\r\n uv2, // useUV2Morph\r\n color // useColorMorph\r\n )\r\n : 0;\r\n\r\n // Instances\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n PushAttributesForInstances(attribs);\r\n if (subMesh.getRenderingMesh().hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n }\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = mesh.bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (useInstances) {\r\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\r\n }\r\n }\r\n\r\n // Get correct effect\r\n const drawWrapper = subMesh._getDrawWrapper(renderPassId, true)!;\r\n const cachedDefines = drawWrapper.defines;\r\n const join = defines.join(\"\\n\");\r\n\r\n if (cachedDefines !== join) {\r\n const uniforms = [\r\n \"world\",\r\n \"mBones\",\r\n \"viewProjection\",\r\n \"diffuseMatrix\",\r\n \"offset\",\r\n \"color\",\r\n \"logarithmicDepthConstant\",\r\n \"morphTargetInfluences\",\r\n \"boneTextureWidth\",\r\n \"morphTargetCount\",\r\n \"morphTargetTextureInfo\",\r\n \"morphTargetTextureIndices\",\r\n \"bakedVertexAnimationSettings\",\r\n \"bakedVertexAnimationTextureSizeInverted\",\r\n \"bakedVertexAnimationTime\",\r\n \"bakedVertexAnimationTexture\",\r\n ];\r\n const samplers = [\"diffuseSampler\", \"boneSampler\", \"morphTargets\", \"bakedVertexAnimationTexture\"];\r\n\r\n AddClipPlaneUniforms(uniforms);\r\n\r\n drawWrapper.setEffect(\r\n this.scene.getEngine().createEffect(\r\n \"outline\",\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [],\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: null,\r\n onError: null,\r\n indexParameters: { maxSimultaneousMorphTargets: numMorphInfluencers },\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/outline.fragment\"), import(\"../ShadersWGSL/outline.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/outline.fragment\"), import(\"../Shaders/outline.vertex\")]);\r\n }\r\n },\r\n },\r\n this.scene.getEngine()\r\n ),\r\n join\r\n );\r\n }\r\n\r\n return drawWrapper.effect!.isReady();\r\n }\r\n\r\n private _beforeRenderingMesh(mesh: Mesh, subMesh: SubMesh, batch: _InstancesBatch): void {\r\n // Outline - step 1\r\n this._savedDepthWrite = this._engine.getDepthWrite();\r\n if (mesh.renderOutline) {\r\n const material = subMesh.getMaterial();\r\n if (material && material.needAlphaBlendingForMesh(mesh)) {\r\n this._engine.cacheStencilState();\r\n // Draw only to stencil buffer for the original mesh\r\n // The resulting stencil buffer will be used so the outline is not visible inside the mesh when the mesh is transparent\r\n this._engine.setDepthWrite(false);\r\n this._engine.setColorWrite(false);\r\n this._engine.setStencilBuffer(true);\r\n this._engine.setStencilOperationPass(Constants.REPLACE);\r\n this._engine.setStencilFunction(Constants.ALWAYS);\r\n this._engine.setStencilMask(OutlineRenderer._StencilReference);\r\n this._engine.setStencilFunctionReference(OutlineRenderer._StencilReference);\r\n this._engine.stencilStateComposer.useStencilGlobalOnly = true;\r\n this.render(subMesh, batch, /* This sets offset to 0 */ true, this._passIdForDrawWrapper[1]);\r\n\r\n this._engine.setColorWrite(true);\r\n this._engine.setStencilFunction(Constants.NOTEQUAL);\r\n }\r\n\r\n // Draw the outline using the above stencil if needed to avoid drawing within the mesh\r\n this._engine.setDepthWrite(false);\r\n this.render(subMesh, batch, false, this._passIdForDrawWrapper[0]);\r\n this._engine.setDepthWrite(this._savedDepthWrite);\r\n\r\n if (material && material.needAlphaBlendingForMesh(mesh)) {\r\n this._engine.stencilStateComposer.useStencilGlobalOnly = false;\r\n this._engine.restoreStencilState();\r\n }\r\n }\r\n }\r\n\r\n private _afterRenderingMesh(mesh: Mesh, subMesh: SubMesh, batch: _InstancesBatch): void {\r\n // Overlay\r\n if (mesh.renderOverlay) {\r\n const currentMode = this._engine.getAlphaMode();\r\n const alphaBlendState = this._engine.alphaState.alphaBlend;\r\n this._engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n this.render(subMesh, batch, true, this._passIdForDrawWrapper[3]);\r\n this._engine.setAlphaMode(currentMode);\r\n this._engine.setDepthWrite(this._savedDepthWrite);\r\n this._engine.alphaState.alphaBlend = alphaBlendState;\r\n }\r\n\r\n // Outline - step 2\r\n if (mesh.renderOutline && this._savedDepthWrite) {\r\n this._engine.setDepthWrite(true);\r\n this._engine.setColorWrite(false);\r\n this.render(subMesh, batch, false, this._passIdForDrawWrapper[2]);\r\n this._engine.setColorWrite(true);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"outlineRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/outlineRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { _InstancesBatch } from \"../Meshes/mesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Scene } from \"../scene\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { ISceneComponent } from \"../sceneComponent\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\nimport { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from \"core/Materials/clipPlaneMaterialHelper\";\r\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from \"../Materials/materialHelper.functions\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport type { IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\ndeclare module \"../scene\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Scene {\r\n /** @internal */\r\n _outlineRenderer: OutlineRenderer;\r\n\r\n /**\r\n * Gets the outline renderer associated with the scene\r\n * @returns a OutlineRenderer\r\n */\r\n getOutlineRenderer(): OutlineRenderer;\r\n }\r\n}\r\n\r\n/**\r\n * Gets the outline renderer associated with the scene\r\n * @returns a OutlineRenderer\r\n */\r\nScene.prototype.getOutlineRenderer = function (): OutlineRenderer {\r\n if (!this._outlineRenderer) {\r\n this._outlineRenderer = new OutlineRenderer(this);\r\n }\r\n return this._outlineRenderer;\r\n};\r\n\r\ndeclare module \"../Meshes/abstractMesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractMesh {\r\n /** @internal (Backing field) */\r\n _renderOutline: boolean;\r\n /**\r\n * Gets or sets a boolean indicating if the outline must be rendered as well\r\n * @see https://www.babylonjs-playground.com/#10WJ5S#3\r\n */\r\n renderOutline: boolean;\r\n\r\n /** @internal (Backing field) */\r\n _renderOverlay: boolean;\r\n /**\r\n * Gets or sets a boolean indicating if the overlay must be rendered as well\r\n * @see https://www.babylonjs-playground.com/#10WJ5S#2\r\n */\r\n renderOverlay: boolean;\r\n }\r\n}\r\n\r\nObject.defineProperty(Mesh.prototype, \"renderOutline\", {\r\n get: function (this: Mesh) {\r\n return this._renderOutline;\r\n },\r\n set: function (this: Mesh, value: boolean) {\r\n if (value) {\r\n // Lazy Load the component.\r\n this.getScene().getOutlineRenderer();\r\n }\r\n this._renderOutline = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\nObject.defineProperty(Mesh.prototype, \"renderOverlay\", {\r\n get: function (this: Mesh) {\r\n return this._renderOverlay;\r\n },\r\n set: function (this: Mesh, value: boolean) {\r\n if (value) {\r\n // Lazy Load the component.\r\n this.getScene().getOutlineRenderer();\r\n }\r\n this._renderOverlay = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\n/**\r\n * This class is responsible to draw the outline/overlay of meshes.\r\n * It should not be used directly but through the available method on mesh.\r\n */\r\nexport class OutlineRenderer implements ISceneComponent {\r\n /**\r\n * Stencil value used to avoid outline being seen within the mesh when the mesh is transparent\r\n */\r\n private static _StencilReference = 0x04;\r\n /**\r\n * The name of the component. Each component must have a unique name.\r\n */\r\n public name = SceneComponentConstants.NAME_OUTLINERENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Defines a zOffset default Factor to prevent zFighting between the overlay and the mesh.\r\n */\r\n public zOffset = 1;\r\n\r\n /**\r\n * Defines a zOffset default Unit to prevent zFighting between the overlay and the mesh.\r\n */\r\n public zOffsetUnits = 4; // 4 to account for projection a bit by default\r\n\r\n private _engine: AbstractEngine;\r\n private _savedDepthWrite: boolean;\r\n private _passIdForDrawWrapper: number[];\r\n\r\n /** Shader language used by the Outline renderer. */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in the Outline renderer.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a new outline renderer. (There could be only one per scene).\r\n * @param scene Defines the scene it belongs to\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n this._engine = scene.getEngine();\r\n this.scene._addComponent(this);\r\n this._passIdForDrawWrapper = [];\r\n for (let i = 0; i < 4; ++i) {\r\n this._passIdForDrawWrapper[i] = this._engine.createRenderPassId(`Outline Renderer (${i})`);\r\n }\r\n\r\n const engine = this._engine;\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n }\r\n\r\n /**\r\n * Register the component to one instance of a scene.\r\n */\r\n public register(): void {\r\n this.scene._beforeRenderingMeshStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERINGMESH_OUTLINE, this, this._beforeRenderingMesh);\r\n this.scene._afterRenderingMeshStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERINGMESH_OUTLINE, this, this._afterRenderingMesh);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do here.\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources.\r\n */\r\n public dispose(): void {\r\n for (let i = 0; i < this._passIdForDrawWrapper.length; ++i) {\r\n this._engine.releaseRenderPassId(this._passIdForDrawWrapper[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Renders the outline in the canvas.\r\n * @param subMesh Defines the sumesh to render\r\n * @param batch Defines the batch of meshes in case of instances\r\n * @param useOverlay Defines if the rendering is for the overlay or the outline\r\n * @param renderPassId Render pass id to use to render the mesh\r\n */\r\n public render(subMesh: SubMesh, batch: _InstancesBatch, useOverlay: boolean = false, renderPassId?: number): void {\r\n renderPassId = renderPassId ?? this._passIdForDrawWrapper[0];\r\n\r\n const scene = this.scene;\r\n const engine = scene.getEngine();\r\n\r\n const hardwareInstancedRendering =\r\n engine.getCaps().instancedArrays &&\r\n ((batch.visibleInstances[subMesh._id] !== null && batch.visibleInstances[subMesh._id] !== undefined) || subMesh.getRenderingMesh().hasThinInstances);\r\n\r\n if (!this.isReady(subMesh, hardwareInstancedRendering, renderPassId)) {\r\n return;\r\n }\r\n\r\n const ownerMesh = subMesh.getMesh();\r\n const replacementMesh = ownerMesh._internalAbstractMeshDataInfo._actAsRegularMesh ? ownerMesh : null;\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n const effectiveMesh = replacementMesh ? replacementMesh : renderingMesh;\r\n const material = subMesh.getMaterial();\r\n\r\n if (!material || !scene.activeCamera) {\r\n return;\r\n }\r\n\r\n const drawWrapper = subMesh._getDrawWrapper(renderPassId)!;\r\n const effect = DrawWrapper.GetEffect(drawWrapper)!;\r\n\r\n engine.enableEffect(drawWrapper);\r\n\r\n // Logarithmic depth\r\n if ((<any>material).useLogarithmicDepth) {\r\n effect.setFloat(\"logarithmicDepthConstant\", 2.0 / (Math.log(scene.activeCamera.maxZ + 1.0) / Math.LN2));\r\n }\r\n\r\n effect.setFloat(\"offset\", useOverlay ? 0 : renderingMesh.outlineWidth);\r\n effect.setColor4(\"color\", useOverlay ? renderingMesh.overlayColor : renderingMesh.outlineColor, useOverlay ? renderingMesh.overlayAlpha : material.alpha);\r\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n effect.setMatrix(\"world\", effectiveMesh.getWorldMatrix());\r\n\r\n // Bones\r\n BindBonesParameters(renderingMesh, effect);\r\n\r\n // Morph targets\r\n BindMorphTargetParameters(renderingMesh, effect);\r\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\r\n renderingMesh.morphTargetManager._bind(effect);\r\n }\r\n\r\n if (!hardwareInstancedRendering) {\r\n renderingMesh._bind(subMesh, effect, material.fillMode);\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n bvaManager.bind(effect, hardwareInstancedRendering);\r\n }\r\n\r\n // Alpha test\r\n if (material && material.needAlphaTestingForMesh(effectiveMesh)) {\r\n const alphaTexture = material.getAlphaTestTexture();\r\n if (alphaTexture) {\r\n effect.setTexture(\"diffuseSampler\", alphaTexture);\r\n effect.setMatrix(\"diffuseMatrix\", alphaTexture.getTextureMatrix());\r\n }\r\n }\r\n\r\n // Clip plane\r\n BindClipPlane(effect, material, scene);\r\n\r\n engine.setZOffset(-this.zOffset);\r\n engine.setZOffsetUnits(-this.zOffsetUnits);\r\n\r\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering, (isInstance, world) => {\r\n effect.setMatrix(\"world\", world);\r\n });\r\n\r\n engine.setZOffset(0);\r\n engine.setZOffsetUnits(0);\r\n }\r\n\r\n /**\r\n * Returns whether or not the outline renderer is ready for a given submesh.\r\n * All the dependencies e.g. submeshes, texture, effect... mus be ready\r\n * @param subMesh Defines the submesh to check readiness for\r\n * @param useInstances Defines whether wee are trying to render instances or not\r\n * @param renderPassId Render pass id to use to render the mesh\r\n * @returns true if ready otherwise false\r\n */\r\n public isReady(subMesh: SubMesh, useInstances: boolean, renderPassId?: number): boolean {\r\n renderPassId = renderPassId ?? this._passIdForDrawWrapper[0];\r\n\r\n const defines = [];\r\n const attribs = [VertexBuffer.PositionKind, VertexBuffer.NormalKind];\r\n\r\n const mesh = subMesh.getMesh();\r\n const material = subMesh.getMaterial();\r\n\r\n if (!material) {\r\n return false;\r\n }\r\n\r\n const scene = mesh.getScene();\r\n\r\n let uv1 = false;\r\n let uv2 = false;\r\n const color = false;\r\n\r\n // Alpha test\r\n if (material.needAlphaTestingForMesh(mesh)) {\r\n defines.push(\"#define ALPHATEST\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n attribs.push(VertexBuffer.UVKind);\r\n defines.push(\"#define UV1\");\r\n uv1 = true;\r\n }\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n defines.push(\"#define UV2\");\r\n uv2 = true;\r\n }\r\n }\r\n //Logarithmic depth\r\n if ((<any>material).useLogarithmicDepth) {\r\n defines.push(\"#define LOGARITHMICDEPTH\");\r\n }\r\n // Clip planes\r\n PrepareStringDefinesForClipPlanes(material, scene, defines);\r\n\r\n // Bones\r\n const fallbacks = new EffectFallbacks();\r\n if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n attribs.push(VertexBuffer.MatricesIndicesKind);\r\n attribs.push(VertexBuffer.MatricesWeightsKind);\r\n if (mesh.numBoneInfluencers > 4) {\r\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\r\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\r\n }\r\n const skeleton = mesh.skeleton;\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n if (mesh.numBoneInfluencers > 0) {\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n }\r\n\r\n if (skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton.bones.length + 1));\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph targets\r\n const numMorphInfluencers = mesh.morphTargetManager\r\n ? PrepareDefinesAndAttributesForMorphTargets(\r\n mesh.morphTargetManager,\r\n defines,\r\n attribs,\r\n mesh,\r\n true, // usePositionMorph\r\n true, // useNormalMorph\r\n false, // useTangentMorph\r\n uv1, // useUVMorph\r\n uv2, // useUV2Morph\r\n color // useColorMorph\r\n )\r\n : 0;\r\n\r\n // Instances\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n PushAttributesForInstances(attribs);\r\n if (subMesh.getRenderingMesh().hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n }\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = mesh.bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (useInstances) {\r\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\r\n }\r\n }\r\n\r\n // Get correct effect\r\n const drawWrapper = subMesh._getDrawWrapper(renderPassId, true)!;\r\n const cachedDefines = drawWrapper.defines;\r\n const join = defines.join(\"\\n\");\r\n\r\n if (cachedDefines !== join) {\r\n const uniforms = [\r\n \"world\",\r\n \"mBones\",\r\n \"viewProjection\",\r\n \"diffuseMatrix\",\r\n \"offset\",\r\n \"color\",\r\n \"logarithmicDepthConstant\",\r\n \"morphTargetInfluences\",\r\n \"boneTextureWidth\",\r\n \"morphTargetCount\",\r\n \"morphTargetTextureInfo\",\r\n \"morphTargetTextureIndices\",\r\n \"bakedVertexAnimationSettings\",\r\n \"bakedVertexAnimationTextureSizeInverted\",\r\n \"bakedVertexAnimationTime\",\r\n \"bakedVertexAnimationTexture\",\r\n ];\r\n const samplers = [\"diffuseSampler\", \"boneSampler\", \"morphTargets\", \"bakedVertexAnimationTexture\"];\r\n\r\n AddClipPlaneUniforms(uniforms);\r\n\r\n drawWrapper.setEffect(\r\n this.scene.getEngine().createEffect(\r\n \"outline\",\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [],\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: null,\r\n onError: null,\r\n indexParameters: { maxSimultaneousMorphTargets: numMorphInfluencers },\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/outline.fragment\"), import(\"../ShadersWGSL/outline.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/outline.fragment\"), import(\"../Shaders/outline.vertex\")]);\r\n }\r\n },\r\n },\r\n this.scene.getEngine()\r\n ),\r\n join\r\n );\r\n }\r\n\r\n return drawWrapper.effect!.isReady();\r\n }\r\n\r\n private _beforeRenderingMesh(mesh: Mesh, subMesh: SubMesh, batch: _InstancesBatch): void {\r\n // Outline - step 1\r\n this._savedDepthWrite = this._engine.getDepthWrite();\r\n if (mesh.renderOutline) {\r\n const material = subMesh.getMaterial();\r\n if (material && material.needAlphaBlendingForMesh(mesh)) {\r\n this._engine.cacheStencilState();\r\n // Draw only to stencil buffer for the original mesh\r\n // The resulting stencil buffer will be used so the outline is not visible inside the mesh when the mesh is transparent\r\n this._engine.setDepthWrite(false);\r\n this._engine.setColorWrite(false);\r\n this._engine.setStencilBuffer(true);\r\n this._engine.setStencilOperationPass(Constants.REPLACE);\r\n this._engine.setStencilFunction(Constants.ALWAYS);\r\n this._engine.setStencilMask(OutlineRenderer._StencilReference);\r\n this._engine.setStencilFunctionReference(OutlineRenderer._StencilReference);\r\n this._engine.stencilStateComposer.useStencilGlobalOnly = true;\r\n this.render(subMesh, batch, /* This sets offset to 0 */ true, this._passIdForDrawWrapper[1]);\r\n\r\n this._engine.setColorWrite(true);\r\n this._engine.setStencilFunction(Constants.NOTEQUAL);\r\n }\r\n\r\n // Draw the outline using the above stencil if needed to avoid drawing within the mesh\r\n this._engine.setDepthWrite(false);\r\n this.render(subMesh, batch, false, this._passIdForDrawWrapper[0]);\r\n this._engine.setDepthWrite(this._savedDepthWrite);\r\n\r\n if (material && material.needAlphaBlendingForMesh(mesh)) {\r\n this._engine.stencilStateComposer.useStencilGlobalOnly = false;\r\n this._engine.restoreStencilState();\r\n }\r\n }\r\n }\r\n\r\n private _afterRenderingMesh(mesh: Mesh, subMesh: SubMesh, batch: _InstancesBatch): void {\r\n // Overlay\r\n if (mesh.renderOverlay) {\r\n const currentMode = this._engine.getAlphaMode();\r\n const alphaBlendState = this._engine.alphaState.alphaBlend;\r\n this._engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n this.render(subMesh, batch, true, this._passIdForDrawWrapper[3]);\r\n this._engine.setAlphaMode(currentMode);\r\n this._engine.setDepthWrite(this._savedDepthWrite);\r\n this._engine.alphaState.setAlphaBlend(alphaBlendState);\r\n }\r\n\r\n // Outline - step 2\r\n if (mesh.renderOutline && this._savedDepthWrite) {\r\n this._engine.setDepthWrite(true);\r\n this._engine.setColorWrite(false);\r\n this.render(subMesh, batch, false, this._passIdForDrawWrapper[2]);\r\n this._engine.setColorWrite(true);\r\n }\r\n }\r\n}\r\n"]}
@@ -1,9 +1,8 @@
1
1
  // Do not edit.
2
2
  import { ShaderStore } from "../Engines/shaderStore.js";
3
3
  const name = "lodPixelShader";
4
- const shader = `#extension GL_EXT_shader_texture_lod : enable
5
- precision highp float;const float GammaEncodePowerApprox=1.0/2.2;varying vec2 vUV;uniform sampler2D textureSampler;uniform float lod;uniform vec2 texSize;uniform int gamma;void main(void)
6
- {gl_FragColor=texture2DLodEXT(textureSampler,vUV,lod);if (gamma==0) {gl_FragColor.rgb=pow(gl_FragColor.rgb,vec3(GammaEncodePowerApprox));}}
4
+ const shader = `precision highp float;const float GammaEncodePowerApprox=1.0/2.2;varying vec2 vUV;uniform sampler2D textureSampler;uniform float lod;uniform vec2 texSize;uniform int gamma;void main(void)
5
+ {ivec2 textureDimensions=textureSize(textureSampler,0);gl_FragColor=texelFetch(textureSampler,ivec2(vUV*vec2(textureDimensions)),int(lod));if (gamma==0) {gl_FragColor.rgb=pow(gl_FragColor.rgb,vec3(GammaEncodePowerApprox));}}
7
6
  `;
8
7
  // Sideeffect
9
8
  if (!ShaderStore.ShadersStore[name]) {
@@ -1 +1 @@
1
- {"version":3,"file":"lod.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/lod.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAC9B,MAAM,MAAM,GAAG;;;CAGd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"lodPixelShader\";\nconst shader = `#extension GL_EXT_shader_texture_lod : enable\nprecision highp float;const float GammaEncodePowerApprox=1.0/2.2;varying vec2 vUV;uniform sampler2D textureSampler;uniform float lod;uniform vec2 texSize;uniform int gamma;void main(void)\n{gl_FragColor=texture2DLodEXT(textureSampler,vUV,lod);if (gamma==0) {gl_FragColor.rgb=pow(gl_FragColor.rgb,vec3(GammaEncodePowerApprox));}}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const lodPixelShader = { name, shader };\n"]}
1
+ {"version":3,"file":"lod.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/lod.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAC9B,MAAM,MAAM,GAAG;;CAEd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"lodPixelShader\";\nconst shader = `precision highp float;const float GammaEncodePowerApprox=1.0/2.2;varying vec2 vUV;uniform sampler2D textureSampler;uniform float lod;uniform vec2 texSize;uniform int gamma;void main(void)\n{ivec2 textureDimensions=textureSize(textureSampler,0);gl_FragColor=texelFetch(textureSampler,ivec2(vUV*vec2(textureDimensions)),int(lod));if (gamma==0) {gl_FragColor.rgb=pow(gl_FragColor.rgb,vec3(GammaEncodePowerApprox));}}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const lodPixelShader = { name, shader };\n"]}
@@ -1,8 +1,8 @@
1
1
  // Do not edit.
2
2
  import { ShaderStore } from "../Engines/shaderStore.js";
3
3
  const name = "lodPixelShader";
4
- const shader = `const GammaEncodePowerApprox=1.0/2.2;varying vUV: vec2f;var textureSamplerSampler: sampler;var textureSampler: texture_2d<f32>;uniform lod: f32;uniform gamma: i32;@fragment
5
- fn main(input: FragmentInputs)->FragmentOutputs {fragmentOutputs.color=textureSampleLevel(textureSampler,textureSamplerSampler,fragmentInputs.vUV,uniforms.lod);if (uniforms.gamma==0) {fragmentOutputs.color=vec4f(pow(fragmentOutputs.color.rgb,vec3f(GammaEncodePowerApprox)),fragmentOutputs.color.a);}}
4
+ const shader = `const GammaEncodePowerApprox=1.0/2.2;varying vUV: vec2f;var textureSampler: texture_2d<f32>;uniform lod: f32;uniform gamma: i32;@fragment
5
+ fn main(input: FragmentInputs)->FragmentOutputs {let textureSize=textureDimensions(textureSampler);fragmentOutputs.color=textureLoad(textureSampler,vec2u(fragmentInputs.vUV*vec2f(textureSize)),u32(uniforms.lod));if (uniforms.gamma==0) {fragmentOutputs.color=vec4f(pow(fragmentOutputs.color.rgb,vec3f(GammaEncodePowerApprox)),fragmentOutputs.color.a);}}
6
6
  `;
7
7
  // Sideeffect
8
8
  if (!ShaderStore.ShadersStoreWGSL[name]) {
@@ -1 +1 @@
1
- {"version":3,"file":"lod.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/lod.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAC9B,MAAM,MAAM,GAAG;;CAEd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"lodPixelShader\";\nconst shader = `const GammaEncodePowerApprox=1.0/2.2;varying vUV: vec2f;var textureSamplerSampler: sampler;var textureSampler: texture_2d<f32>;uniform lod: f32;uniform gamma: i32;@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {fragmentOutputs.color=textureSampleLevel(textureSampler,textureSamplerSampler,fragmentInputs.vUV,uniforms.lod);if (uniforms.gamma==0) {fragmentOutputs.color=vec4f(pow(fragmentOutputs.color.rgb,vec3f(GammaEncodePowerApprox)),fragmentOutputs.color.a);}}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const lodPixelShaderWGSL = { name, shader };\n"]}
1
+ {"version":3,"file":"lod.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/lod.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAC9B,MAAM,MAAM,GAAG;;CAEd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"lodPixelShader\";\nconst shader = `const GammaEncodePowerApprox=1.0/2.2;varying vUV: vec2f;var textureSampler: texture_2d<f32>;uniform lod: f32;uniform gamma: i32;@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {let textureSize=textureDimensions(textureSampler);fragmentOutputs.color=textureLoad(textureSampler,vec2u(fragmentInputs.vUV*vec2f(textureSize)),u32(uniforms.lod));if (uniforms.gamma==0) {fragmentOutputs.color=vec4f(pow(fragmentOutputs.color.rgb,vec3f(GammaEncodePowerApprox)),fragmentOutputs.color.a);}}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const lodPixelShaderWGSL = { name, shader };\n"]}
@@ -2,11 +2,15 @@
2
2
  export interface IStencilState {
3
3
  enabled: boolean;
4
4
  mask: number;
5
- func: number;
6
- funcRef: number;
7
5
  funcMask: number;
6
+ funcRef: number;
7
+ func: number;
8
8
  opStencilDepthPass: number;
9
9
  opStencilFail: number;
10
10
  opDepthFail: number;
11
+ backFunc: number;
12
+ backOpStencilDepthPass: number;
13
+ backOpStencilFail: number;
14
+ backOpDepthFail: number;
11
15
  reset(): void;
12
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"IStencilState.js","sourceRoot":"","sources":["../../../../dev/core/src/States/IStencilState.ts"],"names":[],"mappings":"","sourcesContent":["/** @internal */\r\nexport interface IStencilState {\r\n enabled: boolean;\r\n\r\n mask: number;\r\n\r\n func: number;\r\n funcRef: number;\r\n funcMask: number;\r\n\r\n opStencilDepthPass: number;\r\n opStencilFail: number;\r\n opDepthFail: number;\r\n\r\n reset(): void;\r\n}\r\n"]}
1
+ {"version":3,"file":"IStencilState.js","sourceRoot":"","sources":["../../../../dev/core/src/States/IStencilState.ts"],"names":[],"mappings":"","sourcesContent":["/** @internal */\r\nexport interface IStencilState {\r\n enabled: boolean;\r\n\r\n mask: number; // write mask\r\n funcMask: number; // read mask\r\n\r\n funcRef: number;\r\n\r\n // Front stencil operations\r\n func: number;\r\n opStencilDepthPass: number;\r\n opStencilFail: number;\r\n opDepthFail: number;\r\n\r\n // Back stencil operations\r\n backFunc: number;\r\n backOpStencilDepthPass: number;\r\n backOpStencilFail: number;\r\n backOpDepthFail: number;\r\n\r\n reset(): void;\r\n}\r\n"]}
@@ -7,7 +7,8 @@ export declare class AlphaState {
7
7
  _blendEquationParameters: Nullable<number>[];
8
8
  _blendConstants: Nullable<number>[];
9
9
  _isBlendConstantsDirty: boolean;
10
- private _alphaBlend;
10
+ _alphaBlend: any[];
11
+ _numTargetEnabled: number;
11
12
  private _isAlphaBlendDirty;
12
13
  private _isBlendFunctionParametersDirty;
13
14
  private _isBlendEquationParametersDirty;
@@ -17,10 +18,11 @@ export declare class AlphaState {
17
18
  constructor();
18
19
  get isDirty(): boolean;
19
20
  get alphaBlend(): boolean;
20
- set alphaBlend(value: boolean);
21
+ setAlphaBlend(value: boolean, targetIndex?: number): void;
21
22
  setAlphaBlendConstants(r: number, g: number, b: number, a: number): void;
22
- setAlphaBlendFunctionParameters(value0: number, value1: number, value2: number, value3: number): void;
23
- setAlphaEquationParameters(rgb: number, alpha: number): void;
23
+ setAlphaBlendFunctionParameters(srcRGBFactor: number, dstRGBFactor: number, srcAlphaFactor: number, dstAlphaFactor: number, targetIndex?: number): void;
24
+ setAlphaEquationParameters(rgbEquation: number, alphaEquation: number, targetIndex?: number): void;
24
25
  reset(): void;
25
- apply(gl: WebGLRenderingContext): void;
26
+ apply(gl: WebGLRenderingContext, numTargets?: number): void;
27
+ setAlphaMode(mode: number, targetIndex: number): void;
26
28
  }
@@ -1,3 +1,4 @@
1
+
1
2
  /**
2
3
  * @internal
3
4
  **/
@@ -6,11 +7,12 @@ export class AlphaState {
6
7
  * Initializes the state.
7
8
  */
8
9
  constructor() {
9
- this._blendFunctionParameters = new Array(4);
10
- this._blendEquationParameters = new Array(2);
10
+ this._blendFunctionParameters = new Array(4 * 8);
11
+ this._blendEquationParameters = new Array(2 * 8);
11
12
  this._blendConstants = new Array(4);
12
13
  this._isBlendConstantsDirty = false;
13
- this._alphaBlend = false;
14
+ this._alphaBlend = Array(8).fill(false);
15
+ this._numTargetEnabled = 0;
14
16
  this._isAlphaBlendDirty = false;
15
17
  this._isBlendFunctionParametersDirty = false;
16
18
  this._isBlendEquationParametersDirty = false;
@@ -20,13 +22,19 @@ export class AlphaState {
20
22
  return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty;
21
23
  }
22
24
  get alphaBlend() {
23
- return this._alphaBlend;
25
+ return this._numTargetEnabled > 0;
24
26
  }
25
- set alphaBlend(value) {
26
- if (this._alphaBlend === value) {
27
+ setAlphaBlend(value, targetIndex = 0) {
28
+ if (this._alphaBlend[targetIndex] === value) {
27
29
  return;
28
30
  }
29
- this._alphaBlend = value;
31
+ if (value) {
32
+ this._numTargetEnabled++;
33
+ }
34
+ else {
35
+ this._numTargetEnabled--;
36
+ }
37
+ this._alphaBlend[targetIndex] = value;
30
38
  this._isAlphaBlendDirty = true;
31
39
  }
32
40
  setAlphaBlendConstants(r, g, b, a) {
@@ -39,35 +47,34 @@ export class AlphaState {
39
47
  this._blendConstants[3] = a;
40
48
  this._isBlendConstantsDirty = true;
41
49
  }
42
- setAlphaBlendFunctionParameters(value0, value1, value2, value3) {
43
- if (this._blendFunctionParameters[0] === value0 &&
44
- this._blendFunctionParameters[1] === value1 &&
45
- this._blendFunctionParameters[2] === value2 &&
46
- this._blendFunctionParameters[3] === value3) {
50
+ setAlphaBlendFunctionParameters(srcRGBFactor, dstRGBFactor, srcAlphaFactor, dstAlphaFactor, targetIndex = 0) {
51
+ const offset = targetIndex * 4;
52
+ if (this._blendFunctionParameters[offset + 0] === srcRGBFactor &&
53
+ this._blendFunctionParameters[offset + 1] === dstRGBFactor &&
54
+ this._blendFunctionParameters[offset + 2] === srcAlphaFactor &&
55
+ this._blendFunctionParameters[offset + 3] === dstAlphaFactor) {
47
56
  return;
48
57
  }
49
- this._blendFunctionParameters[0] = value0;
50
- this._blendFunctionParameters[1] = value1;
51
- this._blendFunctionParameters[2] = value2;
52
- this._blendFunctionParameters[3] = value3;
58
+ this._blendFunctionParameters[offset + 0] = srcRGBFactor;
59
+ this._blendFunctionParameters[offset + 1] = dstRGBFactor;
60
+ this._blendFunctionParameters[offset + 2] = srcAlphaFactor;
61
+ this._blendFunctionParameters[offset + 3] = dstAlphaFactor;
53
62
  this._isBlendFunctionParametersDirty = true;
54
63
  }
55
- setAlphaEquationParameters(rgb, alpha) {
56
- if (this._blendEquationParameters[0] === rgb && this._blendEquationParameters[1] === alpha) {
64
+ setAlphaEquationParameters(rgbEquation, alphaEquation, targetIndex = 0) {
65
+ const offset = targetIndex * 2;
66
+ if (this._blendEquationParameters[offset + 0] === rgbEquation && this._blendEquationParameters[offset + 1] === alphaEquation) {
57
67
  return;
58
68
  }
59
- this._blendEquationParameters[0] = rgb;
60
- this._blendEquationParameters[1] = alpha;
69
+ this._blendEquationParameters[offset + 0] = rgbEquation;
70
+ this._blendEquationParameters[offset + 1] = alphaEquation;
61
71
  this._isBlendEquationParametersDirty = true;
62
72
  }
63
73
  reset() {
64
- this._alphaBlend = false;
65
- this._blendFunctionParameters[0] = null;
66
- this._blendFunctionParameters[1] = null;
67
- this._blendFunctionParameters[2] = null;
68
- this._blendFunctionParameters[3] = null;
69
- this._blendEquationParameters[0] = null;
70
- this._blendEquationParameters[1] = null;
74
+ this._alphaBlend.fill(false);
75
+ this._numTargetEnabled = 0;
76
+ this._blendFunctionParameters.fill(null);
77
+ this._blendEquationParameters.fill(null);
71
78
  this._blendConstants[0] = null;
72
79
  this._blendConstants[1] = null;
73
80
  this._blendConstants[2] = null;
@@ -77,28 +84,60 @@ export class AlphaState {
77
84
  this._isBlendEquationParametersDirty = false;
78
85
  this._isBlendConstantsDirty = false;
79
86
  }
80
- apply(gl) {
87
+ apply(gl, numTargets = 1) {
81
88
  if (!this.isDirty) {
82
89
  return;
83
90
  }
84
91
  // Alpha blend
85
92
  if (this._isAlphaBlendDirty) {
86
- if (this._alphaBlend) {
87
- gl.enable(gl.BLEND);
93
+ if (numTargets === 1) {
94
+ if (this._alphaBlend[0]) {
95
+ gl.enable(gl.BLEND);
96
+ }
97
+ else {
98
+ gl.disable(gl.BLEND);
99
+ }
88
100
  }
89
101
  else {
90
- gl.disable(gl.BLEND);
102
+ const gl2 = gl;
103
+ for (let i = 0; i < numTargets; i++) {
104
+ const index = i < this._numTargetEnabled ? i : 0;
105
+ if (this._alphaBlend[index]) {
106
+ gl2.enableIndexed(gl.BLEND, i);
107
+ }
108
+ else {
109
+ gl2.disableIndexed(gl.BLEND, i);
110
+ }
111
+ }
91
112
  }
92
113
  this._isAlphaBlendDirty = false;
93
114
  }
94
115
  // Alpha function
95
116
  if (this._isBlendFunctionParametersDirty) {
96
- gl.blendFuncSeparate(this._blendFunctionParameters[0], this._blendFunctionParameters[1], this._blendFunctionParameters[2], this._blendFunctionParameters[3]);
117
+ if (numTargets === 1) {
118
+ gl.blendFuncSeparate(this._blendFunctionParameters[0], this._blendFunctionParameters[1], this._blendFunctionParameters[2], this._blendFunctionParameters[3]);
119
+ }
120
+ else {
121
+ const gl2 = gl;
122
+ for (let i = 0; i < numTargets; i++) {
123
+ const offset = i < this._numTargetEnabled ? i * 4 : 0;
124
+ gl2.blendFuncSeparateIndexed(i, this._blendFunctionParameters[offset + 0], this._blendFunctionParameters[offset + 1], this._blendFunctionParameters[offset + 2], this._blendFunctionParameters[offset + 3]);
125
+ }
126
+ }
97
127
  this._isBlendFunctionParametersDirty = false;
98
128
  }
99
129
  // Alpha equation
100
130
  if (this._isBlendEquationParametersDirty) {
101
- gl.blendEquationSeparate(this._blendEquationParameters[0], this._blendEquationParameters[1]);
131
+ if (numTargets === 1) {
132
+ gl.blendEquationSeparate(this._blendEquationParameters[0], this._blendEquationParameters[1]);
133
+ }
134
+ else {
135
+ const gl2 = gl;
136
+ for (let i = 0; i < numTargets; i++) {
137
+ const offset = i < this._numTargetEnabled ? i * 2 : 0;
138
+ gl2.blendEquationSeparateIndexed(i, this._blendEquationParameters[offset + 0], this._blendEquationParameters[offset + 1]);
139
+ }
140
+ }
102
141
  this._isBlendEquationParametersDirty = false;
103
142
  }
104
143
  // Constants
@@ -107,5 +146,77 @@ export class AlphaState {
107
146
  this._isBlendConstantsDirty = false;
108
147
  }
109
148
  }
149
+ setAlphaMode(mode, targetIndex) {
150
+ let equation = 32774;
151
+ switch (mode) {
152
+ case 0:
153
+ break;
154
+ case 7:
155
+ this.setAlphaBlendFunctionParameters(1, 771, 1, 1, targetIndex);
156
+ break;
157
+ case 8:
158
+ this.setAlphaBlendFunctionParameters(1, 771, 1, 771, targetIndex);
159
+ break;
160
+ case 2:
161
+ this.setAlphaBlendFunctionParameters(770, 771, 1, 1, targetIndex);
162
+ break;
163
+ case 6:
164
+ this.setAlphaBlendFunctionParameters(1, 1, 0, 1, targetIndex);
165
+ break;
166
+ case 1:
167
+ this.setAlphaBlendFunctionParameters(770, 1, 0, 1, targetIndex);
168
+ break;
169
+ case 3:
170
+ this.setAlphaBlendFunctionParameters(0, 769, 1, 1, targetIndex);
171
+ equation = 32778;
172
+ break;
173
+ case 4:
174
+ this.setAlphaBlendFunctionParameters(774, 0, 1, 1, targetIndex);
175
+ break;
176
+ case 5:
177
+ this.setAlphaBlendFunctionParameters(770, 769, 1, 1, targetIndex);
178
+ break;
179
+ case 9:
180
+ this.setAlphaBlendFunctionParameters(32769, 32770, 32771, 32772, targetIndex);
181
+ break;
182
+ case 10:
183
+ this.setAlphaBlendFunctionParameters(1, 769, 1, 771, targetIndex);
184
+ break;
185
+ case 11:
186
+ this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);
187
+ break;
188
+ case 12:
189
+ this.setAlphaBlendFunctionParameters(772, 1, 0, 0, targetIndex);
190
+ break;
191
+ case 13:
192
+ this.setAlphaBlendFunctionParameters(775, 769, 773, 771, targetIndex);
193
+ break;
194
+ case 14:
195
+ this.setAlphaBlendFunctionParameters(1, 771, 1, 771, targetIndex);
196
+ break;
197
+ case 15:
198
+ this.setAlphaBlendFunctionParameters(1, 1, 1, 0, targetIndex);
199
+ break;
200
+ case 16:
201
+ this.setAlphaBlendFunctionParameters(775, 769, 0, 1, targetIndex);
202
+ break;
203
+ case 17:
204
+ // Same as ALPHA_COMBINE but accumulates (1 - alpha) values in the alpha channel for a later readout in order independant transparency
205
+ this.setAlphaBlendFunctionParameters(770, 771, 1, 771, targetIndex);
206
+ break;
207
+ case 18:
208
+ this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);
209
+ equation = 32775;
210
+ break;
211
+ case 19:
212
+ this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);
213
+ equation = 32776;
214
+ break;
215
+ case 20:
216
+ this.setAlphaBlendFunctionParameters(1, 35065, 0, 1, targetIndex);
217
+ break;
218
+ }
219
+ this.setAlphaEquationParameters(equation, equation, targetIndex);
220
+ }
110
221
  }
111
222
  //# sourceMappingURL=alphaCullingState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alphaCullingState.js","sourceRoot":"","sources":["../../../../dev/core/src/States/alphaCullingState.ts"],"names":[],"mappings":"AAEA;;IAEI;AACJ,MAAM,OAAO,UAAU;IAWnB;;OAEG;IACH;QAbO,6BAAwB,GAAG,IAAI,KAAK,CAAmB,CAAC,CAAC,CAAC;QAC1D,6BAAwB,GAAG,IAAI,KAAK,CAAmB,CAAC,CAAC,CAAC;QAC1D,oBAAe,GAAG,IAAI,KAAK,CAAmB,CAAC,CAAC,CAAC;QACjD,2BAAsB,GAAG,KAAK,CAAC;QAE9B,gBAAW,GAAG,KAAK,CAAC;QACpB,uBAAkB,GAAG,KAAK,CAAC;QAC3B,oCAA+B,GAAG,KAAK,CAAC;QACxC,oCAA+B,GAAG,KAAK,CAAC;QAM5C,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAED,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,+BAA+B,IAAI,IAAI,CAAC,+BAA+B,CAAC;IACnH,CAAC;IAED,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAW,UAAU,CAAC,KAAc;QAChC,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACnC,CAAC;IAEM,sBAAsB,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QACpE,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACnI,OAAO;QACX,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAE5B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;IACvC,CAAC;IAEM,+BAA+B,CAAC,MAAc,EAAE,MAAc,EAAE,MAAc,EAAE,MAAc;QACjG,IACI,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,KAAK,MAAM;YAC3C,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,KAAK,MAAM;YAC3C,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,KAAK,MAAM;YAC3C,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,KAAK,MAAM,EAC7C,CAAC;YACC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAC1C,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAC1C,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAC1C,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAE1C,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC;IAChD,CAAC;IAEM,0BAA0B,CAAC,GAAW,EAAE,KAAa;QACxD,IAAI,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YACzF,OAAO;QACX,CAAC;QAED,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACvC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAEzC,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC;IAChD,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAExC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAExC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAE/B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,+BAA+B,GAAG,KAAK,CAAC;QAC7C,IAAI,CAAC,+BAA+B,GAAG,KAAK,CAAC;QAC7C,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,EAAyB;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO;QACX,CAAC;QAED,cAAc;QACd,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACJ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QACpC,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,+BAA+B,EAAE,CAAC;YACvC,EAAE,CAAC,iBAAiB,CACR,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAChC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAChC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAChC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAC3C,CAAC;YACF,IAAI,CAAC,+BAA+B,GAAG,KAAK,CAAC;QACjD,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,+BAA+B,EAAE,CAAC;YACvC,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAE,CAAC,CAAC;YAC/F,IAAI,CAAC,+BAA+B,GAAG,KAAK,CAAC;QACjD,CAAC;QAED,YAAY;QACZ,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,EAAE,CAAC,UAAU,CAAS,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAU,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAU,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAU,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAClJ,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QACxC,CAAC;IACL,CAAC;CACJ","sourcesContent":["import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class AlphaState {\r\n public _blendFunctionParameters = new Array<Nullable<number>>(4);\r\n public _blendEquationParameters = new Array<Nullable<number>>(2);\r\n public _blendConstants = new Array<Nullable<number>>(4);\r\n public _isBlendConstantsDirty = false;\r\n\r\n private _alphaBlend = false;\r\n private _isAlphaBlendDirty = false;\r\n private _isBlendFunctionParametersDirty = false;\r\n private _isBlendEquationParametersDirty = false;\r\n\r\n /**\r\n * Initializes the state.\r\n */\r\n public constructor() {\r\n this.reset();\r\n }\r\n\r\n public get isDirty(): boolean {\r\n return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty;\r\n }\r\n\r\n public get alphaBlend(): boolean {\r\n return this._alphaBlend;\r\n }\r\n\r\n public set alphaBlend(value: boolean) {\r\n if (this._alphaBlend === value) {\r\n return;\r\n }\r\n\r\n this._alphaBlend = value;\r\n this._isAlphaBlendDirty = true;\r\n }\r\n\r\n public setAlphaBlendConstants(r: number, g: number, b: number, a: number): void {\r\n if (this._blendConstants[0] === r && this._blendConstants[1] === g && this._blendConstants[2] === b && this._blendConstants[3] === a) {\r\n return;\r\n }\r\n\r\n this._blendConstants[0] = r;\r\n this._blendConstants[1] = g;\r\n this._blendConstants[2] = b;\r\n this._blendConstants[3] = a;\r\n\r\n this._isBlendConstantsDirty = true;\r\n }\r\n\r\n public setAlphaBlendFunctionParameters(value0: number, value1: number, value2: number, value3: number): void {\r\n if (\r\n this._blendFunctionParameters[0] === value0 &&\r\n this._blendFunctionParameters[1] === value1 &&\r\n this._blendFunctionParameters[2] === value2 &&\r\n this._blendFunctionParameters[3] === value3\r\n ) {\r\n return;\r\n }\r\n\r\n this._blendFunctionParameters[0] = value0;\r\n this._blendFunctionParameters[1] = value1;\r\n this._blendFunctionParameters[2] = value2;\r\n this._blendFunctionParameters[3] = value3;\r\n\r\n this._isBlendFunctionParametersDirty = true;\r\n }\r\n\r\n public setAlphaEquationParameters(rgb: number, alpha: number): void {\r\n if (this._blendEquationParameters[0] === rgb && this._blendEquationParameters[1] === alpha) {\r\n return;\r\n }\r\n\r\n this._blendEquationParameters[0] = rgb;\r\n this._blendEquationParameters[1] = alpha;\r\n\r\n this._isBlendEquationParametersDirty = true;\r\n }\r\n\r\n public reset() {\r\n this._alphaBlend = false;\r\n this._blendFunctionParameters[0] = null;\r\n this._blendFunctionParameters[1] = null;\r\n this._blendFunctionParameters[2] = null;\r\n this._blendFunctionParameters[3] = null;\r\n\r\n this._blendEquationParameters[0] = null;\r\n this._blendEquationParameters[1] = null;\r\n\r\n this._blendConstants[0] = null;\r\n this._blendConstants[1] = null;\r\n this._blendConstants[2] = null;\r\n this._blendConstants[3] = null;\r\n\r\n this._isAlphaBlendDirty = true;\r\n this._isBlendFunctionParametersDirty = false;\r\n this._isBlendEquationParametersDirty = false;\r\n this._isBlendConstantsDirty = false;\r\n }\r\n\r\n public apply(gl: WebGLRenderingContext) {\r\n if (!this.isDirty) {\r\n return;\r\n }\r\n\r\n // Alpha blend\r\n if (this._isAlphaBlendDirty) {\r\n if (this._alphaBlend) {\r\n gl.enable(gl.BLEND);\r\n } else {\r\n gl.disable(gl.BLEND);\r\n }\r\n\r\n this._isAlphaBlendDirty = false;\r\n }\r\n\r\n // Alpha function\r\n if (this._isBlendFunctionParametersDirty) {\r\n gl.blendFuncSeparate(\r\n <number>this._blendFunctionParameters[0],\r\n <number>this._blendFunctionParameters[1],\r\n <number>this._blendFunctionParameters[2],\r\n <number>this._blendFunctionParameters[3]\r\n );\r\n this._isBlendFunctionParametersDirty = false;\r\n }\r\n\r\n // Alpha equation\r\n if (this._isBlendEquationParametersDirty) {\r\n gl.blendEquationSeparate(this._blendEquationParameters[0]!, this._blendEquationParameters[1]!);\r\n this._isBlendEquationParametersDirty = false;\r\n }\r\n\r\n // Constants\r\n if (this._isBlendConstantsDirty) {\r\n gl.blendColor(<number>this._blendConstants[0], <number>this._blendConstants[1], <number>this._blendConstants[2], <number>this._blendConstants[3]);\r\n this._isBlendConstantsDirty = false;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"alphaCullingState.js","sourceRoot":"","sources":["../../../../dev/core/src/States/alphaCullingState.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"core/Engines/constants\";\r\nimport type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class AlphaState {\r\n public _blendFunctionParameters = new Array<Nullable<number>>(4 * 8);\r\n public _blendEquationParameters = new Array<Nullable<number>>(2 * 8);\r\n public _blendConstants = new Array<Nullable<number>>(4);\r\n public _isBlendConstantsDirty = false;\r\n\r\n public _alphaBlend = Array(8).fill(false);\r\n public _numTargetEnabled = 0;\r\n\r\n private _isAlphaBlendDirty = false;\r\n private _isBlendFunctionParametersDirty = false;\r\n private _isBlendEquationParametersDirty = false;\r\n\r\n /**\r\n * Initializes the state.\r\n */\r\n public constructor() {\r\n this.reset();\r\n }\r\n\r\n public get isDirty(): boolean {\r\n return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty;\r\n }\r\n\r\n public get alphaBlend(): boolean {\r\n return this._numTargetEnabled > 0;\r\n }\r\n\r\n public setAlphaBlend(value: boolean, targetIndex: number = 0): void {\r\n if (this._alphaBlend[targetIndex] === value) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._numTargetEnabled++;\r\n } else {\r\n this._numTargetEnabled--;\r\n }\r\n\r\n this._alphaBlend[targetIndex] = value;\r\n this._isAlphaBlendDirty = true;\r\n }\r\n\r\n public setAlphaBlendConstants(r: number, g: number, b: number, a: number): void {\r\n if (this._blendConstants[0] === r && this._blendConstants[1] === g && this._blendConstants[2] === b && this._blendConstants[3] === a) {\r\n return;\r\n }\r\n\r\n this._blendConstants[0] = r;\r\n this._blendConstants[1] = g;\r\n this._blendConstants[2] = b;\r\n this._blendConstants[3] = a;\r\n\r\n this._isBlendConstantsDirty = true;\r\n }\r\n\r\n public setAlphaBlendFunctionParameters(srcRGBFactor: number, dstRGBFactor: number, srcAlphaFactor: number, dstAlphaFactor: number, targetIndex: number = 0): void {\r\n const offset = targetIndex * 4;\r\n\r\n if (\r\n this._blendFunctionParameters[offset + 0] === srcRGBFactor &&\r\n this._blendFunctionParameters[offset + 1] === dstRGBFactor &&\r\n this._blendFunctionParameters[offset + 2] === srcAlphaFactor &&\r\n this._blendFunctionParameters[offset + 3] === dstAlphaFactor\r\n ) {\r\n return;\r\n }\r\n\r\n this._blendFunctionParameters[offset + 0] = srcRGBFactor;\r\n this._blendFunctionParameters[offset + 1] = dstRGBFactor;\r\n this._blendFunctionParameters[offset + 2] = srcAlphaFactor;\r\n this._blendFunctionParameters[offset + 3] = dstAlphaFactor;\r\n\r\n this._isBlendFunctionParametersDirty = true;\r\n }\r\n\r\n public setAlphaEquationParameters(rgbEquation: number, alphaEquation: number, targetIndex: number = 0): void {\r\n const offset = targetIndex * 2;\r\n\r\n if (this._blendEquationParameters[offset + 0] === rgbEquation && this._blendEquationParameters[offset + 1] === alphaEquation) {\r\n return;\r\n }\r\n\r\n this._blendEquationParameters[offset + 0] = rgbEquation;\r\n this._blendEquationParameters[offset + 1] = alphaEquation;\r\n\r\n this._isBlendEquationParametersDirty = true;\r\n }\r\n\r\n public reset() {\r\n this._alphaBlend.fill(false);\r\n this._numTargetEnabled = 0;\r\n this._blendFunctionParameters.fill(null);\r\n this._blendEquationParameters.fill(null);\r\n\r\n this._blendConstants[0] = null;\r\n this._blendConstants[1] = null;\r\n this._blendConstants[2] = null;\r\n this._blendConstants[3] = null;\r\n\r\n this._isAlphaBlendDirty = true;\r\n this._isBlendFunctionParametersDirty = false;\r\n this._isBlendEquationParametersDirty = false;\r\n this._isBlendConstantsDirty = false;\r\n }\r\n\r\n public apply(gl: WebGLRenderingContext, numTargets: number = 1): void {\r\n if (!this.isDirty) {\r\n return;\r\n }\r\n\r\n // Alpha blend\r\n if (this._isAlphaBlendDirty) {\r\n if (numTargets === 1) {\r\n if (this._alphaBlend[0]) {\r\n gl.enable(gl.BLEND);\r\n } else {\r\n gl.disable(gl.BLEND);\r\n }\r\n } else {\r\n const gl2 = gl as WebGL2RenderingContext;\r\n for (let i = 0; i < numTargets; i++) {\r\n const index = i < this._numTargetEnabled ? i : 0;\r\n if (this._alphaBlend[index]) {\r\n gl2.enableIndexed(gl.BLEND, i);\r\n } else {\r\n gl2.disableIndexed(gl.BLEND, i);\r\n }\r\n }\r\n }\r\n\r\n this._isAlphaBlendDirty = false;\r\n }\r\n\r\n // Alpha function\r\n if (this._isBlendFunctionParametersDirty) {\r\n if (numTargets === 1) {\r\n gl.blendFuncSeparate(\r\n <number>this._blendFunctionParameters[0],\r\n <number>this._blendFunctionParameters[1],\r\n <number>this._blendFunctionParameters[2],\r\n <number>this._blendFunctionParameters[3]\r\n );\r\n } else {\r\n const gl2 = gl as WebGL2RenderingContext;\r\n for (let i = 0; i < numTargets; i++) {\r\n const offset = i < this._numTargetEnabled ? i * 4 : 0;\r\n gl2.blendFuncSeparateIndexed(\r\n i,\r\n <number>this._blendFunctionParameters[offset + 0],\r\n <number>this._blendFunctionParameters[offset + 1],\r\n <number>this._blendFunctionParameters[offset + 2],\r\n <number>this._blendFunctionParameters[offset + 3]\r\n );\r\n }\r\n }\r\n this._isBlendFunctionParametersDirty = false;\r\n }\r\n\r\n // Alpha equation\r\n if (this._isBlendEquationParametersDirty) {\r\n if (numTargets === 1) {\r\n gl.blendEquationSeparate(<number>this._blendEquationParameters[0], <number>this._blendEquationParameters[1]);\r\n } else {\r\n const gl2 = gl as WebGL2RenderingContext;\r\n for (let i = 0; i < numTargets; i++) {\r\n const offset = i < this._numTargetEnabled ? i * 2 : 0;\r\n gl2.blendEquationSeparateIndexed(i, <number>this._blendEquationParameters[offset + 0], <number>this._blendEquationParameters[offset + 1]);\r\n }\r\n }\r\n this._isBlendEquationParametersDirty = false;\r\n }\r\n\r\n // Constants\r\n if (this._isBlendConstantsDirty) {\r\n gl.blendColor(<number>this._blendConstants[0], <number>this._blendConstants[1], <number>this._blendConstants[2], <number>this._blendConstants[3]);\r\n this._isBlendConstantsDirty = false;\r\n }\r\n }\r\n\r\n public setAlphaMode(mode: number, targetIndex: number) {\r\n let equation = Constants.GL_ALPHA_EQUATION_ADD;\r\n\r\n switch (mode) {\r\n case Constants.ALPHA_DISABLE:\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED_PORTERDUFF:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, targetIndex);\r\n break;\r\n case Constants.ALPHA_COMBINE:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_ONEONE:\r\n this.setAlphaBlendFunctionParameters(1, 1, 0, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_ADD:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, 1, 0, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_SUBTRACT:\r\n this.setAlphaBlendFunctionParameters(0, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, 1, targetIndex);\r\n equation = Constants.GL_ALPHA_EQUATION_SUBTRACT;\r\n break;\r\n case Constants.ALPHA_MULTIPLY:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_DST_COLOR, 0, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_MAXIMIZED:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_INTERPOLATE:\r\n this.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 targetIndex\r\n );\r\n break;\r\n case Constants.ALPHA_SCREENMODE:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, targetIndex);\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEONE:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_ALPHATOCOLOR:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_DST_ALPHA, 1, 0, 0, targetIndex);\r\n break;\r\n case Constants.ALPHA_REVERSEONEMINUS:\r\n this.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 targetIndex\r\n );\r\n break;\r\n case Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, targetIndex);\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEZERO:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 0, targetIndex);\r\n break;\r\n case Constants.ALPHA_EXCLUSION:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 0, 1, targetIndex);\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.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 targetIndex\r\n );\r\n break;\r\n case Constants.ALPHA_MIN:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);\r\n equation = Constants.GL_ALPHA_EQUATION_MIN;\r\n break;\r\n case Constants.ALPHA_MAX:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);\r\n equation = Constants.GL_ALPHA_EQUATION_MAX;\r\n break;\r\n case Constants.ALPHA_DUAL_SRC0_ADD_SRC1xDST:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_SRC1_COLOR, 0, 1, targetIndex);\r\n break;\r\n }\r\n\r\n this.setAlphaEquationParameters(equation, equation, targetIndex);\r\n }\r\n}\r\n"]}
@@ -14,6 +14,9 @@ export declare class StencilState implements IStencilState {
14
14
  func: number;
15
15
  get stencilFunc(): number;
16
16
  set stencilFunc(value: number);
17
+ backFunc: number;
18
+ get stencilBackFunc(): number;
19
+ set stencilBackFunc(value: number);
17
20
  funcRef: number;
18
21
  get stencilFuncRef(): number;
19
22
  set stencilFuncRef(value: number);
@@ -29,6 +32,15 @@ export declare class StencilState implements IStencilState {
29
32
  opStencilDepthPass: number;
30
33
  get stencilOpStencilDepthPass(): number;
31
34
  set stencilOpStencilDepthPass(value: number);
35
+ backOpStencilFail: number;
36
+ get stencilBackOpStencilFail(): number;
37
+ set stencilBackOpStencilFail(value: number);
38
+ backOpDepthFail: number;
39
+ get stencilBackOpDepthFail(): number;
40
+ set stencilBackOpDepthFail(value: number);
41
+ backOpStencilDepthPass: number;
42
+ get stencilBackOpStencilDepthPass(): number;
43
+ set stencilBackOpStencilDepthPass(value: number);
32
44
  mask: number;
33
45
  get stencilMask(): number;
34
46
  set stencilMask(value: number);