@babylonjs/core 7.22.5 → 7.23.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.d.ts +4 -0
- package/Animations/animatable.js +21 -13
- package/Animations/animatable.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +41 -0
- package/Collisions/gpuPicker.js +181 -71
- package/Collisions/gpuPicker.js.map +1 -1
- package/Culling/ray.d.ts +6 -2
- package/Culling/ray.js +8 -2
- package/Culling/ray.js.map +1 -1
- package/Engines/Extensions/engine.cubeTexture.js +1 -1
- package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/Extensions/engine.renderTarget.d.ts +1 -1
- package/Engines/Extensions/engine.renderTarget.js +29 -36
- package/Engines/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.cubeTexture.js +1 -1
- package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTarget.d.ts +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTarget.js +11 -6
- package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/renderTargetWrapper.d.ts +3 -3
- package/Engines/renderTargetWrapper.js +3 -3
- package/Engines/renderTargetWrapper.js.map +1 -1
- package/Engines/thinEngine.d.ts +2 -1
- package/Engines/thinEngine.js +39 -9
- package/Engines/thinEngine.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.js +20 -9
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Layers/effectLayer.d.ts +1 -1
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/glowLayer.js +6 -1
- package/Layers/glowLayer.js.map +1 -1
- package/Layers/highlightLayer.js +6 -1
- package/Layers/highlightLayer.js.map +1 -1
- package/Loading/sceneLoader.d.ts +22 -27
- package/Loading/sceneLoader.js +102 -74
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/Node/Blocks/Dual/textureBlock.js +1 -1
- package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +4 -0
- package/Materials/Node/nodeMaterial.js +9 -2
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildStateSharedData.d.ts +5 -2
- package/Materials/Node/nodeMaterialBuildStateSharedData.js +12 -5
- package/Materials/Node/nodeMaterialBuildStateSharedData.js.map +1 -1
- package/Materials/uniformBuffer.d.ts +6 -0
- package/Materials/uniformBuffer.js +8 -0
- package/Materials/uniformBuffer.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +9 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +20 -3
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/meshUVSpaceRenderer.d.ts +2 -1
- package/Meshes/meshUVSpaceRenderer.js +16 -3
- package/Meshes/meshUVSpaceRenderer.js.map +1 -1
- package/Physics/physicsRaycastResult.d.ts +2 -0
- package/Physics/physicsRaycastResult.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.js +1 -1
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +8 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js +7 -8
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +1 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +37 -27
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +2 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +4 -3
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderer.d.ts +7 -9
- package/Rendering/fluidRenderer/fluidRenderer.js +16 -13
- package/Rendering/fluidRenderer/fluidRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +9 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.js +29 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +3 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +12 -2
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +3 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +3 -2
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.d.ts +9 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +22 -5
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTextures.d.ts +8 -1
- package/Rendering/fluidRenderer/fluidRenderingTextures.js +42 -5
- package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
- package/Rendering/fluidRenderer/index.d.ts +18 -0
- package/Rendering/fluidRenderer/index.js +18 -0
- package/Rendering/fluidRenderer/index.js.map +1 -1
- package/Shaders/ShadersInclude/lightFragment.js +12 -10
- package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
- package/Shaders/ShadersInclude/pbrHelperFunctions.js +2 -1
- package/Shaders/ShadersInclude/pbrHelperFunctions.js.map +1 -1
- package/Shaders/iblShadowVoxelTracing.fragment.js +1 -1
- package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
- package/Shaders/pbr.fragment.js +1 -1
- package/Shaders/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js +13 -11
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/fluidRenderingBilateralBlur.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingBilateralBlur.fragment.js +13 -0
- package/ShadersWGSL/fluidRenderingBilateralBlur.fragment.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.fragment.js +29 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.fragment.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +22 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.fragment.js +12 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.fragment.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +14 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.fragment.js +12 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.fragment.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +14 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -0
- package/ShadersWGSL/fluidRenderingRender.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingRender.fragment.js +101 -0
- package/ShadersWGSL/fluidRenderingRender.fragment.js.map +1 -0
- package/ShadersWGSL/fluidRenderingStandardBlur.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingStandardBlur.fragment.js +13 -0
- package/ShadersWGSL/fluidRenderingStandardBlur.fragment.js.map +1 -0
- package/Sprites/spriteRenderer.d.ts +1 -0
- package/Sprites/spriteRenderer.js +7 -2
- package/Sprites/spriteRenderer.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +11 -11
- package/scene.js +5 -5
- package/scene.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Scene } from \"core/scene\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { FloatArray, Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport type { IParticleSystem } from \"core/Particles/IParticleSystem\";\r\nimport type { ISceneComponent } from \"core/sceneComponent\";\r\nimport { SceneComponentConstants } from \"core/sceneComponent\";\r\nimport type { SmartArrayNoDuplicate } from \"core/Misc/smartArray\";\r\nimport type { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { Buffer } from \"core/Buffers/buffer\";\r\n\r\nimport type { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { FluidRenderingObjectParticleSystem } from \"./fluidRenderingObjectParticleSystem\";\r\nimport { FluidRenderingTargetRenderer } from \"./fluidRenderingTargetRenderer\";\r\nimport { FluidRenderingObjectCustomParticles } from \"./fluidRenderingObjectCustomParticles\";\r\nimport { FluidRenderingDepthTextureCopy } from \"./fluidRenderingDepthTextureCopy\";\r\n\r\nimport \"../../Shaders/fluidRenderingParticleDepth.vertex\";\r\nimport \"../../Shaders/fluidRenderingParticleDepth.fragment\";\r\nimport \"../../Shaders/fluidRenderingParticleThickness.vertex\";\r\nimport \"../../Shaders/fluidRenderingParticleThickness.fragment\";\r\nimport \"../../Shaders/fluidRenderingParticleDiffuse.vertex\";\r\nimport \"../../Shaders/fluidRenderingParticleDiffuse.fragment\";\r\nimport \"../../Shaders/fluidRenderingBilateralBlur.fragment\";\r\nimport \"../../Shaders/fluidRenderingStandardBlur.fragment\";\r\nimport \"../../Shaders/fluidRenderingRender.fragment\";\r\n\r\ndeclare module \"../../abstractScene\" {\r\n export interface AbstractScene {\r\n /** @internal (Backing field) */\r\n _fluidRenderer: Nullable<FluidRenderer>;\r\n\r\n /**\r\n * Gets or Sets the fluid renderer associated to the scene.\r\n */\r\n fluidRenderer: Nullable<FluidRenderer>;\r\n\r\n /**\r\n * Enables the fluid renderer and associates it with the scene\r\n * @returns the FluidRenderer\r\n */\r\n enableFluidRenderer(): Nullable<FluidRenderer>;\r\n\r\n /**\r\n * Disables the fluid renderer associated with the scene\r\n */\r\n disableFluidRenderer(): void;\r\n }\r\n}\r\n\r\nObject.defineProperty(Scene.prototype, \"fluidRenderer\", {\r\n get: function (this: Scene) {\r\n return this._fluidRenderer;\r\n },\r\n set: function (this: Scene, value: Nullable<FluidRenderer>) {\r\n this._fluidRenderer = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\nScene.prototype.enableFluidRenderer = function (): Nullable<FluidRenderer> {\r\n if (this._fluidRenderer) {\r\n return this._fluidRenderer;\r\n }\r\n\r\n this._fluidRenderer = new FluidRenderer(this);\r\n\r\n return this._fluidRenderer;\r\n};\r\n\r\nScene.prototype.disableFluidRenderer = function (): void {\r\n this._fluidRenderer?.dispose();\r\n this._fluidRenderer = null;\r\n};\r\n\r\ntype CameraMapForFluidRendering = [Array<FluidRenderingTargetRenderer>, { [key: string]: FluidRenderingDepthTextureCopy }];\r\n\r\nfunction IsParticleSystemObject(obj: FluidRenderingObject): obj is FluidRenderingObjectParticleSystem {\r\n return !!(obj as FluidRenderingObjectParticleSystem).particleSystem;\r\n}\r\n\r\nfunction IsCustomParticlesObject(obj: FluidRenderingObject): obj is FluidRenderingObjectCustomParticles {\r\n return !!(obj as FluidRenderingObjectCustomParticles).addBuffers;\r\n}\r\n\r\n/**\r\n * Defines the fluid renderer scene component responsible to render objects as fluids\r\n */\r\nexport class FluidRendererSceneComponent implements ISceneComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_FLUIDRENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {\r\n this.scene._gatherActiveCameraRenderTargetsStage.registerStep(\r\n SceneComponentConstants.STEP_GATHERACTIVECAMERARENDERTARGETS_FLUIDRENDERER,\r\n this,\r\n this._gatherActiveCameraRenderTargets\r\n );\r\n this.scene._afterCameraDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_FLUIDRENDERER, this, this._afterCameraDraw);\r\n }\r\n\r\n private _gatherActiveCameraRenderTargets(_renderTargets: SmartArrayNoDuplicate<RenderTargetTexture>): void {\r\n this.scene.fluidRenderer?._prepareRendering();\r\n }\r\n\r\n private _afterCameraDraw(camera: Camera) {\r\n this.scene.fluidRenderer?._render(camera);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n const fluidRenderer = this.scene.fluidRenderer;\r\n if (!fluidRenderer) {\r\n return;\r\n }\r\n\r\n const buffers = new Set<Buffer>();\r\n for (let i = 0; i < fluidRenderer.renderObjects.length; ++i) {\r\n const obj = fluidRenderer.renderObjects[i].object;\r\n if (IsCustomParticlesObject(obj)) {\r\n const vbuffers = obj.vertexBuffers;\r\n for (const name in vbuffers) {\r\n buffers.add(vbuffers[name].getWrapperBuffer());\r\n }\r\n }\r\n }\r\n\r\n buffers.forEach((buffer) => {\r\n buffer._rebuild();\r\n });\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources\r\n */\r\n public dispose(): void {\r\n this.scene.disableFluidRenderer();\r\n }\r\n}\r\n\r\n/**\r\n * An object rendered as a fluid.\r\n * It consists of the object itself as well as the render target renderer (which is used to generate the textures (render target) needed for fluid rendering)\r\n */\r\nexport interface IFluidRenderingRenderObject {\r\n /** object rendered as a fluid */\r\n object: FluidRenderingObject;\r\n /** target renderer used to render the fluid object */\r\n targetRenderer: FluidRenderingTargetRenderer;\r\n}\r\n\r\n/**\r\n * Class responsible for fluid rendering.\r\n * It is implementing the method described in https://developer.download.nvidia.com/presentations/2010/gdc/Direct3D_Effects.pdf\r\n */\r\nexport class FluidRenderer {\r\n /** @internal */\r\n public static _SceneComponentInitialization(scene: Scene) {\r\n let component = scene._getComponent(SceneComponentConstants.NAME_FLUIDRENDERER) as FluidRendererSceneComponent;\r\n if (!component) {\r\n component = new FluidRendererSceneComponent(scene);\r\n scene._addComponent(component);\r\n }\r\n }\r\n\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _onEngineResizeObserver: Nullable<Observer<AbstractEngine>>;\r\n private _cameras: Map<Camera, CameraMapForFluidRendering>;\r\n\r\n /** Retrieves all the render objects managed by the class */\r\n public readonly renderObjects: Array<IFluidRenderingRenderObject>;\r\n\r\n /** Retrieves all the render target renderers managed by the class */\r\n public readonly targetRenderers: FluidRenderingTargetRenderer[];\r\n\r\n /**\r\n * Initializes the class\r\n * @param scene Scene in which the objects are part of\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._onEngineResizeObserver = null;\r\n this.renderObjects = [];\r\n this.targetRenderers = [];\r\n this._cameras = new Map();\r\n\r\n FluidRenderer._SceneComponentInitialization(this._scene);\r\n\r\n this._onEngineResizeObserver = this._engine.onResizeObservable.add(() => {\r\n this._initialize();\r\n });\r\n }\r\n\r\n /**\r\n * Reinitializes the class\r\n * Can be used if you change the object priority (FluidRenderingObject.priority), to make sure the objects are rendered in the right order\r\n */\r\n public recreate(): void {\r\n this._sortRenderingObjects();\r\n this._initialize();\r\n }\r\n\r\n /**\r\n * Gets the render object corresponding to a particle system (null if the particle system is not rendered as a fluid)\r\n * @param ps The particle system\r\n * @returns the render object corresponding to this particle system if any, otherwise null\r\n */\r\n public getRenderObjectFromParticleSystem(ps: IParticleSystem): Nullable<IFluidRenderingRenderObject> {\r\n const index = this._getParticleSystemIndex(ps);\r\n return index !== -1 ? this.renderObjects[index] : null;\r\n }\r\n\r\n /**\r\n * Adds a particle system to the fluid renderer.\r\n * @param ps particle system\r\n * @param generateDiffuseTexture True if you want to generate a diffuse texture from the particle system and use it as part of the fluid rendering (default: false)\r\n * @param targetRenderer The target renderer used to display the particle system as a fluid. If not provided, the method will create a new one\r\n * @param camera The camera used by the target renderer (if the target renderer is created by the method)\r\n * @returns the render object corresponding to the particle system\r\n */\r\n public addParticleSystem(ps: IParticleSystem, generateDiffuseTexture?: boolean, targetRenderer?: FluidRenderingTargetRenderer, camera?: Camera): IFluidRenderingRenderObject {\r\n const object = new FluidRenderingObjectParticleSystem(this._scene, ps);\r\n\r\n object.onParticleSizeChanged.add(() => this._setParticleSizeForRenderTargets());\r\n\r\n if (!targetRenderer) {\r\n targetRenderer = new FluidRenderingTargetRenderer(this._scene, camera);\r\n this.targetRenderers.push(targetRenderer);\r\n }\r\n\r\n if (!targetRenderer._onUseVelocityChanged.hasObservers()) {\r\n targetRenderer._onUseVelocityChanged.add(() => this._setUseVelocityForRenderObject());\r\n }\r\n\r\n if (generateDiffuseTexture !== undefined) {\r\n targetRenderer.generateDiffuseTexture = generateDiffuseTexture;\r\n }\r\n\r\n const renderObject = { object, targetRenderer };\r\n\r\n this.renderObjects.push(renderObject);\r\n\r\n this._sortRenderingObjects();\r\n\r\n this._setParticleSizeForRenderTargets();\r\n\r\n return renderObject;\r\n }\r\n\r\n /**\r\n * Adds a custom particle set to the fluid renderer.\r\n * @param buffers The list of buffers (should contain at least a \"position\" buffer!)\r\n * @param numParticles Number of particles in each buffer\r\n * @param generateDiffuseTexture True if you want to generate a diffuse texture from buffers and use it as part of the fluid rendering (default: false). For the texture to be generated correctly, you need a \"color\" buffer in the set!\r\n * @param targetRenderer The target renderer used to display the particle system as a fluid. If not provided, the method will create a new one\r\n * @param camera The camera used by the target renderer (if the target renderer is created by the method)\r\n * @returns the render object corresponding to the custom particle set\r\n */\r\n public addCustomParticles(\r\n buffers: { [key: string]: FloatArray },\r\n numParticles: number,\r\n generateDiffuseTexture?: boolean,\r\n targetRenderer?: FluidRenderingTargetRenderer,\r\n camera?: Camera\r\n ): IFluidRenderingRenderObject {\r\n const object = new FluidRenderingObjectCustomParticles(this._scene, buffers, numParticles);\r\n\r\n object.onParticleSizeChanged.add(() => this._setParticleSizeForRenderTargets());\r\n\r\n if (!targetRenderer) {\r\n targetRenderer = new FluidRenderingTargetRenderer(this._scene, camera);\r\n this.targetRenderers.push(targetRenderer);\r\n }\r\n\r\n if (!targetRenderer._onUseVelocityChanged.hasObservers()) {\r\n targetRenderer._onUseVelocityChanged.add(() => this._setUseVelocityForRenderObject());\r\n }\r\n\r\n if (generateDiffuseTexture !== undefined) {\r\n targetRenderer.generateDiffuseTexture = generateDiffuseTexture;\r\n }\r\n\r\n const renderObject = { object, targetRenderer };\r\n\r\n this.renderObjects.push(renderObject);\r\n\r\n this._sortRenderingObjects();\r\n\r\n this._setParticleSizeForRenderTargets();\r\n\r\n return renderObject;\r\n }\r\n\r\n /**\r\n * Removes a render object from the fluid renderer\r\n * @param renderObject the render object to remove\r\n * @param removeUnusedTargetRenderer True to remove/dispose of the target renderer if it's not used anymore (default: true)\r\n * @returns True if the render object has been found and released, else false\r\n */\r\n public removeRenderObject(renderObject: IFluidRenderingRenderObject, removeUnusedTargetRenderer = true): boolean {\r\n const index = this.renderObjects.indexOf(renderObject);\r\n if (index === -1) {\r\n return false;\r\n }\r\n\r\n renderObject.object.dispose();\r\n\r\n this.renderObjects.splice(index, 1);\r\n\r\n if (removeUnusedTargetRenderer && this._removeUnusedTargetRenderers()) {\r\n this._initialize();\r\n } else {\r\n this._setParticleSizeForRenderTargets();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _sortRenderingObjects(): void {\r\n this.renderObjects.sort((a, b) => {\r\n return a.object.priority < b.object.priority ? -1 : a.object.priority > b.object.priority ? 1 : 0;\r\n });\r\n }\r\n\r\n private _removeUnusedTargetRenderers(): boolean {\r\n const indexes: { [id: number]: boolean } = {};\r\n\r\n for (let i = 0; i < this.renderObjects.length; ++i) {\r\n const targetRenderer = this.renderObjects[i].targetRenderer;\r\n indexes[this.targetRenderers.indexOf(targetRenderer)] = true;\r\n }\r\n\r\n let removed = false;\r\n const newList: Array<FluidRenderingTargetRenderer> = [];\r\n for (let i = 0; i < this.targetRenderers.length; ++i) {\r\n if (!indexes[i]) {\r\n this.targetRenderers[i].dispose();\r\n removed = true;\r\n } else {\r\n newList.push(this.targetRenderers[i]);\r\n }\r\n }\r\n\r\n if (removed) {\r\n this.targetRenderers.length = 0;\r\n this.targetRenderers.push(...newList);\r\n }\r\n\r\n return removed;\r\n }\r\n\r\n private _getParticleSystemIndex(ps: IParticleSystem): number {\r\n for (let i = 0; i < this.renderObjects.length; ++i) {\r\n const obj = this.renderObjects[i].object;\r\n if (IsParticleSystemObject(obj) && obj.particleSystem === ps) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n private _initialize(): void {\r\n for (let i = 0; i < this.targetRenderers.length; ++i) {\r\n this.targetRenderers[i].dispose();\r\n }\r\n\r\n const cameras: Map<Camera, CameraMapForFluidRendering> = new Map();\r\n\r\n for (let i = 0; i < this.targetRenderers.length; ++i) {\r\n const targetRenderer = this.targetRenderers[i];\r\n\r\n targetRenderer._initialize();\r\n\r\n if (targetRenderer.camera && targetRenderer._renderPostProcess) {\r\n let list = cameras.get(targetRenderer.camera);\r\n if (!list) {\r\n list = [[], {}];\r\n cameras.set(targetRenderer.camera, list);\r\n }\r\n list[0].push(targetRenderer);\r\n targetRenderer.camera.attachPostProcess(targetRenderer._renderPostProcess, i);\r\n }\r\n }\r\n\r\n let iterator = cameras.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const camera = key.value;\r\n const list = cameras.get(camera)!;\r\n\r\n const firstPostProcess = camera._getFirstPostProcess();\r\n if (!firstPostProcess) {\r\n continue;\r\n }\r\n\r\n const [targetRenderers, copyDepthTextures] = list;\r\n\r\n firstPostProcess.onSizeChangedObservable.add(() => {\r\n if (!firstPostProcess.inputTexture.depthStencilTexture) {\r\n firstPostProcess.inputTexture.createDepthStencilTexture(\r\n 0,\r\n true,\r\n this._engine.isStencilEnable,\r\n targetRenderers[0].samples,\r\n this._engine.isStencilEnable ? Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 : Constants.TEXTUREFORMAT_DEPTH32_FLOAT,\r\n `PostProcessRTTDepthStencil-${firstPostProcess.name}`\r\n );\r\n }\r\n for (const targetRenderer of targetRenderers) {\r\n const thicknessRT = targetRenderer._thicknessRenderTarget?.renderTarget;\r\n const thicknessTexture = thicknessRT?.texture;\r\n if (thicknessRT && thicknessTexture) {\r\n const key = thicknessTexture.width + \"_\" + thicknessTexture.height;\r\n let copyDepthTexture = copyDepthTextures[key];\r\n if (!copyDepthTexture) {\r\n copyDepthTexture = copyDepthTextures[key] = new FluidRenderingDepthTextureCopy(this._engine, thicknessTexture.width, thicknessTexture.height);\r\n }\r\n copyDepthTexture.depthRTWrapper.shareDepth(thicknessRT);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Dispose the CopyDepthTexture instances that we don't need anymore\r\n iterator = this._cameras.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const camera = key.value;\r\n const list = this._cameras.get(camera)!;\r\n\r\n const copyDepthTextures = list[1];\r\n\r\n const list2 = cameras.get(camera);\r\n if (!list2) {\r\n for (const key in copyDepthTextures) {\r\n copyDepthTextures[key].dispose();\r\n }\r\n } else {\r\n for (const key in copyDepthTextures) {\r\n if (!list2[1][key]) {\r\n copyDepthTextures[key].dispose();\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._cameras.clear();\r\n this._cameras = cameras;\r\n\r\n this._setParticleSizeForRenderTargets();\r\n }\r\n\r\n private _setParticleSizeForRenderTargets(): void {\r\n const particleSizes = new Map<FluidRenderingTargetRenderer, number>();\r\n\r\n for (let i = 0; i < this.renderObjects.length; ++i) {\r\n const renderingObject = this.renderObjects[i];\r\n let curSize = particleSizes.get(renderingObject.targetRenderer);\r\n if (curSize === undefined) {\r\n curSize = 0;\r\n }\r\n particleSizes.set(renderingObject.targetRenderer, Math.max(curSize, renderingObject.object.particleSize));\r\n }\r\n\r\n particleSizes.forEach((particleSize, targetRenderer) => {\r\n if (targetRenderer._depthRenderTarget) {\r\n targetRenderer._depthRenderTarget.particleSize = particleSize;\r\n }\r\n });\r\n }\r\n\r\n private _setUseVelocityForRenderObject(): void {\r\n for (const renderingObject of this.renderObjects) {\r\n renderingObject.object.useVelocity = renderingObject.targetRenderer.useVelocity;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _prepareRendering(): void {\r\n for (const renderer of this.targetRenderers) {\r\n if (renderer.needInitialization) {\r\n this._initialize();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _render(forCamera?: Camera): void {\r\n for (let i = 0; i < this.targetRenderers.length; ++i) {\r\n if (!forCamera || this.targetRenderers[i].camera === forCamera) {\r\n this.targetRenderers[i]._clearTargets();\r\n }\r\n }\r\n\r\n const iterator = this._cameras.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const camera = key.value;\r\n const list = this._cameras.get(camera)!;\r\n if (forCamera && camera !== forCamera) {\r\n continue;\r\n }\r\n\r\n const firstPostProcess = camera._getFirstPostProcess();\r\n if (!firstPostProcess) {\r\n continue;\r\n }\r\n\r\n const sourceCopyDepth = firstPostProcess.inputTexture?.depthStencilTexture;\r\n if (sourceCopyDepth) {\r\n const [targetRenderers, copyDepthTextures] = list;\r\n for (const targetRenderer of targetRenderers) {\r\n targetRenderer._bgDepthTexture = sourceCopyDepth;\r\n }\r\n for (const key in copyDepthTextures) {\r\n copyDepthTextures[key].copy(sourceCopyDepth);\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.renderObjects.length; ++i) {\r\n const renderingObject = this.renderObjects[i];\r\n if (!forCamera || renderingObject.targetRenderer.camera === forCamera) {\r\n renderingObject.targetRenderer._render(renderingObject.object);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of all the ressources used by the class\r\n */\r\n public dispose(): void {\r\n this._engine.onResizeObservable.remove(this._onEngineResizeObserver);\r\n this._onEngineResizeObserver = null;\r\n\r\n for (let i = 0; i < this.renderObjects.length; ++i) {\r\n this.renderObjects[i].object.dispose();\r\n }\r\n\r\n for (let i = 0; i < this.targetRenderers.length; ++i) {\r\n this.targetRenderers[i].dispose();\r\n }\r\n\r\n this._cameras.forEach((list) => {\r\n const copyDepthTextures = list[1];\r\n for (const key in copyDepthTextures) {\r\n copyDepthTextures[key].dispose();\r\n }\r\n });\r\n\r\n (this.renderObjects as Array<IFluidRenderingRenderObject>) = [];\r\n (this.targetRenderers as FluidRenderingTargetRenderer[]) = [];\r\n this._cameras.clear();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"fluidRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Scene } from \"core/scene\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { FloatArray, Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport type { IParticleSystem } from \"core/Particles/IParticleSystem\";\r\nimport type { ISceneComponent } from \"core/sceneComponent\";\r\nimport { SceneComponentConstants } from \"core/sceneComponent\";\r\nimport type { SmartArrayNoDuplicate } from \"core/Misc/smartArray\";\r\nimport type { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { Buffer } from \"core/Buffers/buffer\";\r\n\r\nimport type { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { FluidRenderingObjectParticleSystem } from \"./fluidRenderingObjectParticleSystem\";\r\nimport { FluidRenderingTargetRenderer } from \"./fluidRenderingTargetRenderer\";\r\nimport { FluidRenderingObjectCustomParticles } from \"./fluidRenderingObjectCustomParticles\";\r\nimport { FluidRenderingDepthTextureCopy } from \"./fluidRenderingDepthTextureCopy\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\ndeclare module \"../../abstractScene\" {\r\n export interface AbstractScene {\r\n /** @internal (Backing field) */\r\n _fluidRenderer: Nullable<FluidRenderer>;\r\n\r\n /**\r\n * Gets or Sets the fluid renderer associated to the scene.\r\n */\r\n fluidRenderer: Nullable<FluidRenderer>;\r\n\r\n /**\r\n * Enables the fluid renderer and associates it with the scene\r\n * @returns the FluidRenderer\r\n */\r\n enableFluidRenderer(): Nullable<FluidRenderer>;\r\n\r\n /**\r\n * Disables the fluid renderer associated with the scene\r\n */\r\n disableFluidRenderer(): void;\r\n }\r\n}\r\n\r\nObject.defineProperty(Scene.prototype, \"fluidRenderer\", {\r\n get: function (this: Scene) {\r\n return this._fluidRenderer;\r\n },\r\n set: function (this: Scene, value: Nullable<FluidRenderer>) {\r\n this._fluidRenderer = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\nScene.prototype.enableFluidRenderer = function (): Nullable<FluidRenderer> {\r\n if (this._fluidRenderer) {\r\n return this._fluidRenderer;\r\n }\r\n\r\n this._fluidRenderer = new FluidRenderer(this);\r\n\r\n return this._fluidRenderer;\r\n};\r\n\r\nScene.prototype.disableFluidRenderer = function (): void {\r\n this._fluidRenderer?.dispose();\r\n this._fluidRenderer = null;\r\n};\r\n\r\ntype CameraMapForFluidRendering = [Array<FluidRenderingTargetRenderer>, { [key: string]: FluidRenderingDepthTextureCopy }];\r\n\r\nfunction IsParticleSystemObject(obj: FluidRenderingObject): obj is FluidRenderingObjectParticleSystem {\r\n return !!(obj as FluidRenderingObjectParticleSystem).particleSystem;\r\n}\r\n\r\nfunction IsCustomParticlesObject(obj: FluidRenderingObject): obj is FluidRenderingObjectCustomParticles {\r\n return !!(obj as FluidRenderingObjectCustomParticles).addBuffers;\r\n}\r\n\r\n/**\r\n * Defines the fluid renderer scene component responsible to render objects as fluids\r\n */\r\nexport class FluidRendererSceneComponent implements ISceneComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_FLUIDRENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {\r\n this.scene._gatherActiveCameraRenderTargetsStage.registerStep(\r\n SceneComponentConstants.STEP_GATHERACTIVECAMERARENDERTARGETS_FLUIDRENDERER,\r\n this,\r\n this._gatherActiveCameraRenderTargets\r\n );\r\n this.scene._afterCameraDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_FLUIDRENDERER, this, this._afterCameraDraw);\r\n }\r\n\r\n private _gatherActiveCameraRenderTargets(_renderTargets: SmartArrayNoDuplicate<RenderTargetTexture>): void {\r\n this.scene.fluidRenderer?._prepareRendering();\r\n }\r\n\r\n private _afterCameraDraw(camera: Camera) {\r\n this.scene.fluidRenderer?._render(camera);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n const fluidRenderer = this.scene.fluidRenderer;\r\n if (!fluidRenderer) {\r\n return;\r\n }\r\n\r\n const buffers = new Set<Buffer>();\r\n for (let i = 0; i < fluidRenderer.renderObjects.length; ++i) {\r\n const obj = fluidRenderer.renderObjects[i].object;\r\n if (IsCustomParticlesObject(obj)) {\r\n const vbuffers = obj.vertexBuffers;\r\n for (const name in vbuffers) {\r\n buffers.add(vbuffers[name].getWrapperBuffer());\r\n }\r\n }\r\n }\r\n\r\n buffers.forEach((buffer) => {\r\n buffer._rebuild();\r\n });\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources\r\n */\r\n public dispose(): void {\r\n this.scene.disableFluidRenderer();\r\n }\r\n}\r\n\r\n/**\r\n * An object rendered as a fluid.\r\n * It consists of the object itself as well as the render target renderer (which is used to generate the textures (render target) needed for fluid rendering)\r\n */\r\nexport interface IFluidRenderingRenderObject {\r\n /** object rendered as a fluid */\r\n object: FluidRenderingObject;\r\n /** target renderer used to render the fluid object */\r\n targetRenderer: FluidRenderingTargetRenderer;\r\n}\r\n\r\n/**\r\n * Class responsible for fluid rendering.\r\n * It is implementing the method described in https://developer.download.nvidia.com/presentations/2010/gdc/Direct3D_Effects.pdf\r\n */\r\nexport class FluidRenderer {\r\n /** @internal */\r\n public static _SceneComponentInitialization(scene: Scene) {\r\n let component = scene._getComponent(SceneComponentConstants.NAME_FLUIDRENDERER) as FluidRendererSceneComponent;\r\n if (!component) {\r\n component = new FluidRendererSceneComponent(scene);\r\n scene._addComponent(component);\r\n }\r\n }\r\n\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _onEngineResizeObserver: Nullable<Observer<AbstractEngine>>;\r\n private _cameras: Map<Camera, CameraMapForFluidRendering>;\r\n\r\n /** Retrieves all the render objects managed by the class */\r\n public readonly renderObjects: Array<IFluidRenderingRenderObject>;\r\n\r\n /** Retrieves all the render target renderers managed by the class */\r\n public readonly targetRenderers: FluidRenderingTargetRenderer[];\r\n\r\n /** Shader language used by the renderer */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this renderer\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Initializes the class\r\n * @param scene Scene in which the objects are part of\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._onEngineResizeObserver = null;\r\n this.renderObjects = [];\r\n this.targetRenderers = [];\r\n this._cameras = new Map();\r\n\r\n FluidRenderer._SceneComponentInitialization(this._scene);\r\n\r\n this._onEngineResizeObserver = this._engine.onResizeObservable.add(() => {\r\n this._initialize();\r\n });\r\n\r\n const engine = this._engine;\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n }\r\n\r\n /**\r\n * Reinitializes the class\r\n * Can be used if you change the object priority (FluidRenderingObject.priority), to make sure the objects are rendered in the right order\r\n */\r\n public recreate(): void {\r\n this._sortRenderingObjects();\r\n this._initialize();\r\n }\r\n\r\n /**\r\n * Gets the render object corresponding to a particle system (null if the particle system is not rendered as a fluid)\r\n * @param ps The particle system\r\n * @returns the render object corresponding to this particle system if any, otherwise null\r\n */\r\n public getRenderObjectFromParticleSystem(ps: IParticleSystem): Nullable<IFluidRenderingRenderObject> {\r\n const index = this._getParticleSystemIndex(ps);\r\n return index !== -1 ? this.renderObjects[index] : null;\r\n }\r\n\r\n /**\r\n * Adds a particle system to the fluid renderer.\r\n * @param ps particle system\r\n * @param generateDiffuseTexture True if you want to generate a diffuse texture from the particle system and use it as part of the fluid rendering (default: false)\r\n * @param targetRenderer The target renderer used to display the particle system as a fluid. If not provided, the method will create a new one\r\n * @param camera The camera used by the target renderer (if the target renderer is created by the method)\r\n * @returns the render object corresponding to the particle system\r\n */\r\n public addParticleSystem(ps: IParticleSystem, generateDiffuseTexture?: boolean, targetRenderer?: FluidRenderingTargetRenderer, camera?: Camera): IFluidRenderingRenderObject {\r\n const object = new FluidRenderingObjectParticleSystem(this._scene, ps, this._shaderLanguage);\r\n\r\n object.onParticleSizeChanged.add(() => this._setParticleSizeForRenderTargets());\r\n\r\n if (!targetRenderer) {\r\n targetRenderer = new FluidRenderingTargetRenderer(this._scene, camera, this._shaderLanguage);\r\n this.targetRenderers.push(targetRenderer);\r\n }\r\n\r\n if (!targetRenderer._onUseVelocityChanged.hasObservers()) {\r\n targetRenderer._onUseVelocityChanged.add(() => this._setUseVelocityForRenderObject());\r\n }\r\n\r\n if (generateDiffuseTexture !== undefined) {\r\n targetRenderer.generateDiffuseTexture = generateDiffuseTexture;\r\n }\r\n\r\n const renderObject = { object, targetRenderer };\r\n\r\n this.renderObjects.push(renderObject);\r\n\r\n this._sortRenderingObjects();\r\n\r\n this._setParticleSizeForRenderTargets();\r\n\r\n return renderObject;\r\n }\r\n\r\n /**\r\n * Adds a custom particle set to the fluid renderer.\r\n * @param buffers The list of buffers (should contain at least a \"position\" buffer!)\r\n * @param numParticles Number of particles in each buffer\r\n * @param generateDiffuseTexture True if you want to generate a diffuse texture from buffers and use it as part of the fluid rendering (default: false). For the texture to be generated correctly, you need a \"color\" buffer in the set!\r\n * @param targetRenderer The target renderer used to display the particle system as a fluid. If not provided, the method will create a new one\r\n * @param camera The camera used by the target renderer (if the target renderer is created by the method)\r\n * @returns the render object corresponding to the custom particle set\r\n */\r\n public addCustomParticles(\r\n buffers: { [key: string]: FloatArray },\r\n numParticles: number,\r\n generateDiffuseTexture?: boolean,\r\n targetRenderer?: FluidRenderingTargetRenderer,\r\n camera?: Camera\r\n ): IFluidRenderingRenderObject {\r\n const object = new FluidRenderingObjectCustomParticles(this._scene, buffers, numParticles, this._shaderLanguage);\r\n\r\n object.onParticleSizeChanged.add(() => this._setParticleSizeForRenderTargets());\r\n\r\n if (!targetRenderer) {\r\n targetRenderer = new FluidRenderingTargetRenderer(this._scene, camera, this._shaderLanguage);\r\n this.targetRenderers.push(targetRenderer);\r\n }\r\n\r\n if (!targetRenderer._onUseVelocityChanged.hasObservers()) {\r\n targetRenderer._onUseVelocityChanged.add(() => this._setUseVelocityForRenderObject());\r\n }\r\n\r\n if (generateDiffuseTexture !== undefined) {\r\n targetRenderer.generateDiffuseTexture = generateDiffuseTexture;\r\n }\r\n\r\n const renderObject = { object, targetRenderer };\r\n\r\n this.renderObjects.push(renderObject);\r\n\r\n this._sortRenderingObjects();\r\n\r\n this._setParticleSizeForRenderTargets();\r\n\r\n return renderObject;\r\n }\r\n\r\n /**\r\n * Removes a render object from the fluid renderer\r\n * @param renderObject the render object to remove\r\n * @param removeUnusedTargetRenderer True to remove/dispose of the target renderer if it's not used anymore (default: true)\r\n * @returns True if the render object has been found and released, else false\r\n */\r\n public removeRenderObject(renderObject: IFluidRenderingRenderObject, removeUnusedTargetRenderer = true): boolean {\r\n const index = this.renderObjects.indexOf(renderObject);\r\n if (index === -1) {\r\n return false;\r\n }\r\n\r\n renderObject.object.dispose();\r\n\r\n this.renderObjects.splice(index, 1);\r\n\r\n if (removeUnusedTargetRenderer && this._removeUnusedTargetRenderers()) {\r\n this._initialize();\r\n } else {\r\n this._setParticleSizeForRenderTargets();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _sortRenderingObjects(): void {\r\n this.renderObjects.sort((a, b) => {\r\n return a.object.priority < b.object.priority ? -1 : a.object.priority > b.object.priority ? 1 : 0;\r\n });\r\n }\r\n\r\n private _removeUnusedTargetRenderers(): boolean {\r\n const indexes: { [id: number]: boolean } = {};\r\n\r\n for (let i = 0; i < this.renderObjects.length; ++i) {\r\n const targetRenderer = this.renderObjects[i].targetRenderer;\r\n indexes[this.targetRenderers.indexOf(targetRenderer)] = true;\r\n }\r\n\r\n let removed = false;\r\n const newList: Array<FluidRenderingTargetRenderer> = [];\r\n for (let i = 0; i < this.targetRenderers.length; ++i) {\r\n if (!indexes[i]) {\r\n this.targetRenderers[i].dispose();\r\n removed = true;\r\n } else {\r\n newList.push(this.targetRenderers[i]);\r\n }\r\n }\r\n\r\n if (removed) {\r\n this.targetRenderers.length = 0;\r\n this.targetRenderers.push(...newList);\r\n }\r\n\r\n return removed;\r\n }\r\n\r\n private _getParticleSystemIndex(ps: IParticleSystem): number {\r\n for (let i = 0; i < this.renderObjects.length; ++i) {\r\n const obj = this.renderObjects[i].object;\r\n if (IsParticleSystemObject(obj) && obj.particleSystem === ps) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n private _initialize(): void {\r\n for (let i = 0; i < this.targetRenderers.length; ++i) {\r\n this.targetRenderers[i].dispose();\r\n }\r\n\r\n const cameras: Map<Camera, CameraMapForFluidRendering> = new Map();\r\n\r\n for (let i = 0; i < this.targetRenderers.length; ++i) {\r\n const targetRenderer = this.targetRenderers[i];\r\n\r\n targetRenderer._initialize();\r\n\r\n if (targetRenderer.camera && targetRenderer._renderPostProcess) {\r\n let list = cameras.get(targetRenderer.camera);\r\n if (!list) {\r\n list = [[], {}];\r\n cameras.set(targetRenderer.camera, list);\r\n }\r\n list[0].push(targetRenderer);\r\n targetRenderer.camera.attachPostProcess(targetRenderer._renderPostProcess, i);\r\n }\r\n }\r\n\r\n let iterator = cameras.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const camera = key.value;\r\n const list = cameras.get(camera)!;\r\n\r\n const firstPostProcess = camera._getFirstPostProcess();\r\n if (!firstPostProcess) {\r\n continue;\r\n }\r\n\r\n const [targetRenderers, copyDepthTextures] = list;\r\n\r\n firstPostProcess.onSizeChangedObservable.add(() => {\r\n if (!firstPostProcess.inputTexture.depthStencilTexture) {\r\n firstPostProcess.inputTexture.createDepthStencilTexture(\r\n 0,\r\n true,\r\n this._engine.isStencilEnable,\r\n targetRenderers[0].samples,\r\n this._engine.isStencilEnable ? Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 : Constants.TEXTUREFORMAT_DEPTH32_FLOAT,\r\n `PostProcessRTTDepthStencil-${firstPostProcess.name}`\r\n );\r\n }\r\n for (const targetRenderer of targetRenderers) {\r\n const thicknessRT = targetRenderer._thicknessRenderTarget?.renderTarget;\r\n const thicknessTexture = thicknessRT?.texture;\r\n if (thicknessRT && thicknessTexture) {\r\n const key = thicknessTexture.width + \"_\" + thicknessTexture.height;\r\n let copyDepthTexture = copyDepthTextures[key];\r\n if (!copyDepthTexture) {\r\n copyDepthTexture = copyDepthTextures[key] = new FluidRenderingDepthTextureCopy(this._engine, thicknessTexture.width, thicknessTexture.height);\r\n }\r\n copyDepthTexture.depthRTWrapper.shareDepth(thicknessRT);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Dispose the CopyDepthTexture instances that we don't need anymore\r\n iterator = this._cameras.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const camera = key.value;\r\n const list = this._cameras.get(camera)!;\r\n\r\n const copyDepthTextures = list[1];\r\n\r\n const list2 = cameras.get(camera);\r\n if (!list2) {\r\n for (const key in copyDepthTextures) {\r\n copyDepthTextures[key].dispose();\r\n }\r\n } else {\r\n for (const key in copyDepthTextures) {\r\n if (!list2[1][key]) {\r\n copyDepthTextures[key].dispose();\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._cameras.clear();\r\n this._cameras = cameras;\r\n\r\n this._setParticleSizeForRenderTargets();\r\n }\r\n\r\n private _setParticleSizeForRenderTargets(): void {\r\n const particleSizes = new Map<FluidRenderingTargetRenderer, number>();\r\n\r\n for (let i = 0; i < this.renderObjects.length; ++i) {\r\n const renderingObject = this.renderObjects[i];\r\n let curSize = particleSizes.get(renderingObject.targetRenderer);\r\n if (curSize === undefined) {\r\n curSize = 0;\r\n }\r\n particleSizes.set(renderingObject.targetRenderer, Math.max(curSize, renderingObject.object.particleSize));\r\n }\r\n\r\n particleSizes.forEach((particleSize, targetRenderer) => {\r\n if (targetRenderer._depthRenderTarget) {\r\n targetRenderer._depthRenderTarget.particleSize = particleSize;\r\n }\r\n });\r\n }\r\n\r\n private _setUseVelocityForRenderObject(): void {\r\n for (const renderingObject of this.renderObjects) {\r\n renderingObject.object.useVelocity = renderingObject.targetRenderer.useVelocity;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _prepareRendering(): void {\r\n for (const renderer of this.targetRenderers) {\r\n if (renderer.needInitialization) {\r\n this._initialize();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _render(forCamera?: Camera): void {\r\n for (let i = 0; i < this.targetRenderers.length; ++i) {\r\n if (!forCamera || this.targetRenderers[i].camera === forCamera) {\r\n this.targetRenderers[i]._clearTargets();\r\n }\r\n }\r\n\r\n const iterator = this._cameras.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const camera = key.value;\r\n const list = this._cameras.get(camera)!;\r\n if (forCamera && camera !== forCamera) {\r\n continue;\r\n }\r\n\r\n const firstPostProcess = camera._getFirstPostProcess();\r\n if (!firstPostProcess) {\r\n continue;\r\n }\r\n\r\n const sourceCopyDepth = firstPostProcess.inputTexture?.depthStencilTexture;\r\n if (sourceCopyDepth) {\r\n const [targetRenderers, copyDepthTextures] = list;\r\n for (const targetRenderer of targetRenderers) {\r\n targetRenderer._bgDepthTexture = sourceCopyDepth;\r\n }\r\n for (const key in copyDepthTextures) {\r\n copyDepthTextures[key].copy(sourceCopyDepth);\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.renderObjects.length; ++i) {\r\n const renderingObject = this.renderObjects[i];\r\n if (!forCamera || renderingObject.targetRenderer.camera === forCamera) {\r\n renderingObject.targetRenderer._render(renderingObject.object);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of all the ressources used by the class\r\n */\r\n public dispose(): void {\r\n this._engine.onResizeObservable.remove(this._onEngineResizeObserver);\r\n this._onEngineResizeObserver = null;\r\n\r\n for (let i = 0; i < this.renderObjects.length; ++i) {\r\n this.renderObjects[i].object.dispose();\r\n }\r\n\r\n for (let i = 0; i < this.targetRenderers.length; ++i) {\r\n this.targetRenderers[i].dispose();\r\n }\r\n\r\n this._cameras.forEach((list) => {\r\n const copyDepthTextures = list[1];\r\n for (const key in copyDepthTextures) {\r\n copyDepthTextures[key].dispose();\r\n }\r\n });\r\n\r\n (this.renderObjects as Array<IFluidRenderingRenderObject>) = [];\r\n (this.targetRenderers as FluidRenderingTargetRenderer[]) = [];\r\n this._cameras.clear();\r\n }\r\n}\r\n"]}
|
|
@@ -5,6 +5,7 @@ import { EffectWrapper } from "../../Materials/effectRenderer.js";
|
|
|
5
5
|
import { Observable } from "../../Misc/observable.js";
|
|
6
6
|
import type { Scene } from "../../scene.js";
|
|
7
7
|
import type { Nullable } from "../../types.js";
|
|
8
|
+
import { ShaderLanguage } from "../../Materials/shaderLanguage.js";
|
|
8
9
|
/**
|
|
9
10
|
* Defines the base object used for fluid rendering.
|
|
10
11
|
* It is based on a list of vertices (particles)
|
|
@@ -46,11 +47,18 @@ export declare abstract class FluidRenderingObject {
|
|
|
46
47
|
* @returns the name of the class
|
|
47
48
|
*/
|
|
48
49
|
getClassName(): string;
|
|
50
|
+
/** Shader language used by the object */
|
|
51
|
+
protected _shaderLanguage: ShaderLanguage;
|
|
52
|
+
/**
|
|
53
|
+
* Gets the shader language used in this object
|
|
54
|
+
*/
|
|
55
|
+
get shaderLanguage(): ShaderLanguage;
|
|
49
56
|
/**
|
|
50
57
|
* Instantiates a fluid rendering object
|
|
51
58
|
* @param scene The scene the object is part of
|
|
59
|
+
* @param shaderLanguage The shader language to use
|
|
52
60
|
*/
|
|
53
|
-
constructor(scene: Scene);
|
|
61
|
+
constructor(scene: Scene, shaderLanguage?: ShaderLanguage);
|
|
54
62
|
protected _createEffects(): void;
|
|
55
63
|
/**
|
|
56
64
|
* Indicates if the object is ready to be rendered
|
|
@@ -47,11 +47,18 @@ export class FluidRenderingObject {
|
|
|
47
47
|
getClassName() {
|
|
48
48
|
return "FluidRenderingObject";
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Gets the shader language used in this object
|
|
52
|
+
*/
|
|
53
|
+
get shaderLanguage() {
|
|
54
|
+
return this._shaderLanguage;
|
|
55
|
+
}
|
|
50
56
|
/**
|
|
51
57
|
* Instantiates a fluid rendering object
|
|
52
58
|
* @param scene The scene the object is part of
|
|
59
|
+
* @param shaderLanguage The shader language to use
|
|
53
60
|
*/
|
|
54
|
-
constructor(scene) {
|
|
61
|
+
constructor(scene, shaderLanguage) {
|
|
55
62
|
/** Defines the priority of the object. Objects will be rendered in ascending order of priority */
|
|
56
63
|
this.priority = 0;
|
|
57
64
|
this._particleSize = 0.1;
|
|
@@ -60,11 +67,14 @@ export class FluidRenderingObject {
|
|
|
60
67
|
/** Defines the alpha value of a particle */
|
|
61
68
|
this.particleThicknessAlpha = 0.05;
|
|
62
69
|
this._useVelocity = false;
|
|
70
|
+
/** Shader language used by the object */
|
|
71
|
+
this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;
|
|
63
72
|
this._scene = scene;
|
|
64
73
|
this._engine = scene.getEngine();
|
|
65
74
|
this._effectsAreDirty = true;
|
|
66
75
|
this._depthEffectWrapper = null;
|
|
67
76
|
this._thicknessEffectWrapper = null;
|
|
77
|
+
this._shaderLanguage = shaderLanguage ?? (this._engine.isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */);
|
|
68
78
|
}
|
|
69
79
|
_createEffects() {
|
|
70
80
|
const uniformNames = ["view", "projection", "particleRadius", "size"];
|
|
@@ -87,6 +97,15 @@ export class FluidRenderingObject {
|
|
|
87
97
|
uniformNames,
|
|
88
98
|
samplerNames: [],
|
|
89
99
|
defines,
|
|
100
|
+
shaderLanguage: this._shaderLanguage,
|
|
101
|
+
extraInitializationsAsync: async () => {
|
|
102
|
+
if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
103
|
+
await Promise.all([import("../../ShadersWGSL/fluidRenderingParticleDepth.vertex.js"), import("../../ShadersWGSL/fluidRenderingParticleDepth.fragment.js")]);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
await Promise.all([import("../../Shaders/fluidRenderingParticleDepth.vertex.js"), import("../../Shaders/fluidRenderingParticleDepth.fragment.js")]);
|
|
107
|
+
}
|
|
108
|
+
},
|
|
90
109
|
});
|
|
91
110
|
uniformNames.push("particleAlpha");
|
|
92
111
|
this._thicknessEffectWrapper = new EffectWrapper({
|
|
@@ -97,6 +116,15 @@ export class FluidRenderingObject {
|
|
|
97
116
|
attributeNames: ["position", "offset"],
|
|
98
117
|
uniformNames,
|
|
99
118
|
samplerNames: [],
|
|
119
|
+
shaderLanguage: this._shaderLanguage,
|
|
120
|
+
extraInitializationsAsync: async () => {
|
|
121
|
+
if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
122
|
+
await Promise.all([import("../../ShadersWGSL/fluidRenderingParticleThickness.vertex.js"), import("../../ShadersWGSL/fluidRenderingParticleThickness.fragment.js")]);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
await Promise.all([import("../../Shaders/fluidRenderingParticleThickness.vertex.js"), import("../../Shaders/fluidRenderingParticleThickness.fragment.js")]);
|
|
126
|
+
}
|
|
127
|
+
},
|
|
100
128
|
});
|
|
101
129
|
}
|
|
102
130
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidRenderingObject.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObject.ts"],"names":[],"mappings":"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","sourcesContent":["import type { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\n/**\r\n * Defines the base object used for fluid rendering.\r\n * It is based on a list of vertices (particles)\r\n */\r\nexport abstract class FluidRenderingObject {\r\n protected _scene: Scene;\r\n protected _engine: AbstractEngine;\r\n protected _effectsAreDirty: boolean;\r\n protected _depthEffectWrapper: Nullable<EffectWrapper>;\r\n protected _thicknessEffectWrapper: Nullable<EffectWrapper>;\r\n\r\n /** Defines the priority of the object. Objects will be rendered in ascending order of priority */\r\n public priority = 0;\r\n\r\n protected _particleSize = 0.1;\r\n\r\n /** Observable triggered when the size of the particle is changed */\r\n public onParticleSizeChanged = new Observable<FluidRenderingObject>();\r\n\r\n /** Gets or sets the size of the particle */\r\n public get particleSize() {\r\n return this._particleSize;\r\n }\r\n\r\n public set particleSize(size: number) {\r\n if (size === this._particleSize) {\r\n return;\r\n }\r\n\r\n this._particleSize = size;\r\n this.onParticleSizeChanged.notifyObservers(this);\r\n }\r\n\r\n /** Defines the alpha value of a particle */\r\n public particleThicknessAlpha = 0.05;\r\n\r\n /** Indicates if the object uses instancing or not */\r\n public get useInstancing() {\r\n return !this.indexBuffer;\r\n }\r\n\r\n private _useVelocity = false;\r\n\r\n /** Indicates if velocity of particles should be used when rendering the object. The vertex buffer set must contain a \"velocity\" buffer for this to work! */\r\n public get useVelocity() {\r\n return this._useVelocity;\r\n }\r\n\r\n public set useVelocity(use: boolean) {\r\n if (this._useVelocity === use || !this._hasVelocity()) {\r\n return;\r\n }\r\n\r\n this._useVelocity = use;\r\n this._effectsAreDirty = true;\r\n }\r\n\r\n private _hasVelocity() {\r\n return !!this.vertexBuffers?.velocity;\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public abstract get vertexBuffers(): { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * Gets the index buffer (or null if the object is using instancing)\r\n */\r\n public get indexBuffer(): Nullable<DataBuffer> {\r\n return null;\r\n }\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public getClassName(): string {\r\n return \"FluidRenderingObject\";\r\n }\r\n\r\n /**\r\n * Instantiates a fluid rendering object\r\n * @param scene The scene the object is part of\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._effectsAreDirty = true;\r\n this._depthEffectWrapper = null;\r\n this._thicknessEffectWrapper = null;\r\n }\r\n\r\n protected _createEffects(): void {\r\n const uniformNames = [\"view\", \"projection\", \"particleRadius\", \"size\"];\r\n const attributeNames = [\"position\", \"offset\"];\r\n const defines: string[] = [];\r\n\r\n this._effectsAreDirty = false;\r\n\r\n if (this.useVelocity) {\r\n attributeNames.push(\"velocity\");\r\n defines.push(\"#define FLUIDRENDERING_VELOCITY\");\r\n }\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n defines.push(\"#define FLUIDRENDERING_RHS\");\r\n }\r\n\r\n this._depthEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDepth\",\r\n fragmentShader: \"fluidRenderingParticleDepth\",\r\n attributeNames,\r\n uniformNames,\r\n samplerNames: [],\r\n defines,\r\n });\r\n\r\n uniformNames.push(\"particleAlpha\");\r\n\r\n this._thicknessEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleThickness\",\r\n fragmentShader: \"fluidRenderingParticleThickness\",\r\n attributeNames: [\"position\", \"offset\"],\r\n uniformNames,\r\n samplerNames: [],\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public isReady(): boolean {\r\n if (this._effectsAreDirty) {\r\n this._createEffects();\r\n }\r\n\r\n if (!this._depthEffectWrapper || !this._thicknessEffectWrapper) {\r\n return false;\r\n }\r\n\r\n const depthEffect = this._depthEffectWrapper._drawWrapper.effect!;\r\n const thicknessEffect = this._thicknessEffectWrapper._drawWrapper.effect!;\r\n\r\n return depthEffect.isReady() && thicknessEffect.isReady();\r\n }\r\n\r\n /**\r\n * Gets the number of particles (vertices) of this object\r\n * @returns The number of particles\r\n */\r\n public abstract get numParticles(): number;\r\n\r\n /**\r\n * Render the depth texture for this object\r\n */\r\n public renderDepthTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._depthEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const depthDrawWrapper = this._depthEffectWrapper._drawWrapper;\r\n const depthEffect = depthDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(depthDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, depthEffect);\r\n\r\n depthEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n depthEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n depthEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n depthEffect.setFloat(\"particleRadius\", this._particleSize / 2);\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Render the thickness texture for this object\r\n */\r\n public renderThicknessTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._thicknessEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const thicknessDrawWrapper = this._thicknessEffectWrapper._drawWrapper;\r\n const thicknessEffect = thicknessDrawWrapper.effect!;\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE);\r\n this._engine.setDepthWrite(false);\r\n\r\n this._engine.enableEffect(thicknessDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, thicknessEffect);\r\n\r\n thicknessEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n thicknessEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n thicknessEffect.setFloat(\"particleAlpha\", this.particleThicknessAlpha);\r\n thicknessEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n\r\n this._engine.setDepthWrite(true);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public renderDiffuseTexture(): void {\r\n // do nothing by default\r\n }\r\n\r\n /**\r\n * Releases the ressources used by the class\r\n */\r\n public dispose(): void {\r\n this._depthEffectWrapper?.dispose(false);\r\n this._thicknessEffectWrapper?.dispose(false);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"fluidRenderingObject.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObject.ts"],"names":[],"mappings":"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","sourcesContent":["import type { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines the base object used for fluid rendering.\r\n * It is based on a list of vertices (particles)\r\n */\r\nexport abstract class FluidRenderingObject {\r\n protected _scene: Scene;\r\n protected _engine: AbstractEngine;\r\n protected _effectsAreDirty: boolean;\r\n protected _depthEffectWrapper: Nullable<EffectWrapper>;\r\n protected _thicknessEffectWrapper: Nullable<EffectWrapper>;\r\n\r\n /** Defines the priority of the object. Objects will be rendered in ascending order of priority */\r\n public priority = 0;\r\n\r\n protected _particleSize = 0.1;\r\n\r\n /** Observable triggered when the size of the particle is changed */\r\n public onParticleSizeChanged = new Observable<FluidRenderingObject>();\r\n\r\n /** Gets or sets the size of the particle */\r\n public get particleSize() {\r\n return this._particleSize;\r\n }\r\n\r\n public set particleSize(size: number) {\r\n if (size === this._particleSize) {\r\n return;\r\n }\r\n\r\n this._particleSize = size;\r\n this.onParticleSizeChanged.notifyObservers(this);\r\n }\r\n\r\n /** Defines the alpha value of a particle */\r\n public particleThicknessAlpha = 0.05;\r\n\r\n /** Indicates if the object uses instancing or not */\r\n public get useInstancing() {\r\n return !this.indexBuffer;\r\n }\r\n\r\n private _useVelocity = false;\r\n\r\n /** Indicates if velocity of particles should be used when rendering the object. The vertex buffer set must contain a \"velocity\" buffer for this to work! */\r\n public get useVelocity() {\r\n return this._useVelocity;\r\n }\r\n\r\n public set useVelocity(use: boolean) {\r\n if (this._useVelocity === use || !this._hasVelocity()) {\r\n return;\r\n }\r\n\r\n this._useVelocity = use;\r\n this._effectsAreDirty = true;\r\n }\r\n\r\n private _hasVelocity() {\r\n return !!this.vertexBuffers?.velocity;\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public abstract get vertexBuffers(): { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * Gets the index buffer (or null if the object is using instancing)\r\n */\r\n public get indexBuffer(): Nullable<DataBuffer> {\r\n return null;\r\n }\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public getClassName(): string {\r\n return \"FluidRenderingObject\";\r\n }\r\n\r\n /** Shader language used by the object */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this object\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a fluid rendering object\r\n * @param scene The scene the object is part of\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, shaderLanguage?: ShaderLanguage) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._effectsAreDirty = true;\r\n this._depthEffectWrapper = null;\r\n this._thicknessEffectWrapper = null;\r\n this._shaderLanguage = shaderLanguage ?? (this._engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL);\r\n }\r\n\r\n protected _createEffects(): void {\r\n const uniformNames = [\"view\", \"projection\", \"particleRadius\", \"size\"];\r\n const attributeNames = [\"position\", \"offset\"];\r\n const defines: string[] = [];\r\n\r\n this._effectsAreDirty = false;\r\n\r\n if (this.useVelocity) {\r\n attributeNames.push(\"velocity\");\r\n defines.push(\"#define FLUIDRENDERING_VELOCITY\");\r\n }\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n defines.push(\"#define FLUIDRENDERING_RHS\");\r\n }\r\n\r\n this._depthEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDepth\",\r\n fragmentShader: \"fluidRenderingParticleDepth\",\r\n attributeNames,\r\n uniformNames,\r\n samplerNames: [],\r\n defines,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/fluidRenderingParticleDepth.vertex\"), import(\"../../ShadersWGSL/fluidRenderingParticleDepth.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/fluidRenderingParticleDepth.vertex\"), import(\"../../Shaders/fluidRenderingParticleDepth.fragment\")]);\r\n }\r\n },\r\n });\r\n\r\n uniformNames.push(\"particleAlpha\");\r\n\r\n this._thicknessEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleThickness\",\r\n fragmentShader: \"fluidRenderingParticleThickness\",\r\n attributeNames: [\"position\", \"offset\"],\r\n uniformNames,\r\n samplerNames: [],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/fluidRenderingParticleThickness.vertex\"), import(\"../../ShadersWGSL/fluidRenderingParticleThickness.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/fluidRenderingParticleThickness.vertex\"), import(\"../../Shaders/fluidRenderingParticleThickness.fragment\")]);\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public isReady(): boolean {\r\n if (this._effectsAreDirty) {\r\n this._createEffects();\r\n }\r\n\r\n if (!this._depthEffectWrapper || !this._thicknessEffectWrapper) {\r\n return false;\r\n }\r\n\r\n const depthEffect = this._depthEffectWrapper._drawWrapper.effect!;\r\n const thicknessEffect = this._thicknessEffectWrapper._drawWrapper.effect!;\r\n\r\n return depthEffect.isReady() && thicknessEffect.isReady();\r\n }\r\n\r\n /**\r\n * Gets the number of particles (vertices) of this object\r\n * @returns The number of particles\r\n */\r\n public abstract get numParticles(): number;\r\n\r\n /**\r\n * Render the depth texture for this object\r\n */\r\n public renderDepthTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._depthEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const depthDrawWrapper = this._depthEffectWrapper._drawWrapper;\r\n const depthEffect = depthDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(depthDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, depthEffect);\r\n\r\n depthEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n depthEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n depthEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n depthEffect.setFloat(\"particleRadius\", this._particleSize / 2);\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Render the thickness texture for this object\r\n */\r\n public renderThicknessTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._thicknessEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const thicknessDrawWrapper = this._thicknessEffectWrapper._drawWrapper;\r\n const thicknessEffect = thicknessDrawWrapper.effect!;\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE);\r\n this._engine.setDepthWrite(false);\r\n\r\n this._engine.enableEffect(thicknessDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, thicknessEffect);\r\n\r\n thicknessEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n thicknessEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n thicknessEffect.setFloat(\"particleAlpha\", this.particleThicknessAlpha);\r\n thicknessEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n\r\n this._engine.setDepthWrite(true);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public renderDiffuseTexture(): void {\r\n // do nothing by default\r\n }\r\n\r\n /**\r\n * Releases the ressources used by the class\r\n */\r\n public dispose(): void {\r\n this._depthEffectWrapper?.dispose(false);\r\n this._thicknessEffectWrapper?.dispose(false);\r\n }\r\n}\r\n"]}
|
|
@@ -2,6 +2,7 @@ import { VertexBuffer } from "../../Buffers/buffer.js";
|
|
|
2
2
|
import type { Scene } from "../../scene.js";
|
|
3
3
|
import type { FloatArray } from "../../types.js";
|
|
4
4
|
import { FluidRenderingObject } from "./fluidRenderingObject";
|
|
5
|
+
import { ShaderLanguage } from "../../Materials/shaderLanguage.js";
|
|
5
6
|
/**
|
|
6
7
|
* Defines a rendering object based on a list of custom buffers
|
|
7
8
|
* The list must contain at least a "position" buffer!
|
|
@@ -25,10 +26,11 @@ export declare class FluidRenderingObjectCustomParticles extends FluidRenderingO
|
|
|
25
26
|
* @param scene The scene the particles should be rendered into
|
|
26
27
|
* @param buffers The list of buffers (must contain at least one "position" buffer!). Note that you don't have to pass all (or any!) buffers at once in the constructor, you can use the addBuffers method to add more later.
|
|
27
28
|
* @param numParticles Number of vertices to take into account from the buffers
|
|
29
|
+
* @param shaderLanguage The shader language to use
|
|
28
30
|
*/
|
|
29
31
|
constructor(scene: Scene, buffers: {
|
|
30
32
|
[key: string]: FloatArray;
|
|
31
|
-
}, numParticles: number);
|
|
33
|
+
}, numParticles: number, shaderLanguage?: ShaderLanguage);
|
|
32
34
|
/**
|
|
33
35
|
* Add some new buffers
|
|
34
36
|
* @param buffers List of buffers
|
|
@@ -24,9 +24,10 @@ export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
|
|
|
24
24
|
* @param scene The scene the particles should be rendered into
|
|
25
25
|
* @param buffers The list of buffers (must contain at least one "position" buffer!). Note that you don't have to pass all (or any!) buffers at once in the constructor, you can use the addBuffers method to add more later.
|
|
26
26
|
* @param numParticles Number of vertices to take into account from the buffers
|
|
27
|
+
* @param shaderLanguage The shader language to use
|
|
27
28
|
*/
|
|
28
|
-
constructor(scene, buffers, numParticles) {
|
|
29
|
-
super(scene);
|
|
29
|
+
constructor(scene, buffers, numParticles, shaderLanguage) {
|
|
30
|
+
super(scene, shaderLanguage);
|
|
30
31
|
this._numParticles = numParticles;
|
|
31
32
|
this._diffuseEffectWrapper = null;
|
|
32
33
|
this._vertexBuffers = {};
|
|
@@ -63,6 +64,15 @@ export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
|
|
|
63
64
|
attributeNames,
|
|
64
65
|
uniformNames,
|
|
65
66
|
samplerNames: [],
|
|
67
|
+
shaderLanguage: this._shaderLanguage,
|
|
68
|
+
extraInitializationsAsync: async () => {
|
|
69
|
+
if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
70
|
+
await import("../../ShadersWGSL/fluidRenderingParticleDiffuse.fragment.js");
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
await import("../../Shaders/fluidRenderingParticleDiffuse.fragment.js");
|
|
74
|
+
}
|
|
75
|
+
},
|
|
66
76
|
});
|
|
67
77
|
}
|
|
68
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidRenderingObjectCustomParticles.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gCAA4B;AACnD,OAAO,EAAE,SAAS,EAAE,mCAA+B;AACnD,OAAO,EAAE,aAAa,EAAE,0CAAsC;AAI9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"fluidRenderingObjectCustomParticles.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.ts"],"names":[],"mappings":"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","sourcesContent":["import { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { FloatArray, Nullable } from \"core/types\";\r\n\r\nimport { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines a rendering object based on a list of custom buffers\r\n * The list must contain at least a \"position\" buffer!\r\n */\r\nexport class FluidRenderingObjectCustomParticles extends FluidRenderingObject {\r\n private _numParticles: number;\r\n private _diffuseEffectWrapper: Nullable<EffectWrapper>;\r\n private _vertexBuffers: { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public override getClassName(): string {\r\n return \"FluidRenderingObjectCustomParticles\";\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public get vertexBuffers(): { [key: string]: VertexBuffer } {\r\n return this._vertexBuffers;\r\n }\r\n\r\n /**\r\n * Creates a new instance of the class\r\n * @param scene The scene the particles should be rendered into\r\n * @param buffers The list of buffers (must contain at least one \"position\" buffer!). Note that you don't have to pass all (or any!) buffers at once in the constructor, you can use the addBuffers method to add more later.\r\n * @param numParticles Number of vertices to take into account from the buffers\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, buffers: { [key: string]: FloatArray }, numParticles: number, shaderLanguage?: ShaderLanguage) {\r\n super(scene, shaderLanguage);\r\n\r\n this._numParticles = numParticles;\r\n this._diffuseEffectWrapper = null;\r\n this._vertexBuffers = {};\r\n\r\n this.addBuffers(buffers);\r\n }\r\n\r\n /**\r\n * Add some new buffers\r\n * @param buffers List of buffers\r\n */\r\n public addBuffers(buffers: { [key: string]: FloatArray }) {\r\n for (const name in buffers) {\r\n let stride: number | undefined;\r\n let instanced = true;\r\n\r\n switch (name) {\r\n case \"velocity\":\r\n stride = 3;\r\n break;\r\n case \"offset\":\r\n instanced = false;\r\n break;\r\n }\r\n\r\n this._vertexBuffers[name] = new VertexBuffer(this._engine, buffers[name], name, true, false, stride, instanced);\r\n }\r\n }\r\n\r\n protected override _createEffects(): void {\r\n super._createEffects();\r\n\r\n const uniformNames = [\"view\", \"projection\", \"size\"];\r\n const attributeNames = [\"position\", \"offset\", \"color\"];\r\n\r\n this._diffuseEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDiffuse\",\r\n fragmentShader: \"fluidRenderingParticleDiffuse\",\r\n attributeNames,\r\n uniformNames,\r\n samplerNames: [],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await import(\"../../ShadersWGSL/fluidRenderingParticleDiffuse.fragment\");\r\n } else {\r\n await import(\"../../Shaders/fluidRenderingParticleDiffuse.fragment\");\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public override isReady(): boolean {\r\n if (!this._vertexBuffers[\"offset\"]) {\r\n this._vertexBuffers[\"offset\"] = new VertexBuffer(this._engine, [0, 0, 1, 0, 0, 1, 1, 1], \"offset\", false, false, 2);\r\n }\r\n\r\n return super.isReady() && (this._diffuseEffectWrapper?.effect!.isReady() ?? false);\r\n }\r\n\r\n /**\r\n * Gets the number of particles in this object\r\n * @returns The number of particles\r\n */\r\n public get numParticles(): number {\r\n return this._numParticles;\r\n }\r\n\r\n /**\r\n * Sets the number of particles in this object\r\n * @param num The number of particles to take into account\r\n */\r\n public setNumParticles(num: number) {\r\n this._numParticles = num;\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public override renderDiffuseTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._diffuseEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const diffuseDrawWrapper = this._diffuseEffectWrapper._drawWrapper;\r\n const diffuseEffect = diffuseDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(diffuseDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, diffuseEffect);\r\n\r\n diffuseEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n diffuseEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n if (this._particleSize !== null) {\r\n diffuseEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n }\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Releases the ressources used by the class\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n\r\n this._diffuseEffectWrapper?.dispose();\r\n\r\n for (const name in this._vertexBuffers) {\r\n this._vertexBuffers[name].dispose();\r\n }\r\n\r\n this._vertexBuffers = {};\r\n }\r\n}\r\n"]}
|
|
@@ -4,6 +4,7 @@ import type { IParticleSystem } from "../../Particles/IParticleSystem.js";
|
|
|
4
4
|
import type { Scene } from "../../scene.js";
|
|
5
5
|
import type { Nullable } from "../../types.js";
|
|
6
6
|
import { FluidRenderingObject } from "./fluidRenderingObject";
|
|
7
|
+
import type { ShaderLanguage } from "../../Materials/shaderLanguage.js";
|
|
7
8
|
/**
|
|
8
9
|
* Defines a rendering object based on a particle system
|
|
9
10
|
*/
|
|
@@ -41,8 +42,9 @@ export declare class FluidRenderingObjectParticleSystem extends FluidRenderingOb
|
|
|
41
42
|
* Creates a new instance of the class
|
|
42
43
|
* @param scene The scene the particle system is part of
|
|
43
44
|
* @param ps The particle system
|
|
45
|
+
* @param shaderLanguage The shader language to use
|
|
44
46
|
*/
|
|
45
|
-
constructor(scene: Scene, ps: IParticleSystem);
|
|
47
|
+
constructor(scene: Scene, ps: IParticleSystem, shaderLanguage?: ShaderLanguage);
|
|
46
48
|
/**
|
|
47
49
|
* Indicates if the object is ready to be rendered
|
|
48
50
|
* @returns True if everything is ready for the object to be rendered, otherwise false
|
|
@@ -55,9 +55,10 @@ export class FluidRenderingObjectParticleSystem extends FluidRenderingObject {
|
|
|
55
55
|
* Creates a new instance of the class
|
|
56
56
|
* @param scene The scene the particle system is part of
|
|
57
57
|
* @param ps The particle system
|
|
58
|
+
* @param shaderLanguage The shader language to use
|
|
58
59
|
*/
|
|
59
|
-
constructor(scene, ps) {
|
|
60
|
-
super(scene);
|
|
60
|
+
constructor(scene, ps, shaderLanguage) {
|
|
61
|
+
super(scene, shaderLanguage);
|
|
61
62
|
this._useTrueRenderingForDiffuseTexture = true;
|
|
62
63
|
this._particleSystem = ps;
|
|
63
64
|
this._originalRender = ps.render.bind(ps);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidRenderingObjectParticleSystem.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,mCAA+B;AAOnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"fluidRenderingObjectParticleSystem.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { Effect } from \"core/Materials/effect\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport type { IParticleSystem } from \"core/Particles/IParticleSystem\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\nimport { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport type { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines a rendering object based on a particle system\r\n */\r\nexport class FluidRenderingObjectParticleSystem extends FluidRenderingObject {\r\n private _particleSystem: IParticleSystem;\r\n private _originalRender: () => number;\r\n private _blendMode: number;\r\n private _onBeforeDrawParticleObserver: Nullable<Observer<Nullable<Effect>>>;\r\n private _updateInAnimate: boolean;\r\n\r\n /** Gets the particle system */\r\n public get particleSystem() {\r\n return this._particleSystem;\r\n }\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public override getClassName(): string {\r\n return \"FluidRenderingObjectParticleSystem\";\r\n }\r\n\r\n private _useTrueRenderingForDiffuseTexture = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the diffuse texture should be generated based on the regular rendering of the particle system (default: true).\r\n * Sometimes, generating the diffuse texture this way may be sub-optimal. In that case, you can disable this property, in which case the particle system will be\r\n * rendered using a ALPHA_COMBINE mode instead of the one used by the particle system.\r\n */\r\n public get useTrueRenderingForDiffuseTexture() {\r\n return this._useTrueRenderingForDiffuseTexture;\r\n }\r\n\r\n public set useTrueRenderingForDiffuseTexture(use: boolean) {\r\n if (this._useTrueRenderingForDiffuseTexture === use) {\r\n return;\r\n }\r\n\r\n this._useTrueRenderingForDiffuseTexture = use;\r\n\r\n if (use) {\r\n this._particleSystem.blendMode = this._blendMode;\r\n this._particleSystem.onBeforeDrawParticlesObservable.remove(this._onBeforeDrawParticleObserver);\r\n this._onBeforeDrawParticleObserver = null;\r\n } else {\r\n this._particleSystem.blendMode = -1;\r\n this._onBeforeDrawParticleObserver = this._particleSystem.onBeforeDrawParticlesObservable.add(() => {\r\n this._engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public get vertexBuffers(): { [key: string]: VertexBuffer } {\r\n return this._particleSystem.vertexBuffers as { [key: string]: VertexBuffer };\r\n }\r\n\r\n /**\r\n * Gets the index buffer (or null if the object is using instancing)\r\n */\r\n public override get indexBuffer(): Nullable<DataBuffer> {\r\n return this._particleSystem.indexBuffer;\r\n }\r\n\r\n /**\r\n * Creates a new instance of the class\r\n * @param scene The scene the particle system is part of\r\n * @param ps The particle system\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, ps: IParticleSystem, shaderLanguage?: ShaderLanguage) {\r\n super(scene, shaderLanguage);\r\n\r\n this._particleSystem = ps;\r\n\r\n this._originalRender = ps.render.bind(ps);\r\n this._blendMode = ps.blendMode;\r\n this._onBeforeDrawParticleObserver = null;\r\n this._updateInAnimate = this._particleSystem.updateInAnimate;\r\n this._particleSystem.updateInAnimate = true;\r\n this._particleSystem.render = () => 0;\r\n\r\n this.particleSize = (ps.minSize + ps.maxSize) / 2;\r\n\r\n this.useTrueRenderingForDiffuseTexture = false;\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public override isReady(): boolean {\r\n return super.isReady() && this._particleSystem.isReady();\r\n }\r\n\r\n /**\r\n * Gets the number of particles in this particle system\r\n * @returns The number of particles\r\n */\r\n public get numParticles(): number {\r\n return this._particleSystem.getActiveCount();\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public override renderDiffuseTexture(): void {\r\n this._originalRender();\r\n }\r\n\r\n /**\r\n * Releases the ressources used by the class\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this._particleSystem.onBeforeDrawParticlesObservable.remove(this._onBeforeDrawParticleObserver);\r\n this._onBeforeDrawParticleObserver = null;\r\n this._particleSystem.render = this._originalRender;\r\n this._particleSystem.blendMode = this._blendMode;\r\n this._particleSystem.updateInAnimate = this._updateInAnimate;\r\n }\r\n}\r\n"]}
|
|
@@ -10,6 +10,7 @@ import type { Scene } from "../../scene.js";
|
|
|
10
10
|
import type { Nullable } from "../../types.js";
|
|
11
11
|
import type { FluidRenderingObject } from "./fluidRenderingObject";
|
|
12
12
|
import { FluidRenderingTextures } from "./fluidRenderingTextures";
|
|
13
|
+
import { ShaderLanguage } from "../../Materials/shaderLanguage.js";
|
|
13
14
|
/**
|
|
14
15
|
* Textures that can be displayed as a debugging tool
|
|
15
16
|
*/
|
|
@@ -216,12 +217,19 @@ export declare class FluidRenderingTargetRenderer {
|
|
|
216
217
|
_diffuseRenderTarget: Nullable<FluidRenderingTextures>;
|
|
217
218
|
/** @internal */
|
|
218
219
|
_thicknessRenderTarget: Nullable<FluidRenderingTextures>;
|
|
220
|
+
/** Shader language used by the renderer */
|
|
221
|
+
protected _shaderLanguage: ShaderLanguage;
|
|
222
|
+
/**
|
|
223
|
+
* Gets the shader language used in this renderer
|
|
224
|
+
*/
|
|
225
|
+
get shaderLanguage(): ShaderLanguage;
|
|
219
226
|
/**
|
|
220
227
|
* Creates an instance of the class
|
|
221
228
|
* @param scene Scene used to render the fluid object into
|
|
222
229
|
* @param camera Camera used to render the fluid object. If not provided, use the active camera of the scene instead
|
|
230
|
+
* @param shaderLanguage The shader language to use
|
|
223
231
|
*/
|
|
224
|
-
constructor(scene: Scene, camera?: Camera);
|
|
232
|
+
constructor(scene: Scene, camera?: Camera, shaderLanguage?: ShaderLanguage);
|
|
225
233
|
/** @internal */
|
|
226
234
|
_initialize(): void;
|
|
227
235
|
protected _setBlurParameters(renderTarget?: Nullable<FluidRenderingTextures>): void;
|