@babylonjs/core 8.8.4 → 8.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/Animations/animatable.core.js +2 -2
  2. package/Animations/animatable.core.js.map +1 -1
  3. package/Cameras/targetCamera.d.ts +0 -4
  4. package/Cameras/targetCamera.js +0 -28
  5. package/Cameras/targetCamera.js.map +1 -1
  6. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js +22 -15
  7. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js.map +1 -1
  8. package/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.d.ts +1 -0
  9. package/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.js +8 -0
  10. package/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.js.map +1 -1
  11. package/Engines/WebGPU/webgpuBufferManager.js +5 -2
  12. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  13. package/Engines/abstractEngine.js +2 -2
  14. package/Engines/abstractEngine.js.map +1 -1
  15. package/Engines/constants.d.ts +5 -0
  16. package/Engines/constants.js +5 -0
  17. package/Engines/constants.js.map +1 -1
  18. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js +1 -1
  19. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js.map +1 -1
  20. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.d.ts +2 -1
  21. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.js +5 -4
  22. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.js.map +1 -1
  23. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.d.ts +3 -1
  24. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.js +26 -4
  25. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.js.map +1 -1
  26. package/FrameGraph/Node/nodeRenderGraph.d.ts +1 -1
  27. package/FrameGraph/Node/nodeRenderGraph.js +1 -1
  28. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  29. package/Helpers/environmentHelper.js +3 -3
  30. package/Helpers/environmentHelper.js.map +1 -1
  31. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +1 -0
  32. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  33. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +1 -1
  34. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
  35. package/Materials/PBR/pbrBRDFConfiguration.d.ts +30 -0
  36. package/Materials/PBR/pbrBRDFConfiguration.js +45 -0
  37. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  38. package/Materials/PBR/pbrBaseMaterial.d.ts +0 -10
  39. package/Materials/PBR/pbrBaseMaterial.js +0 -13
  40. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  41. package/Materials/PBR/pbrMaterial.d.ts +0 -16
  42. package/Materials/PBR/pbrMaterial.decalMap.js +0 -5
  43. package/Materials/PBR/pbrMaterial.decalMap.js.map +1 -1
  44. package/Materials/PBR/pbrMaterial.js +1 -30
  45. package/Materials/PBR/pbrMaterial.js.map +1 -1
  46. package/Materials/Textures/renderTargetTexture.js +3 -1
  47. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  48. package/Materials/effectRenderer.d.ts +1 -0
  49. package/Materials/effectRenderer.js +3 -1
  50. package/Materials/effectRenderer.js.map +1 -1
  51. package/Materials/shaderMaterial.d.ts +7 -8
  52. package/Materials/shaderMaterial.js +21 -15
  53. package/Materials/shaderMaterial.js.map +1 -1
  54. package/Materials/standardMaterial.decalMap.js +0 -5
  55. package/Materials/standardMaterial.decalMap.js.map +1 -1
  56. package/Materials/standardMaterial.js +1 -1
  57. package/Materials/standardMaterial.js.map +1 -1
  58. package/Maths/math.vector.d.ts +23 -17
  59. package/Maths/math.vector.js +144 -115
  60. package/Maths/math.vector.js.map +1 -1
  61. package/Meshes/Node/nodeGeometry.d.ts +1 -1
  62. package/Meshes/Node/nodeGeometry.js +1 -1
  63. package/Meshes/Node/nodeGeometry.js.map +1 -1
  64. package/Meshes/instancedMesh.js +12 -2
  65. package/Meshes/instancedMesh.js.map +1 -1
  66. package/Meshes/mesh.d.ts +2 -2
  67. package/Meshes/mesh.js.map +1 -1
  68. package/Offline/database.d.ts +1 -1
  69. package/Offline/database.js +5 -5
  70. package/Offline/database.js.map +1 -1
  71. package/Rendering/depthPeelingRenderer.d.ts +1 -1
  72. package/Rendering/depthPeelingRenderer.js +1 -1
  73. package/Rendering/depthPeelingRenderer.js.map +1 -1
  74. package/Rendering/edgesRenderer.d.ts +1 -1
  75. package/Rendering/edgesRenderer.js +2 -2
  76. package/Rendering/edgesRenderer.js.map +1 -1
  77. package/Rendering/fluidRenderer/fluidRenderer.d.ts +1 -1
  78. package/Rendering/fluidRenderer/fluidRenderer.js +1 -1
  79. package/Rendering/fluidRenderer/fluidRenderer.js.map +1 -1
  80. package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +1 -1
  81. package/Rendering/fluidRenderer/fluidRenderingObject.js +1 -1
  82. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  83. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +1 -1
  84. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +1 -1
  85. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
  86. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +1 -1
  87. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +1 -1
  88. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
  89. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.d.ts +2 -2
  90. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +2 -2
  91. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  92. package/Rendering/prePassEffectConfiguration.d.ts +5 -0
  93. package/Rendering/prePassEffectConfiguration.js.map +1 -1
  94. package/Rendering/prePassRenderer.js +3 -0
  95. package/Rendering/prePassRenderer.js.map +1 -1
  96. package/Rendering/subSurfaceConfiguration.d.ts +6 -1
  97. package/Rendering/subSurfaceConfiguration.js +6 -1
  98. package/Rendering/subSurfaceConfiguration.js.map +1 -1
  99. package/Shaders/ShadersInclude/hdrFilteringFunctions.js +15 -14
  100. package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  101. package/Shaders/ShadersInclude/lightFragment.js +6 -2
  102. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  103. package/Shaders/ShadersInclude/pbrBRDFFunctions.js +3 -0
  104. package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  105. package/Shaders/ShadersInclude/pbrBlockDirectLighting.js +1 -1
  106. package/Shaders/ShadersInclude/pbrBlockDirectLighting.js.map +1 -1
  107. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js +1 -1
  108. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  109. package/Shaders/ShadersInclude/pbrBlockReflectance.js +11 -6
  110. package/Shaders/ShadersInclude/pbrBlockReflectance.js.map +1 -1
  111. package/Shaders/ShadersInclude/pbrBlockReflectance0.js +1 -1
  112. package/Shaders/ShadersInclude/pbrBlockReflectance0.js.map +1 -1
  113. package/Shaders/ShadersInclude/pbrBlockReflection.js +1 -1
  114. package/Shaders/ShadersInclude/pbrBlockReflection.js.map +1 -1
  115. package/Shaders/ShadersInclude/pbrBlockReflectivity.js +33 -8
  116. package/Shaders/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  117. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +6 -2
  118. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  119. package/Shaders/pbr.fragment.js +5 -4
  120. package/Shaders/pbr.fragment.js.map +1 -1
  121. package/Shaders/pbr.vertex.d.ts +1 -0
  122. package/Shaders/pbr.vertex.js +5 -2
  123. package/Shaders/pbr.vertex.js.map +1 -1
  124. package/ShadersWGSL/ShadersInclude/lightFragment.js +6 -2
  125. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  126. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +10 -0
  127. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  128. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js +1 -1
  129. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js.map +1 -1
  130. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +1 -1
  131. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  132. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js +11 -6
  133. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js.map +1 -1
  134. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js +1 -1
  135. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js.map +1 -1
  136. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js +39 -7
  137. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  138. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +7 -2
  139. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  140. package/ShadersWGSL/pbr.fragment.js +5 -4
  141. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  142. package/ShadersWGSL/pbr.vertex.d.ts +1 -0
  143. package/ShadersWGSL/pbr.vertex.js +5 -2
  144. package/ShadersWGSL/pbr.vertex.js.map +1 -1
  145. package/assetContainer.js +13 -13
  146. package/assetContainer.js.map +1 -1
  147. package/package.json +1 -1
  148. package/sceneComponent.d.ts +1 -1
  149. package/sceneComponent.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"edgesRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/edgesRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Immutable, Nullable } from \"../types\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { LinesMesh, InstancedLinesMesh } from \"../Meshes/linesMesh\";\r\nimport type { Matrix } from \"../Maths/math.vector\";\r\nimport { Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { IDisposable, Scene } from \"../scene\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Node } from \"../node\";\r\n\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\ndeclare module \"../scene\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Scene {\r\n /** @internal */\r\n _edgeRenderLineShader: Nullable<ShaderMaterial>;\r\n }\r\n}\r\n\r\ndeclare module \"../Meshes/abstractMesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractMesh {\r\n /**\r\n * Gets the edgesRenderer associated with the mesh\r\n */\r\n edgesRenderer: Nullable<EdgesRenderer>;\r\n }\r\n}\r\nAbstractMesh.prototype.disableEdgesRendering = function (): AbstractMesh {\r\n if (this._edgesRenderer) {\r\n this._edgesRenderer.dispose();\r\n this._edgesRenderer = null;\r\n }\r\n return this;\r\n};\r\n\r\nAbstractMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false, options?: IEdgesRendererOptions): AbstractMesh {\r\n this.disableEdgesRendering();\r\n this._edgesRenderer = new EdgesRenderer(this, epsilon, checkVerticesInsteadOfIndices, true, options);\r\n return this;\r\n};\r\n\r\nObject.defineProperty(AbstractMesh.prototype, \"edgesRenderer\", {\r\n get: function (this: AbstractMesh) {\r\n return this._edgesRenderer;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\ndeclare module \"../Meshes/linesMesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface LinesMesh {\r\n /**\r\n * Enables the edge rendering mode on the mesh.\r\n * This mode makes the mesh edges visible\r\n * @param epsilon defines the maximal distance between two angles to detect a face\r\n * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces\r\n * @returns the currentAbstractMesh\r\n * @see https://www.babylonjs-playground.com/#19O9TU#0\r\n */\r\n enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean): AbstractMesh;\r\n }\r\n}\r\nLinesMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false): AbstractMesh {\r\n this.disableEdgesRendering();\r\n this._edgesRenderer = new LineEdgesRenderer(this, epsilon, checkVerticesInsteadOfIndices);\r\n return this;\r\n};\r\n\r\ndeclare module \"../Meshes/linesMesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface InstancedLinesMesh {\r\n /**\r\n * Enables the edge rendering mode on the mesh.\r\n * This mode makes the mesh edges visible\r\n * @param epsilon defines the maximal distance between two angles to detect a face\r\n * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces\r\n * @returns the current InstancedLinesMesh\r\n * @see https://www.babylonjs-playground.com/#19O9TU#0\r\n */\r\n enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean): InstancedLinesMesh;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nInstancedLinesMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false): InstancedLinesMesh {\r\n LinesMesh.prototype.enableEdgesRendering.apply(this, arguments);\r\n return this;\r\n};\r\n\r\n/**\r\n * FaceAdjacencies Helper class to generate edges\r\n */\r\nclass FaceAdjacencies {\r\n public edges: number[] = [];\r\n public p0: Vector3;\r\n public p1: Vector3;\r\n public p2: Vector3;\r\n public edgesConnectedCount = 0;\r\n}\r\n\r\n/**\r\n * Defines the minimum contract an Edges renderer should follow.\r\n */\r\nexport interface IEdgesRenderer extends IDisposable {\r\n /**\r\n * Gets or sets a boolean indicating if the edgesRenderer is active\r\n */\r\n isEnabled: boolean;\r\n\r\n /**\r\n * Renders the edges of the attached mesh,\r\n */\r\n render(): void;\r\n\r\n /**\r\n * Checks whether or not the edges renderer is ready to render.\r\n * @returns true if ready, otherwise false.\r\n */\r\n isReady(): boolean;\r\n\r\n /**\r\n * List of instances to render in case the source mesh has instances\r\n */\r\n customInstances: SmartArray<Matrix>;\r\n}\r\n\r\n/**\r\n * Defines the additional options of the edges renderer\r\n */\r\nexport interface IEdgesRendererOptions {\r\n /**\r\n * Gets or sets a boolean indicating that the alternate edge finder algorithm must be used\r\n * If not defined, the default value is true\r\n */\r\n useAlternateEdgeFinder?: boolean;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the vertex merger fast processing must be used.\r\n * If not defined, the default value is true.\r\n * You should normally leave it undefined (or set it to true), except if you see some artifacts in the edges rendering (can happen with complex geometries)\r\n * This option is used only if useAlternateEdgeFinder = true\r\n */\r\n useFastVertexMerger?: boolean;\r\n\r\n /**\r\n * During edges processing, the vertices are merged if they are close enough: epsilonVertexMerge is the limit within which vertices are considered to be equal.\r\n * The default value is 1e-6\r\n * This option is used only if useAlternateEdgeFinder = true\r\n */\r\n epsilonVertexMerge?: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that tessellation should be applied before finding the edges. You may need to activate this option if your geometry is a bit\r\n * unusual, like having a vertex of a triangle in-between two vertices of an edge of another triangle. It happens often when using CSG to construct meshes.\r\n * This option is used only if useAlternateEdgeFinder = true\r\n */\r\n applyTessellation?: boolean;\r\n\r\n /**\r\n * The limit under which 3 vertices are considered to be aligned. 3 vertices PQR are considered aligned if distance(PQ) + distance(QR) - distance(PR) < epsilonVertexAligned\r\n * The default value is 1e-6\r\n * This option is used only if useAlternateEdgeFinder = true\r\n */\r\n epsilonVertexAligned?: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that degenerated triangles should not be processed.\r\n * Degenerated triangles are triangles that have 2 or 3 vertices with the same coordinates\r\n */\r\n removeDegeneratedTriangles?: boolean;\r\n}\r\n\r\n/**\r\n * This class is used to generate edges of the mesh that could then easily be rendered in a scene.\r\n */\r\nexport class EdgesRenderer implements IEdgesRenderer {\r\n /**\r\n * Define the size of the edges with an orthographic camera\r\n */\r\n public edgesWidthScalerForOrthographic = 1000.0;\r\n\r\n /**\r\n * Define the size of the edges with a perspective camera\r\n */\r\n public edgesWidthScalerForPerspective = 50.0;\r\n\r\n protected _source: AbstractMesh;\r\n protected _linesPositions = new Array<number>();\r\n protected _linesNormals = new Array<number>();\r\n protected _linesIndices = new Array<number>();\r\n protected _epsilon: number;\r\n protected _indicesCount: number;\r\n protected _drawWrapper?: DrawWrapper;\r\n\r\n protected _lineShader: ShaderMaterial;\r\n protected _ib: DataBuffer;\r\n protected _buffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n protected _buffersForInstances: { [key: string]: Nullable<VertexBuffer> } = {};\r\n protected _checkVerticesInsteadOfIndices = false;\r\n protected _options: Nullable<IEdgesRendererOptions>;\r\n\r\n private _meshRebuildObserver: Nullable<Observer<AbstractMesh>>;\r\n private _meshDisposeObserver: Nullable<Observer<Node>>;\r\n\r\n /** Gets or sets a boolean indicating if the edgesRenderer is active */\r\n public isEnabled = true;\r\n\r\n /** Gets the vertices generated by the edge renderer */\r\n public get linesPositions(): Immutable<Array<number>> {\r\n return this._linesPositions;\r\n }\r\n\r\n /** Gets the normals generated by the edge renderer */\r\n public get linesNormals(): Immutable<Array<number>> {\r\n return this._linesNormals;\r\n }\r\n\r\n /** Gets the indices generated by the edge renderer */\r\n public get linesIndices(): Immutable<Array<number>> {\r\n return this._linesIndices;\r\n }\r\n\r\n /**\r\n * Gets or sets the shader used to draw the lines\r\n */\r\n public get lineShader(): ShaderMaterial {\r\n return this._lineShader;\r\n }\r\n\r\n public set lineShader(shader: ShaderMaterial) {\r\n this._lineShader = shader;\r\n }\r\n\r\n /**\r\n * List of instances to render in case the source mesh has instances\r\n */\r\n public customInstances = new SmartArray<Matrix>(32);\r\n\r\n private static _GetShader(scene: Scene, shaderLanguage: ShaderLanguage): ShaderMaterial {\r\n if (!scene._edgeRenderLineShader) {\r\n const shader = new ShaderMaterial(\r\n \"lineShader\",\r\n scene,\r\n \"line\",\r\n {\r\n attributes: [\"position\", \"normal\"],\r\n uniforms: [\"world\", \"viewProjection\", \"color\", \"width\", \"aspectRatio\"],\r\n uniformBuffers: [\"Scene\", \"Mesh\"],\r\n shaderLanguage: shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/line.vertex\"), import(\"../ShadersWGSL/line.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/line.vertex\"), import(\"../Shaders/line.fragment\")]);\r\n }\r\n },\r\n },\r\n false\r\n );\r\n\r\n shader.disableDepthWrite = true;\r\n shader.backFaceCulling = false;\r\n shader.checkReadyOnEveryCall = scene.getEngine().isWebGPU;\r\n\r\n scene._edgeRenderLineShader = shader;\r\n\r\n scene.onDisposeObservable.add(() => {\r\n scene._edgeRenderLineShader!.dispose();\r\n scene._edgeRenderLineShader = null;\r\n });\r\n }\r\n\r\n return scene._edgeRenderLineShader;\r\n }\r\n\r\n /** Shader language used*/\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Creates an instance of the EdgesRenderer. It is primarily use to display edges of a mesh.\r\n * Beware when you use this class with complex objects as the adjacencies computation can be really long\r\n * @param source Mesh used to create edges\r\n * @param epsilon sum of angles in adjacency to check for edge\r\n * @param checkVerticesInsteadOfIndices bases the edges detection on vertices vs indices. Note that this parameter is not used if options.useAlternateEdgeFinder = true\r\n * @param generateEdgesLines - should generate Lines or only prepare resources.\r\n * @param options The options to apply when generating the edges\r\n */\r\n constructor(source: AbstractMesh, epsilon = 0.95, checkVerticesInsteadOfIndices = false, generateEdgesLines = true, options?: IEdgesRendererOptions) {\r\n this._source = source;\r\n this._checkVerticesInsteadOfIndices = checkVerticesInsteadOfIndices;\r\n this._options = options ?? null;\r\n\r\n this._epsilon = epsilon;\r\n const engine = this._source.getScene().getEngine();\r\n if (engine.isWebGPU) {\r\n this._drawWrapper = new DrawWrapper(engine);\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n this._prepareRessources();\r\n if (generateEdgesLines) {\r\n if (options?.useAlternateEdgeFinder ?? true) {\r\n this._generateEdgesLinesAlternate();\r\n } else {\r\n this._generateEdgesLines();\r\n }\r\n }\r\n\r\n this._meshRebuildObserver = this._source.onRebuildObservable.add(() => {\r\n this._rebuild();\r\n });\r\n\r\n this._meshDisposeObserver = this._source.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n }\r\n\r\n protected _prepareRessources(): void {\r\n if (this._lineShader) {\r\n return;\r\n }\r\n\r\n this._lineShader = EdgesRenderer._GetShader(this._source.getScene(), this._shaderLanguage);\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n let buffer = this._buffers[VertexBuffer.PositionKind];\r\n if (buffer) {\r\n buffer._rebuild();\r\n }\r\n\r\n buffer = this._buffers[VertexBuffer.NormalKind];\r\n if (buffer) {\r\n buffer._rebuild();\r\n }\r\n\r\n const scene = this._source.getScene();\r\n const engine = scene.getEngine();\r\n this._ib = engine.createIndexBuffer(this._linesIndices);\r\n }\r\n\r\n /**\r\n * Releases the required resources for the edges renderer\r\n */\r\n public dispose(): void {\r\n this._source.onRebuildObservable.remove(this._meshRebuildObserver);\r\n this._source.onDisposeObservable.remove(this._meshDisposeObserver);\r\n\r\n let buffer = this._buffers[VertexBuffer.PositionKind];\r\n if (buffer) {\r\n buffer.dispose();\r\n this._buffers[VertexBuffer.PositionKind] = null;\r\n }\r\n buffer = this._buffers[VertexBuffer.NormalKind];\r\n if (buffer) {\r\n buffer.dispose();\r\n this._buffers[VertexBuffer.NormalKind] = null;\r\n }\r\n\r\n if (this._ib) {\r\n this._source.getScene().getEngine()._releaseBuffer(this._ib);\r\n }\r\n\r\n this._drawWrapper?.dispose();\r\n }\r\n\r\n protected _processEdgeForAdjacencies(pa: number, pb: number, p0: number, p1: number, p2: number): number {\r\n if ((pa === p0 && pb === p1) || (pa === p1 && pb === p0)) {\r\n return 0;\r\n }\r\n\r\n if ((pa === p1 && pb === p2) || (pa === p2 && pb === p1)) {\r\n return 1;\r\n }\r\n\r\n if ((pa === p2 && pb === p0) || (pa === p0 && pb === p2)) {\r\n return 2;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n protected _processEdgeForAdjacenciesWithVertices(pa: Vector3, pb: Vector3, p0: Vector3, p1: Vector3, p2: Vector3): number {\r\n const eps = 1e-10;\r\n if ((pa.equalsWithEpsilon(p0, eps) && pb.equalsWithEpsilon(p1, eps)) || (pa.equalsWithEpsilon(p1, eps) && pb.equalsWithEpsilon(p0, eps))) {\r\n return 0;\r\n }\r\n\r\n if ((pa.equalsWithEpsilon(p1, eps) && pb.equalsWithEpsilon(p2, eps)) || (pa.equalsWithEpsilon(p2, eps) && pb.equalsWithEpsilon(p1, eps))) {\r\n return 1;\r\n }\r\n\r\n if ((pa.equalsWithEpsilon(p2, eps) && pb.equalsWithEpsilon(p0, eps)) || (pa.equalsWithEpsilon(p0, eps) && pb.equalsWithEpsilon(p2, eps))) {\r\n return 2;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n /**\r\n * Checks if the pair of p0 and p1 is en edge\r\n * @param faceIndex\r\n * @param edge\r\n * @param faceNormals\r\n * @param p0\r\n * @param p1\r\n * @private\r\n */\r\n protected _checkEdge(faceIndex: number, edge: number, faceNormals: Array<Vector3>, p0: Vector3, p1: Vector3): void {\r\n let needToCreateLine;\r\n\r\n if (edge === undefined) {\r\n needToCreateLine = true;\r\n } else {\r\n const dotProduct = Vector3.Dot(faceNormals[faceIndex], faceNormals[edge]);\r\n\r\n needToCreateLine = dotProduct < this._epsilon;\r\n }\r\n\r\n if (needToCreateLine) {\r\n this.createLine(p0, p1, this._linesPositions.length / 3);\r\n }\r\n }\r\n\r\n /**\r\n * push line into the position, normal and index buffer\r\n * @param p0\r\n * @param p1\r\n * @param offset\r\n * @protected\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected createLine(p0: Vector3, p1: Vector3, offset: number) {\r\n // Positions\r\n this._linesPositions.push(p0.x, p0.y, p0.z, p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, p1.x, p1.y, p1.z);\r\n\r\n // Normals\r\n this._linesNormals.push(p1.x, p1.y, p1.z, -1, p1.x, p1.y, p1.z, 1, p0.x, p0.y, p0.z, -1, p0.x, p0.y, p0.z, 1);\r\n\r\n // Indices\r\n this._linesIndices.push(offset, offset + 1, offset + 2, offset, offset + 2, offset + 3);\r\n }\r\n\r\n /**\r\n * See https://playground.babylonjs.com/#R3JR6V#1 for a visual display of the algorithm\r\n * @param edgePoints\r\n * @param indexTriangle\r\n * @param indices\r\n * @param remapVertexIndices\r\n */\r\n private _tessellateTriangle(edgePoints: Array<Array<[number, number]>>, indexTriangle: number, indices: Array<number>, remapVertexIndices: Array<number>): void {\r\n const makePointList = (edgePoints: Array<[number, number]>, pointIndices: Array<number>, firstIndex: number) => {\r\n if (firstIndex >= 0) {\r\n pointIndices.push(firstIndex);\r\n }\r\n\r\n for (let i = 0; i < edgePoints.length; ++i) {\r\n pointIndices.push(edgePoints[i][0]);\r\n }\r\n };\r\n\r\n let startEdge = 0;\r\n\r\n if (edgePoints[1].length >= edgePoints[0].length && edgePoints[1].length >= edgePoints[2].length) {\r\n startEdge = 1;\r\n } else if (edgePoints[2].length >= edgePoints[0].length && edgePoints[2].length >= edgePoints[1].length) {\r\n startEdge = 2;\r\n }\r\n\r\n for (let e = 0; e < 3; ++e) {\r\n if (e === startEdge) {\r\n edgePoints[e].sort((a, b) => (a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0));\r\n } else {\r\n edgePoints[e].sort((a, b) => (a[1] > b[1] ? -1 : a[1] < b[1] ? 1 : 0));\r\n }\r\n }\r\n\r\n const mainPointIndices: Array<number> = [],\r\n otherPointIndices: Array<number> = [];\r\n\r\n makePointList(edgePoints[startEdge], mainPointIndices, -1);\r\n\r\n const numMainPoints = mainPointIndices.length;\r\n\r\n for (let i = startEdge + 2; i >= startEdge + 1; --i) {\r\n makePointList(edgePoints[i % 3], otherPointIndices, i !== startEdge + 2 ? remapVertexIndices[indices[indexTriangle + ((i + 1) % 3)]] : -1);\r\n }\r\n\r\n const numOtherPoints = otherPointIndices.length;\r\n\r\n const idxMain = 0;\r\n const idxOther = 0;\r\n\r\n indices.push(remapVertexIndices[indices[indexTriangle + startEdge]], mainPointIndices[0], otherPointIndices[0]);\r\n indices.push(remapVertexIndices[indices[indexTriangle + ((startEdge + 1) % 3)]], otherPointIndices[numOtherPoints - 1], mainPointIndices[numMainPoints - 1]);\r\n\r\n const bucketIsMain = numMainPoints <= numOtherPoints;\r\n\r\n const bucketStep = bucketIsMain ? numMainPoints : numOtherPoints;\r\n const bucketLimit = bucketIsMain ? numOtherPoints : numMainPoints;\r\n const bucketIdxLimit = bucketIsMain ? numMainPoints - 1 : numOtherPoints - 1;\r\n const winding = bucketIsMain ? 0 : 1;\r\n\r\n let numTris = numMainPoints + numOtherPoints - 2;\r\n\r\n let bucketIdx = bucketIsMain ? idxMain : idxOther;\r\n let nbucketIdx = bucketIsMain ? idxOther : idxMain;\r\n const bucketPoints = bucketIsMain ? mainPointIndices : otherPointIndices;\r\n const nbucketPoints = bucketIsMain ? otherPointIndices : mainPointIndices;\r\n\r\n let bucket = 0;\r\n\r\n while (numTris-- > 0) {\r\n if (winding) {\r\n indices.push(bucketPoints[bucketIdx], nbucketPoints[nbucketIdx]);\r\n } else {\r\n indices.push(nbucketPoints[nbucketIdx], bucketPoints[bucketIdx]);\r\n }\r\n\r\n bucket += bucketStep;\r\n\r\n let lastIdx;\r\n\r\n if (bucket >= bucketLimit && bucketIdx < bucketIdxLimit) {\r\n lastIdx = bucketPoints[++bucketIdx];\r\n bucket -= bucketLimit;\r\n } else {\r\n lastIdx = nbucketPoints[++nbucketIdx];\r\n }\r\n\r\n indices.push(lastIdx);\r\n }\r\n\r\n indices[indexTriangle + 0] = indices[indices.length - 3];\r\n indices[indexTriangle + 1] = indices[indices.length - 2];\r\n indices[indexTriangle + 2] = indices[indices.length - 1];\r\n\r\n indices.length = indices.length - 3;\r\n }\r\n\r\n private _generateEdgesLinesAlternate(): void {\r\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\r\n let indices = this._source.getIndices();\r\n\r\n if (!indices || !positions) {\r\n return;\r\n }\r\n\r\n if (!Array.isArray(indices)) {\r\n indices = Array.from(indices);\r\n }\r\n\r\n /**\r\n * Find all vertices that are at the same location (with an epsilon) and remapp them on the same vertex\r\n */\r\n const useFastVertexMerger = this._options?.useFastVertexMerger ?? true;\r\n const epsVertexMerge = useFastVertexMerger ? Math.round(-Math.log(this._options?.epsilonVertexMerge ?? 1e-6) / Math.log(10)) : (this._options?.epsilonVertexMerge ?? 1e-6);\r\n const remapVertexIndices: Array<number> = [];\r\n const uniquePositions: Array<number> = []; // list of unique index of vertices - needed for tessellation\r\n\r\n if (useFastVertexMerger) {\r\n const mapVertices: { [key: string]: number } = {};\r\n for (let v1 = 0; v1 < positions.length; v1 += 3) {\r\n const x1 = positions[v1 + 0],\r\n y1 = positions[v1 + 1],\r\n z1 = positions[v1 + 2];\r\n\r\n const key = x1.toFixed(epsVertexMerge) + \"|\" + y1.toFixed(epsVertexMerge) + \"|\" + z1.toFixed(epsVertexMerge);\r\n\r\n if (mapVertices[key] !== undefined) {\r\n remapVertexIndices.push(mapVertices[key]);\r\n } else {\r\n const idx = v1 / 3;\r\n mapVertices[key] = idx;\r\n remapVertexIndices.push(idx);\r\n uniquePositions.push(idx);\r\n }\r\n }\r\n } else {\r\n for (let v1 = 0; v1 < positions.length; v1 += 3) {\r\n const x1 = positions[v1 + 0],\r\n y1 = positions[v1 + 1],\r\n z1 = positions[v1 + 2];\r\n let found = false;\r\n for (let v2 = 0; v2 < v1 && !found; v2 += 3) {\r\n const x2 = positions[v2 + 0],\r\n y2 = positions[v2 + 1],\r\n z2 = positions[v2 + 2];\r\n\r\n if (Math.abs(x1 - x2) < epsVertexMerge && Math.abs(y1 - y2) < epsVertexMerge && Math.abs(z1 - z2) < epsVertexMerge) {\r\n remapVertexIndices.push(v2 / 3);\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!found) {\r\n remapVertexIndices.push(v1 / 3);\r\n uniquePositions.push(v1 / 3);\r\n }\r\n }\r\n }\r\n\r\n if (this._options?.applyTessellation) {\r\n /**\r\n * Tessellate triangles if necessary:\r\n *\r\n * A\r\n * +\r\n * |\\\r\n * | \\\r\n * | \\\r\n * E + \\\r\n * /| \\\r\n * / | \\\r\n * / | \\\r\n * +---+-------+ B\r\n * D C\r\n *\r\n * For the edges to be rendered correctly, the ABC triangle has to be split into ABE and BCE, else AC is considered to be an edge, whereas only AE should be.\r\n *\r\n * The tessellation process looks for the vertices like E that are in-between two other vertices making of an edge and create new triangles as necessary\r\n */\r\n\r\n // First step: collect the triangles to tessellate\r\n const epsVertexAligned = this._options?.epsilonVertexAligned ?? 1e-6;\r\n const mustTesselate: Array<{ index: number; edgesPoints: Array<Array<[number, number]>> }> = []; // liste of triangles that must be tessellated\r\n\r\n for (let index = 0; index < indices.length; index += 3) {\r\n // loop over all triangles\r\n let triangleToTessellate: { index: number; edgesPoints: Array<Array<[number, number]>> } | undefined;\r\n\r\n for (let i = 0; i < 3; ++i) {\r\n // loop over the 3 edges of the triangle\r\n const p0Index = remapVertexIndices[indices[index + i]];\r\n const p1Index = remapVertexIndices[indices[index + ((i + 1) % 3)]];\r\n const p2Index = remapVertexIndices[indices[index + ((i + 2) % 3)]];\r\n\r\n if (p0Index === p1Index) {\r\n continue;\r\n } // degenerated triangle - don't process\r\n\r\n const p0x = positions[p0Index * 3 + 0],\r\n p0y = positions[p0Index * 3 + 1],\r\n p0z = positions[p0Index * 3 + 2];\r\n const p1x = positions[p1Index * 3 + 0],\r\n p1y = positions[p1Index * 3 + 1],\r\n p1z = positions[p1Index * 3 + 2];\r\n\r\n const p0p1 = Math.sqrt((p1x - p0x) * (p1x - p0x) + (p1y - p0y) * (p1y - p0y) + (p1z - p0z) * (p1z - p0z));\r\n\r\n for (let v = 0; v < uniquePositions.length - 1; v++) {\r\n // loop over all (unique) vertices and look for the ones that would be in-between p0 and p1\r\n const vIndex = uniquePositions[v];\r\n\r\n if (vIndex === p0Index || vIndex === p1Index || vIndex === p2Index) {\r\n continue;\r\n } // don't handle the vertex if it is a vertex of the current triangle\r\n\r\n const x = positions[vIndex * 3 + 0],\r\n y = positions[vIndex * 3 + 1],\r\n z = positions[vIndex * 3 + 2];\r\n\r\n const p0p = Math.sqrt((x - p0x) * (x - p0x) + (y - p0y) * (y - p0y) + (z - p0z) * (z - p0z));\r\n const pp1 = Math.sqrt((x - p1x) * (x - p1x) + (y - p1y) * (y - p1y) + (z - p1z) * (z - p1z));\r\n\r\n if (Math.abs(p0p + pp1 - p0p1) < epsVertexAligned) {\r\n // vertices are aligned and p in-between p0 and p1 if distance(p0, p) + distance (p, p1) ~ distance(p0, p1)\r\n if (!triangleToTessellate) {\r\n triangleToTessellate = {\r\n index: index,\r\n edgesPoints: [[], [], []],\r\n };\r\n mustTesselate.push(triangleToTessellate);\r\n }\r\n triangleToTessellate.edgesPoints[i].push([vIndex, p0p]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Second step: tesselate the triangles\r\n for (let t = 0; t < mustTesselate.length; ++t) {\r\n const triangle = mustTesselate[t];\r\n\r\n this._tessellateTriangle(triangle.edgesPoints, triangle.index, indices, remapVertexIndices);\r\n }\r\n\r\n mustTesselate.length = 0;\r\n }\r\n\r\n /**\r\n * Collect the edges to render\r\n */\r\n const edges: { [key: string]: { normal: Vector3; done: boolean; index: number; i: number } } = {};\r\n\r\n for (let index = 0; index < indices.length; index += 3) {\r\n let faceNormal;\r\n for (let i = 0; i < 3; ++i) {\r\n let p0Index = remapVertexIndices[indices[index + i]];\r\n let p1Index = remapVertexIndices[indices[index + ((i + 1) % 3)]];\r\n const p2Index = remapVertexIndices[indices[index + ((i + 2) % 3)]];\r\n\r\n if (p0Index === p1Index || ((p0Index === p2Index || p1Index === p2Index) && this._options?.removeDegeneratedTriangles)) {\r\n continue;\r\n }\r\n\r\n TmpVectors.Vector3[0].copyFromFloats(positions[p0Index * 3 + 0], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\r\n TmpVectors.Vector3[1].copyFromFloats(positions[p1Index * 3 + 0], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\r\n TmpVectors.Vector3[2].copyFromFloats(positions[p2Index * 3 + 0], positions[p2Index * 3 + 1], positions[p2Index * 3 + 2]);\r\n\r\n if (!faceNormal) {\r\n TmpVectors.Vector3[1].subtractToRef(TmpVectors.Vector3[0], TmpVectors.Vector3[3]);\r\n TmpVectors.Vector3[2].subtractToRef(TmpVectors.Vector3[1], TmpVectors.Vector3[4]);\r\n faceNormal = Vector3.Cross(TmpVectors.Vector3[3], TmpVectors.Vector3[4]);\r\n faceNormal.normalize();\r\n }\r\n\r\n if (p0Index > p1Index) {\r\n const tmp = p0Index;\r\n p0Index = p1Index;\r\n p1Index = tmp;\r\n }\r\n\r\n const key = p0Index + \"_\" + p1Index;\r\n const ei = edges[key];\r\n\r\n if (ei) {\r\n if (!ei.done) {\r\n const dotProduct = Vector3.Dot(faceNormal, ei.normal);\r\n\r\n if (dotProduct < this._epsilon) {\r\n this.createLine(TmpVectors.Vector3[0], TmpVectors.Vector3[1], this._linesPositions.length / 3);\r\n }\r\n\r\n ei.done = true;\r\n }\r\n } else {\r\n edges[key] = { normal: faceNormal, done: false, index: index, i: i };\r\n }\r\n }\r\n }\r\n\r\n for (const key in edges) {\r\n const ei = edges[key];\r\n if (!ei.done) {\r\n // Orphaned edge - we must display it\r\n const p0Index = remapVertexIndices[indices[ei.index + ei.i]];\r\n const p1Index = remapVertexIndices[indices[ei.index + ((ei.i + 1) % 3)]];\r\n\r\n TmpVectors.Vector3[0].copyFromFloats(positions[p0Index * 3 + 0], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\r\n TmpVectors.Vector3[1].copyFromFloats(positions[p1Index * 3 + 0], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\r\n\r\n this.createLine(TmpVectors.Vector3[0], TmpVectors.Vector3[1], this._linesPositions.length / 3);\r\n }\r\n }\r\n\r\n /**\r\n * Merge into a single mesh\r\n */\r\n const engine = this._source.getScene().getEngine();\r\n\r\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\r\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\r\n\r\n this._buffersForInstances[VertexBuffer.PositionKind] = this._buffers[VertexBuffer.PositionKind];\r\n this._buffersForInstances[VertexBuffer.NormalKind] = this._buffers[VertexBuffer.NormalKind];\r\n\r\n this._ib = engine.createIndexBuffer(this._linesIndices);\r\n\r\n this._indicesCount = this._linesIndices.length;\r\n }\r\n\r\n /**\r\n * Generates lines edges from adjacencjes\r\n * @private\r\n */\r\n _generateEdgesLines(): void {\r\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this._source.getIndices();\r\n\r\n if (!indices || !positions) {\r\n return;\r\n }\r\n\r\n // First let's find adjacencies\r\n const adjacencies: FaceAdjacencies[] = [];\r\n const faceNormals: Vector3[] = [];\r\n let index: number;\r\n let faceAdjacencies: FaceAdjacencies;\r\n\r\n // Prepare faces\r\n for (index = 0; index < indices.length; index += 3) {\r\n faceAdjacencies = new FaceAdjacencies();\r\n const p0Index = indices[index];\r\n const p1Index = indices[index + 1];\r\n const p2Index = indices[index + 2];\r\n\r\n faceAdjacencies.p0 = new Vector3(positions[p0Index * 3], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\r\n faceAdjacencies.p1 = new Vector3(positions[p1Index * 3], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\r\n faceAdjacencies.p2 = new Vector3(positions[p2Index * 3], positions[p2Index * 3 + 1], positions[p2Index * 3 + 2]);\r\n const faceNormal = Vector3.Cross(faceAdjacencies.p1.subtract(faceAdjacencies.p0), faceAdjacencies.p2.subtract(faceAdjacencies.p1));\r\n\r\n faceNormal.normalize();\r\n\r\n faceNormals.push(faceNormal);\r\n adjacencies.push(faceAdjacencies);\r\n }\r\n\r\n // Scan\r\n for (index = 0; index < adjacencies.length; index++) {\r\n faceAdjacencies = adjacencies[index];\r\n\r\n for (let otherIndex = index + 1; otherIndex < adjacencies.length; otherIndex++) {\r\n const otherFaceAdjacencies = adjacencies[otherIndex];\r\n\r\n if (faceAdjacencies.edgesConnectedCount === 3) {\r\n // Full\r\n break;\r\n }\r\n\r\n if (otherFaceAdjacencies.edgesConnectedCount === 3) {\r\n // Full\r\n continue;\r\n }\r\n\r\n const otherP0 = indices[otherIndex * 3];\r\n const otherP1 = indices[otherIndex * 3 + 1];\r\n const otherP2 = indices[otherIndex * 3 + 2];\r\n\r\n for (let edgeIndex = 0; edgeIndex < 3; edgeIndex++) {\r\n let otherEdgeIndex: number = 0;\r\n\r\n if (faceAdjacencies.edges[edgeIndex] !== undefined) {\r\n continue;\r\n }\r\n\r\n switch (edgeIndex) {\r\n case 0:\r\n if (this._checkVerticesInsteadOfIndices) {\r\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(\r\n faceAdjacencies.p0,\r\n faceAdjacencies.p1,\r\n otherFaceAdjacencies.p0,\r\n otherFaceAdjacencies.p1,\r\n otherFaceAdjacencies.p2\r\n );\r\n } else {\r\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3], indices[index * 3 + 1], otherP0, otherP1, otherP2);\r\n }\r\n break;\r\n case 1:\r\n if (this._checkVerticesInsteadOfIndices) {\r\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(\r\n faceAdjacencies.p1,\r\n faceAdjacencies.p2,\r\n otherFaceAdjacencies.p0,\r\n otherFaceAdjacencies.p1,\r\n otherFaceAdjacencies.p2\r\n );\r\n } else {\r\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3 + 1], indices[index * 3 + 2], otherP0, otherP1, otherP2);\r\n }\r\n break;\r\n case 2:\r\n if (this._checkVerticesInsteadOfIndices) {\r\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(\r\n faceAdjacencies.p2,\r\n faceAdjacencies.p0,\r\n otherFaceAdjacencies.p0,\r\n otherFaceAdjacencies.p1,\r\n otherFaceAdjacencies.p2\r\n );\r\n } else {\r\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3 + 2], indices[index * 3], otherP0, otherP1, otherP2);\r\n }\r\n break;\r\n }\r\n\r\n if (otherEdgeIndex === -1) {\r\n continue;\r\n }\r\n\r\n faceAdjacencies.edges[edgeIndex] = otherIndex;\r\n otherFaceAdjacencies.edges[otherEdgeIndex] = index;\r\n\r\n faceAdjacencies.edgesConnectedCount++;\r\n otherFaceAdjacencies.edgesConnectedCount++;\r\n\r\n if (faceAdjacencies.edgesConnectedCount === 3) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Create lines\r\n for (index = 0; index < adjacencies.length; index++) {\r\n // We need a line when a face has no adjacency on a specific edge or if all the adjacencies has an angle greater than epsilon\r\n const current = adjacencies[index];\r\n\r\n this._checkEdge(index, current.edges[0], faceNormals, current.p0, current.p1);\r\n this._checkEdge(index, current.edges[1], faceNormals, current.p1, current.p2);\r\n this._checkEdge(index, current.edges[2], faceNormals, current.p2, current.p0);\r\n }\r\n\r\n // Merge into a single mesh\r\n const engine = this._source.getScene().getEngine();\r\n\r\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\r\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\r\n\r\n this._buffersForInstances[VertexBuffer.PositionKind] = this._buffers[VertexBuffer.PositionKind];\r\n this._buffersForInstances[VertexBuffer.NormalKind] = this._buffers[VertexBuffer.NormalKind];\r\n\r\n this._ib = engine.createIndexBuffer(this._linesIndices);\r\n\r\n this._indicesCount = this._linesIndices.length;\r\n }\r\n\r\n /**\r\n * Checks whether or not the edges renderer is ready to render.\r\n * @returns true if ready, otherwise false.\r\n */\r\n public isReady(): boolean {\r\n return this._lineShader.isReady(this._source, (this._source.hasInstances && this.customInstances.length > 0) || this._source.hasThinInstances);\r\n }\r\n\r\n /**\r\n * Renders the edges of the attached mesh,\r\n */\r\n public render(): void {\r\n const scene = this._source.getScene();\r\n\r\n const currentDrawWrapper = this._lineShader._getDrawWrapper();\r\n if (this._drawWrapper) {\r\n this._lineShader._setDrawWrapper(this._drawWrapper);\r\n }\r\n\r\n if (!this.isReady() || !scene.activeCamera) {\r\n this._lineShader._setDrawWrapper(currentDrawWrapper);\r\n return;\r\n }\r\n\r\n const hasInstances = this._source.hasInstances && this.customInstances.length > 0;\r\n const useBuffersWithInstances = hasInstances || this._source.hasThinInstances;\r\n\r\n let instanceCount = 0;\r\n\r\n if (useBuffersWithInstances) {\r\n this._buffersForInstances[\"world0\"] = (this._source as Mesh).getVertexBuffer(\"world0\");\r\n this._buffersForInstances[\"world1\"] = (this._source as Mesh).getVertexBuffer(\"world1\");\r\n this._buffersForInstances[\"world2\"] = (this._source as Mesh).getVertexBuffer(\"world2\");\r\n this._buffersForInstances[\"world3\"] = (this._source as Mesh).getVertexBuffer(\"world3\");\r\n\r\n if (hasInstances) {\r\n const instanceStorage = (this._source as Mesh)._instanceDataStorage;\r\n\r\n instanceCount = this.customInstances.length;\r\n\r\n if (!instanceStorage.instancesData) {\r\n if (!this._source.getScene()._activeMeshesFrozen) {\r\n this.customInstances.reset();\r\n }\r\n return;\r\n }\r\n\r\n if (!instanceStorage.isFrozen) {\r\n let offset = 0;\r\n\r\n for (let i = 0; i < instanceCount; ++i) {\r\n this.customInstances.data[i].copyToArray(instanceStorage.instancesData, offset);\r\n offset += 16;\r\n }\r\n\r\n instanceStorage.instancesBuffer!.updateDirectly(instanceStorage.instancesData, 0, instanceCount);\r\n }\r\n } else {\r\n instanceCount = (this._source as Mesh).thinInstanceCount;\r\n }\r\n }\r\n\r\n const engine = scene.getEngine();\r\n this._lineShader._preBind();\r\n\r\n if (this._source.edgesColor.a !== 1) {\r\n engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n } else {\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // VBOs\r\n engine.bindBuffers(useBuffersWithInstances ? this._buffersForInstances : this._buffers, this._ib, this._lineShader.getEffect());\r\n\r\n scene.resetCachedMaterial();\r\n this._lineShader.setColor4(\"color\", this._source.edgesColor);\r\n\r\n if (scene.activeCamera.mode === Camera.ORTHOGRAPHIC_CAMERA) {\r\n this._lineShader.setFloat(\"width\", this._source.edgesWidth / this.edgesWidthScalerForOrthographic);\r\n } else {\r\n this._lineShader.setFloat(\"width\", this._source.edgesWidth / this.edgesWidthScalerForPerspective);\r\n }\r\n\r\n this._lineShader.setFloat(\"aspectRatio\", engine.getAspectRatio(scene.activeCamera));\r\n this._lineShader.bind(this._source.getWorldMatrix(), this._source);\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.TriangleFillMode, 0, this._indicesCount, instanceCount);\r\n this._lineShader.unbind();\r\n\r\n if (useBuffersWithInstances) {\r\n engine.unbindInstanceAttributes();\r\n }\r\n\r\n if (!this._source.getScene()._activeMeshesFrozen) {\r\n this.customInstances.reset();\r\n }\r\n\r\n this._lineShader._setDrawWrapper(currentDrawWrapper);\r\n }\r\n}\r\n\r\n/**\r\n * LineEdgesRenderer for LineMeshes to remove unnecessary triangulation\r\n */\r\nexport class LineEdgesRenderer extends EdgesRenderer {\r\n /**\r\n * This constructor turns off auto generating edges line in Edges Renderer to make it here.\r\n * @param source LineMesh used to generate edges\r\n * @param epsilon not important (specified angle for edge detection)\r\n * @param checkVerticesInsteadOfIndices not important for LineMesh\r\n */\r\n constructor(source: AbstractMesh, epsilon = 0.95, checkVerticesInsteadOfIndices = false) {\r\n super(source, epsilon, checkVerticesInsteadOfIndices, false);\r\n this._generateEdgesLines();\r\n }\r\n\r\n /**\r\n * Generate edges for each line in LinesMesh. Every Line should be rendered as edge.\r\n */\r\n override _generateEdgesLines(): void {\r\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this._source.getIndices();\r\n\r\n if (!indices || !positions) {\r\n return;\r\n }\r\n\r\n const p0 = TmpVectors.Vector3[0];\r\n const p1 = TmpVectors.Vector3[1];\r\n const len = indices.length - 1;\r\n for (let i = 0, offset = 0; i < len; i += 2, offset += 4) {\r\n Vector3.FromArrayToRef(positions, 3 * indices[i], p0);\r\n Vector3.FromArrayToRef(positions, 3 * indices[i + 1], p1);\r\n this.createLine(p0, p1, offset);\r\n }\r\n\r\n // Merge into a single mesh\r\n const engine = this._source.getScene().getEngine();\r\n\r\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\r\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\r\n\r\n this._ib = engine.createIndexBuffer(this._linesIndices);\r\n\r\n this._indicesCount = this._linesIndices.length;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"edgesRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/edgesRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Immutable, Nullable } from \"../types\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { LinesMesh, InstancedLinesMesh } from \"../Meshes/linesMesh\";\r\nimport type { Matrix } from \"../Maths/math.vector\";\r\nimport { Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { IDisposable, Scene } from \"../scene\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Node } from \"../node\";\r\n\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\ndeclare module \"../scene\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Scene {\r\n /** @internal */\r\n _edgeRenderLineShader: Nullable<ShaderMaterial>;\r\n }\r\n}\r\n\r\ndeclare module \"../Meshes/abstractMesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractMesh {\r\n /**\r\n * Gets the edgesRenderer associated with the mesh\r\n */\r\n edgesRenderer: Nullable<EdgesRenderer>;\r\n }\r\n}\r\nAbstractMesh.prototype.disableEdgesRendering = function (): AbstractMesh {\r\n if (this._edgesRenderer) {\r\n this._edgesRenderer.dispose();\r\n this._edgesRenderer = null;\r\n }\r\n return this;\r\n};\r\n\r\nAbstractMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false, options?: IEdgesRendererOptions): AbstractMesh {\r\n this.disableEdgesRendering();\r\n this._edgesRenderer = new EdgesRenderer(this, epsilon, checkVerticesInsteadOfIndices, true, options);\r\n return this;\r\n};\r\n\r\nObject.defineProperty(AbstractMesh.prototype, \"edgesRenderer\", {\r\n get: function (this: AbstractMesh) {\r\n return this._edgesRenderer;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\ndeclare module \"../Meshes/linesMesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface LinesMesh {\r\n /**\r\n * Enables the edge rendering mode on the mesh.\r\n * This mode makes the mesh edges visible\r\n * @param epsilon defines the maximal distance between two angles to detect a face\r\n * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces\r\n * @returns the currentAbstractMesh\r\n * @see https://www.babylonjs-playground.com/#19O9TU#0\r\n */\r\n enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean): AbstractMesh;\r\n }\r\n}\r\nLinesMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false): AbstractMesh {\r\n this.disableEdgesRendering();\r\n this._edgesRenderer = new LineEdgesRenderer(this, epsilon, checkVerticesInsteadOfIndices);\r\n return this;\r\n};\r\n\r\ndeclare module \"../Meshes/linesMesh\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface InstancedLinesMesh {\r\n /**\r\n * Enables the edge rendering mode on the mesh.\r\n * This mode makes the mesh edges visible\r\n * @param epsilon defines the maximal distance between two angles to detect a face\r\n * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces\r\n * @returns the current InstancedLinesMesh\r\n * @see https://www.babylonjs-playground.com/#19O9TU#0\r\n */\r\n enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean): InstancedLinesMesh;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nInstancedLinesMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false): InstancedLinesMesh {\r\n LinesMesh.prototype.enableEdgesRendering.apply(this, arguments);\r\n return this;\r\n};\r\n\r\n/**\r\n * FaceAdjacencies Helper class to generate edges\r\n */\r\nclass FaceAdjacencies {\r\n public edges: number[] = [];\r\n public p0: Vector3;\r\n public p1: Vector3;\r\n public p2: Vector3;\r\n public edgesConnectedCount = 0;\r\n}\r\n\r\n/**\r\n * Defines the minimum contract an Edges renderer should follow.\r\n */\r\nexport interface IEdgesRenderer extends IDisposable {\r\n /**\r\n * Gets or sets a boolean indicating if the edgesRenderer is active\r\n */\r\n isEnabled: boolean;\r\n\r\n /**\r\n * Renders the edges of the attached mesh,\r\n */\r\n render(): void;\r\n\r\n /**\r\n * Checks whether or not the edges renderer is ready to render.\r\n * @returns true if ready, otherwise false.\r\n */\r\n isReady(): boolean;\r\n\r\n /**\r\n * List of instances to render in case the source mesh has instances\r\n */\r\n customInstances: SmartArray<Matrix>;\r\n}\r\n\r\n/**\r\n * Defines the additional options of the edges renderer\r\n */\r\nexport interface IEdgesRendererOptions {\r\n /**\r\n * Gets or sets a boolean indicating that the alternate edge finder algorithm must be used\r\n * If not defined, the default value is true\r\n */\r\n useAlternateEdgeFinder?: boolean;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the vertex merger fast processing must be used.\r\n * If not defined, the default value is true.\r\n * You should normally leave it undefined (or set it to true), except if you see some artifacts in the edges rendering (can happen with complex geometries)\r\n * This option is used only if useAlternateEdgeFinder = true\r\n */\r\n useFastVertexMerger?: boolean;\r\n\r\n /**\r\n * During edges processing, the vertices are merged if they are close enough: epsilonVertexMerge is the limit within which vertices are considered to be equal.\r\n * The default value is 1e-6\r\n * This option is used only if useAlternateEdgeFinder = true\r\n */\r\n epsilonVertexMerge?: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that tessellation should be applied before finding the edges. You may need to activate this option if your geometry is a bit\r\n * unusual, like having a vertex of a triangle in-between two vertices of an edge of another triangle. It happens often when using CSG to construct meshes.\r\n * This option is used only if useAlternateEdgeFinder = true\r\n */\r\n applyTessellation?: boolean;\r\n\r\n /**\r\n * The limit under which 3 vertices are considered to be aligned. 3 vertices PQR are considered aligned if distance(PQ) + distance(QR) - distance(PR) < epsilonVertexAligned\r\n * The default value is 1e-6\r\n * This option is used only if useAlternateEdgeFinder = true\r\n */\r\n epsilonVertexAligned?: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that degenerated triangles should not be processed.\r\n * Degenerated triangles are triangles that have 2 or 3 vertices with the same coordinates\r\n */\r\n removeDegeneratedTriangles?: boolean;\r\n}\r\n\r\n/**\r\n * This class is used to generate edges of the mesh that could then easily be rendered in a scene.\r\n */\r\nexport class EdgesRenderer implements IEdgesRenderer {\r\n /**\r\n * Define the size of the edges with an orthographic camera\r\n */\r\n public edgesWidthScalerForOrthographic = 1000.0;\r\n\r\n /**\r\n * Define the size of the edges with a perspective camera\r\n */\r\n public edgesWidthScalerForPerspective = 50.0;\r\n\r\n protected _source: AbstractMesh;\r\n protected _linesPositions = new Array<number>();\r\n protected _linesNormals = new Array<number>();\r\n protected _linesIndices = new Array<number>();\r\n protected _epsilon: number;\r\n protected _indicesCount: number;\r\n protected _drawWrapper?: DrawWrapper;\r\n\r\n protected _lineShader: ShaderMaterial;\r\n protected _ib: DataBuffer;\r\n protected _buffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n protected _buffersForInstances: { [key: string]: Nullable<VertexBuffer> } = {};\r\n protected _checkVerticesInsteadOfIndices = false;\r\n protected _options: Nullable<IEdgesRendererOptions>;\r\n\r\n private _meshRebuildObserver: Nullable<Observer<AbstractMesh>>;\r\n private _meshDisposeObserver: Nullable<Observer<Node>>;\r\n\r\n /** Gets or sets a boolean indicating if the edgesRenderer is active */\r\n public isEnabled = true;\r\n\r\n /** Gets the vertices generated by the edge renderer */\r\n public get linesPositions(): Immutable<Array<number>> {\r\n return this._linesPositions;\r\n }\r\n\r\n /** Gets the normals generated by the edge renderer */\r\n public get linesNormals(): Immutable<Array<number>> {\r\n return this._linesNormals;\r\n }\r\n\r\n /** Gets the indices generated by the edge renderer */\r\n public get linesIndices(): Immutable<Array<number>> {\r\n return this._linesIndices;\r\n }\r\n\r\n /**\r\n * Gets or sets the shader used to draw the lines\r\n */\r\n public get lineShader(): ShaderMaterial {\r\n return this._lineShader;\r\n }\r\n\r\n public set lineShader(shader: ShaderMaterial) {\r\n this._lineShader = shader;\r\n }\r\n\r\n /**\r\n * List of instances to render in case the source mesh has instances\r\n */\r\n public customInstances = new SmartArray<Matrix>(32);\r\n\r\n private static _GetShader(scene: Scene, shaderLanguage: ShaderLanguage): ShaderMaterial {\r\n if (!scene._edgeRenderLineShader) {\r\n const shader = new ShaderMaterial(\r\n \"lineShader\",\r\n scene,\r\n \"line\",\r\n {\r\n attributes: [\"position\", \"normal\"],\r\n uniforms: [\"world\", \"viewProjection\", \"color\", \"width\", \"aspectRatio\"],\r\n uniformBuffers: [\"Scene\", \"Mesh\"],\r\n shaderLanguage: shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/line.vertex\"), import(\"../ShadersWGSL/line.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/line.vertex\"), import(\"../Shaders/line.fragment\")]);\r\n }\r\n },\r\n },\r\n false\r\n );\r\n\r\n shader.disableDepthWrite = true;\r\n shader.backFaceCulling = false;\r\n shader.checkReadyOnEveryCall = scene.getEngine().isWebGPU;\r\n\r\n scene._edgeRenderLineShader = shader;\r\n\r\n scene.onDisposeObservable.add(() => {\r\n scene._edgeRenderLineShader!.dispose();\r\n scene._edgeRenderLineShader = null;\r\n });\r\n }\r\n\r\n return scene._edgeRenderLineShader;\r\n }\r\n\r\n /** Shader language used*/\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Creates an instance of the EdgesRenderer. It is primarily use to display edges of a mesh.\r\n * Beware when you use this class with complex objects as the adjacencies computation can be really long\r\n * @param source Mesh used to create edges\r\n * @param epsilon sum of angles in adjacency to check for edge\r\n * @param checkVerticesInsteadOfIndices bases the edges detection on vertices vs indices. Note that this parameter is not used if options.useAlternateEdgeFinder = true\r\n * @param generateEdgesLines - should generate Lines or only prepare resources.\r\n * @param options The options to apply when generating the edges\r\n */\r\n constructor(source: AbstractMesh, epsilon = 0.95, checkVerticesInsteadOfIndices = false, generateEdgesLines = true, options?: IEdgesRendererOptions) {\r\n this._source = source;\r\n this._checkVerticesInsteadOfIndices = checkVerticesInsteadOfIndices;\r\n this._options = options ?? null;\r\n\r\n this._epsilon = epsilon;\r\n const engine = this._source.getScene().getEngine();\r\n if (engine.isWebGPU) {\r\n this._drawWrapper = new DrawWrapper(engine);\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n this._prepareResources();\r\n if (generateEdgesLines) {\r\n if (options?.useAlternateEdgeFinder ?? true) {\r\n this._generateEdgesLinesAlternate();\r\n } else {\r\n this._generateEdgesLines();\r\n }\r\n }\r\n\r\n this._meshRebuildObserver = this._source.onRebuildObservable.add(() => {\r\n this._rebuild();\r\n });\r\n\r\n this._meshDisposeObserver = this._source.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n }\r\n\r\n protected _prepareResources(): void {\r\n if (this._lineShader) {\r\n return;\r\n }\r\n\r\n this._lineShader = EdgesRenderer._GetShader(this._source.getScene(), this._shaderLanguage);\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n let buffer = this._buffers[VertexBuffer.PositionKind];\r\n if (buffer) {\r\n buffer._rebuild();\r\n }\r\n\r\n buffer = this._buffers[VertexBuffer.NormalKind];\r\n if (buffer) {\r\n buffer._rebuild();\r\n }\r\n\r\n const scene = this._source.getScene();\r\n const engine = scene.getEngine();\r\n this._ib = engine.createIndexBuffer(this._linesIndices);\r\n }\r\n\r\n /**\r\n * Releases the required resources for the edges renderer\r\n */\r\n public dispose(): void {\r\n this._source.onRebuildObservable.remove(this._meshRebuildObserver);\r\n this._source.onDisposeObservable.remove(this._meshDisposeObserver);\r\n\r\n let buffer = this._buffers[VertexBuffer.PositionKind];\r\n if (buffer) {\r\n buffer.dispose();\r\n this._buffers[VertexBuffer.PositionKind] = null;\r\n }\r\n buffer = this._buffers[VertexBuffer.NormalKind];\r\n if (buffer) {\r\n buffer.dispose();\r\n this._buffers[VertexBuffer.NormalKind] = null;\r\n }\r\n\r\n if (this._ib) {\r\n this._source.getScene().getEngine()._releaseBuffer(this._ib);\r\n }\r\n\r\n this._drawWrapper?.dispose();\r\n }\r\n\r\n protected _processEdgeForAdjacencies(pa: number, pb: number, p0: number, p1: number, p2: number): number {\r\n if ((pa === p0 && pb === p1) || (pa === p1 && pb === p0)) {\r\n return 0;\r\n }\r\n\r\n if ((pa === p1 && pb === p2) || (pa === p2 && pb === p1)) {\r\n return 1;\r\n }\r\n\r\n if ((pa === p2 && pb === p0) || (pa === p0 && pb === p2)) {\r\n return 2;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n protected _processEdgeForAdjacenciesWithVertices(pa: Vector3, pb: Vector3, p0: Vector3, p1: Vector3, p2: Vector3): number {\r\n const eps = 1e-10;\r\n if ((pa.equalsWithEpsilon(p0, eps) && pb.equalsWithEpsilon(p1, eps)) || (pa.equalsWithEpsilon(p1, eps) && pb.equalsWithEpsilon(p0, eps))) {\r\n return 0;\r\n }\r\n\r\n if ((pa.equalsWithEpsilon(p1, eps) && pb.equalsWithEpsilon(p2, eps)) || (pa.equalsWithEpsilon(p2, eps) && pb.equalsWithEpsilon(p1, eps))) {\r\n return 1;\r\n }\r\n\r\n if ((pa.equalsWithEpsilon(p2, eps) && pb.equalsWithEpsilon(p0, eps)) || (pa.equalsWithEpsilon(p0, eps) && pb.equalsWithEpsilon(p2, eps))) {\r\n return 2;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n /**\r\n * Checks if the pair of p0 and p1 is en edge\r\n * @param faceIndex\r\n * @param edge\r\n * @param faceNormals\r\n * @param p0\r\n * @param p1\r\n * @private\r\n */\r\n protected _checkEdge(faceIndex: number, edge: number, faceNormals: Array<Vector3>, p0: Vector3, p1: Vector3): void {\r\n let needToCreateLine;\r\n\r\n if (edge === undefined) {\r\n needToCreateLine = true;\r\n } else {\r\n const dotProduct = Vector3.Dot(faceNormals[faceIndex], faceNormals[edge]);\r\n\r\n needToCreateLine = dotProduct < this._epsilon;\r\n }\r\n\r\n if (needToCreateLine) {\r\n this.createLine(p0, p1, this._linesPositions.length / 3);\r\n }\r\n }\r\n\r\n /**\r\n * push line into the position, normal and index buffer\r\n * @param p0\r\n * @param p1\r\n * @param offset\r\n * @protected\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected createLine(p0: Vector3, p1: Vector3, offset: number) {\r\n // Positions\r\n this._linesPositions.push(p0.x, p0.y, p0.z, p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, p1.x, p1.y, p1.z);\r\n\r\n // Normals\r\n this._linesNormals.push(p1.x, p1.y, p1.z, -1, p1.x, p1.y, p1.z, 1, p0.x, p0.y, p0.z, -1, p0.x, p0.y, p0.z, 1);\r\n\r\n // Indices\r\n this._linesIndices.push(offset, offset + 1, offset + 2, offset, offset + 2, offset + 3);\r\n }\r\n\r\n /**\r\n * See https://playground.babylonjs.com/#R3JR6V#1 for a visual display of the algorithm\r\n * @param edgePoints\r\n * @param indexTriangle\r\n * @param indices\r\n * @param remapVertexIndices\r\n */\r\n private _tessellateTriangle(edgePoints: Array<Array<[number, number]>>, indexTriangle: number, indices: Array<number>, remapVertexIndices: Array<number>): void {\r\n const makePointList = (edgePoints: Array<[number, number]>, pointIndices: Array<number>, firstIndex: number) => {\r\n if (firstIndex >= 0) {\r\n pointIndices.push(firstIndex);\r\n }\r\n\r\n for (let i = 0; i < edgePoints.length; ++i) {\r\n pointIndices.push(edgePoints[i][0]);\r\n }\r\n };\r\n\r\n let startEdge = 0;\r\n\r\n if (edgePoints[1].length >= edgePoints[0].length && edgePoints[1].length >= edgePoints[2].length) {\r\n startEdge = 1;\r\n } else if (edgePoints[2].length >= edgePoints[0].length && edgePoints[2].length >= edgePoints[1].length) {\r\n startEdge = 2;\r\n }\r\n\r\n for (let e = 0; e < 3; ++e) {\r\n if (e === startEdge) {\r\n edgePoints[e].sort((a, b) => (a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0));\r\n } else {\r\n edgePoints[e].sort((a, b) => (a[1] > b[1] ? -1 : a[1] < b[1] ? 1 : 0));\r\n }\r\n }\r\n\r\n const mainPointIndices: Array<number> = [],\r\n otherPointIndices: Array<number> = [];\r\n\r\n makePointList(edgePoints[startEdge], mainPointIndices, -1);\r\n\r\n const numMainPoints = mainPointIndices.length;\r\n\r\n for (let i = startEdge + 2; i >= startEdge + 1; --i) {\r\n makePointList(edgePoints[i % 3], otherPointIndices, i !== startEdge + 2 ? remapVertexIndices[indices[indexTriangle + ((i + 1) % 3)]] : -1);\r\n }\r\n\r\n const numOtherPoints = otherPointIndices.length;\r\n\r\n const idxMain = 0;\r\n const idxOther = 0;\r\n\r\n indices.push(remapVertexIndices[indices[indexTriangle + startEdge]], mainPointIndices[0], otherPointIndices[0]);\r\n indices.push(remapVertexIndices[indices[indexTriangle + ((startEdge + 1) % 3)]], otherPointIndices[numOtherPoints - 1], mainPointIndices[numMainPoints - 1]);\r\n\r\n const bucketIsMain = numMainPoints <= numOtherPoints;\r\n\r\n const bucketStep = bucketIsMain ? numMainPoints : numOtherPoints;\r\n const bucketLimit = bucketIsMain ? numOtherPoints : numMainPoints;\r\n const bucketIdxLimit = bucketIsMain ? numMainPoints - 1 : numOtherPoints - 1;\r\n const winding = bucketIsMain ? 0 : 1;\r\n\r\n let numTris = numMainPoints + numOtherPoints - 2;\r\n\r\n let bucketIdx = bucketIsMain ? idxMain : idxOther;\r\n let nbucketIdx = bucketIsMain ? idxOther : idxMain;\r\n const bucketPoints = bucketIsMain ? mainPointIndices : otherPointIndices;\r\n const nbucketPoints = bucketIsMain ? otherPointIndices : mainPointIndices;\r\n\r\n let bucket = 0;\r\n\r\n while (numTris-- > 0) {\r\n if (winding) {\r\n indices.push(bucketPoints[bucketIdx], nbucketPoints[nbucketIdx]);\r\n } else {\r\n indices.push(nbucketPoints[nbucketIdx], bucketPoints[bucketIdx]);\r\n }\r\n\r\n bucket += bucketStep;\r\n\r\n let lastIdx;\r\n\r\n if (bucket >= bucketLimit && bucketIdx < bucketIdxLimit) {\r\n lastIdx = bucketPoints[++bucketIdx];\r\n bucket -= bucketLimit;\r\n } else {\r\n lastIdx = nbucketPoints[++nbucketIdx];\r\n }\r\n\r\n indices.push(lastIdx);\r\n }\r\n\r\n indices[indexTriangle + 0] = indices[indices.length - 3];\r\n indices[indexTriangle + 1] = indices[indices.length - 2];\r\n indices[indexTriangle + 2] = indices[indices.length - 1];\r\n\r\n indices.length = indices.length - 3;\r\n }\r\n\r\n private _generateEdgesLinesAlternate(): void {\r\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\r\n let indices = this._source.getIndices();\r\n\r\n if (!indices || !positions) {\r\n return;\r\n }\r\n\r\n if (!Array.isArray(indices)) {\r\n indices = Array.from(indices);\r\n }\r\n\r\n /**\r\n * Find all vertices that are at the same location (with an epsilon) and remapp them on the same vertex\r\n */\r\n const useFastVertexMerger = this._options?.useFastVertexMerger ?? true;\r\n const epsVertexMerge = useFastVertexMerger ? Math.round(-Math.log(this._options?.epsilonVertexMerge ?? 1e-6) / Math.log(10)) : (this._options?.epsilonVertexMerge ?? 1e-6);\r\n const remapVertexIndices: Array<number> = [];\r\n const uniquePositions: Array<number> = []; // list of unique index of vertices - needed for tessellation\r\n\r\n if (useFastVertexMerger) {\r\n const mapVertices: { [key: string]: number } = {};\r\n for (let v1 = 0; v1 < positions.length; v1 += 3) {\r\n const x1 = positions[v1 + 0],\r\n y1 = positions[v1 + 1],\r\n z1 = positions[v1 + 2];\r\n\r\n const key = x1.toFixed(epsVertexMerge) + \"|\" + y1.toFixed(epsVertexMerge) + \"|\" + z1.toFixed(epsVertexMerge);\r\n\r\n if (mapVertices[key] !== undefined) {\r\n remapVertexIndices.push(mapVertices[key]);\r\n } else {\r\n const idx = v1 / 3;\r\n mapVertices[key] = idx;\r\n remapVertexIndices.push(idx);\r\n uniquePositions.push(idx);\r\n }\r\n }\r\n } else {\r\n for (let v1 = 0; v1 < positions.length; v1 += 3) {\r\n const x1 = positions[v1 + 0],\r\n y1 = positions[v1 + 1],\r\n z1 = positions[v1 + 2];\r\n let found = false;\r\n for (let v2 = 0; v2 < v1 && !found; v2 += 3) {\r\n const x2 = positions[v2 + 0],\r\n y2 = positions[v2 + 1],\r\n z2 = positions[v2 + 2];\r\n\r\n if (Math.abs(x1 - x2) < epsVertexMerge && Math.abs(y1 - y2) < epsVertexMerge && Math.abs(z1 - z2) < epsVertexMerge) {\r\n remapVertexIndices.push(v2 / 3);\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!found) {\r\n remapVertexIndices.push(v1 / 3);\r\n uniquePositions.push(v1 / 3);\r\n }\r\n }\r\n }\r\n\r\n if (this._options?.applyTessellation) {\r\n /**\r\n * Tessellate triangles if necessary:\r\n *\r\n * A\r\n * +\r\n * |\\\r\n * | \\\r\n * | \\\r\n * E + \\\r\n * /| \\\r\n * / | \\\r\n * / | \\\r\n * +---+-------+ B\r\n * D C\r\n *\r\n * For the edges to be rendered correctly, the ABC triangle has to be split into ABE and BCE, else AC is considered to be an edge, whereas only AE should be.\r\n *\r\n * The tessellation process looks for the vertices like E that are in-between two other vertices making of an edge and create new triangles as necessary\r\n */\r\n\r\n // First step: collect the triangles to tessellate\r\n const epsVertexAligned = this._options?.epsilonVertexAligned ?? 1e-6;\r\n const mustTesselate: Array<{ index: number; edgesPoints: Array<Array<[number, number]>> }> = []; // liste of triangles that must be tessellated\r\n\r\n for (let index = 0; index < indices.length; index += 3) {\r\n // loop over all triangles\r\n let triangleToTessellate: { index: number; edgesPoints: Array<Array<[number, number]>> } | undefined;\r\n\r\n for (let i = 0; i < 3; ++i) {\r\n // loop over the 3 edges of the triangle\r\n const p0Index = remapVertexIndices[indices[index + i]];\r\n const p1Index = remapVertexIndices[indices[index + ((i + 1) % 3)]];\r\n const p2Index = remapVertexIndices[indices[index + ((i + 2) % 3)]];\r\n\r\n if (p0Index === p1Index) {\r\n continue;\r\n } // degenerated triangle - don't process\r\n\r\n const p0x = positions[p0Index * 3 + 0],\r\n p0y = positions[p0Index * 3 + 1],\r\n p0z = positions[p0Index * 3 + 2];\r\n const p1x = positions[p1Index * 3 + 0],\r\n p1y = positions[p1Index * 3 + 1],\r\n p1z = positions[p1Index * 3 + 2];\r\n\r\n const p0p1 = Math.sqrt((p1x - p0x) * (p1x - p0x) + (p1y - p0y) * (p1y - p0y) + (p1z - p0z) * (p1z - p0z));\r\n\r\n for (let v = 0; v < uniquePositions.length - 1; v++) {\r\n // loop over all (unique) vertices and look for the ones that would be in-between p0 and p1\r\n const vIndex = uniquePositions[v];\r\n\r\n if (vIndex === p0Index || vIndex === p1Index || vIndex === p2Index) {\r\n continue;\r\n } // don't handle the vertex if it is a vertex of the current triangle\r\n\r\n const x = positions[vIndex * 3 + 0],\r\n y = positions[vIndex * 3 + 1],\r\n z = positions[vIndex * 3 + 2];\r\n\r\n const p0p = Math.sqrt((x - p0x) * (x - p0x) + (y - p0y) * (y - p0y) + (z - p0z) * (z - p0z));\r\n const pp1 = Math.sqrt((x - p1x) * (x - p1x) + (y - p1y) * (y - p1y) + (z - p1z) * (z - p1z));\r\n\r\n if (Math.abs(p0p + pp1 - p0p1) < epsVertexAligned) {\r\n // vertices are aligned and p in-between p0 and p1 if distance(p0, p) + distance (p, p1) ~ distance(p0, p1)\r\n if (!triangleToTessellate) {\r\n triangleToTessellate = {\r\n index: index,\r\n edgesPoints: [[], [], []],\r\n };\r\n mustTesselate.push(triangleToTessellate);\r\n }\r\n triangleToTessellate.edgesPoints[i].push([vIndex, p0p]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Second step: tesselate the triangles\r\n for (let t = 0; t < mustTesselate.length; ++t) {\r\n const triangle = mustTesselate[t];\r\n\r\n this._tessellateTriangle(triangle.edgesPoints, triangle.index, indices, remapVertexIndices);\r\n }\r\n\r\n mustTesselate.length = 0;\r\n }\r\n\r\n /**\r\n * Collect the edges to render\r\n */\r\n const edges: { [key: string]: { normal: Vector3; done: boolean; index: number; i: number } } = {};\r\n\r\n for (let index = 0; index < indices.length; index += 3) {\r\n let faceNormal;\r\n for (let i = 0; i < 3; ++i) {\r\n let p0Index = remapVertexIndices[indices[index + i]];\r\n let p1Index = remapVertexIndices[indices[index + ((i + 1) % 3)]];\r\n const p2Index = remapVertexIndices[indices[index + ((i + 2) % 3)]];\r\n\r\n if (p0Index === p1Index || ((p0Index === p2Index || p1Index === p2Index) && this._options?.removeDegeneratedTriangles)) {\r\n continue;\r\n }\r\n\r\n TmpVectors.Vector3[0].copyFromFloats(positions[p0Index * 3 + 0], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\r\n TmpVectors.Vector3[1].copyFromFloats(positions[p1Index * 3 + 0], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\r\n TmpVectors.Vector3[2].copyFromFloats(positions[p2Index * 3 + 0], positions[p2Index * 3 + 1], positions[p2Index * 3 + 2]);\r\n\r\n if (!faceNormal) {\r\n TmpVectors.Vector3[1].subtractToRef(TmpVectors.Vector3[0], TmpVectors.Vector3[3]);\r\n TmpVectors.Vector3[2].subtractToRef(TmpVectors.Vector3[1], TmpVectors.Vector3[4]);\r\n faceNormal = Vector3.Cross(TmpVectors.Vector3[3], TmpVectors.Vector3[4]);\r\n faceNormal.normalize();\r\n }\r\n\r\n if (p0Index > p1Index) {\r\n const tmp = p0Index;\r\n p0Index = p1Index;\r\n p1Index = tmp;\r\n }\r\n\r\n const key = p0Index + \"_\" + p1Index;\r\n const ei = edges[key];\r\n\r\n if (ei) {\r\n if (!ei.done) {\r\n const dotProduct = Vector3.Dot(faceNormal, ei.normal);\r\n\r\n if (dotProduct < this._epsilon) {\r\n this.createLine(TmpVectors.Vector3[0], TmpVectors.Vector3[1], this._linesPositions.length / 3);\r\n }\r\n\r\n ei.done = true;\r\n }\r\n } else {\r\n edges[key] = { normal: faceNormal, done: false, index: index, i: i };\r\n }\r\n }\r\n }\r\n\r\n for (const key in edges) {\r\n const ei = edges[key];\r\n if (!ei.done) {\r\n // Orphaned edge - we must display it\r\n const p0Index = remapVertexIndices[indices[ei.index + ei.i]];\r\n const p1Index = remapVertexIndices[indices[ei.index + ((ei.i + 1) % 3)]];\r\n\r\n TmpVectors.Vector3[0].copyFromFloats(positions[p0Index * 3 + 0], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\r\n TmpVectors.Vector3[1].copyFromFloats(positions[p1Index * 3 + 0], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\r\n\r\n this.createLine(TmpVectors.Vector3[0], TmpVectors.Vector3[1], this._linesPositions.length / 3);\r\n }\r\n }\r\n\r\n /**\r\n * Merge into a single mesh\r\n */\r\n const engine = this._source.getScene().getEngine();\r\n\r\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\r\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\r\n\r\n this._buffersForInstances[VertexBuffer.PositionKind] = this._buffers[VertexBuffer.PositionKind];\r\n this._buffersForInstances[VertexBuffer.NormalKind] = this._buffers[VertexBuffer.NormalKind];\r\n\r\n this._ib = engine.createIndexBuffer(this._linesIndices);\r\n\r\n this._indicesCount = this._linesIndices.length;\r\n }\r\n\r\n /**\r\n * Generates lines edges from adjacencjes\r\n * @private\r\n */\r\n _generateEdgesLines(): void {\r\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this._source.getIndices();\r\n\r\n if (!indices || !positions) {\r\n return;\r\n }\r\n\r\n // First let's find adjacencies\r\n const adjacencies: FaceAdjacencies[] = [];\r\n const faceNormals: Vector3[] = [];\r\n let index: number;\r\n let faceAdjacencies: FaceAdjacencies;\r\n\r\n // Prepare faces\r\n for (index = 0; index < indices.length; index += 3) {\r\n faceAdjacencies = new FaceAdjacencies();\r\n const p0Index = indices[index];\r\n const p1Index = indices[index + 1];\r\n const p2Index = indices[index + 2];\r\n\r\n faceAdjacencies.p0 = new Vector3(positions[p0Index * 3], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\r\n faceAdjacencies.p1 = new Vector3(positions[p1Index * 3], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\r\n faceAdjacencies.p2 = new Vector3(positions[p2Index * 3], positions[p2Index * 3 + 1], positions[p2Index * 3 + 2]);\r\n const faceNormal = Vector3.Cross(faceAdjacencies.p1.subtract(faceAdjacencies.p0), faceAdjacencies.p2.subtract(faceAdjacencies.p1));\r\n\r\n faceNormal.normalize();\r\n\r\n faceNormals.push(faceNormal);\r\n adjacencies.push(faceAdjacencies);\r\n }\r\n\r\n // Scan\r\n for (index = 0; index < adjacencies.length; index++) {\r\n faceAdjacencies = adjacencies[index];\r\n\r\n for (let otherIndex = index + 1; otherIndex < adjacencies.length; otherIndex++) {\r\n const otherFaceAdjacencies = adjacencies[otherIndex];\r\n\r\n if (faceAdjacencies.edgesConnectedCount === 3) {\r\n // Full\r\n break;\r\n }\r\n\r\n if (otherFaceAdjacencies.edgesConnectedCount === 3) {\r\n // Full\r\n continue;\r\n }\r\n\r\n const otherP0 = indices[otherIndex * 3];\r\n const otherP1 = indices[otherIndex * 3 + 1];\r\n const otherP2 = indices[otherIndex * 3 + 2];\r\n\r\n for (let edgeIndex = 0; edgeIndex < 3; edgeIndex++) {\r\n let otherEdgeIndex: number = 0;\r\n\r\n if (faceAdjacencies.edges[edgeIndex] !== undefined) {\r\n continue;\r\n }\r\n\r\n switch (edgeIndex) {\r\n case 0:\r\n if (this._checkVerticesInsteadOfIndices) {\r\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(\r\n faceAdjacencies.p0,\r\n faceAdjacencies.p1,\r\n otherFaceAdjacencies.p0,\r\n otherFaceAdjacencies.p1,\r\n otherFaceAdjacencies.p2\r\n );\r\n } else {\r\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3], indices[index * 3 + 1], otherP0, otherP1, otherP2);\r\n }\r\n break;\r\n case 1:\r\n if (this._checkVerticesInsteadOfIndices) {\r\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(\r\n faceAdjacencies.p1,\r\n faceAdjacencies.p2,\r\n otherFaceAdjacencies.p0,\r\n otherFaceAdjacencies.p1,\r\n otherFaceAdjacencies.p2\r\n );\r\n } else {\r\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3 + 1], indices[index * 3 + 2], otherP0, otherP1, otherP2);\r\n }\r\n break;\r\n case 2:\r\n if (this._checkVerticesInsteadOfIndices) {\r\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(\r\n faceAdjacencies.p2,\r\n faceAdjacencies.p0,\r\n otherFaceAdjacencies.p0,\r\n otherFaceAdjacencies.p1,\r\n otherFaceAdjacencies.p2\r\n );\r\n } else {\r\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3 + 2], indices[index * 3], otherP0, otherP1, otherP2);\r\n }\r\n break;\r\n }\r\n\r\n if (otherEdgeIndex === -1) {\r\n continue;\r\n }\r\n\r\n faceAdjacencies.edges[edgeIndex] = otherIndex;\r\n otherFaceAdjacencies.edges[otherEdgeIndex] = index;\r\n\r\n faceAdjacencies.edgesConnectedCount++;\r\n otherFaceAdjacencies.edgesConnectedCount++;\r\n\r\n if (faceAdjacencies.edgesConnectedCount === 3) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Create lines\r\n for (index = 0; index < adjacencies.length; index++) {\r\n // We need a line when a face has no adjacency on a specific edge or if all the adjacencies has an angle greater than epsilon\r\n const current = adjacencies[index];\r\n\r\n this._checkEdge(index, current.edges[0], faceNormals, current.p0, current.p1);\r\n this._checkEdge(index, current.edges[1], faceNormals, current.p1, current.p2);\r\n this._checkEdge(index, current.edges[2], faceNormals, current.p2, current.p0);\r\n }\r\n\r\n // Merge into a single mesh\r\n const engine = this._source.getScene().getEngine();\r\n\r\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\r\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\r\n\r\n this._buffersForInstances[VertexBuffer.PositionKind] = this._buffers[VertexBuffer.PositionKind];\r\n this._buffersForInstances[VertexBuffer.NormalKind] = this._buffers[VertexBuffer.NormalKind];\r\n\r\n this._ib = engine.createIndexBuffer(this._linesIndices);\r\n\r\n this._indicesCount = this._linesIndices.length;\r\n }\r\n\r\n /**\r\n * Checks whether or not the edges renderer is ready to render.\r\n * @returns true if ready, otherwise false.\r\n */\r\n public isReady(): boolean {\r\n return this._lineShader.isReady(this._source, (this._source.hasInstances && this.customInstances.length > 0) || this._source.hasThinInstances);\r\n }\r\n\r\n /**\r\n * Renders the edges of the attached mesh,\r\n */\r\n public render(): void {\r\n const scene = this._source.getScene();\r\n\r\n const currentDrawWrapper = this._lineShader._getDrawWrapper();\r\n if (this._drawWrapper) {\r\n this._lineShader._setDrawWrapper(this._drawWrapper);\r\n }\r\n\r\n if (!this.isReady() || !scene.activeCamera) {\r\n this._lineShader._setDrawWrapper(currentDrawWrapper);\r\n return;\r\n }\r\n\r\n const hasInstances = this._source.hasInstances && this.customInstances.length > 0;\r\n const useBuffersWithInstances = hasInstances || this._source.hasThinInstances;\r\n\r\n let instanceCount = 0;\r\n\r\n if (useBuffersWithInstances) {\r\n this._buffersForInstances[\"world0\"] = (this._source as Mesh).getVertexBuffer(\"world0\");\r\n this._buffersForInstances[\"world1\"] = (this._source as Mesh).getVertexBuffer(\"world1\");\r\n this._buffersForInstances[\"world2\"] = (this._source as Mesh).getVertexBuffer(\"world2\");\r\n this._buffersForInstances[\"world3\"] = (this._source as Mesh).getVertexBuffer(\"world3\");\r\n\r\n if (hasInstances) {\r\n const instanceStorage = (this._source as Mesh)._instanceDataStorage;\r\n\r\n instanceCount = this.customInstances.length;\r\n\r\n if (!instanceStorage.instancesData) {\r\n if (!this._source.getScene()._activeMeshesFrozen) {\r\n this.customInstances.reset();\r\n }\r\n return;\r\n }\r\n\r\n if (!instanceStorage.isFrozen) {\r\n let offset = 0;\r\n\r\n for (let i = 0; i < instanceCount; ++i) {\r\n this.customInstances.data[i].copyToArray(instanceStorage.instancesData, offset);\r\n offset += 16;\r\n }\r\n\r\n instanceStorage.instancesBuffer!.updateDirectly(instanceStorage.instancesData, 0, instanceCount);\r\n }\r\n } else {\r\n instanceCount = (this._source as Mesh).thinInstanceCount;\r\n }\r\n }\r\n\r\n const engine = scene.getEngine();\r\n this._lineShader._preBind();\r\n\r\n if (this._source.edgesColor.a !== 1) {\r\n engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n } else {\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // VBOs\r\n engine.bindBuffers(useBuffersWithInstances ? this._buffersForInstances : this._buffers, this._ib, this._lineShader.getEffect());\r\n\r\n scene.resetCachedMaterial();\r\n this._lineShader.setColor4(\"color\", this._source.edgesColor);\r\n\r\n if (scene.activeCamera.mode === Camera.ORTHOGRAPHIC_CAMERA) {\r\n this._lineShader.setFloat(\"width\", this._source.edgesWidth / this.edgesWidthScalerForOrthographic);\r\n } else {\r\n this._lineShader.setFloat(\"width\", this._source.edgesWidth / this.edgesWidthScalerForPerspective);\r\n }\r\n\r\n this._lineShader.setFloat(\"aspectRatio\", engine.getAspectRatio(scene.activeCamera));\r\n this._lineShader.bind(this._source.getWorldMatrix(), this._source);\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.TriangleFillMode, 0, this._indicesCount, instanceCount);\r\n this._lineShader.unbind();\r\n\r\n if (useBuffersWithInstances) {\r\n engine.unbindInstanceAttributes();\r\n }\r\n\r\n if (!this._source.getScene()._activeMeshesFrozen) {\r\n this.customInstances.reset();\r\n }\r\n\r\n this._lineShader._setDrawWrapper(currentDrawWrapper);\r\n }\r\n}\r\n\r\n/**\r\n * LineEdgesRenderer for LineMeshes to remove unnecessary triangulation\r\n */\r\nexport class LineEdgesRenderer extends EdgesRenderer {\r\n /**\r\n * This constructor turns off auto generating edges line in Edges Renderer to make it here.\r\n * @param source LineMesh used to generate edges\r\n * @param epsilon not important (specified angle for edge detection)\r\n * @param checkVerticesInsteadOfIndices not important for LineMesh\r\n */\r\n constructor(source: AbstractMesh, epsilon = 0.95, checkVerticesInsteadOfIndices = false) {\r\n super(source, epsilon, checkVerticesInsteadOfIndices, false);\r\n this._generateEdgesLines();\r\n }\r\n\r\n /**\r\n * Generate edges for each line in LinesMesh. Every Line should be rendered as edge.\r\n */\r\n override _generateEdgesLines(): void {\r\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this._source.getIndices();\r\n\r\n if (!indices || !positions) {\r\n return;\r\n }\r\n\r\n const p0 = TmpVectors.Vector3[0];\r\n const p1 = TmpVectors.Vector3[1];\r\n const len = indices.length - 1;\r\n for (let i = 0, offset = 0; i < len; i += 2, offset += 4) {\r\n Vector3.FromArrayToRef(positions, 3 * indices[i], p0);\r\n Vector3.FromArrayToRef(positions, 3 * indices[i + 1], p1);\r\n this.createLine(p0, p1, offset);\r\n }\r\n\r\n // Merge into a single mesh\r\n const engine = this._source.getScene().getEngine();\r\n\r\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\r\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\r\n\r\n this._ib = engine.createIndexBuffer(this._linesIndices);\r\n\r\n this._indicesCount = this._linesIndices.length;\r\n }\r\n}\r\n"]}
