@babylonjs/core 6.20.2 → 6.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/Audio/soundTrack.js +1 -1
  2. package/Audio/soundTrack.js.map +1 -1
  3. package/Buffers/buffer.d.ts +2 -1
  4. package/Buffers/buffer.js +12 -5
  5. package/Buffers/buffer.js.map +1 -1
  6. package/Debug/rayHelper.d.ts +3 -3
  7. package/Debug/rayHelper.js +2 -2
  8. package/Debug/rayHelper.js.map +1 -1
  9. package/Engines/Native/nativeHelpers.d.ts +9 -0
  10. package/Engines/Native/nativeHelpers.js +296 -0
  11. package/Engines/Native/nativeHelpers.js.map +1 -0
  12. package/Engines/Native/nativeInterfaces.d.ts +90 -0
  13. package/Engines/Native/nativeInterfaces.js.map +1 -1
  14. package/Engines/engine.d.ts +3 -3
  15. package/Engines/nativeEngine.d.ts +1 -10
  16. package/Engines/nativeEngine.js +13 -207
  17. package/Engines/nativeEngine.js.map +1 -1
  18. package/Engines/thinEngine.js +4 -2
  19. package/Engines/thinEngine.js.map +1 -1
  20. package/Engines/webgpuEngine.js +2 -1
  21. package/Engines/webgpuEngine.js.map +1 -1
  22. package/FlowGraph/Blocks/Data/Logic/flowGraphLogicBlocks.d.ts +23 -0
  23. package/FlowGraph/Blocks/Data/Logic/flowGraphLogicBlocks.js +31 -0
  24. package/FlowGraph/Blocks/Data/Logic/flowGraphLogicBlocks.js.map +1 -0
  25. package/FlowGraph/Blocks/Data/Math/flowGraphNumberMathBlocks.d.ts +270 -0
  26. package/FlowGraph/Blocks/Data/Math/flowGraphNumberMathBlocks.js +347 -0
  27. package/FlowGraph/Blocks/Data/Math/flowGraphNumberMathBlocks.js.map +1 -0
  28. package/FlowGraph/Blocks/Data/Math/flowGraphVector2MathBlocks.d.ts +52 -0
  29. package/FlowGraph/Blocks/Data/Math/flowGraphVector2MathBlocks.js +71 -0
  30. package/FlowGraph/Blocks/Data/Math/flowGraphVector2MathBlocks.js.map +1 -0
  31. package/FlowGraph/Blocks/Data/Math/flowGraphVector3MathBlocks.d.ts +66 -0
  32. package/FlowGraph/Blocks/Data/Math/flowGraphVector3MathBlocks.js +86 -0
  33. package/FlowGraph/Blocks/Data/Math/flowGraphVector3MathBlocks.js.map +1 -0
  34. package/FlowGraph/Blocks/Data/Math/flowGraphVector4MathBlocks.d.ts +52 -0
  35. package/FlowGraph/Blocks/Data/Math/flowGraphVector4MathBlocks.js +71 -0
  36. package/FlowGraph/Blocks/Data/Math/flowGraphVector4MathBlocks.js.map +1 -0
  37. package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.d.ts +17 -0
  38. package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.js +19 -0
  39. package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.js.map +1 -0
  40. package/FlowGraph/Blocks/Data/flowGraphConstantOperationBlock.d.ts +13 -0
  41. package/FlowGraph/Blocks/Data/flowGraphConstantOperationBlock.js +16 -0
  42. package/FlowGraph/Blocks/Data/flowGraphConstantOperationBlock.js.map +1 -0
  43. package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.d.ts +15 -0
  44. package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.js +17 -0
  45. package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.js.map +1 -0
  46. package/FlowGraph/Blocks/Data/index.d.ts +4 -1
  47. package/FlowGraph/Blocks/Data/index.js +4 -1
  48. package/FlowGraph/Blocks/Data/index.js.map +1 -1
  49. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.d.ts +16 -0
  50. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.js +29 -0
  51. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.js.map +1 -0
  52. package/FlowGraph/Blocks/Event/index.d.ts +1 -0
  53. package/FlowGraph/Blocks/Event/index.js +1 -0
  54. package/FlowGraph/Blocks/Event/index.js.map +1 -1
  55. package/FlowGraph/flowGraphDataConnection.d.ts +2 -2
  56. package/FlowGraph/flowGraphDataConnection.js +3 -3
  57. package/FlowGraph/flowGraphDataConnection.js.map +1 -1
  58. package/Gizmos/axisDragGizmo.d.ts +1 -1
  59. package/Gizmos/axisDragGizmo.js.map +1 -1
  60. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +1 -0
  61. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  62. package/Materials/Node/Blocks/Teleport/teleportInBlock.d.ts +6 -0
  63. package/Materials/Node/Blocks/Teleport/teleportInBlock.js +16 -0
  64. package/Materials/Node/Blocks/Teleport/teleportInBlock.js.map +1 -1
  65. package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
  66. package/Materials/PBR/pbrBaseMaterial.js +7 -1
  67. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  68. package/Materials/standardMaterial.d.ts +1 -0
  69. package/Materials/standardMaterial.js +6 -0
  70. package/Materials/standardMaterial.js.map +1 -1
  71. package/Meshes/Compression/dracoCompression.d.ts +19 -8
  72. package/Meshes/Compression/dracoCompression.js +162 -119
  73. package/Meshes/Compression/dracoCompression.js.map +1 -1
  74. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +1 -0
  75. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
  76. package/Meshes/Node/Blocks/Instances/instantiateOnVerticesBlock.js +7 -3
  77. package/Meshes/Node/Blocks/Instances/instantiateOnVerticesBlock.js.map +1 -1
  78. package/Meshes/Node/Blocks/Teleport/teleportInBlock.d.ts +19 -0
  79. package/Meshes/Node/Blocks/Teleport/teleportInBlock.js +49 -0
  80. package/Meshes/Node/Blocks/Teleport/teleportInBlock.js.map +1 -1
  81. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.d.ts +57 -0
  82. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js +126 -0
  83. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js.map +1 -0
  84. package/Meshes/Node/Blocks/Textures/geometryTextureFetchBlock.d.ts +62 -0
  85. package/Meshes/Node/Blocks/Textures/geometryTextureFetchBlock.js +156 -0
  86. package/Meshes/Node/Blocks/Textures/geometryTextureFetchBlock.js.map +1 -0
  87. package/Meshes/Node/Blocks/boundingBlock.d.ts +30 -0
  88. package/Meshes/Node/Blocks/boundingBlock.js +64 -0
  89. package/Meshes/Node/Blocks/boundingBlock.js.map +1 -0
  90. package/Meshes/Node/Blocks/debugBlock.d.ts +2 -1
  91. package/Meshes/Node/Blocks/debugBlock.js +9 -2
  92. package/Meshes/Node/Blocks/debugBlock.js.map +1 -1
  93. package/Meshes/Node/Blocks/geometryInfoBlock.js +6 -5
  94. package/Meshes/Node/Blocks/geometryInfoBlock.js.map +1 -1
  95. package/Meshes/Node/Blocks/geometryTransformBlock.js +1 -0
  96. package/Meshes/Node/Blocks/geometryTransformBlock.js.map +1 -1
  97. package/Meshes/Node/Blocks/geometryTrigonometryBlock.js +1 -0
  98. package/Meshes/Node/Blocks/geometryTrigonometryBlock.js.map +1 -1
  99. package/Meshes/Node/Blocks/mapRangeBlock.js +1 -0
  100. package/Meshes/Node/Blocks/mapRangeBlock.js.map +1 -1
  101. package/Meshes/Node/Blocks/mathBlock.js +2 -0
  102. package/Meshes/Node/Blocks/mathBlock.js.map +1 -1
  103. package/Meshes/Node/Blocks/normalizeVectorBlock.js +1 -0
  104. package/Meshes/Node/Blocks/normalizeVectorBlock.js.map +1 -1
  105. package/Meshes/Node/Blocks/randomBlock.d.ts +14 -3
  106. package/Meshes/Node/Blocks/randomBlock.js +42 -13
  107. package/Meshes/Node/Blocks/randomBlock.js.map +1 -1
  108. package/Meshes/Node/Enums/nodeGeometryConnectionPointTypes.d.ts +2 -0
  109. package/Meshes/Node/Enums/nodeGeometryConnectionPointTypes.js +2 -0
  110. package/Meshes/Node/Enums/nodeGeometryConnectionPointTypes.js.map +1 -1
  111. package/Meshes/Node/Interfaces/nodeGeometryTextureData.d.ts +9 -0
  112. package/Meshes/Node/Interfaces/nodeGeometryTextureData.js +2 -0
  113. package/Meshes/Node/Interfaces/nodeGeometryTextureData.js.map +1 -0
  114. package/Meshes/Node/index.d.ts +3 -0
  115. package/Meshes/Node/index.js +3 -0
  116. package/Meshes/Node/index.js.map +1 -1
  117. package/Meshes/Node/nodeGeometry.js +0 -5
  118. package/Meshes/Node/nodeGeometry.js.map +1 -1
  119. package/Meshes/Node/nodeGeometryBuildState.d.ts +2 -2
  120. package/Meshes/Node/nodeGeometryBuildState.js +6 -4
  121. package/Meshes/Node/nodeGeometryBuildState.js.map +1 -1
  122. package/Meshes/mesh.vertexData.js +6 -3
  123. package/Meshes/mesh.vertexData.js.map +1 -1
  124. package/Meshes/meshSimplification.d.ts +1 -1
  125. package/Meshes/meshSimplification.js.map +1 -1
  126. package/Meshes/subMesh.js +1 -1
  127. package/Meshes/subMesh.js.map +1 -1
  128. package/Physics/v2/IPhysicsEnginePlugin.d.ts +8 -0
  129. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  130. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js +15 -16
  131. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js.map +1 -1
  132. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +16 -23
  133. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  134. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +14 -19
  135. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
  136. package/Shaders/ShadersInclude/bumpFragmentFunctions.js +14 -2
  137. package/Shaders/ShadersInclude/bumpFragmentFunctions.js.map +1 -1
  138. package/package.json +1 -1
  139. package/FlowGraph/Blocks/Data/flowGraphAddBlock.d.ts +0 -23
  140. package/FlowGraph/Blocks/Data/flowGraphAddBlock.js +0 -18
  141. package/FlowGraph/Blocks/Data/flowGraphAddBlock.js.map +0 -1
@@ -30,7 +30,7 @@ export interface ISimplificationSettings {
30
30
  /**
31
31
  * Gets an already optimized mesh
32
32
  */
33
- optimizeMesh?: boolean;
33
+ optimizeMesh?: boolean | undefined;
34
34
  }
