@onerjs/core 8.42.3 → 8.42.4
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/animatorAvatar.d.ts +31 -16
- package/Animations/animatorAvatar.js +138 -86
- package/Animations/animatorAvatar.js.map +1 -1
- package/AudioV2/abstractAudio/abstractSound.js +3 -4
- package/AudioV2/abstractAudio/abstractSound.js.map +1 -1
- package/AudioV2/abstractAudio/audioBus.js +3 -0
- package/AudioV2/abstractAudio/audioBus.js.map +1 -1
- package/AudioV2/abstractAudio/streamingSoundInstance.d.ts +1 -1
- package/AudioV2/abstractAudio/streamingSoundInstance.js +2 -2
- package/AudioV2/abstractAudio/streamingSoundInstance.js.map +1 -1
- package/AudioV2/webAudio/components/spatialWebAudioUpdaterComponent.d.ts +4 -1
- package/AudioV2/webAudio/components/spatialWebAudioUpdaterComponent.js +5 -2
- package/AudioV2/webAudio/components/spatialWebAudioUpdaterComponent.js.map +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.js +3 -3
- package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js +2 -4
- package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
- package/Cameras/Inputs/geospatialCameraKeyboardInput.js +6 -3
- package/Cameras/Inputs/geospatialCameraKeyboardInput.js.map +1 -1
- package/Cameras/geospatialCamera.d.ts +4 -2
- package/Cameras/geospatialCamera.js +10 -8
- package/Cameras/geospatialCamera.js.map +1 -1
- package/Cameras/geospatialCameraMovement.d.ts +11 -1
- package/Cameras/geospatialCameraMovement.js +26 -6
- package/Cameras/geospatialCameraMovement.js.map +1 -1
- package/Debug/physicsViewer.d.ts +1 -0
- package/Debug/physicsViewer.js +1 -0
- package/Debug/physicsViewer.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js +3 -1
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/nullEngine.js +4 -0
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +2 -2
- package/Engines/webgpuEngine.js.map +1 -1
- package/Layers/highlightLayer.d.ts +14 -0
- package/Layers/highlightLayer.js +20 -0
- package/Layers/highlightLayer.js.map +1 -1
- package/Layers/selectionOutlineLayer.d.ts +1 -0
- package/Layers/selectionOutlineLayer.js +1 -0
- package/Layers/selectionOutlineLayer.js.map +1 -1
- package/Layers/thinEffectLayer.js +25 -1
- package/Layers/thinEffectLayer.js.map +1 -1
- package/Layers/thinHighlightLayer.d.ts +9 -0
- package/Layers/thinHighlightLayer.js +19 -3
- package/Layers/thinHighlightLayer.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.js +4 -0
- package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.d.ts +2 -0
- package/Loading/Plugins/babylonFileLoader.js +2 -0
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Materials/Node/Blocks/Dual/depthSourceBlock.d.ts +1 -0
- package/Materials/Node/Blocks/Dual/depthSourceBlock.js +1 -0
- package/Materials/Node/Blocks/Dual/depthSourceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.d.ts +1 -0
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js +1 -0
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.js +10 -4
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js +6 -4
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +9 -0
- package/Meshes/abstractMesh.js +16 -0
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/mesh.js +2 -0
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/thinInstanceMesh.d.ts +7 -3
- package/Meshes/thinInstanceMesh.js +15 -3
- package/Meshes/thinInstanceMesh.js.map +1 -1
- package/Misc/snapshotRenderingHelper.d.ts +5 -3
- package/Misc/snapshotRenderingHelper.js +9 -5
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.js +3 -3
- package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/sphereParticleEmitter.js +2 -2
- package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
- package/Particles/Node/Blocks/index.d.ts +0 -2
- package/Particles/Node/Blocks/index.js +0 -2
- package/Particles/Node/Blocks/index.js.map +1 -1
- package/Particles/Node/Blocks/particleNumberMathBlock.js +16 -0
- package/Particles/Node/Blocks/particleNumberMathBlock.js.map +1 -1
- package/Particles/Node/Blocks/systemBlock.d.ts +0 -4
- package/Particles/Node/Blocks/systemBlock.js +1 -32
- package/Particles/Node/Blocks/systemBlock.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.helper.js +2 -89
- package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.d.ts +6 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +8 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.d.ts +6 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +8 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
- package/PostProcesses/screenSpaceReflectionPostProcess.d.ts +1 -0
- package/PostProcesses/screenSpaceReflectionPostProcess.js +1 -0
- package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
- package/Rendering/GlobalIllumination/giRSMManager.d.ts +1 -0
- package/Rendering/GlobalIllumination/giRSMManager.js +1 -0
- package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +7 -3
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +3 -1
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +3 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +3 -0
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/prePassRenderer.d.ts +1 -0
- package/Rendering/prePassRenderer.js +1 -0
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/depthPrePass.js +4 -1
- package/ShadersWGSL/ShadersInclude/depthPrePass.js.map +1 -1
- package/ShadersWGSL/background.fragment.js +1 -1
- package/ShadersWGSL/background.fragment.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +1 -1
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/XR/features/WebXRControllerPhysics.d.ts +1 -0
- package/XR/features/WebXRControllerPhysics.js +1 -0
- package/XR/features/WebXRControllerPhysics.js.map +1 -1
- package/XR/features/WebXRHandTracking.d.ts +1 -0
- package/XR/features/WebXRHandTracking.js +1 -0
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/package.json +1 -1
- package/Particles/Node/Blocks/Update/updateRemapBlock.d.ts +0 -39
- package/Particles/Node/Blocks/Update/updateRemapBlock.js +0 -93
- package/Particles/Node/Blocks/Update/updateRemapBlock.js.map +0 -1
- package/Particles/Node/Blocks/particleFresnelBlock.d.ts +0 -34
- package/Particles/Node/Blocks/particleFresnelBlock.js +0 -74
- package/Particles/Node/Blocks/particleFresnelBlock.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinEffectLayer.js","sourceRoot":"","sources":["../../../../dev/core/src/Layers/thinEffectLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SmartArray } from \"../Misc/smartArray\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { EffectWrapperCreationOptions } from \"../Materials/effectRenderer\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { EffectFallbacks } from \"../Materials/effectFallbacks\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from \"../Materials/clipPlaneMaterialHelper\";\r\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from \"../Materials/materialHelper.functions\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport { ObjectRenderer } from \"../Rendering/objectRenderer\";\r\nimport type { Vector2 } from \"../Maths/math.vector\";\r\nimport { Engine } from \"../Engines/engine\";\r\n\r\n/**\r\n * Special Glow Blur post process only blurring the alpha channel\r\n * It enforces keeping the most luminous color in the color channel.\r\n * @internal\r\n */\r\nexport class ThinGlowBlurPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"glowBlurPostProcess\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"screenSize\", \"direction\", \"blurWidth\"];\r\n\r\n constructor(\r\n name: string,\r\n engine: Nullable<AbstractEngine> = null,\r\n public direction: Vector2,\r\n public kernel: number,\r\n options?: EffectWrapperCreationOptions\r\n ) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || Engine.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinGlowBlurPostProcess.FragmentUrl,\r\n uniforms: ThinGlowBlurPostProcess.Uniforms,\r\n });\r\n }\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/glowBlurPostProcess.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/glowBlurPostProcess.fragment\"));\r\n }\r\n\r\n super._gatherImports(useWebGPU, list);\r\n }\r\n\r\n public textureWidth: number = 0;\r\n\r\n public textureHeight: number = 0;\r\n\r\n public override bind() {\r\n super.bind();\r\n this._drawWrapper.effect!.setFloat2(\"screenSize\", this.textureWidth, this.textureHeight);\r\n this._drawWrapper.effect!.setVector2(\"direction\", this.direction);\r\n this._drawWrapper.effect!.setFloat(\"blurWidth\", this.kernel);\r\n }\r\n}\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 IThinEffectLayerOptions {\r\n /**\r\n * Multiplication factor apply to the canvas size to compute the render target size\r\n * used to generated the glowing objects (the smaller the faster). Default: 0.5\r\n */\r\n mainTextureRatio?: number;\r\n\r\n /**\r\n * Enforces a fixed size texture to ensure resize independent blur. Default: undefined\r\n */\r\n mainTextureFixedSize?: number;\r\n\r\n /**\r\n * The type of the main texture. Default: TEXTURETYPE_UNSIGNED_BYTE\r\n */\r\n mainTextureType?: number;\r\n\r\n /**\r\n * The format of the main texture. Default: TEXTUREFORMAT_RGBA\r\n */\r\n mainTextureFormat?: number;\r\n\r\n /**\r\n * Alpha blending mode used to apply the blur. Default depends of the implementation. Default: ALPHA_COMBINE\r\n */\r\n alphaBlendingMode?: number;\r\n\r\n /**\r\n * The camera attached to the layer. Default: null\r\n */\r\n camera?: Nullable<Camera>;\r\n\r\n /**\r\n * The rendering group to draw the layer in. Default: -1\r\n */\r\n renderingGroupId?: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinEffectLayer {\r\n private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n private _indexBuffer: Nullable<DataBuffer>;\r\n private _mergeDrawWrapper: DrawWrapper[];\r\n protected _dontCheckIfReady = false;\r\n\r\n protected _scene: Scene;\r\n protected _engine: AbstractEngine;\r\n /** @internal */\r\n public _options: Required<IThinEffectLayerOptions>;\r\n protected _objectRenderer: ObjectRenderer;\r\n /** @internal */\r\n public _shouldRender = true;\r\n /** @internal */\r\n public _emissiveTextureAndColor: { texture: Nullable<BaseTexture>; color: Color4 } = { texture: null, color: new Color4() };\r\n /** @internal */\r\n public _effectIntensity: { [meshUniqueId: number]: number } = {};\r\n /** @internal */\r\n public _postProcesses: EffectWrapper[] = [];\r\n\r\n /**\r\n * Force all the effect layers to compile to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n\r\n /**\r\n * The name of the layer\r\n */\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 public neutralColor: Color4 = new Color4();\r\n\r\n /**\r\n * Specifies whether the effect layer is enabled or not.\r\n */\r\n public isEnabled: boolean = true;\r\n\r\n /**\r\n * Gets/sets the camera attached to the layer.\r\n */\r\n public get camera(): Nullable<Camera> {\r\n return this._options.camera;\r\n }\r\n\r\n public set camera(camera: Nullable<Camera>) {\r\n this._options.camera = camera;\r\n }\r\n\r\n /**\r\n * Gets the rendering group id the layer should render in.\r\n */\r\n public get renderingGroupId(): number {\r\n return this._options.renderingGroupId;\r\n }\r\n public set renderingGroupId(renderingGroupId: number) {\r\n this._options.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 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<ThinEffectLayer>();\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 onBeforeRenderLayerObservable = new Observable<ThinEffectLayer>();\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<ThinEffectLayer>();\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<ThinEffectLayer>();\r\n\r\n /**\r\n * An event triggered when the layer is being blurred.\r\n */\r\n public onBeforeBlurObservable = new Observable<ThinEffectLayer>();\r\n\r\n /**\r\n * An event triggered when the layer has been blurred.\r\n */\r\n public onAfterBlurObservable = new Observable<ThinEffectLayer>();\r\n\r\n /**\r\n * Gets the object renderer used to render objects in the layer\r\n */\r\n public get objectRenderer() {\r\n return this._objectRenderer;\r\n }\r\n\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this material.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private _materialForRendering: { [id: string]: [AbstractMesh, Material] } = {};\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._objectRenderer.setMaterialForRendering(mesh, material);\r\n if (Array.isArray(mesh)) {\r\n for (let i = 0; i < mesh.length; ++i) {\r\n const currentMesh = mesh[i];\r\n if (!material) {\r\n delete this._materialForRendering[currentMesh.uniqueId];\r\n } else {\r\n this._materialForRendering[currentMesh.uniqueId] = [currentMesh, material];\r\n }\r\n }\r\n } else {\r\n if (!material) {\r\n delete this._materialForRendering[mesh.uniqueId];\r\n } else {\r\n this._materialForRendering[mesh.uniqueId] = [mesh, material];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the intensity of the effect for a specific mesh.\r\n * @param mesh The mesh to get the effect intensity for\r\n * @returns The intensity of the effect for the mesh\r\n */\r\n public getEffectIntensity(mesh: AbstractMesh) {\r\n return this._effectIntensity[mesh.uniqueId] ?? 1;\r\n }\r\n\r\n /**\r\n * Sets the intensity of the effect for a specific mesh.\r\n * @param mesh The mesh to set the effect intensity for\r\n * @param intensity The intensity of the effect for the mesh\r\n */\r\n public setEffectIntensity(mesh: AbstractMesh, intensity: number): void {\r\n this._effectIntensity[mesh.uniqueId] = intensity;\r\n }\r\n\r\n /**\r\n * Instantiates a new effect Layer\r\n * @param name The name of the layer\r\n * @param scene The scene to use the layer in\r\n * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.\r\n * @param _additionalImportShadersAsync Additional shaders to import when the layer is created\r\n */\r\n constructor(\r\n name: string,\r\n scene?: Scene,\r\n forceGLSL = false,\r\n dontCheckIfReady = false,\r\n private _additionalImportShadersAsync?: () => Promise<void>\r\n ) {\r\n this.name = name;\r\n this._scene = scene || <Scene>EngineStore.LastCreatedScene;\r\n this._dontCheckIfReady = dontCheckIfReady;\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n if (engine.isWebGPU && !forceGLSL && !ThinEffectLayer.ForceGLSL) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n this._engine = this._scene.getEngine();\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 /** @internal */\r\n public _shadersLoaded = false;\r\n\r\n /**\r\n * Get the effect name of the layer.\r\n * @returns The effect name\r\n */\r\n public getEffectName(): string {\r\n return \"\";\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 * @returns true if ready otherwise, false\r\n */\r\n public isReady(_subMesh: SubMesh, _useInstances: boolean): boolean {\r\n return true;\r\n }\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 needStencil(): boolean {\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public _createMergeEffect(): Effect {\r\n throw new Error(\"Effect Layer: no merge effect defined\");\r\n }\r\n\r\n /** @internal */\r\n public _createTextureAndPostProcesses(): void {}\r\n\r\n /** @internal */\r\n public bindTexturesForCompose: (effect: Effect) => void;\r\n\r\n /** @internal */\r\n public _internalCompose(_effect: Effect, _renderIndex: number): void {}\r\n\r\n /** @internal */\r\n public _setEmissiveTextureAndColor(_mesh: Mesh, _subMesh: SubMesh, _material: Material): void {}\r\n\r\n /** @internal */\r\n public _numInternalDraws(): number {\r\n return 1;\r\n }\r\n\r\n /** @internal */\r\n public _init(options: IThinEffectLayerOptions): void {\r\n // Adapt options\r\n this._options = {\r\n mainTextureRatio: 0.5,\r\n mainTextureFixedSize: 0,\r\n mainTextureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n mainTextureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n alphaBlendingMode: Constants.ALPHA_COMBINE,\r\n camera: null,\r\n renderingGroupId: -1,\r\n ...options,\r\n };\r\n\r\n this._createObjectRenderer();\r\n }\r\n\r\n private _generateIndexBuffer(): void {\r\n // Indices\r\n const 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 private _generateVertexBuffer(): void {\r\n // VBO\r\n const 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 const vertexBuffer = new VertexBuffer(this._engine, vertices, VertexBuffer.PositionKind, false, false, 2);\r\n this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer;\r\n }\r\n\r\n protected _createObjectRenderer(): void {\r\n this._objectRenderer = new ObjectRenderer(`ObjectRenderer for thin effect layer ${this.name}`, this._scene, {\r\n doNotChangeAspectRatio: true,\r\n });\r\n this._objectRenderer.activeCamera = this._options.camera;\r\n this._objectRenderer.renderParticles = false;\r\n this._objectRenderer.renderList = null;\r\n\r\n // Prevent package size in es6 (getBoundingBoxRenderer might not be present)\r\n const hasBoundingBoxRenderer = !!this._scene.getBoundingBoxRenderer;\r\n\r\n let boundingBoxRendererEnabled = false;\r\n if (hasBoundingBoxRenderer) {\r\n this._objectRenderer.onBeforeRenderObservable.add(() => {\r\n boundingBoxRendererEnabled = this._scene.getBoundingBoxRenderer().enabled;\r\n this._scene.getBoundingBoxRenderer().enabled = !this.disableBoundingBoxesFromEffectLayer && boundingBoxRendererEnabled;\r\n });\r\n\r\n this._objectRenderer.onAfterRenderObservable.add(() => {\r\n this._scene.getBoundingBoxRenderer().enabled = boundingBoxRendererEnabled;\r\n });\r\n }\r\n\r\n this._objectRenderer.customIsReadyFunction = (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => {\r\n if ((preWarm || refreshRate === 0) && mesh.subMeshes) {\r\n for (let i = 0; i < mesh.subMeshes.length; ++i) {\r\n const subMesh = mesh.subMeshes[i];\r\n const material = subMesh.getMaterial();\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n\r\n if (!material) {\r\n continue;\r\n }\r\n\r\n const batch = renderingMesh._getInstancesRenderList(subMesh._id, !!subMesh.getReplacementMesh());\r\n const hardwareInstancedRendering = batch.hardwareInstancedRendering[subMesh._id] || renderingMesh.hasThinInstances;\r\n\r\n this._setEmissiveTextureAndColor(renderingMesh, subMesh, material);\r\n\r\n if (!this._isSubMeshReady(subMesh, hardwareInstancedRendering, this._emissiveTextureAndColor.texture)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n // Custom render function\r\n this._objectRenderer.customRenderFunction = (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>\r\n ): void => {\r\n this.onBeforeRenderLayerObservable.notifyObservers(this);\r\n\r\n let index: number;\r\n\r\n const 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 const subMesh = transparentSubMeshes.data[index];\r\n const material = subMesh.getMaterial();\r\n if (material && material.needDepthPrePass) {\r\n const engine = material.getScene().getEngine();\r\n engine.setColorWrite(false);\r\n this._renderSubMesh(subMesh);\r\n engine.setColorWrite(true);\r\n }\r\n this._renderSubMesh(subMesh, true);\r\n }\r\n\r\n engine.setAlphaMode(previousAlphaMode);\r\n };\r\n }\r\n\r\n /** @internal */\r\n public _addCustomEffectDefines(_defines: string[]): void {}\r\n\r\n /** @internal */\r\n public _internalIsSubMeshReady(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 const 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 const defines: string[] = [];\r\n\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n let uv1 = false;\r\n let uv2 = false;\r\n const color = false;\r\n\r\n // Diffuse\r\n if (material) {\r\n const needAlphaTest = material.needAlphaTestingForMesh(mesh);\r\n\r\n const diffuseTexture = material.getAlphaTestTexture();\r\n const needAlphaBlendFromDiffuse =\r\n diffuseTexture && diffuseTexture.hasAlpha && ((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) && diffuseTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define DIFFUSEUV2\");\r\n uv2 = true;\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 const opacityTexture = (material as any).opacityTexture;\r\n if (opacityTexture) {\r\n defines.push(\"#define OPACITY\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) && opacityTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define OPACITYUV2\");\r\n uv2 = true;\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) && emissiveTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define EMISSIVEUV2\");\r\n uv2 = true;\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.useVertexColors && mesh.isVerticesDataPresent(VertexBuffer.ColorKind) && mesh.hasVertexAlpha && material.transparencyMode !== Material.MATERIAL_OPAQUE) {\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 const 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 const numMorphInfluencers = mesh.morphTargetManager\r\n ? PrepareDefinesAndAttributesForMorphTargets(\r\n mesh.morphTargetManager,\r\n defines,\r\n attribs,\r\n mesh,\r\n true, // usePositionMorph\r\n false, // useNormalMorph\r\n false, // useTangentMorph\r\n uv1, // useUVMorph\r\n uv2, // useUV2Morph\r\n color // useColorMorph\r\n )\r\n : 0;\r\n\r\n // Instances\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n PushAttributesForInstances(attribs);\r\n if (subMesh.getRenderingMesh().hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n }\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = mesh.bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (useInstances) {\r\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\r\n }\r\n }\r\n\r\n // ClipPlanes\r\n PrepareStringDefinesForClipPlanes(material, this._scene, defines);\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 const uniforms = [\r\n \"world\",\r\n \"mBones\",\r\n \"viewProjection\",\r\n \"glowColor\",\r\n \"morphTargetInfluences\",\r\n \"morphTargetCount\",\r\n \"boneTextureWidth\",\r\n \"diffuseMatrix\",\r\n \"emissiveMatrix\",\r\n \"opacityMatrix\",\r\n \"opacityIntensity\",\r\n \"morphTargetTextureInfo\",\r\n \"morphTargetTextureIndices\",\r\n \"bakedVertexAnimationSettings\",\r\n \"bakedVertexAnimationTextureSizeInverted\",\r\n \"bakedVertexAnimationTime\",\r\n \"bakedVertexAnimationTexture\",\r\n \"glowIntensity\",\r\n ];\r\n\r\n AddClipPlaneUniforms(uniforms);\r\n\r\n drawWrapper.setEffect(\r\n this._engine.createEffect(\r\n \"glowMapGeneration\",\r\n attribs,\r\n uniforms,\r\n [\"diffuseSampler\", \"emissiveSampler\", \"opacitySampler\", \"boneSampler\", \"morphTargets\", \"bakedVertexAnimationTexture\"],\r\n join,\r\n fallbacks,\r\n undefined,\r\n undefined,\r\n { maxSimultaneousMorphTargets: numMorphInfluencers },\r\n this._shaderLanguage,\r\n this._shadersLoaded\r\n ? undefined\r\n : async () => {\r\n await this._importShadersAsync();\r\n this._shadersLoaded = true;\r\n }\r\n ),\r\n join\r\n );\r\n }\r\n\r\n const effectIsReady = drawWrapper.effect!.isReady();\r\n\r\n return effectIsReady && (this._dontCheckIfReady || (!this._dontCheckIfReady && this.isLayerReady()));\r\n }\r\n\r\n /** @internal */\r\n public _isSubMeshReady(subMesh: SubMesh, useInstances: boolean, emissiveTexture: Nullable<BaseTexture>): boolean {\r\n return this._internalIsSubMeshReady(subMesh, useInstances, emissiveTexture);\r\n }\r\n\r\n protected async _importShadersAsync(): Promise<void> {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/glowMapGeneration.vertex\"), import(\"../ShadersWGSL/glowMapGeneration.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/glowMapGeneration.vertex\"), import(\"../Shaders/glowMapGeneration.fragment\")]);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._additionalImportShadersAsync?.();\r\n }\r\n\r\n /** @internal */\r\n public _internalIsLayerReady(): boolean {\r\n let isReady = true;\r\n\r\n for (let i = 0; i < this._postProcesses.length; i++) {\r\n isReady = this._postProcesses[i].isReady() && isReady;\r\n }\r\n\r\n const numDraws = this._numInternalDraws();\r\n\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 = currentEffect.effect!.isReady() && isReady;\r\n }\r\n\r\n return isReady;\r\n }\r\n\r\n /**\r\n * Checks if the layer is ready to be used.\r\n * @returns true if the layer is ready to be used\r\n */\r\n public isLayerReady(): boolean {\r\n return this._internalIsLayerReady();\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 * @returns true if the rendering was successful\r\n */\r\n public compose(): boolean {\r\n if (!this._dontCheckIfReady && !this.isLayerReady()) {\r\n return false;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n const numDraws = this._numInternalDraws();\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._options.alphaBlendingMode);\r\n\r\n // Blends the map on the main canvas.\r\n this._internalCompose(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 return true;\r\n }\r\n\r\n /** @internal */\r\n public _internalHasMesh(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 * 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 return this._internalHasMesh(mesh);\r\n }\r\n\r\n /** @internal */\r\n public _internalShouldRender(): boolean {\r\n return this.isEnabled && this._shouldRender;\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._internalShouldRender();\r\n }\r\n\r\n /** @internal */\r\n public _shouldRenderMesh(_mesh: AbstractMesh): boolean {\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _internalCanRenderMesh(mesh: AbstractMesh, material: Material): boolean {\r\n return !material.needAlphaBlendingForMesh(mesh);\r\n }\r\n\r\n /** @internal */\r\n public _canRenderMesh(mesh: AbstractMesh, material: Material): boolean {\r\n return this._internalCanRenderMesh(mesh, material);\r\n }\r\n\r\n protected _renderSubMesh(subMesh: SubMesh, enableAlphaMode: boolean = false): void {\r\n if (!this._internalShouldRender()) {\r\n return;\r\n }\r\n\r\n const material = subMesh.getMaterial();\r\n const ownerMesh = subMesh.getMesh();\r\n const replacementMesh = subMesh.getReplacementMesh();\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n const effectiveMesh = subMesh.getEffectiveMesh();\r\n const scene = this._scene;\r\n const 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 = material._getEffectiveOrientation(renderingMesh);\r\n const mainDeterminant = effectiveMesh._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 const 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 const 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 subMesh.getMaterial()!._glowModeEnabled = true;\r\n renderingMesh.render(subMesh, enableAlphaMode, replacementMesh || undefined);\r\n subMesh.getMaterial()!._glowModeEnabled = false;\r\n } else if (this._isSubMeshReady(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 renderingMesh._bind(subMesh, effect, material.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(\r\n \"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 } else {\r\n renderingMaterial.bindForSubMesh(effectiveMesh.getWorldMatrix(), effectiveMesh as Mesh, subMesh);\r\n }\r\n\r\n if (!renderingMaterial) {\r\n const needAlphaTest = material.needAlphaTestingForMesh(effectiveMesh);\r\n\r\n const diffuseTexture = material.getAlphaTestTexture();\r\n const needAlphaBlendFromDiffuse =\r\n diffuseTexture && diffuseTexture.hasAlpha && ((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 BindBonesParameters(renderingMesh, effect);\r\n\r\n // Morph targets\r\n BindMorphTargetParameters(renderingMesh, effect);\r\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\r\n renderingMesh.morphTargetManager._bind(effect);\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n bvaManager.bind(effect, hardwareInstancedRendering);\r\n }\r\n\r\n // Alpha mode\r\n if (enableAlphaMode) {\r\n engine.setAlphaMode(material.alphaMode);\r\n }\r\n\r\n // Intensity of effect\r\n effect.setFloat(\"glowIntensity\", this.getEffectIntensity(renderingMesh));\r\n\r\n // Clip planes\r\n BindClipPlane(effect, material, scene);\r\n }\r\n\r\n // Draw\r\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering, (isInstance, world) =>\r\n effect.setMatrix(\"world\", world)\r\n );\r\n } else {\r\n // Need to reset refresh rate of the main map\r\n this._objectRenderer.resetRefreshCounter();\r\n }\r\n\r\n this.onAfterRenderMeshToEffect.notifyObservers(ownerMesh);\r\n }\r\n\r\n /** @internal */\r\n public _useMeshMaterial(_mesh: AbstractMesh): boolean {\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n const 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 the effect layer and free resources.\r\n */\r\n public dispose(): void {\r\n const 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 this._objectRenderer.dispose();\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n this.onBeforeRenderLayerObservable.clear();\r\n this.onBeforeComposeObservable.clear();\r\n this.onBeforeRenderMeshToEffect.clear();\r\n this.onAfterRenderMeshToEffect.clear();\r\n this.onAfterComposeObservable.clear();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"thinEffectLayer.js","sourceRoot":"","sources":["../../../../dev/core/src/Layers/thinEffectLayer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKjD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,iCAAiC,EAAE,MAAM,sCAAsC,CAAC;AAC9H,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAE/K,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C;;;;GAIG;AACH,MAAM,OAAO,uBAAwB,SAAQ,aAAa;IAWtD,YACI,IAAY,EACZ,SAAmC,IAAI,EAChC,SAAkB,EAClB,MAAc,EACrB,OAAsC;QAEtC,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,iBAAkB;YAC3C,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,uBAAuB,CAAC,WAAW;YACnD,QAAQ,EAAE,uBAAuB,CAAC,QAAQ;SAC7C,CAAC,CAAC;QAZI,cAAS,GAAT,SAAS,CAAS;QAClB,WAAM,GAAN,MAAM,CAAQ;QAyBlB,iBAAY,GAAW,CAAC,CAAC;QAEzB,kBAAa,GAAW,CAAC,CAAC;IAfjC,CAAC;IAEkB,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAMe,IAAI;QAChB,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACzF,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;;AAhDD;;GAEG;AACoB,mCAAW,GAAG,qBAAqB,AAAxB,CAAyB;AAE3D;;GAEG;AACoB,gCAAQ,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC,AAA3C,CAA4C;AAqF/E;;GAEG;AACH,MAAM,OAAO,eAAe;IAyCxB;;OAEG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,IAAW,MAAM,CAAC,MAAwB;QACtC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC1C,CAAC;IACD,IAAW,gBAAgB,CAAC,gBAAwB;QAChD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IACtD,CAAC;IA+CD;;OAEG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAID;;OAEG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAID;;;;OAIG;IACI,uBAAuB,CAAC,IAAmC,EAAE,QAAmB;QACnF,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACZ,OAAO,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;gBAC/E,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACjE,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,IAAkB;QACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,IAAkB,EAAE,SAAiB;QAC3D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IACrD,CAAC;IAED;;;;;;;OAOG;IACH,YACI,IAAY,EACZ,KAAa,EACb,SAAS,GAAG,KAAK,EACjB,gBAAgB,GAAG,KAAK,EAChB,6BAAmD;QAAnD,kCAA6B,GAA7B,6BAA6B,CAAsB;QApLvD,mBAAc,GAA8C,EAAE,CAAC;QAG7D,sBAAiB,GAAG,KAAK,CAAC;QAOpC,gBAAgB;QACT,kBAAa,GAAG,IAAI,CAAC;QAC5B,gBAAgB;QACT,6BAAwB,GAAsD,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,EAAE,CAAC;QAC5H,gBAAgB;QACT,qBAAgB,GAAuC,EAAE,CAAC;QACjE,gBAAgB;QACT,mBAAc,GAAoB,EAAE,CAAC;QAa5C;;WAEG;QACI,iBAAY,GAAW,IAAI,MAAM,EAAE,CAAC;QAE3C;;WAEG;QACI,cAAS,GAAY,IAAI,CAAC;QAuBjC;;WAEG;QACI,wCAAmC,GAAG,KAAK,CAAC;QAEnD;;WAEG;QACI,wBAAmB,GAAG,IAAI,UAAU,EAAmB,CAAC;QAE/D;;WAEG;QACI,kCAA6B,GAAG,IAAI,UAAU,EAAmB,CAAC;QAEzE;;WAEG;QACI,8BAAyB,GAAG,IAAI,UAAU,EAAmB,CAAC;QAErE;;WAEG;QACI,+BAA0B,GAAG,IAAI,UAAU,EAAgB,CAAC;QAEnE;;WAEG;QACI,8BAAyB,GAAG,IAAI,UAAU,EAAgB,CAAC;QAElE;;WAEG;QACI,6BAAwB,GAAG,IAAI,UAAU,EAAmB,CAAC;QAEpE;;WAEG;QACI,2BAAsB,GAAG,IAAI,UAAU,EAAmB,CAAC;QAElE;;WAEG;QACI,0BAAqB,GAAG,IAAI,UAAU,EAAmB,CAAC;QASvD,oBAAe,+BAAuB;QASxC,0BAAqB,GAA+C,EAAE,CAAC;QA+E/E,gBAAgB;QACT,mBAAc,GAAG,KAAK,CAAC;QApB1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,KAAK,IAAW,WAAW,CAAC,gBAAgB,CAAC;QAC3D,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAEvC,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,SAAS,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;YAC9D,IAAI,CAAC,eAAe,8BAAsB,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAEvC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAE5B,mBAAmB;QACnB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjC,CAAC;IAKD;;;OAGG;IACI,aAAa;QAChB,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACI,OAAO,CAAC,QAAiB,EAAE,aAAsB;QACpD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,WAAW;QACd,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,gBAAgB;IACT,kBAAkB;QACrB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC7D,CAAC;IAED,gBAAgB;IACT,8BAA8B,KAAU,CAAC;IAKhD,gBAAgB;IACT,gBAAgB,CAAC,OAAe,EAAE,YAAoB,IAAS,CAAC;IAEvE,gBAAgB;IACT,2BAA2B,CAAC,KAAW,EAAE,QAAiB,EAAE,SAAmB,IAAS,CAAC;IAEhG,gBAAgB;IACT,iBAAiB;QACpB,OAAO,CAAC,CAAC;IACb,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,OAAgC;QACzC,gBAAgB;QAChB,IAAI,CAAC,QAAQ,GAAG;YACZ,gBAAgB,EAAE,GAAG;YACrB,oBAAoB,EAAE,CAAC;YACvB,eAAe,EAAE,SAAS,CAAC,yBAAyB;YACpD,iBAAiB,EAAE,SAAS,CAAC,kBAAkB;YAC/C,iBAAiB,EAAE,SAAS,CAAC,aAAa;YAC1C,MAAM,EAAE,IAAI;YACZ,gBAAgB,EAAE,CAAC,CAAC;YACpB,GAAG,OAAO;SACb,CAAC;QAEF,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjC,CAAC;IAEO,oBAAoB;QACxB,UAAU;QACV,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,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;IAEO,qBAAqB;QACzB,MAAM;QACN,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,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,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1G,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;IAClE,CAAC;IAES,qBAAqB;QAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,cAAc,CAAC,wCAAwC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;YACxG,sBAAsB,EAAE,IAAI;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzD,IAAI,CAAC,eAAe,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvC,4EAA4E;QAC5E,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;QAEpE,IAAI,0BAA0B,GAAG,KAAK,CAAC;QACvC,IAAI,sBAAsB,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnD,0BAA0B,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,OAAO,CAAC;gBAC1E,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,mCAAmC,IAAI,0BAA0B,CAAC;YAC3H,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAClD,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,OAAO,GAAG,0BAA0B,CAAC;YAC9E,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,qBAAqB,GAAG,CAAC,IAAkB,EAAE,WAAmB,EAAE,OAAiB,EAAE,EAAE;YACxG,IAAI,CAAC,OAAO,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;oBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;oBACvC,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBAEjD,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACZ,SAAS;oBACb,CAAC;oBAED,MAAM,KAAK,GAAG,aAAa,CAAC,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBACjG,MAAM,0BAA0B,GAAG,KAAK,CAAC,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,gBAAgB,CAAC;oBAEnH,IAAI,CAAC,2BAA2B,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;oBAEnE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,0BAA0B,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;wBACpG,OAAO,KAAK,CAAC;oBACjB,CAAC;gBACL,CAAC;YACL,CAAC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,yBAAyB;QACzB,IAAI,CAAC,eAAe,CAAC,oBAAoB,GAAG,CACxC,eAAoC,EACpC,kBAAuC,EACvC,oBAAyC,EACzC,kBAAuC,EACnC,EAAE;YACN,IAAI,CAAC,6BAA6B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAEzD,IAAI,KAAa,CAAC;YAElB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAEvC,IAAI,kBAAkB,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC5B,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;oBACzD,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxD,CAAC;gBACD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAED,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBACtD,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACrD,CAAC;YAED,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzD,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YAEhD,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;gBACvC,IAAI,QAAQ,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;oBACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;oBAC/C,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBAC5B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;oBAC7B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAC3C,CAAC,CAAC;IACN,CAAC;IAED,gBAAgB;IACT,uBAAuB,CAAC,QAAkB,IAAS,CAAC;IAE3D,gBAAgB;IACT,uBAAuB,CAAC,OAAgB,EAAE,YAAqB,EAAE,eAAsC;QAC1G,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAE/B,MAAM,iBAAiB,GAAG,IAAI,CAAC,6BAA6B,CAAC,sBAAsB,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAElH,IAAI,iBAAiB,EAAE,CAAC;YACpB,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAEvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC;YACpD,OAAO,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE5C,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,MAAM,KAAK,GAAG,KAAK,CAAC;QAEpB,UAAU;QACV,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,aAAa,GAAG,QAAQ,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;YAE7D,MAAM,cAAc,GAAG,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACtD,MAAM,yBAAyB,GAC3B,cAAc,IAAI,cAAc,CAAC,QAAQ,IAAI,CAAE,QAAgB,CAAC,0BAA0B,IAAK,QAAgB,CAAC,0BAA0B,CAAC,CAAC;YAEhJ,IAAI,cAAc,IAAI,CAAC,aAAa,IAAI,yBAAyB,CAAC,EAAE,CAAC;gBACjE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAChC,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,gBAAgB,KAAK,CAAC,EAAE,CAAC;oBAC5F,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACnC,GAAG,GAAG,IAAI,CAAC;gBACf,CAAC;qBAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACnC,GAAG,GAAG,IAAI,CAAC;gBACf,CAAC;gBAED,IAAI,aAAa,EAAE,CAAC;oBAChB,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBAClC,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC/C,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;oBAC7B,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC7C,CAAC;YACL,CAAC;YAED,MAAM,cAAc,GAAI,QAAgB,CAAC,cAAc,CAAC;YACxD,IAAI,cAAc,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAChC,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,gBAAgB,KAAK,CAAC,EAAE,CAAC;oBAC5F,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACnC,GAAG,GAAG,IAAI,CAAC;gBACf,CAAC;qBAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACnC,GAAG,GAAG,IAAI,CAAC;gBACf,CAAC;YACL,CAAC;QACL,CAAC;QAED,WAAW;QACX,IAAI,eAAe,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,gBAAgB,KAAK,CAAC,EAAE,CAAC;gBAC7F,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACpC,GAAG,GAAG,IAAI,CAAC;YACf,CAAC;iBAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACpC,GAAG,GAAG,IAAI,CAAC;YACf,CAAC;YACD,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;QAED,SAAS;QACT,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,cAAc,IAAI,QAAQ,CAAC,gBAAgB,KAAK,QAAQ,CAAC,eAAe,EAAE,CAAC;YAC9J,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,GAAG,EAAE,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChC,CAAC;QAED,QAAQ;QACR,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACjD,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,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;YACxD,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAExE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,IAAI,QAAQ,IAAI,QAAQ,CAAC,yBAAyB,EAAE,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvF,CAAC;YAED,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC9B,SAAS,CAAC,sBAAsB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACnD,CAAC;QAED,gBAAgB;QAChB,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB;YAC/C,CAAC,CAAC,0CAA0C,CACtC,IAAI,CAAC,kBAAkB,EACvB,OAAO,EACP,OAAO,EACP,IAAI,EACJ,IAAI,EAAE,mBAAmB;YACzB,KAAK,EAAE,iBAAiB;YACxB,KAAK,EAAE,kBAAkB;YACzB,GAAG,EAAE,aAAa;YAClB,GAAG,EAAE,cAAc;YACnB,KAAK,CAAC,gBAAgB;aACzB;YACH,CAAC,CAAC,CAAC,CAAC;QAER,YAAY;QACZ,IAAI,YAAY,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAClC,0BAA0B,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,gBAAgB,EAAE,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC3C,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,2BAA2B,CAAC;QACpD,IAAI,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACvD,IAAI,YAAY,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YAC1D,CAAC;QACL,CAAC;QAED,aAAa;QACb,iCAAiC,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAElE,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEtC,qBAAqB;QACrB,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAE,CAAC;QAC9D,MAAM,aAAa,GAAG,WAAW,CAAC,OAAiB,CAAC;QACpD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG;gBACb,OAAO;gBACP,QAAQ;gBACR,gBAAgB;gBAChB,WAAW;gBACX,uBAAuB;gBACvB,kBAAkB;gBAClB,kBAAkB;gBAClB,eAAe;gBACf,gBAAgB;gBAChB,eAAe;gBACf,kBAAkB;gBAClB,wBAAwB;gBACxB,2BAA2B;gBAC3B,8BAA8B;gBAC9B,yCAAyC;gBACzC,0BAA0B;gBAC1B,6BAA6B;gBAC7B,eAAe;aAClB,CAAC;YAEF,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAE/B,WAAW,CAAC,SAAS,CACjB,IAAI,CAAC,OAAO,CAAC,YAAY,CACrB,mBAAmB,EACnB,OAAO,EACP,QAAQ,EACR,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,6BAA6B,CAAC,EACrH,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,EACT,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,EACpD,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,cAAc;gBACf,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,KAAK,IAAI,EAAE;oBACP,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACjC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC/B,CAAC,CACV,EACD,IAAI,CACP,CAAC;QACN,CAAC;QAED,MAAM,aAAa,GAAG,WAAW,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC;QAEpD,OAAO,aAAa,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,gBAAgB;IACT,eAAe,CAAC,OAAgB,EAAE,YAAqB,EAAE,eAAsC;QAClG,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAChF,CAAC;IAES,KAAK,CAAC,mBAAmB;QAC/B,IAAI,IAAI,CAAC,eAAe,gCAAwB,EAAE,CAAC;YAC/C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,yCAAyC,CAAC,EAAE,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC,CAAC;QAChI,CAAC;aAAM,CAAC;YACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,qCAAqC,CAAC,EAAE,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC,CAAC;QACxH,CAAC;QACD,mEAAmE;QACnE,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED,gBAAgB;IACT,qBAAqB;QACxB,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC;QAC1D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;YAChC,IAAI,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC1E,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,OAAO,GAAG,aAAa,CAAC,MAAO,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC;QACzD,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,YAAY;QACf,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACxC,CAAC;IAED;;;OAGG;IACI,OAAO;QACV,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE1C,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,iBAAiB,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QAEhD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAEhD,SAAS;YACT,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAEvB,OAAO;YACP,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,MAAO,CAAC,CAAC;YAElF,YAAY;YACZ,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YAErD,qCAAqC;YACrC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,MAAO,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,gBAAgB;QAChB,MAAM,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAEvC,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEpD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB;IACT,gBAAgB,CAAC,IAAkB;QACtC,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAClF,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,IAAkB;QAC7B,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,gBAAgB;IACT,qBAAqB;QACxB,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC;IAChD,CAAC;IAED;;;OAGG;IACI,YAAY;QACf,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACxC,CAAC;IAED,gBAAgB;IACT,iBAAiB,CAAC,KAAmB;QACxC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB;IACT,sBAAsB,CAAC,IAAkB,EAAE,QAAkB;QAChE,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,gBAAgB;IACT,cAAc,CAAC,IAAkB,EAAE,QAAkB;QACxD,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAES,cAAc,CAAC,OAAgB,EAAE,kBAA2B,KAAK;QACvE,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAChC,OAAO;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACrD,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACjD,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAEjC,aAAa,CAAC,6BAA6B,CAAC,qBAAqB,GAAG,KAAK,CAAC;QAE1E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO;QACX,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,CAAC;YAChD,OAAO;QACX,CAAC;QAED,UAAU;QACV,IAAI,eAAe,GAAG,QAAQ,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QACvE,MAAM,eAAe,GAAG,aAAa,CAAC,0BAA0B,EAAE,CAAC;QACnE,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YACtB,eAAe,GAAG,eAAe,KAAK,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC3J,CAAC;QAED,MAAM,OAAO,GAAG,eAAe,KAAK,QAAQ,CAAC,wBAAwB,CAAC;QAEtE,qBAAqB;QACrB,MAAM,KAAK,GAAG,aAAa,CAAC,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QACpF,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;YACzC,OAAO;QACX,CAAC;QAED,MAAM,0BAA0B,GAAG,KAAK,CAAC,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,gBAAgB,CAAC;QAEnH,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,CAAC;YACvC,OAAO,CAAC,WAAW,EAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC/C,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,eAAe,IAAI,SAAS,CAAC,CAAC;YAC7E,OAAO,CAAC,WAAW,EAAG,CAAC,gBAAgB,GAAG,KAAK,CAAC;QACpD,CAAC;aAAM,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,0BAA0B,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1G,MAAM,iBAAiB,GAAG,aAAa,CAAC,6BAA6B,CAAC,sBAAsB,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAE3H,IAAI,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5C,IAAI,CAAC,WAAW,IAAI,iBAAiB,EAAE,CAAC;gBACpC,WAAW,GAAG,iBAAiB,CAAC,eAAe,EAAE,CAAC;YACtD,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,OAAO;YACX,CAAC;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAO,CAAC;YAEnC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;YAEjJ,MAAM,iBAAiB,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;YACjD,MAAM,iBAAiB,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;YACjD,MAAM,oBAAoB,GAAG,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAE5D,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;iBAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;gBAClC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YAED,IAAI,QAAQ,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACpD,CAAC;YAED,IAAI,CAAC,0BAA0B,EAAE,CAAC;gBAC9B,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5D,CAAC;YAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACrB,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;gBAC/D,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC;gBAC1D,MAAM,CAAC,SAAS,CACZ,WAAW,EACX,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,CACxC,CAAC;YACN,CAAC;iBAAM,CAAC;gBACJ,iBAAiB,CAAC,cAAc,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,aAAqB,EAAE,OAAO,CAAC,CAAC;YACrG,CAAC;YAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACrB,MAAM,aAAa,GAAG,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;gBAEtE,MAAM,cAAc,GAAG,QAAQ,CAAC,mBAAmB,EAAE,CAAC;gBACtD,MAAM,yBAAyB,GAC3B,cAAc,IAAI,cAAc,CAAC,QAAQ,IAAI,CAAE,QAAgB,CAAC,0BAA0B,IAAK,QAAgB,CAAC,0BAA0B,CAAC,CAAC;gBAEhJ,IAAI,cAAc,IAAI,CAAC,aAAa,IAAI,yBAAyB,CAAC,EAAE,CAAC;oBACjE,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;oBACpD,MAAM,aAAa,GAAG,cAAc,CAAC,gBAAgB,EAAE,CAAC;oBAExD,IAAI,aAAa,EAAE,CAAC;wBAChB,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;oBACrD,CAAC;gBACL,CAAC;gBAED,MAAM,cAAc,GAAI,QAAgB,CAAC,cAAc,CAAC;gBACxD,IAAI,cAAc,EAAE,CAAC;oBACjB,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;oBACpD,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;oBAC1D,MAAM,aAAa,GAAG,cAAc,CAAC,gBAAgB,EAAE,CAAC;oBACxD,IAAI,aAAa,EAAE,CAAC;wBAChB,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;oBACrD,CAAC;gBACL,CAAC;gBAED,qBAAqB;gBACrB,IAAI,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,CAAC;oBACxC,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;oBAC5E,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACjG,CAAC;gBAED,QAAQ;gBACR,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;gBAE3C,gBAAgB;gBAChB,yBAAyB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;gBACjD,IAAI,aAAa,CAAC,kBAAkB,IAAI,aAAa,CAAC,kBAAkB,CAAC,wBAAwB,EAAE,CAAC;oBAChG,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACnD,CAAC;gBAED,0BAA0B;gBAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,2BAA2B,CAAC;gBACjE,IAAI,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;oBACrC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;gBACxD,CAAC;gBAED,aAAa;gBACb,IAAI,eAAe,EAAE,CAAC;oBAClB,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC5C,CAAC;gBAED,sBAAsB;gBACtB,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC;gBAEzE,cAAc;gBACd,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO;YACP,aAAa,CAAC,iBAAiB,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CACxI,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CACnC,CAAC;YAEF,IAAI,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;gBACzD,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,QAAQ,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,6CAA6C;YAC7C,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,gBAAgB;IACT,gBAAgB,CAAC,KAAmB;QACvC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,gBAAgB;IACT,QAAQ;QACX,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE1D,IAAI,EAAE,EAAE,CAAC;YACL,EAAE,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,OAAO;QACV,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACpE,IAAI,YAAY,EAAE,CAAC;YACf,YAAY,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;QAC1D,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/C,WAAW,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAE5B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAE/B,WAAW;QACX,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE,CAAC;QAC3C,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;IAC1C,CAAC;;AA/7BD;;;GAGG;AACW,yBAAS,GAAG,KAAK,AAAR,CAAS","sourcesContent":["import type { SmartArray } from \"../Misc/smartArray\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { EffectWrapperCreationOptions } from \"../Materials/effectRenderer\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { EffectFallbacks } from \"../Materials/effectFallbacks\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from \"../Materials/clipPlaneMaterialHelper\";\r\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from \"../Materials/materialHelper.functions\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport { ObjectRenderer } from \"../Rendering/objectRenderer\";\r\nimport type { Vector2 } from \"../Maths/math.vector\";\r\nimport { Engine } from \"../Engines/engine\";\r\n\r\n/**\r\n * Special Glow Blur post process only blurring the alpha channel\r\n * It enforces keeping the most luminous color in the color channel.\r\n * @internal\r\n */\r\nexport class ThinGlowBlurPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"glowBlurPostProcess\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"screenSize\", \"direction\", \"blurWidth\"];\r\n\r\n constructor(\r\n name: string,\r\n engine: Nullable<AbstractEngine> = null,\r\n public direction: Vector2,\r\n public kernel: number,\r\n options?: EffectWrapperCreationOptions\r\n ) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || Engine.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinGlowBlurPostProcess.FragmentUrl,\r\n uniforms: ThinGlowBlurPostProcess.Uniforms,\r\n });\r\n }\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/glowBlurPostProcess.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/glowBlurPostProcess.fragment\"));\r\n }\r\n\r\n super._gatherImports(useWebGPU, list);\r\n }\r\n\r\n public textureWidth: number = 0;\r\n\r\n public textureHeight: number = 0;\r\n\r\n public override bind() {\r\n super.bind();\r\n this._drawWrapper.effect!.setFloat2(\"screenSize\", this.textureWidth, this.textureHeight);\r\n this._drawWrapper.effect!.setVector2(\"direction\", this.direction);\r\n this._drawWrapper.effect!.setFloat(\"blurWidth\", this.kernel);\r\n }\r\n}\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 IThinEffectLayerOptions {\r\n /**\r\n * Multiplication factor apply to the canvas size to compute the render target size\r\n * used to generated the glowing objects (the smaller the faster). Default: 0.5\r\n */\r\n mainTextureRatio?: number;\r\n\r\n /**\r\n * Enforces a fixed size texture to ensure resize independent blur. Default: undefined\r\n */\r\n mainTextureFixedSize?: number;\r\n\r\n /**\r\n * The type of the main texture. Default: TEXTURETYPE_UNSIGNED_BYTE\r\n */\r\n mainTextureType?: number;\r\n\r\n /**\r\n * The format of the main texture. Default: TEXTUREFORMAT_RGBA\r\n */\r\n mainTextureFormat?: number;\r\n\r\n /**\r\n * Alpha blending mode used to apply the blur. Default depends of the implementation. Default: ALPHA_COMBINE\r\n */\r\n alphaBlendingMode?: number;\r\n\r\n /**\r\n * The camera attached to the layer. Default: null\r\n */\r\n camera?: Nullable<Camera>;\r\n\r\n /**\r\n * The rendering group to draw the layer in. Default: -1\r\n */\r\n renderingGroupId?: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinEffectLayer {\r\n private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n private _indexBuffer: Nullable<DataBuffer>;\r\n private _mergeDrawWrapper: DrawWrapper[];\r\n protected _dontCheckIfReady = false;\r\n\r\n protected _scene: Scene;\r\n protected _engine: AbstractEngine;\r\n /** @internal */\r\n public _options: Required<IThinEffectLayerOptions>;\r\n protected _objectRenderer: ObjectRenderer;\r\n /** @internal */\r\n public _shouldRender = true;\r\n /** @internal */\r\n public _emissiveTextureAndColor: { texture: Nullable<BaseTexture>; color: Color4 } = { texture: null, color: new Color4() };\r\n /** @internal */\r\n public _effectIntensity: { [meshUniqueId: number]: number } = {};\r\n /** @internal */\r\n public _postProcesses: EffectWrapper[] = [];\r\n\r\n /**\r\n * Force all the effect layers to compile to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n\r\n /**\r\n * The name of the layer\r\n */\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 public neutralColor: Color4 = new Color4();\r\n\r\n /**\r\n * Specifies whether the effect layer is enabled or not.\r\n */\r\n public isEnabled: boolean = true;\r\n\r\n /**\r\n * Gets/sets the camera attached to the layer.\r\n */\r\n public get camera(): Nullable<Camera> {\r\n return this._options.camera;\r\n }\r\n\r\n public set camera(camera: Nullable<Camera>) {\r\n this._options.camera = camera;\r\n }\r\n\r\n /**\r\n * Gets the rendering group id the layer should render in.\r\n */\r\n public get renderingGroupId(): number {\r\n return this._options.renderingGroupId;\r\n }\r\n public set renderingGroupId(renderingGroupId: number) {\r\n this._options.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 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<ThinEffectLayer>();\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 onBeforeRenderLayerObservable = new Observable<ThinEffectLayer>();\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<ThinEffectLayer>();\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<ThinEffectLayer>();\r\n\r\n /**\r\n * An event triggered when the layer is being blurred.\r\n */\r\n public onBeforeBlurObservable = new Observable<ThinEffectLayer>();\r\n\r\n /**\r\n * An event triggered when the layer has been blurred.\r\n */\r\n public onAfterBlurObservable = new Observable<ThinEffectLayer>();\r\n\r\n /**\r\n * Gets the object renderer used to render objects in the layer\r\n */\r\n public get objectRenderer() {\r\n return this._objectRenderer;\r\n }\r\n\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this material.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private _materialForRendering: { [id: string]: [AbstractMesh, Material] } = {};\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._objectRenderer.setMaterialForRendering(mesh, material);\r\n if (Array.isArray(mesh)) {\r\n for (let i = 0; i < mesh.length; ++i) {\r\n const currentMesh = mesh[i];\r\n if (!material) {\r\n delete this._materialForRendering[currentMesh.uniqueId];\r\n } else {\r\n this._materialForRendering[currentMesh.uniqueId] = [currentMesh, material];\r\n }\r\n }\r\n } else {\r\n if (!material) {\r\n delete this._materialForRendering[mesh.uniqueId];\r\n } else {\r\n this._materialForRendering[mesh.uniqueId] = [mesh, material];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the intensity of the effect for a specific mesh.\r\n * @param mesh The mesh to get the effect intensity for\r\n * @returns The intensity of the effect for the mesh\r\n */\r\n public getEffectIntensity(mesh: AbstractMesh) {\r\n return this._effectIntensity[mesh.uniqueId] ?? 1;\r\n }\r\n\r\n /**\r\n * Sets the intensity of the effect for a specific mesh.\r\n * @param mesh The mesh to set the effect intensity for\r\n * @param intensity The intensity of the effect for the mesh\r\n */\r\n public setEffectIntensity(mesh: AbstractMesh, intensity: number): void {\r\n this._effectIntensity[mesh.uniqueId] = intensity;\r\n }\r\n\r\n /**\r\n * Instantiates a new effect Layer\r\n * @param name The name of the layer\r\n * @param scene The scene to use the layer in\r\n * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.\r\n * @param _additionalImportShadersAsync Additional shaders to import when the layer is created\r\n */\r\n constructor(\r\n name: string,\r\n scene?: Scene,\r\n forceGLSL = false,\r\n dontCheckIfReady = false,\r\n private _additionalImportShadersAsync?: () => Promise<void>\r\n ) {\r\n this.name = name;\r\n this._scene = scene || <Scene>EngineStore.LastCreatedScene;\r\n this._dontCheckIfReady = dontCheckIfReady;\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n if (engine.isWebGPU && !forceGLSL && !ThinEffectLayer.ForceGLSL) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n this._engine = this._scene.getEngine();\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 /** @internal */\r\n public _shadersLoaded = false;\r\n\r\n /**\r\n * Get the effect name of the layer.\r\n * @returns The effect name\r\n */\r\n public getEffectName(): string {\r\n return \"\";\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 * @returns true if ready otherwise, false\r\n */\r\n public isReady(_subMesh: SubMesh, _useInstances: boolean): boolean {\r\n return true;\r\n }\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 needStencil(): boolean {\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public _createMergeEffect(): Effect {\r\n throw new Error(\"Effect Layer: no merge effect defined\");\r\n }\r\n\r\n /** @internal */\r\n public _createTextureAndPostProcesses(): void {}\r\n\r\n /** @internal */\r\n public bindTexturesForCompose: (effect: Effect) => void;\r\n\r\n /** @internal */\r\n public _internalCompose(_effect: Effect, _renderIndex: number): void {}\r\n\r\n /** @internal */\r\n public _setEmissiveTextureAndColor(_mesh: Mesh, _subMesh: SubMesh, _material: Material): void {}\r\n\r\n /** @internal */\r\n public _numInternalDraws(): number {\r\n return 1;\r\n }\r\n\r\n /** @internal */\r\n public _init(options: IThinEffectLayerOptions): void {\r\n // Adapt options\r\n this._options = {\r\n mainTextureRatio: 0.5,\r\n mainTextureFixedSize: 0,\r\n mainTextureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n mainTextureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n alphaBlendingMode: Constants.ALPHA_COMBINE,\r\n camera: null,\r\n renderingGroupId: -1,\r\n ...options,\r\n };\r\n\r\n this._createObjectRenderer();\r\n }\r\n\r\n private _generateIndexBuffer(): void {\r\n // Indices\r\n const 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 private _generateVertexBuffer(): void {\r\n // VBO\r\n const 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 const vertexBuffer = new VertexBuffer(this._engine, vertices, VertexBuffer.PositionKind, false, false, 2);\r\n this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer;\r\n }\r\n\r\n protected _createObjectRenderer(): void {\r\n this._objectRenderer = new ObjectRenderer(`ObjectRenderer for thin effect layer ${this.name}`, this._scene, {\r\n doNotChangeAspectRatio: true,\r\n });\r\n this._objectRenderer.activeCamera = this._options.camera;\r\n this._objectRenderer.renderParticles = false;\r\n this._objectRenderer.renderList = null;\r\n\r\n // Prevent package size in es6 (getBoundingBoxRenderer might not be present)\r\n const hasBoundingBoxRenderer = !!this._scene.getBoundingBoxRenderer;\r\n\r\n let boundingBoxRendererEnabled = false;\r\n if (hasBoundingBoxRenderer) {\r\n this._objectRenderer.onBeforeRenderObservable.add(() => {\r\n boundingBoxRendererEnabled = this._scene.getBoundingBoxRenderer().enabled;\r\n this._scene.getBoundingBoxRenderer().enabled = !this.disableBoundingBoxesFromEffectLayer && boundingBoxRendererEnabled;\r\n });\r\n\r\n this._objectRenderer.onAfterRenderObservable.add(() => {\r\n this._scene.getBoundingBoxRenderer().enabled = boundingBoxRendererEnabled;\r\n });\r\n }\r\n\r\n this._objectRenderer.customIsReadyFunction = (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => {\r\n if ((preWarm || refreshRate === 0) && mesh.subMeshes) {\r\n for (let i = 0; i < mesh.subMeshes.length; ++i) {\r\n const subMesh = mesh.subMeshes[i];\r\n const material = subMesh.getMaterial();\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n\r\n if (!material) {\r\n continue;\r\n }\r\n\r\n const batch = renderingMesh._getInstancesRenderList(subMesh._id, !!subMesh.getReplacementMesh());\r\n const hardwareInstancedRendering = batch.hardwareInstancedRendering[subMesh._id] || renderingMesh.hasThinInstances;\r\n\r\n this._setEmissiveTextureAndColor(renderingMesh, subMesh, material);\r\n\r\n if (!this._isSubMeshReady(subMesh, hardwareInstancedRendering, this._emissiveTextureAndColor.texture)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n // Custom render function\r\n this._objectRenderer.customRenderFunction = (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>\r\n ): void => {\r\n this.onBeforeRenderLayerObservable.notifyObservers(this);\r\n\r\n let index: number;\r\n\r\n const 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 const subMesh = transparentSubMeshes.data[index];\r\n const material = subMesh.getMaterial();\r\n if (material && material.needDepthPrePass) {\r\n const engine = material.getScene().getEngine();\r\n engine.setColorWrite(false);\r\n this._renderSubMesh(subMesh);\r\n engine.setColorWrite(true);\r\n }\r\n this._renderSubMesh(subMesh, true);\r\n }\r\n\r\n engine.setAlphaMode(previousAlphaMode);\r\n };\r\n }\r\n\r\n /** @internal */\r\n public _addCustomEffectDefines(_defines: string[]): void {}\r\n\r\n /** @internal */\r\n public _internalIsSubMeshReady(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 const 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 const defines: string[] = [];\r\n\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n let uv1 = false;\r\n let uv2 = false;\r\n const color = false;\r\n\r\n // Diffuse\r\n if (material) {\r\n const needAlphaTest = material.needAlphaTestingForMesh(mesh);\r\n\r\n const diffuseTexture = material.getAlphaTestTexture();\r\n const needAlphaBlendFromDiffuse =\r\n diffuseTexture && diffuseTexture.hasAlpha && ((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) && diffuseTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define DIFFUSEUV2\");\r\n uv2 = true;\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 const opacityTexture = (material as any).opacityTexture;\r\n if (opacityTexture) {\r\n defines.push(\"#define OPACITY\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind) && opacityTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define OPACITYUV2\");\r\n uv2 = true;\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) && emissiveTexture.coordinatesIndex === 1) {\r\n defines.push(\"#define EMISSIVEUV2\");\r\n uv2 = true;\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.useVertexColors && mesh.isVerticesDataPresent(VertexBuffer.ColorKind) && mesh.hasVertexAlpha && material.transparencyMode !== Material.MATERIAL_OPAQUE) {\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 const 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 const numMorphInfluencers = mesh.morphTargetManager\r\n ? PrepareDefinesAndAttributesForMorphTargets(\r\n mesh.morphTargetManager,\r\n defines,\r\n attribs,\r\n mesh,\r\n true, // usePositionMorph\r\n false, // useNormalMorph\r\n false, // useTangentMorph\r\n uv1, // useUVMorph\r\n uv2, // useUV2Morph\r\n color // useColorMorph\r\n )\r\n : 0;\r\n\r\n // Instances\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n PushAttributesForInstances(attribs);\r\n if (subMesh.getRenderingMesh().hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n }\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = mesh.bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (useInstances) {\r\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\r\n }\r\n }\r\n\r\n // ClipPlanes\r\n PrepareStringDefinesForClipPlanes(material, this._scene, defines);\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 const uniforms = [\r\n \"world\",\r\n \"mBones\",\r\n \"viewProjection\",\r\n \"glowColor\",\r\n \"morphTargetInfluences\",\r\n \"morphTargetCount\",\r\n \"boneTextureWidth\",\r\n \"diffuseMatrix\",\r\n \"emissiveMatrix\",\r\n \"opacityMatrix\",\r\n \"opacityIntensity\",\r\n \"morphTargetTextureInfo\",\r\n \"morphTargetTextureIndices\",\r\n \"bakedVertexAnimationSettings\",\r\n \"bakedVertexAnimationTextureSizeInverted\",\r\n \"bakedVertexAnimationTime\",\r\n \"bakedVertexAnimationTexture\",\r\n \"glowIntensity\",\r\n ];\r\n\r\n AddClipPlaneUniforms(uniforms);\r\n\r\n drawWrapper.setEffect(\r\n this._engine.createEffect(\r\n \"glowMapGeneration\",\r\n attribs,\r\n uniforms,\r\n [\"diffuseSampler\", \"emissiveSampler\", \"opacitySampler\", \"boneSampler\", \"morphTargets\", \"bakedVertexAnimationTexture\"],\r\n join,\r\n fallbacks,\r\n undefined,\r\n undefined,\r\n { maxSimultaneousMorphTargets: numMorphInfluencers },\r\n this._shaderLanguage,\r\n this._shadersLoaded\r\n ? undefined\r\n : async () => {\r\n await this._importShadersAsync();\r\n this._shadersLoaded = true;\r\n }\r\n ),\r\n join\r\n );\r\n }\r\n\r\n const effectIsReady = drawWrapper.effect!.isReady();\r\n\r\n return effectIsReady && (this._dontCheckIfReady || (!this._dontCheckIfReady && this.isLayerReady()));\r\n }\r\n\r\n /** @internal */\r\n public _isSubMeshReady(subMesh: SubMesh, useInstances: boolean, emissiveTexture: Nullable<BaseTexture>): boolean {\r\n return this._internalIsSubMeshReady(subMesh, useInstances, emissiveTexture);\r\n }\r\n\r\n protected async _importShadersAsync(): Promise<void> {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/glowMapGeneration.vertex\"), import(\"../ShadersWGSL/glowMapGeneration.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/glowMapGeneration.vertex\"), import(\"../Shaders/glowMapGeneration.fragment\")]);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._additionalImportShadersAsync?.();\r\n }\r\n\r\n /** @internal */\r\n public _internalIsLayerReady(): boolean {\r\n let isReady = true;\r\n\r\n for (let i = 0; i < this._postProcesses.length; i++) {\r\n isReady = this._postProcesses[i].isReady() && isReady;\r\n }\r\n\r\n const numDraws = this._numInternalDraws();\r\n\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 = currentEffect.effect!.isReady() && isReady;\r\n }\r\n\r\n return isReady;\r\n }\r\n\r\n /**\r\n * Checks if the layer is ready to be used.\r\n * @returns true if the layer is ready to be used\r\n */\r\n public isLayerReady(): boolean {\r\n return this._internalIsLayerReady();\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 * @returns true if the rendering was successful\r\n */\r\n public compose(): boolean {\r\n if (!this._dontCheckIfReady && !this.isLayerReady()) {\r\n return false;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n const numDraws = this._numInternalDraws();\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._options.alphaBlendingMode);\r\n\r\n // Blends the map on the main canvas.\r\n this._internalCompose(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 return true;\r\n }\r\n\r\n /** @internal */\r\n public _internalHasMesh(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 * 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 return this._internalHasMesh(mesh);\r\n }\r\n\r\n /** @internal */\r\n public _internalShouldRender(): boolean {\r\n return this.isEnabled && this._shouldRender;\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._internalShouldRender();\r\n }\r\n\r\n /** @internal */\r\n public _shouldRenderMesh(_mesh: AbstractMesh): boolean {\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _internalCanRenderMesh(mesh: AbstractMesh, material: Material): boolean {\r\n return !material.needAlphaBlendingForMesh(mesh);\r\n }\r\n\r\n /** @internal */\r\n public _canRenderMesh(mesh: AbstractMesh, material: Material): boolean {\r\n return this._internalCanRenderMesh(mesh, material);\r\n }\r\n\r\n protected _renderSubMesh(subMesh: SubMesh, enableAlphaMode: boolean = false): void {\r\n if (!this._internalShouldRender()) {\r\n return;\r\n }\r\n\r\n const material = subMesh.getMaterial();\r\n const ownerMesh = subMesh.getMesh();\r\n const replacementMesh = subMesh.getReplacementMesh();\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n const effectiveMesh = subMesh.getEffectiveMesh();\r\n const scene = this._scene;\r\n const 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 = material._getEffectiveOrientation(renderingMesh);\r\n const mainDeterminant = effectiveMesh._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\r\n // Managing instances\r\n const 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 const 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 subMesh.getMaterial()!._glowModeEnabled = true;\r\n renderingMesh.render(subMesh, enableAlphaMode, replacementMesh || undefined);\r\n subMesh.getMaterial()!._glowModeEnabled = false;\r\n } else if (this._isSubMeshReady(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 engine.setState(material.backFaceCulling, material.zOffset, undefined, reverse, material.cullBackFaces, material.stencil, material.zOffsetUnits);\r\n\r\n const currentDepthWrite = engine.getDepthWrite();\r\n const currentColorWrite = engine.getColorWrite();\r\n const currentDepthFunction = engine.getDepthFunction() || 0;\r\n\r\n if (material.disableDepthWrite) {\r\n engine.setDepthWrite(false);\r\n } else if (material.forceDepthWrite) {\r\n engine.setDepthWrite(true);\r\n }\r\n if (material.disableColorWrite) {\r\n engine.setColorWrite(false);\r\n }\r\n\r\n if (material.depthFunction !== 0) {\r\n engine.setDepthFunction(material.depthFunction);\r\n }\r\n\r\n if (!hardwareInstancedRendering) {\r\n renderingMesh._bind(subMesh, effect, material.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(\r\n \"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 } else {\r\n renderingMaterial.bindForSubMesh(effectiveMesh.getWorldMatrix(), effectiveMesh as Mesh, subMesh);\r\n }\r\n\r\n if (!renderingMaterial) {\r\n const needAlphaTest = material.needAlphaTestingForMesh(effectiveMesh);\r\n\r\n const diffuseTexture = material.getAlphaTestTexture();\r\n const needAlphaBlendFromDiffuse =\r\n diffuseTexture && diffuseTexture.hasAlpha && ((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 BindBonesParameters(renderingMesh, effect);\r\n\r\n // Morph targets\r\n BindMorphTargetParameters(renderingMesh, effect);\r\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\r\n renderingMesh.morphTargetManager._bind(effect);\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n bvaManager.bind(effect, hardwareInstancedRendering);\r\n }\r\n\r\n // Alpha mode\r\n if (enableAlphaMode) {\r\n engine.setAlphaMode(material.alphaMode);\r\n }\r\n\r\n // Intensity of effect\r\n effect.setFloat(\"glowIntensity\", this.getEffectIntensity(renderingMesh));\r\n\r\n // Clip planes\r\n BindClipPlane(effect, material, scene);\r\n }\r\n\r\n // Draw\r\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering, (isInstance, world) =>\r\n effect.setMatrix(\"world\", world)\r\n );\r\n\r\n if (material.disableDepthWrite || material.forceDepthWrite) {\r\n engine.setDepthWrite(currentDepthWrite);\r\n }\r\n if (material.disableColorWrite) {\r\n engine.setColorWrite(currentColorWrite);\r\n }\r\n if (material.depthFunction !== 0) {\r\n engine.setDepthFunction(currentDepthFunction);\r\n }\r\n } else {\r\n // Need to reset refresh rate of the main map\r\n this._objectRenderer.resetRefreshCounter();\r\n }\r\n\r\n this.onAfterRenderMeshToEffect.notifyObservers(ownerMesh);\r\n }\r\n\r\n /** @internal */\r\n public _useMeshMaterial(_mesh: AbstractMesh): boolean {\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n const 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 the effect layer and free resources.\r\n */\r\n public dispose(): void {\r\n const 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 this._objectRenderer.dispose();\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n this.onBeforeRenderLayerObservable.clear();\r\n this.onBeforeComposeObservable.clear();\r\n this.onBeforeRenderMeshToEffect.clear();\r\n this.onAfterRenderMeshToEffect.clear();\r\n this.onAfterComposeObservable.clear();\r\n }\r\n}\r\n"]}
|
|
@@ -137,6 +137,15 @@ export declare class ThinHighlightLayer extends ThinEffectLayer {
|
|
|
137
137
|
}>;
|
|
138
138
|
/** @internal */
|
|
139
139
|
_mainObjectRendererRenderPassId: number;
|
|
140
|
+
/**
|
|
141
|
+
* Gets the stencil reference value used for the meshes rendered by the highlight layer.
|
|
142
|
+
*/
|
|
143
|
+
get stencilReference(): number;
|
|
144
|
+
/**
|
|
145
|
+
* Number of stencil bits used by the highlight layer (default: 8).
|
|
146
|
+
* The layer uses the numStencilBits highest bits of the stencil buffer.
|
|
147
|
+
*/
|
|
148
|
+
numStencilBits: number;
|
|
140
149
|
/**
|
|
141
150
|
* Instantiates a new highlight Layer and references it to the scene..
|
|
142
151
|
* @param name The name of the layer
|
|
@@ -36,6 +36,12 @@ export class ThinHighlightLayer extends ThinEffectLayer {
|
|
|
36
36
|
get blurVerticalSize() {
|
|
37
37
|
return this._verticalBlurPostprocess.kernel;
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Gets the stencil reference value used for the meshes rendered by the highlight layer.
|
|
41
|
+
*/
|
|
42
|
+
get stencilReference() {
|
|
43
|
+
return this._instanceGlowingMeshStencilReference << (8 - this.numStencilBits);
|
|
44
|
+
}
|
|
39
45
|
/**
|
|
40
46
|
* Instantiates a new highlight Layer and references it to the scene..
|
|
41
47
|
* @param name The name of the layer
|
|
@@ -60,6 +66,11 @@ export class ThinHighlightLayer extends ThinEffectLayer {
|
|
|
60
66
|
this._excludedMeshes = {};
|
|
61
67
|
/** @internal */
|
|
62
68
|
this._mainObjectRendererRenderPassId = -1;
|
|
69
|
+
/**
|
|
70
|
+
* Number of stencil bits used by the highlight layer (default: 8).
|
|
71
|
+
* The layer uses the numStencilBits highest bits of the stencil buffer.
|
|
72
|
+
*/
|
|
73
|
+
this.numStencilBits = 8;
|
|
63
74
|
this.neutralColor = ThinHighlightLayer.NeutralColor;
|
|
64
75
|
// Adapt options
|
|
65
76
|
this._options = {
|
|
@@ -166,7 +177,8 @@ export class ThinHighlightLayer extends ThinEffectLayer {
|
|
|
166
177
|
// Draw order
|
|
167
178
|
engine.setStencilMask(0x00);
|
|
168
179
|
engine.setStencilBuffer(true);
|
|
169
|
-
engine.setStencilFunctionReference(this._instanceGlowingMeshStencilReference);
|
|
180
|
+
engine.setStencilFunctionReference(this._instanceGlowingMeshStencilReference << (8 - this.numStencilBits));
|
|
181
|
+
engine.setStencilFunctionMask(255 - ((1 << (8 - this.numStencilBits)) - 1));
|
|
170
182
|
// 2 passes inner outer
|
|
171
183
|
if (this.outerGlow && renderIndex === 0) {
|
|
172
184
|
// the outer glow is rendered the first time _internalRender is called, so when renderIndex == 0 (and only if outerGlow is enabled)
|
|
@@ -296,7 +308,9 @@ export class ThinHighlightLayer extends ThinEffectLayer {
|
|
|
296
308
|
this._defaultStencilReference(mesh);
|
|
297
309
|
}
|
|
298
310
|
else {
|
|
299
|
-
mesh.getScene()
|
|
311
|
+
mesh.getScene()
|
|
312
|
+
.getEngine()
|
|
313
|
+
.setStencilFunctionReference(this._instanceGlowingMeshStencilReference << (8 - this.numStencilBits));
|
|
300
314
|
}
|
|
301
315
|
}
|
|
302
316
|
}),
|
|
@@ -359,7 +373,9 @@ export class ThinHighlightLayer extends ThinEffectLayer {
|
|
|
359
373
|
}
|
|
360
374
|
}
|
|
361
375
|
_defaultStencilReference(mesh) {
|
|
362
|
-
mesh.getScene()
|
|
376
|
+
mesh.getScene()
|
|
377
|
+
.getEngine()
|
|
378
|
+
.setStencilFunctionReference(ThinHighlightLayer.NormalMeshStencilReference << (8 - this.numStencilBits));
|
|
363
379
|
}
|
|
364
380
|
_disposeMesh(mesh) {
|
|
365
381
|
this.removeMesh(mesh);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinHighlightLayer.js","sourceRoot":"","sources":["../../../../dev/core/src/Layers/thinHighlightLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer, Nullable, Scene, SubMesh, AbstractMesh, Mesh, Effect, IThinEffectLayerOptions, Color3, EffectWrapper } from \"../index\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { ThinPassPostProcess } from \"../PostProcesses/thinPassPostProcess\";\r\nimport { ThinEffectLayer, ThinGlowBlurPostProcess } from \"./thinEffectLayer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport { ThinBlurPostProcess } from \"../PostProcesses/thinBlurPostProcess\";\r\n\r\ninterface IBlurPostProcess extends EffectWrapper {\r\n kernel: number;\r\n}\r\n\r\n/**\r\n * Highlight layer options. This helps customizing the behaviour\r\n * of the highlight layer.\r\n */\r\nexport interface IThinHighlightLayerOptions extends IThinEffectLayerOptions {\r\n /**\r\n * Multiplication factor apply to the main texture size in the first step of the blur to reduce the size\r\n * of the picture to blur (the smaller the faster). Default: 0.5\r\n */\r\n blurTextureSizeRatio?: number;\r\n\r\n /**\r\n * How big in texel of the blur texture is the vertical blur. Default: 1\r\n */\r\n blurVerticalSize?: number;\r\n\r\n /**\r\n * How big in texel of the blur texture is the horizontal blur. Default: 1\r\n */\r\n blurHorizontalSize?: number;\r\n\r\n /**\r\n * Should we display highlight as a solid stroke? Default: false\r\n */\r\n isStroke?: boolean;\r\n\r\n /**\r\n * Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n */\r\n forceGLSL?: boolean;\r\n}\r\n\r\n/**\r\n * Storage interface grouping all the information required for glowing a mesh.\r\n */\r\ninterface IHighlightLayerMesh {\r\n /**\r\n * The glowy mesh\r\n */\r\n mesh: Mesh;\r\n /**\r\n * The color of the glow\r\n */\r\n color: Color3;\r\n /**\r\n * The mesh render callback use to insert stencil information\r\n */\r\n observerHighlight: Nullable<Observer<Mesh>>;\r\n /**\r\n * The mesh render callback use to come to the default behavior\r\n */\r\n observerDefault: Nullable<Observer<Mesh>>;\r\n /**\r\n * If it exists, the emissive color of the material will be used to generate the glow.\r\n * Else it falls back to the current color.\r\n */\r\n glowEmissiveOnly: boolean;\r\n}\r\n\r\n/**\r\n * Storage interface grouping all the information required for an excluded mesh.\r\n */\r\ninterface IHighlightLayerExcludedMesh {\r\n /**\r\n * The glowy mesh\r\n */\r\n mesh: Mesh;\r\n /**\r\n * The mesh render callback use to prevent stencil use\r\n */\r\n beforeBind: Nullable<Observer<Mesh>>;\r\n /**\r\n * The mesh render callback use to restore previous stencil use\r\n */\r\n afterRender: Nullable<Observer<Mesh>>;\r\n /**\r\n * Current stencil state of the engine\r\n */\r\n stencilState: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinHighlightLayer extends ThinEffectLayer {\r\n /**\r\n * Effect Name of the highlight layer.\r\n */\r\n public static readonly EffectName = \"HighlightLayer\";\r\n\r\n /**\r\n * The neutral color used during the preparation of the glow effect.\r\n * This is black by default as the blend operation is a blend operation.\r\n */\r\n public static NeutralColor: Color4 = new Color4(0, 0, 0, 0);\r\n\r\n /**\r\n * Stencil value used for glowing meshes.\r\n */\r\n public static GlowingMeshStencilReference = 0x02;\r\n\r\n /**\r\n * Stencil value used for the other meshes in the scene.\r\n */\r\n public static NormalMeshStencilReference = 0x01;\r\n\r\n /**\r\n * Specifies whether or not the inner glow is ACTIVE in the layer.\r\n */\r\n public innerGlow: boolean = true;\r\n\r\n /**\r\n * Specifies whether or not the outer glow is ACTIVE in the layer.\r\n */\r\n public outerGlow: boolean = true;\r\n\r\n /**\r\n * Specifies the horizontal size of the blur.\r\n */\r\n public set blurHorizontalSize(value: number) {\r\n this._horizontalBlurPostprocess.kernel = value;\r\n this._options.blurHorizontalSize = value;\r\n }\r\n\r\n /**\r\n * Specifies the vertical size of the blur.\r\n */\r\n public set blurVerticalSize(value: number) {\r\n this._verticalBlurPostprocess.kernel = value;\r\n this._options.blurVerticalSize = value;\r\n }\r\n\r\n /**\r\n * Gets the horizontal size of the blur.\r\n */\r\n public get blurHorizontalSize(): number {\r\n return this._horizontalBlurPostprocess.kernel;\r\n }\r\n\r\n /**\r\n * Gets the vertical size of the blur.\r\n */\r\n public get blurVerticalSize(): number {\r\n return this._verticalBlurPostprocess.kernel;\r\n }\r\n\r\n private _instanceGlowingMeshStencilReference = ThinHighlightLayer.GlowingMeshStencilReference++;\r\n\r\n /** @internal */\r\n public override _options: Required<IThinHighlightLayerOptions>;\r\n\r\n private _downSamplePostprocess: ThinPassPostProcess;\r\n private _horizontalBlurPostprocess: IBlurPostProcess;\r\n private _verticalBlurPostprocess: IBlurPostProcess;\r\n\r\n /** @internal */\r\n public _meshes: Nullable<{ [id: string]: Nullable<IHighlightLayerMesh> }> = {};\r\n /** @internal */\r\n public _excludedMeshes: Nullable<{ [id: string]: Nullable<IHighlightLayerExcludedMesh> }> = {};\r\n\r\n /** @internal */\r\n public _mainObjectRendererRenderPassId = -1;\r\n\r\n /**\r\n * Instantiates a new highlight Layer and references it to the scene..\r\n * @param name The name of the layer\r\n * @param scene The scene to use the layer in\r\n * @param options Sets of none mandatory options to use with the layer (see IHighlightLayerOptions for more information)\r\n * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.\r\n */\r\n constructor(name: string, scene?: Scene, options?: Partial<IThinHighlightLayerOptions>, dontCheckIfReady = false) {\r\n super(name, scene, options !== undefined ? !!options.forceGLSL : false);\r\n\r\n this.neutralColor = ThinHighlightLayer.NeutralColor;\r\n\r\n // Adapt options\r\n this._options = {\r\n mainTextureRatio: 0.5,\r\n blurTextureSizeRatio: 0.5,\r\n mainTextureFixedSize: 0,\r\n blurHorizontalSize: 1.0,\r\n blurVerticalSize: 1.0,\r\n alphaBlendingMode: Constants.ALPHA_COMBINE,\r\n camera: null,\r\n renderingGroupId: -1,\r\n forceGLSL: false,\r\n mainTextureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n mainTextureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n isStroke: false,\r\n ...options,\r\n };\r\n\r\n // Initialize the layer\r\n this._init(this._options);\r\n\r\n // Do not render as long as no meshes have been added\r\n this._shouldRender = false;\r\n\r\n if (dontCheckIfReady) {\r\n // When dontCheckIfReady is true, we are in the new ThinXXX layer mode, so we must call _createTextureAndPostProcesses ourselves (it is called by EffectLayer otherwise)\r\n this._createTextureAndPostProcesses();\r\n }\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 \"HighlightLayer\";\r\n }\r\n\r\n protected override async _importShadersAsync() {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([\r\n import(\"../ShadersWGSL/glowMapMerge.fragment\"),\r\n import(\"../ShadersWGSL/glowMapMerge.vertex\"),\r\n import(\"../ShadersWGSL/glowBlurPostProcess.fragment\"),\r\n ]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/glowMapMerge.fragment\"), import(\"../Shaders/glowMapMerge.vertex\"), import(\"../Shaders/glowBlurPostProcess.fragment\")]);\r\n }\r\n\r\n await super._importShadersAsync();\r\n }\r\n\r\n public override getEffectName(): string {\r\n return ThinHighlightLayer.EffectName;\r\n }\r\n\r\n public override _numInternalDraws(): number {\r\n return 2; // we need two rendering, one for the inner glow and the other for the outer glow\r\n }\r\n\r\n public override _createMergeEffect(): Effect {\r\n return this._engine.createEffect(\r\n \"glowMapMerge\",\r\n [VertexBuffer.PositionKind],\r\n [\"offset\"],\r\n [\"textureSampler\"],\r\n this._options.isStroke ? \"#define STROKE \\n\" : undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage,\r\n this._shadersLoaded\r\n ? undefined\r\n : async () => {\r\n await this._importShadersAsync();\r\n this._shadersLoaded = true;\r\n }\r\n );\r\n }\r\n\r\n public override _createTextureAndPostProcesses(): void {\r\n if (this._options.alphaBlendingMode === Constants.ALPHA_COMBINE) {\r\n this._downSamplePostprocess = new ThinPassPostProcess(\"HighlightLayerPPP\", this._scene.getEngine());\r\n this._horizontalBlurPostprocess = new ThinGlowBlurPostProcess(\"HighlightLayerHBP\", this._scene.getEngine(), new Vector2(1.0, 0), this._options.blurHorizontalSize);\r\n this._verticalBlurPostprocess = new ThinGlowBlurPostProcess(\"HighlightLayerVBP\", this._scene.getEngine(), new Vector2(0, 1.0), this._options.blurVerticalSize);\r\n this._postProcesses = [this._downSamplePostprocess, this._horizontalBlurPostprocess, this._verticalBlurPostprocess];\r\n } else {\r\n this._horizontalBlurPostprocess = new ThinBlurPostProcess(\"HighlightLayerHBP\", this._scene.getEngine(), new Vector2(1.0, 0), this._options.blurHorizontalSize / 2);\r\n this._verticalBlurPostprocess = new ThinBlurPostProcess(\"HighlightLayerVBP\", this._scene.getEngine(), new Vector2(0, 1.0), this._options.blurVerticalSize / 2);\r\n this._postProcesses = [this._horizontalBlurPostprocess, this._verticalBlurPostprocess];\r\n }\r\n }\r\n\r\n public override needStencil(): boolean {\r\n return true;\r\n }\r\n\r\n public override isReady(subMesh: SubMesh, useInstances: boolean): boolean {\r\n const material = subMesh.getMaterial();\r\n const mesh = subMesh.getRenderingMesh();\r\n\r\n if (!material || !mesh || !this._meshes) {\r\n return false;\r\n }\r\n\r\n let emissiveTexture: Nullable<any> = null;\r\n const highlightLayerMesh = this._meshes[mesh.uniqueId];\r\n\r\n if (highlightLayerMesh && highlightLayerMesh.glowEmissiveOnly && material) {\r\n emissiveTexture = (<any>material).emissiveTexture;\r\n }\r\n return super._isSubMeshReady(subMesh, useInstances, emissiveTexture);\r\n }\r\n\r\n public override _canRenderMesh(_mesh: AbstractMesh, _material: Material): boolean {\r\n // all meshes can be rendered in the highlight layer, even transparent ones\r\n return true;\r\n }\r\n\r\n public override _internalCompose(effect: Effect, renderIndex: number): void {\r\n // Texture\r\n this.bindTexturesForCompose(effect);\r\n\r\n // Cache\r\n const engine = this._engine;\r\n engine.cacheStencilState();\r\n\r\n // Stencil operations\r\n engine.setStencilOperationPass(Constants.REPLACE);\r\n engine.setStencilOperationFail(Constants.KEEP);\r\n engine.setStencilOperationDepthFail(Constants.KEEP);\r\n\r\n // Draw order\r\n engine.setStencilMask(0x00);\r\n engine.setStencilBuffer(true);\r\n engine.setStencilFunctionReference(this._instanceGlowingMeshStencilReference);\r\n\r\n // 2 passes inner outer\r\n if (this.outerGlow && renderIndex === 0) {\r\n // the outer glow is rendered the first time _internalRender is called, so when renderIndex == 0 (and only if outerGlow is enabled)\r\n effect.setFloat(\"offset\", 0);\r\n engine.setStencilFunction(Constants.NOTEQUAL);\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n if (this.innerGlow && renderIndex === 1) {\r\n // the inner glow is rendered the second time _internalRender is called, so when renderIndex == 1 (and only if innerGlow is enabled)\r\n effect.setFloat(\"offset\", 1);\r\n engine.setStencilFunction(Constants.EQUAL);\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n\r\n // Restore Cache\r\n engine.restoreStencilState();\r\n }\r\n\r\n public override _setEmissiveTextureAndColor(mesh: Mesh, _subMesh: SubMesh, material: Material): void {\r\n const highlightLayerMesh = this._meshes![mesh.uniqueId];\r\n if (highlightLayerMesh) {\r\n this._emissiveTextureAndColor.color.set(highlightLayerMesh.color.r, highlightLayerMesh.color.g, highlightLayerMesh.color.b, 1.0);\r\n } else {\r\n this._emissiveTextureAndColor.color.set(this.neutralColor.r, this.neutralColor.g, this.neutralColor.b, this.neutralColor.a);\r\n }\r\n\r\n if (highlightLayerMesh && highlightLayerMesh.glowEmissiveOnly && material) {\r\n this._emissiveTextureAndColor.texture = (<any>material).emissiveTexture;\r\n this._emissiveTextureAndColor.color.set(1.0, 1.0, 1.0, 1.0);\r\n } else {\r\n this._emissiveTextureAndColor.texture = null;\r\n }\r\n }\r\n\r\n public override shouldRender(): boolean {\r\n return this._meshes && super.shouldRender() ? true : false;\r\n }\r\n\r\n public override _shouldRenderMesh(mesh: Mesh): boolean {\r\n if (this._excludedMeshes && this._excludedMeshes[mesh.uniqueId]) {\r\n return false;\r\n }\r\n\r\n return super.hasMesh(mesh);\r\n }\r\n\r\n public override _addCustomEffectDefines(defines: string[]): void {\r\n defines.push(\"#define HIGHLIGHT\");\r\n }\r\n\r\n /**\r\n * Add a mesh in the exclusion list to prevent it to impact or being impacted by the highlight layer.\r\n * @param mesh The mesh to exclude from the highlight layer\r\n */\r\n public addExcludedMesh(mesh: Mesh) {\r\n if (!this._excludedMeshes) {\r\n return;\r\n }\r\n\r\n const meshExcluded = this._excludedMeshes[mesh.uniqueId];\r\n if (!meshExcluded) {\r\n const obj: IHighlightLayerExcludedMesh = {\r\n mesh: mesh,\r\n beforeBind: null,\r\n afterRender: null,\r\n stencilState: false,\r\n };\r\n\r\n obj.beforeBind = mesh.onBeforeBindObservable.add((mesh: Mesh) => {\r\n if (this._mainObjectRendererRenderPassId !== -1 && this._mainObjectRendererRenderPassId !== this._engine.currentRenderPassId) {\r\n return;\r\n }\r\n obj.stencilState = mesh.getEngine().getStencilBuffer();\r\n mesh.getEngine().setStencilBuffer(false);\r\n });\r\n\r\n obj.afterRender = mesh.onAfterRenderObservable.add((mesh: Mesh) => {\r\n if (this._mainObjectRendererRenderPassId !== -1 && this._mainObjectRendererRenderPassId !== this._engine.currentRenderPassId) {\r\n return;\r\n }\r\n mesh.getEngine().setStencilBuffer(obj.stencilState);\r\n });\r\n\r\n this._excludedMeshes[mesh.uniqueId] = obj;\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the exclusion list to let it impact or being impacted by the highlight layer.\r\n * @param mesh The mesh to highlight\r\n */\r\n public removeExcludedMesh(mesh: Mesh) {\r\n if (!this._excludedMeshes) {\r\n return;\r\n }\r\n\r\n const meshExcluded = this._excludedMeshes[mesh.uniqueId];\r\n if (meshExcluded) {\r\n if (meshExcluded.beforeBind) {\r\n mesh.onBeforeBindObservable.remove(meshExcluded.beforeBind);\r\n }\r\n\r\n if (meshExcluded.afterRender) {\r\n mesh.onAfterRenderObservable.remove(meshExcluded.afterRender);\r\n }\r\n }\r\n\r\n this._excludedMeshes[mesh.uniqueId] = null;\r\n }\r\n\r\n public override hasMesh(mesh: AbstractMesh): boolean {\r\n if (!this._meshes || !super.hasMesh(mesh)) {\r\n return false;\r\n }\r\n\r\n return !!this._meshes[mesh.uniqueId];\r\n }\r\n\r\n /**\r\n * Add a mesh in the highlight layer in order to make it glow with the chosen color.\r\n * @param mesh The mesh to highlight\r\n * @param color The color of the highlight\r\n * @param glowEmissiveOnly Extract the glow from the emissive texture\r\n */\r\n public addMesh(mesh: Mesh, color: Color3, glowEmissiveOnly = false) {\r\n if (!this._meshes) {\r\n return;\r\n }\r\n\r\n const meshHighlight = this._meshes[mesh.uniqueId];\r\n if (meshHighlight) {\r\n meshHighlight.color = color;\r\n } else {\r\n this._meshes[mesh.uniqueId] = {\r\n mesh: mesh,\r\n color: color,\r\n // Lambda required for capture due to Observable this context\r\n observerHighlight: mesh.onBeforeBindObservable.add((mesh: Mesh) => {\r\n if (this._mainObjectRendererRenderPassId !== -1 && this._mainObjectRendererRenderPassId !== this._engine.currentRenderPassId) {\r\n return;\r\n }\r\n if (this.isEnabled) {\r\n if (this._excludedMeshes && this._excludedMeshes[mesh.uniqueId]) {\r\n this._defaultStencilReference(mesh);\r\n } else {\r\n mesh.getScene().getEngine().setStencilFunctionReference(this._instanceGlowingMeshStencilReference);\r\n }\r\n }\r\n }),\r\n observerDefault: mesh.onAfterRenderObservable.add((mesh: Mesh) => {\r\n if (this._mainObjectRendererRenderPassId !== -1 && this._mainObjectRendererRenderPassId !== this._engine.currentRenderPassId) {\r\n return;\r\n }\r\n if (this.isEnabled) {\r\n this._defaultStencilReference(mesh);\r\n }\r\n }),\r\n glowEmissiveOnly: glowEmissiveOnly,\r\n };\r\n\r\n mesh.onDisposeObservable.add(() => {\r\n this._disposeMesh(mesh);\r\n });\r\n }\r\n\r\n this._shouldRender = true;\r\n }\r\n\r\n /**\r\n * Remove a mesh from the highlight layer in order to make it stop glowing.\r\n * @param mesh The mesh to highlight\r\n */\r\n public removeMesh(mesh: Mesh) {\r\n if (!this._meshes) {\r\n return;\r\n }\r\n\r\n const meshHighlight = this._meshes[mesh.uniqueId];\r\n if (meshHighlight) {\r\n if (meshHighlight.observerHighlight) {\r\n mesh.onBeforeBindObservable.remove(meshHighlight.observerHighlight);\r\n }\r\n\r\n if (meshHighlight.observerDefault) {\r\n mesh.onAfterRenderObservable.remove(meshHighlight.observerDefault);\r\n }\r\n delete this._meshes[mesh.uniqueId];\r\n }\r\n\r\n this._shouldRender = false;\r\n for (const meshHighlightToCheck in this._meshes) {\r\n if (this._meshes[meshHighlightToCheck]) {\r\n this._shouldRender = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove all the meshes currently referenced in the highlight layer\r\n */\r\n public removeAllMeshes(): void {\r\n if (!this._meshes) {\r\n return;\r\n }\r\n\r\n for (const uniqueId in this._meshes) {\r\n if (Object.prototype.hasOwnProperty.call(this._meshes, uniqueId)) {\r\n const mesh = this._meshes[uniqueId];\r\n if (mesh) {\r\n this.removeMesh(mesh.mesh);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _defaultStencilReference(mesh: Mesh) {\r\n mesh.getScene().getEngine().setStencilFunctionReference(ThinHighlightLayer.NormalMeshStencilReference);\r\n }\r\n\r\n public _disposeMesh(mesh: Mesh): void {\r\n this.removeMesh(mesh);\r\n this.removeExcludedMesh(mesh);\r\n }\r\n\r\n public override dispose(): void {\r\n if (this._meshes) {\r\n // Clean mesh references\r\n for (const id in this._meshes) {\r\n const meshHighlight = this._meshes[id];\r\n if (meshHighlight && meshHighlight.mesh) {\r\n if (meshHighlight.observerHighlight) {\r\n meshHighlight.mesh.onBeforeBindObservable.remove(meshHighlight.observerHighlight);\r\n }\r\n\r\n if (meshHighlight.observerDefault) {\r\n meshHighlight.mesh.onAfterRenderObservable.remove(meshHighlight.observerDefault);\r\n }\r\n }\r\n }\r\n this._meshes = null;\r\n }\r\n\r\n if (this._excludedMeshes) {\r\n for (const id in this._excludedMeshes) {\r\n const meshHighlight = this._excludedMeshes[id];\r\n if (meshHighlight) {\r\n if (meshHighlight.beforeBind) {\r\n meshHighlight.mesh.onBeforeBindObservable.remove(meshHighlight.beforeBind);\r\n }\r\n\r\n if (meshHighlight.afterRender) {\r\n meshHighlight.mesh.onAfterRenderObservable.remove(meshHighlight.afterRender);\r\n }\r\n }\r\n }\r\n this._excludedMeshes = null;\r\n }\r\n\r\n super.dispose();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"thinHighlightLayer.js","sourceRoot":"","sources":["../../../../dev/core/src/Layers/thinHighlightLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer, Nullable, Scene, SubMesh, AbstractMesh, Mesh, Effect, IThinEffectLayerOptions, Color3, EffectWrapper } from \"../index\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { ThinPassPostProcess } from \"../PostProcesses/thinPassPostProcess\";\r\nimport { ThinEffectLayer, ThinGlowBlurPostProcess } from \"./thinEffectLayer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport { ThinBlurPostProcess } from \"../PostProcesses/thinBlurPostProcess\";\r\n\r\ninterface IBlurPostProcess extends EffectWrapper {\r\n kernel: number;\r\n}\r\n\r\n/**\r\n * Highlight layer options. This helps customizing the behaviour\r\n * of the highlight layer.\r\n */\r\nexport interface IThinHighlightLayerOptions extends IThinEffectLayerOptions {\r\n /**\r\n * Multiplication factor apply to the main texture size in the first step of the blur to reduce the size\r\n * of the picture to blur (the smaller the faster). Default: 0.5\r\n */\r\n blurTextureSizeRatio?: number;\r\n\r\n /**\r\n * How big in texel of the blur texture is the vertical blur. Default: 1\r\n */\r\n blurVerticalSize?: number;\r\n\r\n /**\r\n * How big in texel of the blur texture is the horizontal blur. Default: 1\r\n */\r\n blurHorizontalSize?: number;\r\n\r\n /**\r\n * Should we display highlight as a solid stroke? Default: false\r\n */\r\n isStroke?: boolean;\r\n\r\n /**\r\n * Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n */\r\n forceGLSL?: boolean;\r\n}\r\n\r\n/**\r\n * Storage interface grouping all the information required for glowing a mesh.\r\n */\r\ninterface IHighlightLayerMesh {\r\n /**\r\n * The glowy mesh\r\n */\r\n mesh: Mesh;\r\n /**\r\n * The color of the glow\r\n */\r\n color: Color3;\r\n /**\r\n * The mesh render callback use to insert stencil information\r\n */\r\n observerHighlight: Nullable<Observer<Mesh>>;\r\n /**\r\n * The mesh render callback use to come to the default behavior\r\n */\r\n observerDefault: Nullable<Observer<Mesh>>;\r\n /**\r\n * If it exists, the emissive color of the material will be used to generate the glow.\r\n * Else it falls back to the current color.\r\n */\r\n glowEmissiveOnly: boolean;\r\n}\r\n\r\n/**\r\n * Storage interface grouping all the information required for an excluded mesh.\r\n */\r\ninterface IHighlightLayerExcludedMesh {\r\n /**\r\n * The glowy mesh\r\n */\r\n mesh: Mesh;\r\n /**\r\n * The mesh render callback use to prevent stencil use\r\n */\r\n beforeBind: Nullable<Observer<Mesh>>;\r\n /**\r\n * The mesh render callback use to restore previous stencil use\r\n */\r\n afterRender: Nullable<Observer<Mesh>>;\r\n /**\r\n * Current stencil state of the engine\r\n */\r\n stencilState: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinHighlightLayer extends ThinEffectLayer {\r\n /**\r\n * Effect Name of the highlight layer.\r\n */\r\n public static readonly EffectName = \"HighlightLayer\";\r\n\r\n /**\r\n * The neutral color used during the preparation of the glow effect.\r\n * This is black by default as the blend operation is a blend operation.\r\n */\r\n public static NeutralColor: Color4 = new Color4(0, 0, 0, 0);\r\n\r\n /**\r\n * Stencil value used for glowing meshes.\r\n */\r\n public static GlowingMeshStencilReference = 0x02;\r\n\r\n /**\r\n * Stencil value used for the other meshes in the scene.\r\n */\r\n public static NormalMeshStencilReference = 0x01;\r\n\r\n /**\r\n * Specifies whether or not the inner glow is ACTIVE in the layer.\r\n */\r\n public innerGlow: boolean = true;\r\n\r\n /**\r\n * Specifies whether or not the outer glow is ACTIVE in the layer.\r\n */\r\n public outerGlow: boolean = true;\r\n\r\n /**\r\n * Specifies the horizontal size of the blur.\r\n */\r\n public set blurHorizontalSize(value: number) {\r\n this._horizontalBlurPostprocess.kernel = value;\r\n this._options.blurHorizontalSize = value;\r\n }\r\n\r\n /**\r\n * Specifies the vertical size of the blur.\r\n */\r\n public set blurVerticalSize(value: number) {\r\n this._verticalBlurPostprocess.kernel = value;\r\n this._options.blurVerticalSize = value;\r\n }\r\n\r\n /**\r\n * Gets the horizontal size of the blur.\r\n */\r\n public get blurHorizontalSize(): number {\r\n return this._horizontalBlurPostprocess.kernel;\r\n }\r\n\r\n /**\r\n * Gets the vertical size of the blur.\r\n */\r\n public get blurVerticalSize(): number {\r\n return this._verticalBlurPostprocess.kernel;\r\n }\r\n\r\n private _instanceGlowingMeshStencilReference = ThinHighlightLayer.GlowingMeshStencilReference++;\r\n\r\n /** @internal */\r\n public override _options: Required<IThinHighlightLayerOptions>;\r\n\r\n private _downSamplePostprocess: ThinPassPostProcess;\r\n private _horizontalBlurPostprocess: IBlurPostProcess;\r\n private _verticalBlurPostprocess: IBlurPostProcess;\r\n\r\n /** @internal */\r\n public _meshes: Nullable<{ [id: string]: Nullable<IHighlightLayerMesh> }> = {};\r\n /** @internal */\r\n public _excludedMeshes: Nullable<{ [id: string]: Nullable<IHighlightLayerExcludedMesh> }> = {};\r\n\r\n /** @internal */\r\n public _mainObjectRendererRenderPassId = -1;\r\n\r\n /**\r\n * Gets the stencil reference value used for the meshes rendered by the highlight layer.\r\n */\r\n public get stencilReference(): number {\r\n return this._instanceGlowingMeshStencilReference << (8 - this.numStencilBits);\r\n }\r\n\r\n /**\r\n * Number of stencil bits used by the highlight layer (default: 8).\r\n * The layer uses the numStencilBits highest bits of the stencil buffer.\r\n */\r\n public numStencilBits = 8;\r\n\r\n /**\r\n * Instantiates a new highlight Layer and references it to the scene..\r\n * @param name The name of the layer\r\n * @param scene The scene to use the layer in\r\n * @param options Sets of none mandatory options to use with the layer (see IHighlightLayerOptions for more information)\r\n * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.\r\n */\r\n constructor(name: string, scene?: Scene, options?: Partial<IThinHighlightLayerOptions>, dontCheckIfReady = false) {\r\n super(name, scene, options !== undefined ? !!options.forceGLSL : false);\r\n\r\n this.neutralColor = ThinHighlightLayer.NeutralColor;\r\n\r\n // Adapt options\r\n this._options = {\r\n mainTextureRatio: 0.5,\r\n blurTextureSizeRatio: 0.5,\r\n mainTextureFixedSize: 0,\r\n blurHorizontalSize: 1.0,\r\n blurVerticalSize: 1.0,\r\n alphaBlendingMode: Constants.ALPHA_COMBINE,\r\n camera: null,\r\n renderingGroupId: -1,\r\n forceGLSL: false,\r\n mainTextureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n mainTextureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n isStroke: false,\r\n ...options,\r\n };\r\n\r\n // Initialize the layer\r\n this._init(this._options);\r\n\r\n // Do not render as long as no meshes have been added\r\n this._shouldRender = false;\r\n\r\n if (dontCheckIfReady) {\r\n // When dontCheckIfReady is true, we are in the new ThinXXX layer mode, so we must call _createTextureAndPostProcesses ourselves (it is called by EffectLayer otherwise)\r\n this._createTextureAndPostProcesses();\r\n }\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 \"HighlightLayer\";\r\n }\r\n\r\n protected override async _importShadersAsync() {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([\r\n import(\"../ShadersWGSL/glowMapMerge.fragment\"),\r\n import(\"../ShadersWGSL/glowMapMerge.vertex\"),\r\n import(\"../ShadersWGSL/glowBlurPostProcess.fragment\"),\r\n ]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/glowMapMerge.fragment\"), import(\"../Shaders/glowMapMerge.vertex\"), import(\"../Shaders/glowBlurPostProcess.fragment\")]);\r\n }\r\n\r\n await super._importShadersAsync();\r\n }\r\n\r\n public override getEffectName(): string {\r\n return ThinHighlightLayer.EffectName;\r\n }\r\n\r\n public override _numInternalDraws(): number {\r\n return 2; // we need two rendering, one for the inner glow and the other for the outer glow\r\n }\r\n\r\n public override _createMergeEffect(): Effect {\r\n return this._engine.createEffect(\r\n \"glowMapMerge\",\r\n [VertexBuffer.PositionKind],\r\n [\"offset\"],\r\n [\"textureSampler\"],\r\n this._options.isStroke ? \"#define STROKE \\n\" : undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage,\r\n this._shadersLoaded\r\n ? undefined\r\n : async () => {\r\n await this._importShadersAsync();\r\n this._shadersLoaded = true;\r\n }\r\n );\r\n }\r\n\r\n public override _createTextureAndPostProcesses(): void {\r\n if (this._options.alphaBlendingMode === Constants.ALPHA_COMBINE) {\r\n this._downSamplePostprocess = new ThinPassPostProcess(\"HighlightLayerPPP\", this._scene.getEngine());\r\n this._horizontalBlurPostprocess = new ThinGlowBlurPostProcess(\"HighlightLayerHBP\", this._scene.getEngine(), new Vector2(1.0, 0), this._options.blurHorizontalSize);\r\n this._verticalBlurPostprocess = new ThinGlowBlurPostProcess(\"HighlightLayerVBP\", this._scene.getEngine(), new Vector2(0, 1.0), this._options.blurVerticalSize);\r\n this._postProcesses = [this._downSamplePostprocess, this._horizontalBlurPostprocess, this._verticalBlurPostprocess];\r\n } else {\r\n this._horizontalBlurPostprocess = new ThinBlurPostProcess(\"HighlightLayerHBP\", this._scene.getEngine(), new Vector2(1.0, 0), this._options.blurHorizontalSize / 2);\r\n this._verticalBlurPostprocess = new ThinBlurPostProcess(\"HighlightLayerVBP\", this._scene.getEngine(), new Vector2(0, 1.0), this._options.blurVerticalSize / 2);\r\n this._postProcesses = [this._horizontalBlurPostprocess, this._verticalBlurPostprocess];\r\n }\r\n }\r\n\r\n public override needStencil(): boolean {\r\n return true;\r\n }\r\n\r\n public override isReady(subMesh: SubMesh, useInstances: boolean): boolean {\r\n const material = subMesh.getMaterial();\r\n const mesh = subMesh.getRenderingMesh();\r\n\r\n if (!material || !mesh || !this._meshes) {\r\n return false;\r\n }\r\n\r\n let emissiveTexture: Nullable<any> = null;\r\n const highlightLayerMesh = this._meshes[mesh.uniqueId];\r\n\r\n if (highlightLayerMesh && highlightLayerMesh.glowEmissiveOnly && material) {\r\n emissiveTexture = (<any>material).emissiveTexture;\r\n }\r\n return super._isSubMeshReady(subMesh, useInstances, emissiveTexture);\r\n }\r\n\r\n public override _canRenderMesh(_mesh: AbstractMesh, _material: Material): boolean {\r\n // all meshes can be rendered in the highlight layer, even transparent ones\r\n return true;\r\n }\r\n\r\n public override _internalCompose(effect: Effect, renderIndex: number): void {\r\n // Texture\r\n this.bindTexturesForCompose(effect);\r\n\r\n // Cache\r\n const engine = this._engine;\r\n engine.cacheStencilState();\r\n\r\n // Stencil operations\r\n engine.setStencilOperationPass(Constants.REPLACE);\r\n engine.setStencilOperationFail(Constants.KEEP);\r\n engine.setStencilOperationDepthFail(Constants.KEEP);\r\n\r\n // Draw order\r\n engine.setStencilMask(0x00);\r\n engine.setStencilBuffer(true);\r\n engine.setStencilFunctionReference(this._instanceGlowingMeshStencilReference << (8 - this.numStencilBits));\r\n engine.setStencilFunctionMask(255 - ((1 << (8 - this.numStencilBits)) - 1));\r\n\r\n // 2 passes inner outer\r\n if (this.outerGlow && renderIndex === 0) {\r\n // the outer glow is rendered the first time _internalRender is called, so when renderIndex == 0 (and only if outerGlow is enabled)\r\n effect.setFloat(\"offset\", 0);\r\n engine.setStencilFunction(Constants.NOTEQUAL);\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n if (this.innerGlow && renderIndex === 1) {\r\n // the inner glow is rendered the second time _internalRender is called, so when renderIndex == 1 (and only if innerGlow is enabled)\r\n effect.setFloat(\"offset\", 1);\r\n engine.setStencilFunction(Constants.EQUAL);\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n\r\n // Restore Cache\r\n engine.restoreStencilState();\r\n }\r\n\r\n public override _setEmissiveTextureAndColor(mesh: Mesh, _subMesh: SubMesh, material: Material): void {\r\n const highlightLayerMesh = this._meshes![mesh.uniqueId];\r\n if (highlightLayerMesh) {\r\n this._emissiveTextureAndColor.color.set(highlightLayerMesh.color.r, highlightLayerMesh.color.g, highlightLayerMesh.color.b, 1.0);\r\n } else {\r\n this._emissiveTextureAndColor.color.set(this.neutralColor.r, this.neutralColor.g, this.neutralColor.b, this.neutralColor.a);\r\n }\r\n\r\n if (highlightLayerMesh && highlightLayerMesh.glowEmissiveOnly && material) {\r\n this._emissiveTextureAndColor.texture = (<any>material).emissiveTexture;\r\n this._emissiveTextureAndColor.color.set(1.0, 1.0, 1.0, 1.0);\r\n } else {\r\n this._emissiveTextureAndColor.texture = null;\r\n }\r\n }\r\n\r\n public override shouldRender(): boolean {\r\n return this._meshes && super.shouldRender() ? true : false;\r\n }\r\n\r\n public override _shouldRenderMesh(mesh: Mesh): boolean {\r\n if (this._excludedMeshes && this._excludedMeshes[mesh.uniqueId]) {\r\n return false;\r\n }\r\n\r\n return super.hasMesh(mesh);\r\n }\r\n\r\n public override _addCustomEffectDefines(defines: string[]): void {\r\n defines.push(\"#define HIGHLIGHT\");\r\n }\r\n\r\n /**\r\n * Add a mesh in the exclusion list to prevent it to impact or being impacted by the highlight layer.\r\n * @param mesh The mesh to exclude from the highlight layer\r\n */\r\n public addExcludedMesh(mesh: Mesh) {\r\n if (!this._excludedMeshes) {\r\n return;\r\n }\r\n\r\n const meshExcluded = this._excludedMeshes[mesh.uniqueId];\r\n if (!meshExcluded) {\r\n const obj: IHighlightLayerExcludedMesh = {\r\n mesh: mesh,\r\n beforeBind: null,\r\n afterRender: null,\r\n stencilState: false,\r\n };\r\n\r\n obj.beforeBind = mesh.onBeforeBindObservable.add((mesh: Mesh) => {\r\n if (this._mainObjectRendererRenderPassId !== -1 && this._mainObjectRendererRenderPassId !== this._engine.currentRenderPassId) {\r\n return;\r\n }\r\n obj.stencilState = mesh.getEngine().getStencilBuffer();\r\n mesh.getEngine().setStencilBuffer(false);\r\n });\r\n\r\n obj.afterRender = mesh.onAfterRenderObservable.add((mesh: Mesh) => {\r\n if (this._mainObjectRendererRenderPassId !== -1 && this._mainObjectRendererRenderPassId !== this._engine.currentRenderPassId) {\r\n return;\r\n }\r\n mesh.getEngine().setStencilBuffer(obj.stencilState);\r\n });\r\n\r\n this._excludedMeshes[mesh.uniqueId] = obj;\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the exclusion list to let it impact or being impacted by the highlight layer.\r\n * @param mesh The mesh to highlight\r\n */\r\n public removeExcludedMesh(mesh: Mesh) {\r\n if (!this._excludedMeshes) {\r\n return;\r\n }\r\n\r\n const meshExcluded = this._excludedMeshes[mesh.uniqueId];\r\n if (meshExcluded) {\r\n if (meshExcluded.beforeBind) {\r\n mesh.onBeforeBindObservable.remove(meshExcluded.beforeBind);\r\n }\r\n\r\n if (meshExcluded.afterRender) {\r\n mesh.onAfterRenderObservable.remove(meshExcluded.afterRender);\r\n }\r\n }\r\n\r\n this._excludedMeshes[mesh.uniqueId] = null;\r\n }\r\n\r\n public override hasMesh(mesh: AbstractMesh): boolean {\r\n if (!this._meshes || !super.hasMesh(mesh)) {\r\n return false;\r\n }\r\n\r\n return !!this._meshes[mesh.uniqueId];\r\n }\r\n\r\n /**\r\n * Add a mesh in the highlight layer in order to make it glow with the chosen color.\r\n * @param mesh The mesh to highlight\r\n * @param color The color of the highlight\r\n * @param glowEmissiveOnly Extract the glow from the emissive texture\r\n */\r\n public addMesh(mesh: Mesh, color: Color3, glowEmissiveOnly = false) {\r\n if (!this._meshes) {\r\n return;\r\n }\r\n\r\n const meshHighlight = this._meshes[mesh.uniqueId];\r\n if (meshHighlight) {\r\n meshHighlight.color = color;\r\n } else {\r\n this._meshes[mesh.uniqueId] = {\r\n mesh: mesh,\r\n color: color,\r\n // Lambda required for capture due to Observable this context\r\n observerHighlight: mesh.onBeforeBindObservable.add((mesh: Mesh) => {\r\n if (this._mainObjectRendererRenderPassId !== -1 && this._mainObjectRendererRenderPassId !== this._engine.currentRenderPassId) {\r\n return;\r\n }\r\n if (this.isEnabled) {\r\n if (this._excludedMeshes && this._excludedMeshes[mesh.uniqueId]) {\r\n this._defaultStencilReference(mesh);\r\n } else {\r\n mesh.getScene()\r\n .getEngine()\r\n .setStencilFunctionReference(this._instanceGlowingMeshStencilReference << (8 - this.numStencilBits));\r\n }\r\n }\r\n }),\r\n observerDefault: mesh.onAfterRenderObservable.add((mesh: Mesh) => {\r\n if (this._mainObjectRendererRenderPassId !== -1 && this._mainObjectRendererRenderPassId !== this._engine.currentRenderPassId) {\r\n return;\r\n }\r\n if (this.isEnabled) {\r\n this._defaultStencilReference(mesh);\r\n }\r\n }),\r\n glowEmissiveOnly: glowEmissiveOnly,\r\n };\r\n\r\n mesh.onDisposeObservable.add(() => {\r\n this._disposeMesh(mesh);\r\n });\r\n }\r\n\r\n this._shouldRender = true;\r\n }\r\n\r\n /**\r\n * Remove a mesh from the highlight layer in order to make it stop glowing.\r\n * @param mesh The mesh to highlight\r\n */\r\n public removeMesh(mesh: Mesh) {\r\n if (!this._meshes) {\r\n return;\r\n }\r\n\r\n const meshHighlight = this._meshes[mesh.uniqueId];\r\n if (meshHighlight) {\r\n if (meshHighlight.observerHighlight) {\r\n mesh.onBeforeBindObservable.remove(meshHighlight.observerHighlight);\r\n }\r\n\r\n if (meshHighlight.observerDefault) {\r\n mesh.onAfterRenderObservable.remove(meshHighlight.observerDefault);\r\n }\r\n delete this._meshes[mesh.uniqueId];\r\n }\r\n\r\n this._shouldRender = false;\r\n for (const meshHighlightToCheck in this._meshes) {\r\n if (this._meshes[meshHighlightToCheck]) {\r\n this._shouldRender = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove all the meshes currently referenced in the highlight layer\r\n */\r\n public removeAllMeshes(): void {\r\n if (!this._meshes) {\r\n return;\r\n }\r\n\r\n for (const uniqueId in this._meshes) {\r\n if (Object.prototype.hasOwnProperty.call(this._meshes, uniqueId)) {\r\n const mesh = this._meshes[uniqueId];\r\n if (mesh) {\r\n this.removeMesh(mesh.mesh);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _defaultStencilReference(mesh: Mesh) {\r\n mesh.getScene()\r\n .getEngine()\r\n .setStencilFunctionReference(ThinHighlightLayer.NormalMeshStencilReference << (8 - this.numStencilBits));\r\n }\r\n\r\n public _disposeMesh(mesh: Mesh): void {\r\n this.removeMesh(mesh);\r\n this.removeExcludedMesh(mesh);\r\n }\r\n\r\n public override dispose(): void {\r\n if (this._meshes) {\r\n // Clean mesh references\r\n for (const id in this._meshes) {\r\n const meshHighlight = this._meshes[id];\r\n if (meshHighlight && meshHighlight.mesh) {\r\n if (meshHighlight.observerHighlight) {\r\n meshHighlight.mesh.onBeforeBindObservable.remove(meshHighlight.observerHighlight);\r\n }\r\n\r\n if (meshHighlight.observerDefault) {\r\n meshHighlight.mesh.onAfterRenderObservable.remove(meshHighlight.observerDefault);\r\n }\r\n }\r\n }\r\n this._meshes = null;\r\n }\r\n\r\n if (this._excludedMeshes) {\r\n for (const id in this._excludedMeshes) {\r\n const meshHighlight = this._excludedMeshes[id];\r\n if (meshHighlight) {\r\n if (meshHighlight.beforeBind) {\r\n meshHighlight.mesh.onBeforeBindObservable.remove(meshHighlight.beforeBind);\r\n }\r\n\r\n if (meshHighlight.afterRender) {\r\n meshHighlight.mesh.onAfterRenderObservable.remove(meshHighlight.afterRender);\r\n }\r\n }\r\n }\r\n this._excludedMeshes = null;\r\n }\r\n\r\n super.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -135,6 +135,10 @@ export class ClusteredLightContainer extends Light {
|
|
|
135
135
|
this._uniformBuffer.dispose();
|
|
136
136
|
this._uniformBuffer = new UniformBuffer(this.getEngine(), undefined, undefined, this.name);
|
|
137
137
|
this._buildUniformLayout();
|
|
138
|
+
// CLUSTLIGHT_SLICES is a shader define that sizes the vSliceRanges array in the UBO.
|
|
139
|
+
// Materials must recompile when depthSlices changes so the shader layout matches the rebuilt UBO.
|
|
140
|
+
// Otherwise, if depthSlices is reduced, the rebuilt UBO can be smaller than what the previously compiled shader expects, causing rendering to fail.
|
|
141
|
+
this._markMeshesAsLightDirty();
|
|
138
142
|
}
|
|
139
143
|
/**
|
|
140
144
|
* This limits the range of all the added lights, so even lights with extreme ranges will still have bounds for clustering.
|