@babylonjs/core 7.37.0 → 7.37.2

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 (222) hide show
  1. package/Buffers/buffer.d.ts +3 -1
  2. package/Buffers/buffer.js +20 -122
  3. package/Buffers/buffer.js.map +1 -1
  4. package/Buffers/bufferUtils.d.ts +32 -1
  5. package/Buffers/bufferUtils.js +221 -10
  6. package/Buffers/bufferUtils.js.map +1 -1
  7. package/Cameras/arcRotateCamera.d.ts +3 -1
  8. package/Cameras/arcRotateCamera.js +14 -3
  9. package/Cameras/arcRotateCamera.js.map +1 -1
  10. package/Engines/abstractEngine.js +2 -2
  11. package/Engines/abstractEngine.js.map +1 -1
  12. package/Engines/engine.js +0 -4
  13. package/Engines/engine.js.map +1 -1
  14. package/Engines/thinEngine.js +2 -2
  15. package/Engines/thinEngine.js.map +1 -1
  16. package/FrameGraph/Node/nodeRenderGraphBlock.js +1 -0
  17. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  18. package/FrameGraph/Node/nodeRenderGraphBlockConnectionPoint.d.ts +2 -0
  19. package/FrameGraph/Node/nodeRenderGraphBlockConnectionPoint.js +3 -1
  20. package/FrameGraph/Node/nodeRenderGraphBlockConnectionPoint.js.map +1 -1
  21. package/Inputs/scene.inputManager.js +2 -0
  22. package/Inputs/scene.inputManager.js.map +1 -1
  23. package/Lights/IES/iesLoader.d.ts +19 -0
  24. package/Lights/IES/iesLoader.js +150 -0
  25. package/Lights/IES/iesLoader.js.map +1 -0
  26. package/Lights/index.d.ts +1 -0
  27. package/Lights/index.js +1 -0
  28. package/Lights/index.js.map +1 -1
  29. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +12 -2
  30. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  31. package/Materials/GreasedLine/greasedLineMaterialInterfaces.d.ts +5 -0
  32. package/Materials/GreasedLine/greasedLineMaterialInterfaces.js.map +1 -1
  33. package/Materials/GreasedLine/greasedLinePluginMaterial.d.ts +21 -5
  34. package/Materials/GreasedLine/greasedLinePluginMaterial.js +52 -176
  35. package/Materials/GreasedLine/greasedLinePluginMaterial.js.map +1 -1
  36. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.d.ts +11 -0
  37. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js +158 -0
  38. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js.map +1 -0
  39. package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.d.ts +11 -0
  40. package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js +177 -0
  41. package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js.map +1 -0
  42. package/Materials/GreasedLine/greasedLineSimpleMaterial.d.ts +4 -2
  43. package/Materials/GreasedLine/greasedLineSimpleMaterial.js +45 -25
  44. package/Materials/GreasedLine/greasedLineSimpleMaterial.js.map +1 -1
  45. package/Materials/Node/Blocks/PBR/reflectionBlock.js +6 -0
  46. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  47. package/Materials/Node/Blocks/index.d.ts +1 -0
  48. package/Materials/Node/Blocks/index.js +1 -0
  49. package/Materials/Node/Blocks/index.js.map +1 -1
  50. package/Materials/Node/Blocks/matrixSplitterBlock.d.ts +56 -0
  51. package/Materials/Node/Blocks/matrixSplitterBlock.js +130 -0
  52. package/Materials/Node/Blocks/matrixSplitterBlock.js.map +1 -0
  53. package/Materials/Node/nodeMaterialBlock.js +1 -0
  54. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  55. package/Materials/Node/nodeMaterialBlockConnectionPoint.d.ts +2 -0
  56. package/Materials/Node/nodeMaterialBlockConnectionPoint.js +4 -1
  57. package/Materials/Node/nodeMaterialBlockConnectionPoint.js.map +1 -1
  58. package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
  59. package/Materials/PBR/pbrBaseMaterial.js +12 -0
  60. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  61. package/Materials/Textures/Loaders/iesTextureLoader.d.ts +23 -0
  62. package/Materials/Textures/Loaders/iesTextureLoader.js +40 -0
  63. package/Materials/Textures/Loaders/iesTextureLoader.js.map +1 -0
  64. package/Materials/Textures/Loaders/index.d.ts +1 -0
  65. package/Materials/Textures/Loaders/index.js +1 -0
  66. package/Materials/Textures/Loaders/index.js.map +1 -1
  67. package/Materials/Textures/Loaders/textureLoaderManager.js +3 -0
  68. package/Materials/Textures/Loaders/textureLoaderManager.js.map +1 -1
  69. package/Materials/effectRenderer.js +1 -1
  70. package/Materials/effectRenderer.js.map +1 -1
  71. package/Materials/index.d.ts +4 -0
  72. package/Materials/index.js +5 -0
  73. package/Materials/index.js.map +1 -1
  74. package/Maths/math.scalar.d.ts +0 -1
  75. package/Maths/math.scalar.js +1 -2
  76. package/Maths/math.scalar.js.map +1 -1
  77. package/Meshes/Builders/greasedLineBuilder.js +2 -2
  78. package/Meshes/Builders/greasedLineBuilder.js.map +1 -1
  79. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +15 -2
  80. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +68 -20
  81. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  82. package/Meshes/Node/Blocks/geometryInputBlock.d.ts +4 -0
  83. package/Meshes/Node/Blocks/geometryInputBlock.js +8 -0
  84. package/Meshes/Node/Blocks/geometryInputBlock.js.map +1 -1
  85. package/Meshes/Node/nodeGeometryBlock.js +1 -0
  86. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  87. package/Meshes/Node/nodeGeometryBlockConnectionPoint.d.ts +2 -0
  88. package/Meshes/Node/nodeGeometryBlockConnectionPoint.js +3 -1
  89. package/Meshes/Node/nodeGeometryBlockConnectionPoint.js.map +1 -1
  90. package/Meshes/abstractMesh.hotSpot.d.ts +8 -1
  91. package/Meshes/abstractMesh.hotSpot.js +17 -0
  92. package/Meshes/abstractMesh.hotSpot.js.map +1 -1
  93. package/Meshes/linesMesh.js +1 -1
  94. package/Meshes/linesMesh.js.map +1 -1
  95. package/Misc/deepMerger.d.ts +6 -0
  96. package/Misc/deepMerger.js +26 -0
  97. package/Misc/deepMerger.js.map +1 -0
  98. package/Misc/index.d.ts +1 -0
  99. package/Misc/index.js +1 -0
  100. package/Misc/index.js.map +1 -1
  101. package/Misc/virtualJoystick.js +2 -0
  102. package/Misc/virtualJoystick.js.map +1 -1
  103. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +3 -23
  104. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +30 -67
  105. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  106. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +1 -1
  107. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +8 -4
  108. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  109. package/Rendering/boundingBoxRenderer.d.ts +63 -1
  110. package/Rendering/boundingBoxRenderer.js +224 -3
  111. package/Rendering/boundingBoxRenderer.js.map +1 -1
  112. package/Rendering/edgesRenderer.js +4 -1
  113. package/Rendering/edgesRenderer.js.map +1 -1
  114. package/Rendering/{IBLShadows/iblShadowsImportanceSamplingRenderer.d.ts → iblCdfGenerator.d.ts} +15 -12
  115. package/Rendering/{IBLShadows/iblShadowsImportanceSamplingRenderer.js → iblCdfGenerator.js} +37 -27
  116. package/Rendering/iblCdfGenerator.js.map +1 -0
  117. package/Rendering/iblCdfGeneratorSceneComponent.d.ts +59 -0
  118. package/Rendering/iblCdfGeneratorSceneComponent.js +83 -0
  119. package/Rendering/iblCdfGeneratorSceneComponent.js.map +1 -0
  120. package/Rendering/index.d.ts +12 -10
  121. package/Rendering/index.js +12 -10
  122. package/Rendering/index.js.map +1 -1
  123. package/Shaders/ShadersInclude/gaussianSplatting.js +72 -2
  124. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  125. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js +1 -1
  126. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
  127. package/Shaders/ShadersInclude/hdrFilteringFunctions.js +29 -4
  128. package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  129. package/Shaders/ShadersInclude/pbrBlockReflection.js +9 -1
  130. package/Shaders/ShadersInclude/pbrBlockReflection.js.map +1 -1
  131. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +9 -1
  132. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  133. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +3 -0
  134. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  135. package/Shaders/boundingBoxRenderer.vertex.js +7 -0
  136. package/Shaders/boundingBoxRenderer.vertex.js.map +1 -1
  137. package/Shaders/gaussianSplatting.vertex.js +16 -2
  138. package/Shaders/gaussianSplatting.vertex.js.map +1 -1
  139. package/Shaders/{iblShadowsCdfy.fragment.d.ts → iblCdfx.fragment.d.ts} +1 -1
  140. package/Shaders/{iblShadowsCdfx.fragment.js → iblCdfx.fragment.js} +3 -3
  141. package/Shaders/iblCdfx.fragment.js.map +1 -0
  142. package/Shaders/{iblShadowsCdfx.fragment.d.ts → iblCdfy.fragment.d.ts} +1 -1
  143. package/Shaders/{iblShadowsCdfy.fragment.js → iblCdfy.fragment.js} +3 -3
  144. package/Shaders/iblCdfy.fragment.js.map +1 -0
  145. package/Shaders/{iblShadowsIcdfx.fragment.d.ts → iblIcdfx.fragment.d.ts} +1 -1
  146. package/Shaders/{iblShadowsIcdfx.fragment.js → iblIcdfx.fragment.js} +3 -3
  147. package/Shaders/iblIcdfx.fragment.js.map +1 -0
  148. package/Shaders/{iblShadowsIcdfy.fragment.d.ts → iblIcdfy.fragment.d.ts} +1 -1
  149. package/Shaders/{iblShadowsIcdfy.fragment.js → iblIcdfy.fragment.js} +3 -3
  150. package/Shaders/iblIcdfy.fragment.js.map +1 -0
  151. package/Shaders/importanceSamplingDebug.fragment.d.ts +5 -0
  152. package/Shaders/{iblShadowsImportanceSamplingDebug.fragment.js → importanceSamplingDebug.fragment.js} +3 -3
  153. package/Shaders/importanceSamplingDebug.fragment.js.map +1 -0
  154. package/Shaders/pbr.fragment.js +8 -0
  155. package/Shaders/pbr.fragment.js.map +1 -1
  156. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +77 -1
  157. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  158. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +28 -4
  159. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  160. package/ShadersWGSL/ShadersInclude/lightFragment.js +1 -1
  161. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  162. package/ShadersWGSL/ShadersInclude/oitFragment.js +1 -1
  163. package/ShadersWGSL/ShadersInclude/oitFragment.js.map +1 -1
  164. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js +14 -1
  165. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js.map +1 -1
  166. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js +14 -1
  167. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  168. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +3 -0
  169. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  170. package/ShadersWGSL/ShadersInclude/shadowsFragmentFunctions.js +1 -1
  171. package/ShadersWGSL/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
  172. package/ShadersWGSL/boundingBoxRenderer.vertex.js +9 -1
  173. package/ShadersWGSL/boundingBoxRenderer.vertex.js.map +1 -1
  174. package/ShadersWGSL/gaussianSplatting.vertex.js +18 -2
  175. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  176. package/ShadersWGSL/greasedLine.fragment.d.ts +5 -0
  177. package/ShadersWGSL/greasedLine.fragment.js +25 -0
  178. package/ShadersWGSL/greasedLine.fragment.js.map +1 -0
  179. package/ShadersWGSL/greasedLine.vertex.d.ts +9 -0
  180. package/ShadersWGSL/greasedLine.vertex.js +43 -0
  181. package/ShadersWGSL/greasedLine.vertex.js.map +1 -0
  182. package/ShadersWGSL/iblCdfx.fragment.d.ts +5 -0
  183. package/ShadersWGSL/{iblShadowsCdfx.fragment.js → iblCdfx.fragment.js} +3 -3
  184. package/ShadersWGSL/iblCdfx.fragment.js.map +1 -0
  185. package/ShadersWGSL/iblCdfy.fragment.d.ts +5 -0
  186. package/ShadersWGSL/{iblShadowsCdfy.fragment.js → iblCdfy.fragment.js} +3 -3
  187. package/ShadersWGSL/iblCdfy.fragment.js.map +1 -0
  188. package/ShadersWGSL/iblIcdfx.fragment.d.ts +5 -0
  189. package/ShadersWGSL/{iblShadowsIcdfx.fragment.js → iblIcdfx.fragment.js} +3 -3
  190. package/ShadersWGSL/iblIcdfx.fragment.js.map +1 -0
  191. package/ShadersWGSL/iblIcdfy.fragment.d.ts +5 -0
  192. package/ShadersWGSL/{iblShadowsIcdfy.fragment.js → iblIcdfy.fragment.js} +3 -3
  193. package/ShadersWGSL/iblIcdfy.fragment.js.map +1 -0
  194. package/ShadersWGSL/importanceSamplingDebug.fragment.d.ts +5 -0
  195. package/ShadersWGSL/{iblShadowsImportanceSamplingDebug.fragment.js → importanceSamplingDebug.fragment.js} +3 -3
  196. package/ShadersWGSL/importanceSamplingDebug.fragment.js.map +1 -0
  197. package/ShadersWGSL/pbr.fragment.js +12 -0
  198. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  199. package/package.json +1 -1
  200. package/scene.d.ts +4 -0
  201. package/scene.js +6 -0
  202. package/scene.js.map +1 -1
  203. package/sceneComponent.d.ts +1 -1
  204. package/sceneComponent.js +1 -1
  205. package/sceneComponent.js.map +1 -1
  206. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +0 -1
  207. package/Shaders/iblShadowsCdfx.fragment.js.map +0 -1
  208. package/Shaders/iblShadowsCdfy.fragment.js.map +0 -1
  209. package/Shaders/iblShadowsIcdfx.fragment.js.map +0 -1
  210. package/Shaders/iblShadowsIcdfy.fragment.js.map +0 -1
  211. package/Shaders/iblShadowsImportanceSamplingDebug.fragment.d.ts +0 -5
  212. package/Shaders/iblShadowsImportanceSamplingDebug.fragment.js.map +0 -1
  213. package/ShadersWGSL/iblShadowsCdfx.fragment.d.ts +0 -5
  214. package/ShadersWGSL/iblShadowsCdfx.fragment.js.map +0 -1
  215. package/ShadersWGSL/iblShadowsCdfy.fragment.d.ts +0 -5
  216. package/ShadersWGSL/iblShadowsCdfy.fragment.js.map +0 -1
  217. package/ShadersWGSL/iblShadowsIcdfx.fragment.d.ts +0 -5
  218. package/ShadersWGSL/iblShadowsIcdfx.fragment.js.map +0 -1
  219. package/ShadersWGSL/iblShadowsIcdfy.fragment.d.ts +0 -5
  220. package/ShadersWGSL/iblShadowsIcdfy.fragment.js.map +0 -1
  221. package/ShadersWGSL/iblShadowsImportanceSamplingDebug.fragment.d.ts +0 -5
  222. package/ShadersWGSL/iblShadowsImportanceSamplingDebug.fragment.js.map +0 -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 type { Effect } from \"../Materials/effect\";\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 export interface Scene {\r\n /** @internal */\r\n _edgeRenderLineShader: Nullable<ShaderMaterial>;\r\n }\r\n}\r\n\r\ndeclare module \"../Meshes/abstractMesh\" {\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 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 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\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 this._lineShader.dispose();\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, <Effect>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 type { Effect } from \"../Materials/effect\";\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 export interface Scene {\r\n /** @internal */\r\n _edgeRenderLineShader: Nullable<ShaderMaterial>;\r\n }\r\n}\r\n\r\ndeclare module \"../Meshes/abstractMesh\" {\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 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 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, <Effect>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,14 +1,12 @@
