@babylonjs/core 5.0.0-alpha.59 → 5.0.0-alpha.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animation.d.ts +20 -0
- package/Animations/animation.js +57 -8
- package/Animations/animation.js.map +1 -1
- package/Animations/animationKey.d.ts +4 -0
- package/Animations/animationKey.js +4 -0
- package/Animations/animationKey.js.map +1 -1
- package/Audio/sound.js +1 -1
- package/Audio/sound.js.map +1 -1
- package/BakedVertexAnimation/bakedVertexAnimationManager.d.ts +130 -0
- package/BakedVertexAnimation/bakedVertexAnimationManager.js +134 -0
- package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -0
- package/BakedVertexAnimation/index.d.ts +2 -0
- package/BakedVertexAnimation/index.js +3 -0
- package/BakedVertexAnimation/index.js.map +1 -0
- package/BakedVertexAnimation/vertexAnimationBaker.d.ts +65 -0
- package/BakedVertexAnimation/vertexAnimationBaker.js +155 -0
- package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -0
- package/Behaviors/Cameras/autoRotationBehavior.d.ts +5 -0
- package/Behaviors/Cameras/autoRotationBehavior.js +7 -0
- package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
- package/Behaviors/Cameras/framingBehavior.d.ts +5 -0
- package/Behaviors/Cameras/framingBehavior.js +8 -1
- package/Behaviors/Cameras/framingBehavior.js.map +1 -1
- package/Bones/bone.d.ts +3 -1
- package/Bones/bone.js +4 -1
- package/Bones/bone.js.map +1 -1
- package/Cameras/Inputs/BaseCameraPointersInput.js +4 -6
- package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
- package/Cameras/Inputs/flyCameraMouseInput.js +4 -4
- package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.js +4 -4
- package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
- package/Cameras/camera.js +8 -2
- package/Cameras/camera.js.map +1 -1
- package/Cameras/targetCamera.js +1 -1
- package/Cameras/targetCamera.js.map +1 -1
- package/Culling/boundingBox.d.ts +4 -0
- package/Culling/boundingBox.js +8 -0
- package/Culling/boundingBox.js.map +1 -1
- package/Debug/physicsViewer.js +1 -1
- package/Debug/physicsViewer.js.map +1 -1
- package/Debug/skeletonViewer.js +2 -2
- package/Debug/skeletonViewer.js.map +1 -1
- package/DeviceInput/Implementations/nativeDeviceInputWrapper.d.ts +6 -1
- package/DeviceInput/Implementations/nativeDeviceInputWrapper.js +16 -1
- package/DeviceInput/Implementations/nativeDeviceInputWrapper.js.map +1 -1
- package/DeviceInput/Implementations/webDeviceInputSystem.js +10 -10
- package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
- package/DeviceInput/deviceInputSystem.js +6 -1
- package/DeviceInput/deviceInputSystem.js.map +1 -1
- package/Engines/Extensions/engine.dynamicTexture.d.ts +2 -1
- package/Engines/Extensions/engine.dynamicTexture.js +2 -1
- package/Engines/Extensions/engine.dynamicTexture.js.map +1 -1
- package/Engines/Extensions/engine.multiview.js +17 -6
- package/Engines/Extensions/engine.multiview.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.dynamicTexture.js +3 -11
- package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.js +0 -4
- package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.query.js +19 -3
- package/Engines/WebGPU/Extensions/engine.query.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTarget.js +0 -4
- package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/WebGPU/webgpuBundleList.d.ts +13 -0
- package/Engines/WebGPU/webgpuBundleList.js +27 -0
- package/Engines/WebGPU/webgpuBundleList.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +42 -61
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheSampler.js +6 -4
- package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
- package/Engines/WebGPU/webgpuConstants.d.ts +57 -13
- package/Engines/WebGPU/webgpuConstants.js +62 -13
- package/Engines/WebGPU/webgpuConstants.js.map +1 -1
- package/Engines/WebGPU/webgpuHardwareTexture.d.ts +25 -2
- package/Engines/WebGPU/webgpuHardwareTexture.js +2 -1
- package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +6 -0
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +6 -0
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/WebGPU/webgpuSnapshotRendering.d.ts +27 -0
- package/Engines/WebGPU/webgpuSnapshotRendering.js +107 -0
- package/Engines/WebGPU/webgpuSnapshotRendering.js.map +1 -0
- package/Engines/WebGPU/webgpuTextureHelper.d.ts +4 -4
- package/Engines/WebGPU/webgpuTextureHelper.js +273 -80
- package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
- package/Engines/constants.d.ts +2 -0
- package/Engines/constants.js +2 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +94 -40
- package/Engines/engine.js +43 -1
- package/Engines/engine.js.map +1 -1
- package/Engines/engineFeatures.d.ts +2 -0
- package/Engines/engineFeatures.js.map +1 -1
- package/Engines/index.d.ts +1 -0
- package/Engines/index.js +1 -0
- package/Engines/index.js.map +1 -1
- package/Engines/nativeEngine.js +49 -23
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/nullEngine.js +1 -0
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/thinEngine.d.ts +0 -11
- package/Engines/thinEngine.js +12 -40
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +6 -6
- package/Engines/webgpuEngine.js +28 -71
- package/Engines/webgpuEngine.js.map +1 -1
- package/Helpers/sceneHelpers.d.ts +3 -3
- package/Helpers/sceneHelpers.js +1 -2
- package/Helpers/sceneHelpers.js.map +1 -1
- package/Inputs/scene.inputManager.js +12 -14
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Layers/effectLayer.d.ts +13 -1
- package/Layers/effectLayer.js +115 -65
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/highlightLayer.d.ts +2 -1
- package/Layers/highlightLayer.js +6 -3
- package/Layers/highlightLayer.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.d.ts +1 -0
- package/Lights/Shadows/cascadedShadowGenerator.js +14 -0
- package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.d.ts +4 -0
- package/Lights/Shadows/shadowGenerator.js +31 -3
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/light.js +7 -1
- package/Lights/light.js.map +1 -1
- package/Lights/pointLight.js +1 -1
- package/Lights/pointLight.js.map +1 -1
- package/Lights/spotLight.js +1 -1
- package/Lights/spotLight.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.js +17 -4
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Materials/Background/backgroundMaterial.js +1 -0
- package/Materials/Background/backgroundMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +10 -0
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +31 -0
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/index.d.ts +2 -0
- package/Materials/Node/Blocks/Fragment/index.js +2 -0
- package/Materials/Node/Blocks/Fragment/index.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/screenSpaceBlock.d.ts +41 -0
- package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js +128 -0
- package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js.map +1 -0
- package/Materials/Node/Blocks/Fragment/twirlBlock.d.ts +49 -0
- package/Materials/Node/Blocks/Fragment/twirlBlock.js +145 -0
- package/Materials/Node/Blocks/Fragment/twirlBlock.js.map +1 -0
- package/Materials/Node/Blocks/Input/inputBlock.js +1 -1
- package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/vertexOutputBlock.d.ts +1 -0
- package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js +15 -0
- package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/customBlock.d.ts +31 -0
- package/Materials/Node/Blocks/customBlock.js +144 -0
- package/Materials/Node/Blocks/customBlock.js.map +1 -0
- package/Materials/Node/Blocks/index.d.ts +2 -0
- package/Materials/Node/Blocks/index.js +2 -0
- package/Materials/Node/Blocks/index.js.map +1 -1
- package/Materials/Node/Blocks/vectorMergerBlock.js +4 -4
- package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
- package/Materials/Node/Blocks/voronoiNoiseBlock.d.ts +39 -0
- package/Materials/Node/Blocks/voronoiNoiseBlock.js +107 -0
- package/Materials/Node/Blocks/voronoiNoiseBlock.js.map +1 -0
- package/Materials/Node/Blocks/worleyNoise3DBlock.d.ts +8 -0
- package/Materials/Node/Blocks/worleyNoise3DBlock.js +34 -2
- package/Materials/Node/Blocks/worleyNoise3DBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +1 -0
- package/Materials/Node/nodeMaterial.js +2 -0
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildStateSharedData.d.ts +5 -0
- package/Materials/Node/nodeMaterialBuildStateSharedData.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +2 -0
- package/Materials/PBR/pbrBaseMaterial.js +12 -5
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +11 -0
- package/Materials/PBR/pbrSubSurfaceConfiguration.js +18 -3
- package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
- package/Materials/Textures/dynamicTexture.d.ts +2 -1
- package/Materials/Textures/dynamicTexture.js +4 -2
- package/Materials/Textures/dynamicTexture.js.map +1 -1
- package/Materials/Textures/hdrCubeTexture.d.ts +9 -0
- package/Materials/Textures/hdrCubeTexture.js +21 -5
- package/Materials/Textures/hdrCubeTexture.js.map +1 -1
- package/Materials/Textures/mirrorTexture.d.ts +2 -0
- package/Materials/Textures/mirrorTexture.js +13 -0
- package/Materials/Textures/mirrorTexture.js.map +1 -1
- package/Materials/Textures/thinRenderTargetTexture.js +1 -1
- package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
- package/Materials/Textures/thinTexture.d.ts +1 -2
- package/Materials/Textures/thinTexture.js +2 -4
- package/Materials/Textures/thinTexture.js.map +1 -1
- package/Materials/imageProcessingConfiguration.d.ts +16 -1
- package/Materials/imageProcessingConfiguration.js +31 -0
- package/Materials/imageProcessingConfiguration.js.map +1 -1
- package/Materials/materialHelper.d.ts +15 -1
- package/Materials/materialHelper.js +40 -3
- package/Materials/materialHelper.js.map +1 -1
- package/Materials/pushMaterial.d.ts +2 -2
- package/Materials/pushMaterial.js +7 -3
- package/Materials/pushMaterial.js.map +1 -1
- package/Materials/shaderMaterial.d.ts +6 -5
- package/Materials/shaderMaterial.js +70 -28
- package/Materials/shaderMaterial.js.map +1 -1
- package/Materials/shadowDepthWrapper.js +7 -7
- package/Materials/shadowDepthWrapper.js.map +1 -1
- package/Materials/standardMaterial.d.ts +2 -0
- package/Materials/standardMaterial.js +11 -1
- package/Materials/standardMaterial.js.map +1 -1
- package/Materials/uniformBuffer.js +1 -2
- package/Materials/uniformBuffer.js.map +1 -1
- package/Maths/math.color.d.ts +20 -0
- package/Maths/math.color.js +45 -2
- package/Maths/math.color.js.map +1 -1
- package/Maths/math.vector.d.ts +14 -9
- package/Maths/math.vector.js +36 -17
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Builders/boxBuilder.d.ts +1 -1
- package/Meshes/Builders/boxBuilder.js +1 -0
- package/Meshes/Builders/boxBuilder.js.map +1 -1
- package/Meshes/Builders/cylinderBuilder.d.ts +17 -17
- package/Meshes/Builders/cylinderBuilder.js +1 -0
- package/Meshes/Builders/cylinderBuilder.js.map +1 -1
- package/Meshes/Builders/discBuilder.d.ts +1 -1
- package/Meshes/Builders/discBuilder.js +1 -0
- package/Meshes/Builders/discBuilder.js.map +1 -1
- package/Meshes/Builders/groundBuilder.d.ts +8 -8
- package/Meshes/Builders/groundBuilder.js +2 -0
- package/Meshes/Builders/groundBuilder.js.map +1 -1
- package/Meshes/Builders/hemisphereBuilder.d.ts +4 -4
- package/Meshes/Builders/hemisphereBuilder.js +1 -0
- package/Meshes/Builders/hemisphereBuilder.js.map +1 -1
- package/Meshes/Builders/icoSphereBuilder.d.ts +1 -1
- package/Meshes/Builders/icoSphereBuilder.js +1 -0
- package/Meshes/Builders/icoSphereBuilder.js.map +1 -1
- package/Meshes/Builders/planeBuilder.d.ts +1 -1
- package/Meshes/Builders/planeBuilder.js +1 -0
- package/Meshes/Builders/planeBuilder.js.map +1 -1
- package/Meshes/Builders/polyhedronBuilder.d.ts +1 -1
- package/Meshes/Builders/polyhedronBuilder.js +1 -0
- package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
- package/Meshes/Builders/sphereBuilder.d.ts +1 -1
- package/Meshes/Builders/sphereBuilder.js +1 -0
- package/Meshes/Builders/sphereBuilder.js.map +1 -1
- package/Meshes/Builders/torusBuilder.d.ts +8 -8
- package/Meshes/Builders/torusBuilder.js +1 -0
- package/Meshes/Builders/torusBuilder.js.map +1 -1
- package/Meshes/Builders/torusKnotBuilder.d.ts +11 -11
- package/Meshes/Builders/torusKnotBuilder.js +1 -0
- package/Meshes/Builders/torusKnotBuilder.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +22 -2
- package/Meshes/abstractMesh.js +78 -28
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/geometry.d.ts +3 -0
- package/Meshes/geometry.js +15 -7
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/linesMesh.d.ts +0 -2
- package/Meshes/linesMesh.js +3 -35
- package/Meshes/linesMesh.js.map +1 -1
- package/Meshes/mesh.d.ts +12 -0
- package/Meshes/mesh.js +186 -117
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/mesh.vertexData.d.ts +6 -1
- package/Meshes/mesh.vertexData.js +295 -114
- package/Meshes/mesh.vertexData.js.map +1 -1
- package/Meshes/thinInstanceMesh.js +6 -5
- package/Meshes/thinInstanceMesh.js.map +1 -1
- package/Meshes/transformNode.d.ts +8 -8
- package/Meshes/transformNode.js +25 -17
- package/Meshes/transformNode.js.map +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.d.ts +1 -0
- package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js +13 -8
- package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js.map +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollector.js +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
- package/Misc/basis.d.ts +3 -2
- package/Misc/basis.js +31 -15
- package/Misc/basis.js.map +1 -1
- package/Misc/coroutine.d.ts +45 -0
- package/Misc/coroutine.js +123 -0
- package/Misc/coroutine.js.map +1 -0
- package/Misc/index.d.ts +1 -0
- package/Misc/index.js +1 -0
- package/Misc/index.js.map +1 -1
- package/Misc/observableCoroutine.d.ts +9 -10
- package/Misc/observableCoroutine.js +31 -39
- package/Misc/observableCoroutine.js.map +1 -1
- package/Misc/sceneSerializer.js +0 -3
- package/Misc/sceneSerializer.js.map +1 -1
- package/Misc/tools.d.ts +2 -4
- package/Misc/tools.js +6 -10
- package/Misc/tools.js.map +1 -1
- package/Particles/particleSystem.js +19 -16
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/solidParticleSystem.js +29 -5
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/subEmitter.js +1 -0
- package/Particles/subEmitter.js.map +1 -1
- package/Physics/Plugins/ammoJSPlugin.js +10 -8
- package/Physics/Plugins/ammoJSPlugin.js.map +1 -1
- package/PostProcesses/imageProcessingPostProcess.js +1 -0
- package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
- package/Probes/reflectionProbe.d.ts +2 -0
- package/Probes/reflectionProbe.js +21 -0
- package/Probes/reflectionProbe.js.map +1 -1
- package/Rendering/boundingBoxRenderer.d.ts +3 -0
- package/Rendering/boundingBoxRenderer.js +49 -14
- package/Rendering/boundingBoxRenderer.js.map +1 -1
- package/Rendering/depthRenderer.d.ts +1 -1
- package/Rendering/depthRenderer.js +2 -2
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/edgesRenderer.js +3 -1
- package/Rendering/edgesRenderer.js.map +1 -1
- package/Rendering/geometryBufferRenderer.d.ts +0 -2
- package/Rendering/geometryBufferRenderer.js +13 -10
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/bakedVertexAnimation.d.ts +5 -0
- package/Shaders/ShadersInclude/bakedVertexAnimation.js +7 -0
- package/Shaders/ShadersInclude/bakedVertexAnimation.js.map +1 -0
- package/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.d.ts +5 -0
- package/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.js +7 -0
- package/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.js.map +1 -0
- package/Shaders/ShadersInclude/bonesDeclaration.js +1 -1
- package/Shaders/ShadersInclude/bonesDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/bonesVertex.js +1 -1
- package/Shaders/ShadersInclude/bonesVertex.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockImageProcessing.js +1 -1
- package/Shaders/ShadersInclude/pbrBlockImageProcessing.js.map +1 -1
- package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +1 -1
- package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
- package/Shaders/background.fragment.js +1 -1
- package/Shaders/background.fragment.js.map +1 -1
- package/Shaders/background.vertex.d.ts +2 -0
- package/Shaders/background.vertex.js +3 -1
- package/Shaders/background.vertex.js.map +1 -1
- package/Shaders/color.vertex.d.ts +2 -0
- package/Shaders/color.vertex.js +3 -1
- package/Shaders/color.vertex.js.map +1 -1
- package/Shaders/default.vertex.d.ts +2 -0
- package/Shaders/default.vertex.js +3 -1
- package/Shaders/default.vertex.js.map +1 -1
- package/Shaders/depth.vertex.d.ts +2 -0
- package/Shaders/depth.vertex.js +3 -1
- package/Shaders/depth.vertex.js.map +1 -1
- package/Shaders/geometry.vertex.d.ts +2 -0
- package/Shaders/geometry.vertex.js +3 -1
- package/Shaders/geometry.vertex.js.map +1 -1
- package/Shaders/glowMapGeneration.vertex.d.ts +2 -0
- package/Shaders/glowMapGeneration.vertex.js +3 -1
- package/Shaders/glowMapGeneration.vertex.js.map +1 -1
- package/Shaders/outline.vertex.d.ts +2 -0
- package/Shaders/outline.vertex.js +3 -1
- package/Shaders/outline.vertex.js.map +1 -1
- package/Shaders/pbr.vertex.d.ts +2 -0
- package/Shaders/pbr.vertex.js +3 -1
- package/Shaders/pbr.vertex.js.map +1 -1
- package/Shaders/shadowMap.vertex.d.ts +2 -0
- package/Shaders/shadowMap.vertex.js +3 -1
- package/Shaders/shadowMap.vertex.js.map +1 -1
- package/Shaders/volumetricLightScatteringPass.vertex.d.ts +2 -0
- package/Shaders/volumetricLightScatteringPass.vertex.js +3 -1
- package/Shaders/volumetricLightScatteringPass.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.js +7 -0
- package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.js +7 -0
- package/ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/bonesDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/bonesDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bonesVertex.js +1 -1
- package/ShadersWGSL/ShadersInclude/bonesVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/clipPlaneFragment.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneFragment.js +7 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneFragment.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration.js +7 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneVertex.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneVertex.js +7 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneVertex.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration.js +7 -0
- package/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration.js.map +1 -0
- package/Sprites/spriteRenderer.d.ts +1 -0
- package/Sprites/spriteRenderer.js +13 -1
- package/Sprites/spriteRenderer.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.d.ts +14 -0
- package/XR/features/WebXRControllerPointerSelection.js +38 -10
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/XR/features/WebXRNearInteraction.d.ts +1 -0
- package/XR/features/WebXRNearInteraction.js +2 -0
- package/XR/features/WebXRNearInteraction.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/node.d.ts +30 -1
- package/node.js +12 -0
- package/node.js.map +1 -1
- package/package.json +52 -1
- package/scene.d.ts +10 -0
- package/scene.js +27 -0
- package/scene.js.map +1 -1
package/Layers/effectLayer.js
CHANGED
|
@@ -85,7 +85,7 @@ var EffectLayer = /** @class */ (function () {
|
|
|
85
85
|
this._engine = this._scene.getEngine();
|
|
86
86
|
this._maxSize = this._engine.getCaps().maxTextureSize;
|
|
87
87
|
this._scene.effectLayers.push(this);
|
|
88
|
-
this._mergeDrawWrapper =
|
|
88
|
+
this._mergeDrawWrapper = [];
|
|
89
89
|
// Generate Buffers
|
|
90
90
|
this._generateIndexBuffer();
|
|
91
91
|
this._generateVertexBuffer();
|
|
@@ -113,6 +113,21 @@ var EffectLayer = /** @class */ (function () {
|
|
|
113
113
|
enumerable: false,
|
|
114
114
|
configurable: true
|
|
115
115
|
});
|
|
116
|
+
/**
|
|
117
|
+
* Sets a specific material to be used to render a mesh/a list of meshes in the layer
|
|
118
|
+
* @param mesh mesh or array of meshes
|
|
119
|
+
* @param material material to use by the layer when rendering the mesh(es). If undefined is passed, the specific material created by the layer will be used.
|
|
120
|
+
*/
|
|
121
|
+
EffectLayer.prototype.setMaterialForRendering = function (mesh, material) {
|
|
122
|
+
this._mainTexture.setMaterialForRendering(mesh, material);
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Number of times _internalRender will be called. Some effect layers need to render the mesh several times, so they should override this method with the number of times the mesh should be rendered
|
|
126
|
+
* @returns Number of times a mesh must be rendered in the layer
|
|
127
|
+
*/
|
|
128
|
+
EffectLayer.prototype._numInternalDraws = function () {
|
|
129
|
+
return 1;
|
|
130
|
+
};
|
|
116
131
|
/**
|
|
117
132
|
* Initializes the effect layer with the required options.
|
|
118
133
|
* @param options Sets of none mandatory options to use with the layer (see IEffectLayerOptions for more information)
|
|
@@ -123,7 +138,6 @@ var EffectLayer = /** @class */ (function () {
|
|
|
123
138
|
this._setMainTextureSize();
|
|
124
139
|
this._createMainTexture();
|
|
125
140
|
this._createTextureAndPostProcesses();
|
|
126
|
-
this._mergeDrawWrapper.setEffect(this._createMergeEffect());
|
|
127
141
|
};
|
|
128
142
|
/**
|
|
129
143
|
* Generates the index buffer of the full screen quad blending to the main canvas.
|
|
@@ -240,6 +254,13 @@ var EffectLayer = /** @class */ (function () {
|
|
|
240
254
|
* @return true if ready otherwise, false
|
|
241
255
|
*/
|
|
242
256
|
EffectLayer.prototype._isReady = function (subMesh, useInstances, emissiveTexture) {
|
|
257
|
+
var _a;
|
|
258
|
+
var engine = this._scene.getEngine();
|
|
259
|
+
var mesh = subMesh.getMesh();
|
|
260
|
+
var renderingMaterial = (_a = mesh._internalAbstractMeshDataInfo._materialForRenderPass) === null || _a === void 0 ? void 0 : _a[engine.currentRenderPassId];
|
|
261
|
+
if (renderingMaterial) {
|
|
262
|
+
return renderingMaterial.isReadyForSubMesh(mesh, subMesh, useInstances);
|
|
263
|
+
}
|
|
243
264
|
var material = subMesh.getMaterial();
|
|
244
265
|
if (!material) {
|
|
245
266
|
return false;
|
|
@@ -249,7 +270,6 @@ var EffectLayer = /** @class */ (function () {
|
|
|
249
270
|
}
|
|
250
271
|
var defines = [];
|
|
251
272
|
var attribs = [VertexBuffer.PositionKind];
|
|
252
|
-
var mesh = subMesh.getMesh();
|
|
253
273
|
var uv1 = false;
|
|
254
274
|
var uv2 = false;
|
|
255
275
|
// Diffuse
|
|
@@ -383,29 +403,40 @@ var EffectLayer = /** @class */ (function () {
|
|
|
383
403
|
* Renders the glowing part of the scene by blending the blurred glowing meshes on top of the rendered scene.
|
|
384
404
|
*/
|
|
385
405
|
EffectLayer.prototype.render = function () {
|
|
386
|
-
var currentEffect = this._mergeDrawWrapper;
|
|
387
|
-
// Check
|
|
388
|
-
if (!currentEffect.effect.isReady()) {
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
406
|
for (var i = 0; i < this._postProcesses.length; i++) {
|
|
392
407
|
if (!this._postProcesses[i].isReady()) {
|
|
393
408
|
return;
|
|
394
409
|
}
|
|
395
410
|
}
|
|
396
411
|
var engine = this._scene.getEngine();
|
|
412
|
+
var numDraws = this._numInternalDraws();
|
|
413
|
+
// Check
|
|
414
|
+
var isReady = true;
|
|
415
|
+
for (var i_1 = 0; i_1 < numDraws; ++i_1) {
|
|
416
|
+
var currentEffect = this._mergeDrawWrapper[i_1];
|
|
417
|
+
if (!currentEffect) {
|
|
418
|
+
currentEffect = this._mergeDrawWrapper[i_1] = new DrawWrapper(this._engine);
|
|
419
|
+
currentEffect.setEffect(this._createMergeEffect());
|
|
420
|
+
}
|
|
421
|
+
isReady = isReady && currentEffect.effect.isReady();
|
|
422
|
+
}
|
|
423
|
+
if (!isReady) {
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
397
426
|
this.onBeforeComposeObservable.notifyObservers(this);
|
|
398
|
-
// Render
|
|
399
|
-
engine.enableEffect(currentEffect);
|
|
400
|
-
engine.setState(false);
|
|
401
|
-
// VBOs
|
|
402
|
-
engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect.effect);
|
|
403
|
-
// Cache
|
|
404
427
|
var previousAlphaMode = engine.getAlphaMode();
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
428
|
+
for (var i_2 = 0; i_2 < numDraws; ++i_2) {
|
|
429
|
+
var currentEffect = this._mergeDrawWrapper[i_2];
|
|
430
|
+
// Render
|
|
431
|
+
engine.enableEffect(currentEffect);
|
|
432
|
+
engine.setState(false);
|
|
433
|
+
// VBOs
|
|
434
|
+
engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect.effect);
|
|
435
|
+
// Go Blend.
|
|
436
|
+
engine.setAlphaMode(this._effectLayerOptions.alphaBlendingMode);
|
|
437
|
+
// Blends the map on the main canvas.
|
|
438
|
+
this._internalRender(currentEffect.effect, i_2);
|
|
439
|
+
}
|
|
409
440
|
// Restore Alpha
|
|
410
441
|
engine.setAlphaMode(previousAlphaMode);
|
|
411
442
|
this.onAfterComposeObservable.notifyObservers(this);
|
|
@@ -467,7 +498,7 @@ var EffectLayer = /** @class */ (function () {
|
|
|
467
498
|
* Renders the submesh passed in parameter to the generation map.
|
|
468
499
|
*/
|
|
469
500
|
EffectLayer.prototype._renderSubMesh = function (subMesh, enableAlphaMode) {
|
|
470
|
-
var _a;
|
|
501
|
+
var _a, _b;
|
|
471
502
|
if (enableAlphaMode === void 0) { enableAlphaMode = false; }
|
|
472
503
|
if (!this.shouldRender()) {
|
|
473
504
|
return;
|
|
@@ -511,64 +542,78 @@ var EffectLayer = /** @class */ (function () {
|
|
|
511
542
|
renderingMesh.render(subMesh, hardwareInstancedRendering, replacementMesh || undefined);
|
|
512
543
|
}
|
|
513
544
|
else if (this._isReady(subMesh, hardwareInstancedRendering, this._emissiveTextureAndColor.texture)) {
|
|
545
|
+
var renderingMaterial = (_b = effectiveMesh._internalAbstractMeshDataInfo._materialForRenderPass) === null || _b === void 0 ? void 0 : _b[engine.currentRenderPassId];
|
|
514
546
|
var drawWrapper = subMesh._getDrawWrapper();
|
|
547
|
+
if (!drawWrapper && renderingMaterial) {
|
|
548
|
+
drawWrapper = renderingMaterial._getDrawWrapper();
|
|
549
|
+
}
|
|
550
|
+
if (!drawWrapper) {
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
515
553
|
var effect_1 = drawWrapper.effect;
|
|
516
554
|
engine.enableEffect(drawWrapper);
|
|
517
555
|
if (!hardwareInstancedRendering) {
|
|
518
556
|
var fillMode = scene.forcePointsCloud ? Material.PointFillMode : scene.forceWireframe ? Material.WireFrameFillMode : material.fillMode;
|
|
519
557
|
renderingMesh._bind(subMesh, effect_1, fillMode);
|
|
520
558
|
}
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
var diffuseTexture = material.getAlphaTestTexture();
|
|
526
|
-
var needAlphaBlendFromDiffuse = diffuseTexture && diffuseTexture.hasAlpha &&
|
|
527
|
-
(material.useAlphaFromDiffuseTexture || material._useAlphaFromAlbedoTexture);
|
|
528
|
-
if (diffuseTexture && (needAlphaTest || needAlphaBlendFromDiffuse)) {
|
|
529
|
-
effect_1.setTexture("diffuseSampler", diffuseTexture);
|
|
530
|
-
var textureMatrix = diffuseTexture.getTextureMatrix();
|
|
531
|
-
if (textureMatrix) {
|
|
532
|
-
effect_1.setMatrix("diffuseMatrix", textureMatrix);
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
var opacityTexture = material.opacityTexture;
|
|
536
|
-
if (opacityTexture) {
|
|
537
|
-
effect_1.setTexture("opacitySampler", opacityTexture);
|
|
538
|
-
effect_1.setFloat("opacityIntensity", opacityTexture.level);
|
|
539
|
-
var textureMatrix = opacityTexture.getTextureMatrix();
|
|
540
|
-
if (textureMatrix) {
|
|
541
|
-
effect_1.setMatrix("opacityMatrix", textureMatrix);
|
|
542
|
-
}
|
|
559
|
+
if (!renderingMaterial) {
|
|
560
|
+
effect_1.setMatrix("viewProjection", scene.getTransformMatrix());
|
|
561
|
+
effect_1.setMatrix("world", effectiveMesh.getWorldMatrix());
|
|
562
|
+
effect_1.setFloat4("glowColor", this._emissiveTextureAndColor.color.r, this._emissiveTextureAndColor.color.g, this._emissiveTextureAndColor.color.b, this._emissiveTextureAndColor.color.a);
|
|
543
563
|
}
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
effect_1.setTexture("emissiveSampler", this._emissiveTextureAndColor.texture);
|
|
547
|
-
effect_1.setMatrix("emissiveMatrix", this._emissiveTextureAndColor.texture.getTextureMatrix());
|
|
564
|
+
else {
|
|
565
|
+
renderingMaterial.bindForSubMesh(effectiveMesh.getWorldMatrix(), effectiveMesh, subMesh);
|
|
548
566
|
}
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
var
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
567
|
+
if (!renderingMaterial) {
|
|
568
|
+
var needAlphaTest = material.needAlphaTesting();
|
|
569
|
+
var diffuseTexture = material.getAlphaTestTexture();
|
|
570
|
+
var needAlphaBlendFromDiffuse = diffuseTexture && diffuseTexture.hasAlpha &&
|
|
571
|
+
(material.useAlphaFromDiffuseTexture || material._useAlphaFromAlbedoTexture);
|
|
572
|
+
if (diffuseTexture && (needAlphaTest || needAlphaBlendFromDiffuse)) {
|
|
573
|
+
effect_1.setTexture("diffuseSampler", diffuseTexture);
|
|
574
|
+
var textureMatrix = diffuseTexture.getTextureMatrix();
|
|
575
|
+
if (textureMatrix) {
|
|
576
|
+
effect_1.setMatrix("diffuseMatrix", textureMatrix);
|
|
556
577
|
}
|
|
557
|
-
effect_1.setTexture("boneSampler", boneTexture);
|
|
558
|
-
effect_1.setFloat("boneTextureWidth", 4.0 * (skeleton.bones.length + 1));
|
|
559
578
|
}
|
|
560
|
-
|
|
561
|
-
|
|
579
|
+
var opacityTexture = material.opacityTexture;
|
|
580
|
+
if (opacityTexture) {
|
|
581
|
+
effect_1.setTexture("opacitySampler", opacityTexture);
|
|
582
|
+
effect_1.setFloat("opacityIntensity", opacityTexture.level);
|
|
583
|
+
var textureMatrix = opacityTexture.getTextureMatrix();
|
|
584
|
+
if (textureMatrix) {
|
|
585
|
+
effect_1.setMatrix("opacityMatrix", textureMatrix);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
// Glow emissive only
|
|
589
|
+
if (this._emissiveTextureAndColor.texture) {
|
|
590
|
+
effect_1.setTexture("emissiveSampler", this._emissiveTextureAndColor.texture);
|
|
591
|
+
effect_1.setMatrix("emissiveMatrix", this._emissiveTextureAndColor.texture.getTextureMatrix());
|
|
592
|
+
}
|
|
593
|
+
// Bones
|
|
594
|
+
if (renderingMesh.useBones && renderingMesh.computeBonesUsingShaders && renderingMesh.skeleton) {
|
|
595
|
+
var skeleton = renderingMesh.skeleton;
|
|
596
|
+
if (skeleton.isUsingTextureForMatrices) {
|
|
597
|
+
var boneTexture = skeleton.getTransformMatrixTexture(renderingMesh);
|
|
598
|
+
if (!boneTexture) {
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
effect_1.setTexture("boneSampler", boneTexture);
|
|
602
|
+
effect_1.setFloat("boneTextureWidth", 4.0 * (skeleton.bones.length + 1));
|
|
603
|
+
}
|
|
604
|
+
else {
|
|
605
|
+
effect_1.setMatrices("mBones", skeleton.getTransformMatrices((renderingMesh)));
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
// Morph targets
|
|
609
|
+
MaterialHelper.BindMorphTargetParameters(renderingMesh, effect_1);
|
|
610
|
+
if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {
|
|
611
|
+
renderingMesh.morphTargetManager._bind(effect_1);
|
|
612
|
+
}
|
|
613
|
+
// Alpha mode
|
|
614
|
+
if (enableAlphaMode) {
|
|
615
|
+
engine.setAlphaMode(material.alphaMode);
|
|
562
616
|
}
|
|
563
|
-
}
|
|
564
|
-
// Morph targets
|
|
565
|
-
MaterialHelper.BindMorphTargetParameters(renderingMesh, effect_1);
|
|
566
|
-
if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {
|
|
567
|
-
renderingMesh.morphTargetManager._bind(effect_1);
|
|
568
|
-
}
|
|
569
|
-
// Alpha mode
|
|
570
|
-
if (enableAlphaMode) {
|
|
571
|
-
engine.setAlphaMode(material.alphaMode);
|
|
572
617
|
}
|
|
573
618
|
// Draw
|
|
574
619
|
renderingMesh._processRendering(effectiveMesh, subMesh, effect_1, material.fillMode, batch, hardwareInstancedRendering, function (isInstance, world) { return effect_1.setMatrix("world", world); });
|
|
@@ -628,6 +673,11 @@ var EffectLayer = /** @class */ (function () {
|
|
|
628
673
|
this._scene.getEngine()._releaseBuffer(this._indexBuffer);
|
|
629
674
|
this._indexBuffer = null;
|
|
630
675
|
}
|
|
676
|
+
for (var _i = 0, _a = this._mergeDrawWrapper; _i < _a.length; _i++) {
|
|
677
|
+
var drawWrapper = _a[_i];
|
|
678
|
+
drawWrapper.dispose();
|
|
679
|
+
}
|
|
680
|
+
this._mergeDrawWrapper = [];
|
|
631
681
|
// Clean textures and post processes
|
|
632
682
|
this._disposeTextureAndPostProcesses();
|
|
633
683
|
// Remove from scene
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effectLayer.js","sourceRoot":"","sources":["../../../sourceES6/core/Layers/effectLayer.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKhD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMjD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAEhF,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D,OAAO,uCAAuC,CAAC;AAC/C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAkCvD;;;;;;;GAOG;AACH;IAoGI;;;;OAIG;IACH;IACI,8CAA8C;IAC9C,IAAY,EACZ,KAAY;QA1GR,mBAAc,GAA8C,EAAE,CAAC;QAO7D,aAAQ,GAAW,CAAC,CAAC;QACrB,4BAAuB,GAAU,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAEzD,kBAAa,GAAG,IAAI,CAAC;QACrB,mBAAc,GAAkB,EAAE,CAAC;QACnC,cAAS,GAAkB,EAAE,CAAC;QAC9B,6BAAwB,GAAsD,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,EAAE,CAAC;QAQ/H;;WAEG;QAEI,iBAAY,GAAW,IAAI,MAAM,EAAE,CAAC;QAE3C;;WAEG;QAEI,cAAS,GAAY,IAAI,CAAC;QAqBjC;;WAEG;QAEI,wCAAmC,GAAG,KAAK,CAAC;QAEnD;;WAEG;QACI,wBAAmB,GAAG,IAAI,UAAU,EAAe,CAAC;QAE3D;;WAEG;QACI,wCAAmC,GAAG,IAAI,UAAU,EAAe,CAAC;QAE3E;;WAEG;QACI,8BAAyB,GAAG,IAAI,UAAU,EAAe,CAAC;QAEjE;;WAEG;QACI,+BAA0B,GAAG,IAAI,UAAU,EAAgB,CAAC;QAEnE;;WAEG;QACI,8BAAyB,GAAG,IAAI,UAAU,EAAgB,CAAC;QAElE;;WAEG;QACI,6BAAwB,GAAG,IAAI,UAAU,EAAe,CAAC;QAEhE;;WAEG;QACI,4BAAuB,GAAG,IAAI,UAAU,EAAe,CAAC;QAgB3D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,WAAW,CAAC,gBAAgB,CAAC;QACpD,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEvD,mBAAmB;QACnB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjC,CAAC;IApFD,sBAAW,+BAAM;QAJjB;;WAEG;aAEH;YACI,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAC3C,CAAC;;;OAAA;IAMD,sBAAW,yCAAgB;QAJ3B;;WAEG;aAEH;YACI,OAAO,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;QACrD,CAAC;aACD,UAA4B,gBAAwB;YAChD,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACjE,CAAC;;;OAHA;IAoID;;;OAGG;IACO,2BAAK,GAAf,UAAgB,OAAqC;QACjD,gBAAgB;QAChB,IAAI,CAAC,mBAAmB,cACpB,gBAAgB,EAAE,GAAG,EACrB,iBAAiB,EAAE,CAAC,EACpB,MAAM,EAAE,IAAI,EACZ,gBAAgB,EAAE,CAAC,CAAC,IACjB,OAAO,CACb,CAAC;QAEF,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACtC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACK,0CAAoB,GAA5B;QACI,UAAU;QACV,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACK,2CAAqB,GAA7B;QACI,MAAM;QACN,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAErB,IAAI,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACxG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;IAClE,CAAC;IAED;;;OAGG;IACK,yCAAmB,GAA3B;QACI,IAAI,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,EAAE;YAC/C,IAAI,CAAC,uBAAuB,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC;YACnF,IAAI,CAAC,uBAAuB,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC;SACvF;aACI;YACD,IAAI,CAAC,uBAAuB,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;YAC/G,IAAI,CAAC,uBAAuB,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;YAEjH,IAAI,CAAC,uBAAuB,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;YACpL,IAAI,CAAC,uBAAuB,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;SAC1L;QAED,IAAI,CAAC,uBAAuB,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACpF,IAAI,CAAC,uBAAuB,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC1F,CAAC;IAED;;OAEG;IACO,wCAAkB,GAA5B;QAAA,iBAoEC;QAnEG,IAAI,CAAC,YAAY,GAAG,IAAI,mBAAmB,CAAC,oBAAoB,EAC5D;YACI,KAAK,EAAE,IAAI,CAAC,uBAAuB,CAAC,KAAK;YACzC,MAAM,EAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM;SAC9C,EACD,IAAI,CAAC,MAAM,EACX,KAAK,EACL,IAAI,EACJ,CAAC,CAAC,CAAC;QACP,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;QACjE,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACpD,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACpD,IAAI,CAAC,YAAY,CAAC,yBAAyB,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACpE,IAAI,CAAC,YAAY,CAAC,eAAe,GAAG,KAAK,CAAC;QAC1C,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAE9C,yBAAyB;QACzB,IAAI,CAAC,YAAY,CAAC,oBAAoB,GAAG,UAAC,eAAoC,EAAE,kBAAuC,EAAE,oBAAyC,EAAE,kBAAuC;YACvM,KAAI,CAAC,mCAAmC,CAAC,eAAe,CAAC,KAAI,CAAC,CAAC;YAE/D,IAAI,KAAa,CAAC;YAElB,IAAI,MAAM,GAAG,KAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAErC,IAAI,kBAAkB,CAAC,MAAM,EAAE;gBAC3B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC5B,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBACxD,KAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;iBACvD;gBACD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;aAC9B;YAED,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBACrD,KAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;aACpD;YAED,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBACxD,KAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;aACvD;YAED,IAAM,iBAAiB,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YAEhD,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC1D,KAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;aAC/D;YAED,MAAM,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAC,MAAc;YACnD,MAAM,CAAC,KAAK,CAAC,KAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,4EAA4E;QAC5E,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;YACpC,IAAM,4BAA0B,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,OAAO,CAAC;YAEhF,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,GAAG,CAAC;gBACzC,KAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,OAAO,GAAG,CAAC,KAAI,CAAC,mCAAmC,IAAI,4BAA0B,CAAC;YAC3H,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,GAAG,CAAC;gBAC1C,KAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,OAAO,GAAG,4BAA0B,CAAC;YAC9E,CAAC,CAAC,CAAC;SACN;IACL,CAAC;IAED;;;OAGG;IACO,6CAAuB,GAAjC,UAAkC,OAAiB;QAC/C,6BAA6B;IACjC,CAAC;IAED;;;;;;OAMG;IACO,8BAAQ,GAAlB,UAAmB,OAAgB,EAAE,YAAqB,EAAE,eAAsC;QAC9F,IAAI,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,CAAC,QAAQ,EAAE;YACX,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,EAAE;YACnD,OAAO,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;SAC/E;QAED,IAAI,OAAO,GAAa,EAAE,CAAC;QAE3B,IAAI,OAAO,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE1C,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,UAAU;QACV,IAAI,QAAQ,EAAE;YACV,IAAM,aAAa,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YAElD,IAAM,cAAc,GAAG,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACtD,IAAM,yBAAyB,GAAG,cAAc,IAAI,cAAc,CAAC,QAAQ;gBACvE,CAAE,QAAgB,CAAC,0BAA0B,IAAK,QAAgB,CAAC,0BAA0B,CAAC,CAAC;YAEnG,IAAI,cAAc,IAAI,CAAC,aAAa,IAAI,yBAAyB,CAAC,EAAE;gBAChE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAChC,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC;oBAChD,cAAc,CAAC,gBAAgB,KAAK,CAAC,EAAE;oBACvC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACnC,GAAG,GAAG,IAAI,CAAC;iBACd;qBACI,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;oBACtD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACnC,GAAG,GAAG,IAAI,CAAC;iBACd;gBAED,IAAI,aAAa,EAAE;oBACf,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBAClC,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;iBAC9C;gBACD,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;oBAC5B,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;iBAC5C;aACJ;YAED,IAAI,cAAc,GAAI,QAAgB,CAAC,cAAc,CAAC;YACtD,IAAI,cAAc,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAChC,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC;oBAChD,cAAc,CAAC,gBAAgB,KAAK,CAAC,EAAE;oBACvC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACnC,GAAG,GAAG,IAAI,CAAC;iBACd;qBACI,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;oBACtD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACnC,GAAG,GAAG,IAAI,CAAC;iBACd;aACJ;SACJ;QAED,WAAW;QACX,IAAI,eAAe,EAAE;YACjB,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC;gBAChD,eAAe,CAAC,gBAAgB,KAAK,CAAC,EAAE;gBACxC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACpC,GAAG,GAAG,IAAI,CAAC;aACd;iBACI,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;gBACtD,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACpC,GAAG,GAAG,IAAI,CAAC;aACd;YACD,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;gBAC7B,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;aAC7C;SACJ;QAED,SAAS;QACT,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE;YAC3E,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;SACvC;QAED,IAAI,GAAG,EAAE;YACL,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAC/B;QACD,IAAI,GAAG,EAAE;YACL,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAC/B;QAED,QAAQ;QACR,IAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,wBAAwB,EAAE;YAChD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;YAC/C,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE;gBAC7B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;aACvD;YAED,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAExE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC7B,IAAI,QAAQ,IAAI,QAAQ,CAAC,yBAAyB,EAAE;gBAChD,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;aACvC;iBAAM;gBACH,OAAO,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACxF;YAED,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE;gBAC7B,SAAS,CAAC,sBAAsB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;aAC7C;SACJ;aAAM;YACH,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;SAClD;QAED,gBAAgB;QAChB,IAAI,OAAO,GAAU,IAAK,CAAC,kBAAkB,CAAC;QAC9C,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,IAAI,OAAO,EAAE;YACT,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE;gBAC5B,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBACrC,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,gCAAgC,GAAG,gBAAgB,CAAC,CAAC;gBAClE,IAAI,OAAO,CAAC,wBAAwB,EAAE;oBAClC,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;iBAChD;gBACD,cAAc,CAAC,2CAA2C,CAAC,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;aAC/F;SACJ;QAED,YAAY;QACZ,IAAI,YAAY,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAClC,cAAc,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,gBAAgB,EAAE;gBAC7C,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;aAC1C;SACJ;QAED,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEtC,qBAAqB;QACrB,IAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAE,CAAC;QAC9D,IAAM,aAAa,GAAG,WAAW,CAAC,OAAiB,CAAC;QACpD,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,aAAa,KAAK,IAAI,EAAE;YACxB,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,EAC/D,OAAO,EACP,CAAC,OAAO,EAAE,QAAQ,EAAE,gBAAgB;gBAChC,WAAW,EAAE,uBAAuB,EAAE,kBAAkB;gBACxD,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB;gBACtE,wBAAwB,EAAE,2BAA2B,CAAC,EAC1D,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,IAAI,EAC5F,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,CAAC,EACnF,IAAI,CACP,CAAC;SACL;QAED,OAAO,WAAW,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,4BAAM,GAAb;QACI,IAAI,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAE3C,QAAQ;QACR,IAAI,CAAC,aAAa,CAAC,MAAO,CAAC,OAAO,EAAE,EAAE;YAClC,OAAO;SACV;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACjD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE;gBACnC,OAAO;aACV;SACJ;QAED,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAErC,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAErD,SAAS;QACT,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEvB,OAAO;QACP,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,MAAO,CAAC,CAAC;QAElF,QAAQ;QACR,IAAI,iBAAiB,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QAE9C,YAAY;QACZ,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;QAEhE,qCAAqC;QACrC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,MAAO,CAAC,CAAC;QAE5C,gBAAgB;QAChB,MAAM,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAEvC,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEpD,uBAAuB;QACvB,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QACvC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,uBAAuB,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,uBAAuB,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,uBAAuB,CAAC,MAAM,KAAK,CAAC,EAAE;YACrM,kDAAkD;YAClD,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,+BAA+B,EAAE,CAAC;YACvC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,8BAA8B,EAAE,CAAC;SACzC;IACL,CAAC;IAED;;;;OAIG;IACI,6BAAO,GAAd,UAAe,IAAkB;QAC7B,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,gBAAgB,EAAE;YACjF,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;OAGG;IACI,kCAAY,GAAnB;QACI,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACO,uCAAiB,GAA3B,UAA4B,IAAkB;QAC1C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACO,oCAAc,GAAxB,UAAyB,IAAkB,EAAE,QAAkB;QAC3D,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACO,yDAAmC,GAA7C;QACI,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACO,oCAAc,GAAxB,UAAyB,OAAgB,EAAE,eAAgC;;QAAhC,gCAAA,EAAA,uBAAgC;QACvE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;YACtB,OAAO;SACV;QAED,IAAI,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,eAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACnD,IAAI,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/C,IAAI,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/C,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACxB,IAAI,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAE/B,aAAa,CAAC,6BAA6B,CAAC,qBAAqB,GAAG,KAAK,CAAC;QAE1E,IAAI,CAAC,QAAQ,EAAE;YACX,OAAO;SACV;QAED,8BAA8B;QAC9B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE;YAC/C,OAAO;SACV;QAED,UAAU;QACV,IAAI,eAAe,GAAG,MAAA,aAAa,CAAC,+BAA+B,mCAAI,QAAQ,CAAC,eAAe,CAAC;QAChG,IAAM,eAAe,GAAG,aAAa,CAAC,0BAA0B,EAAE,CAAC;QACnE,IAAI,eAAe,GAAG,CAAC,EAAE;YACrB,eAAe,GAAG,CAAC,eAAe,KAAK,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;SAC5J;QAED,IAAM,OAAO,GAAG,eAAe,KAAK,QAAQ,CAAC,wBAAwB,CAAC;QACtE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;QAE1I,qBAAqB;QACrB,IAAI,KAAK,GAAG,aAAa,CAAC,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QAClF,IAAI,KAAK,CAAC,UAAU,EAAE;YAClB,OAAO;SACV;QAED,sBAAsB;QACtB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE;YACxC,OAAO;SACV;QAED,IAAI,0BAA0B,GAAG,KAAK,CAAC,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,gBAAgB,CAAC;QAEjH,IAAI,CAAC,2BAA2B,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEnE,IAAI,CAAC,0BAA0B,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAE3D,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE;YACtC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,0BAA0B,EAAE,eAAe,IAAI,SAAS,CAAC,CAAC;SAC3F;aACI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,0BAA0B,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE;YAChG,IAAM,WAAW,GAAG,OAAO,CAAC,eAAe,EAAG,CAAC;YAC/C,IAAM,QAAM,GAAG,WAAW,CAAC,MAAO,CAAC;YAEnC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACjC,IAAI,CAAC,0BAA0B,EAAE;gBAC7B,IAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACzI,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,QAAM,EAAE,QAAQ,CAAC,CAAC;aAClD;YAED,QAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;YAE/D,QAAM,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC;YAE1D,QAAM,CAAC,SAAS,CAAC,WAAW,EACxB,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,EACrC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,EACrC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,EACrC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAE3C,IAAM,aAAa,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YAElD,IAAM,cAAc,GAAG,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACtD,IAAM,yBAAyB,GAAG,cAAc,IAAI,cAAc,CAAC,QAAQ;gBACvE,CAAE,QAAgB,CAAC,0BAA0B,IAAK,QAAgB,CAAC,0BAA0B,CAAC,CAAC;YAEnG,IAAI,cAAc,IAAI,CAAC,aAAa,IAAI,yBAAyB,CAAC,EAAE;gBAChE,QAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;gBACpD,IAAM,aAAa,GAAG,cAAc,CAAC,gBAAgB,EAAE,CAAC;gBAExD,IAAI,aAAa,EAAE;oBACf,QAAM,CAAC,SAAS,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;iBACpD;aACJ;YAED,IAAM,cAAc,GAAI,QAAgB,CAAC,cAAc,CAAC;YACxD,IAAI,cAAc,EAAE;gBAChB,QAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;gBACpD,QAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC1D,IAAM,aAAa,GAAG,cAAc,CAAC,gBAAgB,EAAE,CAAC;gBACxD,IAAI,aAAa,EAAE;oBACf,QAAM,CAAC,SAAS,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;iBACpD;aACJ;YAED,qBAAqB;YACrB,IAAI,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE;gBACvC,QAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBAC5E,QAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;aAChG;YAED,QAAQ;YACR,IAAI,aAAa,CAAC,QAAQ,IAAI,aAAa,CAAC,wBAAwB,IAAI,aAAa,CAAC,QAAQ,EAAE;gBAC5F,IAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;gBAExC,IAAI,QAAQ,CAAC,yBAAyB,EAAE;oBACpC,IAAM,WAAW,GAAG,QAAQ,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;oBACtE,IAAI,CAAC,WAAW,EAAE;wBACd,OAAO;qBACV;oBAED,QAAM,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;oBAC9C,QAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC1E;qBAAM;oBACH,QAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;iBAChF;aACJ;YAED,gBAAgB;YAChB,cAAc,CAAC,yBAAyB,CAAC,aAAa,EAAE,QAAM,CAAC,CAAC;YAChE,IAAI,aAAa,CAAC,kBAAkB,IAAI,aAAa,CAAC,kBAAkB,CAAC,wBAAwB,EAAE;gBAC/F,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,QAAM,CAAC,CAAC;aAClD;YAED,aAAa;YACb,IAAI,eAAe,EAAE;gBACjB,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aAC3C;YAED,OAAO;YACP,aAAa,CAAC,iBAAiB,CAAC,aAAa,EAAE,OAAO,EAAE,QAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,0BAA0B,EAChH,UAAC,UAAU,EAAE,KAAK,IAAK,OAAA,QAAM,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAhC,CAAgC,CAAC,CAAC;SAChE;aAAM;YACH,6CAA6C;YAC7C,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,CAAC;SAC3C;QAED,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED;;;OAGG;IACO,sCAAgB,GAA1B,UAA2B,IAAkB;QACzC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;OAGG;IACI,8BAAQ,GAAf;QACI,IAAI,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAExD,IAAI,EAAE,EAAE;YACJ,EAAE,CAAC,QAAQ,EAAE,CAAC;SACjB;QAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,qDAA+B,GAAvC;QACI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACjD,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;gBACxB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;aACpC;SACJ;QACD,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;gBACnB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/B;SACJ;QACD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,6BAAO,GAAd;QACI,IAAI,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAClE,IAAI,YAAY,EAAE;YACd,YAAY,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;SACzD;QAED,IAAI,IAAI,CAAC,YAAY,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;SAC5B;QAED,oCAAoC;QACpC,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAEvC,oBAAoB;QACpB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACZ,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAC7C;QAED,WAAW;QACX,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,mCAAmC,CAAC,KAAK,EAAE,CAAC;QACjD,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,CAAC;QACxC,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;IAED;;;QAGI;IACG,kCAAY,GAAnB;QACI,OAAO,aAAa,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACW,iBAAK,GAAnB,UAAoB,iBAAsB,EAAE,KAAY,EAAE,OAAe;QACrE,IAAI,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEtE,OAAO,eAAe,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAzvBD,cAAc;IACA,yCAA6B,GAA2B,UAAC,CAAC;QACpE,MAAM,WAAW,CAAC,2BAA2B,CAAC,CAAC;IACnD,CAAC,CAAA;IA7ED;QADC,SAAS,EAAE;6CACQ;IAMpB;QADC,iBAAiB,EAAE;qDACuB;IAM3C;QADC,SAAS,EAAE;kDACqB;IAMjC;QADC,0BAA0B,EAAE;6CAG5B;IAMD;QADC,SAAS,EAAE;uDAGX;IASD;QADC,SAAS,EAAE;4EACuC;IA+xBvD,kBAAC;CAAA,AAz1BD,IAy1BC;SAz1BqB,WAAW","sourcesContent":["import { serialize, serializeAsColor4, serializeAsCameraReference } from \"../Misc/decorators\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Nullable } from \"../types\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Scene } from \"../scene\";\r\nimport { ISize } from \"../Maths/math.size\";\r\nimport { Color4 } from '../Maths/math.color';\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { MaterialHelper } from \"../Materials/materialHelper\";\r\n\r\n\r\nimport \"../Shaders/glowMapGeneration.fragment\";\r\nimport \"../Shaders/glowMapGeneration.vertex\";\r\nimport { _WarnImport } from '../Misc/devTools';\r\nimport { DataBuffer } from '../Buffers/dataBuffer';\r\nimport { EffectFallbacks } from '../Materials/effectFallbacks';\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\n/**\r\n * Effect layer options. This helps customizing the behaviour\r\n * of the effect layer.\r\n */\r\nexport interface IEffectLayerOptions {\r\n /**\r\n * Multiplication factor apply to the canvas size to compute the render target size\r\n * used to generated the objects (the smaller the faster).\r\n */\r\n mainTextureRatio: number;\r\n\r\n /**\r\n * Enforces a fixed size texture to ensure effect stability across devices.\r\n */\r\n mainTextureFixedSize?: number;\r\n\r\n /**\r\n * Alpha blending mode used to apply the blur. Default depends of the implementation.\r\n */\r\n alphaBlendingMode: number;\r\n\r\n /**\r\n * The camera attached to the layer.\r\n */\r\n camera: Nullable<Camera>;\r\n\r\n /**\r\n * The rendering group to draw the layer in.\r\n */\r\n renderingGroupId: number;\r\n}\r\n\r\n/**\r\n * The effect layer Helps adding post process effect blended with the main pass.\r\n *\r\n * This can be for instance use to generate glow or highlight effects on the scene.\r\n *\r\n * The effect layer class can not be used directly and is intented to inherited from to be\r\n * customized per effects.\r\n */\r\nexport abstract class EffectLayer {\r\n\r\n private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n private _indexBuffer: Nullable<DataBuffer>;\r\n private _effectLayerOptions: IEffectLayerOptions;\r\n private _mergeDrawWrapper: DrawWrapper;\r\n\r\n protected _scene: Scene;\r\n protected _engine: Engine;\r\n protected _maxSize: number = 0;\r\n protected _mainTextureDesiredSize: ISize = { width: 0, height: 0 };\r\n protected _mainTexture: RenderTargetTexture;\r\n protected _shouldRender = true;\r\n protected _postProcesses: PostProcess[] = [];\r\n protected _textures: BaseTexture[] = [];\r\n protected _emissiveTextureAndColor: { texture: Nullable<BaseTexture>, color: Color4 } = { texture: null, color: new Color4() };\r\n\r\n /**\r\n * The name of the layer\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * The clear color of the texture used to generate the glow map.\r\n */\r\n @serializeAsColor4()\r\n public neutralColor: Color4 = new Color4();\r\n\r\n /**\r\n * Specifies whether the highlight layer is enabled or not.\r\n */\r\n @serialize()\r\n public isEnabled: boolean = true;\r\n\r\n /**\r\n * Gets the camera attached to the layer.\r\n */\r\n @serializeAsCameraReference()\r\n public get camera(): Nullable<Camera> {\r\n return this._effectLayerOptions.camera;\r\n }\r\n\r\n /**\r\n * Gets the rendering group id the layer should render in.\r\n */\r\n @serialize()\r\n public get renderingGroupId(): number {\r\n return this._effectLayerOptions.renderingGroupId;\r\n }\r\n public set renderingGroupId(renderingGroupId: number) {\r\n this._effectLayerOptions.renderingGroupId = renderingGroupId;\r\n }\r\n\r\n /**\r\n * Specifies if the bounding boxes should be rendered normally or if they should undergo the effect of the layer\r\n */\r\n @serialize()\r\n public disableBoundingBoxesFromEffectLayer = false;\r\n\r\n /**\r\n * An event triggered when the effect layer has been disposed.\r\n */\r\n public onDisposeObservable = new Observable<EffectLayer>();\r\n\r\n /**\r\n * An event triggered when the effect layer is about rendering the main texture with the glowy parts.\r\n */\r\n public onBeforeRenderMainTextureObservable = new Observable<EffectLayer>();\r\n\r\n /**\r\n * An event triggered when the generated texture is being merged in the scene.\r\n */\r\n public onBeforeComposeObservable = new Observable<EffectLayer>();\r\n\r\n /**\r\n * An event triggered when the mesh is rendered into the effect render target.\r\n */\r\n public onBeforeRenderMeshToEffect = new Observable<AbstractMesh>();\r\n\r\n /**\r\n * An event triggered after the mesh has been rendered into the effect render target.\r\n */\r\n public onAfterRenderMeshToEffect = new Observable<AbstractMesh>();\r\n\r\n /**\r\n * An event triggered when the generated texture has been merged in the scene.\r\n */\r\n public onAfterComposeObservable = new Observable<EffectLayer>();\r\n\r\n /**\r\n * An event triggered when the effect layer changes its size.\r\n */\r\n public onSizeChangedObservable = new Observable<EffectLayer>();\r\n\r\n /** @hidden */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"EffectLayerSceneComponent\");\r\n }\r\n\r\n /**\r\n * Instantiates a new effect Layer and references it in the scene.\r\n * @param name The name of the layer\r\n * @param scene The scene to use the layer in\r\n */\r\n constructor(\r\n /** The Friendly of the effect in the scene */\r\n name: string,\r\n scene: Scene) {\r\n this.name = name;\r\n\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n EffectLayer._SceneComponentInitialization(this._scene);\r\n\r\n this._engine = this._scene.getEngine();\r\n this._maxSize = this._engine.getCaps().maxTextureSize;\r\n this._scene.effectLayers.push(this);\r\n\r\n this._mergeDrawWrapper = new DrawWrapper(this._engine);\r\n\r\n // Generate Buffers\r\n this._generateIndexBuffer();\r\n this._generateVertexBuffer();\r\n }\r\n\r\n /**\r\n * Get the effect name of the layer.\r\n * @return The effect name\r\n */\r\n public abstract getEffectName(): string;\r\n\r\n /**\r\n * Checks for the readiness of the element composing the layer.\r\n * @param subMesh the mesh to check for\r\n * @param useInstances specify whether or not to use instances to render the mesh\r\n * @return true if ready otherwise, false\r\n */\r\n public abstract isReady(subMesh: SubMesh, useInstances: boolean): boolean;\r\n\r\n /**\r\n * Returns whether or not the layer needs stencil enabled during the mesh rendering.\r\n * @returns true if the effect requires stencil during the main canvas render pass.\r\n */\r\n public abstract needStencil(): boolean;\r\n\r\n /**\r\n * Create the merge effect. This is the shader use to blit the information back\r\n * to the main canvas at the end of the scene rendering.\r\n * @returns The effect containing the shader used to merge the effect on the main canvas\r\n */\r\n protected abstract _createMergeEffect(): Effect;\r\n\r\n /**\r\n * Creates the render target textures and post processes used in the effect layer.\r\n */\r\n protected abstract _createTextureAndPostProcesses(): void;\r\n\r\n /**\r\n * Implementation specific of rendering the generating effect on the main canvas.\r\n * @param effect The effect used to render through\r\n */\r\n protected abstract _internalRender(effect: Effect): void;\r\n\r\n /**\r\n * Sets the required values for both the emissive texture and and the main color.\r\n */\r\n protected abstract _setEmissiveTextureAndColor(mesh: Mesh, subMesh: SubMesh, material: Material): void;\r\n\r\n /**\r\n * Free any resources and references associated to a mesh.\r\n * Internal use\r\n * @param mesh The mesh to free.\r\n */\r\n public abstract _disposeMesh(mesh: Mesh): void;\r\n\r\n /**\r\n * Serializes this layer (Glow or Highlight for example)\r\n * @returns a serialized layer object\r\n */\r\n public abstract serialize?(): any;\r\n\r\n /**\r\n * Initializes the effect layer with the required options.\r\n * @param options Sets of none mandatory options to use with the layer (see IEffectLayerOptions for more information)\r\n */\r\n protected _init(options: Partial<IEffectLayerOptions>): void {\r\n // Adapt options\r\n this._effectLayerOptions = {\r\n mainTextureRatio: 0.5,\r\n alphaBlendingMode: 2,\r\n camera: null,\r\n renderingGroupId: -1,\r\n ...options,\r\n };\r\n\r\n this._setMainTextureSize();\r\n this._createMainTexture();\r\n this._createTextureAndPostProcesses();\r\n this._mergeDrawWrapper.setEffect(this._createMergeEffect());\r\n }\r\n\r\n /**\r\n * Generates the index buffer of the full screen quad blending to the main canvas.\r\n */\r\n private _generateIndexBuffer(): void {\r\n // Indices\r\n var indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = this._engine.createIndexBuffer(indices);\r\n }\r\n\r\n /**\r\n * Generates the vertex buffer of the full screen quad blending to the main canvas.\r\n */\r\n private _generateVertexBuffer(): void {\r\n // VBO\r\n var vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n var vertexBuffer = new VertexBuffer(this._engine, vertices, VertexBuffer.PositionKind, false, false, 2);\r\n this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer;\r\n }\r\n\r\n /**\r\n * Sets the main texture desired size which is the closest power of two\r\n * of the engine canvas size.\r\n */\r\n private _setMainTextureSize(): void {\r\n if (this._effectLayerOptions.mainTextureFixedSize) {\r\n this._mainTextureDesiredSize.width = this._effectLayerOptions.mainTextureFixedSize;\r\n this._mainTextureDesiredSize.height = this._effectLayerOptions.mainTextureFixedSize;\r\n }\r\n else {\r\n this._mainTextureDesiredSize.width = this._engine.getRenderWidth() * this._effectLayerOptions.mainTextureRatio;\r\n this._mainTextureDesiredSize.height = this._engine.getRenderHeight() * this._effectLayerOptions.mainTextureRatio;\r\n\r\n this._mainTextureDesiredSize.width = this._engine.needPOTTextures ? Engine.GetExponentOfTwo(this._mainTextureDesiredSize.width, this._maxSize) : this._mainTextureDesiredSize.width;\r\n this._mainTextureDesiredSize.height = this._engine.needPOTTextures ? Engine.GetExponentOfTwo(this._mainTextureDesiredSize.height, this._maxSize) : this._mainTextureDesiredSize.height;\r\n }\r\n\r\n this._mainTextureDesiredSize.width = Math.floor(this._mainTextureDesiredSize.width);\r\n this._mainTextureDesiredSize.height = Math.floor(this._mainTextureDesiredSize.height);\r\n }\r\n\r\n /**\r\n * Creates the main texture for the effect layer.\r\n */\r\n protected _createMainTexture(): void {\r\n this._mainTexture = new RenderTargetTexture(\"EffectLayerMainRTT\",\r\n {\r\n width: this._mainTextureDesiredSize.width,\r\n height: this._mainTextureDesiredSize.height\r\n },\r\n this._scene,\r\n false,\r\n true,\r\n 0);\r\n this._mainTexture.activeCamera = this._effectLayerOptions.camera;\r\n this._mainTexture.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n this._mainTexture.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n this._mainTexture.anisotropicFilteringLevel = 1;\r\n this._mainTexture.updateSamplingMode(Texture.BILINEAR_SAMPLINGMODE);\r\n this._mainTexture.renderParticles = false;\r\n this._mainTexture.renderList = null;\r\n this._mainTexture.ignoreCameraViewport = true;\r\n\r\n // Custom render function\r\n this._mainTexture.customRenderFunction = (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>): void => {\r\n this.onBeforeRenderMainTextureObservable.notifyObservers(this);\r\n\r\n var index: number;\r\n\r\n let engine = this._scene.getEngine();\r\n\r\n if (depthOnlySubMeshes.length) {\r\n engine.setColorWrite(false);\r\n for (index = 0; index < depthOnlySubMeshes.length; index++) {\r\n this._renderSubMesh(depthOnlySubMeshes.data[index]);\r\n }\r\n engine.setColorWrite(true);\r\n }\r\n\r\n for (index = 0; index < opaqueSubMeshes.length; index++) {\r\n this._renderSubMesh(opaqueSubMeshes.data[index]);\r\n }\r\n\r\n for (index = 0; index < alphaTestSubMeshes.length; index++) {\r\n this._renderSubMesh(alphaTestSubMeshes.data[index]);\r\n }\r\n\r\n const previousAlphaMode = engine.getAlphaMode();\r\n\r\n for (index = 0; index < transparentSubMeshes.length; index++) {\r\n this._renderSubMesh(transparentSubMeshes.data[index], true);\r\n }\r\n\r\n engine.setAlphaMode(previousAlphaMode);\r\n };\r\n\r\n this._mainTexture.onClearObservable.add((engine: Engine) => {\r\n engine.clear(this.neutralColor, true, true, true);\r\n });\r\n\r\n // Prevent package size in es6 (getBoundingBoxRenderer might not be present)\r\n if (this._scene.getBoundingBoxRenderer) {\r\n const boundingBoxRendererEnabled = this._scene.getBoundingBoxRenderer().enabled;\r\n\r\n this._mainTexture.onBeforeBindObservable.add(() => {\r\n this._scene.getBoundingBoxRenderer().enabled = !this.disableBoundingBoxesFromEffectLayer && boundingBoxRendererEnabled;\r\n });\r\n\r\n this._mainTexture.onAfterUnbindObservable.add(() => {\r\n this._scene.getBoundingBoxRenderer().enabled = boundingBoxRendererEnabled;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Adds specific effects defines.\r\n * @param defines The defines to add specifics to.\r\n */\r\n protected _addCustomEffectDefines(defines: string[]): void {\r\n // Nothing to add by default.\r\n }\r\n\r\n /**\r\n * Checks for the readiness of the element composing the layer.\r\n * @param subMesh the mesh to check for\r\n * @param useInstances specify whether or not to use instances to render the mesh\r\n * @param emissiveTexture the associated emissive texture used to generate the glow\r\n * @return true if ready otherwise, false\r\n */\r\n protected _isReady(subMesh: SubMesh, useInstances: boolean, emissiveTexture: Nullable<BaseTexture>): boolean {\r\n let material = subMesh.getMaterial();\r\n\r\n if (!material) {\r\n return false;\r\n }\r\n\r\n if (this._useMeshMaterial(subMesh.getRenderingMesh())) {\r\n return material.isReadyForSubMesh(subMesh.getMesh(), subMesh, useInstances);\r\n }\r\n\r\n var defines: string[] = [];\r\n\r\n var attribs = [VertexBuffer.PositionKind];\r\n\r\n var mesh = subMesh.getMesh();\r\n var uv1 = false;\r\n var uv2 = false;\r\n\r\n // Diffuse\r\n if (material) {\r\n const needAlphaTest = material.needAlphaTesting();\r\n\r\n const diffuseTexture = material.getAlphaTestTexture();\r\n const needAlphaBlendFromDiffuse = diffuseTexture && diffuseTexture.hasAlpha &&\r\n ((material as any).useAlphaFromDiffuseTexture || (material as any)._useAlphaFromAlbedoTexture);\r\n\r\n if (diffuseTexture && (needAlphaTest || needAlphaBlendFromDiffuse)) {\r\n defines.push(\"#define DIFFUSE\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) &&\r\n diffuseTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define DIFFUSEUV2\");\r\n uv2 = true;\r\n }\r\n else if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n defines.push(\"#define DIFFUSEUV1\");\r\n uv1 = true;\r\n }\r\n\r\n if (needAlphaTest) {\r\n defines.push(\"#define ALPHATEST\");\r\n defines.push(\"#define ALPHATESTVALUE 0.4\");\r\n }\r\n if (!diffuseTexture.gammaSpace) {\r\n defines.push(\"#define DIFFUSE_ISLINEAR\");\r\n }\r\n }\r\n\r\n var opacityTexture = (material as any).opacityTexture;\r\n if (opacityTexture) {\r\n defines.push(\"#define OPACITY\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) &&\r\n opacityTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define OPACITYUV2\");\r\n uv2 = true;\r\n }\r\n else if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n defines.push(\"#define OPACITYUV1\");\r\n uv1 = true;\r\n }\r\n }\r\n }\r\n\r\n // Emissive\r\n if (emissiveTexture) {\r\n defines.push(\"#define EMISSIVE\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) &&\r\n emissiveTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define EMISSIVEUV2\");\r\n uv2 = true;\r\n }\r\n else if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n defines.push(\"#define EMISSIVEUV1\");\r\n uv1 = true;\r\n }\r\n if (!emissiveTexture.gammaSpace) {\r\n defines.push(\"#define EMISSIVE_ISLINEAR\");\r\n }\r\n }\r\n\r\n // Vertex\r\n if (mesh.isVerticesDataPresent(VertexBuffer.ColorKind) && mesh.hasVertexAlpha) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n defines.push(\"#define VERTEXALPHA\");\r\n }\r\n\r\n if (uv1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n defines.push(\"#define UV1\");\r\n }\r\n if (uv2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n defines.push(\"#define UV2\");\r\n }\r\n\r\n // Bones\r\n const fallbacks = new EffectFallbacks();\r\n if (mesh.useBones && mesh.computeBonesUsingShaders) {\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\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n\r\n let skeleton = mesh.skeleton;\r\n if (skeleton && skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton ? (skeleton.bones.length + 1) : 0));\r\n }\r\n\r\n if (mesh.numBoneInfluencers > 0) {\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph targets\r\n var manager = (<Mesh>mesh).morphTargetManager;\r\n let morphInfluencers = 0;\r\n if (manager) {\r\n if (manager.numInfluencers > 0) {\r\n defines.push(\"#define MORPHTARGETS\");\r\n morphInfluencers = manager.numInfluencers;\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + morphInfluencers);\r\n if (manager.isUsingTextureForTargets) {\r\n defines.push(\"#define MORPHTARGETS_TEXTURE\");\r\n }\r\n MaterialHelper.PrepareAttributesForMorphTargetsInfluencers(attribs, mesh, morphInfluencers);\r\n }\r\n }\r\n\r\n // Instances\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n MaterialHelper.PushAttributesForInstances(attribs);\r\n if (subMesh.getRenderingMesh().hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n }\r\n }\r\n\r\n this._addCustomEffectDefines(defines);\r\n\r\n // Get correct effect\r\n const drawWrapper = subMesh._getDrawWrapper(undefined, true)!;\r\n const cachedDefines = drawWrapper.defines as string;\r\n const join = defines.join(\"\\n\");\r\n if (cachedDefines !== join) {\r\n drawWrapper.setEffect(this._engine.createEffect(\"glowMapGeneration\",\r\n attribs,\r\n [\"world\", \"mBones\", \"viewProjection\",\r\n \"glowColor\", \"morphTargetInfluences\", \"boneTextureWidth\",\r\n \"diffuseMatrix\", \"emissiveMatrix\", \"opacityMatrix\", \"opacityIntensity\",\r\n \"morphTargetTextureInfo\", \"morphTargetTextureIndices\"],\r\n [\"diffuseSampler\", \"emissiveSampler\", \"opacitySampler\", \"boneSampler\", \"morphTargets\"], join,\r\n fallbacks, undefined, undefined, { maxSimultaneousMorphTargets: morphInfluencers }),\r\n join\r\n );\r\n }\r\n\r\n return drawWrapper.effect!.isReady();\r\n }\r\n\r\n /**\r\n * Renders the glowing part of the scene by blending the blurred glowing meshes on top of the rendered scene.\r\n */\r\n public render(): void {\r\n var currentEffect = this._mergeDrawWrapper;\r\n\r\n // Check\r\n if (!currentEffect.effect!.isReady()) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < this._postProcesses.length; i++) {\r\n if (!this._postProcesses[i].isReady()) {\r\n return;\r\n }\r\n }\r\n\r\n var engine = this._scene.getEngine();\r\n\r\n this.onBeforeComposeObservable.notifyObservers(this);\r\n\r\n // Render\r\n engine.enableEffect(currentEffect);\r\n engine.setState(false);\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect.effect!);\r\n\r\n // Cache\r\n var previousAlphaMode = engine.getAlphaMode();\r\n\r\n // Go Blend.\r\n engine.setAlphaMode(this._effectLayerOptions.alphaBlendingMode);\r\n\r\n // Blends the map on the main canvas.\r\n this._internalRender(currentEffect.effect!);\r\n\r\n // Restore Alpha\r\n engine.setAlphaMode(previousAlphaMode);\r\n\r\n this.onAfterComposeObservable.notifyObservers(this);\r\n\r\n // Handle size changes.\r\n var size = this._mainTexture.getSize();\r\n this._setMainTextureSize();\r\n if ((size.width !== this._mainTextureDesiredSize.width || size.height !== this._mainTextureDesiredSize.height) && this._mainTextureDesiredSize.width !== 0 && this._mainTextureDesiredSize.height !== 0) {\r\n // Recreate RTT and post processes on size change.\r\n this.onSizeChangedObservable.notifyObservers(this);\r\n this._disposeTextureAndPostProcesses();\r\n this._createMainTexture();\r\n this._createTextureAndPostProcesses();\r\n }\r\n }\r\n\r\n /**\r\n * Determine if a given mesh will be used in the current effect.\r\n * @param mesh mesh to test\r\n * @returns true if the mesh will be used\r\n */\r\n public hasMesh(mesh: AbstractMesh): boolean {\r\n if (this.renderingGroupId === -1 || mesh.renderingGroupId === this.renderingGroupId) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns true if the layer contains information to display, otherwise false.\r\n * @returns true if the glow layer should be rendered\r\n */\r\n public shouldRender(): boolean {\r\n return this.isEnabled && this._shouldRender;\r\n }\r\n\r\n /**\r\n * Returns true if the mesh should render, otherwise false.\r\n * @param mesh The mesh to render\r\n * @returns true if it should render otherwise false\r\n */\r\n protected _shouldRenderMesh(mesh: AbstractMesh): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns true if the mesh can be rendered, otherwise false.\r\n * @param mesh The mesh to render\r\n * @param material The material used on the mesh\r\n * @returns true if it can be rendered otherwise false\r\n */\r\n protected _canRenderMesh(mesh: AbstractMesh, material: Material): boolean {\r\n return !material.needAlphaBlendingForMesh(mesh);\r\n }\r\n\r\n /**\r\n * Returns true if the mesh should render, otherwise false.\r\n * @param mesh The mesh to render\r\n * @returns true if it should render otherwise false\r\n */\r\n protected _shouldRenderEmissiveTextureForMesh(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Renders the submesh passed in parameter to the generation map.\r\n */\r\n protected _renderSubMesh(subMesh: SubMesh, enableAlphaMode: boolean = false): void {\r\n if (!this.shouldRender()) {\r\n return;\r\n }\r\n\r\n var material = subMesh.getMaterial();\r\n var ownerMesh = subMesh.getMesh();\r\n var replacementMesh = subMesh.getReplacementMesh();\r\n var renderingMesh = subMesh.getRenderingMesh();\r\n var effectiveMesh = subMesh.getEffectiveMesh();\r\n var scene = this._scene;\r\n var engine = scene.getEngine();\r\n\r\n effectiveMesh._internalAbstractMeshDataInfo._isActiveIntermediate = false;\r\n\r\n if (!material) {\r\n return;\r\n }\r\n\r\n // Do not block in blend mode.\r\n if (!this._canRenderMesh(renderingMesh, material)) {\r\n return;\r\n }\r\n\r\n // Culling\r\n let sideOrientation = renderingMesh.overrideMaterialSideOrientation ?? material.sideOrientation;\r\n const mainDeterminant = renderingMesh._getWorldMatrixDeterminant();\r\n if (mainDeterminant < 0) {\r\n sideOrientation = (sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation);\r\n }\r\n\r\n const reverse = sideOrientation === Material.ClockWiseSideOrientation;\r\n engine.setState(material.backFaceCulling, material.zOffset, undefined, reverse, material.cullBackFaces, undefined, material.zOffsetUnits);\r\n\r\n // Managing instances\r\n var batch = renderingMesh._getInstancesRenderList(subMesh._id, !!replacementMesh);\r\n if (batch.mustReturn) {\r\n return;\r\n }\r\n\r\n // Early Exit per mesh\r\n if (!this._shouldRenderMesh(renderingMesh)) {\r\n return;\r\n }\r\n\r\n var hardwareInstancedRendering = batch.hardwareInstancedRendering[subMesh._id] || renderingMesh.hasThinInstances;\r\n\r\n this._setEmissiveTextureAndColor(renderingMesh, subMesh, material);\r\n\r\n this.onBeforeRenderMeshToEffect.notifyObservers(ownerMesh);\r\n\r\n if (this._useMeshMaterial(renderingMesh)) {\r\n renderingMesh.render(subMesh, hardwareInstancedRendering, replacementMesh || undefined);\r\n }\r\n else if (this._isReady(subMesh, hardwareInstancedRendering, this._emissiveTextureAndColor.texture)) {\r\n const drawWrapper = subMesh._getDrawWrapper()!;\r\n const effect = drawWrapper.effect!;\r\n\r\n engine.enableEffect(drawWrapper);\r\n if (!hardwareInstancedRendering) {\r\n const fillMode = scene.forcePointsCloud ? Material.PointFillMode : scene.forceWireframe ? Material.WireFrameFillMode : material.fillMode;\r\n renderingMesh._bind(subMesh, effect, fillMode);\r\n }\r\n\r\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n\r\n effect.setMatrix(\"world\", effectiveMesh.getWorldMatrix());\r\n\r\n effect.setFloat4(\"glowColor\",\r\n this._emissiveTextureAndColor.color.r,\r\n this._emissiveTextureAndColor.color.g,\r\n this._emissiveTextureAndColor.color.b,\r\n this._emissiveTextureAndColor.color.a);\r\n\r\n const needAlphaTest = material.needAlphaTesting();\r\n\r\n const diffuseTexture = material.getAlphaTestTexture();\r\n const needAlphaBlendFromDiffuse = diffuseTexture && diffuseTexture.hasAlpha &&\r\n ((material as any).useAlphaFromDiffuseTexture || (material as any)._useAlphaFromAlbedoTexture);\r\n\r\n if (diffuseTexture && (needAlphaTest || needAlphaBlendFromDiffuse)) {\r\n effect.setTexture(\"diffuseSampler\", diffuseTexture);\r\n const textureMatrix = diffuseTexture.getTextureMatrix();\r\n\r\n if (textureMatrix) {\r\n effect.setMatrix(\"diffuseMatrix\", textureMatrix);\r\n }\r\n }\r\n\r\n const opacityTexture = (material as any).opacityTexture;\r\n if (opacityTexture) {\r\n effect.setTexture(\"opacitySampler\", opacityTexture);\r\n effect.setFloat(\"opacityIntensity\", opacityTexture.level);\r\n const textureMatrix = opacityTexture.getTextureMatrix();\r\n if (textureMatrix) {\r\n effect.setMatrix(\"opacityMatrix\", textureMatrix);\r\n }\r\n }\r\n\r\n // Glow emissive only\r\n if (this._emissiveTextureAndColor.texture) {\r\n effect.setTexture(\"emissiveSampler\", this._emissiveTextureAndColor.texture);\r\n effect.setMatrix(\"emissiveMatrix\", this._emissiveTextureAndColor.texture.getTextureMatrix());\r\n }\r\n\r\n // Bones\r\n if (renderingMesh.useBones && renderingMesh.computeBonesUsingShaders && renderingMesh.skeleton) {\r\n const skeleton = renderingMesh.skeleton;\r\n\r\n if (skeleton.isUsingTextureForMatrices) {\r\n const boneTexture = skeleton.getTransformMatrixTexture(renderingMesh);\r\n if (!boneTexture) {\r\n return;\r\n }\r\n\r\n effect.setTexture(\"boneSampler\", boneTexture);\r\n effect.setFloat(\"boneTextureWidth\", 4.0 * (skeleton.bones.length + 1));\r\n } else {\r\n effect.setMatrices(\"mBones\", skeleton.getTransformMatrices((renderingMesh)));\r\n }\r\n }\r\n\r\n // Morph targets\r\n MaterialHelper.BindMorphTargetParameters(renderingMesh, effect);\r\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\r\n renderingMesh.morphTargetManager._bind(effect);\r\n }\r\n\r\n // Alpha mode\r\n if (enableAlphaMode) {\r\n engine.setAlphaMode(material.alphaMode);\r\n }\r\n\r\n // Draw\r\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering,\r\n (isInstance, world) => effect.setMatrix(\"world\", world));\r\n } else {\r\n // Need to reset refresh rate of the main map\r\n this._mainTexture.resetRefreshCounter();\r\n }\r\n\r\n this.onAfterRenderMeshToEffect.notifyObservers(ownerMesh);\r\n }\r\n\r\n /**\r\n * Defines whether the current material of the mesh should be use to render the effect.\r\n * @param mesh defines the current mesh to render\r\n */\r\n protected _useMeshMaterial(mesh: AbstractMesh): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Rebuild the required buffers.\r\n * @hidden Internal use only.\r\n */\r\n public _rebuild(): void {\r\n let vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n\r\n this._generateIndexBuffer();\r\n }\r\n\r\n /**\r\n * Dispose only the render target textures and post process.\r\n */\r\n private _disposeTextureAndPostProcesses(): void {\r\n this._mainTexture.dispose();\r\n\r\n for (var i = 0; i < this._postProcesses.length; i++) {\r\n if (this._postProcesses[i]) {\r\n this._postProcesses[i].dispose();\r\n }\r\n }\r\n this._postProcesses = [];\r\n\r\n for (var i = 0; i < this._textures.length; i++) {\r\n if (this._textures[i]) {\r\n this._textures[i].dispose();\r\n }\r\n }\r\n this._textures = [];\r\n }\r\n\r\n /**\r\n * Dispose the highlight layer and free resources.\r\n */\r\n public dispose(): void {\r\n var vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n\r\n // Clean textures and post processes\r\n this._disposeTextureAndPostProcesses();\r\n\r\n // Remove from scene\r\n var index = this._scene.effectLayers.indexOf(this, 0);\r\n if (index > -1) {\r\n this._scene.effectLayers.splice(index, 1);\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n this.onBeforeRenderMainTextureObservable.clear();\r\n this.onBeforeComposeObservable.clear();\r\n this.onBeforeRenderMeshToEffect.clear();\r\n this.onAfterRenderMeshToEffect.clear();\r\n this.onAfterComposeObservable.clear();\r\n this.onSizeChangedObservable.clear();\r\n }\r\n\r\n /**\r\n * Gets the class name of the effect layer\r\n * @returns the string with the class name of the effect layer\r\n */\r\n public getClassName(): string {\r\n return \"EffectLayer\";\r\n }\r\n\r\n /**\r\n * Creates an effect layer from parsed effect layer data\r\n * @param parsedEffectLayer defines effect layer data\r\n * @param scene defines the current scene\r\n * @param rootUrl defines the root URL containing the effect layer information\r\n * @returns a parsed effect Layer\r\n */\r\n public static Parse(parsedEffectLayer: any, scene: Scene, rootUrl: string): EffectLayer {\r\n var effectLayerType = Tools.Instantiate(parsedEffectLayer.customType);\r\n\r\n return effectLayerType.Parse(parsedEffectLayer, scene, rootUrl);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"effectLayer.js","sourceRoot":"","sources":["../../../sourceES6/core/Layers/effectLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize, serializeAsColor4, serializeAsCameraReference } from \"../Misc/decorators\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Nullable } from \"../types\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Scene } from \"../scene\";\r\nimport { ISize } from \"../Maths/math.size\";\r\nimport { Color4 } from '../Maths/math.color';\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { MaterialHelper } from \"../Materials/materialHelper\";\r\n\r\n\r\nimport \"../Shaders/glowMapGeneration.fragment\";\r\nimport \"../Shaders/glowMapGeneration.vertex\";\r\nimport { _WarnImport } from '../Misc/devTools';\r\nimport { DataBuffer } from '../Buffers/dataBuffer';\r\nimport { EffectFallbacks } from '../Materials/effectFallbacks';\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\n/**\r\n * Effect layer options. This helps customizing the behaviour\r\n * of the effect layer.\r\n */\r\nexport interface IEffectLayerOptions {\r\n /**\r\n * Multiplication factor apply to the canvas size to compute the render target size\r\n * used to generated the objects (the smaller the faster).\r\n */\r\n mainTextureRatio: number;\r\n\r\n /**\r\n * Enforces a fixed size texture to ensure effect stability across devices.\r\n */\r\n mainTextureFixedSize?: number;\r\n\r\n /**\r\n * Alpha blending mode used to apply the blur. Default depends of the implementation.\r\n */\r\n alphaBlendingMode: number;\r\n\r\n /**\r\n * The camera attached to the layer.\r\n */\r\n camera: Nullable<Camera>;\r\n\r\n /**\r\n * The rendering group to draw the layer in.\r\n */\r\n renderingGroupId: number;\r\n}\r\n\r\n/**\r\n * The effect layer Helps adding post process effect blended with the main pass.\r\n *\r\n * This can be for instance use to generate glow or highlight effects on the scene.\r\n *\r\n * The effect layer class can not be used directly and is intented to inherited from to be\r\n * customized per effects.\r\n */\r\nexport abstract class EffectLayer {\r\n\r\n private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n private _indexBuffer: Nullable<DataBuffer>;\r\n private _effectLayerOptions: IEffectLayerOptions;\r\n private _mergeDrawWrapper: DrawWrapper[];\r\n\r\n protected _scene: Scene;\r\n protected _engine: Engine;\r\n protected _maxSize: number = 0;\r\n protected _mainTextureDesiredSize: ISize = { width: 0, height: 0 };\r\n protected _mainTexture: RenderTargetTexture;\r\n protected _shouldRender = true;\r\n protected _postProcesses: PostProcess[] = [];\r\n protected _textures: BaseTexture[] = [];\r\n protected _emissiveTextureAndColor: { texture: Nullable<BaseTexture>, color: Color4 } = { texture: null, color: new Color4() };\r\n\r\n /**\r\n * The name of the layer\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * The clear color of the texture used to generate the glow map.\r\n */\r\n @serializeAsColor4()\r\n public neutralColor: Color4 = new Color4();\r\n\r\n /**\r\n * Specifies whether the highlight layer is enabled or not.\r\n */\r\n @serialize()\r\n public isEnabled: boolean = true;\r\n\r\n /**\r\n * Gets the camera attached to the layer.\r\n */\r\n @serializeAsCameraReference()\r\n public get camera(): Nullable<Camera> {\r\n return this._effectLayerOptions.camera;\r\n }\r\n\r\n /**\r\n * Gets the rendering group id the layer should render in.\r\n */\r\n @serialize()\r\n public get renderingGroupId(): number {\r\n return this._effectLayerOptions.renderingGroupId;\r\n }\r\n public set renderingGroupId(renderingGroupId: number) {\r\n this._effectLayerOptions.renderingGroupId = renderingGroupId;\r\n }\r\n\r\n /**\r\n * Specifies if the bounding boxes should be rendered normally or if they should undergo the effect of the layer\r\n */\r\n @serialize()\r\n public disableBoundingBoxesFromEffectLayer = false;\r\n\r\n /**\r\n * An event triggered when the effect layer has been disposed.\r\n */\r\n public onDisposeObservable = new Observable<EffectLayer>();\r\n\r\n /**\r\n * An event triggered when the effect layer is about rendering the main texture with the glowy parts.\r\n */\r\n public onBeforeRenderMainTextureObservable = new Observable<EffectLayer>();\r\n\r\n /**\r\n * An event triggered when the generated texture is being merged in the scene.\r\n */\r\n public onBeforeComposeObservable = new Observable<EffectLayer>();\r\n\r\n /**\r\n * An event triggered when the mesh is rendered into the effect render target.\r\n */\r\n public onBeforeRenderMeshToEffect = new Observable<AbstractMesh>();\r\n\r\n /**\r\n * An event triggered after the mesh has been rendered into the effect render target.\r\n */\r\n public onAfterRenderMeshToEffect = new Observable<AbstractMesh>();\r\n\r\n /**\r\n * An event triggered when the generated texture has been merged in the scene.\r\n */\r\n public onAfterComposeObservable = new Observable<EffectLayer>();\r\n\r\n /**\r\n * An event triggered when the effect layer changes its size.\r\n */\r\n public onSizeChangedObservable = new Observable<EffectLayer>();\r\n\r\n /** @hidden */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"EffectLayerSceneComponent\");\r\n }\r\n\r\n /**\r\n * Sets a specific material to be used to render a mesh/a list of meshes in the layer\r\n * @param mesh mesh or array of meshes\r\n * @param material material to use by the layer when rendering the mesh(es). If undefined is passed, the specific material created by the layer will be used.\r\n */\r\n public setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material): void {\r\n this._mainTexture.setMaterialForRendering(mesh, material);\r\n }\r\n\r\n /**\r\n * Instantiates a new effect Layer and references it in the scene.\r\n * @param name The name of the layer\r\n * @param scene The scene to use the layer in\r\n */\r\n constructor(\r\n /** The Friendly of the effect in the scene */\r\n name: string,\r\n scene: Scene) {\r\n this.name = name;\r\n\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n EffectLayer._SceneComponentInitialization(this._scene);\r\n\r\n this._engine = this._scene.getEngine();\r\n this._maxSize = this._engine.getCaps().maxTextureSize;\r\n this._scene.effectLayers.push(this);\r\n\r\n this._mergeDrawWrapper = [];\r\n\r\n // Generate Buffers\r\n this._generateIndexBuffer();\r\n this._generateVertexBuffer();\r\n }\r\n\r\n /**\r\n * Get the effect name of the layer.\r\n * @return The effect name\r\n */\r\n public abstract getEffectName(): string;\r\n\r\n /**\r\n * Checks for the readiness of the element composing the layer.\r\n * @param subMesh the mesh to check for\r\n * @param useInstances specify whether or not to use instances to render the mesh\r\n * @return true if ready otherwise, false\r\n */\r\n public abstract isReady(subMesh: SubMesh, useInstances: boolean): boolean;\r\n\r\n /**\r\n * Returns whether or not the layer needs stencil enabled during the mesh rendering.\r\n * @returns true if the effect requires stencil during the main canvas render pass.\r\n */\r\n public abstract needStencil(): boolean;\r\n\r\n /**\r\n * Create the merge effect. This is the shader use to blit the information back\r\n * to the main canvas at the end of the scene rendering.\r\n * @returns The effect containing the shader used to merge the effect on the main canvas\r\n */\r\n protected abstract _createMergeEffect(): Effect;\r\n\r\n /**\r\n * Creates the render target textures and post processes used in the effect layer.\r\n */\r\n protected abstract _createTextureAndPostProcesses(): void;\r\n\r\n /**\r\n * Implementation specific of rendering the generating effect on the main canvas.\r\n * @param effect The effect used to render through\r\n * @param renderNum Index of the _internalRender call (0 for the first time _internalRender is called, 1 for the second time, etc. _internalRender is called the number of times returned by _numInternalDraws())\r\n */\r\n protected abstract _internalRender(effect: Effect, renderIndex: number): void;\r\n\r\n /**\r\n * Sets the required values for both the emissive texture and and the main color.\r\n */\r\n protected abstract _setEmissiveTextureAndColor(mesh: Mesh, subMesh: SubMesh, material: Material): void;\r\n\r\n /**\r\n * Free any resources and references associated to a mesh.\r\n * Internal use\r\n * @param mesh The mesh to free.\r\n */\r\n public abstract _disposeMesh(mesh: Mesh): void;\r\n\r\n /**\r\n * Serializes this layer (Glow or Highlight for example)\r\n * @returns a serialized layer object\r\n */\r\n public abstract serialize?(): any;\r\n\r\n /**\r\n * Number of times _internalRender will be called. Some effect layers need to render the mesh several times, so they should override this method with the number of times the mesh should be rendered\r\n * @returns Number of times a mesh must be rendered in the layer\r\n */\r\n protected _numInternalDraws(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Initializes the effect layer with the required options.\r\n * @param options Sets of none mandatory options to use with the layer (see IEffectLayerOptions for more information)\r\n */\r\n protected _init(options: Partial<IEffectLayerOptions>): void {\r\n // Adapt options\r\n this._effectLayerOptions = {\r\n mainTextureRatio: 0.5,\r\n alphaBlendingMode: 2,\r\n camera: null,\r\n renderingGroupId: -1,\r\n ...options,\r\n };\r\n\r\n this._setMainTextureSize();\r\n this._createMainTexture();\r\n this._createTextureAndPostProcesses();\r\n }\r\n\r\n /**\r\n * Generates the index buffer of the full screen quad blending to the main canvas.\r\n */\r\n private _generateIndexBuffer(): void {\r\n // Indices\r\n var indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = this._engine.createIndexBuffer(indices);\r\n }\r\n\r\n /**\r\n * Generates the vertex buffer of the full screen quad blending to the main canvas.\r\n */\r\n private _generateVertexBuffer(): void {\r\n // VBO\r\n var vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n var vertexBuffer = new VertexBuffer(this._engine, vertices, VertexBuffer.PositionKind, false, false, 2);\r\n this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer;\r\n }\r\n\r\n /**\r\n * Sets the main texture desired size which is the closest power of two\r\n * of the engine canvas size.\r\n */\r\n private _setMainTextureSize(): void {\r\n if (this._effectLayerOptions.mainTextureFixedSize) {\r\n this._mainTextureDesiredSize.width = this._effectLayerOptions.mainTextureFixedSize;\r\n this._mainTextureDesiredSize.height = this._effectLayerOptions.mainTextureFixedSize;\r\n }\r\n else {\r\n this._mainTextureDesiredSize.width = this._engine.getRenderWidth() * this._effectLayerOptions.mainTextureRatio;\r\n this._mainTextureDesiredSize.height = this._engine.getRenderHeight() * this._effectLayerOptions.mainTextureRatio;\r\n\r\n this._mainTextureDesiredSize.width = this._engine.needPOTTextures ? Engine.GetExponentOfTwo(this._mainTextureDesiredSize.width, this._maxSize) : this._mainTextureDesiredSize.width;\r\n this._mainTextureDesiredSize.height = this._engine.needPOTTextures ? Engine.GetExponentOfTwo(this._mainTextureDesiredSize.height, this._maxSize) : this._mainTextureDesiredSize.height;\r\n }\r\n\r\n this._mainTextureDesiredSize.width = Math.floor(this._mainTextureDesiredSize.width);\r\n this._mainTextureDesiredSize.height = Math.floor(this._mainTextureDesiredSize.height);\r\n }\r\n\r\n /**\r\n * Creates the main texture for the effect layer.\r\n */\r\n protected _createMainTexture(): void {\r\n this._mainTexture = new RenderTargetTexture(\"EffectLayerMainRTT\",\r\n {\r\n width: this._mainTextureDesiredSize.width,\r\n height: this._mainTextureDesiredSize.height\r\n },\r\n this._scene,\r\n false,\r\n true,\r\n 0);\r\n this._mainTexture.activeCamera = this._effectLayerOptions.camera;\r\n this._mainTexture.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n this._mainTexture.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n this._mainTexture.anisotropicFilteringLevel = 1;\r\n this._mainTexture.updateSamplingMode(Texture.BILINEAR_SAMPLINGMODE);\r\n this._mainTexture.renderParticles = false;\r\n this._mainTexture.renderList = null;\r\n this._mainTexture.ignoreCameraViewport = true;\r\n\r\n // Custom render function\r\n this._mainTexture.customRenderFunction = (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>): void => {\r\n this.onBeforeRenderMainTextureObservable.notifyObservers(this);\r\n\r\n var index: number;\r\n\r\n let engine = this._scene.getEngine();\r\n\r\n if (depthOnlySubMeshes.length) {\r\n engine.setColorWrite(false);\r\n for (index = 0; index < depthOnlySubMeshes.length; index++) {\r\n this._renderSubMesh(depthOnlySubMeshes.data[index]);\r\n }\r\n engine.setColorWrite(true);\r\n }\r\n\r\n for (index = 0; index < opaqueSubMeshes.length; index++) {\r\n this._renderSubMesh(opaqueSubMeshes.data[index]);\r\n }\r\n\r\n for (index = 0; index < alphaTestSubMeshes.length; index++) {\r\n this._renderSubMesh(alphaTestSubMeshes.data[index]);\r\n }\r\n\r\n const previousAlphaMode = engine.getAlphaMode();\r\n\r\n for (index = 0; index < transparentSubMeshes.length; index++) {\r\n this._renderSubMesh(transparentSubMeshes.data[index], true);\r\n }\r\n\r\n engine.setAlphaMode(previousAlphaMode);\r\n };\r\n\r\n this._mainTexture.onClearObservable.add((engine: Engine) => {\r\n engine.clear(this.neutralColor, true, true, true);\r\n });\r\n\r\n // Prevent package size in es6 (getBoundingBoxRenderer might not be present)\r\n if (this._scene.getBoundingBoxRenderer) {\r\n const boundingBoxRendererEnabled = this._scene.getBoundingBoxRenderer().enabled;\r\n\r\n this._mainTexture.onBeforeBindObservable.add(() => {\r\n this._scene.getBoundingBoxRenderer().enabled = !this.disableBoundingBoxesFromEffectLayer && boundingBoxRendererEnabled;\r\n });\r\n\r\n this._mainTexture.onAfterUnbindObservable.add(() => {\r\n this._scene.getBoundingBoxRenderer().enabled = boundingBoxRendererEnabled;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Adds specific effects defines.\r\n * @param defines The defines to add specifics to.\r\n */\r\n protected _addCustomEffectDefines(defines: string[]): void {\r\n // Nothing to add by default.\r\n }\r\n\r\n /**\r\n * Checks for the readiness of the element composing the layer.\r\n * @param subMesh the mesh to check for\r\n * @param useInstances specify whether or not to use instances to render the mesh\r\n * @param emissiveTexture the associated emissive texture used to generate the glow\r\n * @return true if ready otherwise, false\r\n */\r\n protected _isReady(subMesh: SubMesh, useInstances: boolean, emissiveTexture: Nullable<BaseTexture>): boolean {\r\n const engine = this._scene.getEngine();\r\n const mesh = subMesh.getMesh();\r\n\r\n const renderingMaterial = mesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];\r\n\r\n if (renderingMaterial) {\r\n return renderingMaterial.isReadyForSubMesh(mesh, subMesh, useInstances);\r\n }\r\n\r\n let material = subMesh.getMaterial();\r\n\r\n if (!material) {\r\n return false;\r\n }\r\n\r\n if (this._useMeshMaterial(subMesh.getRenderingMesh())) {\r\n return material.isReadyForSubMesh(subMesh.getMesh(), subMesh, useInstances);\r\n }\r\n\r\n var defines: string[] = [];\r\n\r\n var attribs = [VertexBuffer.PositionKind];\r\n\r\n var uv1 = false;\r\n var uv2 = false;\r\n\r\n // Diffuse\r\n if (material) {\r\n const needAlphaTest = material.needAlphaTesting();\r\n\r\n const diffuseTexture = material.getAlphaTestTexture();\r\n const needAlphaBlendFromDiffuse = diffuseTexture && diffuseTexture.hasAlpha &&\r\n ((material as any).useAlphaFromDiffuseTexture || (material as any)._useAlphaFromAlbedoTexture);\r\n\r\n if (diffuseTexture && (needAlphaTest || needAlphaBlendFromDiffuse)) {\r\n defines.push(\"#define DIFFUSE\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) &&\r\n diffuseTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define DIFFUSEUV2\");\r\n uv2 = true;\r\n }\r\n else if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n defines.push(\"#define DIFFUSEUV1\");\r\n uv1 = true;\r\n }\r\n\r\n if (needAlphaTest) {\r\n defines.push(\"#define ALPHATEST\");\r\n defines.push(\"#define ALPHATESTVALUE 0.4\");\r\n }\r\n if (!diffuseTexture.gammaSpace) {\r\n defines.push(\"#define DIFFUSE_ISLINEAR\");\r\n }\r\n }\r\n\r\n var opacityTexture = (material as any).opacityTexture;\r\n if (opacityTexture) {\r\n defines.push(\"#define OPACITY\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) &&\r\n opacityTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define OPACITYUV2\");\r\n uv2 = true;\r\n }\r\n else if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n defines.push(\"#define OPACITYUV1\");\r\n uv1 = true;\r\n }\r\n }\r\n }\r\n\r\n // Emissive\r\n if (emissiveTexture) {\r\n defines.push(\"#define EMISSIVE\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) &&\r\n emissiveTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define EMISSIVEUV2\");\r\n uv2 = true;\r\n }\r\n else if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n defines.push(\"#define EMISSIVEUV1\");\r\n uv1 = true;\r\n }\r\n if (!emissiveTexture.gammaSpace) {\r\n defines.push(\"#define EMISSIVE_ISLINEAR\");\r\n }\r\n }\r\n\r\n // Vertex\r\n if (mesh.isVerticesDataPresent(VertexBuffer.ColorKind) && mesh.hasVertexAlpha) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n defines.push(\"#define VERTEXALPHA\");\r\n }\r\n\r\n if (uv1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n defines.push(\"#define UV1\");\r\n }\r\n if (uv2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n defines.push(\"#define UV2\");\r\n }\r\n\r\n // Bones\r\n const fallbacks = new EffectFallbacks();\r\n if (mesh.useBones && mesh.computeBonesUsingShaders) {\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\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n\r\n let skeleton = mesh.skeleton;\r\n if (skeleton && skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton ? (skeleton.bones.length + 1) : 0));\r\n }\r\n\r\n if (mesh.numBoneInfluencers > 0) {\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph targets\r\n var manager = (<Mesh>mesh).morphTargetManager;\r\n let morphInfluencers = 0;\r\n if (manager) {\r\n if (manager.numInfluencers > 0) {\r\n defines.push(\"#define MORPHTARGETS\");\r\n morphInfluencers = manager.numInfluencers;\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + morphInfluencers);\r\n if (manager.isUsingTextureForTargets) {\r\n defines.push(\"#define MORPHTARGETS_TEXTURE\");\r\n }\r\n MaterialHelper.PrepareAttributesForMorphTargetsInfluencers(attribs, mesh, morphInfluencers);\r\n }\r\n }\r\n\r\n // Instances\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n MaterialHelper.PushAttributesForInstances(attribs);\r\n if (subMesh.getRenderingMesh().hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n }\r\n }\r\n\r\n this._addCustomEffectDefines(defines);\r\n\r\n // Get correct effect\r\n const drawWrapper = subMesh._getDrawWrapper(undefined, true)!;\r\n const cachedDefines = drawWrapper.defines as string;\r\n const join = defines.join(\"\\n\");\r\n if (cachedDefines !== join) {\r\n drawWrapper.setEffect(this._engine.createEffect(\"glowMapGeneration\",\r\n attribs,\r\n [\"world\", \"mBones\", \"viewProjection\",\r\n \"glowColor\", \"morphTargetInfluences\", \"boneTextureWidth\",\r\n \"diffuseMatrix\", \"emissiveMatrix\", \"opacityMatrix\", \"opacityIntensity\",\r\n \"morphTargetTextureInfo\", \"morphTargetTextureIndices\"],\r\n [\"diffuseSampler\", \"emissiveSampler\", \"opacitySampler\", \"boneSampler\", \"morphTargets\"], join,\r\n fallbacks, undefined, undefined, { maxSimultaneousMorphTargets: morphInfluencers }),\r\n join\r\n );\r\n }\r\n\r\n return drawWrapper.effect!.isReady();\r\n }\r\n\r\n /**\r\n * Renders the glowing part of the scene by blending the blurred glowing meshes on top of the rendered scene.\r\n */\r\n public render(): void {\r\n for (var i = 0; i < this._postProcesses.length; i++) {\r\n if (!this._postProcesses[i].isReady()) {\r\n return;\r\n }\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n const numDraws = this._numInternalDraws();\r\n\r\n // Check\r\n let isReady = true;\r\n for (let i = 0; i < numDraws; ++i) {\r\n let currentEffect = this._mergeDrawWrapper[i];\r\n if (!currentEffect) {\r\n currentEffect = this._mergeDrawWrapper[i] = new DrawWrapper(this._engine);\r\n currentEffect.setEffect(this._createMergeEffect());\r\n }\r\n isReady = isReady && currentEffect.effect!.isReady();\r\n }\r\n\r\n if (!isReady) {\r\n return;\r\n }\r\n\r\n this.onBeforeComposeObservable.notifyObservers(this);\r\n\r\n const previousAlphaMode = engine.getAlphaMode();\r\n\r\n for (let i = 0; i < numDraws; ++i) {\r\n const currentEffect = this._mergeDrawWrapper[i];\r\n\r\n // Render\r\n engine.enableEffect(currentEffect);\r\n engine.setState(false);\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect.effect!);\r\n\r\n // Go Blend.\r\n engine.setAlphaMode(this._effectLayerOptions.alphaBlendingMode);\r\n\r\n // Blends the map on the main canvas.\r\n this._internalRender(currentEffect.effect!, i);\r\n }\r\n\r\n // Restore Alpha\r\n engine.setAlphaMode(previousAlphaMode);\r\n\r\n this.onAfterComposeObservable.notifyObservers(this);\r\n\r\n // Handle size changes.\r\n var size = this._mainTexture.getSize();\r\n this._setMainTextureSize();\r\n if ((size.width !== this._mainTextureDesiredSize.width || size.height !== this._mainTextureDesiredSize.height) && this._mainTextureDesiredSize.width !== 0 && this._mainTextureDesiredSize.height !== 0) {\r\n // Recreate RTT and post processes on size change.\r\n this.onSizeChangedObservable.notifyObservers(this);\r\n this._disposeTextureAndPostProcesses();\r\n this._createMainTexture();\r\n this._createTextureAndPostProcesses();\r\n }\r\n }\r\n\r\n /**\r\n * Determine if a given mesh will be used in the current effect.\r\n * @param mesh mesh to test\r\n * @returns true if the mesh will be used\r\n */\r\n public hasMesh(mesh: AbstractMesh): boolean {\r\n if (this.renderingGroupId === -1 || mesh.renderingGroupId === this.renderingGroupId) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns true if the layer contains information to display, otherwise false.\r\n * @returns true if the glow layer should be rendered\r\n */\r\n public shouldRender(): boolean {\r\n return this.isEnabled && this._shouldRender;\r\n }\r\n\r\n /**\r\n * Returns true if the mesh should render, otherwise false.\r\n * @param mesh The mesh to render\r\n * @returns true if it should render otherwise false\r\n */\r\n protected _shouldRenderMesh(mesh: AbstractMesh): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns true if the mesh can be rendered, otherwise false.\r\n * @param mesh The mesh to render\r\n * @param material The material used on the mesh\r\n * @returns true if it can be rendered otherwise false\r\n */\r\n protected _canRenderMesh(mesh: AbstractMesh, material: Material): boolean {\r\n return !material.needAlphaBlendingForMesh(mesh);\r\n }\r\n\r\n /**\r\n * Returns true if the mesh should render, otherwise false.\r\n * @param mesh The mesh to render\r\n * @returns true if it should render otherwise false\r\n */\r\n protected _shouldRenderEmissiveTextureForMesh(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Renders the submesh passed in parameter to the generation map.\r\n */\r\n protected _renderSubMesh(subMesh: SubMesh, enableAlphaMode: boolean = false): void {\r\n if (!this.shouldRender()) {\r\n return;\r\n }\r\n\r\n var material = subMesh.getMaterial();\r\n var ownerMesh = subMesh.getMesh();\r\n var replacementMesh = subMesh.getReplacementMesh();\r\n var renderingMesh = subMesh.getRenderingMesh();\r\n var effectiveMesh = subMesh.getEffectiveMesh();\r\n var scene = this._scene;\r\n var engine = scene.getEngine();\r\n\r\n effectiveMesh._internalAbstractMeshDataInfo._isActiveIntermediate = false;\r\n\r\n if (!material) {\r\n return;\r\n }\r\n\r\n // Do not block in blend mode.\r\n if (!this._canRenderMesh(renderingMesh, material)) {\r\n return;\r\n }\r\n\r\n // Culling\r\n let sideOrientation = renderingMesh.overrideMaterialSideOrientation ?? material.sideOrientation;\r\n const mainDeterminant = renderingMesh._getWorldMatrixDeterminant();\r\n if (mainDeterminant < 0) {\r\n sideOrientation = (sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation);\r\n }\r\n\r\n const reverse = sideOrientation === Material.ClockWiseSideOrientation;\r\n engine.setState(material.backFaceCulling, material.zOffset, undefined, reverse, material.cullBackFaces, undefined, material.zOffsetUnits);\r\n\r\n // Managing instances\r\n var batch = renderingMesh._getInstancesRenderList(subMesh._id, !!replacementMesh);\r\n if (batch.mustReturn) {\r\n return;\r\n }\r\n\r\n // Early Exit per mesh\r\n if (!this._shouldRenderMesh(renderingMesh)) {\r\n return;\r\n }\r\n\r\n var hardwareInstancedRendering = batch.hardwareInstancedRendering[subMesh._id] || renderingMesh.hasThinInstances;\r\n\r\n this._setEmissiveTextureAndColor(renderingMesh, subMesh, material);\r\n\r\n this.onBeforeRenderMeshToEffect.notifyObservers(ownerMesh);\r\n\r\n if (this._useMeshMaterial(renderingMesh)) {\r\n renderingMesh.render(subMesh, hardwareInstancedRendering, replacementMesh || undefined);\r\n }\r\n else if (this._isReady(subMesh, hardwareInstancedRendering, this._emissiveTextureAndColor.texture)) {\r\n const renderingMaterial = effectiveMesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];\r\n\r\n let drawWrapper = subMesh._getDrawWrapper();\r\n if (!drawWrapper && renderingMaterial) {\r\n drawWrapper = renderingMaterial._getDrawWrapper();\r\n }\r\n\r\n if (!drawWrapper) {\r\n return;\r\n }\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n engine.enableEffect(drawWrapper);\r\n if (!hardwareInstancedRendering) {\r\n const fillMode = scene.forcePointsCloud ? Material.PointFillMode : scene.forceWireframe ? Material.WireFrameFillMode : material.fillMode;\r\n renderingMesh._bind(subMesh, effect, fillMode);\r\n }\r\n\r\n if (!renderingMaterial) {\r\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n effect.setMatrix(\"world\", effectiveMesh.getWorldMatrix());\r\n effect.setFloat4(\"glowColor\",\r\n this._emissiveTextureAndColor.color.r,\r\n this._emissiveTextureAndColor.color.g,\r\n this._emissiveTextureAndColor.color.b,\r\n this._emissiveTextureAndColor.color.a);\r\n } else {\r\n renderingMaterial.bindForSubMesh(effectiveMesh.getWorldMatrix(), effectiveMesh as Mesh, subMesh);\r\n }\r\n\r\n if (!renderingMaterial) {\r\n const needAlphaTest = material.needAlphaTesting();\r\n\r\n const diffuseTexture = material.getAlphaTestTexture();\r\n const needAlphaBlendFromDiffuse = diffuseTexture && diffuseTexture.hasAlpha &&\r\n ((material as any).useAlphaFromDiffuseTexture || (material as any)._useAlphaFromAlbedoTexture);\r\n\r\n if (diffuseTexture && (needAlphaTest || needAlphaBlendFromDiffuse)) {\r\n effect.setTexture(\"diffuseSampler\", diffuseTexture);\r\n const textureMatrix = diffuseTexture.getTextureMatrix();\r\n\r\n if (textureMatrix) {\r\n effect.setMatrix(\"diffuseMatrix\", textureMatrix);\r\n }\r\n }\r\n\r\n const opacityTexture = (material as any).opacityTexture;\r\n if (opacityTexture) {\r\n effect.setTexture(\"opacitySampler\", opacityTexture);\r\n effect.setFloat(\"opacityIntensity\", opacityTexture.level);\r\n const textureMatrix = opacityTexture.getTextureMatrix();\r\n if (textureMatrix) {\r\n effect.setMatrix(\"opacityMatrix\", textureMatrix);\r\n }\r\n }\r\n\r\n // Glow emissive only\r\n if (this._emissiveTextureAndColor.texture) {\r\n effect.setTexture(\"emissiveSampler\", this._emissiveTextureAndColor.texture);\r\n effect.setMatrix(\"emissiveMatrix\", this._emissiveTextureAndColor.texture.getTextureMatrix());\r\n }\r\n\r\n // Bones\r\n if (renderingMesh.useBones && renderingMesh.computeBonesUsingShaders && renderingMesh.skeleton) {\r\n const skeleton = renderingMesh.skeleton;\r\n\r\n if (skeleton.isUsingTextureForMatrices) {\r\n const boneTexture = skeleton.getTransformMatrixTexture(renderingMesh);\r\n if (!boneTexture) {\r\n return;\r\n }\r\n\r\n effect.setTexture(\"boneSampler\", boneTexture);\r\n effect.setFloat(\"boneTextureWidth\", 4.0 * (skeleton.bones.length + 1));\r\n } else {\r\n effect.setMatrices(\"mBones\", skeleton.getTransformMatrices((renderingMesh)));\r\n }\r\n }\r\n\r\n // Morph targets\r\n MaterialHelper.BindMorphTargetParameters(renderingMesh, effect);\r\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\r\n renderingMesh.morphTargetManager._bind(effect);\r\n }\r\n\r\n // Alpha mode\r\n if (enableAlphaMode) {\r\n engine.setAlphaMode(material.alphaMode);\r\n }\r\n }\r\n\r\n // Draw\r\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering,\r\n (isInstance, world) => effect.setMatrix(\"world\", world));\r\n } else {\r\n // Need to reset refresh rate of the main map\r\n this._mainTexture.resetRefreshCounter();\r\n }\r\n\r\n this.onAfterRenderMeshToEffect.notifyObservers(ownerMesh);\r\n }\r\n\r\n /**\r\n * Defines whether the current material of the mesh should be use to render the effect.\r\n * @param mesh defines the current mesh to render\r\n */\r\n protected _useMeshMaterial(mesh: AbstractMesh): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Rebuild the required buffers.\r\n * @hidden Internal use only.\r\n */\r\n public _rebuild(): void {\r\n let vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n\r\n this._generateIndexBuffer();\r\n }\r\n\r\n /**\r\n * Dispose only the render target textures and post process.\r\n */\r\n private _disposeTextureAndPostProcesses(): void {\r\n this._mainTexture.dispose();\r\n\r\n for (var i = 0; i < this._postProcesses.length; i++) {\r\n if (this._postProcesses[i]) {\r\n this._postProcesses[i].dispose();\r\n }\r\n }\r\n this._postProcesses = [];\r\n\r\n for (var i = 0; i < this._textures.length; i++) {\r\n if (this._textures[i]) {\r\n this._textures[i].dispose();\r\n }\r\n }\r\n this._textures = [];\r\n }\r\n\r\n /**\r\n * Dispose the highlight layer and free resources.\r\n */\r\n public dispose(): void {\r\n var vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n\r\n for (const drawWrapper of this._mergeDrawWrapper) {\r\n drawWrapper.dispose();\r\n }\r\n this._mergeDrawWrapper = [];\r\n\r\n // Clean textures and post processes\r\n this._disposeTextureAndPostProcesses();\r\n\r\n // Remove from scene\r\n var index = this._scene.effectLayers.indexOf(this, 0);\r\n if (index > -1) {\r\n this._scene.effectLayers.splice(index, 1);\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n this.onBeforeRenderMainTextureObservable.clear();\r\n this.onBeforeComposeObservable.clear();\r\n this.onBeforeRenderMeshToEffect.clear();\r\n this.onAfterRenderMeshToEffect.clear();\r\n this.onAfterComposeObservable.clear();\r\n this.onSizeChangedObservable.clear();\r\n }\r\n\r\n /**\r\n * Gets the class name of the effect layer\r\n * @returns the string with the class name of the effect layer\r\n */\r\n public getClassName(): string {\r\n return \"EffectLayer\";\r\n }\r\n\r\n /**\r\n * Creates an effect layer from parsed effect layer data\r\n * @param parsedEffectLayer defines effect layer data\r\n * @param scene defines the current scene\r\n * @param rootUrl defines the root URL containing the effect layer information\r\n * @returns a parsed effect Layer\r\n */\r\n public static Parse(parsedEffectLayer: any, scene: Scene, rootUrl: string): EffectLayer {\r\n var effectLayerType = Tools.Instantiate(parsedEffectLayer.customType);\r\n\r\n return effectLayerType.Parse(parsedEffectLayer, scene, rootUrl);\r\n }\r\n}\r\n"]}
|
|
@@ -145,6 +145,7 @@ export declare class HighlightLayer extends EffectLayer {
|
|
|
145
145
|
* @return The effect name
|
|
146
146
|
*/
|
|
147
147
|
getEffectName(): string;
|
|
148
|
+
protected _numInternalDraws(): number;
|
|
148
149
|
/**
|
|
149
150
|
* Create the merge effect. This is the shader use to blit the information back
|
|
150
151
|
* to the main canvas at the end of the scene rendering.
|
|
@@ -170,7 +171,7 @@ export declare class HighlightLayer extends EffectLayer {
|
|
|
170
171
|
* Implementation specific of rendering the generating effect on the main canvas.
|
|
171
172
|
* @param effect The effect used to render through
|
|
172
173
|
*/
|
|
173
|
-
protected _internalRender(effect: Effect): void;
|
|
174
|
+
protected _internalRender(effect: Effect, renderIndex: number): void;
|
|
174
175
|
/**
|
|
175
176
|
* Returns true if the layer contains information to display, otherwise false.
|
|
176
177
|
*/
|
package/Layers/highlightLayer.js
CHANGED
|
@@ -142,6 +142,9 @@ var HighlightLayer = /** @class */ (function (_super) {
|
|
|
142
142
|
HighlightLayer.prototype.getEffectName = function () {
|
|
143
143
|
return HighlightLayer.EffectName;
|
|
144
144
|
};
|
|
145
|
+
HighlightLayer.prototype._numInternalDraws = function () {
|
|
146
|
+
return 2; // we need two rendering, one for the inner glow and the other for the outer glow
|
|
147
|
+
};
|
|
145
148
|
/**
|
|
146
149
|
* Create the merge effect. This is the shader use to blit the information back
|
|
147
150
|
* to the main canvas at the end of the scene rendering.
|
|
@@ -252,7 +255,7 @@ var HighlightLayer = /** @class */ (function (_super) {
|
|
|
252
255
|
* Implementation specific of rendering the generating effect on the main canvas.
|
|
253
256
|
* @param effect The effect used to render through
|
|
254
257
|
*/
|
|
255
|
-
HighlightLayer.prototype._internalRender = function (effect) {
|
|
258
|
+
HighlightLayer.prototype._internalRender = function (effect, renderIndex) {
|
|
256
259
|
// Texture
|
|
257
260
|
effect.setTexture("textureSampler", this._blurTexture);
|
|
258
261
|
// Cache
|
|
@@ -267,12 +270,12 @@ var HighlightLayer = /** @class */ (function (_super) {
|
|
|
267
270
|
engine.setStencilBuffer(true);
|
|
268
271
|
engine.setStencilFunctionReference(this._instanceGlowingMeshStencilReference);
|
|
269
272
|
// 2 passes inner outer
|
|
270
|
-
if (this.outerGlow) {
|
|
273
|
+
if (this.outerGlow && renderIndex === 0) { // the outer glow is rendered the first time _internalRender is called, so when renderIndex == 0 (and only if outerGlow is enabled)
|
|
271
274
|
effect.setFloat("offset", 0);
|
|
272
275
|
engine.setStencilFunction(517);
|
|
273
276
|
engine.drawElementsType(Material.TriangleFillMode, 0, 6);
|
|
274
277
|
}
|
|
275
|
-
if (this.innerGlow) {
|
|
278
|
+
if (this.innerGlow && renderIndex === 1) { // the inner glow is rendered the second time _internalRender is called, so when renderIndex == 1 (and only if innerGlow is enabled)
|
|
276
279
|
effect.setFloat("offset", 1);
|
|
277
280
|
engine.setStencilFunction(514);
|
|
278
281
|
engine.drawElementsType(Material.TriangleFillMode, 0, 6);
|