@onerjs/core 8.56.4 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animatable.core.js +36 -0
- package/Animations/animatable.core.js.map +1 -1
- package/Animations/animationGroup.pure.d.ts +61 -1
- package/Animations/animationGroup.pure.js +191 -2
- package/Animations/animationGroup.pure.js.map +1 -1
- package/Animations/index.d.ts +1 -0
- package/Animations/index.js +1 -0
- package/Animations/index.js.map +1 -1
- package/Animations/pure.d.ts +1 -0
- package/Animations/pure.js +1 -0
- package/Animations/pure.js.map +1 -1
- package/Animations/rootMotion.d.ts +560 -0
- package/Animations/rootMotion.js +1709 -0
- package/Animations/rootMotion.js.map +1 -0
- package/Animations/runtimeAnimation.d.ts +57 -0
- package/Animations/runtimeAnimation.js +127 -3
- package/Animations/runtimeAnimation.js.map +1 -1
- package/Cameras/arcRotateCamera.pure.d.ts +2 -0
- package/Cameras/arcRotateCamera.pure.js +2 -0
- package/Cameras/arcRotateCamera.pure.js.map +1 -1
- package/Cameras/targetCamera.pure.d.ts +2 -0
- package/Cameras/targetCamera.pure.js +13 -2
- package/Cameras/targetCamera.pure.js.map +1 -1
- package/Collisions/gpuPicker.js +5 -5
- package/Collisions/gpuPicker.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.query.pure.js +4 -2
- package/Engines/AbstractEngine/abstractEngine.query.pure.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.query.types.d.ts +11 -2
- package/Engines/AbstractEngine/abstractEngine.query.types.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.renderPass.pure.js +1 -0
- package/Engines/AbstractEngine/abstractEngine.renderPass.pure.js.map +1 -1
- package/Engines/Extensions/engine.multiRender.pure.js +63 -0
- package/Engines/Extensions/engine.multiRender.pure.js.map +1 -1
- package/Engines/Extensions/engine.multiRender.types.d.ts +13 -0
- package/Engines/Extensions/engine.multiRender.types.js.map +1 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js +2 -2
- package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js.map +1 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.types.d.ts +2 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.types.js.map +1 -1
- package/Engines/Extensions/index.d.ts +1 -0
- package/Engines/Extensions/index.js +1 -0
- package/Engines/Extensions/index.js.map +1 -1
- package/Engines/Extensions/pure.d.ts +1 -1
- package/Engines/Extensions/pure.js +1 -1
- package/Engines/Extensions/pure.js.map +1 -1
- package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js +88 -39
- package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js.map +1 -1
- package/Engines/Native/Extensions/nativeEngine.cubeTexture.types.d.ts +20 -2
- package/Engines/Native/Extensions/nativeEngine.cubeTexture.types.js.map +1 -1
- package/Engines/Native/nativeHardwareTexture.d.ts +8 -1
- package/Engines/Native/nativeHardwareTexture.js +7 -0
- package/Engines/Native/nativeHardwareTexture.js.map +1 -1
- package/Engines/Native/nativeHelpers.js +56 -1
- package/Engines/Native/nativeHelpers.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +37 -8
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/Native/nativeRenderTargetWrapper.d.ts +40 -0
- package/Engines/Native/nativeRenderTargetWrapper.js +265 -5
- package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
- package/Engines/Processors/shaderCodeCursor.d.ts +1 -0
- package/Engines/Processors/shaderCodeCursor.js +40 -3
- package/Engines/Processors/shaderCodeCursor.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.pure.js +4 -0
- package/Engines/WebGPU/Extensions/engine.multiRender.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.types.d.ts +13 -0
- package/Engines/WebGPU/Extensions/engine.multiRender.types.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.query.pure.js +11 -3
- package/Engines/WebGPU/Extensions/engine.query.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTarget.pure.js +1 -0
- package/Engines/WebGPU/Extensions/engine.renderTarget.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/index.d.ts +1 -0
- package/Engines/WebGPU/Extensions/index.js +1 -0
- package/Engines/WebGPU/Extensions/index.js.map +1 -1
- package/Engines/WebGPU/Extensions/pure.d.ts +1 -1
- package/Engines/WebGPU/Extensions/pure.js +1 -1
- package/Engines/WebGPU/Extensions/pure.js.map +1 -1
- package/Engines/WebGPU/webgpuBundleList.d.ts +2 -0
- package/Engines/WebGPU/webgpuBundleList.js +4 -0
- package/Engines/WebGPU/webgpuBundleList.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +5 -2
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuHardwareTexture.js +3 -1
- package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
- package/Engines/WebGPU/webgpuSnapshotRendering.d.ts +4 -0
- package/Engines/WebGPU/webgpuSnapshotRendering.js +40 -7
- package/Engines/WebGPU/webgpuSnapshotRendering.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -1
- package/Engines/WebGPU/webgpuTextureHelper.js +2 -2
- package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureManager.d.ts +2 -0
- package/Engines/WebGPU/webgpuTextureManager.js +286 -13
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/abstractEngine.pure.d.ts +17 -1
- package/Engines/abstractEngine.pure.js +17 -5
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/constants.d.ts +4 -0
- package/Engines/constants.js +4 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.pure.d.ts +0 -1
- package/Engines/engine.pure.js +0 -7
- package/Engines/engine.pure.js.map +1 -1
- package/Engines/nativeEngine.pure.js +1 -1
- package/Engines/nativeEngine.pure.js.map +1 -1
- package/Engines/thinEngine.pure.d.ts +15 -0
- package/Engines/thinEngine.pure.js +61 -14
- package/Engines/thinEngine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.d.ts +218 -17
- package/Engines/thinNativeEngine.pure.js +1438 -165
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/Engines/thinWebGPUEngine.d.ts +4 -0
- package/Engines/thinWebGPUEngine.js +16 -2
- package/Engines/thinWebGPUEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +17 -3
- package/Engines/webgpuEngine.pure.js +56 -13
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js +2 -2
- package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.d.ts +10 -0
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js +24 -12
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.d.ts +11 -2
- package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js +1 -1
- package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.pure.d.ts +7 -0
- package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.pure.js +43 -0
- package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.d.ts +9 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.js +6 -8
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.d.ts +2 -0
- package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.js +5 -1
- package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.d.ts +2 -0
- package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.js +5 -1
- package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.d.ts +9 -0
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js +34 -9
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.d.ts +2 -0
- package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js +4 -0
- package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.d.ts +18 -4
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js +24 -6
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.pure.js +19 -7
- package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js +3 -3
- package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.d.ts +20 -2
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js +85 -25
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.d.ts +16 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js +64 -14
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.d.ts +12 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js +8 -0
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js +4 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.d.ts +12 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.js +5 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.js +64 -16
- package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.d.ts +2 -0
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.js +14 -2
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.d.ts +5 -1
- package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.js +23 -8
- package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.js.map +1 -1
- package/FlowGraph/CustomTypes/flowGraphInteger.pure.d.ts +5 -0
- package/FlowGraph/CustomTypes/flowGraphInteger.pure.js +7 -0
- package/FlowGraph/CustomTypes/flowGraphInteger.pure.js.map +1 -1
- package/FlowGraph/CustomTypes/flowGraphMatrix.d.ts +10 -0
- package/FlowGraph/CustomTypes/flowGraphMatrix.js +14 -0
- package/FlowGraph/CustomTypes/flowGraphMatrix.js.map +1 -1
- package/FlowGraph/flowGraph.d.ts +6 -1
- package/FlowGraph/flowGraph.js +41 -9
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphAnimationHelpers.d.ts +24 -0
- package/FlowGraph/flowGraphAnimationHelpers.js +21 -0
- package/FlowGraph/flowGraphAnimationHelpers.js.map +1 -0
- package/FlowGraph/flowGraphBlock.js +3 -0
- package/FlowGraph/flowGraphBlock.js.map +1 -1
- package/FlowGraph/flowGraphConnection.d.ts +7 -0
- package/FlowGraph/flowGraphConnection.js +7 -0
- package/FlowGraph/flowGraphConnection.js.map +1 -1
- package/FlowGraph/flowGraphContext.d.ts +2 -1
- package/FlowGraph/flowGraphContext.js +5 -3
- package/FlowGraph/flowGraphContext.js.map +1 -1
- package/FlowGraph/flowGraphCoordinator.d.ts +15 -1
- package/FlowGraph/flowGraphCoordinator.js +47 -16
- package/FlowGraph/flowGraphCoordinator.js.map +1 -1
- package/FlowGraph/flowGraphEventBlock.d.ts +5 -0
- package/FlowGraph/flowGraphEventBlock.js +7 -0
- package/FlowGraph/flowGraphEventBlock.js.map +1 -1
- package/FlowGraph/flowGraphHostResolver.d.ts +2 -1
- package/FlowGraph/flowGraphHostResolver.js.map +1 -1
- package/FlowGraph/flowGraphParser.js +60 -2
- package/FlowGraph/flowGraphParser.js.map +1 -1
- package/FlowGraph/flowGraphValidator.js +0 -4
- package/FlowGraph/flowGraphValidator.js.map +1 -1
- package/FlowGraph/index.d.ts +2 -0
- package/FlowGraph/index.js +2 -0
- package/FlowGraph/index.js.map +1 -1
- package/FlowGraph/pure.d.ts +2 -0
- package/FlowGraph/pure.js +2 -0
- package/FlowGraph/pure.js.map +1 -1
- package/FlowGraph/serialization.d.ts +4 -2
- package/FlowGraph/serialization.js +12 -24
- package/FlowGraph/serialization.js.map +1 -1
- package/FlowGraph/typeDefinitions.d.ts +9 -1
- package/FlowGraph/typeDefinitions.js.map +1 -1
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.d.ts +5 -0
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.js +8 -0
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.js.map +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.d.ts +87 -0
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.js +295 -0
- package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.js.map +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/pure.d.ts +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/pure.js +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +4 -4
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.d.ts +5 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js +13 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.d.ts +1 -0
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.js +4 -0
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.js.map +1 -0
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.d.ts +54 -0
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.js +155 -0
- package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.js.map +1 -0
- package/FrameGraph/Node/Blocks/Textures/pure.d.ts +1 -0
- package/FrameGraph/Node/Blocks/Textures/pure.js +1 -0
- package/FrameGraph/Node/Blocks/Textures/pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/allBlocks.pure.js +4 -0
- package/FrameGraph/Node/Blocks/allBlocks.pure.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/Blocks/inputBlock.pure.js +20 -1
- package/FrameGraph/Node/Blocks/inputBlock.pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/pure.d.ts +2 -0
- package/FrameGraph/Node/Blocks/pure.js +2 -0
- package/FrameGraph/Node/Blocks/pure.js.map +1 -1
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +4 -2
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.js +4 -2
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraph.js +1 -1
- package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
- package/FrameGraph/Tasks/Layers/selectionOutlineTask.js +1 -0
- package/FrameGraph/Tasks/Layers/selectionOutlineTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/cullObjectsTask.js +5 -1
- package/FrameGraph/Tasks/Misc/cullObjectsTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/lightingVolumeTask.js +1 -0
- package/FrameGraph/Tasks/Misc/lightingVolumeTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/minMaxReducerTask.d.ts +62 -0
- package/FrameGraph/Tasks/Misc/minMaxReducerTask.js +159 -0
- package/FrameGraph/Tasks/Misc/minMaxReducerTask.js.map +1 -0
- package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.d.ts +69 -0
- package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.js +223 -0
- package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.js.map +1 -0
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +25 -3
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +72 -34
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js +3 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
- package/FrameGraph/frameGraph.d.ts +4 -0
- package/FrameGraph/frameGraph.js +14 -0
- package/FrameGraph/frameGraph.js.map +1 -1
- package/FrameGraph/frameGraphObjectList.d.ts +6 -1
- package/FrameGraph/frameGraphObjectList.js.map +1 -1
- package/FrameGraph/frameGraphRenderContext.d.ts +3 -1
- package/FrameGraph/frameGraphRenderContext.js +5 -5
- package/FrameGraph/frameGraphRenderContext.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/FrameGraph/pure.d.ts +2 -0
- package/FrameGraph/pure.js +2 -0
- package/FrameGraph/pure.js.map +1 -1
- package/Inputs/scene.inputManager.d.ts +4 -0
- package/Inputs/scene.inputManager.js +50 -8
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Lights/Clustered/clusteredLightingSceneComponent.pure.d.ts +5 -0
- package/Lights/Clustered/clusteredLightingSceneComponent.pure.js +22 -1
- package/Lights/Clustered/clusteredLightingSceneComponent.pure.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.pure.js +7 -3
- package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.d.ts +7 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.js +8 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.d.ts +54 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.js +81 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.d.ts +7 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.js +8 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.d.ts +60 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.js +90 -0
- package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.d.ts +31 -0
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js +103 -5
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js +6 -6
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.d.ts +26 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +153 -49
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.d.ts +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.js +4 -0
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.d.ts +83 -0
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.js +191 -0
- package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.d.ts +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.js +4 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.d.ts +62 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.js +125 -0
- package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js +5 -5
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js.map +1 -1
- package/Materials/GaussianSplatting/pure.d.ts +4 -0
- package/Materials/GaussianSplatting/pure.js +4 -0
- package/Materials/GaussianSplatting/pure.js.map +1 -1
- package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.d.ts +1 -0
- package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.js +12 -0
- package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js +11 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +17 -2
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js +2 -2
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js.map +1 -1
- package/Materials/Node/nodeMaterial.pure.d.ts +4 -0
- package/Materials/Node/nodeMaterial.pure.js +4 -0
- package/Materials/Node/nodeMaterial.pure.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.d.ts +1 -1
- package/Materials/Node/nodeMaterialBuildState.js +25 -3
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.pure.d.ts +2 -0
- package/Materials/PBR/pbrBaseMaterial.pure.d.ts +2 -0
- package/Materials/Textures/Procedurals/proceduralTexture.pure.d.ts +14 -14
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js +37 -13
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
- package/Materials/Textures/baseTexture.pure.js +3 -0
- package/Materials/Textures/baseTexture.pure.js.map +1 -1
- package/Materials/Textures/cubeTexture.pure.js +1 -1
- package/Materials/Textures/cubeTexture.pure.js.map +1 -1
- package/Materials/Textures/internalTexture.d.ts +8 -1
- package/Materials/Textures/internalTexture.js +9 -2
- package/Materials/Textures/internalTexture.js.map +1 -1
- package/Materials/Textures/mirrorTexture.pure.js +3 -1
- package/Materials/Textures/mirrorTexture.pure.js.map +1 -1
- package/Materials/Textures/rawTexture2DArray.functions.d.ts +3 -3
- package/Materials/Textures/rawTexture2DArray.functions.js.map +1 -1
- package/Materials/Textures/rawTexture3D.d.ts +1 -1
- package/Materials/Textures/rawTexture3D.js +1 -1
- package/Materials/Textures/rawTexture3D.js.map +1 -1
- package/Materials/Textures/texture.pure.js +1 -1
- package/Materials/Textures/texture.pure.js.map +1 -1
- package/Materials/Textures/textureHelper.functions.d.ts +14 -0
- package/Materials/Textures/textureHelper.functions.js +24 -0
- package/Materials/Textures/textureHelper.functions.js.map +1 -1
- package/Materials/ditheredTileFadeMaterialPlugin.d.ts +210 -0
- package/Materials/ditheredTileFadeMaterialPlugin.js +509 -0
- package/Materials/ditheredTileFadeMaterialPlugin.js.map +1 -0
- package/Materials/effectRenderer.pure.d.ts +4 -0
- package/Materials/effectRenderer.pure.js +3 -2
- package/Materials/effectRenderer.pure.js.map +1 -1
- package/Materials/index.d.ts +5 -0
- package/Materials/index.js +5 -0
- package/Materials/index.js.map +1 -1
- package/Materials/material.pure.js +25 -12
- package/Materials/material.pure.js.map +1 -1
- package/Materials/materialHelper.geometryrendering.d.ts +46 -1
- package/Materials/materialHelper.geometryrendering.js +105 -8
- package/Materials/materialHelper.geometryrendering.js.map +1 -1
- package/Materials/prepass.defines.d.ts +2 -0
- package/Materials/prepass.defines.js +2 -0
- package/Materials/prepass.defines.js.map +1 -1
- package/Materials/pure.d.ts +5 -0
- package/Materials/pure.js +5 -0
- package/Materials/pure.js.map +1 -1
- package/Materials/standardMaterial.pure.d.ts +10 -0
- package/Materials/standardMaterial.pure.js +30 -5
- package/Materials/standardMaterial.pure.js.map +1 -1
- package/Meshes/Builders/polygonBuilder.pure.d.ts +4 -0
- package/Meshes/Builders/polygonBuilder.pure.js +3 -0
- package/Meshes/Builders/polygonBuilder.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.d.ts +8 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.js +11 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.d.ts +231 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.js +1212 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.d.ts +14 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.js +15 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.d.ts +285 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.js +812 -0
- package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianSplatting.functions.d.ts +19 -0
- package/Meshes/GaussianSplatting/gaussianSplatting.functions.js +23 -0
- package/Meshes/GaussianSplatting/gaussianSplatting.functions.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +1 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +2 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +163 -14
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +239 -24
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +34 -4
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +125 -25
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/pure.d.ts +2 -0
- package/Meshes/GaussianSplatting/pure.js +2 -0
- package/Meshes/GaussianSplatting/pure.js.map +1 -1
- package/Meshes/Node/Blocks/booleanGeometryBlock.pure.js +25 -11
- package/Meshes/Node/Blocks/booleanGeometryBlock.pure.js.map +1 -1
- package/Meshes/abstractMesh.pure.d.ts +30 -0
- package/Meshes/abstractMesh.pure.js +54 -0
- package/Meshes/abstractMesh.pure.js.map +1 -1
- package/Meshes/index.d.ts +2 -0
- package/Meshes/index.js +2 -0
- package/Meshes/index.js.map +1 -1
- package/Meshes/instancedMesh.pure.d.ts +5 -0
- package/Meshes/instancedMesh.pure.js +12 -0
- package/Meshes/instancedMesh.pure.js.map +1 -1
- package/Meshes/mesh.pure.js +23 -8
- package/Meshes/mesh.pure.js.map +1 -1
- package/Meshes/meshBlendingTag.d.ts +47 -0
- package/Meshes/meshBlendingTag.js +64 -0
- package/Meshes/meshBlendingTag.js.map +1 -0
- package/Meshes/polygonMesh.js +2 -2
- package/Meshes/polygonMesh.js.map +1 -1
- package/Meshes/pure.d.ts +2 -0
- package/Meshes/pure.js +2 -0
- package/Meshes/pure.js.map +1 -1
- package/Meshes/subMesh.pure.d.ts +11 -2
- package/Meshes/subMesh.pure.js +20 -5
- package/Meshes/subMesh.pure.js.map +1 -1
- package/Meshes/thinInstanceMesh.pure.js +1 -0
- package/Meshes/thinInstanceMesh.pure.js.map +1 -1
- package/Misc/andOrNotEvaluator.js +4 -0
- package/Misc/andOrNotEvaluator.js.map +1 -1
- package/Misc/fileTools.pure.js +21 -0
- package/Misc/fileTools.pure.js.map +1 -1
- package/Misc/minMaxReducer.pure.d.ts +6 -0
- package/Misc/minMaxReducer.pure.js +10 -0
- package/Misc/minMaxReducer.pure.js.map +1 -1
- package/Misc/snapshotRenderingHelper.js +2 -2
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Misc/thinMinMaxReducer.d.ts +19 -2
- package/Misc/thinMinMaxReducer.js +74 -21
- package/Misc/thinMinMaxReducer.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Particles/Node/Blocks/Update/updateNoiseBlock.pure.js +19 -7
- package/Particles/Node/Blocks/Update/updateNoiseBlock.pure.js.map +1 -1
- package/Particles/Node/Blocks/particleSourceTextureBlock.pure.js +3 -2
- package/Particles/Node/Blocks/particleSourceTextureBlock.pure.js.map +1 -1
- package/Particles/gpuParticleSystem.pure.d.ts +4 -0
- package/Particles/gpuParticleSystem.pure.js +101 -32
- package/Particles/gpuParticleSystem.pure.js.map +1 -1
- package/Particles/particle.js +3 -2
- package/Particles/particle.js.map +1 -1
- package/Particles/solidParticleSystem.js +7 -1
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.function.d.ts +6 -0
- package/Particles/thinParticleSystem.function.js +144 -88
- package/Particles/thinParticleSystem.function.js.map +1 -1
- package/Particles/thinParticleSystem.pure.d.ts +8 -0
- package/Particles/thinParticleSystem.pure.js +154 -28
- package/Particles/thinParticleSystem.pure.js.map +1 -1
- package/Particles/webgl2ParticleSystem.pure.d.ts +1 -0
- package/Particles/webgl2ParticleSystem.pure.js +12 -4
- package/Particles/webgl2ParticleSystem.pure.js.map +1 -1
- package/Physics/v2/ragdoll.d.ts +2 -4
- package/Physics/v2/ragdoll.js +11 -4
- package/Physics/v2/ragdoll.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js +7 -0
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js.map +1 -1
- package/PostProcesses/index.d.ts +2 -0
- package/PostProcesses/index.js +2 -0
- package/PostProcesses/index.js.map +1 -1
- package/PostProcesses/meshBlendingBlueNoise.d.ts +15 -0
- package/PostProcesses/meshBlendingBlueNoise.js +77 -0
- package/PostProcesses/meshBlendingBlueNoise.js.map +1 -0
- package/PostProcesses/meshBlendingPostProcess.d.ts +131 -0
- package/PostProcesses/meshBlendingPostProcess.js +315 -0
- package/PostProcesses/meshBlendingPostProcess.js.map +1 -0
- package/PostProcesses/pure.d.ts +2 -0
- package/PostProcesses/pure.js +2 -0
- package/PostProcesses/pure.js.map +1 -1
- package/PostProcesses/thinMeshBlendingPostProcess.d.ts +339 -0
- package/PostProcesses/thinMeshBlendingPostProcess.js +771 -0
- package/PostProcesses/thinMeshBlendingPostProcess.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +6 -6
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.d.ts +12 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +50 -25
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
- package/Rendering/boundingBoxRenderer.pure.js +2 -1
- package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
- package/Rendering/depthRenderer.pure.d.ts +9 -0
- package/Rendering/depthRenderer.pure.js +15 -4
- package/Rendering/depthRenderer.pure.js.map +1 -1
- package/Rendering/edgesRenderer.pure.d.ts +4 -2
- package/Rendering/edgesRenderer.pure.js +11 -2
- package/Rendering/edgesRenderer.pure.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +14 -0
- package/Rendering/fluidRenderer/fluidRenderingObject.js +26 -0
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +13 -3
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +22 -9
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +3 -0
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
- package/Rendering/geometryBufferRenderer.pure.d.ts +38 -4
- package/Rendering/geometryBufferRenderer.pure.js +130 -18
- package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +7 -1
- package/Rendering/objectRenderer.js +45 -7
- package/Rendering/objectRenderer.js.map +1 -1
- package/Rendering/outlineRenderer.pure.js +6 -2
- package/Rendering/outlineRenderer.pure.js.map +1 -1
- package/Rendering/prePassRenderer.pure.js +3 -3
- package/Rendering/prePassRenderer.pure.js.map +1 -1
- package/Rendering/renderingManager.d.ts +1 -1
- package/Rendering/renderingManager.js +5 -4
- package/Rendering/renderingManager.js.map +1 -1
- package/Shaders/ShadersInclude/defaultFragmentAlpha.d.ts +5 -0
- package/Shaders/ShadersInclude/defaultFragmentAlpha.js +34 -0
- package/Shaders/ShadersInclude/defaultFragmentAlpha.js.map +1 -0
- package/Shaders/ShadersInclude/gaussianSplatting.js +3 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js +5 -1
- package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/geometryRenderingFragment.d.ts +5 -0
- package/Shaders/ShadersInclude/geometryRenderingFragment.js +74 -0
- package/Shaders/ShadersInclude/geometryRenderingFragment.js.map +1 -0
- package/Shaders/ShadersInclude/lightsFragmentFunctions.js +27 -3
- package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/mrtFragmentDeclaration.js +89 -0
- package/Shaders/ShadersInclude/mrtFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/oitDeclaration.js +1 -1
- package/Shaders/ShadersInclude/oitDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrBlockPrePass.js +24 -17
- package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockPrePass.js +27 -20
- package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDebug.js +6 -2
- package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
- package/Shaders/ShadersInclude/prePassDeclaration.js +95 -2
- package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/Shaders/default.fragment.js +31 -40
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/depthOfField.fragment.js +13 -9
- package/Shaders/depthOfField.fragment.js.map +1 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js +16 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js +16 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/Shaders/gaussianSplatting.fragment.js +63 -3
- package/Shaders/gaussianSplatting.fragment.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +80 -0
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/Shaders/geometry.fragment.js +17 -11
- package/Shaders/geometry.fragment.js.map +1 -1
- package/Shaders/gpuRenderParticles.fragment.js +43 -1
- package/Shaders/gpuRenderParticles.fragment.js.map +1 -1
- package/Shaders/gpuRenderParticles.vertex.js +96 -16
- package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
- package/Shaders/meshBlending.fragment.d.ts +5 -0
- package/Shaders/meshBlending.fragment.js +519 -0
- package/Shaders/meshBlending.fragment.js.map +1 -0
- package/Shaders/minmaxRedux.fragment.js +6 -1
- package/Shaders/minmaxRedux.fragment.js.map +1 -1
- package/Shaders/particles.fragment.js +43 -1
- package/Shaders/particles.fragment.js.map +1 -1
- package/Shaders/particles.vertex.js +84 -3
- package/Shaders/particles.vertex.js.map +1 -1
- package/Shaders/sprites.fragment.js +52 -2
- package/Shaders/sprites.fragment.js.map +1 -1
- package/Shaders/sprites.vertex.js +62 -1
- package/Shaders/sprites.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.js +33 -0
- package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.js +65 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.js +17 -0
- package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.d.ts +1 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +6 -78
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.js +2 -2
- package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.js +79 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.d.ts +6 -0
- package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.js +76 -0
- package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/lightFragment.js +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +27 -3
- package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.js +18 -0
- package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.d.ts +1 -0
- package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +11 -25
- package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.d.ts +1 -0
- package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +11 -25
- package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDebug.js +5 -1
- package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +6 -1
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +17 -48
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +15 -2
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -2
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianPointSplattingBlit.fragment.d.ts +5 -0
- package/ShadersWGSL/gaussianPointSplattingBlit.fragment.js +22 -0
- package/ShadersWGSL/gaussianPointSplattingBlit.fragment.js.map +1 -0
- package/ShadersWGSL/gaussianPointSplattingBlit.vertex.d.ts +5 -0
- package/ShadersWGSL/gaussianPointSplattingBlit.vertex.js +19 -0
- package/ShadersWGSL/gaussianPointSplattingBlit.vertex.js.map +1 -0
- package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.d.ts +5 -0
- package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.js +21 -0
- package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.js.map +1 -0
- package/ShadersWGSL/gaussianSplatting.fragment.js +63 -2
- package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +82 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js +2 -1
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingVoxel.vertex.js +2 -1
- package/ShadersWGSL/gaussianSplattingVoxel.vertex.js.map +1 -1
- package/ShadersWGSL/geometry.fragment.js +37 -2
- package/ShadersWGSL/geometry.fragment.js.map +1 -1
- package/ShadersWGSL/gpsHiZBuild.compute.d.ts +5 -0
- package/ShadersWGSL/gpsHiZBuild.compute.js +16 -0
- package/ShadersWGSL/gpsHiZBuild.compute.js.map +1 -0
- package/ShadersWGSL/gpsPartition.compute.d.ts +5 -0
- package/ShadersWGSL/gpsPartition.compute.js +27 -0
- package/ShadersWGSL/gpsPartition.compute.js.map +1 -0
- package/ShadersWGSL/gpsPreprocess.compute.d.ts +5 -0
- package/ShadersWGSL/gpsPreprocess.compute.js +86 -0
- package/ShadersWGSL/gpsPreprocess.compute.js.map +1 -0
- package/ShadersWGSL/gpsResolve.compute.d.ts +5 -0
- package/ShadersWGSL/gpsResolve.compute.js +41 -0
- package/ShadersWGSL/gpsResolve.compute.js.map +1 -0
- package/ShadersWGSL/gpsScanAdd.compute.d.ts +5 -0
- package/ShadersWGSL/gpsScanAdd.compute.js +22 -0
- package/ShadersWGSL/gpsScanAdd.compute.js.map +1 -0
- package/ShadersWGSL/gpsScanBlocks.compute.d.ts +5 -0
- package/ShadersWGSL/gpsScanBlocks.compute.js +23 -0
- package/ShadersWGSL/gpsScanBlocks.compute.js.map +1 -0
- package/ShadersWGSL/gpsScanSums.compute.d.ts +5 -0
- package/ShadersWGSL/gpsScanSums.compute.js +30 -0
- package/ShadersWGSL/gpsScanSums.compute.js.map +1 -0
- package/ShadersWGSL/gpsSplat.compute.d.ts +5 -0
- package/ShadersWGSL/gpsSplat.compute.js +37 -0
- package/ShadersWGSL/gpsSplat.compute.js.map +1 -0
- package/ShadersWGSL/gpuRenderParticles.fragment.js +47 -2
- package/ShadersWGSL/gpuRenderParticles.fragment.js.map +1 -1
- package/ShadersWGSL/gpuRenderParticles.vertex.js +110 -7
- package/ShadersWGSL/gpuRenderParticles.vertex.js.map +1 -1
- package/ShadersWGSL/meshBlending.fragment.d.ts +5 -0
- package/ShadersWGSL/meshBlending.fragment.js +576 -0
- package/ShadersWGSL/meshBlending.fragment.js.map +1 -0
- package/ShadersWGSL/minmaxRedux.fragment.js +20 -3
- package/ShadersWGSL/minmaxRedux.fragment.js.map +1 -1
- package/ShadersWGSL/openpbr.fragment.js +2 -1
- package/ShadersWGSL/openpbr.fragment.js.map +1 -1
- package/ShadersWGSL/particles.fragment.js +45 -1
- package/ShadersWGSL/particles.fragment.js.map +1 -1
- package/ShadersWGSL/particles.vertex.js +86 -4
- package/ShadersWGSL/particles.vertex.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +2 -1
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/sprites.fragment.js +56 -2
- package/ShadersWGSL/sprites.fragment.js.map +1 -1
- package/ShadersWGSL/sprites.vertex.js +62 -1
- package/ShadersWGSL/sprites.vertex.js.map +1 -1
- package/Sprites/spriteManager.d.ts +13 -0
- package/Sprites/spriteManager.js +15 -0
- package/Sprites/spriteManager.js.map +1 -1
- package/Sprites/spriteRenderer.d.ts +24 -1
- package/Sprites/spriteRenderer.js +368 -50
- package/Sprites/spriteRenderer.js.map +1 -1
- package/Sprites/thinSprite.d.ts +4 -0
- package/Sprites/thinSprite.js +4 -0
- package/Sprites/thinSprite.js.map +1 -1
- package/States/alphaCullingState.d.ts +3 -1
- package/States/alphaCullingState.js +18 -3
- package/States/alphaCullingState.js.map +1 -1
- package/XR/features/WebXRSpaceWarp.pure.js +2 -1
- package/XR/features/WebXRSpaceWarp.pure.js.map +1 -1
- package/XR/webXRDefaultExperience.d.ts +5 -1
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXREnterExitUI.d.ts +2 -1
- package/XR/webXREnterExitUI.js.map +1 -1
- package/assetContainer.d.ts +1 -0
- package/assetContainer.js +5 -1
- package/assetContainer.js.map +1 -1
- package/package.json +1 -1
- package/scene.pure.d.ts +36 -2
- package/scene.pure.js +63 -4
- package/scene.pure.js.map +1 -1
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
import { InstancedMesh, RegisterInstancedMesh } from "../Meshes/instancedMesh.pure.js";
|
|
2
|
+
import { Mesh } from "../Meshes/mesh.pure.js";
|
|
3
|
+
import { RegisterThinInstanceMesh } from "../Meshes/thinInstanceMesh.pure.js";
|
|
4
|
+
import { Vector4 } from "../Maths/math.vector.pure.js";
|
|
5
|
+
import { MaterialPluginBase } from "./materialPluginBase.pure.js";
|
|
6
|
+
import { PBRBaseMaterial } from "./PBR/pbrBaseMaterial.pure.js";
|
|
7
|
+
import { StandardMaterial } from "./standardMaterial.pure.js";
|
|
8
|
+
let GlslShaderLoadPromise;
|
|
9
|
+
let WgslShaderLoadPromise;
|
|
10
|
+
const DepthPrePassInjectionPoint = "!#include<depthPrePass>";
|
|
11
|
+
async function _LoadGlslShaderIncludeAsync() {
|
|
12
|
+
await import("../Shaders/ShadersInclude/bayerDitherFunctions.js");
|
|
13
|
+
}
|
|
14
|
+
async function _LoadWgslShaderIncludeAsync() {
|
|
15
|
+
await import("../ShadersWGSL/ShadersInclude/bayerDitherFunctions.js");
|
|
16
|
+
}
|
|
17
|
+
async function _LoadShaderIncludeAsync(shaderLanguage) {
|
|
18
|
+
if (shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
19
|
+
WgslShaderLoadPromise ?? (WgslShaderLoadPromise = _LoadWgslShaderIncludeAsync());
|
|
20
|
+
await WgslShaderLoadPromise;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
GlslShaderLoadPromise ?? (GlslShaderLoadPromise = _LoadGlslShaderIncludeAsync());
|
|
24
|
+
await GlslShaderLoadPromise;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Applies an opaque, screen-space dithered fade for tile LOD meshes that share a Standard or PBR material.
|
|
28
|
+
*
|
|
29
|
+
* The plugin keeps depth writing and the material's alpha mode unchanged. It affects the material color and integrated
|
|
30
|
+
* prepass outputs, but not standalone depth, shadow, picking, outline, or custom passes. Tile renderers using those passes
|
|
31
|
+
* must provide equivalent pass-specific coverage or exclude fading tiles from them.
|
|
32
|
+
*
|
|
33
|
+
* Per-mesh bounds are runtime state. Material cloning and serialization do not copy them; use {@link copyToMaterial} to
|
|
34
|
+
* copy the enabled state to a cloned material and then configure bounds for the cloned tile meshes.
|
|
35
|
+
* @see https://playground.babylonjs.com/#HI17VI#0
|
|
36
|
+
*/
|
|
37
|
+
export class DitheredTileFadeMaterialPlugin extends MaterialPluginBase {
|
|
38
|
+
/**
|
|
39
|
+
* Gets whether configured fades are applied. Disabling the plugin makes every mesh fully visible without discarding its stored bounds.
|
|
40
|
+
*/
|
|
41
|
+
get isEnabled() {
|
|
42
|
+
return this._isEnabled;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Sets whether configured fades are applied. This uniform-only change does not recompile the material.
|
|
46
|
+
*/
|
|
47
|
+
set isEnabled(value) {
|
|
48
|
+
this._isEnabled = value;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates and attaches a dithered fade plugin.
|
|
52
|
+
* @param material The Standard or PBR material that the plugin will extend.
|
|
53
|
+
* @throws If the material is unsupported or already has a dithered tile fade plugin. Use {@link GetOrCreate} when reuse is intended.
|
|
54
|
+
*/
|
|
55
|
+
constructor(material) {
|
|
56
|
+
super(material, DitheredTileFadeMaterialPlugin.Name, 190, undefined, DitheredTileFadeMaterialPlugin._ValidateNewPlugin(material), false, true);
|
|
57
|
+
this._meshBounds = new WeakMap();
|
|
58
|
+
this._instancedBufferSources = new WeakSet();
|
|
59
|
+
this._thinInstanceFadeBuffers = new WeakMap();
|
|
60
|
+
this._generation = 1;
|
|
61
|
+
this._isEnabled = true;
|
|
62
|
+
this._shaderIncludeReady = false;
|
|
63
|
+
this.registerForExtraEvents = true;
|
|
64
|
+
this.doNotSerialize = true;
|
|
65
|
+
void this._loadShaderIncludeAsync(material.shaderLanguage);
|
|
66
|
+
this._enable(true);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Gets the plugin already attached to a material, or creates and attaches one.
|
|
70
|
+
* @param material The Standard or PBR material to extend.
|
|
71
|
+
* @returns The material's dithered fade plugin.
|
|
72
|
+
* @throws If the material is unsupported or another plugin uses the reserved plugin name.
|
|
73
|
+
*/
|
|
74
|
+
static GetOrCreate(material) {
|
|
75
|
+
DitheredTileFadeMaterialPlugin._ValidateMaterial(material);
|
|
76
|
+
const existing = material.pluginManager?.getPlugin(DitheredTileFadeMaterialPlugin.Name);
|
|
77
|
+
if (existing) {
|
|
78
|
+
if (!(existing instanceof DitheredTileFadeMaterialPlugin)) {
|
|
79
|
+
throw new Error(`The material "${material.name}" already has an incompatible plugin named "${DitheredTileFadeMaterialPlugin.Name}".`);
|
|
80
|
+
}
|
|
81
|
+
return existing;
|
|
82
|
+
}
|
|
83
|
+
return new DitheredTileFadeMaterialPlugin(material);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Checks whether the plugin supports a shader language.
|
|
87
|
+
* @param shaderLanguage The shader language to check.
|
|
88
|
+
* @returns True for GLSL and WGSL.
|
|
89
|
+
*/
|
|
90
|
+
isCompatible(shaderLanguage) {
|
|
91
|
+
return shaderLanguage === 0 /* ShaderLanguage.GLSL */ || shaderLanguage === 1 /* ShaderLanguage.WGSL */;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Sets both normalized Bayer interval bounds for a mesh.
|
|
95
|
+
* @param mesh The tile mesh or hardware instance whose draw calls use the bounds.
|
|
96
|
+
* @param lowerBound The inclusive lower bound in the range [0, 1].
|
|
97
|
+
* @param upperBound The exclusive upper bound in the range [0, 1].
|
|
98
|
+
* @remarks Bounds are independent. A lower bound greater than or equal to the upper bound intentionally produces an empty interval.
|
|
99
|
+
*/
|
|
100
|
+
setFadeBounds(mesh, lowerBound, upperBound) {
|
|
101
|
+
this._validateMesh(mesh);
|
|
102
|
+
this._validateBound(lowerBound, "lowerBound");
|
|
103
|
+
this._validateBound(upperBound, "upperBound");
|
|
104
|
+
const bounds = this._meshBounds.get(mesh);
|
|
105
|
+
if (bounds) {
|
|
106
|
+
bounds.lowerBound = lowerBound;
|
|
107
|
+
bounds.upperBound = upperBound;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this._meshBounds.set(mesh, { lowerBound, upperBound });
|
|
111
|
+
}
|
|
112
|
+
this._updateInstancedFadeBounds(mesh, lowerBound, upperBound, true);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Sets the normalized inclusive lower Bayer interval bound for a mesh.
|
|
116
|
+
* @param mesh The tile mesh or hardware instance whose draw calls use the bound.
|
|
117
|
+
* @param lowerBound The inclusive lower bound in the range [0, 1].
|
|
118
|
+
*/
|
|
119
|
+
setFadeLowerBound(mesh, lowerBound) {
|
|
120
|
+
this.setFadeBounds(mesh, lowerBound, this._meshBounds.get(mesh)?.upperBound ?? 1);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Sets the normalized exclusive upper Bayer interval bound for a mesh.
|
|
124
|
+
* @param mesh The tile mesh or hardware instance whose draw calls use the bound.
|
|
125
|
+
* @param upperBound The exclusive upper bound in the range [0, 1].
|
|
126
|
+
*/
|
|
127
|
+
setFadeUpperBound(mesh, upperBound) {
|
|
128
|
+
this.setFadeBounds(mesh, this._meshBounds.get(mesh)?.lowerBound ?? 0, upperBound);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Copies a mesh's current bounds without allocating.
|
|
132
|
+
* @param mesh The mesh whose bounds are queried.
|
|
133
|
+
* @param result The object that receives the bounds.
|
|
134
|
+
* @returns True when the mesh has explicit bounds. Otherwise false is returned with the source mesh's bounds for a hardware instance, or [0, 1].
|
|
135
|
+
*/
|
|
136
|
+
getFadeBoundsToRef(mesh, result) {
|
|
137
|
+
this._validateMesh(mesh);
|
|
138
|
+
const explicitBounds = this._meshBounds.get(mesh);
|
|
139
|
+
const bounds = explicitBounds ?? (mesh instanceof InstancedMesh ? this._meshBounds.get(mesh.sourceMesh) : undefined);
|
|
140
|
+
result.lowerBound = bounds?.lowerBound ?? 0;
|
|
141
|
+
result.upperBound = bounds?.upperBound ?? 1;
|
|
142
|
+
return explicitBounds !== undefined;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Removes a mesh's explicit bounds. A hardware instance inherits its source mesh's bounds; a source mesh uses [0, 1].
|
|
146
|
+
* @param mesh The mesh to reset.
|
|
147
|
+
*/
|
|
148
|
+
resetFade(mesh) {
|
|
149
|
+
this._validateMesh(mesh);
|
|
150
|
+
this._meshBounds.delete(mesh);
|
|
151
|
+
this._updateInstancedFadeBounds(mesh, 0, 1, false);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Sets normalized Bayer interval bounds for one thin instance.
|
|
155
|
+
* @param mesh The source mesh containing the thin instance.
|
|
156
|
+
* @param index The thin instance index.
|
|
157
|
+
* @param lowerBound The inclusive lower bound in the range [0, 1].
|
|
158
|
+
* @param upperBound The exclusive upper bound in the range [0, 1].
|
|
159
|
+
* @param refresh Whether to immediately upload the updated attribute buffer.
|
|
160
|
+
*/
|
|
161
|
+
setThinInstanceFadeBounds(mesh, index, lowerBound, upperBound, refresh = true) {
|
|
162
|
+
this._validateBound(lowerBound, "lowerBound");
|
|
163
|
+
this._validateBound(upperBound, "upperBound");
|
|
164
|
+
this._validateThinInstanceIndex(mesh, index);
|
|
165
|
+
const buffer = this._ensureThinInstanceBuffer(mesh);
|
|
166
|
+
const offset = index * 4;
|
|
167
|
+
buffer[offset] = lowerBound;
|
|
168
|
+
buffer[offset + 1] = upperBound;
|
|
169
|
+
buffer[offset + 2] = 1;
|
|
170
|
+
buffer[offset + 3] = this._generation;
|
|
171
|
+
if (refresh) {
|
|
172
|
+
this.commitThinInstanceFadeBounds(mesh);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Sets normalized Bayer interval bounds for all thin instances from packed lower/upper pairs.
|
|
177
|
+
* @param mesh The source mesh containing the thin instances.
|
|
178
|
+
* @param bounds Packed lower/upper pairs, with two values per thin instance.
|
|
179
|
+
*/
|
|
180
|
+
setThinInstanceFadeBoundsBuffer(mesh, bounds) {
|
|
181
|
+
RegisterThinInstanceMesh();
|
|
182
|
+
const instanceCount = mesh.thinInstanceCount;
|
|
183
|
+
if (bounds.length !== instanceCount * 2) {
|
|
184
|
+
throw new RangeError(`bounds must contain exactly ${instanceCount * 2} values.`);
|
|
185
|
+
}
|
|
186
|
+
for (let index = 0; index < instanceCount; index++) {
|
|
187
|
+
const lowerBound = bounds[index * 2];
|
|
188
|
+
const upperBound = bounds[index * 2 + 1];
|
|
189
|
+
this._validateBound(lowerBound, `bounds[${index * 2}]`);
|
|
190
|
+
this._validateBound(upperBound, `bounds[${index * 2 + 1}]`);
|
|
191
|
+
}
|
|
192
|
+
const attributeData = this._ensureThinInstanceBuffer(mesh);
|
|
193
|
+
for (let index = 0; index < instanceCount; index++) {
|
|
194
|
+
const attributeOffset = index * 4;
|
|
195
|
+
attributeData[attributeOffset] = bounds[index * 2];
|
|
196
|
+
attributeData[attributeOffset + 1] = bounds[index * 2 + 1];
|
|
197
|
+
attributeData[attributeOffset + 2] = 1;
|
|
198
|
+
attributeData[attributeOffset + 3] = this._generation;
|
|
199
|
+
}
|
|
200
|
+
this.commitThinInstanceFadeBounds(mesh);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Uploads thin-instance fade changes after one or more setters used `refresh = false`.
|
|
204
|
+
* @param mesh The source mesh whose fade attribute buffer changed.
|
|
205
|
+
*/
|
|
206
|
+
commitThinInstanceFadeBounds(mesh) {
|
|
207
|
+
if (!this._thinInstanceFadeBuffers.has(mesh)) {
|
|
208
|
+
throw new Error("No thin-instance fade buffer has been created for this mesh.");
|
|
209
|
+
}
|
|
210
|
+
mesh.thinInstanceBufferUpdated(this._getInstanceAttributeName());
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Removes one thin instance's explicit bounds so it inherits the source mesh's bounds.
|
|
214
|
+
* @param mesh The source mesh containing the thin instance.
|
|
215
|
+
* @param index The thin instance index.
|
|
216
|
+
* @param refresh Whether to immediately upload the updated attribute buffer.
|
|
217
|
+
*/
|
|
218
|
+
resetThinInstanceFade(mesh, index, refresh = true) {
|
|
219
|
+
this._validateThinInstanceIndex(mesh, index);
|
|
220
|
+
const buffer = this._ensureThinInstanceBuffer(mesh);
|
|
221
|
+
const offset = index * 4;
|
|
222
|
+
buffer[offset] = 0;
|
|
223
|
+
buffer[offset + 1] = 1;
|
|
224
|
+
buffer[offset + 2] = 0;
|
|
225
|
+
buffer[offset + 3] = this._generation;
|
|
226
|
+
if (refresh) {
|
|
227
|
+
this.commitThinInstanceFadeBounds(mesh);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Removes all explicit mesh bounds while keeping the plugin enabled.
|
|
232
|
+
*/
|
|
233
|
+
reset() {
|
|
234
|
+
this._meshBounds = new WeakMap();
|
|
235
|
+
this._generation++;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Copies material-level configuration to another supported material.
|
|
239
|
+
*
|
|
240
|
+
* Per-mesh bounds are intentionally not copied because they belong to the source tile meshes.
|
|
241
|
+
* @param material The destination material, including a material clone.
|
|
242
|
+
* @returns The destination material's dithered tile fade plugin.
|
|
243
|
+
*/
|
|
244
|
+
copyToMaterial(material) {
|
|
245
|
+
const plugin = DitheredTileFadeMaterialPlugin.GetOrCreate(material);
|
|
246
|
+
plugin.isEnabled = this._isEnabled;
|
|
247
|
+
return plugin;
|
|
248
|
+
}
|
|
249
|
+
/** @internal */
|
|
250
|
+
isReadyForSubMesh(_defines, _scene, _engine, _subMesh) {
|
|
251
|
+
if (this._shaderIncludeError) {
|
|
252
|
+
throw this._shaderIncludeError;
|
|
253
|
+
}
|
|
254
|
+
return this._shaderIncludeReady;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Uploads the current mesh's bounds for every draw, including shared and frozen materials.
|
|
258
|
+
* @param _uniformBuffer The material uniform buffer.
|
|
259
|
+
* @param _scene The scene being rendered.
|
|
260
|
+
* @param _engine The engine being used.
|
|
261
|
+
* @param subMesh The submesh being bound.
|
|
262
|
+
*/
|
|
263
|
+
hardBindForSubMesh(_uniformBuffer, _scene, _engine, subMesh) {
|
|
264
|
+
const effect = subMesh.effect;
|
|
265
|
+
if (!effect) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const mesh = subMesh.getMesh();
|
|
269
|
+
const bounds = this._meshBounds.get(mesh);
|
|
270
|
+
effect.setFloat4("ditheredFadeSettings", bounds?.lowerBound ?? 0, bounds?.upperBound ?? 1, this._isEnabled ? 1 : 0, this._generation);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Registers the per-instance fade attribute when a mesh is rendered as a hardware or thin instance batch.
|
|
274
|
+
* @param attributes The attributes used to compile the material.
|
|
275
|
+
* @param _scene The scene containing the mesh.
|
|
276
|
+
* @param mesh The mesh being compiled.
|
|
277
|
+
*/
|
|
278
|
+
getAttributes(attributes, _scene, mesh) {
|
|
279
|
+
const source = mesh instanceof InstancedMesh ? mesh.sourceMesh : mesh;
|
|
280
|
+
if (!(source instanceof Mesh)) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (source.instances.length > 0) {
|
|
284
|
+
this._ensureInstancedBuffer(source);
|
|
285
|
+
}
|
|
286
|
+
if (source.hasThinInstances) {
|
|
287
|
+
this._ensureThinInstanceBuffer(source);
|
|
288
|
+
}
|
|
289
|
+
if (source.instances.length > 0 || source.hasThinInstances) {
|
|
290
|
+
attributes.push(this._getInstanceAttributeName());
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Gets the uniforms used by the plugin.
|
|
295
|
+
* @returns The external uniform names.
|
|
296
|
+
*/
|
|
297
|
+
getUniforms() {
|
|
298
|
+
return {
|
|
299
|
+
externalUniforms: ["ditheredFadeSettings"],
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Gets the shader code injected by the plugin.
|
|
304
|
+
* @param shaderType The shader stage being customized.
|
|
305
|
+
* @param shaderLanguage The material shader language.
|
|
306
|
+
* @returns Fragment customizations, or null for the vertex stage.
|
|
307
|
+
*/
|
|
308
|
+
getCustomCode(shaderType, shaderLanguage = 0 /* ShaderLanguage.GLSL */) {
|
|
309
|
+
if (shaderType !== "fragment") {
|
|
310
|
+
const instanceAttributeName = this._getInstanceAttributeName();
|
|
311
|
+
if (shaderType !== "vertex") {
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
if (shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
315
|
+
return {
|
|
316
|
+
CUSTOM_VERTEX_DEFINITIONS: `
|
|
317
|
+
#ifdef INSTANCES
|
|
318
|
+
attribute ${instanceAttributeName}: vec4f;
|
|
319
|
+
#endif
|
|
320
|
+
varying vDitheredTileFade: vec4f;
|
|
321
|
+
`,
|
|
322
|
+
CUSTOM_VERTEX_MAIN_BEGIN: `
|
|
323
|
+
#ifdef INSTANCES
|
|
324
|
+
vertexOutputs.vDitheredTileFade = input.${instanceAttributeName};
|
|
325
|
+
#else
|
|
326
|
+
vertexOutputs.vDitheredTileFade = vec4f(0.0);
|
|
327
|
+
#endif
|
|
328
|
+
`,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
return {
|
|
332
|
+
CUSTOM_VERTEX_DEFINITIONS: `
|
|
333
|
+
#ifdef INSTANCES
|
|
334
|
+
attribute vec4 ${instanceAttributeName};
|
|
335
|
+
#endif
|
|
336
|
+
varying vec4 vDitheredTileFade;
|
|
337
|
+
`,
|
|
338
|
+
CUSTOM_VERTEX_MAIN_BEGIN: `
|
|
339
|
+
#ifdef INSTANCES
|
|
340
|
+
vDitheredTileFade = ${instanceAttributeName};
|
|
341
|
+
#else
|
|
342
|
+
vDitheredTileFade = vec4(0.0);
|
|
343
|
+
#endif
|
|
344
|
+
`,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
if (shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
348
|
+
return {
|
|
349
|
+
CUSTOM_FRAGMENT_DEFINITIONS: `
|
|
350
|
+
#include<bayerDitherFunctions>
|
|
351
|
+
uniform ditheredFadeSettings: vec4f;
|
|
352
|
+
varying vDitheredTileFade: vec4f;
|
|
353
|
+
|
|
354
|
+
fn shouldDiscardDitheredTileFragment(position: vec2f, materialSettings: vec4f, instanceSettings: vec4f) -> bool {
|
|
355
|
+
var bounds = materialSettings.xy;
|
|
356
|
+
#ifdef INSTANCES
|
|
357
|
+
if (instanceSettings.z > 0.5 && instanceSettings.w == materialSettings.w) {
|
|
358
|
+
bounds = instanceSettings.xy;
|
|
359
|
+
}
|
|
360
|
+
#endif
|
|
361
|
+
let ditheredFadeSample = bayerDither8(floor(position)) / 64.0;
|
|
362
|
+
return materialSettings.z > 0.5 && (ditheredFadeSample < bounds.x || ditheredFadeSample >= bounds.y);
|
|
363
|
+
}
|
|
364
|
+
`,
|
|
365
|
+
CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `
|
|
366
|
+
if (shouldDiscardDitheredTileFragment(fragmentInputs.position.xy, uniforms.ditheredFadeSettings, fragmentInputs.vDitheredTileFade)) {
|
|
367
|
+
discard;
|
|
368
|
+
}
|
|
369
|
+
`,
|
|
370
|
+
[DepthPrePassInjectionPoint]: `
|
|
371
|
+
#ifdef DEPTHPREPASS
|
|
372
|
+
if (shouldDiscardDitheredTileFragment(fragmentInputs.position.xy, uniforms.ditheredFadeSettings, fragmentInputs.vDitheredTileFade)) {
|
|
373
|
+
discard;
|
|
374
|
+
}
|
|
375
|
+
#endif
|
|
376
|
+
#include<depthPrePass>
|
|
377
|
+
`,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
CUSTOM_FRAGMENT_DEFINITIONS: `
|
|
382
|
+
#include<bayerDitherFunctions>
|
|
383
|
+
uniform vec4 ditheredFadeSettings;
|
|
384
|
+
varying vec4 vDitheredTileFade;
|
|
385
|
+
|
|
386
|
+
bool shouldDiscardDitheredTileFragment(vec2 position, vec4 materialSettings, vec4 instanceSettings) {
|
|
387
|
+
vec2 bounds = materialSettings.xy;
|
|
388
|
+
#ifdef INSTANCES
|
|
389
|
+
if (instanceSettings.z > 0.5 && instanceSettings.w == materialSettings.w) {
|
|
390
|
+
bounds = instanceSettings.xy;
|
|
391
|
+
}
|
|
392
|
+
#endif
|
|
393
|
+
float ditheredFadeSample = bayerDither8(floor(position)) / 64.0;
|
|
394
|
+
return materialSettings.z > 0.5 && (ditheredFadeSample < bounds.x || ditheredFadeSample >= bounds.y);
|
|
395
|
+
}
|
|
396
|
+
`,
|
|
397
|
+
CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `
|
|
398
|
+
if (shouldDiscardDitheredTileFragment(gl_FragCoord.xy, ditheredFadeSettings, vDitheredTileFade)) {
|
|
399
|
+
discard;
|
|
400
|
+
}
|
|
401
|
+
`,
|
|
402
|
+
[DepthPrePassInjectionPoint]: `
|
|
403
|
+
#ifdef DEPTHPREPASS
|
|
404
|
+
if (shouldDiscardDitheredTileFragment(gl_FragCoord.xy, ditheredFadeSettings, vDitheredTileFade)) {
|
|
405
|
+
discard;
|
|
406
|
+
}
|
|
407
|
+
#endif
|
|
408
|
+
#include<depthPrePass>
|
|
409
|
+
`,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Gets the class name.
|
|
414
|
+
* @returns The class name.
|
|
415
|
+
*/
|
|
416
|
+
getClassName() {
|
|
417
|
+
return "DitheredTileFadeMaterialPlugin";
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Releases all weakly held runtime fade state and disables fading.
|
|
421
|
+
*
|
|
422
|
+
* The plugin remains attached to its material and can be reused through {@link GetOrCreate}.
|
|
423
|
+
*/
|
|
424
|
+
dispose() {
|
|
425
|
+
this.reset();
|
|
426
|
+
this._isEnabled = false;
|
|
427
|
+
}
|
|
428
|
+
static _ValidateNewPlugin(material) {
|
|
429
|
+
DitheredTileFadeMaterialPlugin._ValidateMaterial(material);
|
|
430
|
+
if (material.pluginManager?.getPlugin(DitheredTileFadeMaterialPlugin.Name)) {
|
|
431
|
+
throw new Error(`The material "${material.name}" already has a plugin named "${DitheredTileFadeMaterialPlugin.Name}". Use GetOrCreate to reuse it.`);
|
|
432
|
+
}
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
static _ValidateMaterial(material) {
|
|
436
|
+
if (!(material instanceof StandardMaterial) && !(material instanceof PBRBaseMaterial)) {
|
|
437
|
+
throw new TypeError("DitheredTileFadeMaterialPlugin supports only StandardMaterial and PBRBaseMaterial-derived materials.");
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
_validateMesh(mesh) {
|
|
441
|
+
if (!(mesh instanceof Mesh) && !(mesh instanceof InstancedMesh)) {
|
|
442
|
+
throw new TypeError("DitheredTileFadeMaterialPlugin supports only Mesh and InstancedMesh objects.");
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
_validateThinInstanceIndex(mesh, index) {
|
|
446
|
+
RegisterThinInstanceMesh();
|
|
447
|
+
if (!Number.isInteger(index) || index < 0 || index >= mesh.thinInstanceCount) {
|
|
448
|
+
throw new RangeError(`index must identify one of the mesh's ${mesh.thinInstanceCount} thin instances.`);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
_getInstanceAttributeName() {
|
|
452
|
+
return `ditheredTileFade${this._material.uniqueId}`;
|
|
453
|
+
}
|
|
454
|
+
_ensureInstancedBuffer(source) {
|
|
455
|
+
if (this._instancedBufferSources.has(source)) {
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
RegisterInstancedMesh();
|
|
459
|
+
source.registerInstancedBuffer(this._getInstanceAttributeName(), 4);
|
|
460
|
+
this._instancedBufferSources.add(source);
|
|
461
|
+
}
|
|
462
|
+
_ensureThinInstanceBuffer(source) {
|
|
463
|
+
const requiredLength = source.thinInstanceCount * 4;
|
|
464
|
+
const existingBuffer = this._thinInstanceFadeBuffers.get(source);
|
|
465
|
+
if (existingBuffer && existingBuffer.length >= requiredLength) {
|
|
466
|
+
return existingBuffer;
|
|
467
|
+
}
|
|
468
|
+
RegisterThinInstanceMesh();
|
|
469
|
+
const buffer = new Float32Array(Math.max(requiredLength, 32 * 4));
|
|
470
|
+
if (existingBuffer) {
|
|
471
|
+
buffer.set(existingBuffer);
|
|
472
|
+
}
|
|
473
|
+
source.thinInstanceSetBuffer(this._getInstanceAttributeName(), buffer, 4, false);
|
|
474
|
+
this._thinInstanceFadeBuffers.set(source, buffer);
|
|
475
|
+
return buffer;
|
|
476
|
+
}
|
|
477
|
+
_updateInstancedFadeBounds(mesh, lowerBound, upperBound, configured) {
|
|
478
|
+
const source = mesh instanceof InstancedMesh ? mesh.sourceMesh : mesh;
|
|
479
|
+
if (mesh instanceof InstancedMesh || source.instances.length > 0) {
|
|
480
|
+
this._ensureInstancedBuffer(source);
|
|
481
|
+
const current = mesh.instancedBuffers[this._getInstanceAttributeName()];
|
|
482
|
+
if (current instanceof Vector4) {
|
|
483
|
+
current.set(lowerBound, upperBound, configured ? 1 : 0, this._generation);
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
mesh.instancedBuffers[this._getInstanceAttributeName()] = new Vector4(lowerBound, upperBound, configured ? 1 : 0, this._generation);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
_validateBound(value, name) {
|
|
491
|
+
if (!Number.isFinite(value) || value < 0 || value > 1) {
|
|
492
|
+
throw new RangeError(`${name} must be a finite number in the range [0, 1].`);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
async _loadShaderIncludeAsync(shaderLanguage) {
|
|
496
|
+
try {
|
|
497
|
+
await _LoadShaderIncludeAsync(shaderLanguage);
|
|
498
|
+
this._shaderIncludeReady = true;
|
|
499
|
+
}
|
|
500
|
+
catch (error) {
|
|
501
|
+
this._shaderIncludeError = error;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* The name used to register the plugin on a material.
|
|
507
|
+
*/
|
|
508
|
+
DitheredTileFadeMaterialPlugin.Name = "DitheredTileFade";
|
|
509
|
+
//# sourceMappingURL=ditheredTileFadeMaterialPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ditheredTileFadeMaterialPlugin.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/ditheredTileFadeMaterialPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { type AbstractEngine } from \"../Engines/abstractEngine.pure\";\r\nimport { type AbstractMesh } from \"../Meshes/abstractMesh.pure\";\r\nimport { InstancedMesh, RegisterInstancedMesh } from \"../Meshes/instancedMesh.pure\";\r\nimport { Mesh } from \"../Meshes/mesh.pure\";\r\nimport { type SubMesh } from \"../Meshes/subMesh.pure\";\r\nimport { RegisterThinInstanceMesh } from \"../Meshes/thinInstanceMesh.pure\";\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { type Nullable } from \"../types\";\r\nimport { Vector4 } from \"../Maths/math.vector.pure\";\r\nimport { MaterialPluginBase } from \"./materialPluginBase.pure\";\r\nimport { type MaterialDefines } from \"./materialDefines\";\r\nimport { PBRBaseMaterial } from \"./PBR/pbrBaseMaterial.pure\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\nimport { StandardMaterial } from \"./standardMaterial.pure\";\r\nimport { type UniformBuffer } from \"./uniformBuffer\";\r\n\r\n/**\r\n * The material families supported by {@link DitheredTileFadeMaterialPlugin}.\r\n */\r\nexport type DitheredTileFadeSupportedMaterial = StandardMaterial | PBRBaseMaterial;\r\n\r\n/**\r\n * The mesh types that can store independent dithered tile fade bounds.\r\n */\r\nexport type DitheredTileFadeMesh = Mesh | InstancedMesh;\r\n\r\n/**\r\n * Defines a normalized interval in the 8x8 Bayer threshold domain.\r\n */\r\nexport interface IDitheredTileFadeBounds {\r\n /**\r\n * The inclusive lower bound.\r\n */\r\n lowerBound: number;\r\n\r\n /**\r\n * The exclusive upper bound.\r\n */\r\n upperBound: number;\r\n}\r\n\r\nlet GlslShaderLoadPromise: Promise<void> | undefined;\r\nlet WgslShaderLoadPromise: Promise<void> | undefined;\r\nconst DepthPrePassInjectionPoint = \"!#include<depthPrePass>\";\r\n\r\nasync function _LoadGlslShaderIncludeAsync(): Promise<void> {\r\n await import(\"../Shaders/ShadersInclude/bayerDitherFunctions\");\r\n}\r\n\r\nasync function _LoadWgslShaderIncludeAsync(): Promise<void> {\r\n await import(\"../ShadersWGSL/ShadersInclude/bayerDitherFunctions\");\r\n}\r\n\r\nasync function _LoadShaderIncludeAsync(shaderLanguage: ShaderLanguage): Promise<void> {\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n WgslShaderLoadPromise ??= _LoadWgslShaderIncludeAsync();\r\n await WgslShaderLoadPromise;\r\n return;\r\n }\r\n\r\n GlslShaderLoadPromise ??= _LoadGlslShaderIncludeAsync();\r\n await GlslShaderLoadPromise;\r\n}\r\n\r\n/**\r\n * Applies an opaque, screen-space dithered fade for tile LOD meshes that share a Standard or PBR material.\r\n *\r\n * The plugin keeps depth writing and the material's alpha mode unchanged. It affects the material color and integrated\r\n * prepass outputs, but not standalone depth, shadow, picking, outline, or custom passes. Tile renderers using those passes\r\n * must provide equivalent pass-specific coverage or exclude fading tiles from them.\r\n *\r\n * Per-mesh bounds are runtime state. Material cloning and serialization do not copy them; use {@link copyToMaterial} to\r\n * copy the enabled state to a cloned material and then configure bounds for the cloned tile meshes.\r\n * @see https://playground.babylonjs.com/#HI17VI#0\r\n */\r\nexport class DitheredTileFadeMaterialPlugin extends MaterialPluginBase {\r\n /**\r\n * The name used to register the plugin on a material.\r\n */\r\n public static readonly Name = \"DitheredTileFade\";\r\n\r\n private _meshBounds = new WeakMap<AbstractMesh, IDitheredTileFadeBounds>();\r\n private _instancedBufferSources = new WeakSet<Mesh>();\r\n private _thinInstanceFadeBuffers = new WeakMap<Mesh, Float32Array>();\r\n private _generation = 1;\r\n private _isEnabled = true;\r\n private _shaderIncludeReady = false;\r\n private _shaderIncludeError: unknown;\r\n\r\n /**\r\n * Gets whether configured fades are applied. Disabling the plugin makes every mesh fully visible without discarding its stored bounds.\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n /**\r\n * Sets whether configured fades are applied. This uniform-only change does not recompile the material.\r\n */\r\n public set isEnabled(value: boolean) {\r\n this._isEnabled = value;\r\n }\r\n\r\n /**\r\n * Creates and attaches a dithered fade plugin.\r\n * @param material The Standard or PBR material that the plugin will extend.\r\n * @throws If the material is unsupported or already has a dithered tile fade plugin. Use {@link GetOrCreate} when reuse is intended.\r\n */\r\n public constructor(material: DitheredTileFadeSupportedMaterial) {\r\n super(material, DitheredTileFadeMaterialPlugin.Name, 190, undefined, DitheredTileFadeMaterialPlugin._ValidateNewPlugin(material), false, true);\r\n\r\n this.registerForExtraEvents = true;\r\n this.doNotSerialize = true;\r\n void this._loadShaderIncludeAsync(material.shaderLanguage);\r\n this._enable(true);\r\n }\r\n\r\n /**\r\n * Gets the plugin already attached to a material, or creates and attaches one.\r\n * @param material The Standard or PBR material to extend.\r\n * @returns The material's dithered fade plugin.\r\n * @throws If the material is unsupported or another plugin uses the reserved plugin name.\r\n */\r\n public static GetOrCreate(material: DitheredTileFadeSupportedMaterial): DitheredTileFadeMaterialPlugin {\r\n DitheredTileFadeMaterialPlugin._ValidateMaterial(material);\r\n const existing = material.pluginManager?.getPlugin(DitheredTileFadeMaterialPlugin.Name);\r\n if (existing) {\r\n if (!(existing instanceof DitheredTileFadeMaterialPlugin)) {\r\n throw new Error(`The material \"${material.name}\" already has an incompatible plugin named \"${DitheredTileFadeMaterialPlugin.Name}\".`);\r\n }\r\n return existing;\r\n }\r\n return new DitheredTileFadeMaterialPlugin(material);\r\n }\r\n\r\n /**\r\n * Checks whether the plugin supports a shader language.\r\n * @param shaderLanguage The shader language to check.\r\n * @returns True for GLSL and WGSL.\r\n */\r\n public override isCompatible(shaderLanguage: ShaderLanguage): boolean {\r\n return shaderLanguage === ShaderLanguage.GLSL || shaderLanguage === ShaderLanguage.WGSL;\r\n }\r\n\r\n /**\r\n * Sets both normalized Bayer interval bounds for a mesh.\r\n * @param mesh The tile mesh or hardware instance whose draw calls use the bounds.\r\n * @param lowerBound The inclusive lower bound in the range [0, 1].\r\n * @param upperBound The exclusive upper bound in the range [0, 1].\r\n * @remarks Bounds are independent. A lower bound greater than or equal to the upper bound intentionally produces an empty interval.\r\n */\r\n public setFadeBounds(mesh: DitheredTileFadeMesh, lowerBound: number, upperBound: number): void {\r\n this._validateMesh(mesh);\r\n this._validateBound(lowerBound, \"lowerBound\");\r\n this._validateBound(upperBound, \"upperBound\");\r\n\r\n const bounds = this._meshBounds.get(mesh);\r\n if (bounds) {\r\n bounds.lowerBound = lowerBound;\r\n bounds.upperBound = upperBound;\r\n } else {\r\n this._meshBounds.set(mesh, { lowerBound, upperBound });\r\n }\r\n\r\n this._updateInstancedFadeBounds(mesh, lowerBound, upperBound, true);\r\n }\r\n\r\n /**\r\n * Sets the normalized inclusive lower Bayer interval bound for a mesh.\r\n * @param mesh The tile mesh or hardware instance whose draw calls use the bound.\r\n * @param lowerBound The inclusive lower bound in the range [0, 1].\r\n */\r\n public setFadeLowerBound(mesh: DitheredTileFadeMesh, lowerBound: number): void {\r\n this.setFadeBounds(mesh, lowerBound, this._meshBounds.get(mesh)?.upperBound ?? 1);\r\n }\r\n\r\n /**\r\n * Sets the normalized exclusive upper Bayer interval bound for a mesh.\r\n * @param mesh The tile mesh or hardware instance whose draw calls use the bound.\r\n * @param upperBound The exclusive upper bound in the range [0, 1].\r\n */\r\n public setFadeUpperBound(mesh: DitheredTileFadeMesh, upperBound: number): void {\r\n this.setFadeBounds(mesh, this._meshBounds.get(mesh)?.lowerBound ?? 0, upperBound);\r\n }\r\n\r\n /**\r\n * Copies a mesh's current bounds without allocating.\r\n * @param mesh The mesh whose bounds are queried.\r\n * @param result The object that receives the bounds.\r\n * @returns True when the mesh has explicit bounds. Otherwise false is returned with the source mesh's bounds for a hardware instance, or [0, 1].\r\n */\r\n public getFadeBoundsToRef(mesh: DitheredTileFadeMesh, result: IDitheredTileFadeBounds): boolean {\r\n this._validateMesh(mesh);\r\n const explicitBounds = this._meshBounds.get(mesh);\r\n const bounds = explicitBounds ?? (mesh instanceof InstancedMesh ? this._meshBounds.get(mesh.sourceMesh) : undefined);\r\n result.lowerBound = bounds?.lowerBound ?? 0;\r\n result.upperBound = bounds?.upperBound ?? 1;\r\n return explicitBounds !== undefined;\r\n }\r\n\r\n /**\r\n * Removes a mesh's explicit bounds. A hardware instance inherits its source mesh's bounds; a source mesh uses [0, 1].\r\n * @param mesh The mesh to reset.\r\n */\r\n public resetFade(mesh: DitheredTileFadeMesh): void {\r\n this._validateMesh(mesh);\r\n this._meshBounds.delete(mesh);\r\n this._updateInstancedFadeBounds(mesh, 0, 1, false);\r\n }\r\n\r\n /**\r\n * Sets normalized Bayer interval bounds for one thin instance.\r\n * @param mesh The source mesh containing the thin instance.\r\n * @param index The thin instance index.\r\n * @param lowerBound The inclusive lower bound in the range [0, 1].\r\n * @param upperBound The exclusive upper bound in the range [0, 1].\r\n * @param refresh Whether to immediately upload the updated attribute buffer.\r\n */\r\n public setThinInstanceFadeBounds(mesh: Mesh, index: number, lowerBound: number, upperBound: number, refresh = true): void {\r\n this._validateBound(lowerBound, \"lowerBound\");\r\n this._validateBound(upperBound, \"upperBound\");\r\n this._validateThinInstanceIndex(mesh, index);\r\n const buffer = this._ensureThinInstanceBuffer(mesh);\r\n const offset = index * 4;\r\n buffer[offset] = lowerBound;\r\n buffer[offset + 1] = upperBound;\r\n buffer[offset + 2] = 1;\r\n buffer[offset + 3] = this._generation;\r\n if (refresh) {\r\n this.commitThinInstanceFadeBounds(mesh);\r\n }\r\n }\r\n\r\n /**\r\n * Sets normalized Bayer interval bounds for all thin instances from packed lower/upper pairs.\r\n * @param mesh The source mesh containing the thin instances.\r\n * @param bounds Packed lower/upper pairs, with two values per thin instance.\r\n */\r\n public setThinInstanceFadeBoundsBuffer(mesh: Mesh, bounds: Float32Array): void {\r\n RegisterThinInstanceMesh();\r\n const instanceCount = mesh.thinInstanceCount;\r\n if (bounds.length !== instanceCount * 2) {\r\n throw new RangeError(`bounds must contain exactly ${instanceCount * 2} values.`);\r\n }\r\n\r\n for (let index = 0; index < instanceCount; index++) {\r\n const lowerBound = bounds[index * 2];\r\n const upperBound = bounds[index * 2 + 1];\r\n this._validateBound(lowerBound, `bounds[${index * 2}]`);\r\n this._validateBound(upperBound, `bounds[${index * 2 + 1}]`);\r\n }\r\n\r\n const attributeData = this._ensureThinInstanceBuffer(mesh);\r\n for (let index = 0; index < instanceCount; index++) {\r\n const attributeOffset = index * 4;\r\n attributeData[attributeOffset] = bounds[index * 2];\r\n attributeData[attributeOffset + 1] = bounds[index * 2 + 1];\r\n attributeData[attributeOffset + 2] = 1;\r\n attributeData[attributeOffset + 3] = this._generation;\r\n }\r\n\r\n this.commitThinInstanceFadeBounds(mesh);\r\n }\r\n\r\n /**\r\n * Uploads thin-instance fade changes after one or more setters used `refresh = false`.\r\n * @param mesh The source mesh whose fade attribute buffer changed.\r\n */\r\n public commitThinInstanceFadeBounds(mesh: Mesh): void {\r\n if (!this._thinInstanceFadeBuffers.has(mesh)) {\r\n throw new Error(\"No thin-instance fade buffer has been created for this mesh.\");\r\n }\r\n mesh.thinInstanceBufferUpdated(this._getInstanceAttributeName());\r\n }\r\n\r\n /**\r\n * Removes one thin instance's explicit bounds so it inherits the source mesh's bounds.\r\n * @param mesh The source mesh containing the thin instance.\r\n * @param index The thin instance index.\r\n * @param refresh Whether to immediately upload the updated attribute buffer.\r\n */\r\n public resetThinInstanceFade(mesh: Mesh, index: number, refresh = true): void {\r\n this._validateThinInstanceIndex(mesh, index);\r\n const buffer = this._ensureThinInstanceBuffer(mesh);\r\n const offset = index * 4;\r\n buffer[offset] = 0;\r\n buffer[offset + 1] = 1;\r\n buffer[offset + 2] = 0;\r\n buffer[offset + 3] = this._generation;\r\n if (refresh) {\r\n this.commitThinInstanceFadeBounds(mesh);\r\n }\r\n }\r\n\r\n /**\r\n * Removes all explicit mesh bounds while keeping the plugin enabled.\r\n */\r\n public reset(): void {\r\n this._meshBounds = new WeakMap();\r\n this._generation++;\r\n }\r\n\r\n /**\r\n * Copies material-level configuration to another supported material.\r\n *\r\n * Per-mesh bounds are intentionally not copied because they belong to the source tile meshes.\r\n * @param material The destination material, including a material clone.\r\n * @returns The destination material's dithered tile fade plugin.\r\n */\r\n public copyToMaterial(material: DitheredTileFadeSupportedMaterial): DitheredTileFadeMaterialPlugin {\r\n const plugin = DitheredTileFadeMaterialPlugin.GetOrCreate(material);\r\n plugin.isEnabled = this._isEnabled;\r\n return plugin;\r\n }\r\n\r\n /** @internal */\r\n public override isReadyForSubMesh(_defines: MaterialDefines, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): boolean {\r\n if (this._shaderIncludeError) {\r\n throw this._shaderIncludeError;\r\n }\r\n return this._shaderIncludeReady;\r\n }\r\n\r\n /**\r\n * Uploads the current mesh's bounds for every draw, including shared and frozen materials.\r\n * @param _uniformBuffer The material uniform buffer.\r\n * @param _scene The scene being rendered.\r\n * @param _engine The engine being used.\r\n * @param subMesh The submesh being bound.\r\n */\r\n public override hardBindForSubMesh(_uniformBuffer: UniformBuffer, _scene: Scene, _engine: AbstractEngine, subMesh: SubMesh): void {\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n const mesh = subMesh.getMesh();\r\n const bounds = this._meshBounds.get(mesh);\r\n effect.setFloat4(\"ditheredFadeSettings\", bounds?.lowerBound ?? 0, bounds?.upperBound ?? 1, this._isEnabled ? 1 : 0, this._generation);\r\n }\r\n\r\n /**\r\n * Registers the per-instance fade attribute when a mesh is rendered as a hardware or thin instance batch.\r\n * @param attributes The attributes used to compile the material.\r\n * @param _scene The scene containing the mesh.\r\n * @param mesh The mesh being compiled.\r\n */\r\n public override getAttributes(attributes: string[], _scene: Scene, mesh: AbstractMesh): void {\r\n const source = mesh instanceof InstancedMesh ? mesh.sourceMesh : mesh;\r\n if (!(source instanceof Mesh)) {\r\n return;\r\n }\r\n\r\n if (source.instances.length > 0) {\r\n this._ensureInstancedBuffer(source);\r\n }\r\n if (source.hasThinInstances) {\r\n this._ensureThinInstanceBuffer(source);\r\n }\r\n if (source.instances.length > 0 || source.hasThinInstances) {\r\n attributes.push(this._getInstanceAttributeName());\r\n }\r\n }\r\n\r\n /**\r\n * Gets the uniforms used by the plugin.\r\n * @returns The external uniform names.\r\n */\r\n public override getUniforms(): { externalUniforms: string[] } {\r\n return {\r\n externalUniforms: [\"ditheredFadeSettings\"],\r\n };\r\n }\r\n\r\n /**\r\n * Gets the shader code injected by the plugin.\r\n * @param shaderType The shader stage being customized.\r\n * @param shaderLanguage The material shader language.\r\n * @returns Fragment customizations, or null for the vertex stage.\r\n */\r\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL): Nullable<{ [pointName: string]: string }> {\r\n if (shaderType !== \"fragment\") {\r\n const instanceAttributeName = this._getInstanceAttributeName();\r\n if (shaderType !== \"vertex\") {\r\n return null;\r\n }\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n return {\r\n CUSTOM_VERTEX_DEFINITIONS: `\r\n#ifdef INSTANCES\r\nattribute ${instanceAttributeName}: vec4f;\r\n#endif\r\nvarying vDitheredTileFade: vec4f;\r\n`,\r\n CUSTOM_VERTEX_MAIN_BEGIN: `\r\n#ifdef INSTANCES\r\nvertexOutputs.vDitheredTileFade = input.${instanceAttributeName};\r\n#else\r\nvertexOutputs.vDitheredTileFade = vec4f(0.0);\r\n#endif\r\n`,\r\n };\r\n }\r\n\r\n return {\r\n CUSTOM_VERTEX_DEFINITIONS: `\r\n#ifdef INSTANCES\r\nattribute vec4 ${instanceAttributeName};\r\n#endif\r\nvarying vec4 vDitheredTileFade;\r\n`,\r\n CUSTOM_VERTEX_MAIN_BEGIN: `\r\n#ifdef INSTANCES\r\nvDitheredTileFade = ${instanceAttributeName};\r\n#else\r\nvDitheredTileFade = vec4(0.0);\r\n#endif\r\n`,\r\n };\r\n }\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n#include<bayerDitherFunctions>\r\nuniform ditheredFadeSettings: vec4f;\r\nvarying vDitheredTileFade: vec4f;\r\n\r\nfn shouldDiscardDitheredTileFragment(position: vec2f, materialSettings: vec4f, instanceSettings: vec4f) -> bool {\r\n var bounds = materialSettings.xy;\r\n#ifdef INSTANCES\r\n if (instanceSettings.z > 0.5 && instanceSettings.w == materialSettings.w) {\r\n bounds = instanceSettings.xy;\r\n }\r\n#endif\r\n let ditheredFadeSample = bayerDither8(floor(position)) / 64.0;\r\n return materialSettings.z > 0.5 && (ditheredFadeSample < bounds.x || ditheredFadeSample >= bounds.y);\r\n}\r\n`,\r\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\r\nif (shouldDiscardDitheredTileFragment(fragmentInputs.position.xy, uniforms.ditheredFadeSettings, fragmentInputs.vDitheredTileFade)) {\r\n discard;\r\n}\r\n`,\r\n [DepthPrePassInjectionPoint]: `\r\n#ifdef DEPTHPREPASS\r\nif (shouldDiscardDitheredTileFragment(fragmentInputs.position.xy, uniforms.ditheredFadeSettings, fragmentInputs.vDitheredTileFade)) {\r\n discard;\r\n}\r\n#endif\r\n#include<depthPrePass>\r\n`,\r\n };\r\n }\r\n\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n#include<bayerDitherFunctions>\r\nuniform vec4 ditheredFadeSettings;\r\nvarying vec4 vDitheredTileFade;\r\n\r\nbool shouldDiscardDitheredTileFragment(vec2 position, vec4 materialSettings, vec4 instanceSettings) {\r\n vec2 bounds = materialSettings.xy;\r\n#ifdef INSTANCES\r\n if (instanceSettings.z > 0.5 && instanceSettings.w == materialSettings.w) {\r\n bounds = instanceSettings.xy;\r\n }\r\n#endif\r\n float ditheredFadeSample = bayerDither8(floor(position)) / 64.0;\r\n return materialSettings.z > 0.5 && (ditheredFadeSample < bounds.x || ditheredFadeSample >= bounds.y);\r\n}\r\n`,\r\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\r\nif (shouldDiscardDitheredTileFragment(gl_FragCoord.xy, ditheredFadeSettings, vDitheredTileFade)) {\r\n discard;\r\n}\r\n`,\r\n [DepthPrePassInjectionPoint]: `\r\n#ifdef DEPTHPREPASS\r\nif (shouldDiscardDitheredTileFragment(gl_FragCoord.xy, ditheredFadeSettings, vDitheredTileFade)) {\r\n discard;\r\n}\r\n#endif\r\n#include<depthPrePass>\r\n`,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the class name.\r\n * @returns The class name.\r\n */\r\n public override getClassName(): string {\r\n return \"DitheredTileFadeMaterialPlugin\";\r\n }\r\n\r\n /**\r\n * Releases all weakly held runtime fade state and disables fading.\r\n *\r\n * The plugin remains attached to its material and can be reused through {@link GetOrCreate}.\r\n */\r\n public override dispose(): void {\r\n this.reset();\r\n this._isEnabled = false;\r\n }\r\n\r\n private static _ValidateNewPlugin(material: DitheredTileFadeSupportedMaterial): true {\r\n DitheredTileFadeMaterialPlugin._ValidateMaterial(material);\r\n if (material.pluginManager?.getPlugin(DitheredTileFadeMaterialPlugin.Name)) {\r\n throw new Error(`The material \"${material.name}\" already has a plugin named \"${DitheredTileFadeMaterialPlugin.Name}\". Use GetOrCreate to reuse it.`);\r\n }\r\n return true;\r\n }\r\n\r\n private static _ValidateMaterial(material: DitheredTileFadeSupportedMaterial): void {\r\n if (!(material instanceof StandardMaterial) && !(material instanceof PBRBaseMaterial)) {\r\n throw new TypeError(\"DitheredTileFadeMaterialPlugin supports only StandardMaterial and PBRBaseMaterial-derived materials.\");\r\n }\r\n }\r\n\r\n private _validateMesh(mesh: AbstractMesh): asserts mesh is DitheredTileFadeMesh {\r\n if (!(mesh instanceof Mesh) && !(mesh instanceof InstancedMesh)) {\r\n throw new TypeError(\"DitheredTileFadeMaterialPlugin supports only Mesh and InstancedMesh objects.\");\r\n }\r\n }\r\n\r\n private _validateThinInstanceIndex(mesh: Mesh, index: number): void {\r\n RegisterThinInstanceMesh();\r\n if (!Number.isInteger(index) || index < 0 || index >= mesh.thinInstanceCount) {\r\n throw new RangeError(`index must identify one of the mesh's ${mesh.thinInstanceCount} thin instances.`);\r\n }\r\n }\r\n\r\n private _getInstanceAttributeName(): string {\r\n return `ditheredTileFade${this._material.uniqueId}`;\r\n }\r\n\r\n private _ensureInstancedBuffer(source: Mesh): void {\r\n if (this._instancedBufferSources.has(source)) {\r\n return;\r\n }\r\n\r\n RegisterInstancedMesh();\r\n source.registerInstancedBuffer(this._getInstanceAttributeName(), 4);\r\n this._instancedBufferSources.add(source);\r\n }\r\n\r\n private _ensureThinInstanceBuffer(source: Mesh): Float32Array {\r\n const requiredLength = source.thinInstanceCount * 4;\r\n const existingBuffer = this._thinInstanceFadeBuffers.get(source);\r\n if (existingBuffer && existingBuffer.length >= requiredLength) {\r\n return existingBuffer;\r\n }\r\n\r\n RegisterThinInstanceMesh();\r\n const buffer = new Float32Array(Math.max(requiredLength, 32 * 4));\r\n if (existingBuffer) {\r\n buffer.set(existingBuffer);\r\n }\r\n source.thinInstanceSetBuffer(this._getInstanceAttributeName(), buffer, 4, false);\r\n this._thinInstanceFadeBuffers.set(source, buffer);\r\n return buffer;\r\n }\r\n\r\n private _updateInstancedFadeBounds(mesh: DitheredTileFadeMesh, lowerBound: number, upperBound: number, configured: boolean): void {\r\n const source = mesh instanceof InstancedMesh ? mesh.sourceMesh : mesh;\r\n if (mesh instanceof InstancedMesh || source.instances.length > 0) {\r\n this._ensureInstancedBuffer(source);\r\n const current = mesh.instancedBuffers[this._getInstanceAttributeName()];\r\n if (current instanceof Vector4) {\r\n current.set(lowerBound, upperBound, configured ? 1 : 0, this._generation);\r\n } else {\r\n mesh.instancedBuffers[this._getInstanceAttributeName()] = new Vector4(lowerBound, upperBound, configured ? 1 : 0, this._generation);\r\n }\r\n }\r\n }\r\n\r\n private _validateBound(value: number, name: string): void {\r\n if (!Number.isFinite(value) || value < 0 || value > 1) {\r\n throw new RangeError(`${name} must be a finite number in the range [0, 1].`);\r\n }\r\n }\r\n\r\n private async _loadShaderIncludeAsync(shaderLanguage: ShaderLanguage): Promise<void> {\r\n try {\r\n await _LoadShaderIncludeAsync(shaderLanguage);\r\n this._shaderIncludeReady = true;\r\n } catch (error) {\r\n this._shaderIncludeError = error;\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -171,6 +171,10 @@ export interface EffectWrapperCreationOptions {
|
|
|
171
171
|
* Callback when effect is compiled
|
|
172
172
|
*/
|
|
173
173
|
onCompiled?: Nullable<(effect: Effect) => void>;
|
|
174
|
+
/**
|
|
175
|
+
* Callback when there is an error compiling the effect
|
|
176
|
+
*/
|
|
177
|
+
onError?: (effect: Effect, errors: string) => void;
|
|
174
178
|
/**
|
|
175
179
|
* The friendly name of the effect (default: "effectWrapper")
|
|
176
180
|
*/
|
|
@@ -226,6 +226,7 @@ export class EffectWrapper {
|
|
|
226
226
|
blockCompilation: creationOptions.blockCompilation || false,
|
|
227
227
|
shaderLanguage: creationOptions.shaderLanguage || 0 /* ShaderLanguage.GLSL */,
|
|
228
228
|
onCompiled: creationOptions.onCompiled || undefined,
|
|
229
|
+
onError: creationOptions.onError || undefined,
|
|
229
230
|
extraInitializations: creationOptions.extraInitializations || undefined,
|
|
230
231
|
extraInitializationsAsync: creationOptions.extraInitializationsAsync || undefined,
|
|
231
232
|
useAsPostProcess: creationOptions.useAsPostProcess ?? false,
|
|
@@ -352,7 +353,7 @@ export class EffectWrapper {
|
|
|
352
353
|
defines: defines !== null ? defines : "",
|
|
353
354
|
fallbacks: null,
|
|
354
355
|
onCompiled: onCompiled ?? this.options.onCompiled,
|
|
355
|
-
onError: onError ??
|
|
356
|
+
onError: onError ?? this.options.onError,
|
|
356
357
|
indexParameters: indexParameters || this.options.indexParameters,
|
|
357
358
|
processCodeAfterIncludes: customShaderCodeProcessing?.processCodeAfterIncludes
|
|
358
359
|
? (shaderType, code) => customShaderCodeProcessing.processCodeAfterIncludes(this.name, shaderType, code)
|
|
@@ -365,7 +366,7 @@ export class EffectWrapper {
|
|
|
365
366
|
}, this.options.engine);
|
|
366
367
|
}
|
|
367
368
|
else {
|
|
368
|
-
this._drawWrapper.effect = new Effect(this._shaderPath, this.options.attributeNames, uniforms || this.options.uniforms, samplers || this.options.samplerNames, this.options.engine, defines, undefined, onCompiled || this.options.onCompiled,
|
|
369
|
+
this._drawWrapper.effect = new Effect(this._shaderPath, this.options.attributeNames, uniforms || this.options.uniforms, samplers || this.options.samplerNames, this.options.engine, defines, undefined, onCompiled || this.options.onCompiled, onError ?? this.options.onError, undefined, undefined, this.options.shaderLanguage, extraInitializationsAsync);
|
|
369
370
|
}
|
|
370
371
|
this.onEffectCreatedObservable.notifyObservers(this._drawWrapper.effect);
|
|
371
372
|
}
|