1
- import type { Scene } from "../../scene";
2
- import { ProceduralTexture } from "../../Materials/Textures/Procedurals/proceduralTexture";
3
- import { PostProcess } from "../../PostProcesses/postProcess";
4
- import type { BaseTexture } from "../../Materials/Textures/baseTexture";
5
- import { Observable } from "../../Misc/observable";
1
+ import type { Scene } from "../scene";
2
+ import { Texture } from "../Materials/Textures/texture";
3
+ import { PostProcess } from "../PostProcesses/postProcess";
4
+ import type { BaseTexture } from "../Materials/Textures/baseTexture";
5
+ import { Observable } from "../Misc/observable";
6
6
  /**
7
- * Build cdf maps for IBL importance sampling during IBL shadow computation.
8
- * This should not be instanciated directly, as it is part of a scene component
9
- * @internal
7
+ * Build cdf maps to be used for IBL importance sampling.
10
8
  */
11
- export declare class _IblShadowsImportanceSamplingRenderer {
9
+ export declare class IblCdfGenerator {
12
10
  private _scene;
13
11
  private _engine;
14
12
  private _cdfyPT;
@@ -16,6 +14,7 @@ export declare class _IblShadowsImportanceSamplingRenderer {
16
14
  private _cdfxPT;
17
15
  private _icdfxPT;
18
16
  private _iblSource;
17
+ private _dummyTexture;
19
18
  /**
20
19
  * Gets the IBL source texture being used by the importance sampling renderer
21
20
  */
@@ -30,12 +29,12 @@ export declare class _IblShadowsImportanceSamplingRenderer {
30
29
  * Return the cumulative distribution function (CDF) Y texture
31
30
  * @returns Return the cumulative distribution function (CDF) Y texture
32
31
  */
33
- getIcdfyTexture(): ProceduralTexture;
32
+ getIcdfyTexture(): Texture;
34
33
  /**
35
34
  * Return the cumulative distribution function (CDF) X texture
36
35
  * @returns Return the cumulative distribution function (CDF) X texture
37
36
  */
38
- getIcdfxTexture(): ProceduralTexture;
37
+ getIcdfxTexture(): Texture;
39
38
  /** Enable the debug view for this pass */
40
39
  debugEnabled: boolean;
41
40
  private _debugPass;
@@ -58,6 +57,10 @@ export declare class _IblShadowsImportanceSamplingRenderer {
58
57
  * @returns The post process
59
58
  */
60
59
  getDebugPassPP(): PostProcess;
60
+ /**
61
+ * @internal
62
+ */
63
+ static _SceneComponentInitialization: (scene: Scene) => void;
61
64
  /**
62
65
  * Instanciates the importance sampling renderer
63
66
  * @param scene Scene to attach to
@@ -67,7 +70,7 @@ export declare class _IblShadowsImportanceSamplingRenderer {
67
70
  /**
68
71
  * Observable that triggers when the importance sampling renderer is ready
69
72
  */
70
- onReadyObservable: Observable<void>;
73
+ onGeneratedObservable: Observable<void>;
71
74
  private _createTextures;
72
75
  private _disposeTextures;
73
76
  private _createDebugPass;
@@ -1,16 +1,16 @@
1
1
 
2
- import { Texture } from "../../Materials/Textures/texture.js";
3
- import { ProceduralTexture } from "../../Materials/Textures/Procedurals/proceduralTexture.js";
4
- import { PostProcess } from "../../PostProcesses/postProcess.js";
5
- import { Vector4 } from "../../Maths/math.vector.js";
6
- import { RawTexture } from "../../Materials/Textures/rawTexture.js";
7
- import { Observable } from "../../Misc/observable.js";
2
+ import { Texture } from "../Materials/Textures/texture.js";
3
+ import { ProceduralTexture } from "../Materials/Textures/Procedurals/proceduralTexture.js";
4
+ import { PostProcess } from "../PostProcesses/postProcess.js";
5
+ import { Vector4 } from "../Maths/math.vector.js";
6
+ import { RawTexture } from "../Materials/Textures/rawTexture.js";
7
+ import { Observable } from "../Misc/observable.js";
8
+ import { Engine } from "../Engines/engine.js";
9
+ import { _WarnImport } from "../Misc/devTools.js";
8
10
  /**
9
- * Build cdf maps for IBL importance sampling during IBL shadow computation.
10
- * This should not be instanciated directly, as it is part of a scene component
11
- * @internal
11
+ * Build cdf maps to be used for IBL importance sampling.
12
12
  */
13
- export class _IblShadowsImportanceSamplingRenderer {
13
+ export class IblCdfGenerator {
14
14
  /**
15
15
  * Gets the IBL source texture being used by the importance sampling renderer
16
16
  */
@@ -55,7 +55,7 @@ export class _IblShadowsImportanceSamplingRenderer {
55
55
  }
56
56
  // Once the textures are generated, notify that they are ready to use.
57
57
  this._icdfxPT.onGeneratedObservable.addOnce(() => {
58
- this.onReadyObservable.notifyObservers();
58
+ this.onGeneratedObservable.notifyObservers();
59
59
  });
60
60
  }
61
61
  /**
@@ -63,14 +63,14 @@ export class _IblShadowsImportanceSamplingRenderer {
63
63
  * @returns Return the cumulative distribution function (CDF) Y texture
64
64
  */
65
65
  getIcdfyTexture() {
66
- return this._icdfyPT;
66
+ return this._icdfyPT ? this._icdfyPT : this._dummyTexture;
67
67
  }
68
68
  /**
69
69
  * Return the cumulative distribution function (CDF) X texture
70
70
  * @returns Return the cumulative distribution function (CDF) X texture
71
71
  */
72
72
  getIcdfxTexture() {
73
- return this._icdfxPT;
73
+ return this._icdfxPT ? this._icdfxPT : this._dummyTexture;
74
74
  }
75
75
  /**
76
76
  * Sets params that control the position and scaling of the debug display on the screen.
@@ -111,9 +111,12 @@ export class _IblShadowsImportanceSamplingRenderer {
111
111
  /**
112
112
  * Observable that triggers when the importance sampling renderer is ready
113
113
  */
114
- this.onReadyObservable = new Observable();
114
+ this.onGeneratedObservable = new Observable();
115
115
  this._scene = scene;
116
116
  this._engine = scene.getEngine();
117
+ const blackPixels = new Uint8Array([0, 0, 0, 255]);
118
+ this._dummyTexture = new RawTexture(blackPixels, 1, 1, Engine.TEXTUREFORMAT_RGBA, scene, false);
119
+ IblCdfGenerator._SceneComponentInitialization(this._scene);
117
120
  }
118
121
  _createTextures() {
119
122
  const size = this._iblSource ? this._iblSource.getSize() : { width: 1, height: 1 };
@@ -136,10 +139,10 @@ export class _IblShadowsImportanceSamplingRenderer {
136
139
  shaderLanguage: isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
137
140
  extraInitializationsAsync: async () => {
138
141
  if (isWebGPU) {
139
- await Promise.all([import("../../ShadersWGSL/iblShadowsCdfx.fragment.js"), import("../../ShadersWGSL/iblShadowsCdfy.fragment.js")]);
142
+ await Promise.all([import("../ShadersWGSL/iblCdfx.fragment.js"), import("../ShadersWGSL/iblCdfy.fragment.js")]);
140
143
  }
141
144
  else {
142
- await Promise.all([import("../../Shaders/iblShadowsCdfx.fragment.js"), import("../../Shaders/iblShadowsCdfy.fragment.js")]);
145
+ await Promise.all([import("../Shaders/iblCdfx.fragment.js"), import("../Shaders/iblCdfy.fragment.js")]);
143
146
  }
144
147
  },
145
148
  };
@@ -152,14 +155,14 @@ export class _IblShadowsImportanceSamplingRenderer {
152
155
  shaderLanguage: isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
153
156
  extraInitializationsAsync: async () => {
154
157
  if (isWebGPU) {
155
- await Promise.all([import("../../ShadersWGSL/iblShadowsIcdfx.fragment.js"), import("../../ShadersWGSL/iblShadowsIcdfy.fragment.js")]);
158
+ await Promise.all([import("../ShadersWGSL/iblIcdfx.fragment.js"), import("../ShadersWGSL/iblIcdfy.fragment.js")]);
156
159
  }
157
160
  else {
158
- await Promise.all([import("../../Shaders/iblShadowsIcdfx.fragment.js"), import("../../Shaders/iblShadowsIcdfy.fragment.js")]);
161
+ await Promise.all([import("../Shaders/iblIcdfx.fragment.js"), import("../Shaders/iblIcdfy.fragment.js")]);
159
162
  }
160
163
  },
161
164
  };
162
- this._cdfyPT = new ProceduralTexture("cdfyTexture", { width: size.width, height: size.height + 1 }, "iblShadowsCdfy", this._scene, cdfOptions, false, false);
165
+ this._cdfyPT = new ProceduralTexture("cdfyTexture", { width: size.width, height: size.height + 1 }, "iblCdfy", this._scene, cdfOptions, false, false);
163
166
  this._cdfyPT.autoClear = false;
164
167
  this._cdfyPT.setTexture("iblSource", this._iblSource);
165
168
  this._cdfyPT.setInt("iblHeight", size.height);
@@ -167,15 +170,15 @@ export class _IblShadowsImportanceSamplingRenderer {
167
170
  this._cdfyPT.defines = "#define IBL_USE_CUBE_MAP\n";
168
171
  }
169
172
  this._cdfyPT.refreshRate = 0;
170
- this._icdfyPT = new ProceduralTexture("icdfyTexture", { width: size.width, height: size.height }, "iblShadowsIcdfy", this._scene, icdfOptions, false, false);
173
+ this._icdfyPT = new ProceduralTexture("icdfyTexture", { width: size.width, height: size.height }, "iblIcdfy", this._scene, icdfOptions, false, false);
171
174
  this._icdfyPT.autoClear = false;
172
175
  this._icdfyPT.setTexture("cdfy", this._cdfyPT);
173
176
  this._icdfyPT.refreshRate = 0;
174
- this._cdfxPT = new ProceduralTexture("cdfxTexture", { width: size.width + 1, height: 1 }, "iblShadowsCdfx", this._scene, cdfOptions, false, false);
177
+ this._cdfxPT = new ProceduralTexture("cdfxTexture", { width: size.width + 1, height: 1 }, "iblCdfx", this._scene, cdfOptions, false, false);
175
178
  this._cdfxPT.autoClear = false;
176
179
  this._cdfxPT.setTexture("cdfy", this._cdfyPT);
177
180
  this._cdfxPT.refreshRate = 0;
178
- this._icdfxPT = new ProceduralTexture("icdfxTexture", { width: size.width, height: 1 }, "iblShadowsIcdfx", this._scene, icdfOptions, false, false);
181
+ this._icdfxPT = new ProceduralTexture("icdfxTexture", { width: size.width, height: 1 }, "iblIcdfx", this._scene, icdfOptions, false, false);
179
182
  this._icdfxPT.autoClear = false;
180
183
  this._icdfxPT.setTexture("cdfx", this._cdfxPT);
181
184
  this._icdfxPT.refreshRate = 0;
@@ -203,14 +206,14 @@ export class _IblShadowsImportanceSamplingRenderer {
203
206
  shaderLanguage: isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
204
207
  extraInitializations: (useWebGPU, list) => {
205
208
  if (useWebGPU) {
206
- list.push(import("../../ShadersWGSL/iblShadowsImportanceSamplingDebug.fragment.js"));
209
+ list.push(import("../ShadersWGSL/importanceSamplingDebug.fragment.js"));
207
210
  }
208
211
  else {
209
- list.push(import("../../Shaders/iblShadowsImportanceSamplingDebug.fragment.js"));
212
+ list.push(import("../Shaders/importanceSamplingDebug.fragment.js"));
210
213
  }
211
214
  },
212
215
  };
213
- this._debugPass = new PostProcess(this._debugPassName, "iblShadowsImportanceSamplingDebug", debugOptions);
216
+ this._debugPass = new PostProcess(this._debugPassName, "importanceSamplingDebug", debugOptions);
214
217
  const debugEffect = this._debugPass.getEffect();
215
218
  if (debugEffect) {
216
219
  debugEffect.defines = this._iblSource?.isCube ? "#define IBL_USE_CUBE_MAP\n" : "";
@@ -249,10 +252,17 @@ export class _IblShadowsImportanceSamplingRenderer {
249
252
  */
250
253
  dispose() {
251
254
  this._disposeTextures();
255
+ this._dummyTexture.dispose();
252
256
  if (this._debugPass) {
253
257
  this._debugPass.dispose();
254
258
  }
255
- this.onReadyObservable.clear();
259
+ this.onGeneratedObservable.clear();
256
260
  }
257
261
  }
258
- //# sourceMappingURL=iblShadowsImportanceSamplingRenderer.js.map
262
+ /**
263
+ * @internal
264
+ */
265
+ IblCdfGenerator._SceneComponentInitialization = (_) => {
266
+ throw _WarnImport("IblCdfGeneratorSceneComponentSceneComponent");
267
+ };
268
+ //# sourceMappingURL=iblCdfGenerator.js.map