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