@@ -144,7 +144,7 @@ export declare class FluidRenderer {
144
144
  /** @internal */
145
145
  _render(forCamera?: Camera): void;
146
146
  /**
147
- * Disposes of all the ressources used by the class
147
+ * Disposes of all the resources used by the class
148
148
  */
149
149
  dispose(): void;
150
150
  }
@@ -397,7 +397,7 @@ export class FluidRenderer {
397
397
  }
398
398
  }
399
399
  /**
400
- * Disposes of all the ressources used by the class
400
+ * Disposes of all the resources used by the class
401
401
  */
402
402
  dispose() {
403
403
  this._engine.onResizeObservable.remove(this._onEngineResizeObserver);
@@ -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\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\ndeclare module \"../../scene\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Scene {\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.length = 0;\r\n this.targetRenderers.length = 0;\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 \"../../scene\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Scene {\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 resources 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.length = 0;\r\n this.targetRenderers.length = 0;\r\n this._cameras.clear();\r\n }\r\n}\r\n"]}
@@ -83,7 +83,7 @@ export declare abstract class FluidRenderingObject {
83
83
  */
84
84
  renderDiffuseTexture(): void;
85
85
  /**
86
- * Releases the ressources used by the class
86
+ * Releases the resources used by the class
87
87
  */
88
88
  dispose(): void;
89
89
  }