@babylonjs/core 6.26.0 → 6.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  2. package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
  3. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  4. package/Collisions/intersectionInfo.js.map +1 -1
  5. package/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.js.map +1 -1
  6. package/Engines/Processors/Expressions/Operators/shaderDefineIsDefinedOperator.js.map +1 -1
  7. package/Engines/WebGPU/webgpuBundleList.js.map +1 -1
  8. package/Engines/thinEngine.js +2 -2
  9. package/Engines/thinEngine.js.map +1 -1
  10. package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.d.ts +3 -4
  11. package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.js +5 -6
  12. package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.js.map +1 -1
  13. package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.d.ts +22 -0
  14. package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js +26 -0
  15. package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js.map +1 -0
  16. package/FlowGraph/Blocks/Data/flowGraphConstantOperationBlock.d.ts +3 -5
  17. package/FlowGraph/Blocks/Data/flowGraphConstantOperationBlock.js +5 -6
  18. package/FlowGraph/Blocks/Data/flowGraphConstantOperationBlock.js.map +1 -1
  19. package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.d.ts +3 -4
  20. package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.js +5 -6
  21. package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.js.map +1 -1
  22. package/FlowGraph/flowGraphConnection.d.ts +1 -1
  23. package/FlowGraph/flowGraphConnection.js +2 -1
  24. package/FlowGraph/flowGraphConnection.js.map +1 -1
  25. package/FlowGraph/flowGraphContext.d.ts +10 -0
  26. package/FlowGraph/flowGraphContext.js +14 -0
  27. package/FlowGraph/flowGraphContext.js.map +1 -1
  28. package/FlowGraph/flowGraphDataConnection.js.map +1 -1
  29. package/FlowGraph/flowGraphRichTypes.js.map +1 -1
  30. package/FlowGraph/flowGraphSignalConnection.js +1 -0
  31. package/FlowGraph/flowGraphSignalConnection.js.map +1 -1
  32. package/Layers/highlightLayer.js.map +1 -1
  33. package/Loading/loadingScreen.js.map +1 -1
  34. package/Materials/Background/backgroundMaterial.d.ts +16 -0
  35. package/Materials/Background/backgroundMaterial.js +44 -0
  36. package/Materials/Background/backgroundMaterial.js.map +1 -1
  37. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +0 -1
  38. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  39. package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
  40. package/Materials/Node/nodeMaterial.js +6 -2
  41. package/Materials/Node/nodeMaterial.js.map +1 -1
  42. package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
  43. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  44. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  45. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.d.ts +10 -1
  46. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +27 -5
  47. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
  48. package/Meshes/Node/Blocks/mergeGeometryBlock.js +16 -4
  49. package/Meshes/Node/Blocks/mergeGeometryBlock.js.map +1 -1
  50. package/Meshes/Node/Interfaces/nodeGeometryExecutionContext.d.ts +5 -0
  51. package/Meshes/Node/Interfaces/nodeGeometryExecutionContext.js.map +1 -1
  52. package/Meshes/Node/nodeGeometryBuildState.js +3 -0
  53. package/Meshes/Node/nodeGeometryBuildState.js.map +1 -1
  54. package/Meshes/csg.js.map +1 -1
  55. package/Meshes/geodesicMesh.js.map +1 -1
  56. package/Meshes/meshSimplification.js.map +1 -1
  57. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  58. package/Misc/fileTools.js.map +1 -1
  59. package/Physics/physicsHelper.js.map +1 -1
  60. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  61. package/Physics/v1/Plugins/cannonJSPlugin.js.map +1 -1
  62. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  63. package/Physics/v1/physicsEngine.js.map +1 -1
  64. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  65. package/Physics/v2/physicsEngine.js.map +1 -1
  66. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  67. package/PostProcesses/bloomEffect.js.map +1 -1
  68. package/Rendering/boundingBoxRenderer.js +6 -2
  69. package/Rendering/boundingBoxRenderer.js.map +1 -1
  70. package/Shaders/ShadersInclude/backgroundFragmentDeclaration.js +3 -0
  71. package/Shaders/ShadersInclude/backgroundFragmentDeclaration.js.map +1 -1
  72. package/Shaders/ShadersInclude/backgroundUboDeclaration.js +1 -8
  73. package/Shaders/ShadersInclude/backgroundUboDeclaration.js.map +1 -1
  74. package/Shaders/ShadersInclude/helperFunctions.js +1 -1
  75. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  76. package/Shaders/ShadersInclude/pbrHelperFunctions.js +1 -3
  77. package/Shaders/ShadersInclude/pbrHelperFunctions.js.map +1 -1
  78. package/Shaders/background.fragment.js +11 -1
  79. package/Shaders/background.fragment.js.map +1 -1
  80. package/Shaders/default.fragment.js +0 -1
  81. package/Shaders/default.fragment.js.map +1 -1
  82. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  83. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  84. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  85. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  86. package/XR/features/WebXRDepthSensing.js.map +1 -1
  87. package/XR/features/WebXRLayers.js.map +1 -1
  88. package/XR/features/WebXRMeshDetector.js.map +1 -1
  89. package/XR/features/WebXRNearInteraction.js.map +1 -1
  90. package/XR/features/WebXRPlaneDetector.js.map +1 -1
  91. package/XR/features/WebXRSpaceWarp.js.map +1 -1
  92. package/XR/native/nativeXRRenderTarget.js.map +1 -1
  93. package/XR/webXRCamera.js.map +1 -1
  94. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  95. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  96. package/XR/webXRWebGLLayer.js.map +1 -1
  97. package/assetContainer.js.map +1 -1
  98. package/package.json +1 -1