35
35
  /**
36
36
  * Class used to specify simplification options
@@ -1 +1 @@
1
- {"version":3,"file":"meshSimplification.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/meshSimplification.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IndicesArray } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { AsyncLoop } from \"../Misc/tools\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\n/**\r\n * A simplifier interface for future simplification implementations\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplifier {\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n * @param errorCallback in case of an error, this callback will be called. optional.\r\n */\r\n simplify(settings: ISimplificationSettings, successCallback: (simplifiedMeshes: Mesh) => void, errorCallback?: () => void): void;\r\n}\r\n\r\n/**\r\n * Expected simplification settings.\r\n * Quality should be between 0 and 1 (1 being 100%, 0 being 0%)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplificationSettings {\r\n /**\r\n * Gets or sets the expected quality\r\n */\r\n quality: number;\r\n /**\r\n * Gets or sets the distance when this optimized version should be used\r\n */\r\n distance: number;\r\n /**\r\n * Gets an already optimized mesh\r\n */\r\n optimizeMesh?: boolean;\r\n}\r\n\r\n/**\r\n * Class used to specify simplification options\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationSettings implements ISimplificationSettings {\r\n /**\r\n * Creates a SimplificationSettings\r\n * @param quality expected quality\r\n * @param distance distance when this optimized version should be used\r\n * @param optimizeMesh already optimized mesh\r\n */\r\n constructor(\r\n /** expected quality */\r\n public quality: number,\r\n /** distance when this optimized version should be used */\r\n public distance: number,\r\n /** already optimized mesh */\r\n public optimizeMesh?: boolean\r\n ) {}\r\n}\r\n\r\n/**\r\n * Interface used to define a simplification task\r\n */\r\nexport interface ISimplificationTask {\r\n /**\r\n * Array of settings\r\n */\r\n settings: Array<ISimplificationSettings>;\r\n /**\r\n * Simplification type\r\n */\r\n simplificationType: SimplificationType;\r\n /**\r\n * Mesh to simplify\r\n */\r\n mesh: Mesh;\r\n /**\r\n * Callback called on success\r\n */\r\n successCallback?: () => void;\r\n /**\r\n * Defines if parallel processing can be used\r\n */\r\n parallelProcessing: boolean;\r\n}\r\n\r\n/**\r\n * Queue used to order the simplification tasks\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationQueue {\r\n private _simplificationArray: Array<ISimplificationTask>;\r\n\r\n /**\r\n * Gets a boolean indicating that the process is still running\r\n */\r\n public running: boolean;\r\n\r\n /**\r\n * Creates a new queue\r\n */\r\n constructor() {\r\n this.running = false;\r\n this._simplificationArray = [];\r\n }\r\n\r\n /**\r\n * Adds a new simplification task\r\n * @param task defines a task to add\r\n */\r\n public addTask(task: ISimplificationTask) {\r\n this._simplificationArray.push(task);\r\n }\r\n\r\n /**\r\n * Execute next task\r\n */\r\n public executeNext() {\r\n const task = this._simplificationArray.pop();\r\n if (task) {\r\n this.running = true;\r\n this.runSimplification(task);\r\n } else {\r\n this.running = false;\r\n }\r\n }\r\n\r\n /**\r\n * Execute a simplification task\r\n * @param task defines the task to run\r\n */\r\n public runSimplification(task: ISimplificationTask) {\r\n if (task.parallelProcessing) {\r\n //parallel simplifier\r\n task.settings.forEach((setting) => {\r\n const simplifier = this._getSimplifier(task);\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //check if it is the last\r\n if (setting.quality === task.settings[task.settings.length - 1].quality && task.successCallback) {\r\n //all done, run the success callback.\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n });\r\n });\r\n } else {\r\n //single simplifier.\r\n const simplifier = this._getSimplifier(task);\r\n\r\n const runDecimation = (setting: ISimplificationSettings, callback: () => void) => {\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //run the next quality level\r\n callback();\r\n });\r\n };\r\n\r\n AsyncLoop.Run(\r\n task.settings.length,\r\n (loop: AsyncLoop) => {\r\n runDecimation(task.settings[loop.index], () => {\r\n loop.executeNext();\r\n });\r\n },\r\n () => {\r\n //execution ended, run the success callback.\r\n if (task.successCallback) {\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n }\r\n );\r\n }\r\n }\r\n\r\n private _getSimplifier(task: ISimplificationTask): ISimplifier {\r\n switch (task.simplificationType) {\r\n case SimplificationType.QUADRATIC:\r\n default:\r\n return new QuadraticErrorSimplification(task.mesh);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The implemented types of simplification\r\n * At the moment only Quadratic Error Decimation is implemented\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport enum SimplificationType {\r\n /** Quadratic error decimation */\r\n QUADRATIC,\r\n}\r\n\r\nclass DecimationTriangle {\r\n public normal: Vector3;\r\n public error: Array<number>;\r\n public deleted: boolean;\r\n public isDirty: boolean;\r\n public borderFactor: number;\r\n public deletePending: boolean;\r\n\r\n public originalOffset: number;\r\n\r\n constructor(public _vertices: Array<DecimationVertex>) {\r\n this.error = new Array<number>(4);\r\n this.deleted = false;\r\n this.isDirty = false;\r\n this.deletePending = false;\r\n this.borderFactor = 0;\r\n }\r\n}\r\n\r\nclass DecimationVertex {\r\n public q: QuadraticMatrix;\r\n public isBorder: boolean;\r\n\r\n public triangleStart: number;\r\n public triangleCount: number;\r\n\r\n public originalOffsets: Array<number>;\r\n\r\n constructor(public position: Vector3, public id: number) {\r\n this.isBorder = true;\r\n this.q = new QuadraticMatrix();\r\n this.triangleCount = 0;\r\n this.triangleStart = 0;\r\n this.originalOffsets = [];\r\n }\r\n\r\n public updatePosition(newPosition: Vector3) {\r\n this.position.copyFrom(newPosition);\r\n }\r\n}\r\n\r\nclass QuadraticMatrix {\r\n public data: Array<number>;\r\n\r\n constructor(data?: Array<number>) {\r\n this.data = new Array(10);\r\n for (let i = 0; i < 10; ++i) {\r\n if (data && data[i]) {\r\n this.data[i] = data[i];\r\n } else {\r\n this.data[i] = 0;\r\n }\r\n }\r\n }\r\n\r\n public det(a11: number, a12: number, a13: number, a21: number, a22: number, a23: number, a31: number, a32: number, a33: number): number {\r\n const det =\r\n this.data[a11] * this.data[a22] * this.data[a33] +\r\n this.data[a13] * this.data[a21] * this.data[a32] +\r\n this.data[a12] * this.data[a23] * this.data[a31] -\r\n this.data[a13] * this.data[a22] * this.data[a31] -\r\n this.data[a11] * this.data[a23] * this.data[a32] -\r\n this.data[a12] * this.data[a21] * this.data[a33];\r\n return det;\r\n }\r\n\r\n public addInPlace(matrix: QuadraticMatrix) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += matrix.data[i];\r\n }\r\n }\r\n\r\n public addArrayInPlace(data: Array<number>) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += data[i];\r\n }\r\n }\r\n\r\n public add(matrix: QuadraticMatrix): QuadraticMatrix {\r\n const m = new QuadraticMatrix();\r\n for (let i = 0; i < 10; ++i) {\r\n m.data[i] = this.data[i] + matrix.data[i];\r\n }\r\n return m;\r\n }\r\n\r\n public static FromData(a: number, b: number, c: number, d: number): QuadraticMatrix {\r\n return new QuadraticMatrix(QuadraticMatrix.DataFromNumbers(a, b, c, d));\r\n }\r\n\r\n //returning an array to avoid garbage collection\r\n public static DataFromNumbers(a: number, b: number, c: number, d: number) {\r\n return [a * a, a * b, a * c, a * d, b * b, b * c, b * d, c * c, c * d, d * d];\r\n }\r\n}\r\n\r\nclass Reference {\r\n constructor(public vertexId: number, public triangleId: number) {}\r\n}\r\n\r\n/**\r\n * An implementation of the Quadratic Error simplification algorithm.\r\n * Original paper : http://www1.cs.columbia.edu/~cs4162/html05s/garland97.pdf\r\n * Ported mostly from QSlim and http://voxels.blogspot.de/2014/05/quadric-mesh-simplification-with-source.html to babylon JS\r\n * @author RaananW\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class QuadraticErrorSimplification implements ISimplifier {\r\n private _triangles: Array<DecimationTriangle>;\r\n private _vertices: Array<DecimationVertex>;\r\n private _references: Array<Reference>;\r\n\r\n private _reconstructedMesh: Mesh;\r\n\r\n /** Gets or sets the number pf sync iterations */\r\n public syncIterations = 5000;\r\n\r\n /** Gets or sets the aggressiveness of the simplifier */\r\n public aggressiveness: number;\r\n\r\n /** Gets or sets the number of allowed iterations for decimation */\r\n public decimationIterations: number;\r\n\r\n /** Gets or sets the espilon to use for bounding box computation */\r\n public boundingBoxEpsilon: number;\r\n\r\n /**\r\n * Creates a new QuadraticErrorSimplification\r\n * @param _mesh defines the target mesh\r\n */\r\n constructor(private _mesh: Mesh) {\r\n this.aggressiveness = 7;\r\n this.decimationIterations = 100;\r\n this.boundingBoxEpsilon = Epsilon;\r\n }\r\n\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n */\r\n public simplify(settings: ISimplificationSettings, successCallback: (simplifiedMesh: Mesh) => void) {\r\n this._initDecimatedMesh();\r\n //iterating through the submeshes array, one after the other.\r\n AsyncLoop.Run(\r\n this._mesh.subMeshes.length,\r\n (loop: AsyncLoop) => {\r\n this._initWithMesh(\r\n loop.index,\r\n () => {\r\n this._runDecimation(settings, loop.index, () => {\r\n loop.executeNext();\r\n });\r\n },\r\n settings.optimizeMesh\r\n );\r\n },\r\n () => {\r\n setTimeout(() => {\r\n successCallback(this._reconstructedMesh);\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _runDecimation(settings: ISimplificationSettings, submeshIndex: number, successCallback: () => void) {\r\n const targetCount = ~~(this._triangles.length * settings.quality);\r\n let deletedTriangles = 0;\r\n\r\n const triangleCount = this._triangles.length;\r\n\r\n const iterationFunction = (iteration: number, callback: () => void) => {\r\n setTimeout(() => {\r\n if (iteration % 5 === 0) {\r\n this._updateMesh(iteration === 0);\r\n }\r\n\r\n for (let i = 0; i < this._triangles.length; ++i) {\r\n this._triangles[i].isDirty = false;\r\n }\r\n\r\n const threshold = 0.000000001 * Math.pow(iteration + 3, this.aggressiveness);\r\n\r\n const trianglesIterator = (i: number) => {\r\n const tIdx = ~~((this._triangles.length / 2 + i) % this._triangles.length);\r\n const t = this._triangles[tIdx];\r\n if (!t) {\r\n return;\r\n }\r\n if (t.error[3] > threshold || t.deleted || t.isDirty) {\r\n return;\r\n }\r\n for (let j = 0; j < 3; ++j) {\r\n if (t.error[j] < threshold) {\r\n const deleted0: Array<boolean> = [];\r\n const deleted1: Array<boolean> = [];\r\n\r\n const v0 = t._vertices[j];\r\n const v1 = t._vertices[(j + 1) % 3];\r\n\r\n if (v0.isBorder || v1.isBorder) {\r\n continue;\r\n }\r\n\r\n const p = Vector3.Zero();\r\n // var n = Vector3.Zero();\r\n // var uv = Vector2.Zero();\r\n // var color = new Color4(0, 0, 0, 1);\r\n\r\n this._calculateError(v0, v1, p);\r\n\r\n const delTr = new Array<DecimationTriangle>();\r\n\r\n if (this._isFlipped(v0, v1, p, deleted0, delTr)) {\r\n continue;\r\n }\r\n if (this._isFlipped(v1, v0, p, deleted1, delTr)) {\r\n continue;\r\n }\r\n\r\n if (deleted0.indexOf(true) < 0 || deleted1.indexOf(true) < 0) {\r\n continue;\r\n }\r\n\r\n const uniqueArray = new Array<DecimationTriangle>();\r\n delTr.forEach((deletedT) => {\r\n if (uniqueArray.indexOf(deletedT) === -1) {\r\n deletedT.deletePending = true;\r\n uniqueArray.push(deletedT);\r\n }\r\n });\r\n\r\n if (uniqueArray.length % 2 !== 0) {\r\n continue;\r\n }\r\n\r\n v0.q = v1.q.add(v0.q);\r\n\r\n v0.updatePosition(p);\r\n\r\n const tStart = this._references.length;\r\n\r\n deletedTriangles = this._updateTriangles(v0, v0, deleted0, deletedTriangles);\r\n deletedTriangles = this._updateTriangles(v0, v1, deleted1, deletedTriangles);\r\n\r\n const tCount = this._references.length - tStart;\r\n\r\n if (tCount <= v0.triangleCount) {\r\n if (tCount) {\r\n for (let c = 0; c < tCount; c++) {\r\n this._references[v0.triangleStart + c] = this._references[tStart + c];\r\n }\r\n }\r\n } else {\r\n v0.triangleStart = tStart;\r\n }\r\n\r\n v0.triangleCount = tCount;\r\n break;\r\n }\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, trianglesIterator, callback, () => {\r\n return triangleCount - deletedTriangles <= targetCount;\r\n });\r\n }, 0);\r\n };\r\n\r\n AsyncLoop.Run(\r\n this.decimationIterations,\r\n (loop: AsyncLoop) => {\r\n if (triangleCount - deletedTriangles <= targetCount) {\r\n loop.breakLoop();\r\n } else {\r\n iterationFunction(loop.index, () => {\r\n loop.executeNext();\r\n });\r\n }\r\n },\r\n () => {\r\n setTimeout(() => {\r\n //reconstruct this part of the mesh\r\n this._reconstructMesh(submeshIndex);\r\n successCallback();\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _initWithMesh(submeshIndex: number, callback: Function, optimizeMesh?: boolean) {\r\n this._vertices = [];\r\n this._triangles = [];\r\n\r\n const positionData = this._mesh.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n const indices = this._mesh.getIndices();\r\n const submesh = this._mesh.subMeshes[submeshIndex];\r\n\r\n const findInVertices = (positionToSearch: Vector3) => {\r\n if (optimizeMesh) {\r\n for (let ii = 0; ii < this._vertices.length; ++ii) {\r\n if (this._vertices[ii].position.equalsWithEpsilon(positionToSearch, 0.0001)) {\r\n return this._vertices[ii];\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const vertexReferences: Array<number> = [];\r\n\r\n const vertexInit = (i: number) => {\r\n if (!positionData) {\r\n return;\r\n }\r\n\r\n const offset = i + submesh.verticesStart;\r\n const position = Vector3.FromArray(positionData, offset * 3);\r\n\r\n const vertex = findInVertices(position) || new DecimationVertex(position, this._vertices.length);\r\n vertex.originalOffsets.push(offset);\r\n if (vertex.id === this._vertices.length) {\r\n this._vertices.push(vertex);\r\n }\r\n vertexReferences.push(vertex.id);\r\n };\r\n //var totalVertices = mesh.getTotalVertices();\r\n const totalVertices = submesh.verticesCount;\r\n AsyncLoop.SyncAsyncForLoop(totalVertices, (this.syncIterations / 4) >> 0, vertexInit, () => {\r\n const indicesInit = (i: number) => {\r\n if (!indices) {\r\n return;\r\n }\r\n\r\n const offset = submesh.indexStart / 3 + i;\r\n const pos = offset * 3;\r\n const i0 = indices[pos + 0];\r\n const i1 = indices[pos + 1];\r\n const i2 = indices[pos + 2];\r\n const v0: DecimationVertex = this._vertices[vertexReferences[i0 - submesh.verticesStart]];\r\n const v1: DecimationVertex = this._vertices[vertexReferences[i1 - submesh.verticesStart]];\r\n const v2: DecimationVertex = this._vertices[vertexReferences[i2 - submesh.verticesStart]];\r\n const triangle = new DecimationTriangle([v0, v1, v2]);\r\n triangle.originalOffset = pos;\r\n this._triangles.push(triangle);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(submesh.indexCount / 3, this.syncIterations, indicesInit, () => {\r\n this._init(callback);\r\n });\r\n });\r\n }\r\n\r\n private _init(callback: Function) {\r\n const triangleInit1 = (i: number) => {\r\n const t = this._triangles[i];\r\n t.normal = Vector3.Cross(t._vertices[1].position.subtract(t._vertices[0].position), t._vertices[2].position.subtract(t._vertices[0].position)).normalize();\r\n for (let j = 0; j < 3; j++) {\r\n t._vertices[j].q.addArrayInPlace(QuadraticMatrix.DataFromNumbers(t.normal.x, t.normal.y, t.normal.z, -Vector3.Dot(t.normal, t._vertices[0].position)));\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit1, () => {\r\n const triangleInit2 = (i: number) => {\r\n const t = this._triangles[i];\r\n for (let j = 0; j < 3; ++j) {\r\n t.error[j] = this._calculateError(t._vertices[j], t._vertices[(j + 1) % 3]);\r\n }\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit2, () => {\r\n callback();\r\n });\r\n });\r\n }\r\n\r\n private _reconstructMesh(submeshIndex: number) {\r\n const newTriangles: Array<DecimationTriangle> = [];\r\n let i: number;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n t._vertices[j].triangleCount = 1;\r\n }\r\n newTriangles.push(t);\r\n }\r\n }\r\n\r\n const newPositionData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.PositionKind) || []);\r\n const newNormalData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.NormalKind) || []);\r\n const newUVsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.UVKind) || []);\r\n const newColorsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.ColorKind) || []);\r\n\r\n const normalData = this._mesh.getVerticesData(VertexBuffer.NormalKind);\r\n const uvs = this._mesh.getVerticesData(VertexBuffer.UVKind);\r\n const colorsData = this._mesh.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n let vertexCount = 0;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n const vertex = this._vertices[i];\r\n vertex.id = vertexCount;\r\n if (vertex.triangleCount) {\r\n vertex.originalOffsets.forEach((originalOffset) => {\r\n newPositionData.push(vertex.position.x);\r\n newPositionData.push(vertex.position.y);\r\n newPositionData.push(vertex.position.z);\r\n\r\n if (normalData && normalData.length) {\r\n newNormalData.push(normalData[originalOffset * 3]);\r\n newNormalData.push(normalData[originalOffset * 3 + 1]);\r\n newNormalData.push(normalData[originalOffset * 3 + 2]);\r\n }\r\n if (uvs && uvs.length) {\r\n newUVsData.push(uvs[originalOffset * 2]);\r\n newUVsData.push(uvs[originalOffset * 2 + 1]);\r\n }\r\n if (colorsData && colorsData.length) {\r\n newColorsData.push(colorsData[originalOffset * 4]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 1]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 2]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 3]);\r\n }\r\n ++vertexCount;\r\n });\r\n }\r\n }\r\n\r\n const startingIndex = this._reconstructedMesh.getTotalIndices();\r\n const startingVertex = this._reconstructedMesh.getTotalVertices();\r\n\r\n const submeshesArray = this._reconstructedMesh.subMeshes;\r\n this._reconstructedMesh.subMeshes = [];\r\n\r\n const newIndicesArray: number[] = <number[]>this._reconstructedMesh.getIndices(); //[];\r\n const originalIndices = <IndicesArray>this._mesh.getIndices();\r\n for (i = 0; i < newTriangles.length; ++i) {\r\n t = newTriangles[i]; //now get the new referencing point for each vertex\r\n [0, 1, 2].forEach((idx) => {\r\n const id = originalIndices[t.originalOffset + idx];\r\n let offset = t._vertices[idx].originalOffsets.indexOf(id);\r\n if (offset < 0) {\r\n offset = 0;\r\n }\r\n newIndicesArray.push(t._vertices[idx].id + offset + startingVertex);\r\n });\r\n }\r\n\r\n //overwriting the old vertex buffers and indices.\r\n\r\n this._reconstructedMesh.setIndices(newIndicesArray);\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.PositionKind, newPositionData);\r\n if (newNormalData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.NormalKind, newNormalData);\r\n }\r\n if (newUVsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.UVKind, newUVsData);\r\n }\r\n if (newColorsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.ColorKind, newColorsData);\r\n }\r\n\r\n //create submesh\r\n const originalSubmesh = this._mesh.subMeshes[submeshIndex];\r\n if (submeshIndex > 0) {\r\n this._reconstructedMesh.subMeshes = [];\r\n submeshesArray.forEach((submesh) => {\r\n SubMesh.AddToMesh(\r\n submesh.materialIndex,\r\n submesh.verticesStart,\r\n submesh.verticesCount,\r\n /* 0, newPositionData.length/3, */ submesh.indexStart,\r\n submesh.indexCount,\r\n submesh.getMesh()\r\n );\r\n });\r\n SubMesh.AddToMesh(\r\n originalSubmesh.materialIndex,\r\n startingVertex,\r\n vertexCount,\r\n /* 0, newPositionData.length / 3, */ startingIndex,\r\n newTriangles.length * 3,\r\n this._reconstructedMesh\r\n );\r\n }\r\n }\r\n\r\n private _initDecimatedMesh() {\r\n this._reconstructedMesh = new Mesh(this._mesh.name + \"Decimated\", this._mesh.getScene());\r\n this._reconstructedMesh.material = this._mesh.material;\r\n this._reconstructedMesh.parent = this._mesh.parent;\r\n this._reconstructedMesh.isVisible = false;\r\n this._reconstructedMesh.renderingGroupId = this._mesh.renderingGroupId;\r\n }\r\n\r\n private _isFlipped(vertex1: DecimationVertex, vertex2: DecimationVertex, point: Vector3, deletedArray: Array<boolean>, delTr: Array<DecimationTriangle>): boolean {\r\n for (let i = 0; i < vertex1.triangleCount; ++i) {\r\n const t = this._triangles[this._references[vertex1.triangleStart + i].triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n\r\n const s = this._references[vertex1.triangleStart + i].vertexId;\r\n\r\n const v1 = t._vertices[(s + 1) % 3];\r\n const v2 = t._vertices[(s + 2) % 3];\r\n\r\n if (v1 === vertex2 || v2 === vertex2) {\r\n deletedArray[i] = true;\r\n delTr.push(t);\r\n continue;\r\n }\r\n\r\n let d1 = v1.position.subtract(point);\r\n d1 = d1.normalize();\r\n let d2 = v2.position.subtract(point);\r\n d2 = d2.normalize();\r\n if (Math.abs(Vector3.Dot(d1, d2)) > 0.999) {\r\n return true;\r\n }\r\n const normal = Vector3.Cross(d1, d2).normalize();\r\n deletedArray[i] = false;\r\n if (Vector3.Dot(normal, t.normal) < 0.2) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _updateTriangles(origVertex: DecimationVertex, vertex: DecimationVertex, deletedArray: Array<boolean>, deletedTriangles: number): number {\r\n let newDeleted = deletedTriangles;\r\n for (let i = 0; i < vertex.triangleCount; ++i) {\r\n const ref = this._references[vertex.triangleStart + i];\r\n const t = this._triangles[ref.triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n if (deletedArray[i] && t.deletePending) {\r\n t.deleted = true;\r\n newDeleted++;\r\n continue;\r\n }\r\n t._vertices[ref.vertexId] = origVertex;\r\n t.isDirty = true;\r\n t.error[0] = this._calculateError(t._vertices[0], t._vertices[1]) + t.borderFactor / 2;\r\n t.error[1] = this._calculateError(t._vertices[1], t._vertices[2]) + t.borderFactor / 2;\r\n t.error[2] = this._calculateError(t._vertices[2], t._vertices[0]) + t.borderFactor / 2;\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n this._references.push(ref);\r\n }\r\n return newDeleted;\r\n }\r\n\r\n private _identifyBorder() {\r\n for (let i = 0; i < this._vertices.length; ++i) {\r\n const vCount: Array<number> = [];\r\n const vId: Array<number> = [];\r\n const v = this._vertices[i];\r\n let j: number;\r\n for (j = 0; j < v.triangleCount; ++j) {\r\n const triangle = this._triangles[this._references[v.triangleStart + j].triangleId];\r\n for (let ii = 0; ii < 3; ii++) {\r\n let ofs = 0;\r\n const vv = triangle._vertices[ii];\r\n while (ofs < vCount.length) {\r\n if (vId[ofs] === vv.id) {\r\n break;\r\n }\r\n ++ofs;\r\n }\r\n if (ofs === vCount.length) {\r\n vCount.push(1);\r\n vId.push(vv.id);\r\n } else {\r\n vCount[ofs]++;\r\n }\r\n }\r\n }\r\n\r\n for (j = 0; j < vCount.length; ++j) {\r\n if (vCount[j] === 1) {\r\n this._vertices[vId[j]].isBorder = true;\r\n } else {\r\n this._vertices[vId[j]].isBorder = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _updateMesh(identifyBorders: boolean = false) {\r\n let i: number;\r\n if (!identifyBorders) {\r\n const newTrianglesVector: Array<DecimationTriangle> = [];\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n newTrianglesVector.push(this._triangles[i]);\r\n }\r\n }\r\n this._triangles = newTrianglesVector;\r\n }\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n this._vertices[i].triangleStart = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n let v: DecimationVertex;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n v.triangleCount++;\r\n }\r\n }\r\n\r\n let tStart = 0;\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleStart = tStart;\r\n tStart += this._vertices[i].triangleCount;\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n\r\n const newReferences: Array<Reference> = new Array(this._triangles.length * 3);\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n newReferences[v.triangleStart + v.triangleCount] = new Reference(j, i);\r\n v.triangleCount++;\r\n }\r\n }\r\n this._references = newReferences;\r\n\r\n if (identifyBorders) {\r\n this._identifyBorder();\r\n }\r\n }\r\n\r\n private _vertexError(q: QuadraticMatrix, point: Vector3): number {\r\n const x = point.x;\r\n const y = point.y;\r\n const z = point.z;\r\n return (\r\n q.data[0] * x * x +\r\n 2 * q.data[1] * x * y +\r\n 2 * q.data[2] * x * z +\r\n 2 * q.data[3] * x +\r\n q.data[4] * y * y +\r\n 2 * q.data[5] * y * z +\r\n 2 * q.data[6] * y +\r\n q.data[7] * z * z +\r\n 2 * q.data[8] * z +\r\n q.data[9]\r\n );\r\n }\r\n\r\n private _calculateError(vertex1: DecimationVertex, vertex2: DecimationVertex, pointResult?: Vector3): number {\r\n const q = vertex1.q.add(vertex2.q);\r\n const border = vertex1.isBorder && vertex2.isBorder;\r\n let error: number = 0;\r\n const qDet = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7);\r\n\r\n if (qDet !== 0 && !border) {\r\n if (!pointResult) {\r\n pointResult = Vector3.Zero();\r\n }\r\n pointResult.x = (-1 / qDet) * q.det(1, 2, 3, 4, 5, 6, 5, 7, 8);\r\n pointResult.y = (1 / qDet) * q.det(0, 2, 3, 1, 5, 6, 2, 7, 8);\r\n pointResult.z = (-1 / qDet) * q.det(0, 1, 3, 1, 4, 6, 2, 5, 8);\r\n error = this._vertexError(q, pointResult);\r\n } else {\r\n const p3 = vertex1.position.add(vertex2.position).divide(new Vector3(2, 2, 2));\r\n //var norm3 = (vertex1.normal.add(vertex2.normal)).divide(new Vector3(2, 2, 2)).normalize();\r\n const error1 = this._vertexError(q, vertex1.position);\r\n const error2 = this._vertexError(q, vertex2.position);\r\n const error3 = this._vertexError(q, p3);\r\n error = Math.min(error1, error2, error3);\r\n if (error === error1) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex1.position);\r\n }\r\n } else if (error === error2) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex2.position);\r\n }\r\n } else {\r\n if (pointResult) {\r\n pointResult.copyFrom(p3);\r\n }\r\n }\r\n }\r\n return error;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"meshSimplification.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/meshSimplification.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IndicesArray } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { AsyncLoop } from \"../Misc/tools\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\n/**\r\n * A simplifier interface for future simplification implementations\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplifier {\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n * @param errorCallback in case of an error, this callback will be called. optional.\r\n */\r\n simplify(settings: ISimplificationSettings, successCallback: (simplifiedMeshes: Mesh) => void, errorCallback?: () => void): void;\r\n}\r\n\r\n/**\r\n * Expected simplification settings.\r\n * Quality should be between 0 and 1 (1 being 100%, 0 being 0%)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplificationSettings {\r\n /**\r\n * Gets or sets the expected quality\r\n */\r\n quality: number;\r\n /**\r\n * Gets or sets the distance when this optimized version should be used\r\n */\r\n distance: number;\r\n /**\r\n * Gets an already optimized mesh\r\n */\r\n optimizeMesh?: boolean | undefined;\r\n}\r\n\r\n/**\r\n * Class used to specify simplification options\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationSettings implements ISimplificationSettings {\r\n /**\r\n * Creates a SimplificationSettings\r\n * @param quality expected quality\r\n * @param distance distance when this optimized version should be used\r\n * @param optimizeMesh already optimized mesh\r\n */\r\n constructor(\r\n /** expected quality */\r\n public quality: number,\r\n /** distance when this optimized version should be used */\r\n public distance: number,\r\n /** already optimized mesh */\r\n public optimizeMesh?: boolean\r\n ) {}\r\n}\r\n\r\n/**\r\n * Interface used to define a simplification task\r\n */\r\nexport interface ISimplificationTask {\r\n /**\r\n * Array of settings\r\n */\r\n settings: Array<ISimplificationSettings>;\r\n /**\r\n * Simplification type\r\n */\r\n simplificationType: SimplificationType;\r\n /**\r\n * Mesh to simplify\r\n */\r\n mesh: Mesh;\r\n /**\r\n * Callback called on success\r\n */\r\n successCallback?: () => void;\r\n /**\r\n * Defines if parallel processing can be used\r\n */\r\n parallelProcessing: boolean;\r\n}\r\n\r\n/**\r\n * Queue used to order the simplification tasks\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationQueue {\r\n private _simplificationArray: Array<ISimplificationTask>;\r\n\r\n /**\r\n * Gets a boolean indicating that the process is still running\r\n */\r\n public running: boolean;\r\n\r\n /**\r\n * Creates a new queue\r\n */\r\n constructor() {\r\n this.running = false;\r\n this._simplificationArray = [];\r\n }\r\n\r\n /**\r\n * Adds a new simplification task\r\n * @param task defines a task to add\r\n */\r\n public addTask(task: ISimplificationTask) {\r\n this._simplificationArray.push(task);\r\n }\r\n\r\n /**\r\n * Execute next task\r\n */\r\n public executeNext() {\r\n const task = this._simplificationArray.pop();\r\n if (task) {\r\n this.running = true;\r\n this.runSimplification(task);\r\n } else {\r\n this.running = false;\r\n }\r\n }\r\n\r\n /**\r\n * Execute a simplification task\r\n * @param task defines the task to run\r\n */\r\n public runSimplification(task: ISimplificationTask) {\r\n if (task.parallelProcessing) {\r\n //parallel simplifier\r\n task.settings.forEach((setting) => {\r\n const simplifier = this._getSimplifier(task);\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //check if it is the last\r\n if (setting.quality === task.settings[task.settings.length - 1].quality && task.successCallback) {\r\n //all done, run the success callback.\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n });\r\n });\r\n } else {\r\n //single simplifier.\r\n const simplifier = this._getSimplifier(task);\r\n\r\n const runDecimation = (setting: ISimplificationSettings, callback: () => void) => {\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //run the next quality level\r\n callback();\r\n });\r\n };\r\n\r\n AsyncLoop.Run(\r\n task.settings.length,\r\n (loop: AsyncLoop) => {\r\n runDecimation(task.settings[loop.index], () => {\r\n loop.executeNext();\r\n });\r\n },\r\n () => {\r\n //execution ended, run the success callback.\r\n if (task.successCallback) {\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n }\r\n );\r\n }\r\n }\r\n\r\n private _getSimplifier(task: ISimplificationTask): ISimplifier {\r\n switch (task.simplificationType) {\r\n case SimplificationType.QUADRATIC:\r\n default:\r\n return new QuadraticErrorSimplification(task.mesh);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The implemented types of simplification\r\n * At the moment only Quadratic Error Decimation is implemented\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport enum SimplificationType {\r\n /** Quadratic error decimation */\r\n QUADRATIC,\r\n}\r\n\r\nclass DecimationTriangle {\r\n public normal: Vector3;\r\n public error: Array<number>;\r\n public deleted: boolean;\r\n public isDirty: boolean;\r\n public borderFactor: number;\r\n public deletePending: boolean;\r\n\r\n public originalOffset: number;\r\n\r\n constructor(public _vertices: Array<DecimationVertex>) {\r\n this.error = new Array<number>(4);\r\n this.deleted = false;\r\n this.isDirty = false;\r\n this.deletePending = false;\r\n this.borderFactor = 0;\r\n }\r\n}\r\n\r\nclass DecimationVertex {\r\n public q: QuadraticMatrix;\r\n public isBorder: boolean;\r\n\r\n public triangleStart: number;\r\n public triangleCount: number;\r\n\r\n public originalOffsets: Array<number>;\r\n\r\n constructor(public position: Vector3, public id: number) {\r\n this.isBorder = true;\r\n this.q = new QuadraticMatrix();\r\n this.triangleCount = 0;\r\n this.triangleStart = 0;\r\n this.originalOffsets = [];\r\n }\r\n\r\n public updatePosition(newPosition: Vector3) {\r\n this.position.copyFrom(newPosition);\r\n }\r\n}\r\n\r\nclass QuadraticMatrix {\r\n public data: Array<number>;\r\n\r\n constructor(data?: Array<number>) {\r\n this.data = new Array(10);\r\n for (let i = 0; i < 10; ++i) {\r\n if (data && data[i]) {\r\n this.data[i] = data[i];\r\n } else {\r\n this.data[i] = 0;\r\n }\r\n }\r\n }\r\n\r\n public det(a11: number, a12: number, a13: number, a21: number, a22: number, a23: number, a31: number, a32: number, a33: number): number {\r\n const det =\r\n this.data[a11] * this.data[a22] * this.data[a33] +\r\n this.data[a13] * this.data[a21] * this.data[a32] +\r\n this.data[a12] * this.data[a23] * this.data[a31] -\r\n this.data[a13] * this.data[a22] * this.data[a31] -\r\n this.data[a11] * this.data[a23] * this.data[a32] -\r\n this.data[a12] * this.data[a21] * this.data[a33];\r\n return det;\r\n }\r\n\r\n public addInPlace(matrix: QuadraticMatrix) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += matrix.data[i];\r\n }\r\n }\r\n\r\n public addArrayInPlace(data: Array<number>) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += data[i];\r\n }\r\n }\r\n\r\n public add(matrix: QuadraticMatrix): QuadraticMatrix {\r\n const m = new QuadraticMatrix();\r\n for (let i = 0; i < 10; ++i) {\r\n m.data[i] = this.data[i] + matrix.data[i];\r\n }\r\n return m;\r\n }\r\n\r\n public static FromData(a: number, b: number, c: number, d: number): QuadraticMatrix {\r\n return new QuadraticMatrix(QuadraticMatrix.DataFromNumbers(a, b, c, d));\r\n }\r\n\r\n //returning an array to avoid garbage collection\r\n public static DataFromNumbers(a: number, b: number, c: number, d: number) {\r\n return [a * a, a * b, a * c, a * d, b * b, b * c, b * d, c * c, c * d, d * d];\r\n }\r\n}\r\n\r\nclass Reference {\r\n constructor(public vertexId: number, public triangleId: number) {}\r\n}\r\n\r\n/**\r\n * An implementation of the Quadratic Error simplification algorithm.\r\n * Original paper : http://www1.cs.columbia.edu/~cs4162/html05s/garland97.pdf\r\n * Ported mostly from QSlim and http://voxels.blogspot.de/2014/05/quadric-mesh-simplification-with-source.html to babylon JS\r\n * @author RaananW\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class QuadraticErrorSimplification implements ISimplifier {\r\n private _triangles: Array<DecimationTriangle>;\r\n private _vertices: Array<DecimationVertex>;\r\n private _references: Array<Reference>;\r\n\r\n private _reconstructedMesh: Mesh;\r\n\r\n /** Gets or sets the number pf sync iterations */\r\n public syncIterations = 5000;\r\n\r\n /** Gets or sets the aggressiveness of the simplifier */\r\n public aggressiveness: number;\r\n\r\n /** Gets or sets the number of allowed iterations for decimation */\r\n public decimationIterations: number;\r\n\r\n /** Gets or sets the espilon to use for bounding box computation */\r\n public boundingBoxEpsilon: number;\r\n\r\n /**\r\n * Creates a new QuadraticErrorSimplification\r\n * @param _mesh defines the target mesh\r\n */\r\n constructor(private _mesh: Mesh) {\r\n this.aggressiveness = 7;\r\n this.decimationIterations = 100;\r\n this.boundingBoxEpsilon = Epsilon;\r\n }\r\n\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n */\r\n public simplify(settings: ISimplificationSettings, successCallback: (simplifiedMesh: Mesh) => void) {\r\n this._initDecimatedMesh();\r\n //iterating through the submeshes array, one after the other.\r\n AsyncLoop.Run(\r\n this._mesh.subMeshes.length,\r\n (loop: AsyncLoop) => {\r\n this._initWithMesh(\r\n loop.index,\r\n () => {\r\n this._runDecimation(settings, loop.index, () => {\r\n loop.executeNext();\r\n });\r\n },\r\n settings.optimizeMesh\r\n );\r\n },\r\n () => {\r\n setTimeout(() => {\r\n successCallback(this._reconstructedMesh);\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _runDecimation(settings: ISimplificationSettings, submeshIndex: number, successCallback: () => void) {\r\n const targetCount = ~~(this._triangles.length * settings.quality);\r\n let deletedTriangles = 0;\r\n\r\n const triangleCount = this._triangles.length;\r\n\r\n const iterationFunction = (iteration: number, callback: () => void) => {\r\n setTimeout(() => {\r\n if (iteration % 5 === 0) {\r\n this._updateMesh(iteration === 0);\r\n }\r\n\r\n for (let i = 0; i < this._triangles.length; ++i) {\r\n this._triangles[i].isDirty = false;\r\n }\r\n\r\n const threshold = 0.000000001 * Math.pow(iteration + 3, this.aggressiveness);\r\n\r\n const trianglesIterator = (i: number) => {\r\n const tIdx = ~~((this._triangles.length / 2 + i) % this._triangles.length);\r\n const t = this._triangles[tIdx];\r\n if (!t) {\r\n return;\r\n }\r\n if (t.error[3] > threshold || t.deleted || t.isDirty) {\r\n return;\r\n }\r\n for (let j = 0; j < 3; ++j) {\r\n if (t.error[j] < threshold) {\r\n const deleted0: Array<boolean> = [];\r\n const deleted1: Array<boolean> = [];\r\n\r\n const v0 = t._vertices[j];\r\n const v1 = t._vertices[(j + 1) % 3];\r\n\r\n if (v0.isBorder || v1.isBorder) {\r\n continue;\r\n }\r\n\r\n const p = Vector3.Zero();\r\n // var n = Vector3.Zero();\r\n // var uv = Vector2.Zero();\r\n // var color = new Color4(0, 0, 0, 1);\r\n\r\n this._calculateError(v0, v1, p);\r\n\r\n const delTr = new Array<DecimationTriangle>();\r\n\r\n if (this._isFlipped(v0, v1, p, deleted0, delTr)) {\r\n continue;\r\n }\r\n if (this._isFlipped(v1, v0, p, deleted1, delTr)) {\r\n continue;\r\n }\r\n\r\n if (deleted0.indexOf(true) < 0 || deleted1.indexOf(true) < 0) {\r\n continue;\r\n }\r\n\r\n const uniqueArray = new Array<DecimationTriangle>();\r\n delTr.forEach((deletedT) => {\r\n if (uniqueArray.indexOf(deletedT) === -1) {\r\n deletedT.deletePending = true;\r\n uniqueArray.push(deletedT);\r\n }\r\n });\r\n\r\n if (uniqueArray.length % 2 !== 0) {\r\n continue;\r\n }\r\n\r\n v0.q = v1.q.add(v0.q);\r\n\r\n v0.updatePosition(p);\r\n\r\n const tStart = this._references.length;\r\n\r\n deletedTriangles = this._updateTriangles(v0, v0, deleted0, deletedTriangles);\r\n deletedTriangles = this._updateTriangles(v0, v1, deleted1, deletedTriangles);\r\n\r\n const tCount = this._references.length - tStart;\r\n\r\n if (tCount <= v0.triangleCount) {\r\n if (tCount) {\r\n for (let c = 0; c < tCount; c++) {\r\n this._references[v0.triangleStart + c] = this._references[tStart + c];\r\n }\r\n }\r\n } else {\r\n v0.triangleStart = tStart;\r\n }\r\n\r\n v0.triangleCount = tCount;\r\n break;\r\n }\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, trianglesIterator, callback, () => {\r\n return triangleCount - deletedTriangles <= targetCount;\r\n });\r\n }, 0);\r\n };\r\n\r\n AsyncLoop.Run(\r\n this.decimationIterations,\r\n (loop: AsyncLoop) => {\r\n if (triangleCount - deletedTriangles <= targetCount) {\r\n loop.breakLoop();\r\n } else {\r\n iterationFunction(loop.index, () => {\r\n loop.executeNext();\r\n });\r\n }\r\n },\r\n () => {\r\n setTimeout(() => {\r\n //reconstruct this part of the mesh\r\n this._reconstructMesh(submeshIndex);\r\n successCallback();\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _initWithMesh(submeshIndex: number, callback: Function, optimizeMesh?: boolean) {\r\n this._vertices = [];\r\n this._triangles = [];\r\n\r\n const positionData = this._mesh.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n const indices = this._mesh.getIndices();\r\n const submesh = this._mesh.subMeshes[submeshIndex];\r\n\r\n const findInVertices = (positionToSearch: Vector3) => {\r\n if (optimizeMesh) {\r\n for (let ii = 0; ii < this._vertices.length; ++ii) {\r\n if (this._vertices[ii].position.equalsWithEpsilon(positionToSearch, 0.0001)) {\r\n return this._vertices[ii];\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const vertexReferences: Array<number> = [];\r\n\r\n const vertexInit = (i: number) => {\r\n if (!positionData) {\r\n return;\r\n }\r\n\r\n const offset = i + submesh.verticesStart;\r\n const position = Vector3.FromArray(positionData, offset * 3);\r\n\r\n const vertex = findInVertices(position) || new DecimationVertex(position, this._vertices.length);\r\n vertex.originalOffsets.push(offset);\r\n if (vertex.id === this._vertices.length) {\r\n this._vertices.push(vertex);\r\n }\r\n vertexReferences.push(vertex.id);\r\n };\r\n //var totalVertices = mesh.getTotalVertices();\r\n const totalVertices = submesh.verticesCount;\r\n AsyncLoop.SyncAsyncForLoop(totalVertices, (this.syncIterations / 4) >> 0, vertexInit, () => {\r\n const indicesInit = (i: number) => {\r\n if (!indices) {\r\n return;\r\n }\r\n\r\n const offset = submesh.indexStart / 3 + i;\r\n const pos = offset * 3;\r\n const i0 = indices[pos + 0];\r\n const i1 = indices[pos + 1];\r\n const i2 = indices[pos + 2];\r\n const v0: DecimationVertex = this._vertices[vertexReferences[i0 - submesh.verticesStart]];\r\n const v1: DecimationVertex = this._vertices[vertexReferences[i1 - submesh.verticesStart]];\r\n const v2: DecimationVertex = this._vertices[vertexReferences[i2 - submesh.verticesStart]];\r\n const triangle = new DecimationTriangle([v0, v1, v2]);\r\n triangle.originalOffset = pos;\r\n this._triangles.push(triangle);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(submesh.indexCount / 3, this.syncIterations, indicesInit, () => {\r\n this._init(callback);\r\n });\r\n });\r\n }\r\n\r\n private _init(callback: Function) {\r\n const triangleInit1 = (i: number) => {\r\n const t = this._triangles[i];\r\n t.normal = Vector3.Cross(t._vertices[1].position.subtract(t._vertices[0].position), t._vertices[2].position.subtract(t._vertices[0].position)).normalize();\r\n for (let j = 0; j < 3; j++) {\r\n t._vertices[j].q.addArrayInPlace(QuadraticMatrix.DataFromNumbers(t.normal.x, t.normal.y, t.normal.z, -Vector3.Dot(t.normal, t._vertices[0].position)));\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit1, () => {\r\n const triangleInit2 = (i: number) => {\r\n const t = this._triangles[i];\r\n for (let j = 0; j < 3; ++j) {\r\n t.error[j] = this._calculateError(t._vertices[j], t._vertices[(j + 1) % 3]);\r\n }\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit2, () => {\r\n callback();\r\n });\r\n });\r\n }\r\n\r\n private _reconstructMesh(submeshIndex: number) {\r\n const newTriangles: Array<DecimationTriangle> = [];\r\n let i: number;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n t._vertices[j].triangleCount = 1;\r\n }\r\n newTriangles.push(t);\r\n }\r\n }\r\n\r\n const newPositionData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.PositionKind) || []);\r\n const newNormalData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.NormalKind) || []);\r\n const newUVsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.UVKind) || []);\r\n const newColorsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.ColorKind) || []);\r\n\r\n const normalData = this._mesh.getVerticesData(VertexBuffer.NormalKind);\r\n const uvs = this._mesh.getVerticesData(VertexBuffer.UVKind);\r\n const colorsData = this._mesh.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n let vertexCount = 0;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n const vertex = this._vertices[i];\r\n vertex.id = vertexCount;\r\n if (vertex.triangleCount) {\r\n vertex.originalOffsets.forEach((originalOffset) => {\r\n newPositionData.push(vertex.position.x);\r\n newPositionData.push(vertex.position.y);\r\n newPositionData.push(vertex.position.z);\r\n\r\n if (normalData && normalData.length) {\r\n newNormalData.push(normalData[originalOffset * 3]);\r\n newNormalData.push(normalData[originalOffset * 3 + 1]);\r\n newNormalData.push(normalData[originalOffset * 3 + 2]);\r\n }\r\n if (uvs && uvs.length) {\r\n newUVsData.push(uvs[originalOffset * 2]);\r\n newUVsData.push(uvs[originalOffset * 2 + 1]);\r\n }\r\n if (colorsData && colorsData.length) {\r\n newColorsData.push(colorsData[originalOffset * 4]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 1]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 2]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 3]);\r\n }\r\n ++vertexCount;\r\n });\r\n }\r\n }\r\n\r\n const startingIndex = this._reconstructedMesh.getTotalIndices();\r\n const startingVertex = this._reconstructedMesh.getTotalVertices();\r\n\r\n const submeshesArray = this._reconstructedMesh.subMeshes;\r\n this._reconstructedMesh.subMeshes = [];\r\n\r\n const newIndicesArray: number[] = <number[]>this._reconstructedMesh.getIndices(); //[];\r\n const originalIndices = <IndicesArray>this._mesh.getIndices();\r\n for (i = 0; i < newTriangles.length; ++i) {\r\n t = newTriangles[i]; //now get the new referencing point for each vertex\r\n [0, 1, 2].forEach((idx) => {\r\n const id = originalIndices[t.originalOffset + idx];\r\n let offset = t._vertices[idx].originalOffsets.indexOf(id);\r\n if (offset < 0) {\r\n offset = 0;\r\n }\r\n newIndicesArray.push(t._vertices[idx].id + offset + startingVertex);\r\n });\r\n }\r\n\r\n //overwriting the old vertex buffers and indices.\r\n\r\n this._reconstructedMesh.setIndices(newIndicesArray);\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.PositionKind, newPositionData);\r\n if (newNormalData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.NormalKind, newNormalData);\r\n }\r\n if (newUVsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.UVKind, newUVsData);\r\n }\r\n if (newColorsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.ColorKind, newColorsData);\r\n }\r\n\r\n //create submesh\r\n const originalSubmesh = this._mesh.subMeshes[submeshIndex];\r\n if (submeshIndex > 0) {\r\n this._reconstructedMesh.subMeshes = [];\r\n submeshesArray.forEach((submesh) => {\r\n SubMesh.AddToMesh(\r\n submesh.materialIndex,\r\n submesh.verticesStart,\r\n submesh.verticesCount,\r\n /* 0, newPositionData.length/3, */ submesh.indexStart,\r\n submesh.indexCount,\r\n submesh.getMesh()\r\n );\r\n });\r\n SubMesh.AddToMesh(\r\n originalSubmesh.materialIndex,\r\n startingVertex,\r\n vertexCount,\r\n /* 0, newPositionData.length / 3, */ startingIndex,\r\n newTriangles.length * 3,\r\n this._reconstructedMesh\r\n );\r\n }\r\n }\r\n\r\n private _initDecimatedMesh() {\r\n this._reconstructedMesh = new Mesh(this._mesh.name + \"Decimated\", this._mesh.getScene());\r\n this._reconstructedMesh.material = this._mesh.material;\r\n this._reconstructedMesh.parent = this._mesh.parent;\r\n this._reconstructedMesh.isVisible = false;\r\n this._reconstructedMesh.renderingGroupId = this._mesh.renderingGroupId;\r\n }\r\n\r\n private _isFlipped(vertex1: DecimationVertex, vertex2: DecimationVertex, point: Vector3, deletedArray: Array<boolean>, delTr: Array<DecimationTriangle>): boolean {\r\n for (let i = 0; i < vertex1.triangleCount; ++i) {\r\n const t = this._triangles[this._references[vertex1.triangleStart + i].triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n\r\n const s = this._references[vertex1.triangleStart + i].vertexId;\r\n\r\n const v1 = t._vertices[(s + 1) % 3];\r\n const v2 = t._vertices[(s + 2) % 3];\r\n\r\n if (v1 === vertex2 || v2 === vertex2) {\r\n deletedArray[i] = true;\r\n delTr.push(t);\r\n continue;\r\n }\r\n\r\n let d1 = v1.position.subtract(point);\r\n d1 = d1.normalize();\r\n let d2 = v2.position.subtract(point);\r\n d2 = d2.normalize();\r\n if (Math.abs(Vector3.Dot(d1, d2)) > 0.999) {\r\n return true;\r\n }\r\n const normal = Vector3.Cross(d1, d2).normalize();\r\n deletedArray[i] = false;\r\n if (Vector3.Dot(normal, t.normal) < 0.2) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _updateTriangles(origVertex: DecimationVertex, vertex: DecimationVertex, deletedArray: Array<boolean>, deletedTriangles: number): number {\r\n let newDeleted = deletedTriangles;\r\n for (let i = 0; i < vertex.triangleCount; ++i) {\r\n const ref = this._references[vertex.triangleStart + i];\r\n const t = this._triangles[ref.triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n if (deletedArray[i] && t.deletePending) {\r\n t.deleted = true;\r\n newDeleted++;\r\n continue;\r\n }\r\n t._vertices[ref.vertexId] = origVertex;\r\n t.isDirty = true;\r\n t.error[0] = this._calculateError(t._vertices[0], t._vertices[1]) + t.borderFactor / 2;\r\n t.error[1] = this._calculateError(t._vertices[1], t._vertices[2]) + t.borderFactor / 2;\r\n t.error[2] = this._calculateError(t._vertices[2], t._vertices[0]) + t.borderFactor / 2;\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n this._references.push(ref);\r\n }\r\n return newDeleted;\r\n }\r\n\r\n private _identifyBorder() {\r\n for (let i = 0; i < this._vertices.length; ++i) {\r\n const vCount: Array<number> = [];\r\n const vId: Array<number> = [];\r\n const v = this._vertices[i];\r\n let j: number;\r\n for (j = 0; j < v.triangleCount; ++j) {\r\n const triangle = this._triangles[this._references[v.triangleStart + j].triangleId];\r\n for (let ii = 0; ii < 3; ii++) {\r\n let ofs = 0;\r\n const vv = triangle._vertices[ii];\r\n while (ofs < vCount.length) {\r\n if (vId[ofs] === vv.id) {\r\n break;\r\n }\r\n ++ofs;\r\n }\r\n if (ofs === vCount.length) {\r\n vCount.push(1);\r\n vId.push(vv.id);\r\n } else {\r\n vCount[ofs]++;\r\n }\r\n }\r\n }\r\n\r\n for (j = 0; j < vCount.length; ++j) {\r\n if (vCount[j] === 1) {\r\n this._vertices[vId[j]].isBorder = true;\r\n } else {\r\n this._vertices[vId[j]].isBorder = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _updateMesh(identifyBorders: boolean = false) {\r\n let i: number;\r\n if (!identifyBorders) {\r\n const newTrianglesVector: Array<DecimationTriangle> = [];\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n newTrianglesVector.push(this._triangles[i]);\r\n }\r\n }\r\n this._triangles = newTrianglesVector;\r\n }\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n this._vertices[i].triangleStart = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n let v: DecimationVertex;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n v.triangleCount++;\r\n }\r\n }\r\n\r\n let tStart = 0;\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleStart = tStart;\r\n tStart += this._vertices[i].triangleCount;\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n\r\n const newReferences: Array<Reference> = new Array(this._triangles.length * 3);\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n newReferences[v.triangleStart + v.triangleCount] = new Reference(j, i);\r\n v.triangleCount++;\r\n }\r\n }\r\n this._references = newReferences;\r\n\r\n if (identifyBorders) {\r\n this._identifyBorder();\r\n }\r\n }\r\n\r\n private _vertexError(q: QuadraticMatrix, point: Vector3): number {\r\n const x = point.x;\r\n const y = point.y;\r\n const z = point.z;\r\n return (\r\n q.data[0] * x * x +\r\n 2 * q.data[1] * x * y +\r\n 2 * q.data[2] * x * z +\r\n 2 * q.data[3] * x +\r\n q.data[4] * y * y +\r\n 2 * q.data[5] * y * z +\r\n 2 * q.data[6] * y +\r\n q.data[7] * z * z +\r\n 2 * q.data[8] * z +\r\n q.data[9]\r\n );\r\n }\r\n\r\n private _calculateError(vertex1: DecimationVertex, vertex2: DecimationVertex, pointResult?: Vector3): number {\r\n const q = vertex1.q.add(vertex2.q);\r\n const border = vertex1.isBorder && vertex2.isBorder;\r\n let error: number = 0;\r\n const qDet = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7);\r\n\r\n if (qDet !== 0 && !border) {\r\n if (!pointResult) {\r\n pointResult = Vector3.Zero();\r\n }\r\n pointResult.x = (-1 / qDet) * q.det(1, 2, 3, 4, 5, 6, 5, 7, 8);\r\n pointResult.y = (1 / qDet) * q.det(0, 2, 3, 1, 5, 6, 2, 7, 8);\r\n pointResult.z = (-1 / qDet) * q.det(0, 1, 3, 1, 4, 6, 2, 5, 8);\r\n error = this._vertexError(q, pointResult);\r\n } else {\r\n const p3 = vertex1.position.add(vertex2.position).divide(new Vector3(2, 2, 2));\r\n //var norm3 = (vertex1.normal.add(vertex2.normal)).divide(new Vector3(2, 2, 2)).normalize();\r\n const error1 = this._vertexError(q, vertex1.position);\r\n const error2 = this._vertexError(q, vertex2.position);\r\n const error3 = this._vertexError(q, p3);\r\n error = Math.min(error1, error2, error3);\r\n if (error === error1) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex1.position);\r\n }\r\n } else if (error === error2) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex2.position);\r\n }\r\n } else {\r\n if (pointResult) {\r\n pointResult.copyFrom(p3);\r\n }\r\n }\r\n }\r\n return error;\r\n }\r\n}\r\n"]}
package/Meshes/subMesh.js CHANGED
@@ -189,7 +189,7 @@ export class SubMesh {
189
189
  * @returns current bounding info (or mesh's one if the submesh is global)
190
190
  */
191
191
  getBoundingInfo() {
192
- if (this.IsGlobal) {
192
+ if (this.IsGlobal || this._mesh.hasThinInstances) {
193
193
  return this._mesh.getBoundingInfo();
194
194
  }
195
195
  return this._boundingInfo;
@@ -1 +1 @@
1
- {"version":3,"file":"subMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/subMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, IndicesArray, DeepImmutable, FloatArray } from \"../types\";\r\nimport type { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { extractMinAndMaxIndexed } from \"../Maths/math.functions\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\n\r\nimport type { Collider } from \"../Collisions/collider\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { MaterialDefines } from \"../Materials/materialDefines\";\r\nimport type { MultiMaterial } from \"../Materials/multiMaterial\";\r\nimport type { AbstractMesh } from \"./abstractMesh\";\r\nimport type { Mesh } from \"./mesh\";\r\nimport type { Ray } from \"../Culling/ray\";\r\nimport type { TrianglePickingPredicate } from \"../Culling/ray\";\r\n\r\n/**\r\n * Defines a subdivision inside a mesh\r\n */\r\nexport class SubMesh implements ICullable {\r\n private _engine: Engine;\r\n /** @internal */\r\n public _drawWrappers: Array<DrawWrapper>; // index in this array = pass id\r\n private _mainDrawWrapperOverride: Nullable<DrawWrapper> = null;\r\n\r\n /**\r\n * Gets material defines used by the effect associated to the sub mesh\r\n */\r\n public get materialDefines(): Nullable<MaterialDefines> {\r\n return this._mainDrawWrapperOverride ? (this._mainDrawWrapperOverride.defines as MaterialDefines) : (this._getDrawWrapper()?.defines as Nullable<MaterialDefines>);\r\n }\r\n\r\n /**\r\n * Sets material defines used by the effect associated to the sub mesh\r\n */\r\n public set materialDefines(defines: Nullable<MaterialDefines>) {\r\n const drawWrapper = this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n drawWrapper.defines = defines;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getDrawWrapper(passId?: number, createIfNotExisting = false): DrawWrapper | undefined {\r\n passId = passId ?? this._engine.currentRenderPassId;\r\n let drawWrapper = this._drawWrappers[passId];\r\n if (!drawWrapper && createIfNotExisting) {\r\n this._drawWrappers[passId] = drawWrapper = new DrawWrapper(this._mesh.getScene().getEngine());\r\n }\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _removeDrawWrapper(passId: number, disposeWrapper = true) {\r\n if (disposeWrapper) {\r\n this._drawWrappers[passId]?.dispose();\r\n }\r\n this._drawWrappers[passId] = undefined as any;\r\n }\r\n\r\n /**\r\n * Gets associated (main) effect (possibly the effect override if defined)\r\n */\r\n public get effect(): Nullable<Effect> {\r\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : this._getDrawWrapper()?.effect ?? null;\r\n }\r\n\r\n /** @internal */\r\n public get _drawWrapper(): DrawWrapper {\r\n return this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n }\r\n\r\n /** @internal */\r\n public get _drawWrapperOverride(): Nullable<DrawWrapper> {\r\n return this._mainDrawWrapperOverride;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setMainDrawWrapperOverride(wrapper: Nullable<DrawWrapper>): void {\r\n this._mainDrawWrapperOverride = wrapper;\r\n }\r\n\r\n /**\r\n * Sets associated effect (effect used to render this submesh)\r\n * @param effect defines the effect to associate with\r\n * @param defines defines the set of defines used to compile this effect\r\n * @param materialContext material context associated to the effect\r\n * @param resetContext true to reset the draw context\r\n */\r\n public setEffect(effect: Nullable<Effect>, defines: Nullable<string | MaterialDefines> = null, materialContext?: IMaterialContext, resetContext = true) {\r\n const drawWrapper = this._drawWrapper;\r\n drawWrapper.setEffect(effect, defines, resetContext);\r\n if (materialContext !== undefined) {\r\n drawWrapper.materialContext = materialContext;\r\n }\r\n if (!effect) {\r\n drawWrapper.defines = null;\r\n drawWrapper.materialContext = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n */\r\n public resetDrawCache(passId?: number): void {\r\n if (this._drawWrappers) {\r\n if (passId !== undefined) {\r\n this._removeDrawWrapper(passId);\r\n return;\r\n } else {\r\n for (const drawWrapper of this._drawWrappers) {\r\n drawWrapper?.dispose();\r\n }\r\n }\r\n }\r\n this._drawWrappers = [];\r\n }\r\n\r\n /** @internal */\r\n public _linesIndexCount: number = 0;\r\n private _mesh: AbstractMesh;\r\n private _renderingMesh: Mesh;\r\n private _boundingInfo: BoundingInfo;\r\n private _linesIndexBuffer: Nullable<DataBuffer> = null;\r\n /** @internal */\r\n public _lastColliderWorldVertices: Nullable<Vector3[]> = null;\r\n /** @internal */\r\n public _trianglePlanes: Plane[];\r\n /** @internal */\r\n public _lastColliderTransformMatrix: Nullable<Matrix> = null;\r\n /** @internal */\r\n public _wasDispatched = false;\r\n\r\n /** @internal */\r\n public _renderId = 0;\r\n /** @internal */\r\n public _alphaIndex: number = 0;\r\n /** @internal */\r\n public _distanceToCamera: number = 0;\r\n /** @internal */\r\n public _id: number;\r\n\r\n private _currentMaterial: Nullable<Material> = null;\r\n\r\n /**\r\n * Add a new submesh to a mesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns the new submesh\r\n */\r\n public static AddToMesh(\r\n materialIndex: number,\r\n verticesStart: number,\r\n verticesCount: number,\r\n indexStart: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n return new SubMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n\r\n /**\r\n * Creates a new submesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)\r\n */\r\n constructor(\r\n /** the material index to use */\r\n public materialIndex: number,\r\n /** vertex index start */\r\n public verticesStart: number,\r\n /** vertices count */\r\n public verticesCount: number,\r\n /** index start */\r\n public indexStart: number,\r\n /** indices count */\r\n public indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true,\r\n addToMesh = true\r\n ) {\r\n this._mesh = mesh;\r\n this._renderingMesh = renderingMesh || <Mesh>mesh;\r\n if (addToMesh) {\r\n mesh.subMeshes.push(this);\r\n }\r\n\r\n this._engine = this._mesh.getScene().getEngine();\r\n this.resetDrawCache();\r\n this._trianglePlanes = [];\r\n\r\n this._id = mesh.subMeshes.length - 1;\r\n\r\n if (createBoundingBox) {\r\n this.refreshBoundingInfo();\r\n mesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if this submesh covers the entire parent mesh\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get IsGlobal(): boolean {\r\n return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices() && this.indexStart === 0 && this.indexCount === this._mesh.getTotalIndices();\r\n }\r\n\r\n /**\r\n * Returns the submesh BoundingInfo object\r\n * @returns current bounding info (or mesh's one if the submesh is global)\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this.IsGlobal) {\r\n return this._mesh.getBoundingInfo();\r\n }\r\n\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Sets the submesh BoundingInfo\r\n * @param boundingInfo defines the new bounding info to use\r\n * @returns the SubMesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): SubMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh of the current submesh\r\n * @returns the parent mesh\r\n */\r\n public getMesh(): AbstractMesh {\r\n return this._mesh;\r\n }\r\n\r\n /**\r\n * Returns the rendering mesh of the submesh\r\n * @returns the rendering mesh (could be different from parent mesh)\r\n */\r\n public getRenderingMesh(): Mesh {\r\n return this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the replacement mesh of the submesh\r\n * @returns the replacement mesh (could be different from parent mesh)\r\n */\r\n public getReplacementMesh(): Nullable<AbstractMesh> {\r\n return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n }\r\n\r\n /**\r\n * Returns the effective mesh of the submesh\r\n * @returns the effective mesh (could be different from parent mesh)\r\n */\r\n public getEffectiveMesh(): AbstractMesh {\r\n const replacementMesh = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n\r\n return replacementMesh ? replacementMesh : this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the submesh material\r\n * @param getDefaultMaterial Defines whether or not to get the default material if nothing has been defined.\r\n * @returns null or the current material\r\n */\r\n public getMaterial(getDefaultMaterial = true): Nullable<Material> {\r\n const rootMaterial = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material;\r\n\r\n if (!rootMaterial) {\r\n return getDefaultMaterial ? this._mesh.getScene().defaultMaterial : null;\r\n } else if (this._isMultiMaterial(rootMaterial)) {\r\n const effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex);\r\n\r\n if (this._currentMaterial !== effectiveMaterial) {\r\n this._currentMaterial = effectiveMaterial;\r\n this.resetDrawCache();\r\n }\r\n\r\n return effectiveMaterial;\r\n }\r\n\r\n return rootMaterial;\r\n }\r\n\r\n private _isMultiMaterial(material: Material): material is MultiMaterial {\r\n return (material as MultiMaterial).getSubMaterial !== undefined;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Sets a new updated BoundingInfo object to the submesh\r\n * @param data defines an optional position array to use to determine the bounding info\r\n * @returns the SubMesh\r\n */\r\n public refreshBoundingInfo(data: Nullable<FloatArray> = null): SubMesh {\r\n this._lastColliderWorldVertices = null;\r\n\r\n if (this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) {\r\n return this;\r\n }\r\n\r\n if (!data) {\r\n data = this._renderingMesh.getVerticesData(VertexBuffer.PositionKind);\r\n }\r\n\r\n if (!data) {\r\n this._boundingInfo = this._mesh.getBoundingInfo();\r\n return this;\r\n }\r\n\r\n const indices = <IndicesArray>this._renderingMesh.getIndices();\r\n let extend: { minimum: Vector3; maximum: Vector3 };\r\n\r\n //is this the only submesh?\r\n if (this.indexStart === 0 && this.indexCount === indices.length) {\r\n const boundingInfo = this._renderingMesh.getBoundingInfo();\r\n\r\n //the rendering mesh's bounding info can be used, it is the standard submesh for all indices.\r\n extend = { minimum: boundingInfo.minimum.clone(), maximum: boundingInfo.maximum.clone() };\r\n } else {\r\n extend = extractMinAndMaxIndexed(data, indices, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);\r\n }\r\n\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _checkCollision(collider: Collider): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n return boundingInfo._checkCollision(collider);\r\n }\r\n\r\n /**\r\n * Updates the submesh BoundingInfo\r\n * @param world defines the world matrix to use to update the bounding info\r\n * @returns the submesh\r\n */\r\n public updateBoundingInfo(world: DeepImmutable<Matrix>): SubMesh {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n this.refreshBoundingInfo();\r\n boundingInfo = this.getBoundingInfo();\r\n }\r\n if (boundingInfo) {\r\n (<BoundingInfo>boundingInfo).update(world);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box intersects the frustum defined by the passed array of planes.\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is intersecting with the frustum\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isInFrustum(frustumPlanes, this._mesh.cullingStrategy);\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is inside the frustum\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * Renders the submesh\r\n * @param enableAlphaMode defines if alpha needs to be used\r\n * @returns the submesh\r\n */\r\n public render(enableAlphaMode: boolean): SubMesh {\r\n this._renderingMesh.render(this, enableAlphaMode, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : undefined);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getLinesIndexBuffer(indices: IndicesArray, engine: Engine): DataBuffer {\r\n if (!this._linesIndexBuffer) {\r\n const linesIndices = [];\r\n\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 3) {\r\n linesIndices.push(indices[index], indices[index + 1], indices[index + 1], indices[index + 2], indices[index + 2], indices[index]);\r\n }\r\n\r\n this._linesIndexBuffer = engine.createIndexBuffer(linesIndices);\r\n this._linesIndexCount = linesIndices.length;\r\n }\r\n return this._linesIndexBuffer;\r\n }\r\n\r\n /**\r\n * Checks if the submesh intersects with a ray\r\n * @param ray defines the ray to test\r\n * @returns true is the passed ray intersects the submesh bounding box\r\n */\r\n public canIntersects(ray: Ray): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return ray.intersectsBox(boundingInfo.boundingBox);\r\n }\r\n\r\n /**\r\n * Intersects current submesh with a ray\r\n * @param ray defines the ray to test\r\n * @param positions defines mesh's positions array\r\n * @param indices defines mesh's indices array\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns intersection info or null if no intersection\r\n */\r\n public intersects(ray: Ray, positions: Vector3[], indices: IndicesArray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<IntersectionInfo> {\r\n const material = this.getMaterial();\r\n if (!material) {\r\n return null;\r\n }\r\n let step = 3;\r\n let checkStopper = false;\r\n\r\n switch (material.fillMode) {\r\n case Constants.MATERIAL_PointListDrawMode:\r\n case Constants.MATERIAL_LineLoopDrawMode:\r\n case Constants.MATERIAL_LineStripDrawMode:\r\n case Constants.MATERIAL_TriangleFanDrawMode:\r\n return null;\r\n case Constants.MATERIAL_TriangleStripDrawMode:\r\n step = 1;\r\n checkStopper = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // LineMesh first as it's also a Mesh...\r\n if (material.fillMode === Constants.MATERIAL_LineListDrawMode) {\r\n // Check if mesh is unindexed\r\n if (!indices.length) {\r\n return this._intersectUnIndexedLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n }\r\n return this._intersectLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n } else {\r\n // Check if mesh is unindexed\r\n if (!indices.length && this._mesh._unIndexed) {\r\n return this._intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate);\r\n }\r\n\r\n return this._intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 2) {\r\n const p0 = positions[indices[index]];\r\n const p1 = positions[indices[index + 1]];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectUnIndexedLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 2) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n step: number,\r\n checkStopper: boolean,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Triangles test\r\n let faceId = -1;\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount - (3 - step); index += step) {\r\n faceId++;\r\n const indexA = indices[index];\r\n const indexB = indices[index + 1];\r\n const indexC = indices[index + 2];\r\n\r\n if (checkStopper && indexC === 0xffffffff) {\r\n index += 2;\r\n continue;\r\n }\r\n\r\n const p0 = positions[indexA];\r\n const p1 = positions[indexB];\r\n const p2 = positions[indexC];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p0 || !p1 || !p2) {\r\n continue;\r\n }\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, indexA, indexB, indexC)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = faceId;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectUnIndexedTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n // Triangles test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 3) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n const p2 = positions[index + 2];\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, -1, -1, -1)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = index / 3;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this._linesIndexBuffer) {\r\n this._linesIndexBuffer = null;\r\n }\r\n }\r\n\r\n // Clone\r\n /**\r\n * Creates a new submesh from the passed mesh\r\n * @param newMesh defines the new hosting mesh\r\n * @param newRenderingMesh defines an optional rendering mesh\r\n * @returns the new submesh\r\n */\r\n public clone(newMesh: AbstractMesh, newRenderingMesh?: Mesh): SubMesh {\r\n const result = new SubMesh(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, newMesh, newRenderingMesh, false);\r\n\r\n if (!this.IsGlobal) {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return result;\r\n }\r\n\r\n result._boundingInfo = new BoundingInfo(boundingInfo.minimum, boundingInfo.maximum);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Dispose\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._linesIndexBuffer) {\r\n this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer);\r\n this._linesIndexBuffer = null;\r\n }\r\n\r\n // Remove from mesh\r\n const index = this._mesh.subMeshes.indexOf(this);\r\n this._mesh.subMeshes.splice(index, 1);\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"SubMesh\".\r\n */\r\n public getClassName(): string {\r\n return \"SubMesh\";\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new submesh from indices data\r\n * @param materialIndex the index of the main mesh material\r\n * @param startIndex the index where to start the copy in the mesh indices array\r\n * @param indexCount the number of indices to copy then from the startIndex\r\n * @param mesh the main mesh to create the submesh from\r\n * @param renderingMesh the optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns a new submesh\r\n */\r\n public static CreateFromIndices(\r\n materialIndex: number,\r\n startIndex: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n let minVertexIndex = Number.MAX_VALUE;\r\n let maxVertexIndex = -Number.MAX_VALUE;\r\n\r\n const whatWillRender = renderingMesh || mesh;\r\n const indices = whatWillRender!.getIndices()!;\r\n\r\n for (let index = startIndex; index < startIndex + indexCount; index++) {\r\n const vertexIndex = indices[index];\r\n\r\n if (vertexIndex < minVertexIndex) {\r\n minVertexIndex = vertexIndex;\r\n }\r\n if (vertexIndex > maxVertexIndex) {\r\n maxVertexIndex = vertexIndex;\r\n }\r\n }\r\n\r\n return new SubMesh(materialIndex, minVertexIndex, maxVertexIndex - minVertexIndex + 1, startIndex, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"subMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/subMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, IndicesArray, DeepImmutable, FloatArray } from \"../types\";\r\nimport type { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { extractMinAndMaxIndexed } from \"../Maths/math.functions\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\n\r\nimport type { Collider } from \"../Collisions/collider\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { MaterialDefines } from \"../Materials/materialDefines\";\r\nimport type { MultiMaterial } from \"../Materials/multiMaterial\";\r\nimport type { AbstractMesh } from \"./abstractMesh\";\r\nimport type { Mesh } from \"./mesh\";\r\nimport type { Ray } from \"../Culling/ray\";\r\nimport type { TrianglePickingPredicate } from \"../Culling/ray\";\r\n\r\n/**\r\n * Defines a subdivision inside a mesh\r\n */\r\nexport class SubMesh implements ICullable {\r\n private _engine: Engine;\r\n /** @internal */\r\n public _drawWrappers: Array<DrawWrapper>; // index in this array = pass id\r\n private _mainDrawWrapperOverride: Nullable<DrawWrapper> = null;\r\n\r\n /**\r\n * Gets material defines used by the effect associated to the sub mesh\r\n */\r\n public get materialDefines(): Nullable<MaterialDefines> {\r\n return this._mainDrawWrapperOverride ? (this._mainDrawWrapperOverride.defines as MaterialDefines) : (this._getDrawWrapper()?.defines as Nullable<MaterialDefines>);\r\n }\r\n\r\n /**\r\n * Sets material defines used by the effect associated to the sub mesh\r\n */\r\n public set materialDefines(defines: Nullable<MaterialDefines>) {\r\n const drawWrapper = this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n drawWrapper.defines = defines;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getDrawWrapper(passId?: number, createIfNotExisting = false): DrawWrapper | undefined {\r\n passId = passId ?? this._engine.currentRenderPassId;\r\n let drawWrapper = this._drawWrappers[passId];\r\n if (!drawWrapper && createIfNotExisting) {\r\n this._drawWrappers[passId] = drawWrapper = new DrawWrapper(this._mesh.getScene().getEngine());\r\n }\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _removeDrawWrapper(passId: number, disposeWrapper = true) {\r\n if (disposeWrapper) {\r\n this._drawWrappers[passId]?.dispose();\r\n }\r\n this._drawWrappers[passId] = undefined as any;\r\n }\r\n\r\n /**\r\n * Gets associated (main) effect (possibly the effect override if defined)\r\n */\r\n public get effect(): Nullable<Effect> {\r\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : this._getDrawWrapper()?.effect ?? null;\r\n }\r\n\r\n /** @internal */\r\n public get _drawWrapper(): DrawWrapper {\r\n return this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n }\r\n\r\n /** @internal */\r\n public get _drawWrapperOverride(): Nullable<DrawWrapper> {\r\n return this._mainDrawWrapperOverride;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setMainDrawWrapperOverride(wrapper: Nullable<DrawWrapper>): void {\r\n this._mainDrawWrapperOverride = wrapper;\r\n }\r\n\r\n /**\r\n * Sets associated effect (effect used to render this submesh)\r\n * @param effect defines the effect to associate with\r\n * @param defines defines the set of defines used to compile this effect\r\n * @param materialContext material context associated to the effect\r\n * @param resetContext true to reset the draw context\r\n */\r\n public setEffect(effect: Nullable<Effect>, defines: Nullable<string | MaterialDefines> = null, materialContext?: IMaterialContext, resetContext = true) {\r\n const drawWrapper = this._drawWrapper;\r\n drawWrapper.setEffect(effect, defines, resetContext);\r\n if (materialContext !== undefined) {\r\n drawWrapper.materialContext = materialContext;\r\n }\r\n if (!effect) {\r\n drawWrapper.defines = null;\r\n drawWrapper.materialContext = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n */\r\n public resetDrawCache(passId?: number): void {\r\n if (this._drawWrappers) {\r\n if (passId !== undefined) {\r\n this._removeDrawWrapper(passId);\r\n return;\r\n } else {\r\n for (const drawWrapper of this._drawWrappers) {\r\n drawWrapper?.dispose();\r\n }\r\n }\r\n }\r\n this._drawWrappers = [];\r\n }\r\n\r\n /** @internal */\r\n public _linesIndexCount: number = 0;\r\n private _mesh: AbstractMesh;\r\n private _renderingMesh: Mesh;\r\n private _boundingInfo: BoundingInfo;\r\n private _linesIndexBuffer: Nullable<DataBuffer> = null;\r\n /** @internal */\r\n public _lastColliderWorldVertices: Nullable<Vector3[]> = null;\r\n /** @internal */\r\n public _trianglePlanes: Plane[];\r\n /** @internal */\r\n public _lastColliderTransformMatrix: Nullable<Matrix> = null;\r\n /** @internal */\r\n public _wasDispatched = false;\r\n\r\n /** @internal */\r\n public _renderId = 0;\r\n /** @internal */\r\n public _alphaIndex: number = 0;\r\n /** @internal */\r\n public _distanceToCamera: number = 0;\r\n /** @internal */\r\n public _id: number;\r\n\r\n private _currentMaterial: Nullable<Material> = null;\r\n\r\n /**\r\n * Add a new submesh to a mesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns the new submesh\r\n */\r\n public static AddToMesh(\r\n materialIndex: number,\r\n verticesStart: number,\r\n verticesCount: number,\r\n indexStart: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n return new SubMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n\r\n /**\r\n * Creates a new submesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)\r\n */\r\n constructor(\r\n /** the material index to use */\r\n public materialIndex: number,\r\n /** vertex index start */\r\n public verticesStart: number,\r\n /** vertices count */\r\n public verticesCount: number,\r\n /** index start */\r\n public indexStart: number,\r\n /** indices count */\r\n public indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true,\r\n addToMesh = true\r\n ) {\r\n this._mesh = mesh;\r\n this._renderingMesh = renderingMesh || <Mesh>mesh;\r\n if (addToMesh) {\r\n mesh.subMeshes.push(this);\r\n }\r\n\r\n this._engine = this._mesh.getScene().getEngine();\r\n this.resetDrawCache();\r\n this._trianglePlanes = [];\r\n\r\n this._id = mesh.subMeshes.length - 1;\r\n\r\n if (createBoundingBox) {\r\n this.refreshBoundingInfo();\r\n mesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if this submesh covers the entire parent mesh\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get IsGlobal(): boolean {\r\n return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices() && this.indexStart === 0 && this.indexCount === this._mesh.getTotalIndices();\r\n }\r\n\r\n /**\r\n * Returns the submesh BoundingInfo object\r\n * @returns current bounding info (or mesh's one if the submesh is global)\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this.IsGlobal || this._mesh.hasThinInstances) {\r\n return this._mesh.getBoundingInfo();\r\n }\r\n\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Sets the submesh BoundingInfo\r\n * @param boundingInfo defines the new bounding info to use\r\n * @returns the SubMesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): SubMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh of the current submesh\r\n * @returns the parent mesh\r\n */\r\n public getMesh(): AbstractMesh {\r\n return this._mesh;\r\n }\r\n\r\n /**\r\n * Returns the rendering mesh of the submesh\r\n * @returns the rendering mesh (could be different from parent mesh)\r\n */\r\n public getRenderingMesh(): Mesh {\r\n return this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the replacement mesh of the submesh\r\n * @returns the replacement mesh (could be different from parent mesh)\r\n */\r\n public getReplacementMesh(): Nullable<AbstractMesh> {\r\n return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n }\r\n\r\n /**\r\n * Returns the effective mesh of the submesh\r\n * @returns the effective mesh (could be different from parent mesh)\r\n */\r\n public getEffectiveMesh(): AbstractMesh {\r\n const replacementMesh = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n\r\n return replacementMesh ? replacementMesh : this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the submesh material\r\n * @param getDefaultMaterial Defines whether or not to get the default material if nothing has been defined.\r\n * @returns null or the current material\r\n */\r\n public getMaterial(getDefaultMaterial = true): Nullable<Material> {\r\n const rootMaterial = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material;\r\n\r\n if (!rootMaterial) {\r\n return getDefaultMaterial ? this._mesh.getScene().defaultMaterial : null;\r\n } else if (this._isMultiMaterial(rootMaterial)) {\r\n const effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex);\r\n\r\n if (this._currentMaterial !== effectiveMaterial) {\r\n this._currentMaterial = effectiveMaterial;\r\n this.resetDrawCache();\r\n }\r\n\r\n return effectiveMaterial;\r\n }\r\n\r\n return rootMaterial;\r\n }\r\n\r\n private _isMultiMaterial(material: Material): material is MultiMaterial {\r\n return (material as MultiMaterial).getSubMaterial !== undefined;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Sets a new updated BoundingInfo object to the submesh\r\n * @param data defines an optional position array to use to determine the bounding info\r\n * @returns the SubMesh\r\n */\r\n public refreshBoundingInfo(data: Nullable<FloatArray> = null): SubMesh {\r\n this._lastColliderWorldVertices = null;\r\n\r\n if (this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) {\r\n return this;\r\n }\r\n\r\n if (!data) {\r\n data = this._renderingMesh.getVerticesData(VertexBuffer.PositionKind);\r\n }\r\n\r\n if (!data) {\r\n this._boundingInfo = this._mesh.getBoundingInfo();\r\n return this;\r\n }\r\n\r\n const indices = <IndicesArray>this._renderingMesh.getIndices();\r\n let extend: { minimum: Vector3; maximum: Vector3 };\r\n\r\n //is this the only submesh?\r\n if (this.indexStart === 0 && this.indexCount === indices.length) {\r\n const boundingInfo = this._renderingMesh.getBoundingInfo();\r\n\r\n //the rendering mesh's bounding info can be used, it is the standard submesh for all indices.\r\n extend = { minimum: boundingInfo.minimum.clone(), maximum: boundingInfo.maximum.clone() };\r\n } else {\r\n extend = extractMinAndMaxIndexed(data, indices, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);\r\n }\r\n\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _checkCollision(collider: Collider): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n return boundingInfo._checkCollision(collider);\r\n }\r\n\r\n /**\r\n * Updates the submesh BoundingInfo\r\n * @param world defines the world matrix to use to update the bounding info\r\n * @returns the submesh\r\n */\r\n public updateBoundingInfo(world: DeepImmutable<Matrix>): SubMesh {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n this.refreshBoundingInfo();\r\n boundingInfo = this.getBoundingInfo();\r\n }\r\n if (boundingInfo) {\r\n (<BoundingInfo>boundingInfo).update(world);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box intersects the frustum defined by the passed array of planes.\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is intersecting with the frustum\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isInFrustum(frustumPlanes, this._mesh.cullingStrategy);\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is inside the frustum\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * Renders the submesh\r\n * @param enableAlphaMode defines if alpha needs to be used\r\n * @returns the submesh\r\n */\r\n public render(enableAlphaMode: boolean): SubMesh {\r\n this._renderingMesh.render(this, enableAlphaMode, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : undefined);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getLinesIndexBuffer(indices: IndicesArray, engine: Engine): DataBuffer {\r\n if (!this._linesIndexBuffer) {\r\n const linesIndices = [];\r\n\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 3) {\r\n linesIndices.push(indices[index], indices[index + 1], indices[index + 1], indices[index + 2], indices[index + 2], indices[index]);\r\n }\r\n\r\n this._linesIndexBuffer = engine.createIndexBuffer(linesIndices);\r\n this._linesIndexCount = linesIndices.length;\r\n }\r\n return this._linesIndexBuffer;\r\n }\r\n\r\n /**\r\n * Checks if the submesh intersects with a ray\r\n * @param ray defines the ray to test\r\n * @returns true is the passed ray intersects the submesh bounding box\r\n */\r\n public canIntersects(ray: Ray): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return ray.intersectsBox(boundingInfo.boundingBox);\r\n }\r\n\r\n /**\r\n * Intersects current submesh with a ray\r\n * @param ray defines the ray to test\r\n * @param positions defines mesh's positions array\r\n * @param indices defines mesh's indices array\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns intersection info or null if no intersection\r\n */\r\n public intersects(ray: Ray, positions: Vector3[], indices: IndicesArray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<IntersectionInfo> {\r\n const material = this.getMaterial();\r\n if (!material) {\r\n return null;\r\n }\r\n let step = 3;\r\n let checkStopper = false;\r\n\r\n switch (material.fillMode) {\r\n case Constants.MATERIAL_PointListDrawMode:\r\n case Constants.MATERIAL_LineLoopDrawMode:\r\n case Constants.MATERIAL_LineStripDrawMode:\r\n case Constants.MATERIAL_TriangleFanDrawMode:\r\n return null;\r\n case Constants.MATERIAL_TriangleStripDrawMode:\r\n step = 1;\r\n checkStopper = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // LineMesh first as it's also a Mesh...\r\n if (material.fillMode === Constants.MATERIAL_LineListDrawMode) {\r\n // Check if mesh is unindexed\r\n if (!indices.length) {\r\n return this._intersectUnIndexedLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n }\r\n return this._intersectLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n } else {\r\n // Check if mesh is unindexed\r\n if (!indices.length && this._mesh._unIndexed) {\r\n return this._intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate);\r\n }\r\n\r\n return this._intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 2) {\r\n const p0 = positions[indices[index]];\r\n const p1 = positions[indices[index + 1]];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectUnIndexedLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Line test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 2) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n step: number,\r\n checkStopper: boolean,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n // Triangles test\r\n let faceId = -1;\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount - (3 - step); index += step) {\r\n faceId++;\r\n const indexA = indices[index];\r\n const indexB = indices[index + 1];\r\n const indexC = indices[index + 2];\r\n\r\n if (checkStopper && indexC === 0xffffffff) {\r\n index += 2;\r\n continue;\r\n }\r\n\r\n const p0 = positions[indexA];\r\n const p1 = positions[indexB];\r\n const p2 = positions[indexC];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p0 || !p1 || !p2) {\r\n continue;\r\n }\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, indexA, indexB, indexC)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = faceId;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectUnIndexedTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable<IntersectionInfo> {\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n // Triangles test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 3) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n const p2 = positions[index + 2];\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, -1, -1, -1)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = index / 3;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this._linesIndexBuffer) {\r\n this._linesIndexBuffer = null;\r\n }\r\n }\r\n\r\n // Clone\r\n /**\r\n * Creates a new submesh from the passed mesh\r\n * @param newMesh defines the new hosting mesh\r\n * @param newRenderingMesh defines an optional rendering mesh\r\n * @returns the new submesh\r\n */\r\n public clone(newMesh: AbstractMesh, newRenderingMesh?: Mesh): SubMesh {\r\n const result = new SubMesh(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, newMesh, newRenderingMesh, false);\r\n\r\n if (!this.IsGlobal) {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return result;\r\n }\r\n\r\n result._boundingInfo = new BoundingInfo(boundingInfo.minimum, boundingInfo.maximum);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Dispose\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._linesIndexBuffer) {\r\n this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer);\r\n this._linesIndexBuffer = null;\r\n }\r\n\r\n // Remove from mesh\r\n const index = this._mesh.subMeshes.indexOf(this);\r\n this._mesh.subMeshes.splice(index, 1);\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"SubMesh\".\r\n */\r\n public getClassName(): string {\r\n return \"SubMesh\";\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new submesh from indices data\r\n * @param materialIndex the index of the main mesh material\r\n * @param startIndex the index where to start the copy in the mesh indices array\r\n * @param indexCount the number of indices to copy then from the startIndex\r\n * @param mesh the main mesh to create the submesh from\r\n * @param renderingMesh the optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns a new submesh\r\n */\r\n public static CreateFromIndices(\r\n materialIndex: number,\r\n startIndex: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n let minVertexIndex = Number.MAX_VALUE;\r\n let maxVertexIndex = -Number.MAX_VALUE;\r\n\r\n const whatWillRender = renderingMesh || mesh;\r\n const indices = whatWillRender!.getIndices()!;\r\n\r\n for (let index = startIndex; index < startIndex + indexCount; index++) {\r\n const vertexIndex = indices[index];\r\n\r\n if (vertexIndex < minVertexIndex) {\r\n minVertexIndex = vertexIndex;\r\n }\r\n if (vertexIndex > maxVertexIndex) {\r\n maxVertexIndex = vertexIndex;\r\n }\r\n }\r\n\r\n return new SubMesh(materialIndex, minVertexIndex, maxVertexIndex - minVertexIndex + 1, startIndex, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n}\r\n"]}
@@ -285,6 +285,14 @@ export interface IPhysicsEnginePluginV2 {
285
285
  * Collision observable
286
286
  */
287
287
  onCollisionObservable: Observable<IPhysicsCollisionEvent>;
288
+ /**
289
+ * Collision ended observable
290
+ */
291
+ onCollisionEndedObservable: Observable<IBasePhysicsCollisionEvent>;
292
+ /**
293
+ * Trigger observable
294
+ */
295
+ onTriggerCollisionObservable: Observable<IBasePhysicsCollisionEvent>;
288
296
  setGravity(gravity: Vector3): void;
289
297
  setTimeStep(timeStep: number): void;
290
298
  getTimeStep(): number;