@@ -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 | 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"]}
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(\r\n public position: Vector3,\r\n public id: number\r\n ) {\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(\r\n public vertexId: number,\r\n public triangleId: number\r\n ) {}\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 +1 @@
1
- {"version":3,"file":"performanceViewerCollector.js","sourceRoot":"","sources":["../../../../../dev/core/src/Misc/PerformanceViewer/performanceViewerCollector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"../../scene\";\r\nimport type { IPerfCustomEvent, IPerfDatasets, IPerfMetadata } from \"../interfaces/iPerfViewer\";\r\nimport { EventState, Observable } from \"../observable\";\r\nimport { PrecisionDate } from \"../precisionDate\";\r\nimport { Tools } from \"../tools\";\r\nimport { DynamicFloat32Array } from \"./dynamicFloat32Array\";\r\nimport type { IPerfViewerCollectionStrategy, PerfStrategyInitialization } from \"./performanceViewerCollectionStrategies\";\r\n\r\n// the initial size of our array, should be a multiple of two!\r\nconst InitialArraySize = 1800;\r\n\r\n// three octets in a hexcode. #[AA][BB][CC], i.e. 24 bits of data.\r\nconst NumberOfBitsInHexcode = 24;\r\n\r\n// Allows single numeral hex numbers to be appended by a 0.\r\nconst HexPadding = \"0\";\r\n\r\n// header for the timestamp column\r\nconst TimestampColHeader = \"timestamp\";\r\n\r\n// header for the numPoints column\r\nconst NumPointsColHeader = \"numPoints\";\r\n\r\n// regex to capture all carriage returns in the string.\r\nconst CarriageReturnRegex = /\\r/g;\r\n\r\n// string to use as separator when exporting extra information along with the dataset id\r\nconst ExportedDataSeparator = \"@\";\r\n\r\n/**\r\n * Callback strategy and optional category for data collection\r\n */\r\ninterface IPerformanceViewerStrategyParameter {\r\n /**\r\n * The strategy for collecting data. Available strategies are located on the PerfCollectionStrategy class\r\n */\r\n strategyCallback: PerfStrategyInitialization;\r\n /**\r\n * Category for displaying this strategy on the viewer. Can be undefined or an empty string, in which case the strategy will be displayed on top\r\n */\r\n category?: string;\r\n /**\r\n * Starts hidden\r\n */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * The collector class handles the collection and storage of data into the appropriate array.\r\n * The collector also handles notifying any observers of any updates.\r\n */\r\nexport class PerformanceViewerCollector {\r\n private _datasetMeta: Map<string, IPerfMetadata>;\r\n private _strategies: Map<string, IPerfViewerCollectionStrategy>;\r\n private _startingTimestamp: number;\r\n private _hasLoadedData: boolean;\r\n private _isStarted: boolean;\r\n private readonly _customEventObservable: Observable<IPerfCustomEvent>;\r\n private readonly _eventRestoreSet: Set<string>;\r\n\r\n /**\r\n * Datastructure containing the collected datasets. Warning: you should not modify the values in here, data will be of the form [timestamp, numberOfPoints, value1, value2..., timestamp, etc...]\r\n */\r\n public readonly datasets: IPerfDatasets;\r\n /**\r\n * An observable you can attach to get deltas in the dataset. Subscribing to this will increase memory consumption slightly, and may hurt performance due to increased garbage collection needed.\r\n * Updates of slices will be of the form [timestamp, numberOfPoints, value1, value2...].\r\n */\r\n public readonly datasetObservable: Observable<number[]>;\r\n /**\r\n * An observable you can attach to get the most updated map of metadatas.\r\n */\r\n public readonly metadataObservable: Observable<Map<string, IPerfMetadata>>;\r\n\r\n /**\r\n * The offset for when actual data values start appearing inside a slice.\r\n */\r\n public static get SliceDataOffset() {\r\n return 2;\r\n }\r\n\r\n /**\r\n * The offset for the value of the number of points inside a slice.\r\n */\r\n public static get NumberOfPointsOffset() {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Handles the creation of a performance viewer collector.\r\n * @param _scene the scene to collect on.\r\n * @param _enabledStrategyCallbacks the list of data to collect with callbacks for initialization purposes.\r\n */\r\n constructor(private _scene: Scene, _enabledStrategyCallbacks?: IPerformanceViewerStrategyParameter[]) {\r\n this.datasets = {\r\n ids: [],\r\n data: new DynamicFloat32Array(InitialArraySize),\r\n startingIndices: new DynamicFloat32Array(InitialArraySize),\r\n };\r\n this._strategies = new Map<string, IPerfViewerCollectionStrategy>();\r\n this._datasetMeta = new Map<string, IPerfMetadata>();\r\n this._eventRestoreSet = new Set();\r\n this._customEventObservable = new Observable();\r\n this.datasetObservable = new Observable();\r\n this.metadataObservable = new Observable((observer) => observer.callback(this._datasetMeta, new EventState(0)));\r\n if (_enabledStrategyCallbacks) {\r\n this.addCollectionStrategies(..._enabledStrategyCallbacks);\r\n }\r\n }\r\n\r\n /**\r\n * Registers a custom string event which will be callable via sendEvent. This method returns an event object which will contain the id of the event.\r\n * The user can set a value optionally, which will be used in the sendEvent method. If the value is set, we will record this value at the end of each frame,\r\n * if not we will increment our counter and record the value of the counter at the end of each frame. The value recorded is 0 if no sendEvent method is called, within a frame.\r\n * @param name The name of the event to register\r\n * @param forceUpdate if the code should force add an event, and replace the last one.\r\n * @param category the category for that event\r\n * @returns The event registered, used in sendEvent\r\n */\r\n public registerEvent(name: string, forceUpdate?: boolean, category?: string): IPerfCustomEvent | undefined {\r\n if (this._strategies.has(name) && !forceUpdate) {\r\n return;\r\n }\r\n\r\n if (this._strategies.has(name) && forceUpdate) {\r\n this._strategies.get(name)?.dispose();\r\n this._strategies.delete(name);\r\n }\r\n\r\n const strategy: PerfStrategyInitialization = (scene) => {\r\n let counter: number = 0;\r\n let value: number = 0;\r\n\r\n const afterRenderObserver = scene.onAfterRenderObservable.add(() => {\r\n value = counter;\r\n counter = 0;\r\n });\r\n\r\n const stringObserver = this._customEventObservable.add((eventVal) => {\r\n if (name !== eventVal.name) {\r\n return;\r\n }\r\n\r\n if (eventVal.value !== undefined) {\r\n counter = eventVal.value;\r\n } else {\r\n counter++;\r\n }\r\n });\r\n\r\n return {\r\n id: name,\r\n getData: () => value,\r\n dispose: () => {\r\n scene.onAfterRenderObservable.remove(afterRenderObserver);\r\n this._customEventObservable.remove(stringObserver);\r\n },\r\n };\r\n };\r\n const event: IPerfCustomEvent = {\r\n name,\r\n };\r\n\r\n this._eventRestoreSet.add(name);\r\n this.addCollectionStrategies({ strategyCallback: strategy, category });\r\n\r\n return event;\r\n }\r\n\r\n /**\r\n * Lets the perf collector handle an event, occurences or event value depending on if the event.value params is set.\r\n * @param event the event to handle an occurence for\r\n */\r\n public sendEvent(event: IPerfCustomEvent) {\r\n this._customEventObservable.notifyObservers(event);\r\n }\r\n\r\n /**\r\n * This event restores all custom string events if necessary.\r\n */\r\n private _restoreStringEvents() {\r\n if (this._eventRestoreSet.size !== this._customEventObservable.observers.length) {\r\n this._eventRestoreSet.forEach((event) => {\r\n this.registerEvent(event, true);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * This method adds additional collection strategies for data collection purposes.\r\n * @param strategyCallbacks the list of data to collect with callbacks.\r\n */\r\n public addCollectionStrategies(...strategyCallbacks: IPerformanceViewerStrategyParameter[]) {\r\n // eslint-disable-next-line prefer-const\r\n for (let { strategyCallback, category, hidden } of strategyCallbacks) {\r\n const strategy = strategyCallback(this._scene);\r\n if (this._strategies.has(strategy.id)) {\r\n strategy.dispose();\r\n continue;\r\n }\r\n\r\n this.datasets.ids.push(strategy.id);\r\n\r\n if (category) {\r\n category = category.replace(new RegExp(ExportedDataSeparator, \"g\"), \"\");\r\n }\r\n\r\n this._datasetMeta.set(strategy.id, {\r\n color: this._getHexColorFromId(strategy.id),\r\n category,\r\n hidden,\r\n });\r\n\r\n this._strategies.set(strategy.id, strategy);\r\n }\r\n\r\n this.metadataObservable.notifyObservers(this._datasetMeta);\r\n }\r\n\r\n /**\r\n * Gets a 6 character hexcode representing the colour from a passed in string.\r\n * @param id the string to get a hex code for.\r\n * @returns a hexcode hashed from the id.\r\n */\r\n private _getHexColorFromId(id: string) {\r\n // this first bit is just a known way of hashing a string.\r\n let hash = 0;\r\n for (let i = 0; i < id.length; i++) {\r\n // (hash << 5) - hash is the same as hash * 31\r\n hash = id.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n\r\n // then we build the string octet by octet.\r\n let hex = \"#\";\r\n for (let i = 0; i < NumberOfBitsInHexcode; i += 8) {\r\n const octet = (hash >> i) & 0xff;\r\n hex += (HexPadding + octet.toString(16)).substr(-2);\r\n }\r\n\r\n return hex;\r\n }\r\n\r\n /**\r\n * Collects data for every dataset by using the appropriate strategy. This is called every frame.\r\n * This method will then notify all observers with the latest slice.\r\n */\r\n private _collectDataAtFrame = () => {\r\n const timestamp = PrecisionDate.Now - this._startingTimestamp;\r\n const numPoints = this.datasets.ids.length;\r\n\r\n // add the starting index for the slice\r\n const numberOfIndices = this.datasets.startingIndices.itemLength;\r\n let startingIndex = 0;\r\n\r\n if (numberOfIndices > 0) {\r\n const previousStartingIndex = this.datasets.startingIndices.at(numberOfIndices - 1);\r\n startingIndex =\r\n previousStartingIndex + this.datasets.data.at(previousStartingIndex + PerformanceViewerCollector.NumberOfPointsOffset) + PerformanceViewerCollector.SliceDataOffset;\r\n }\r\n\r\n this.datasets.startingIndices.push(startingIndex);\r\n\r\n // add the first 2 items in our slice.\r\n this.datasets.data.push(timestamp);\r\n this.datasets.data.push(numPoints);\r\n\r\n // add the values inside the slice.\r\n this.datasets.ids.forEach((id: string) => {\r\n const strategy = this._strategies.get(id);\r\n\r\n if (!strategy) {\r\n return;\r\n }\r\n\r\n this.datasets.data.push(strategy.getData());\r\n });\r\n\r\n if (this.datasetObservable.hasObservers()) {\r\n const slice: number[] = [timestamp, numPoints];\r\n\r\n for (let i = 0; i < numPoints; i++) {\r\n slice.push(this.datasets.data.at(startingIndex + PerformanceViewerCollector.SliceDataOffset + i));\r\n }\r\n\r\n this.datasetObservable.notifyObservers(slice);\r\n }\r\n };\r\n\r\n /**\r\n * Collects and then sends the latest slice to any observers by using the appropriate strategy when the user wants.\r\n * The slice will be of the form [timestamp, numberOfPoints, value1, value2...]\r\n * This method does not add onto the collected data accessible via the datasets variable.\r\n */\r\n public getCurrentSlice() {\r\n const timestamp = PrecisionDate.Now - this._startingTimestamp;\r\n const numPoints = this.datasets.ids.length;\r\n const slice: number[] = [timestamp, numPoints];\r\n\r\n // add the values inside the slice.\r\n this.datasets.ids.forEach((id: string) => {\r\n const strategy = this._strategies.get(id);\r\n\r\n if (!strategy) {\r\n return;\r\n }\r\n\r\n if (this.datasetObservable.hasObservers()) {\r\n slice.push(strategy.getData());\r\n }\r\n });\r\n\r\n if (this.datasetObservable.hasObservers()) {\r\n this.datasetObservable.notifyObservers(slice);\r\n }\r\n }\r\n\r\n /**\r\n * Updates a property for a dataset's metadata with the value provided.\r\n * @param id the id of the dataset which needs its metadata updated.\r\n * @param prop the property to update.\r\n * @param value the value to update the property with.\r\n */\r\n public updateMetadata<T extends keyof IPerfMetadata>(id: string, prop: T, value: IPerfMetadata[T]) {\r\n const meta = this._datasetMeta.get(id);\r\n\r\n if (!meta) {\r\n return;\r\n }\r\n\r\n meta[prop] = value;\r\n\r\n this.metadataObservable.notifyObservers(this._datasetMeta);\r\n }\r\n\r\n /**\r\n * Completely clear, data, ids, and strategies saved to this performance collector.\r\n * @param preserveStringEventsRestore if it should preserve the string events, by default will clear string events registered when called.\r\n */\r\n public clear(preserveStringEventsRestore?: boolean) {\r\n this.datasets.data = new DynamicFloat32Array(InitialArraySize);\r\n this.datasets.ids.length = 0;\r\n this.datasets.startingIndices = new DynamicFloat32Array(InitialArraySize);\r\n this._datasetMeta.clear();\r\n this._strategies.forEach((strategy) => strategy.dispose());\r\n this._strategies.clear();\r\n\r\n if (!preserveStringEventsRestore) {\r\n this._eventRestoreSet.clear();\r\n }\r\n this._hasLoadedData = false;\r\n }\r\n\r\n /**\r\n * Accessor which lets the caller know if the performance collector has data loaded from a file or not!\r\n * Call clear() to reset this value.\r\n * @returns true if the data is loaded from a file, false otherwise.\r\n */\r\n public get hasLoadedData(): boolean {\r\n return this._hasLoadedData;\r\n }\r\n\r\n /**\r\n * Given a string containing file data, this function parses the file data into the datasets object.\r\n * It returns a boolean to indicate if this object was successfully loaded with the data.\r\n * @param data string content representing the file data.\r\n * @param keepDatasetMeta if it should use reuse the existing dataset metadata\r\n * @returns true if the data was successfully loaded, false otherwise.\r\n */\r\n public loadFromFileData(data: string, keepDatasetMeta?: boolean): boolean {\r\n const lines = data\r\n .replace(CarriageReturnRegex, \"\")\r\n .split(\"\\n\")\r\n .map((line) => line.split(\",\").filter((s) => s.length > 0))\r\n .filter((line) => line.length > 0);\r\n const timestampIndex = 0;\r\n const numPointsIndex = PerformanceViewerCollector.NumberOfPointsOffset;\r\n if (lines.length < 2) {\r\n return false;\r\n }\r\n\r\n const parsedDatasets: IPerfDatasets = {\r\n ids: [],\r\n data: new DynamicFloat32Array(InitialArraySize),\r\n startingIndices: new DynamicFloat32Array(InitialArraySize),\r\n };\r\n\r\n // parse first line separately to populate ids!\r\n const [firstLine, ...dataLines] = lines;\r\n // make sure we have the correct beginning headers\r\n if (firstLine.length < 2 || firstLine[timestampIndex] !== TimestampColHeader || firstLine[numPointsIndex] !== NumPointsColHeader) {\r\n return false;\r\n }\r\n\r\n const idCategoryMap: Map<string, string> = new Map<string, string>();\r\n\r\n // populate the ids.\r\n for (let i = PerformanceViewerCollector.SliceDataOffset; i < firstLine.length; i++) {\r\n const [id, category] = firstLine[i].split(ExportedDataSeparator);\r\n parsedDatasets.ids.push(id);\r\n idCategoryMap.set(id, category);\r\n }\r\n\r\n let startingIndex = 0;\r\n for (const line of dataLines) {\r\n if (line.length < 2) {\r\n return false;\r\n }\r\n\r\n const timestamp = parseFloat(line[timestampIndex]);\r\n const numPoints = parseInt(line[numPointsIndex]);\r\n\r\n if (isNaN(numPoints) || isNaN(timestamp)) {\r\n return false;\r\n }\r\n\r\n parsedDatasets.data.push(timestamp);\r\n parsedDatasets.data.push(numPoints);\r\n\r\n if (numPoints + PerformanceViewerCollector.SliceDataOffset !== line.length) {\r\n return false;\r\n }\r\n\r\n for (let i = PerformanceViewerCollector.SliceDataOffset; i < line.length; i++) {\r\n const val = parseFloat(line[i]);\r\n if (isNaN(val)) {\r\n return false;\r\n }\r\n parsedDatasets.data.push(val);\r\n }\r\n\r\n parsedDatasets.startingIndices.push(startingIndex);\r\n startingIndex += line.length;\r\n }\r\n\r\n this.datasets.ids = parsedDatasets.ids;\r\n this.datasets.data = parsedDatasets.data;\r\n this.datasets.startingIndices = parsedDatasets.startingIndices;\r\n if (!keepDatasetMeta) {\r\n this._datasetMeta.clear();\r\n }\r\n this._strategies.forEach((strategy) => strategy.dispose());\r\n this._strategies.clear();\r\n\r\n // populate metadata.\r\n if (!keepDatasetMeta) {\r\n for (const id of this.datasets.ids) {\r\n const category = idCategoryMap.get(id);\r\n\r\n this._datasetMeta.set(id, { category, color: this._getHexColorFromId(id) });\r\n }\r\n }\r\n this.metadataObservable.notifyObservers(this._datasetMeta);\r\n this._hasLoadedData = true;\r\n return true;\r\n }\r\n\r\n /**\r\n * Exports the datasets inside of the collector to a csv.\r\n */\r\n public exportDataToCsv() {\r\n let csvContent = \"\";\r\n // create the header line.\r\n csvContent += `${TimestampColHeader},${NumPointsColHeader}`;\r\n for (let i = 0; i < this.datasets.ids.length; i++) {\r\n csvContent += `,${this.datasets.ids[i]}`;\r\n if (this._datasetMeta) {\r\n const meta = this._datasetMeta.get(this.datasets.ids[i]);\r\n if (meta?.category) {\r\n csvContent += `${ExportedDataSeparator}${meta.category}`;\r\n }\r\n }\r\n }\r\n csvContent += \"\\n\";\r\n // create the data lines\r\n for (let i = 0; i < this.datasets.startingIndices.itemLength; i++) {\r\n const startingIndex = this.datasets.startingIndices.at(i);\r\n const timestamp = this.datasets.data.at(startingIndex);\r\n const numPoints = this.datasets.data.at(startingIndex + PerformanceViewerCollector.NumberOfPointsOffset);\r\n\r\n csvContent += `${timestamp},${numPoints}`;\r\n\r\n for (let offset = 0; offset < numPoints; offset++) {\r\n csvContent += `,${this.datasets.data.at(startingIndex + PerformanceViewerCollector.SliceDataOffset + offset)}`;\r\n }\r\n\r\n // add extra commas.\r\n for (let diff = 0; diff < this.datasets.ids.length - numPoints; diff++) {\r\n csvContent += \",\";\r\n }\r\n\r\n csvContent += \"\\n\";\r\n }\r\n\r\n const fileName = `${new Date().toISOString()}-perfdata.csv`;\r\n Tools.Download(new Blob([csvContent], { type: \"text/csv\" }), fileName);\r\n }\r\n /**\r\n * Starts the realtime collection of data.\r\n * @param shouldPreserve optional boolean param, if set will preserve the dataset between calls of start.\r\n */\r\n public start(shouldPreserve?: boolean) {\r\n if (!shouldPreserve) {\r\n this.datasets.data = new DynamicFloat32Array(InitialArraySize);\r\n this.datasets.startingIndices = new DynamicFloat32Array(InitialArraySize);\r\n this._startingTimestamp = PrecisionDate.Now;\r\n } else if (this._startingTimestamp === undefined) {\r\n this._startingTimestamp = PrecisionDate.Now;\r\n }\r\n this._scene.onAfterRenderObservable.add(this._collectDataAtFrame);\r\n this._restoreStringEvents();\r\n this._isStarted = true;\r\n }\r\n\r\n /**\r\n * Stops the collection of data.\r\n */\r\n public stop() {\r\n this._scene.onAfterRenderObservable.removeCallback(this._collectDataAtFrame);\r\n this._isStarted = false;\r\n }\r\n\r\n /**\r\n * Returns if the perf collector has been started or not.\r\n */\r\n public get isStarted(): boolean {\r\n return this._isStarted;\r\n }\r\n\r\n /**\r\n * Disposes of the object\r\n */\r\n public dispose() {\r\n this._scene.onAfterRenderObservable.removeCallback(this._collectDataAtFrame);\r\n this._datasetMeta.clear();\r\n this._strategies.forEach((strategy) => {\r\n strategy.dispose();\r\n });\r\n this.datasetObservable.clear();\r\n this.metadataObservable.clear();\r\n this._isStarted = false;\r\n (<any>this.datasets) = null;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"performanceViewerCollector.js","sourceRoot":"","sources":["../../../../../dev/core/src/Misc/PerformanceViewer/performanceViewerCollector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"../../scene\";\r\nimport type { IPerfCustomEvent, IPerfDatasets, IPerfMetadata } from \"../interfaces/iPerfViewer\";\r\nimport { EventState, Observable } from \"../observable\";\r\nimport { PrecisionDate } from \"../precisionDate\";\r\nimport { Tools } from \"../tools\";\r\nimport { DynamicFloat32Array } from \"./dynamicFloat32Array\";\r\nimport type { IPerfViewerCollectionStrategy, PerfStrategyInitialization } from \"./performanceViewerCollectionStrategies\";\r\n\r\n// the initial size of our array, should be a multiple of two!\r\nconst InitialArraySize = 1800;\r\n\r\n// three octets in a hexcode. #[AA][BB][CC], i.e. 24 bits of data.\r\nconst NumberOfBitsInHexcode = 24;\r\n\r\n// Allows single numeral hex numbers to be appended by a 0.\r\nconst HexPadding = \"0\";\r\n\r\n// header for the timestamp column\r\nconst TimestampColHeader = \"timestamp\";\r\n\r\n// header for the numPoints column\r\nconst NumPointsColHeader = \"numPoints\";\r\n\r\n// regex to capture all carriage returns in the string.\r\nconst CarriageReturnRegex = /\\r/g;\r\n\r\n// string to use as separator when exporting extra information along with the dataset id\r\nconst ExportedDataSeparator = \"@\";\r\n\r\n/**\r\n * Callback strategy and optional category for data collection\r\n */\r\ninterface IPerformanceViewerStrategyParameter {\r\n /**\r\n * The strategy for collecting data. Available strategies are located on the PerfCollectionStrategy class\r\n */\r\n strategyCallback: PerfStrategyInitialization;\r\n /**\r\n * Category for displaying this strategy on the viewer. Can be undefined or an empty string, in which case the strategy will be displayed on top\r\n */\r\n category?: string;\r\n /**\r\n * Starts hidden\r\n */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * The collector class handles the collection and storage of data into the appropriate array.\r\n * The collector also handles notifying any observers of any updates.\r\n */\r\nexport class PerformanceViewerCollector {\r\n private _datasetMeta: Map<string, IPerfMetadata>;\r\n private _strategies: Map<string, IPerfViewerCollectionStrategy>;\r\n private _startingTimestamp: number;\r\n private _hasLoadedData: boolean;\r\n private _isStarted: boolean;\r\n private readonly _customEventObservable: Observable<IPerfCustomEvent>;\r\n private readonly _eventRestoreSet: Set<string>;\r\n\r\n /**\r\n * Datastructure containing the collected datasets. Warning: you should not modify the values in here, data will be of the form [timestamp, numberOfPoints, value1, value2..., timestamp, etc...]\r\n */\r\n public readonly datasets: IPerfDatasets;\r\n /**\r\n * An observable you can attach to get deltas in the dataset. Subscribing to this will increase memory consumption slightly, and may hurt performance due to increased garbage collection needed.\r\n * Updates of slices will be of the form [timestamp, numberOfPoints, value1, value2...].\r\n */\r\n public readonly datasetObservable: Observable<number[]>;\r\n /**\r\n * An observable you can attach to get the most updated map of metadatas.\r\n */\r\n public readonly metadataObservable: Observable<Map<string, IPerfMetadata>>;\r\n\r\n /**\r\n * The offset for when actual data values start appearing inside a slice.\r\n */\r\n public static get SliceDataOffset() {\r\n return 2;\r\n }\r\n\r\n /**\r\n * The offset for the value of the number of points inside a slice.\r\n */\r\n public static get NumberOfPointsOffset() {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Handles the creation of a performance viewer collector.\r\n * @param _scene the scene to collect on.\r\n * @param _enabledStrategyCallbacks the list of data to collect with callbacks for initialization purposes.\r\n */\r\n constructor(\r\n private _scene: Scene,\r\n _enabledStrategyCallbacks?: IPerformanceViewerStrategyParameter[]\r\n ) {\r\n this.datasets = {\r\n ids: [],\r\n data: new DynamicFloat32Array(InitialArraySize),\r\n startingIndices: new DynamicFloat32Array(InitialArraySize),\r\n };\r\n this._strategies = new Map<string, IPerfViewerCollectionStrategy>();\r\n this._datasetMeta = new Map<string, IPerfMetadata>();\r\n this._eventRestoreSet = new Set();\r\n this._customEventObservable = new Observable();\r\n this.datasetObservable = new Observable();\r\n this.metadataObservable = new Observable((observer) => observer.callback(this._datasetMeta, new EventState(0)));\r\n if (_enabledStrategyCallbacks) {\r\n this.addCollectionStrategies(..._enabledStrategyCallbacks);\r\n }\r\n }\r\n\r\n /**\r\n * Registers a custom string event which will be callable via sendEvent. This method returns an event object which will contain the id of the event.\r\n * The user can set a value optionally, which will be used in the sendEvent method. If the value is set, we will record this value at the end of each frame,\r\n * if not we will increment our counter and record the value of the counter at the end of each frame. The value recorded is 0 if no sendEvent method is called, within a frame.\r\n * @param name The name of the event to register\r\n * @param forceUpdate if the code should force add an event, and replace the last one.\r\n * @param category the category for that event\r\n * @returns The event registered, used in sendEvent\r\n */\r\n public registerEvent(name: string, forceUpdate?: boolean, category?: string): IPerfCustomEvent | undefined {\r\n if (this._strategies.has(name) && !forceUpdate) {\r\n return;\r\n }\r\n\r\n if (this._strategies.has(name) && forceUpdate) {\r\n this._strategies.get(name)?.dispose();\r\n this._strategies.delete(name);\r\n }\r\n\r\n const strategy: PerfStrategyInitialization = (scene) => {\r\n let counter: number = 0;\r\n let value: number = 0;\r\n\r\n const afterRenderObserver = scene.onAfterRenderObservable.add(() => {\r\n value = counter;\r\n counter = 0;\r\n });\r\n\r\n const stringObserver = this._customEventObservable.add((eventVal) => {\r\n if (name !== eventVal.name) {\r\n return;\r\n }\r\n\r\n if (eventVal.value !== undefined) {\r\n counter = eventVal.value;\r\n } else {\r\n counter++;\r\n }\r\n });\r\n\r\n return {\r\n id: name,\r\n getData: () => value,\r\n dispose: () => {\r\n scene.onAfterRenderObservable.remove(afterRenderObserver);\r\n this._customEventObservable.remove(stringObserver);\r\n },\r\n };\r\n };\r\n const event: IPerfCustomEvent = {\r\n name,\r\n };\r\n\r\n this._eventRestoreSet.add(name);\r\n this.addCollectionStrategies({ strategyCallback: strategy, category });\r\n\r\n return event;\r\n }\r\n\r\n /**\r\n * Lets the perf collector handle an event, occurences or event value depending on if the event.value params is set.\r\n * @param event the event to handle an occurence for\r\n */\r\n public sendEvent(event: IPerfCustomEvent) {\r\n this._customEventObservable.notifyObservers(event);\r\n }\r\n\r\n /**\r\n * This event restores all custom string events if necessary.\r\n */\r\n private _restoreStringEvents() {\r\n if (this._eventRestoreSet.size !== this._customEventObservable.observers.length) {\r\n this._eventRestoreSet.forEach((event) => {\r\n this.registerEvent(event, true);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * This method adds additional collection strategies for data collection purposes.\r\n * @param strategyCallbacks the list of data to collect with callbacks.\r\n */\r\n public addCollectionStrategies(...strategyCallbacks: IPerformanceViewerStrategyParameter[]) {\r\n // eslint-disable-next-line prefer-const\r\n for (let { strategyCallback, category, hidden } of strategyCallbacks) {\r\n const strategy = strategyCallback(this._scene);\r\n if (this._strategies.has(strategy.id)) {\r\n strategy.dispose();\r\n continue;\r\n }\r\n\r\n this.datasets.ids.push(strategy.id);\r\n\r\n if (category) {\r\n category = category.replace(new RegExp(ExportedDataSeparator, \"g\"), \"\");\r\n }\r\n\r\n this._datasetMeta.set(strategy.id, {\r\n color: this._getHexColorFromId(strategy.id),\r\n category,\r\n hidden,\r\n });\r\n\r\n this._strategies.set(strategy.id, strategy);\r\n }\r\n\r\n this.metadataObservable.notifyObservers(this._datasetMeta);\r\n }\r\n\r\n /**\r\n * Gets a 6 character hexcode representing the colour from a passed in string.\r\n * @param id the string to get a hex code for.\r\n * @returns a hexcode hashed from the id.\r\n */\r\n private _getHexColorFromId(id: string) {\r\n // this first bit is just a known way of hashing a string.\r\n let hash = 0;\r\n for (let i = 0; i < id.length; i++) {\r\n // (hash << 5) - hash is the same as hash * 31\r\n hash = id.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n\r\n // then we build the string octet by octet.\r\n let hex = \"#\";\r\n for (let i = 0; i < NumberOfBitsInHexcode; i += 8) {\r\n const octet = (hash >> i) & 0xff;\r\n hex += (HexPadding + octet.toString(16)).substr(-2);\r\n }\r\n\r\n return hex;\r\n }\r\n\r\n /**\r\n * Collects data for every dataset by using the appropriate strategy. This is called every frame.\r\n * This method will then notify all observers with the latest slice.\r\n */\r\n private _collectDataAtFrame = () => {\r\n const timestamp = PrecisionDate.Now - this._startingTimestamp;\r\n const numPoints = this.datasets.ids.length;\r\n\r\n // add the starting index for the slice\r\n const numberOfIndices = this.datasets.startingIndices.itemLength;\r\n let startingIndex = 0;\r\n\r\n if (numberOfIndices > 0) {\r\n const previousStartingIndex = this.datasets.startingIndices.at(numberOfIndices - 1);\r\n startingIndex =\r\n previousStartingIndex + this.datasets.data.at(previousStartingIndex + PerformanceViewerCollector.NumberOfPointsOffset) + PerformanceViewerCollector.SliceDataOffset;\r\n }\r\n\r\n this.datasets.startingIndices.push(startingIndex);\r\n\r\n // add the first 2 items in our slice.\r\n this.datasets.data.push(timestamp);\r\n this.datasets.data.push(numPoints);\r\n\r\n // add the values inside the slice.\r\n this.datasets.ids.forEach((id: string) => {\r\n const strategy = this._strategies.get(id);\r\n\r\n if (!strategy) {\r\n return;\r\n }\r\n\r\n this.datasets.data.push(strategy.getData());\r\n });\r\n\r\n if (this.datasetObservable.hasObservers()) {\r\n const slice: number[] = [timestamp, numPoints];\r\n\r\n for (let i = 0; i < numPoints; i++) {\r\n slice.push(this.datasets.data.at(startingIndex + PerformanceViewerCollector.SliceDataOffset + i));\r\n }\r\n\r\n this.datasetObservable.notifyObservers(slice);\r\n }\r\n };\r\n\r\n /**\r\n * Collects and then sends the latest slice to any observers by using the appropriate strategy when the user wants.\r\n * The slice will be of the form [timestamp, numberOfPoints, value1, value2...]\r\n * This method does not add onto the collected data accessible via the datasets variable.\r\n */\r\n public getCurrentSlice() {\r\n const timestamp = PrecisionDate.Now - this._startingTimestamp;\r\n const numPoints = this.datasets.ids.length;\r\n const slice: number[] = [timestamp, numPoints];\r\n\r\n // add the values inside the slice.\r\n this.datasets.ids.forEach((id: string) => {\r\n const strategy = this._strategies.get(id);\r\n\r\n if (!strategy) {\r\n return;\r\n }\r\n\r\n if (this.datasetObservable.hasObservers()) {\r\n slice.push(strategy.getData());\r\n }\r\n });\r\n\r\n if (this.datasetObservable.hasObservers()) {\r\n this.datasetObservable.notifyObservers(slice);\r\n }\r\n }\r\n\r\n /**\r\n * Updates a property for a dataset's metadata with the value provided.\r\n * @param id the id of the dataset which needs its metadata updated.\r\n * @param prop the property to update.\r\n * @param value the value to update the property with.\r\n */\r\n public updateMetadata<T extends keyof IPerfMetadata>(id: string, prop: T, value: IPerfMetadata[T]) {\r\n const meta = this._datasetMeta.get(id);\r\n\r\n if (!meta) {\r\n return;\r\n }\r\n\r\n meta[prop] = value;\r\n\r\n this.metadataObservable.notifyObservers(this._datasetMeta);\r\n }\r\n\r\n /**\r\n * Completely clear, data, ids, and strategies saved to this performance collector.\r\n * @param preserveStringEventsRestore if it should preserve the string events, by default will clear string events registered when called.\r\n */\r\n public clear(preserveStringEventsRestore?: boolean) {\r\n this.datasets.data = new DynamicFloat32Array(InitialArraySize);\r\n this.datasets.ids.length = 0;\r\n this.datasets.startingIndices = new DynamicFloat32Array(InitialArraySize);\r\n this._datasetMeta.clear();\r\n this._strategies.forEach((strategy) => strategy.dispose());\r\n this._strategies.clear();\r\n\r\n if (!preserveStringEventsRestore) {\r\n this._eventRestoreSet.clear();\r\n }\r\n this._hasLoadedData = false;\r\n }\r\n\r\n /**\r\n * Accessor which lets the caller know if the performance collector has data loaded from a file or not!\r\n * Call clear() to reset this value.\r\n * @returns true if the data is loaded from a file, false otherwise.\r\n */\r\n public get hasLoadedData(): boolean {\r\n return this._hasLoadedData;\r\n }\r\n\r\n /**\r\n * Given a string containing file data, this function parses the file data into the datasets object.\r\n * It returns a boolean to indicate if this object was successfully loaded with the data.\r\n * @param data string content representing the file data.\r\n * @param keepDatasetMeta if it should use reuse the existing dataset metadata\r\n * @returns true if the data was successfully loaded, false otherwise.\r\n */\r\n public loadFromFileData(data: string, keepDatasetMeta?: boolean): boolean {\r\n const lines = data\r\n .replace(CarriageReturnRegex, \"\")\r\n .split(\"\\n\")\r\n .map((line) => line.split(\",\").filter((s) => s.length > 0))\r\n .filter((line) => line.length > 0);\r\n const timestampIndex = 0;\r\n const numPointsIndex = PerformanceViewerCollector.NumberOfPointsOffset;\r\n if (lines.length < 2) {\r\n return false;\r\n }\r\n\r\n const parsedDatasets: IPerfDatasets = {\r\n ids: [],\r\n data: new DynamicFloat32Array(InitialArraySize),\r\n startingIndices: new DynamicFloat32Array(InitialArraySize),\r\n };\r\n\r\n // parse first line separately to populate ids!\r\n const [firstLine, ...dataLines] = lines;\r\n // make sure we have the correct beginning headers\r\n if (firstLine.length < 2 || firstLine[timestampIndex] !== TimestampColHeader || firstLine[numPointsIndex] !== NumPointsColHeader) {\r\n return false;\r\n }\r\n\r\n const idCategoryMap: Map<string, string> = new Map<string, string>();\r\n\r\n // populate the ids.\r\n for (let i = PerformanceViewerCollector.SliceDataOffset; i < firstLine.length; i++) {\r\n const [id, category] = firstLine[i].split(ExportedDataSeparator);\r\n parsedDatasets.ids.push(id);\r\n idCategoryMap.set(id, category);\r\n }\r\n\r\n let startingIndex = 0;\r\n for (const line of dataLines) {\r\n if (line.length < 2) {\r\n return false;\r\n }\r\n\r\n const timestamp = parseFloat(line[timestampIndex]);\r\n const numPoints = parseInt(line[numPointsIndex]);\r\n\r\n if (isNaN(numPoints) || isNaN(timestamp)) {\r\n return false;\r\n }\r\n\r\n parsedDatasets.data.push(timestamp);\r\n parsedDatasets.data.push(numPoints);\r\n\r\n if (numPoints + PerformanceViewerCollector.SliceDataOffset !== line.length) {\r\n return false;\r\n }\r\n\r\n for (let i = PerformanceViewerCollector.SliceDataOffset; i < line.length; i++) {\r\n const val = parseFloat(line[i]);\r\n if (isNaN(val)) {\r\n return false;\r\n }\r\n parsedDatasets.data.push(val);\r\n }\r\n\r\n parsedDatasets.startingIndices.push(startingIndex);\r\n startingIndex += line.length;\r\n }\r\n\r\n this.datasets.ids = parsedDatasets.ids;\r\n this.datasets.data = parsedDatasets.data;\r\n this.datasets.startingIndices = parsedDatasets.startingIndices;\r\n if (!keepDatasetMeta) {\r\n this._datasetMeta.clear();\r\n }\r\n this._strategies.forEach((strategy) => strategy.dispose());\r\n this._strategies.clear();\r\n\r\n // populate metadata.\r\n if (!keepDatasetMeta) {\r\n for (const id of this.datasets.ids) {\r\n const category = idCategoryMap.get(id);\r\n\r\n this._datasetMeta.set(id, { category, color: this._getHexColorFromId(id) });\r\n }\r\n }\r\n this.metadataObservable.notifyObservers(this._datasetMeta);\r\n this._hasLoadedData = true;\r\n return true;\r\n }\r\n\r\n /**\r\n * Exports the datasets inside of the collector to a csv.\r\n */\r\n public exportDataToCsv() {\r\n let csvContent = \"\";\r\n // create the header line.\r\n csvContent += `${TimestampColHeader},${NumPointsColHeader}`;\r\n for (let i = 0; i < this.datasets.ids.length; i++) {\r\n csvContent += `,${this.datasets.ids[i]}`;\r\n if (this._datasetMeta) {\r\n const meta = this._datasetMeta.get(this.datasets.ids[i]);\r\n if (meta?.category) {\r\n csvContent += `${ExportedDataSeparator}${meta.category}`;\r\n }\r\n }\r\n }\r\n csvContent += \"\\n\";\r\n // create the data lines\r\n for (let i = 0; i < this.datasets.startingIndices.itemLength; i++) {\r\n const startingIndex = this.datasets.startingIndices.at(i);\r\n const timestamp = this.datasets.data.at(startingIndex);\r\n const numPoints = this.datasets.data.at(startingIndex + PerformanceViewerCollector.NumberOfPointsOffset);\r\n\r\n csvContent += `${timestamp},${numPoints}`;\r\n\r\n for (let offset = 0; offset < numPoints; offset++) {\r\n csvContent += `,${this.datasets.data.at(startingIndex + PerformanceViewerCollector.SliceDataOffset + offset)}`;\r\n }\r\n\r\n // add extra commas.\r\n for (let diff = 0; diff < this.datasets.ids.length - numPoints; diff++) {\r\n csvContent += \",\";\r\n }\r\n\r\n csvContent += \"\\n\";\r\n }\r\n\r\n const fileName = `${new Date().toISOString()}-perfdata.csv`;\r\n Tools.Download(new Blob([csvContent], { type: \"text/csv\" }), fileName);\r\n }\r\n /**\r\n * Starts the realtime collection of data.\r\n * @param shouldPreserve optional boolean param, if set will preserve the dataset between calls of start.\r\n */\r\n public start(shouldPreserve?: boolean) {\r\n if (!shouldPreserve) {\r\n this.datasets.data = new DynamicFloat32Array(InitialArraySize);\r\n this.datasets.startingIndices = new DynamicFloat32Array(InitialArraySize);\r\n this._startingTimestamp = PrecisionDate.Now;\r\n } else if (this._startingTimestamp === undefined) {\r\n this._startingTimestamp = PrecisionDate.Now;\r\n }\r\n this._scene.onAfterRenderObservable.add(this._collectDataAtFrame);\r\n this._restoreStringEvents();\r\n this._isStarted = true;\r\n }\r\n\r\n /**\r\n * Stops the collection of data.\r\n */\r\n public stop() {\r\n this._scene.onAfterRenderObservable.removeCallback(this._collectDataAtFrame);\r\n this._isStarted = false;\r\n }\r\n\r\n /**\r\n * Returns if the perf collector has been started or not.\r\n */\r\n public get isStarted(): boolean {\r\n return this._isStarted;\r\n }\r\n\r\n /**\r\n * Disposes of the object\r\n */\r\n public dispose() {\r\n this._scene.onAfterRenderObservable.removeCallback(this._collectDataAtFrame);\r\n this._datasetMeta.clear();\r\n this._strategies.forEach((strategy) => {\r\n strategy.dispose();\r\n });\r\n this.datasetObservable.clear();\r\n this.metadataObservable.clear();\r\n this._isStarted = false;\r\n (<any>this.datasets) = null;\r\n }\r\n}\r\n"]}