@onerjs/core 8.33.4 → 8.33.6

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 (73) hide show
  1. package/Engines/WebGPU/Extensions/engine.multiRender.js +5 -10
  2. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  3. package/Engines/WebGPU/Extensions/engine.renderTarget.js +4 -2
  4. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  5. package/Engines/WebGPU/webgpuHardwareTexture.d.ts +4 -3
  6. package/Engines/WebGPU/webgpuHardwareTexture.js +27 -21
  7. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  8. package/Engines/WebGPU/webgpuTextureManager.d.ts +5 -4
  9. package/Engines/WebGPU/webgpuTextureManager.js +20 -30
  10. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  11. package/Engines/engine.d.ts +1 -0
  12. package/Engines/thinEngine.js +9 -1
  13. package/Engines/thinEngine.js.map +1 -1
  14. package/Engines/thinWebGPUEngine.js +2 -3
  15. package/Engines/thinWebGPUEngine.js.map +1 -1
  16. package/Engines/webgpuEngine.js +28 -13
  17. package/Engines/webgpuEngine.js.map +1 -1
  18. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +2 -2
  19. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  20. package/FrameGraph/Node/Blocks/Textures/clearBlock.d.ts +1 -1
  21. package/FrameGraph/Node/Blocks/Textures/clearBlock.js +2 -2
  22. package/FrameGraph/Node/Blocks/Textures/clearBlock.js.map +1 -1
  23. package/FrameGraph/Node/Blocks/inputBlock.js +4 -0
  24. package/FrameGraph/Node/Blocks/inputBlock.js.map +1 -1
  25. package/FrameGraph/Node/nodeRenderGraphBlock.d.ts +1 -0
  26. package/FrameGraph/Node/nodeRenderGraphBlock.js +19 -0
  27. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  28. package/FrameGraph/Passes/renderPass.d.ts +16 -0
  29. package/FrameGraph/Passes/renderPass.js +12 -0
  30. package/FrameGraph/Passes/renderPass.js.map +1 -1
  31. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +3 -3
  32. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +3 -2
  33. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  34. package/FrameGraph/Tasks/Texture/clearTextureTask.d.ts +2 -2
  35. package/FrameGraph/Tasks/Texture/clearTextureTask.js +3 -2
  36. package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
  37. package/FrameGraph/frameGraphRenderContext.js +4 -15
  38. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  39. package/FrameGraph/frameGraphTask.d.ts +2 -2
  40. package/FrameGraph/frameGraphTask.js +6 -6
  41. package/FrameGraph/frameGraphTask.js.map +1 -1
  42. package/FrameGraph/frameGraphTaskMultiRenderTarget.d.ts +15 -0
  43. package/FrameGraph/frameGraphTaskMultiRenderTarget.js +25 -0
  44. package/FrameGraph/frameGraphTaskMultiRenderTarget.js.map +1 -0
  45. package/FrameGraph/frameGraphTextureManager.js +13 -2
  46. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  47. package/FrameGraph/frameGraphTypes.d.ts +9 -1
  48. package/FrameGraph/frameGraphTypes.js.map +1 -1
  49. package/Loading/Plugins/babylonFileLoader.js +13 -0
  50. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  51. package/Materials/Textures/baseTexture.d.ts +4 -0
  52. package/Materials/Textures/baseTexture.js +4 -0
  53. package/Materials/Textures/baseTexture.js.map +1 -1
  54. package/Materials/Textures/textureCreationOptions.d.ts +2 -0
  55. package/Materials/Textures/textureCreationOptions.js +0 -1
  56. package/Materials/Textures/textureCreationOptions.js.map +1 -1
  57. package/Meshes/abstractMesh.js +1 -1
  58. package/Meshes/abstractMesh.js.map +1 -1
  59. package/Meshes/geometry.js +1 -0
  60. package/Meshes/geometry.js.map +1 -1
  61. package/Misc/decorators.serialization.js +1 -1
  62. package/Misc/decorators.serialization.js.map +1 -1
  63. package/Particles/solidParticleSystem.d.ts +2 -1
  64. package/Particles/solidParticleSystem.js.map +1 -1
  65. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +4 -12
  66. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
  67. package/Shaders/picking.vertex.js +2 -2
  68. package/Shaders/picking.vertex.js.map +1 -1
  69. package/ShadersWGSL/ShadersInclude/shadowsFragmentFunctions.js +8 -14
  70. package/ShadersWGSL/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
  71. package/ShadersWGSL/picking.vertex.js +2 -2
  72. package/ShadersWGSL/picking.vertex.js.map +1 -1
  73. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"abstractMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/abstractMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from \"../Misc/observable\";\r\nimport type { Nullable, FloatArray, IndicesArray, DeepImmutable } from \"../types\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { ScenePerformancePriority } from \"../scene\";\r\nimport type { Vector2 } from \"../Maths/math.vector\";\r\nimport { Quaternion, Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { Node } from \"../node\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { IGetSetVerticesData } from \"../Meshes/mesh.vertexData\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { MaterialDefines } from \"../Materials/materialDefines\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport type { MorphTargetManager } from \"../Morph/morphTargetManager\";\r\nimport type { IBakedVertexAnimationManager } from \"../BakedVertexAnimation/bakedVertexAnimationManager\";\r\nimport type { IEdgesRenderer } from \"../Rendering/edgesRenderer\";\r\nimport type { SolidParticle } from \"../Particles/solidParticle\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { AbstractActionManager } from \"../Actions/abstractActionManager\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport { _MeshCollisionData } from \"../Collisions/meshCollisionData\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport type { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { extractMinAndMax } from \"../Maths/math.functions\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { Axis } from \"../Maths/math.axis\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nimport type { Ray } from \"../Culling/ray\";\r\nimport type { Collider } from \"../Collisions/collider\";\r\nimport type { TrianglePickingPredicate } from \"../Culling/ray\";\r\nimport type { RenderingGroup } from \"../Rendering/renderingGroup\";\r\nimport type { IEdgesRendererOptions } from \"../Rendering/edgesRenderer\";\r\nimport type { MorphTarget } from \"../Morph/morphTarget\";\r\nimport type { Geometry } from \"./geometry\";\r\nimport { nativeOverride } from \"../Misc/decorators\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\nfunction ApplyMorph(data: FloatArray, kind: string, morphTargetManager: MorphTargetManager): void {\r\n let getTargetData: Nullable<(target: MorphTarget) => Nullable<FloatArray>> = null;\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n getTargetData = (target) => target.getPositions();\r\n break;\r\n case VertexBuffer.NormalKind:\r\n getTargetData = (target) => target.getNormals();\r\n break;\r\n case VertexBuffer.TangentKind:\r\n getTargetData = (target) => target.getTangents();\r\n break;\r\n case VertexBuffer.UVKind:\r\n getTargetData = (target) => target.getUVs();\r\n break;\r\n case VertexBuffer.UV2Kind:\r\n getTargetData = (target) => target.getUV2s();\r\n break;\r\n case VertexBuffer.ColorKind:\r\n getTargetData = (target) => target.getColors();\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n for (let index = 0; index < data.length; index++) {\r\n let value = data[index];\r\n for (let targetCount = 0; targetCount < morphTargetManager.numTargets; targetCount++) {\r\n const target = morphTargetManager.getTarget(targetCount);\r\n const influence = target.influence;\r\n if (influence !== 0) {\r\n const targetData = getTargetData(target);\r\n if (targetData) {\r\n value += (targetData[index] - data[index]) * influence;\r\n }\r\n }\r\n }\r\n data[index] = value;\r\n }\r\n}\r\n\r\nfunction ApplySkeleton(\r\n data: FloatArray,\r\n kind: string,\r\n skeletonMatrices: Float32Array,\r\n matricesIndicesData: FloatArray,\r\n matricesWeightsData: FloatArray,\r\n matricesIndicesExtraData: Nullable<FloatArray>,\r\n matricesWeightsExtraData: Nullable<FloatArray>\r\n): void {\r\n const tempVector = TmpVectors.Vector3[0];\r\n const finalMatrix = TmpVectors.Matrix[0];\r\n const tempMatrix = TmpVectors.Matrix[1];\r\n\r\n const transformFromFloatsToRef = kind === VertexBuffer.NormalKind ? Vector3.TransformNormalFromFloatsToRef : Vector3.TransformCoordinatesFromFloatsToRef;\r\n\r\n for (let index = 0, matWeightIdx = 0; index < data.length; index += 3, matWeightIdx += 4) {\r\n finalMatrix.reset();\r\n\r\n let inf: number;\r\n let weight: number;\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsData[matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesData[matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n if (matricesIndicesExtraData && matricesWeightsExtraData) {\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsExtraData[matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesExtraData[matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n }\r\n\r\n transformFromFloatsToRef(data[index], data[index + 1], data[index + 2], finalMatrix, tempVector);\r\n tempVector.toArray(data, index);\r\n }\r\n}\r\n\r\n/**\r\n * Opaque cache when computing data about a mesh\r\n */\r\nexport interface IMeshDataCache {\r\n /** @internal */\r\n _outputData?: Float32Array;\r\n\r\n /** @internal */\r\n _vertexData?: { [kind: string]: Float32Array };\r\n}\r\n\r\n/**\r\n * Options when computing data about a mesh\r\n */\r\nexport interface IMeshDataOptions {\r\n /** Apply skeleton when computing the bounding info. Defaults to false. */\r\n applySkeleton?: boolean;\r\n\r\n /** Apply morph when computing the bounding info. Defaults to false. */\r\n applyMorph?: boolean;\r\n\r\n /** Update the cached positions stored as a Vector3 array. Defaults to true. */\r\n updatePositionsArray?: boolean;\r\n\r\n /**\r\n * Cache to avoid redundant allocations and computations when computing the bounding info multiple times. Pass in\r\n * an initial empty object and continue with subsequent calls using the same object. Caching is disabled by default.\r\n */\r\n cache?: IMeshDataCache;\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass _FacetDataStorage {\r\n // facetData private properties\r\n public facetPositions: Vector3[]; // facet local positions\r\n public facetNormals: Vector3[]; // facet local normals\r\n public facetPartitioning: number[][]; // partitioning array of facet index arrays\r\n public facetNb: number = 0; // facet number\r\n public partitioningSubdivisions: number = 10; // number of subdivisions per axis in the partitioning space\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public partitioningBBoxRatio: number = 1.01; // the partitioning array space is by default 1% bigger than the bounding box\r\n public facetDataEnabled: boolean = false; // is the facet data feature enabled on this mesh ?\r\n public facetParameters: any = {}; // keep a reference to the object parameters to avoid memory re-allocation\r\n public bbSize: Vector3 = Vector3.Zero(); // bbox size approximated for facet data\r\n public subDiv = {\r\n // actual number of subdivisions per axis for ComputeNormals()\r\n max: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n X: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n Y: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n Z: 1,\r\n };\r\n\r\n public facetDepthSort: boolean = false; // is the facet depth sort to be computed\r\n public facetDepthSortEnabled: boolean = false; // is the facet depth sort initialized\r\n public depthSortedIndices: IndicesArray; // copy of the indices array to store them once sorted\r\n public depthSortedFacets: { ind: number; sqDistance: number }[]; // array of depth sorted facets\r\n public facetDepthSortFunction: (f1: { ind: number; sqDistance: number }, f2: { ind: number; sqDistance: number }) => number; // facet depth sort function\r\n public facetDepthSortFrom: Vector3; // location where to depth sort from\r\n public facetDepthSortOrigin: Vector3; // same as facetDepthSortFrom but expressed in the mesh local space\r\n\r\n public invertedMatrix: Matrix; // Inverted world matrix.\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass _InternalAbstractMeshDataInfo {\r\n public _hasVertexAlpha = false;\r\n public _useVertexColors = true;\r\n public _numBoneInfluencers = 4;\r\n public _applyFog = true;\r\n public _receiveShadows = false;\r\n public _facetData = new _FacetDataStorage();\r\n public _visibility = 1.0;\r\n public _skeleton: Nullable<Skeleton> = null;\r\n public _layerMask: number = 0x0fffffff;\r\n public _computeBonesUsingShaders = true;\r\n public _isActive = false;\r\n public _onlyForInstances = false;\r\n public _isActiveIntermediate = false;\r\n public _onlyForInstancesIntermediate = false;\r\n public _actAsRegularMesh = false;\r\n public _currentLOD: Map<Camera, [Nullable<AbstractMesh>, number]> = new Map();\r\n public _collisionRetryCount: number = 3;\r\n public _morphTargetManager: Nullable<MorphTargetManager> = null;\r\n public _renderingGroupId = 0;\r\n public _bakedVertexAnimationManager: Nullable<IBakedVertexAnimationManager> = null;\r\n public _material: Nullable<Material> = null;\r\n public _materialForRenderPass: Array<Material | undefined>; // map a render pass id (index in the array) to a Material\r\n public _positions: Nullable<Vector3[]> = null;\r\n public _pointerOverDisableMeshTesting: boolean = false;\r\n // Collisions\r\n public _meshCollisionData = new _MeshCollisionData();\r\n public _enableDistantPicking = false;\r\n /** @internal\r\n * Bounding info that is unnafected by the addition of thin instances\r\n */\r\n public _rawBoundingInfo: Nullable<BoundingInfo> = null;\r\n /** @internal\r\n * This value will indicate us that at some point, the mesh was specifically used with the opposite winding order\r\n * We use that as a clue to force the material to sideOrientation = null\r\n */\r\n public _sideOrientationHint = false;\r\n /**\r\n * Used in frame graph mode only, to know which meshes to update when in frozen mode\r\n */\r\n public _wasActiveLastFrame = false;\r\n}\r\n\r\n/**\r\n * Class used to store all common mesh properties\r\n */\r\nexport abstract class AbstractMesh extends TransformNode implements IDisposable, ICullable, IGetSetVerticesData {\r\n /** No occlusion */\r\n public static OCCLUSION_TYPE_NONE = 0;\r\n /** Occlusion set to optimistic */\r\n public static OCCLUSION_TYPE_OPTIMISTIC = 1;\r\n /** Occlusion set to strict */\r\n public static OCCLUSION_TYPE_STRICT = 2;\r\n /** Use an accurate occlusion algorithm */\r\n public static OCCLUSION_ALGORITHM_TYPE_ACCURATE = 0;\r\n /** Use a conservative occlusion algorithm */\r\n public static OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE = 1;\r\n\r\n /** Default culling strategy : this is an exclusion test and it's the more accurate.\r\n * Test order :\r\n * Is the bounding sphere outside the frustum ?\r\n * If not, are the bounding box vertices outside the frustum ?\r\n * It not, then the cullable object is in the frustum.\r\n */\r\n public static readonly CULLINGSTRATEGY_STANDARD = Constants.MESHES_CULLINGSTRATEGY_STANDARD;\r\n /** Culling strategy : Bounding Sphere Only.\r\n * This is an exclusion test. It's faster than the standard strategy because the bounding box is not tested.\r\n * It's also less accurate than the standard because some not visible objects can still be selected.\r\n * Test : is the bounding sphere outside the frustum ?\r\n * If not, then the cullable object is in the frustum.\r\n */\r\n public static readonly CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = Constants.MESHES_CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY;\r\n /** Culling strategy : Optimistic Inclusion.\r\n * This in an inclusion test first, then the standard exclusion test.\r\n * This can be faster when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the standard test when the tested object center is not the frustum but one of its bounding box vertex is still inside.\r\n * Anyway, it's as accurate as the standard strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the default culling strategy.\r\n */\r\n public static readonly CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION;\r\n /** Culling strategy : Optimistic Inclusion then Bounding Sphere Only.\r\n * This in an inclusion test first, then the bounding sphere only exclusion test.\r\n * This can be the fastest test when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the BoundingSphereOnly strategy when the tested object center is not in the frustum but its bounding sphere still intersects it.\r\n * It's less accurate than the standard strategy and as accurate as the BoundingSphereOnly strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the Bounding Sphere Only strategy. No Bounding Box is tested here.\r\n */\r\n public static readonly CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY;\r\n\r\n /**\r\n * No billboard\r\n */\r\n public static override get BILLBOARDMODE_NONE(): number {\r\n return TransformNode.BILLBOARDMODE_NONE;\r\n }\r\n\r\n /** Billboard on X axis */\r\n public static override get BILLBOARDMODE_X(): number {\r\n return TransformNode.BILLBOARDMODE_X;\r\n }\r\n\r\n /** Billboard on Y axis */\r\n public static override get BILLBOARDMODE_Y(): number {\r\n return TransformNode.BILLBOARDMODE_Y;\r\n }\r\n\r\n /** Billboard on Z axis */\r\n public static override get BILLBOARDMODE_Z(): number {\r\n return TransformNode.BILLBOARDMODE_Z;\r\n }\r\n\r\n /** Billboard on all axes */\r\n public static override get BILLBOARDMODE_ALL(): number {\r\n return TransformNode.BILLBOARDMODE_ALL;\r\n }\r\n\r\n /** Billboard on using position instead of orientation */\r\n public static override get BILLBOARDMODE_USE_POSITION(): number {\r\n return TransformNode.BILLBOARDMODE_USE_POSITION;\r\n }\r\n\r\n // Internal data\r\n /** @internal */\r\n public _internalAbstractMeshDataInfo = new _InternalAbstractMeshDataInfo();\r\n\r\n /** @internal */\r\n public _waitingMaterialId: Nullable<string> = null;\r\n\r\n /** @internal */\r\n public _waitingMorphTargetManagerId: Nullable<number> = null;\r\n\r\n /**\r\n * The culling strategy to use to check whether the mesh must be rendered or not.\r\n * This value can be changed at any time and will be used on the next render mesh selection.\r\n * The possible values are :\r\n * - AbstractMesh.CULLINGSTRATEGY_STANDARD\r\n * - AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY\r\n * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION\r\n * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY\r\n * Please read each static variable documentation to get details about the culling process.\r\n * */\r\n public cullingStrategy = AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY;\r\n\r\n /**\r\n * Gets the number of facets in the mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\r\n */\r\n public get facetNb(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.facetNb;\r\n }\r\n /**\r\n * Gets or set the number (integer) of subdivisions per axis in the partitioning space\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\r\n */\r\n public get partitioningSubdivisions(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions;\r\n }\r\n public set partitioningSubdivisions(nb: number) {\r\n this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions = nb;\r\n }\r\n /**\r\n * The ratio (float) to apply to the bounding box size to set to the partitioning space.\r\n * Ex : 1.01 (default) the partitioning space is 1% bigger than the bounding box\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get partitioningBBoxRatio(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public set partitioningBBoxRatio(ratio: number) {\r\n this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio = ratio;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the facets must be depth sorted on next call to `updateFacetData()`.\r\n * Works only for updatable meshes.\r\n * Doesn't work with multi-materials\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\r\n */\r\n public get mustDepthSortFacets(): boolean {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSort;\r\n }\r\n public set mustDepthSortFacets(sort: boolean) {\r\n this._internalAbstractMeshDataInfo._facetData.facetDepthSort = sort;\r\n }\r\n\r\n /**\r\n * The location (Vector3) where the facet depth sort must be computed from.\r\n * By default, the active camera position.\r\n * Used only when facet depth sort is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\r\n */\r\n public get facetDepthSortFrom(): Vector3 {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom;\r\n }\r\n public set facetDepthSortFrom(location: Vector3) {\r\n this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom = location;\r\n }\r\n\r\n /** number of collision detection tries. Change this value if not all collisions are detected and handled properly */\r\n public get collisionRetryCount(): number {\r\n return this._internalAbstractMeshDataInfo._collisionRetryCount;\r\n }\r\n public set collisionRetryCount(retryCount: number) {\r\n this._internalAbstractMeshDataInfo._collisionRetryCount = retryCount;\r\n }\r\n /**\r\n * gets a boolean indicating if facetData is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\r\n */\r\n public get isFacetDataEnabled(): boolean {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDataEnabled;\r\n }\r\n\r\n /**\r\n * Gets or sets the morph target manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\r\n */\r\n public get morphTargetManager(): Nullable<MorphTargetManager> {\r\n return this._internalAbstractMeshDataInfo._morphTargetManager;\r\n }\r\n\r\n public set morphTargetManager(value: Nullable<MorphTargetManager>) {\r\n if (this._internalAbstractMeshDataInfo._morphTargetManager === value) {\r\n return;\r\n }\r\n this._internalAbstractMeshDataInfo._morphTargetManager = value;\r\n this._syncGeometryWithMorphTargetManager();\r\n }\r\n\r\n /**\r\n * Gets or sets the baked vertex animation manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/baked_texture_animations\r\n */\r\n public get bakedVertexAnimationManager(): Nullable<IBakedVertexAnimationManager> {\r\n return this._internalAbstractMeshDataInfo._bakedVertexAnimationManager;\r\n }\r\n\r\n public set bakedVertexAnimationManager(value: Nullable<IBakedVertexAnimationManager>) {\r\n if (this._internalAbstractMeshDataInfo._bakedVertexAnimationManager === value) {\r\n return;\r\n }\r\n this._internalAbstractMeshDataInfo._bakedVertexAnimationManager = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** @internal */\r\n public _syncGeometryWithMorphTargetManager(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _updateNonUniformScalingState(value: boolean): boolean {\r\n if (!super._updateNonUniformScalingState(value)) {\r\n return false;\r\n }\r\n this._markSubMeshesAsMiscDirty();\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public get rawBoundingInfo(): Nullable<BoundingInfo> {\r\n return this._internalAbstractMeshDataInfo._rawBoundingInfo;\r\n }\r\n public set rawBoundingInfo(boundingInfo: Nullable<BoundingInfo>) {\r\n this._internalAbstractMeshDataInfo._rawBoundingInfo = boundingInfo;\r\n }\r\n\r\n // Events\r\n\r\n /**\r\n * An event triggered when this mesh collides with another one\r\n */\r\n public onCollideObservable = new Observable<AbstractMesh>();\r\n\r\n /** Set a function to call when this mesh collides with another one */\r\n public set onCollide(callback: (collidedMesh?: AbstractMesh) => void) {\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver) {\r\n this.onCollideObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver);\r\n }\r\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver = this.onCollideObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the collision's position changes\r\n */\r\n public onCollisionPositionChangeObservable = new Observable<Vector3>();\r\n\r\n /** Set a function to call when the collision's position changes */\r\n public set onCollisionPositionChange(callback: () => void) {\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver) {\r\n this.onCollisionPositionChangeObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver);\r\n }\r\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver = this.onCollisionPositionChangeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when material is changed\r\n */\r\n public onMaterialChangedObservable = new Observable<AbstractMesh>();\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets or sets the orientation for POV movement & rotation\r\n */\r\n public definedFacingForward = true;\r\n\r\n /** @internal */\r\n public _occlusionQuery: Nullable<WebGLQuery | number> = null;\r\n\r\n /** @internal */\r\n public _renderingGroup: Nullable<RenderingGroup> = null;\r\n\r\n /**\r\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\r\n */\r\n public get visibility(): number {\r\n return this._internalAbstractMeshDataInfo._visibility;\r\n }\r\n\r\n /**\r\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\r\n */\r\n public set visibility(value: number) {\r\n if (this._internalAbstractMeshDataInfo._visibility === value) {\r\n return;\r\n }\r\n\r\n const oldValue = this._internalAbstractMeshDataInfo._visibility;\r\n\r\n this._internalAbstractMeshDataInfo._visibility = value;\r\n\r\n if ((oldValue === 1 && value !== 1) || (oldValue !== 1 && value === 1)) {\r\n this._markSubMeshesAsDirty((defines) => {\r\n defines.markAsMiscDirty();\r\n defines.markAsPrePassDirty();\r\n });\r\n }\r\n }\r\n\r\n /** Gets or sets the alpha index used to sort transparent meshes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#alpha-index\r\n */\r\n public alphaIndex = Number.MAX_VALUE;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be picked (by scene.pick for instance or through actions). Default is true\r\n */\r\n public isPickable = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be near picked (touched by the XR controller or hands). Default is false\r\n */\r\n public isNearPickable = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be grabbed. Default is false.\r\n * Setting this to true, while using the XR near interaction feature, will trigger a pointer event when the mesh is grabbed.\r\n * Grabbing means that the controller is using the squeeze or main trigger button to grab the mesh.\r\n * This is different from nearPickable which only triggers the event when the mesh is touched by the controller\r\n */\r\n public isNearGrabbable = false;\r\n\r\n /** Gets or sets a boolean indicating that bounding boxes of subMeshes must be rendered as well (false by default) */\r\n public showSubMeshesBoundingBox = false;\r\n\r\n /** Gets or sets a boolean indicating if the mesh must be considered as a ray blocker for lens flares (false by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare\r\n */\r\n public isBlocker = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that pointer move events must be supported on this mesh (false by default)\r\n */\r\n public enablePointerMoveEvents = false;\r\n\r\n /**\r\n * Gets or sets the property which disables the test that is checking that the mesh under the pointer is the same than the previous time we tested for it (default: false).\r\n * Set this property to true if you want thin instances picking to be reported accurately when moving over the mesh.\r\n * Note that setting this property to true will incur some performance penalties when dealing with pointer events for this mesh so use it sparingly.\r\n */\r\n public get pointerOverDisableMeshTesting() {\r\n return this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting;\r\n }\r\n\r\n public set pointerOverDisableMeshTesting(disable: boolean) {\r\n this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting = disable;\r\n }\r\n\r\n /**\r\n * Specifies the rendering group id for this mesh (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#rendering-groups\r\n */\r\n public get renderingGroupId() {\r\n return this._internalAbstractMeshDataInfo._renderingGroupId;\r\n }\r\n\r\n public set renderingGroupId(value: number) {\r\n this._internalAbstractMeshDataInfo._renderingGroupId = value;\r\n }\r\n\r\n /** Gets or sets current material */\r\n public get material(): Nullable<Material> {\r\n return this._internalAbstractMeshDataInfo._material;\r\n }\r\n public set material(value: Nullable<Material>) {\r\n this._setMaterial(value);\r\n }\r\n\r\n /** @internal */\r\n protected _setMaterial(value: Nullable<Material>) {\r\n if (this._internalAbstractMeshDataInfo._material === value) {\r\n return;\r\n }\r\n\r\n // remove from material mesh map id needed\r\n if (this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap) {\r\n this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = undefined;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._material = value;\r\n\r\n if (value && value.meshMap) {\r\n value.meshMap[this.uniqueId] = this;\r\n }\r\n\r\n if (this.onMaterialChangedObservable.hasObservers()) {\r\n this.onMaterialChangedObservable.notifyObservers(this);\r\n }\r\n\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n this.resetDrawCache(undefined, value == null);\r\n this._unBindEffect();\r\n }\r\n\r\n /**\r\n * Gets the material used to render the mesh in a specific render pass\r\n * @param renderPassId render pass id\r\n * @returns material used for the render pass. If no specific material is used for this render pass, undefined is returned (meaning mesh.material is used for this pass)\r\n */\r\n public getMaterialForRenderPass(renderPassId: number): Material | undefined {\r\n return this._internalAbstractMeshDataInfo._materialForRenderPass?.[renderPassId];\r\n }\r\n\r\n /**\r\n * Sets the material to be used to render the mesh in a specific render pass\r\n * @param renderPassId render pass id\r\n * @param material material to use for this render pass. If undefined is passed, no specific material will be used for this render pass but the regular material will be used instead (mesh.material)\r\n */\r\n public setMaterialForRenderPass(renderPassId: number, material?: Material): void {\r\n this.resetDrawCache(renderPassId);\r\n if (!this._internalAbstractMeshDataInfo._materialForRenderPass) {\r\n this._internalAbstractMeshDataInfo._materialForRenderPass = [];\r\n }\r\n const currentMaterial = this._internalAbstractMeshDataInfo._materialForRenderPass[renderPassId];\r\n if (currentMaterial?.meshMap?.[this.uniqueId]) {\r\n currentMaterial.meshMap[this.uniqueId] = undefined;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._materialForRenderPass[renderPassId] = material;\r\n if (material && material.meshMap) {\r\n material.meshMap[this.uniqueId] = this;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh can receive realtime shadows\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows\r\n */\r\n public get receiveShadows(): boolean {\r\n return this._internalAbstractMeshDataInfo._receiveShadows;\r\n }\r\n public set receiveShadows(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._receiveShadows === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._receiveShadows = value;\r\n this._markSubMeshesAsLightDirty();\r\n }\r\n\r\n /** Defines color to use when rendering outline */\r\n public outlineColor = Color3.Red();\r\n /** Define width to use when rendering outline */\r\n public outlineWidth = 0.02;\r\n\r\n /** Defines color to use when rendering overlay */\r\n public overlayColor = Color3.Red();\r\n /** Defines alpha to use when rendering overlay */\r\n public overlayAlpha = 0.5;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh needs to use vertex alpha data to render.\r\n * This property is misnamed and should be `useVertexAlpha`. Note that the mesh will be rendered\r\n * with alpha blending when this flag is set even if vertex alpha data is missing from the geometry.\r\n */\r\n public get hasVertexAlpha(): boolean {\r\n return this._internalAbstractMeshDataInfo._hasVertexAlpha;\r\n }\r\n public set hasVertexAlpha(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._hasVertexAlpha === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._hasVertexAlpha = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n this._markSubMeshesAsMiscDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this mesh needs to use vertex color data to render (if this kind of vertex data is available in the geometry) */\r\n public get useVertexColors(): boolean {\r\n return this._internalAbstractMeshDataInfo._useVertexColors;\r\n }\r\n public set useVertexColors(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._useVertexColors === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._useVertexColors = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that bone animations must be computed by the GPU (true by default)\r\n */\r\n public get computeBonesUsingShaders(): boolean {\r\n return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;\r\n }\r\n public set computeBonesUsingShaders(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._computeBonesUsingShaders === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._computeBonesUsingShaders = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** Gets or sets the number of allowed bone influences per vertex (4 by default) */\r\n public get numBoneInfluencers(): number {\r\n return this._internalAbstractMeshDataInfo._numBoneInfluencers;\r\n }\r\n public set numBoneInfluencers(value: number) {\r\n if (this._internalAbstractMeshDataInfo._numBoneInfluencers === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._numBoneInfluencers = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this mesh will allow fog to be rendered on it (true by default) */\r\n public get applyFog(): boolean {\r\n return this._internalAbstractMeshDataInfo._applyFog;\r\n }\r\n public set applyFog(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._applyFog === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._applyFog = value;\r\n this._markSubMeshesAsMiscDirty();\r\n }\r\n\r\n /** When enabled, decompose picking matrices for better precision with large values for mesh position and scling */\r\n public get enableDistantPicking(): boolean {\r\n return this._internalAbstractMeshDataInfo._enableDistantPicking;\r\n }\r\n public set enableDistantPicking(value: boolean) {\r\n this._internalAbstractMeshDataInfo._enableDistantPicking = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes selection (true by default) */\r\n public useOctreeForRenderingSelection = true;\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes picking (true by default) */\r\n public useOctreeForPicking = true;\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes collision (true by default) */\r\n public useOctreeForCollisions = true;\r\n /**\r\n * Gets or sets the current layer mask (default is 0x0FFFFFFF)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/layerMasksAndMultiCam\r\n */\r\n public get layerMask(): number {\r\n return this._internalAbstractMeshDataInfo._layerMask;\r\n }\r\n\r\n public set layerMask(value: number) {\r\n if (value === this._internalAbstractMeshDataInfo._layerMask) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._layerMask = value;\r\n this._resyncLightSources();\r\n }\r\n\r\n /**\r\n * True if the mesh must be rendered in any case (this will shortcut the frustum clipping phase)\r\n */\r\n public alwaysSelectAsActiveMesh = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the bounding info does not need to be kept in sync (for performance reason)\r\n */\r\n public doNotSyncBoundingInfo = false;\r\n\r\n /**\r\n * Gets or sets the current action manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions\r\n */\r\n public actionManager: Nullable<AbstractActionManager> = null;\r\n\r\n /**\r\n * Gets or sets the ellipsoid used to impersonate this mesh when using collision engine (default is (0.5, 1, 0.5))\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public ellipsoid = new Vector3(0.5, 1, 0.5);\r\n /**\r\n * Gets or sets the ellipsoid offset used to impersonate this mesh when using collision engine (default is (0, 0, 0))\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public ellipsoidOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets a collision mask used to mask collisions (default is -1).\r\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\r\n */\r\n public get collisionMask(): number {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask;\r\n }\r\n\r\n public set collisionMask(mask: number) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * Gets or sets a collision response flag (default is true).\r\n * when collisionResponse is false, events are still triggered but colliding entity has no response\r\n * This helps creating trigger volume when user wants collision feedback events but not position/velocity\r\n * to respond to the collision.\r\n */\r\n public get collisionResponse(): boolean {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse;\r\n }\r\n\r\n public set collisionResponse(response: boolean) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse = response;\r\n }\r\n /**\r\n * Gets or sets the current collision group mask (-1 by default).\r\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\r\n */\r\n public get collisionGroup(): number {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup;\r\n }\r\n\r\n public set collisionGroup(mask: number) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * Gets or sets current surrounding meshes (null by default).\r\n *\r\n * By default collision detection is tested against every mesh in the scene.\r\n * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified\r\n * meshes will be tested for the collision.\r\n *\r\n * Note: if set to an empty array no collision will happen when this mesh is moved.\r\n */\r\n public get surroundingMeshes(): Nullable<AbstractMesh[]> {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes;\r\n }\r\n\r\n public set surroundingMeshes(meshes: Nullable<AbstractMesh[]>) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes = meshes;\r\n }\r\n\r\n // Edges\r\n /**\r\n * Defines edge width used when edgesRenderer is enabled\r\n * @see https://www.babylonjs-playground.com/#10OJSG#13\r\n */\r\n public edgesWidth = 1;\r\n /**\r\n * Defines edge color used when edgesRenderer is enabled\r\n * @see https://www.babylonjs-playground.com/#10OJSG#13\r\n */\r\n public edgesColor = new Color4(1, 0, 0, 1);\r\n /** @internal */\r\n public _edgesRenderer: Nullable<IEdgesRenderer> = null;\r\n\r\n /** @internal */\r\n public _masterMesh: Nullable<AbstractMesh> = null;\r\n protected _boundingInfo: Nullable<BoundingInfo> = null;\r\n protected _boundingInfoIsDirty = true;\r\n /** @internal */\r\n public _renderId = 0;\r\n\r\n /**\r\n * Gets or sets the list of subMeshes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\r\n */\r\n public subMeshes: SubMesh[];\r\n\r\n /** @internal */\r\n public _intersectionsInProgress = new Array<AbstractMesh>();\r\n\r\n /** @internal */\r\n public _unIndexed = false;\r\n\r\n /** @internal */\r\n public _lightSources = new Array<Light>();\r\n\r\n /** Gets the list of lights affecting that mesh */\r\n public get lightSources(): Light[] {\r\n return this._lightSources;\r\n }\r\n\r\n /** @internal */\r\n public abstract get _positions(): Nullable<Vector3[]>;\r\n\r\n // Loading properties\r\n /** @internal */\r\n public _waitingData: {\r\n lods: Nullable<any>;\r\n actions: Nullable<any>;\r\n freezeWorldMatrix: Nullable<boolean>;\r\n } = {\r\n lods: null,\r\n actions: null,\r\n freezeWorldMatrix: null,\r\n };\r\n\r\n /** @internal */\r\n public _bonesTransformMatrices: Nullable<Float32Array> = null;\r\n\r\n /** @internal */\r\n public _transformMatrixTexture: Nullable<RawTexture> = null;\r\n\r\n /**\r\n * Gets or sets a skeleton to apply skinning transformations\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons\r\n */\r\n public set skeleton(value: Nullable<Skeleton>) {\r\n const skeleton = this._internalAbstractMeshDataInfo._skeleton;\r\n if (skeleton && skeleton.needInitialSkinMatrix) {\r\n skeleton._unregisterMeshWithPoseMatrix(this);\r\n }\r\n\r\n if (value && value.needInitialSkinMatrix) {\r\n value._registerMeshWithPoseMatrix(this);\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._skeleton = value;\r\n\r\n if (!this._internalAbstractMeshDataInfo._skeleton) {\r\n this._bonesTransformMatrices = null;\r\n }\r\n\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n public get skeleton(): Nullable<Skeleton> {\r\n return this._internalAbstractMeshDataInfo._skeleton;\r\n }\r\n\r\n /**\r\n * An event triggered when the mesh is rebuilt.\r\n */\r\n public onRebuildObservable = new Observable<AbstractMesh>();\r\n\r\n /**\r\n * The current mesh uniform buffer.\r\n * @internal Internal use only.\r\n */\r\n public _uniformBuffer: UniformBuffer;\r\n\r\n // Constructor\r\n\r\n /**\r\n * Creates a new AbstractMesh\r\n * @param name defines the name of the mesh\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(name: string, scene: Nullable<Scene> = null) {\r\n super(name, scene, false);\r\n\r\n scene = this.getScene();\r\n\r\n scene.addMesh(this);\r\n\r\n this._resyncLightSources();\r\n\r\n // Mesh Uniform Buffer.\r\n this._uniformBuffer = new UniformBuffer(this.getScene().getEngine(), undefined, undefined, name, !this.getScene().getEngine().isWebGPU);\r\n this._buildUniformLayout();\r\n\r\n switch (scene.performancePriority) {\r\n case ScenePerformancePriority.Aggressive:\r\n this.doNotSyncBoundingInfo = true;\r\n // eslint-disable-next-line no-fallthrough\r\n case ScenePerformancePriority.Intermediate:\r\n this.alwaysSelectAsActiveMesh = true;\r\n this.isPickable = false;\r\n break;\r\n }\r\n }\r\n\r\n protected _buildUniformLayout(): void {\r\n this._uniformBuffer.addUniform(\"world\", 16);\r\n this._uniformBuffer.addUniform(\"visibility\", 1);\r\n this._uniformBuffer.create();\r\n }\r\n\r\n /**\r\n * Transfer the mesh values to its UBO.\r\n * @param world The world matrix associated with the mesh\r\n */\r\n public transferToEffect(world: Matrix): void {\r\n const ubo = this._uniformBuffer;\r\n\r\n ubo.updateMatrix(\"world\", world);\r\n ubo.updateFloat(\"visibility\", this._internalAbstractMeshDataInfo._visibility);\r\n\r\n ubo.update();\r\n }\r\n\r\n /**\r\n * Gets the mesh uniform buffer.\r\n * @returns the uniform buffer of the mesh.\r\n */\r\n public getMeshUniformBuffer(): UniformBuffer {\r\n return this._uniformBuffer;\r\n }\r\n\r\n /**\r\n * Returns the string \"AbstractMesh\"\r\n * @returns \"AbstractMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"AbstractMesh\";\r\n }\r\n\r\n /**\r\n * Gets a string representation of the current mesh\r\n * @param fullDetails defines a boolean indicating if full details must be included\r\n * @returns a string representation of the current mesh\r\n */\r\n public override toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name + \", isInstance: \" + (this.getClassName() === \"InstancedMesh\" ? \"YES\" : \"NO\");\r\n ret += \", # of submeshes: \" + (this.subMeshes ? this.subMeshes.length : 0);\r\n\r\n const skeleton = this._internalAbstractMeshDataInfo._skeleton;\r\n if (skeleton) {\r\n ret += \", skeleton: \" + skeleton.name;\r\n }\r\n if (fullDetails) {\r\n ret += \", billboard mode: \" + [\"NONE\", \"X\", \"Y\", null, \"Z\", null, null, \"ALL\"][this.billboardMode];\r\n ret += \", freeze wrld mat: \" + (this._isWorldMatrixFrozen || this._waitingData.freezeWorldMatrix ? \"YES\" : \"NO\");\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected override _getEffectiveParent(): Nullable<Node> {\r\n if (this._masterMesh && this.billboardMode !== TransformNode.BILLBOARDMODE_NONE) {\r\n return this._masterMesh;\r\n }\r\n\r\n return super._getEffectiveParent();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _getActionManagerForTrigger(trigger?: number, initialCall = true): Nullable<AbstractActionManager> {\r\n if (this.actionManager && (initialCall || this.actionManager.isRecursive)) {\r\n if (trigger) {\r\n if (this.actionManager.hasSpecificTrigger(trigger)) {\r\n return this.actionManager;\r\n }\r\n } else {\r\n return this.actionManager;\r\n }\r\n }\r\n\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n return this.parent._getActionManagerForTrigger(trigger, false);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _rebuild(dispose = false): void {\r\n this.onRebuildObservable.notifyObservers(this);\r\n\r\n if (this._occlusionQuery !== null) {\r\n this._occlusionQuery = null;\r\n }\r\n\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n subMesh._rebuild();\r\n }\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /** @internal */\r\n public _resyncLightSources(): void {\r\n this._lightSources.length = 0;\r\n\r\n for (const light of this.getScene().lights) {\r\n if (!light.isEnabled()) {\r\n continue;\r\n }\r\n\r\n if (light.canAffectMesh(this)) {\r\n this._lightSources.push(light);\r\n }\r\n }\r\n\r\n this._markSubMeshesAsLightDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _resyncLightSource(light: Light): void {\r\n const isIn = light.isEnabled() && light.canAffectMesh(this) && light.internalEnabled;\r\n\r\n const index = this._lightSources.indexOf(light);\r\n let removed = false;\r\n if (index === -1) {\r\n if (!isIn) {\r\n return;\r\n }\r\n this._lightSources.push(light);\r\n } else {\r\n if (isIn) {\r\n return;\r\n }\r\n removed = true;\r\n this._lightSources.splice(index, 1);\r\n }\r\n\r\n this._markSubMeshesAsLightDirty(removed);\r\n }\r\n\r\n /** @internal */\r\n public _unBindEffect() {\r\n for (const subMesh of this.subMeshes) {\r\n subMesh.setEffect(null);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _removeLightSource(light: Light, dispose: boolean): void {\r\n const index = this._lightSources.indexOf(light);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n this._lightSources.splice(index, 1);\r\n\r\n this._markSubMeshesAsLightDirty(dispose);\r\n }\r\n\r\n private _markSubMeshesAsDirty(func: (defines: MaterialDefines) => void) {\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n for (let i = 0; i < subMesh._drawWrappers.length; ++i) {\r\n const drawWrapper = subMesh._drawWrappers[i];\r\n if (!drawWrapper || !drawWrapper.defines || !(drawWrapper.defines as MaterialDefines).markAllAsDirty) {\r\n continue;\r\n }\r\n func(drawWrapper.defines as MaterialDefines);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _markSubMeshesAsLightDirty(dispose: boolean = false) {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsLightDirty(dispose));\r\n }\r\n\r\n /** @internal */\r\n public _markSubMeshesAsAttributesDirty() {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsAttributesDirty());\r\n }\r\n\r\n /** @internal */\r\n public _markSubMeshesAsMiscDirty() {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsMiscDirty());\r\n }\r\n\r\n /**\r\n * Flag the AbstractMesh as dirty (Forcing it to update everything)\r\n * @param property if set to \"rotation\" the objects rotationQuaternion will be set to null\r\n * @returns this AbstractMesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override markAsDirty(property?: string): AbstractMesh {\r\n this._currentRenderId = Number.MAX_VALUE;\r\n super.markAsDirty(property);\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache for all submeshes of this abstract mesh\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n * @param immediate If true, the effect will be released immediately, otherwise it will be released at the next frame\r\n */\r\n public resetDrawCache(passId?: number, immediate = false): void {\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n subMesh.resetDrawCache(passId, immediate);\r\n }\r\n }\r\n\r\n // Methods\r\n /**\r\n * Returns true if the mesh is blocked. Implemented by child classes\r\n */\r\n public get isBlocked(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns the mesh itself by default. Implemented by child classes\r\n * @param camera defines the camera to use to pick the right LOD level\r\n * @returns the currentAbstractMesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getLOD(camera: Camera): Nullable<AbstractMesh> {\r\n return this;\r\n }\r\n\r\n /**\r\n * The mesh's internal Geometry object. Implemented by child classes.\r\n */\r\n public abstract get geometry(): Nullable<Geometry>;\r\n\r\n /**\r\n * Returns 0 by default. Implemented by child classes\r\n * @returns an integer\r\n */\r\n public getTotalVertices(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Returns a positive integer : the total number of indices in this mesh geometry.\r\n * @returns the number of indices or zero if the mesh has no geometry.\r\n */\r\n public getTotalIndices(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Returns null by default. Implemented by child classes\r\n * @returns null\r\n */\r\n public getIndices(): Nullable<IndicesArray> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the array of the requested vertex data kind. Implemented by child classes\r\n * @param kind defines the vertex data kind to use\r\n * @returns null\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getVerticesData(kind: string): Nullable<FloatArray> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Copies the requested vertex data kind into the given vertex data map. Float data is constructed if the map doesn't have the data.\r\n * @param kind defines the vertex data kind to use\r\n * @param vertexData defines the map that stores the resulting data\r\n */\r\n public abstract copyVerticesData(kind: string, vertexData: { [kind: string]: Float32Array }): void;\r\n\r\n /**\r\n * Returns the mesh VertexBuffer object from the requested `kind`\r\n * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.NormalKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns a FloatArray or null if the mesh has no vertex buffer for this kind.\r\n */\r\n public abstract getVertexBuffer(kind: string, bypassInstanceData?: boolean): Nullable<VertexBuffer>;\r\n\r\n /**\r\n * Sets the vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.\r\n * Note that a new underlying VertexBuffer object is created each call.\r\n * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\r\n * @param kind defines vertex data kind:\r\n * * VertexBuffer.PositionKind\r\n * * VertexBuffer.UVKind\r\n * * VertexBuffer.UV2Kind\r\n * * VertexBuffer.UV3Kind\r\n * * VertexBuffer.UV4Kind\r\n * * VertexBuffer.UV5Kind\r\n * * VertexBuffer.UV6Kind\r\n * * VertexBuffer.ColorKind\r\n * * VertexBuffer.MatricesIndicesKind\r\n * * VertexBuffer.MatricesIndicesExtraKind\r\n * * VertexBuffer.MatricesWeightsKind\r\n * * VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updatable defines if the data must be flagged as updatable (or static)\r\n * @param stride defines the vertex stride (size of an entire vertex). Can be null and in this case will be deduced from vertex data kind\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setVerticesData(kind: string, data: FloatArray, updatable?: boolean, stride?: number): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the existing vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, it is simply returned as it is.\r\n * @param kind defines vertex data kind:\r\n * * VertexBuffer.PositionKind\r\n * * VertexBuffer.UVKind\r\n * * VertexBuffer.UV2Kind\r\n * * VertexBuffer.UV3Kind\r\n * * VertexBuffer.UV4Kind\r\n * * VertexBuffer.UV5Kind\r\n * * VertexBuffer.UV6Kind\r\n * * VertexBuffer.ColorKind\r\n * * VertexBuffer.MatricesIndicesKind\r\n * * VertexBuffer.MatricesIndicesExtraKind\r\n * * VertexBuffer.MatricesWeightsKind\r\n * * VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updateExtends If `kind` is `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed\r\n * @param makeItUnique If true, a new global geometry is created from this data and is set to the mesh\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the mesh indices,\r\n * If the mesh has no geometry, a new Geometry object is created and set to the mesh.\r\n * @param indices Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array)\r\n * @param totalVertices Defines the total number of vertices\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setIndices(indices: IndicesArray, totalVertices: Nullable<number>): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if specific vertex data is present\r\n * @param kind defines the vertex data kind to use\r\n * @returns true is data kind is present\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isVerticesDataPresent(kind: string): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns the mesh BoundingInfo object or creates a new one and returns if it was undefined.\r\n * Note that it returns a shallow bounding of the mesh (i.e. it does not include children).\r\n * However, if the mesh contains thin instances, it will be expanded to include them. If you want the \"raw\" bounding data instead, then use `getRawBoundingInfo()`.\r\n * To get the full bounding of all children, call `getHierarchyBoundingVectors` instead.\r\n * @returns a BoundingInfo\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this._masterMesh) {\r\n return this._masterMesh.getBoundingInfo();\r\n }\r\n\r\n if (this._boundingInfoIsDirty) {\r\n this._boundingInfoIsDirty = false;\r\n // this._boundingInfo is being created if undefined\r\n this._updateBoundingInfo();\r\n }\r\n // cannot be null.\r\n return this._boundingInfo!;\r\n }\r\n\r\n /**\r\n * Returns the bounding info unnafected by instance data.\r\n * @returns the bounding info of the mesh unaffected by instance data.\r\n */\r\n public getRawBoundingInfo() {\r\n return this.rawBoundingInfo ?? this.getBoundingInfo();\r\n }\r\n\r\n /**\r\n * Overwrite the current bounding info\r\n * @param boundingInfo defines the new bounding info\r\n * @returns the current mesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): AbstractMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns true if there is already a bounding info\r\n */\r\n public get hasBoundingInfo(): boolean {\r\n return this._boundingInfo !== null;\r\n }\r\n\r\n /**\r\n * Creates a new bounding info for the mesh\r\n * @param minimum min vector of the bounding box/sphere\r\n * @param maximum max vector of the bounding box/sphere\r\n * @param worldMatrix defines the new world matrix\r\n * @returns the new bounding info\r\n */\r\n public buildBoundingInfo(minimum: DeepImmutable<Vector3>, maximum: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>) {\r\n this._boundingInfo = new BoundingInfo(minimum, maximum, worldMatrix);\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)\r\n * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false\r\n * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false\r\n * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling\r\n * @returns the current mesh\r\n */\r\n public override normalizeToUnitCube(includeDescendants = true, ignoreRotation = false, predicate?: Nullable<(node: AbstractMesh) => boolean>): AbstractMesh {\r\n return <AbstractMesh>super.normalizeToUnitCube(includeDescendants, ignoreRotation, predicate);\r\n }\r\n\r\n /** Gets a boolean indicating if this mesh has skinning data and an attached skeleton */\r\n public get useBones(): boolean {\r\n return <boolean>(\r\n (this.skeleton &&\r\n this.getScene().skeletonsEnabled &&\r\n this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind) &&\r\n this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind))\r\n );\r\n }\r\n\r\n /** @internal */\r\n public _preActivate(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _preActivateForIntermediateRendering(renderId: number): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _activate(renderId: number, intermediateRendering: boolean): boolean {\r\n this._renderId = renderId;\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _postActivate(): void {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _freeze() {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _unFreeze() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Gets the current world matrix\r\n * @returns a Matrix\r\n */\r\n public override getWorldMatrix(): Matrix {\r\n if (this._masterMesh && this.billboardMode === TransformNode.BILLBOARDMODE_NONE) {\r\n return this._masterMesh.getWorldMatrix();\r\n }\r\n\r\n return super.getWorldMatrix();\r\n }\r\n\r\n /** @internal */\r\n public override _getWorldMatrixDeterminant(): number {\r\n if (this._masterMesh) {\r\n return this._masterMesh._getWorldMatrixDeterminant();\r\n }\r\n\r\n return super._getWorldMatrixDeterminant();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh is an instance or a regular mesh\r\n */\r\n public get isAnInstance(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh has instances\r\n */\r\n public get hasInstances(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh has thin instances\r\n */\r\n public get hasThinInstances(): boolean {\r\n return false;\r\n }\r\n\r\n // ================================== Point of View Movement =================================\r\n\r\n /**\r\n * Perform relative position change from the point of view of behind the front of the mesh.\r\n * This is performed taking into account the meshes current rotation, so you do not have to care.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param amountRight defines the distance on the right axis\r\n * @param amountUp defines the distance on the up axis\r\n * @param amountForward defines the distance on the forward axis\r\n * @returns the current mesh\r\n */\r\n public movePOV(amountRight: number, amountUp: number, amountForward: number): AbstractMesh {\r\n this.position.addInPlace(this.calcMovePOV(amountRight, amountUp, amountForward));\r\n return this;\r\n }\r\n\r\n /**\r\n * Calculate relative position change from the point of view of behind the front of the mesh.\r\n * This is performed taking into account the meshes current rotation, so you do not have to care.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param amountRight defines the distance on the right axis\r\n * @param amountUp defines the distance on the up axis\r\n * @param amountForward defines the distance on the forward axis\r\n * @returns the new displacement vector\r\n */\r\n public calcMovePOV(amountRight: number, amountUp: number, amountForward: number): Vector3 {\r\n const rotMatrix = new Matrix();\r\n const rotQuaternion = this.rotationQuaternion ? this.rotationQuaternion : Quaternion.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z);\r\n rotQuaternion.toRotationMatrix(rotMatrix);\r\n\r\n const translationDelta = Vector3.Zero();\r\n const defForwardMult = this.definedFacingForward ? -1 : 1;\r\n Vector3.TransformCoordinatesFromFloatsToRef(amountRight * defForwardMult, amountUp, amountForward * defForwardMult, rotMatrix, translationDelta);\r\n return translationDelta;\r\n }\r\n // ================================== Point of View Rotation =================================\r\n /**\r\n * Perform relative rotation change from the point of view of behind the front of the mesh.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param flipBack defines the flip\r\n * @param twirlClockwise defines the twirl\r\n * @param tiltRight defines the tilt\r\n * @returns the current mesh\r\n */\r\n public rotatePOV(flipBack: number, twirlClockwise: number, tiltRight: number): AbstractMesh {\r\n this.rotation.addInPlace(this.calcRotatePOV(flipBack, twirlClockwise, tiltRight));\r\n return this;\r\n }\r\n\r\n /**\r\n * Calculate relative rotation change from the point of view of behind the front of the mesh.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param flipBack defines the flip\r\n * @param twirlClockwise defines the twirl\r\n * @param tiltRight defines the tilt\r\n * @returns the new rotation vector\r\n */\r\n public calcRotatePOV(flipBack: number, twirlClockwise: number, tiltRight: number): Vector3 {\r\n const defForwardMult = this.definedFacingForward ? 1 : -1;\r\n return new Vector3(flipBack * defForwardMult, twirlClockwise, tiltRight * defForwardMult);\r\n }\r\n\r\n /**\r\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\r\n * This means the mesh underlying bounding box and sphere are recomputed.\r\n * @param options defines a set of options for computing the bounding info\r\n * @returns the current mesh\r\n */\r\n public abstract refreshBoundingInfo(options: IMeshDataOptions): AbstractMesh;\r\n\r\n /**\r\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\r\n * This means the mesh underlying bounding box and sphere are recomputed.\r\n * @param applySkeletonOrOptions defines whether to apply the skeleton before computing the bounding info or a set of options\r\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\r\n * @returns the current mesh\r\n */\r\n public abstract refreshBoundingInfo(applySkeletonOrOptions: boolean | IMeshDataOptions, applyMorph: boolean): AbstractMesh;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _refreshBoundingInfo(data: Nullable<FloatArray>, bias: Nullable<Vector2>): void {\r\n if (data) {\r\n const extend = extractMinAndMax(data, 0, this.getTotalVertices(), bias);\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n }\r\n\r\n if (this.subMeshes) {\r\n for (let index = 0; index < this.subMeshes.length; index++) {\r\n this.subMeshes[index].refreshBoundingInfo(data);\r\n }\r\n }\r\n\r\n this._updateBoundingInfo();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _refreshBoundingInfoDirect(extend: { minimum: Vector3; maximum: Vector3 }): void {\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n\r\n if (this.subMeshes) {\r\n for (let index = 0; index < this.subMeshes.length; index++) {\r\n this.subMeshes[index].refreshBoundingInfo(null);\r\n }\r\n }\r\n\r\n this._updateBoundingInfo();\r\n }\r\n\r\n // This function is only here so we can apply the nativeOverride decorator.\r\n @nativeOverride.filter(\r\n (...[data, matricesIndicesData, matricesWeightsData, matricesIndicesExtraData, matricesWeightsExtraData]: Parameters<typeof AbstractMesh._ApplySkeleton>) =>\r\n !Array.isArray(data) &&\r\n !Array.isArray(matricesIndicesData) &&\r\n !Array.isArray(matricesWeightsData) &&\r\n !Array.isArray(matricesIndicesExtraData) &&\r\n !Array.isArray(matricesWeightsExtraData)\r\n )\r\n private static _ApplySkeleton(\r\n data: FloatArray,\r\n kind: string,\r\n skeletonMatrices: Float32Array,\r\n matricesIndicesData: FloatArray,\r\n matricesWeightsData: FloatArray,\r\n matricesIndicesExtraData: Nullable<FloatArray>,\r\n matricesWeightsExtraData: Nullable<FloatArray>\r\n ): void {\r\n ApplySkeleton(data, kind, skeletonMatrices, matricesIndicesData, matricesWeightsData, matricesIndicesExtraData, matricesWeightsExtraData);\r\n }\r\n\r\n /** @internal */\r\n public _getData(options: IMeshDataOptions, data: Nullable<FloatArray>, kind: string = VertexBuffer.PositionKind): Nullable<FloatArray> {\r\n const cache = options.cache;\r\n\r\n const getVertexData = (kind: string): Nullable<FloatArray> => {\r\n if (cache) {\r\n const vertexData = (cache._vertexData ||= {});\r\n if (!vertexData[kind]) {\r\n this.copyVerticesData(kind, vertexData);\r\n }\r\n return vertexData[kind];\r\n }\r\n\r\n return this.getVerticesData(kind);\r\n };\r\n\r\n data ||= getVertexData(kind);\r\n if (!data) {\r\n return null;\r\n }\r\n\r\n if (cache) {\r\n if (cache._outputData) {\r\n cache._outputData.set(data);\r\n } else {\r\n cache._outputData = new Float32Array(data);\r\n }\r\n\r\n data = cache._outputData;\r\n } else if ((options.applyMorph && this.morphTargetManager) || (options.applySkeleton && this.skeleton)) {\r\n data = data.slice();\r\n }\r\n\r\n if (options.applyMorph && this.morphTargetManager) {\r\n ApplyMorph(data, kind, this.morphTargetManager);\r\n }\r\n\r\n if (options.applySkeleton && this.skeleton) {\r\n const matricesIndicesData = getVertexData(VertexBuffer.MatricesIndicesKind);\r\n const matricesWeightsData = getVertexData(VertexBuffer.MatricesWeightsKind);\r\n if (matricesWeightsData && matricesIndicesData) {\r\n const needExtras = this.numBoneInfluencers > 4;\r\n const matricesIndicesExtraData = needExtras ? getVertexData(VertexBuffer.MatricesIndicesExtraKind) : null;\r\n const matricesWeightsExtraData = needExtras ? getVertexData(VertexBuffer.MatricesWeightsExtraKind) : null;\r\n const skeletonMatrices = this.skeleton.getTransformMatrices(this);\r\n AbstractMesh._ApplySkeleton(data, kind, skeletonMatrices, matricesIndicesData, matricesWeightsData, matricesIndicesExtraData, matricesWeightsExtraData);\r\n }\r\n }\r\n\r\n if (options.updatePositionsArray !== false && kind === VertexBuffer.PositionKind) {\r\n const positions = this._internalAbstractMeshDataInfo._positions || [];\r\n const previousLength = positions.length;\r\n positions.length = data.length / 3;\r\n if (previousLength < positions.length) {\r\n for (let positionIndex = previousLength; positionIndex < positions.length; positionIndex++) {\r\n positions[positionIndex] = new Vector3();\r\n }\r\n }\r\n\r\n for (let positionIndex = 0, dataIndex = 0; positionIndex < positions.length; positionIndex++, dataIndex += 3) {\r\n positions[positionIndex].copyFromFloats(data[dataIndex], data[dataIndex + 1], data[dataIndex + 2]);\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._positions = positions;\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Get the normals vertex data and optionally apply skeleton and morphing.\r\n * @param applySkeleton defines whether to apply the skeleton\r\n * @param applyMorph defines whether to apply the morph target\r\n * @returns the normals data\r\n */\r\n public getNormalsData(applySkeleton = false, applyMorph = false): Nullable<FloatArray> {\r\n return this._getData({ applySkeleton, applyMorph, updatePositionsArray: false }, null, VertexBuffer.NormalKind);\r\n }\r\n\r\n /**\r\n * Get the position vertex data and optionally apply skeleton and morphing.\r\n * @param applySkeleton defines whether to apply the skeleton\r\n * @param applyMorph defines whether to apply the morph target\r\n * @param data defines the position data to apply the skeleton and morph to\r\n * @returns the position data\r\n */\r\n public getPositionData(applySkeleton: boolean = false, applyMorph: boolean = false, data: Nullable<FloatArray> = null): Nullable<FloatArray> {\r\n return this._getData({ applySkeleton, applyMorph, updatePositionsArray: false }, data, VertexBuffer.PositionKind);\r\n }\r\n\r\n /** @internal */\r\n public _updateBoundingInfo(): AbstractMesh {\r\n if (this._boundingInfo) {\r\n this._boundingInfo.update(this.worldMatrixFromCache);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(Vector3.Zero(), Vector3.Zero(), this.worldMatrixFromCache);\r\n }\r\n this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateSubMeshesBoundingInfo(matrix: DeepImmutable<Matrix>): AbstractMesh {\r\n if (!this.subMeshes) {\r\n return this;\r\n }\r\n const count = this.subMeshes.length;\r\n for (let subIndex = 0; subIndex < count; subIndex++) {\r\n const subMesh = this.subMeshes[subIndex];\r\n if (count > 1 || !subMesh.IsGlobal) {\r\n subMesh.updateBoundingInfo(matrix);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n protected override _afterComputeWorldMatrix(): void {\r\n if (this.doNotSyncBoundingInfo) {\r\n return;\r\n }\r\n // Bounding info\r\n this._boundingInfoIsDirty = true;\r\n }\r\n\r\n /**\r\n * Returns `true` if the mesh is within the frustum defined by the passed array of planes.\r\n * A mesh is in the frustum if its bounding box intersects the frustum\r\n * @param frustumPlanes defines the frustum to test\r\n * @returns true if the mesh is in the frustum planes\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n return this.getBoundingInfo().isInFrustum(frustumPlanes, this.cullingStrategy);\r\n }\r\n\r\n /**\r\n * Returns `true` if the mesh is completely in the frustum defined be the passed array of planes.\r\n * A mesh is completely in the frustum if its bounding box it completely inside the frustum.\r\n * @param frustumPlanes defines the frustum to test\r\n * @returns true if the mesh is completely in the frustum planes\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n return this.getBoundingInfo().isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * True if the mesh intersects another mesh or a SolidParticle object\r\n * @param mesh defines a target mesh or SolidParticle to test\r\n * @param precise Unless the parameter `precise` is set to `true` the intersection is computed according to Axis Aligned Bounding Boxes (AABB), else according to OBB (Oriented BBoxes)\r\n * @param includeDescendants Can be set to true to test if the mesh defined in parameters intersects with the current mesh or any child meshes\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsMesh(mesh: AbstractMesh | SolidParticle, precise: boolean = false, includeDescendants?: boolean): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n const otherBoundingInfo = mesh.getBoundingInfo();\r\n\r\n if (boundingInfo.intersects(otherBoundingInfo, precise)) {\r\n return true;\r\n }\r\n\r\n if (includeDescendants) {\r\n for (const child of this.getChildMeshes()) {\r\n if (child.intersectsMesh(mesh, precise, true)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns true if the passed point (Vector3) is inside the mesh bounding box\r\n * @param point defines the point to test\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsPoint(point: Vector3): boolean {\r\n return this.getBoundingInfo().intersectsPoint(point);\r\n }\r\n\r\n // Collisions\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh can be used in the collision engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public get checkCollisions(): boolean {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions;\r\n }\r\n\r\n public set checkCollisions(collisionEnabled: boolean) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions = collisionEnabled;\r\n }\r\n\r\n /**\r\n * Gets Collider object used to compute collisions (not physics)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public get collider(): Nullable<Collider> {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collider;\r\n }\r\n\r\n /**\r\n * Move the mesh using collision engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n * @param displacement defines the requested displacement vector\r\n * @param slideOnCollide If true, the mesh will slide along a collider's surface. If false, it will stop moving at the first collision. (true by default)\r\n * @returns the current mesh\r\n */\r\n public moveWithCollisions(displacement: Vector3, slideOnCollide: boolean = true): AbstractMesh {\r\n const globalPosition = this.getAbsolutePosition();\r\n\r\n globalPosition.addToRef(this.ellipsoidOffset, this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions);\r\n const coordinator = this.getScene().collisionCoordinator;\r\n\r\n if (!this._internalAbstractMeshDataInfo._meshCollisionData._collider) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider = coordinator.createCollider();\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider._radius = this.ellipsoid;\r\n\r\n coordinator.getNewPosition(\r\n this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions,\r\n displacement,\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider,\r\n this.collisionRetryCount,\r\n this,\r\n this._onCollisionPositionChange,\r\n this.uniqueId,\r\n slideOnCollide\r\n );\r\n return this;\r\n }\r\n\r\n private _onCollisionPositionChange = (collisionId: number, newPosition: Vector3, collidedMesh: Nullable<AbstractMesh> = null) => {\r\n newPosition.subtractToRef(\r\n this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions,\r\n this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions\r\n );\r\n\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions.length() > AbstractEngine.CollisionsEpsilon) {\r\n this.position.addInPlace(this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions);\r\n }\r\n\r\n if (collidedMesh) {\r\n this.onCollideObservable.notifyObservers(collidedMesh);\r\n }\r\n\r\n this.onCollisionPositionChangeObservable.notifyObservers(this.position);\r\n };\r\n\r\n // Collisions\r\n /**\r\n * @internal\r\n */\r\n public _collideForSubMesh(subMesh: SubMesh, transformMatrix: Matrix, collider: Collider): AbstractMesh {\r\n this._generatePointsArray();\r\n\r\n if (!this._positions) {\r\n return this;\r\n }\r\n\r\n // Transformation\r\n if (!subMesh._lastColliderWorldVertices || !subMesh._lastColliderTransformMatrix!.equals(transformMatrix)) {\r\n subMesh._lastColliderTransformMatrix = transformMatrix.clone();\r\n subMesh._lastColliderWorldVertices = [];\r\n subMesh._trianglePlanes = [];\r\n const start = subMesh.verticesStart;\r\n const end = subMesh.verticesStart + subMesh.verticesCount;\r\n for (let i = start; i < end; i++) {\r\n subMesh._lastColliderWorldVertices.push(Vector3.TransformCoordinates(this._positions[i], transformMatrix));\r\n }\r\n }\r\n\r\n // Collide\r\n collider._collide(\r\n subMesh._trianglePlanes,\r\n subMesh._lastColliderWorldVertices,\r\n <IndicesArray>this.getIndices(),\r\n subMesh.indexStart,\r\n subMesh.indexStart + subMesh.indexCount,\r\n subMesh.verticesStart,\r\n !!subMesh.getMaterial(),\r\n this,\r\n this._shouldConvertRHS(),\r\n subMesh.getMaterial()?.fillMode === Constants.MATERIAL_TriangleStripDrawMode\r\n );\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processCollisionsForSubMeshes(collider: Collider, transformMatrix: Matrix): AbstractMesh {\r\n const subMeshes = this._scene.getCollidingSubMeshCandidates(this, collider);\r\n const len = subMeshes.length;\r\n\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n\r\n // Bounding test\r\n if (len > 1 && !subMesh._checkCollision(collider)) {\r\n continue;\r\n }\r\n\r\n this._collideForSubMesh(subMesh, transformMatrix, collider);\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _shouldConvertRHS() {\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _checkCollision(collider: Collider): AbstractMesh {\r\n // Bounding box test\r\n if (!this.getBoundingInfo()._checkCollision(collider)) {\r\n return this;\r\n }\r\n\r\n // Transformation matrix\r\n const collisionsScalingMatrix = TmpVectors.Matrix[0];\r\n const collisionsTransformMatrix = TmpVectors.Matrix[1];\r\n Matrix.ScalingToRef(1.0 / collider._radius.x, 1.0 / collider._radius.y, 1.0 / collider._radius.z, collisionsScalingMatrix);\r\n this.worldMatrixFromCache.multiplyToRef(collisionsScalingMatrix, collisionsTransformMatrix);\r\n this._processCollisionsForSubMeshes(collider, collisionsTransformMatrix);\r\n return this;\r\n }\r\n\r\n // Picking\r\n /** @internal */\r\n public _generatePointsArray(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the passed Ray intersects with the mesh. A mesh triangle can be picked both from its front and back sides,\r\n * irrespective of orientation.\r\n * @param ray defines the ray to use. It should be in the mesh's LOCAL coordinate space.\r\n * @param fastCheck defines if fast mode (but less precise) must be used (false by default)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\r\n * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point\r\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\r\n * @returns the picking info\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\r\n */\r\n public intersects(\r\n ray: Ray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n onlyBoundingInfo = false,\r\n worldToUse?: Matrix,\r\n skipBoundingInfo = false\r\n ): PickingInfo {\r\n const pickingInfo = new PickingInfo();\r\n const className = this.getClassName();\r\n const intersectionThreshold = className === \"InstancedLinesMesh\" || className === \"LinesMesh\" || className === \"GreasedLineMesh\" ? (this as any).intersectionThreshold : 0;\r\n const boundingInfo = this.getBoundingInfo();\r\n if (!this.subMeshes) {\r\n return pickingInfo;\r\n }\r\n if (\r\n !skipBoundingInfo &&\r\n (!ray.intersectsSphere(boundingInfo.boundingSphere, intersectionThreshold) || !ray.intersectsBox(boundingInfo.boundingBox, intersectionThreshold))\r\n ) {\r\n return pickingInfo;\r\n }\r\n\r\n if (onlyBoundingInfo) {\r\n pickingInfo.hit = skipBoundingInfo ? false : true;\r\n pickingInfo.pickedMesh = skipBoundingInfo ? null : this;\r\n pickingInfo.distance = skipBoundingInfo ? 0 : Vector3.Distance(ray.origin, boundingInfo.boundingSphere.center);\r\n pickingInfo.subMeshId = 0;\r\n return pickingInfo;\r\n }\r\n\r\n if (!this._generatePointsArray()) {\r\n return pickingInfo;\r\n }\r\n\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n const subMeshes = this._scene.getIntersectingSubMeshCandidates(this, ray);\r\n const len: number = subMeshes.length;\r\n\r\n // Check if all submeshes are using a material that don't allow picking (point/lines rendering)\r\n // if no submesh can be picked that way, then fallback to BBox picking\r\n let anySubmeshSupportIntersect = false;\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n const material = subMesh.getMaterial();\r\n if (!material) {\r\n continue;\r\n }\r\n if (\r\n material.fillMode == Constants.MATERIAL_TriangleStripDrawMode ||\r\n material.fillMode == Constants.MATERIAL_TriangleFillMode ||\r\n material.fillMode == Constants.MATERIAL_WireFrameFillMode ||\r\n material.fillMode == Constants.MATERIAL_PointFillMode ||\r\n material.fillMode == Constants.MATERIAL_LineListDrawMode\r\n ) {\r\n anySubmeshSupportIntersect = true;\r\n break;\r\n }\r\n }\r\n\r\n // no sub mesh support intersection, fallback to BBox that has already be done\r\n if (!anySubmeshSupportIntersect) {\r\n pickingInfo.hit = true;\r\n pickingInfo.pickedMesh = this;\r\n pickingInfo.distance = Vector3.Distance(ray.origin, boundingInfo.boundingSphere.center);\r\n pickingInfo.subMeshId = -1;\r\n return pickingInfo;\r\n }\r\n\r\n // at least 1 submesh supports intersection, keep going\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n\r\n // Bounding test\r\n if (len > 1 && !skipBoundingInfo && !subMesh.canIntersects(ray)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = subMesh.intersects(ray, <Vector3[]>this._positions, <IndicesArray>this.getIndices(), fastCheck, trianglePredicate);\r\n\r\n if (currentIntersectInfo) {\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.subMeshId = subMesh._id;\r\n intersectInfo._internalSubMeshId = index;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (intersectInfo) {\r\n // Get picked point\r\n const world = worldToUse ?? this.getWorldMatrix();\r\n const worldOrigin = TmpVectors.Vector3[0];\r\n const direction = TmpVectors.Vector3[1];\r\n Vector3.TransformCoordinatesToRef(ray.origin, world, worldOrigin);\r\n ray.direction.scaleToRef(intersectInfo.distance, direction);\r\n const worldDirection = Vector3.TransformNormal(direction, world);\r\n const pickedPoint = worldDirection.addInPlace(worldOrigin);\r\n\r\n // Return result\r\n pickingInfo.hit = true;\r\n pickingInfo.distance = Vector3.Distance(worldOrigin, pickedPoint);\r\n pickingInfo.pickedPoint = pickedPoint;\r\n pickingInfo.pickedMesh = this;\r\n pickingInfo.bu = intersectInfo.bu || 0;\r\n pickingInfo.bv = intersectInfo.bv || 0;\r\n pickingInfo.subMeshFaceId = intersectInfo.faceId;\r\n pickingInfo.faceId = intersectInfo.faceId + subMeshes.data[intersectInfo._internalSubMeshId].indexStart / (this.getClassName().indexOf(\"LinesMesh\") !== -1 ? 2 : 3);\r\n pickingInfo.subMeshId = intersectInfo.subMeshId;\r\n return pickingInfo;\r\n }\r\n\r\n return pickingInfo;\r\n }\r\n\r\n /**\r\n * Clones the current mesh\r\n * @param name defines the mesh name\r\n * @param newParent defines the new mesh parent\r\n * @param doNotCloneChildren defines a boolean indicating that children must not be cloned (false by default)\r\n * @returns the new mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override clone(name: string, newParent: Nullable<Node>, doNotCloneChildren?: boolean): Nullable<AbstractMesh> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Disposes all the submeshes of the current mesh\r\n * @param immediate should dispose the effects immediately or not\r\n * @returns the current mesh\r\n */\r\n public releaseSubMeshes(immediate = false): AbstractMesh {\r\n if (this.subMeshes) {\r\n while (this.subMeshes.length) {\r\n this.subMeshes[0].dispose(immediate);\r\n }\r\n } else {\r\n this.subMeshes = [] as SubMesh[];\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Releases resources associated with this abstract mesh.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public override dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n let index: number;\r\n\r\n const scene = this.getScene();\r\n\r\n // mesh map release.\r\n if (this._scene.useMaterialMeshMap) {\r\n // remove from material mesh map id needed\r\n if (this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap) {\r\n this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = undefined;\r\n }\r\n }\r\n\r\n // Smart Array Retainers.\r\n scene.freeActiveMeshes();\r\n scene.freeRenderingGroups();\r\n if (scene.renderingManager.maintainStateBetweenFrames) {\r\n scene.renderingManager.restoreDispachedFlags();\r\n }\r\n\r\n // Action manager\r\n if (this.actionManager !== undefined && this.actionManager !== null) {\r\n // If we are the only mesh using the action manager, dispose of the action manager too unless it has opted out from that behavior\r\n if (this.actionManager.disposeWhenUnowned && !this._scene.meshes.some((m) => m !== this && m.actionManager === this.actionManager)) {\r\n this.actionManager.dispose();\r\n }\r\n this.actionManager = null;\r\n }\r\n\r\n // Skeleton\r\n this._internalAbstractMeshDataInfo._skeleton = null;\r\n\r\n if (this._transformMatrixTexture) {\r\n this._transformMatrixTexture.dispose();\r\n this._transformMatrixTexture = null;\r\n }\r\n\r\n // Intersections in progress\r\n for (index = 0; index < this._intersectionsInProgress.length; index++) {\r\n const other = this._intersectionsInProgress[index];\r\n\r\n const pos = other._intersectionsInProgress.indexOf(this);\r\n other._intersectionsInProgress.splice(pos, 1);\r\n }\r\n\r\n this._intersectionsInProgress.length = 0;\r\n\r\n // Lights\r\n const lights = scene.lights;\r\n\r\n for (const light of lights) {\r\n let meshIndex = light.includedOnlyMeshes.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n light.includedOnlyMeshes.splice(meshIndex, 1);\r\n }\r\n\r\n meshIndex = light.excludedMeshes.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n light.excludedMeshes.splice(meshIndex, 1);\r\n }\r\n\r\n // Shadow generators\r\n const generators = light.getShadowGenerators();\r\n if (generators) {\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n const shadowMap = generator.getShadowMap();\r\n\r\n if (shadowMap && shadowMap.renderList) {\r\n meshIndex = shadowMap.renderList.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n shadowMap.renderList.splice(meshIndex, 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // SubMeshes\r\n if (this.getClassName() !== \"InstancedMesh\" || this.getClassName() !== \"InstancedLinesMesh\") {\r\n this.releaseSubMeshes(true);\r\n }\r\n\r\n // Query\r\n const engine = scene.getEngine();\r\n if (this._occlusionQuery !== null) {\r\n this.isOcclusionQueryInProgress = false;\r\n engine.deleteQuery(this._occlusionQuery);\r\n this._occlusionQuery = null;\r\n }\r\n\r\n // Engine\r\n engine.wipeCaches();\r\n\r\n // Remove from scene\r\n scene.removeMesh(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.meshes.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.meshes.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n if (disposeMaterialAndTextures) {\r\n if (this.material) {\r\n if (this.material.getClassName() === \"MultiMaterial\") {\r\n this.material.dispose(false, true, true);\r\n } else {\r\n this.material.dispose(false, true);\r\n }\r\n }\r\n }\r\n\r\n if (!doNotRecurse) {\r\n // Particles\r\n for (index = 0; index < scene.particleSystems.length; index++) {\r\n if (scene.particleSystems[index].emitter === this) {\r\n scene.particleSystems[index].dispose();\r\n index--;\r\n }\r\n }\r\n }\r\n\r\n // facet data\r\n if (this._internalAbstractMeshDataInfo._facetData.facetDataEnabled) {\r\n this.disableFacetData();\r\n }\r\n\r\n this._uniformBuffer.dispose();\r\n\r\n this.onAfterWorldMatrixUpdateObservable.clear();\r\n this.onCollideObservable.clear();\r\n this.onCollisionPositionChangeObservable.clear();\r\n this.onRebuildObservable.clear();\r\n\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n // Facet data\r\n /** @internal */\r\n private _initFacetData(): AbstractMesh {\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n if (!data.facetNormals) {\r\n data.facetNormals = [] as Vector3[];\r\n }\r\n if (!data.facetPositions) {\r\n data.facetPositions = [] as Vector3[];\r\n }\r\n if (!data.facetPartitioning) {\r\n data.facetPartitioning = new Array<number[]>();\r\n }\r\n data.facetNb = ((<IndicesArray>this.getIndices()).length / 3) | 0;\r\n data.partitioningSubdivisions = data.partitioningSubdivisions ? data.partitioningSubdivisions : 10; // default nb of partitioning subdivisions = 10\r\n data.partitioningBBoxRatio = data.partitioningBBoxRatio ? data.partitioningBBoxRatio : 1.01; // default ratio 1.01 = the partitioning is 1% bigger than the bounding box\r\n for (let f = 0; f < data.facetNb; f++) {\r\n data.facetNormals[f] = Vector3.Zero();\r\n data.facetPositions[f] = Vector3.Zero();\r\n }\r\n data.facetDataEnabled = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the mesh facetData arrays and the internal partitioning when the mesh is morphed or updated.\r\n * This method can be called within the render loop.\r\n * You don't need to call this method by yourself in the render loop when you update/morph a mesh with the methods CreateXXX() as they automatically manage this computation\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public updateFacetData(): AbstractMesh {\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n if (!data.facetDataEnabled) {\r\n this._initFacetData();\r\n }\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this.getIndices();\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n const bInfo = this.getBoundingInfo();\r\n\r\n if (data.facetDepthSort && !data.facetDepthSortEnabled) {\r\n // init arrays, matrix and sort function on first call\r\n data.facetDepthSortEnabled = true;\r\n if (indices instanceof Uint16Array) {\r\n data.depthSortedIndices = new Uint16Array(indices);\r\n } else if (indices instanceof Uint32Array) {\r\n data.depthSortedIndices = new Uint32Array(indices);\r\n } else {\r\n let needs32bits = false;\r\n for (let i = 0; i < indices!.length; i++) {\r\n if (indices![i] > 65535) {\r\n needs32bits = true;\r\n break;\r\n }\r\n }\r\n if (needs32bits) {\r\n data.depthSortedIndices = new Uint32Array(indices!);\r\n } else {\r\n data.depthSortedIndices = new Uint16Array(indices!);\r\n }\r\n }\r\n data.facetDepthSortFunction = function (f1, f2) {\r\n return f2.sqDistance - f1.sqDistance;\r\n };\r\n if (!data.facetDepthSortFrom) {\r\n const camera = this.getScene().activeCamera;\r\n data.facetDepthSortFrom = camera ? camera.position : Vector3.Zero();\r\n }\r\n data.depthSortedFacets = [];\r\n for (let f = 0; f < data.facetNb; f++) {\r\n const depthSortedFacet = { ind: f * 3, sqDistance: 0.0 };\r\n data.depthSortedFacets.push(depthSortedFacet);\r\n }\r\n data.invertedMatrix = Matrix.Identity();\r\n data.facetDepthSortOrigin = Vector3.Zero();\r\n }\r\n\r\n data.bbSize.x = bInfo.maximum.x - bInfo.minimum.x > Epsilon ? bInfo.maximum.x - bInfo.minimum.x : Epsilon;\r\n data.bbSize.y = bInfo.maximum.y - bInfo.minimum.y > Epsilon ? bInfo.maximum.y - bInfo.minimum.y : Epsilon;\r\n data.bbSize.z = bInfo.maximum.z - bInfo.minimum.z > Epsilon ? bInfo.maximum.z - bInfo.minimum.z : Epsilon;\r\n let bbSizeMax = data.bbSize.x > data.bbSize.y ? data.bbSize.x : data.bbSize.y;\r\n bbSizeMax = bbSizeMax > data.bbSize.z ? bbSizeMax : data.bbSize.z;\r\n data.subDiv.max = data.partitioningSubdivisions;\r\n data.subDiv.X = Math.floor((data.subDiv.max * data.bbSize.x) / bbSizeMax); // adjust the number of subdivisions per axis\r\n data.subDiv.Y = Math.floor((data.subDiv.max * data.bbSize.y) / bbSizeMax); // according to each bbox size per axis\r\n data.subDiv.Z = Math.floor((data.subDiv.max * data.bbSize.z) / bbSizeMax);\r\n data.subDiv.X = data.subDiv.X < 1 ? 1 : data.subDiv.X; // at least one subdivision\r\n data.subDiv.Y = data.subDiv.Y < 1 ? 1 : data.subDiv.Y;\r\n data.subDiv.Z = data.subDiv.Z < 1 ? 1 : data.subDiv.Z;\r\n // set the parameters for ComputeNormals()\r\n data.facetParameters.facetNormals = this.getFacetLocalNormals();\r\n data.facetParameters.facetPositions = this.getFacetLocalPositions();\r\n data.facetParameters.facetPartitioning = this.getFacetLocalPartitioning();\r\n data.facetParameters.bInfo = bInfo;\r\n data.facetParameters.bbSize = data.bbSize;\r\n data.facetParameters.subDiv = data.subDiv;\r\n data.facetParameters.ratio = this.partitioningBBoxRatio;\r\n data.facetParameters.depthSort = data.facetDepthSort;\r\n if (data.facetDepthSort && data.facetDepthSortEnabled) {\r\n this.computeWorldMatrix(true);\r\n this._worldMatrix.invertToRef(data.invertedMatrix);\r\n Vector3.TransformCoordinatesToRef(data.facetDepthSortFrom, data.invertedMatrix, data.facetDepthSortOrigin);\r\n data.facetParameters.distanceTo = data.facetDepthSortOrigin;\r\n }\r\n data.facetParameters.depthSortedFacets = data.depthSortedFacets;\r\n if (normals) {\r\n VertexData.ComputeNormals(positions, indices, normals, data.facetParameters);\r\n }\r\n\r\n if (data.facetDepthSort && data.facetDepthSortEnabled) {\r\n data.depthSortedFacets.sort(data.facetDepthSortFunction);\r\n const l = (data.depthSortedIndices.length / 3) | 0;\r\n for (let f = 0; f < l; f++) {\r\n const sind = data.depthSortedFacets[f].ind;\r\n data.depthSortedIndices[f * 3] = indices![sind];\r\n data.depthSortedIndices[f * 3 + 1] = indices![sind + 1];\r\n data.depthSortedIndices[f * 3 + 2] = indices![sind + 2];\r\n }\r\n this.updateIndices(data.depthSortedIndices, undefined, true);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalNormals array.\r\n * The normals are expressed in the mesh local spac\r\n * @returns an array of Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalNormals(): Vector3[] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (!facetData.facetNormals) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetNormals;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalPositions array.\r\n * The facet positions are expressed in the mesh local space\r\n * @returns an array of Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalPositions(): Vector3[] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (!facetData.facetPositions) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetPositions;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalPartitioning array\r\n * @returns an array of array of numbers\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalPartitioning(): number[][] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n\r\n if (!facetData.facetPartitioning) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetPartitioning;\r\n }\r\n\r\n /**\r\n * Returns the i-th facet position in the world system.\r\n * This method allocates a new Vector3 per call\r\n * @param i defines the facet index\r\n * @returns a new Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetPosition(i: number): Vector3 {\r\n const pos = Vector3.Zero();\r\n this.getFacetPositionToRef(i, pos);\r\n return pos;\r\n }\r\n\r\n /**\r\n * Sets the reference Vector3 with the i-th facet position in the world system\r\n * @param i defines the facet index\r\n * @param ref defines the target vector\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetPositionToRef(i: number, ref: Vector3): AbstractMesh {\r\n const localPos = this.getFacetLocalPositions()[i];\r\n const world = this.getWorldMatrix();\r\n Vector3.TransformCoordinatesToRef(localPos, world, ref);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the i-th facet normal in the world system.\r\n * This method allocates a new Vector3 per call\r\n * @param i defines the facet index\r\n * @returns a new Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetNormal(i: number): Vector3 {\r\n const norm = Vector3.Zero();\r\n this.getFacetNormalToRef(i, norm);\r\n return norm;\r\n }\r\n\r\n /**\r\n * Sets the reference Vector3 with the i-th facet normal in the world system\r\n * @param i defines the facet index\r\n * @param ref defines the target vector\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetNormalToRef(i: number, ref: Vector3) {\r\n const localNorm = this.getFacetLocalNormals()[i];\r\n Vector3.TransformNormalToRef(localNorm, this.getWorldMatrix(), ref);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the facets (in an array) in the same partitioning block than the one the passed coordinates are located (expressed in the mesh local system)\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @returns the array of facet indexes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetsAtLocalCoordinates(x: number, y: number, z: number): Nullable<number[]> {\r\n const bInfo = this.getBoundingInfo();\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n\r\n const ox = Math.floor(((x - bInfo.minimum.x * data.partitioningBBoxRatio) * data.subDiv.X * data.partitioningBBoxRatio) / data.bbSize.x);\r\n const oy = Math.floor(((y - bInfo.minimum.y * data.partitioningBBoxRatio) * data.subDiv.Y * data.partitioningBBoxRatio) / data.bbSize.y);\r\n const oz = Math.floor(((z - bInfo.minimum.z * data.partitioningBBoxRatio) * data.subDiv.Z * data.partitioningBBoxRatio) / data.bbSize.z);\r\n if (ox < 0 || ox > data.subDiv.max || oy < 0 || oy > data.subDiv.max || oz < 0 || oz > data.subDiv.max) {\r\n return null;\r\n }\r\n return data.facetPartitioning[ox + data.subDiv.max * oy + data.subDiv.max * data.subDiv.max * oz];\r\n }\r\n\r\n /**\r\n * Returns the closest mesh facet index at (x,y,z) World coordinates, null if not found\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @param projected sets as the (x,y,z) world projection on the facet\r\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\r\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\r\n * @returns the face index if found (or null instead)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getClosestFacetAtCoordinates(x: number, y: number, z: number, projected?: Vector3, checkFace: boolean = false, facing: boolean = true): Nullable<number> {\r\n const world = this.getWorldMatrix();\r\n const invMat = TmpVectors.Matrix[5];\r\n world.invertToRef(invMat);\r\n const invVect = TmpVectors.Vector3[8];\r\n Vector3.TransformCoordinatesFromFloatsToRef(x, y, z, invMat, invVect); // transform (x,y,z) to coordinates in the mesh local space\r\n const closest = this.getClosestFacetAtLocalCoordinates(invVect.x, invVect.y, invVect.z, projected, checkFace, facing);\r\n if (projected) {\r\n // transform the local computed projected vector to world coordinates\r\n Vector3.TransformCoordinatesFromFloatsToRef(projected.x, projected.y, projected.z, world, projected);\r\n }\r\n return closest;\r\n }\r\n\r\n /**\r\n * Returns the closest mesh facet index at (x,y,z) local coordinates, null if not found\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @param projected sets as the (x,y,z) local projection on the facet\r\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\r\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\r\n * @returns the face index if found (or null instead)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getClosestFacetAtLocalCoordinates(x: number, y: number, z: number, projected?: Vector3, checkFace: boolean = false, facing: boolean = true): Nullable<number> {\r\n let closest = null;\r\n let tmpx = 0.0;\r\n let tmpy = 0.0;\r\n let tmpz = 0.0;\r\n let d = 0.0; // tmp dot facet normal * facet position\r\n let t0 = 0.0;\r\n let projx = 0.0;\r\n let projy = 0.0;\r\n let projz = 0.0;\r\n // Get all the facets in the same partitioning block than (x, y, z)\r\n const facetPositions = this.getFacetLocalPositions();\r\n const facetNormals = this.getFacetLocalNormals();\r\n const facetsInBlock = this.getFacetsAtLocalCoordinates(x, y, z);\r\n if (!facetsInBlock) {\r\n return null;\r\n }\r\n // Get the closest facet to (x, y, z)\r\n let shortest = Number.MAX_VALUE; // init distance vars\r\n let tmpDistance = shortest;\r\n let fib; // current facet in the block\r\n let norm; // current facet normal\r\n let p0; // current facet barycenter position\r\n // loop on all the facets in the current partitioning block\r\n for (let idx = 0; idx < facetsInBlock.length; idx++) {\r\n fib = facetsInBlock[idx];\r\n norm = facetNormals[fib];\r\n p0 = facetPositions[fib];\r\n\r\n d = (x - p0.x) * norm.x + (y - p0.y) * norm.y + (z - p0.z) * norm.z;\r\n if (!checkFace || (checkFace && facing && d >= 0.0) || (checkFace && !facing && d <= 0.0)) {\r\n // compute (x,y,z) projection on the facet = (projx, projy, projz)\r\n d = norm.x * p0.x + norm.y * p0.y + norm.z * p0.z;\r\n t0 = -(norm.x * x + norm.y * y + norm.z * z - d) / (norm.x * norm.x + norm.y * norm.y + norm.z * norm.z);\r\n projx = x + norm.x * t0;\r\n projy = y + norm.y * t0;\r\n projz = z + norm.z * t0;\r\n\r\n tmpx = projx - x;\r\n tmpy = projy - y;\r\n tmpz = projz - z;\r\n tmpDistance = tmpx * tmpx + tmpy * tmpy + tmpz * tmpz; // compute length between (x, y, z) and its projection on the facet\r\n if (tmpDistance < shortest) {\r\n // just keep the closest facet to (x, y, z)\r\n shortest = tmpDistance;\r\n closest = fib;\r\n if (projected) {\r\n projected.x = projx;\r\n projected.y = projy;\r\n projected.z = projz;\r\n }\r\n }\r\n }\r\n }\r\n return closest;\r\n }\r\n\r\n /**\r\n * Returns the object \"parameter\" set with all the expected parameters for facetData computation by ComputeNormals()\r\n * @returns the parameters\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetDataParameters(): any {\r\n return this._internalAbstractMeshDataInfo._facetData.facetParameters;\r\n }\r\n\r\n /**\r\n * Disables the feature FacetData and frees the related memory\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public disableFacetData(): AbstractMesh {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (facetData.facetDataEnabled) {\r\n facetData.facetDataEnabled = false;\r\n facetData.facetPositions = [] as Vector3[];\r\n facetData.facetNormals = [] as Vector3[];\r\n facetData.facetPartitioning = new Array<number[]>();\r\n facetData.facetParameters = {};\r\n facetData.depthSortedIndices = new Uint32Array(0);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the AbstractMesh indices array\r\n * @param indices defines the data source\r\n * @param offset defines the offset in the index buffer where to store the new data (can be null)\r\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly = false): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates new normals data for the mesh\r\n * @param updatable defines if the normal vertex buffer must be flagged as updatable\r\n * @returns the current mesh\r\n */\r\n public createNormals(updatable: boolean): AbstractMesh {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this.getIndices();\r\n let normals: FloatArray;\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) {\r\n normals = <FloatArray>this.getVerticesData(VertexBuffer.NormalKind);\r\n } else {\r\n normals = [];\r\n }\r\n\r\n VertexData.ComputeNormals(positions, indices, normals, { useRightHandedSystem: this.getScene().useRightHandedSystem });\r\n this.setVerticesData(VertexBuffer.NormalKind, normals, updatable);\r\n return this;\r\n }\r\n\r\n /**\r\n * Optimize the indices order so that we keep the faces with similar indices together\r\n * @returns the current mesh\r\n */\r\n public async optimizeIndicesAsync(): Promise<AbstractMesh> {\r\n const indices = this.getIndices();\r\n\r\n if (!indices) {\r\n return this;\r\n }\r\n\r\n const { OptimizeIndices } = await import(\"./mesh.vertexData.functions\");\r\n\r\n OptimizeIndices(indices);\r\n\r\n this.setIndices(indices, this.getTotalVertices());\r\n return this;\r\n }\r\n\r\n /**\r\n * Align the mesh with a normal\r\n * @param normal defines the normal to use\r\n * @param upDirection can be used to redefined the up vector to use (will use the (0, 1, 0) by default)\r\n * @returns the current mesh\r\n */\r\n public alignWithNormal(normal: Vector3, upDirection?: Vector3): AbstractMesh {\r\n if (!upDirection) {\r\n upDirection = Axis.Y;\r\n }\r\n\r\n const axisX = TmpVectors.Vector3[0];\r\n const axisZ = TmpVectors.Vector3[1];\r\n Vector3.CrossToRef(upDirection, normal, axisZ);\r\n Vector3.CrossToRef(normal, axisZ, axisX);\r\n\r\n if (this.rotationQuaternion) {\r\n Quaternion.RotationQuaternionFromAxisToRef(axisX, normal, axisZ, this.rotationQuaternion);\r\n } else {\r\n Vector3.RotationFromAxisToRef(axisX, normal, axisZ, this.rotation);\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _checkOcclusionQuery(): boolean {\r\n // Will be replaced by correct code if Occlusion queries are referenced\r\n return false;\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Disables the mesh edge rendering mode\r\n * @returns the currentAbstractMesh\r\n */\r\n disableEdgesRendering(): AbstractMesh {\r\n throw _WarnImport(\"EdgesRenderer\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Enables the edge rendering mode on the mesh.\r\n * This mode makes the mesh edges visible\r\n * @param epsilon defines the maximal distance between two angles to detect a face\r\n * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces\r\n * @param options options to the edge renderer\r\n * @returns the currentAbstractMesh\r\n * @see https://www.babylonjs-playground.com/#19O9TU#0\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean, options?: IEdgesRendererOptions): AbstractMesh {\r\n throw _WarnImport(\"EdgesRenderer\");\r\n }\r\n\r\n /**\r\n * This function returns all of the particle systems in the scene that use the mesh as an emitter.\r\n * @returns an array of particle systems in the scene that use the mesh as an emitter\r\n */\r\n public getConnectedParticleSystems(): IParticleSystem[] {\r\n return this._scene.particleSystems.filter((particleSystem) => particleSystem.emitter === this);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.AbstractMesh\", AbstractMesh);\r\n"]}
1
+ {"version":3,"file":"abstractMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/abstractMesh.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMhD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AASvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AASlD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,qCAAoC;AAE7D,SAAS,UAAU,CAAC,IAAgB,EAAE,IAAY,EAAE,kBAAsC;IACtF,IAAI,aAAa,GAA4D,IAAI,CAAC;IAClF,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,YAAY,CAAC,YAAY;YAC1B,aAAa,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAClD,MAAM;QACV,KAAK,YAAY,CAAC,UAAU;YACxB,aAAa,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM;QACV,KAAK,YAAY,CAAC,WAAW;YACzB,aAAa,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM;QACV,KAAK,YAAY,CAAC,MAAM;YACpB,aAAa,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM;QACV,KAAK,YAAY,CAAC,OAAO;YACrB,aAAa,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM;QACV,KAAK,YAAY,CAAC,SAAS;YACvB,aAAa,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC/C,MAAM;QACV;YACI,OAAO;IACf,CAAC;IAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/C,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,kBAAkB,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC;YACnF,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACzD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YACnC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBAClB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,UAAU,EAAE,CAAC;oBACb,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;gBAC3D,CAAC;YACL,CAAC;QACL,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAClB,IAAgB,EAChB,IAAY,EACZ,gBAA8B,EAC9B,mBAA+B,EAC/B,mBAA+B,EAC/B,wBAA8C,EAC9C,wBAA8C;IAE9C,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAExC,MAAM,wBAAwB,GAAG,IAAI,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,CAAC,OAAO,CAAC,mCAAmC,CAAC;IAEzJ,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,YAAY,IAAI,CAAC,EAAE,CAAC;QACvF,WAAW,CAAC,KAAK,EAAE,CAAC;QAEpB,IAAI,GAAW,CAAC;QAChB,IAAI,MAAc,CAAC;QACnB,KAAK,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,mBAAmB,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC;YACjD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACb,MAAM,CAAC,2BAA2B,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;gBACnI,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;QACD,IAAI,wBAAwB,IAAI,wBAAwB,EAAE,CAAC;YACvD,KAAK,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;gBAC3B,MAAM,GAAG,wBAAwB,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC;gBACtD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;oBACb,MAAM,CAAC,2BAA2B,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;oBACxI,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACtC,CAAC;YACL,CAAC;QACL,CAAC;QAED,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QACjG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;AACL,CAAC;AAiCD,gBAAgB;AAChB,gEAAgE;AAChE,MAAM,iBAAiB;IAAvB;QAKW,YAAO,GAAW,CAAC,CAAC,CAAC,eAAe;QACpC,6BAAwB,GAAW,EAAE,CAAC,CAAC,4DAA4D;QAC1G,gEAAgE;QACzD,0BAAqB,GAAW,IAAI,CAAC,CAAC,6EAA6E;QACnH,qBAAgB,GAAY,KAAK,CAAC,CAAC,mDAAmD;QACtF,oBAAe,GAAQ,EAAE,CAAC,CAAC,0EAA0E;QACrG,WAAM,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,wCAAwC;QAC1E,WAAM,GAAG;YACZ,8DAA8D;YAC9D,GAAG,EAAE,CAAC;YACN,gEAAgE;YAChE,CAAC,EAAE,CAAC;YACJ,gEAAgE;YAChE,CAAC,EAAE,CAAC;YACJ,gEAAgE;YAChE,CAAC,EAAE,CAAC;SACP,CAAC;QAEK,mBAAc,GAAY,KAAK,CAAC,CAAC,yCAAyC;QAC1E,0BAAqB,GAAY,KAAK,CAAC,CAAC,sCAAsC;IAQzF,CAAC;CAAA;AAED;;IAEI;AACJ,gEAAgE;AAChE,MAAM,6BAA6B;IAAnC;QACW,oBAAe,GAAG,KAAK,CAAC;QACxB,qBAAgB,GAAG,IAAI,CAAC;QACxB,wBAAmB,GAAG,CAAC,CAAC;QACxB,cAAS,GAAG,IAAI,CAAC;QACjB,oBAAe,GAAG,KAAK,CAAC;QACxB,eAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACrC,gBAAW,GAAG,GAAG,CAAC;QAClB,cAAS,GAAuB,IAAI,CAAC;QACrC,eAAU,GAAW,UAAU,CAAC;QAChC,8BAAyB,GAAG,IAAI,CAAC;QACjC,cAAS,GAAG,KAAK,CAAC;QAClB,sBAAiB,GAAG,KAAK,CAAC;QAC1B,0BAAqB,GAAG,KAAK,CAAC;QAC9B,kCAA6B,GAAG,KAAK,CAAC;QACtC,sBAAiB,GAAG,KAAK,CAAC;QAC1B,gBAAW,GAAkD,IAAI,GAAG,EAAE,CAAC;QACvE,yBAAoB,GAAW,CAAC,CAAC;QACjC,wBAAmB,GAAiC,IAAI,CAAC;QACzD,sBAAiB,GAAG,CAAC,CAAC;QACtB,iCAA4B,GAA2C,IAAI,CAAC;QAC5E,cAAS,GAAuB,IAAI,CAAC;QAErC,eAAU,GAAwB,IAAI,CAAC;QACvC,mCAA8B,GAAY,KAAK,CAAC;QACvD,aAAa;QACN,uBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC9C,0BAAqB,GAAG,KAAK,CAAC;QACrC;;WAEG;QACI,qBAAgB,GAA2B,IAAI,CAAC;QACvD;;;WAGG;QACI,yBAAoB,GAAG,KAAK,CAAC;QACpC;;WAEG;QACI,wBAAmB,GAAG,KAAK,CAAC;IACvC,CAAC;CAAA;AAED;;GAEG;AACH,MAAM,OAAgB,YAAa,SAAQ,aAAa;IA+CpD;;OAEG;IACI,MAAM,KAAc,kBAAkB;QACzC,OAAO,aAAa,CAAC,kBAAkB,CAAC;IAC5C,CAAC;IAED,0BAA0B;IACnB,MAAM,KAAc,eAAe;QACtC,OAAO,aAAa,CAAC,eAAe,CAAC;IACzC,CAAC;IAED,0BAA0B;IACnB,MAAM,KAAc,eAAe;QACtC,OAAO,aAAa,CAAC,eAAe,CAAC;IACzC,CAAC;IAED,0BAA0B;IACnB,MAAM,KAAc,eAAe;QACtC,OAAO,aAAa,CAAC,eAAe,CAAC;IACzC,CAAC;IAED,4BAA4B;IACrB,MAAM,KAAc,iBAAiB;QACxC,OAAO,aAAa,CAAC,iBAAiB,CAAC;IAC3C,CAAC;IAED,yDAAyD;IAClD,MAAM,KAAc,0BAA0B;QACjD,OAAO,aAAa,CAAC,0BAA0B,CAAC;IACpD,CAAC;IAwBD;;;OAGG;IACH,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,OAAO,CAAC;IACjE,CAAC;IACD;;;OAGG;IACH,IAAW,wBAAwB;QAC/B,OAAO,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,wBAAwB,CAAC;IAClF,CAAC;IACD,IAAW,wBAAwB,CAAC,EAAU;QAC1C,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,wBAAwB,GAAG,EAAE,CAAC;IAChF,CAAC;IACD;;;;OAIG;IACH,gEAAgE;IAChE,IAAW,qBAAqB;QAC5B,OAAO,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,qBAAqB,CAAC;IAC/E,CAAC;IACD,gEAAgE;IAChE,IAAW,qBAAqB,CAAC,KAAa;QAC1C,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,qBAAqB,GAAG,KAAK,CAAC;IAChF,CAAC;IAED;;;;;OAKG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,cAAc,CAAC;IACxE,CAAC;IACD,IAAW,mBAAmB,CAAC,IAAa;QACxC,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;IACxE,CAAC;IAED;;;;;OAKG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,kBAAkB,CAAC;IAC5E,CAAC;IACD,IAAW,kBAAkB,CAAC,QAAiB;QAC3C,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IAChF,CAAC;IAED,qHAAqH;IACrH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,6BAA6B,CAAC,oBAAoB,CAAC;IACnE,CAAC;IACD,IAAW,mBAAmB,CAAC,UAAkB;QAC7C,IAAI,CAAC,6BAA6B,CAAC,oBAAoB,GAAG,UAAU,CAAC;IACzE,CAAC;IACD;;;OAGG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,gBAAgB,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,6BAA6B,CAAC,mBAAmB,CAAC;IAClE,CAAC;IAED,IAAW,kBAAkB,CAAC,KAAmC;QAC7D,IAAI,IAAI,CAAC,6BAA6B,CAAC,mBAAmB,KAAK,KAAK,EAAE,CAAC;YACnE,OAAO;QACX,CAAC;QACD,IAAI,CAAC,6BAA6B,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAC/D,IAAI,CAAC,mCAAmC,EAAE,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,IAAW,2BAA2B;QAClC,OAAO,IAAI,CAAC,6BAA6B,CAAC,4BAA4B,CAAC;IAC3E,CAAC;IAED,IAAW,2BAA2B,CAAC,KAA6C;QAChF,IAAI,IAAI,CAAC,6BAA6B,CAAC,4BAA4B,KAAK,KAAK,EAAE,CAAC;YAC5E,OAAO;QACX,CAAC;QACD,IAAI,CAAC,6BAA6B,CAAC,4BAA4B,GAAG,KAAK,CAAC;QACxE,IAAI,CAAC,+BAA+B,EAAE,CAAC;IAC3C,CAAC;IAED,gBAAgB;IACT,mCAAmC,KAAU,CAAC;IAErD;;OAEG;IACa,6BAA6B,CAAC,KAAc;QACxD,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB;IAChB,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,6BAA6B,CAAC,gBAAgB,CAAC;IAC/D,CAAC;IACD,IAAW,eAAe,CAAC,YAAoC;QAC3D,IAAI,CAAC,6BAA6B,CAAC,gBAAgB,GAAG,YAAY,CAAC;IACvE,CAAC;IASD,sEAAsE;IACtE,IAAW,SAAS,CAAC,QAA+C;QAChE,IAAI,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YAC3E,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QAC9G,CAAC;QACD,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtH,CAAC;IAOD,mEAAmE;IACnE,IAAW,yBAAyB,CAAC,QAAoB;QACrD,IAAI,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,kCAAkC,EAAE,CAAC;YAC3F,IAAI,CAAC,mCAAmC,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,kCAAkC,CAAC,CAAC;QAC9I,CAAC;QACD,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,kCAAkC,GAAG,IAAI,CAAC,mCAAmC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtJ,CAAC;IAoBD;;OAEG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,6BAA6B,CAAC,WAAW,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,IAAW,UAAU,CAAC,KAAa;QAC/B,IAAI,IAAI,CAAC,6BAA6B,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC3D,OAAO;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,6BAA6B,CAAC,WAAW,CAAC;QAEhE,IAAI,CAAC,6BAA6B,CAAC,WAAW,GAAG,KAAK,CAAC;QAEvD,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,qBAAqB,CAAC,CAAC,OAAO,EAAE,EAAE;gBACnC,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC1B,OAAO,CAAC,kBAAkB,EAAE,CAAC;YACjC,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAsCD;;;;OAIG;IACH,IAAW,6BAA6B;QACpC,OAAO,IAAI,CAAC,6BAA6B,CAAC,8BAA8B,CAAC;IAC7E,CAAC;IAED,IAAW,6BAA6B,CAAC,OAAgB;QACrD,IAAI,CAAC,6BAA6B,CAAC,8BAA8B,GAAG,OAAO,CAAC;IAChF,CAAC;IAED;;;OAGG;IACH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,6BAA6B,CAAC,iBAAiB,CAAC;IAChE,CAAC;IAED,IAAW,gBAAgB,CAAC,KAAa;QACrC,IAAI,CAAC,6BAA6B,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjE,CAAC;IAED,oCAAoC;IACpC,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC;IACxD,CAAC;IACD,IAAW,QAAQ,CAAC,KAAyB;QACzC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,gBAAgB;IACN,YAAY,CAAC,KAAyB;QAC5C,IAAI,IAAI,CAAC,6BAA6B,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YACzD,OAAO;QACX,CAAC;QAED,0CAA0C;QAC1C,IAAI,IAAI,CAAC,6BAA6B,CAAC,SAAS,IAAI,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACvG,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QACpF,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,SAAS,GAAG,KAAK,CAAC;QAErD,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QACxC,CAAC;QAED,IAAI,IAAI,CAAC,2BAA2B,CAAC,YAAY,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,2BAA2B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACI,wBAAwB,CAAC,YAAoB;QAChD,OAAO,IAAI,CAAC,6BAA6B,CAAC,sBAAsB,EAAE,CAAC,YAAY,CAAC,CAAC;IACrF,CAAC;IAED;;;;OAIG;IACI,wBAAwB,CAAC,YAAoB,EAAE,QAAmB;QACrE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,sBAAsB,EAAE,CAAC;YAC7D,IAAI,CAAC,6BAA6B,CAAC,sBAAsB,GAAG,EAAE,CAAC;QACnE,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,6BAA6B,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;QAChG,IAAI,eAAe,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,sBAAsB,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC;QACnF,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC/B,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QAC3C,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,6BAA6B,CAAC,eAAe,CAAC;IAC9D,CAAC;IACD,IAAW,cAAc,CAAC,KAAc;QACpC,IAAI,IAAI,CAAC,6BAA6B,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;YAC/D,OAAO;QACX,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,eAAe,GAAG,KAAK,CAAC;QAC3D,IAAI,CAAC,0BAA0B,EAAE,CAAC;IACtC,CAAC;IAYD;;;;OAIG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,6BAA6B,CAAC,eAAe,CAAC;IAC9D,CAAC;IACD,IAAW,cAAc,CAAC,KAAc;QACpC,IAAI,IAAI,CAAC,6BAA6B,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;YAC/D,OAAO;QACX,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,eAAe,GAAG,KAAK,CAAC;QAC3D,IAAI,CAAC,+BAA+B,EAAE,CAAC;QACvC,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACrC,CAAC;IAED,2JAA2J;IAC3J,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,6BAA6B,CAAC,gBAAgB,CAAC;IAC/D,CAAC;IACD,IAAW,eAAe,CAAC,KAAc;QACrC,IAAI,IAAI,CAAC,6BAA6B,CAAC,gBAAgB,KAAK,KAAK,EAAE,CAAC;YAChE,OAAO;QACX,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC5D,IAAI,CAAC,+BAA+B,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,IAAW,wBAAwB;QAC/B,OAAO,IAAI,CAAC,6BAA6B,CAAC,yBAAyB,CAAC;IACxE,CAAC;IACD,IAAW,wBAAwB,CAAC,KAAc;QAC9C,IAAI,IAAI,CAAC,6BAA6B,CAAC,yBAAyB,KAAK,KAAK,EAAE,CAAC;YACzE,OAAO;QACX,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,yBAAyB,GAAG,KAAK,CAAC;QACrE,IAAI,CAAC,+BAA+B,EAAE,CAAC;IAC3C,CAAC;IAED,mFAAmF;IACnF,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,6BAA6B,CAAC,mBAAmB,CAAC;IAClE,CAAC;IACD,IAAW,kBAAkB,CAAC,KAAa;QACvC,IAAI,IAAI,CAAC,6BAA6B,CAAC,mBAAmB,KAAK,KAAK,EAAE,CAAC;YACnE,OAAO;QACX,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAC/D,IAAI,CAAC,+BAA+B,EAAE,CAAC;IAC3C,CAAC;IAED,6GAA6G;IAC7G,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC;IACxD,CAAC;IACD,IAAW,QAAQ,CAAC,KAAc;QAC9B,IAAI,IAAI,CAAC,6BAA6B,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YACzD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,SAAS,GAAG,KAAK,CAAC;QACrD,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACrC,CAAC;IAED,mHAAmH;IACnH,IAAW,oBAAoB;QAC3B,OAAO,IAAI,CAAC,6BAA6B,CAAC,qBAAqB,CAAC;IACpE,CAAC;IACD,IAAW,oBAAoB,CAAC,KAAc;QAC1C,IAAI,CAAC,6BAA6B,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACrE,CAAC;IAQD;;;OAGG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;IACzD,CAAC;IAED,IAAW,SAAS,CAAC,KAAa;QAC9B,IAAI,KAAK,KAAK,IAAI,CAAC,6BAA6B,CAAC,UAAU,EAAE,CAAC;YAC1D,OAAO;QACX,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,UAAU,GAAG,KAAK,CAAC;QACtD,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IA6BD;;;OAGG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,cAAc,CAAC;IAChF,CAAC;IAED,IAAW,aAAa,CAAC,IAAY;QACjC,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,cAAc,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC;IAED;;;;;OAKG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,kBAAkB,CAAC;IACpF,CAAC;IAED,IAAW,iBAAiB,CAAC,QAAiB;QAC1C,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACxF,CAAC;IACD;;;OAGG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,eAAe,CAAC;IACjF,CAAC;IAED,IAAW,cAAc,CAAC,IAAY;QAClC,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,eAAe,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,CAAC;IAED;;;;;;;;OAQG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,kBAAkB,CAAC;IACpF,CAAC;IAED,IAAW,iBAAiB,CAAC,MAAgC;QACzD,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,kBAAkB,GAAG,MAAM,CAAC;IACtF,CAAC;IAsCD,kDAAkD;IAClD,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAuBD;;;OAGG;IACH,IAAW,QAAQ,CAAC,KAAyB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC;QAC9D,IAAI,QAAQ,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YAC7C,QAAQ,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,KAAK,IAAI,KAAK,CAAC,qBAAqB,EAAE,CAAC;YACvC,KAAK,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,SAAS,GAAG,KAAK,CAAC;QAErD,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,SAAS,EAAE,CAAC;YAChD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,+BAA+B,EAAE,CAAC;IAC3C,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC;IACxD,CAAC;IAaD,cAAc;IAEd;;;;OAIG;IACH,YAAY,IAAY,EAAE,QAAyB,IAAI;QACnD,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QA3pB9B,gBAAgB;QAChB,gBAAgB;QACT,kCAA6B,GAAG,IAAI,6BAA6B,EAAE,CAAC;QAE3E,gBAAgB;QACT,uBAAkB,GAAqB,IAAI,CAAC;QAEnD,gBAAgB;QACT,iCAA4B,GAAqB,IAAI,CAAC;QAE7D;;;;;;;;;aASK;QACE,oBAAe,GAAG,YAAY,CAAC,mCAAmC,CAAC;QAgI1E,SAAS;QAET;;WAEG;QACI,wBAAmB,GAAG,IAAI,UAAU,EAAgB,CAAC;QAU5D;;WAEG;QACI,wCAAmC,GAAG,IAAI,UAAU,EAAW,CAAC;QAUvE;;WAEG;QACI,gCAA2B,GAAG,IAAI,UAAU,EAAgB,CAAC;QAEpE,aAAa;QAEb;;WAEG;QACI,yBAAoB,GAAG,IAAI,CAAC;QAEnC,gBAAgB;QACT,oBAAe,GAAkC,IAAI,CAAC;QAE7D,gBAAgB;QACT,oBAAe,GAA6B,IAAI,CAAC;QA6BxD;;WAEG;QACI,eAAU,GAAG,MAAM,CAAC,SAAS,CAAC;QAErC;;WAEG;QACI,eAAU,GAAG,IAAI,CAAC;QAEzB;;WAEG;QACI,mBAAc,GAAG,KAAK,CAAC;QAE9B;;;;;WAKG;QACI,oBAAe,GAAG,KAAK,CAAC;QAE/B,qHAAqH;QAC9G,6BAAwB,GAAG,KAAK,CAAC;QAExC;;WAEG;QACI,cAAS,GAAG,KAAK,CAAC;QAEzB;;WAEG;QACI,4BAAuB,GAAG,KAAK,CAAC;QA8GvC,kDAAkD;QAC3C,iBAAY,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QACnC,iDAAiD;QAC1C,iBAAY,GAAG,IAAI,CAAC;QAE3B,kDAAkD;QAC3C,iBAAY,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QACnC,kDAAkD;QAC3C,iBAAY,GAAG,GAAG,CAAC;QAkF1B,uIAAuI;QAChI,mCAA8B,GAAG,IAAI,CAAC;QAC7C,qIAAqI;QAC9H,wBAAmB,GAAG,IAAI,CAAC;QAClC,uIAAuI;QAChI,2BAAsB,GAAG,IAAI,CAAC;QAkBrC;;WAEG;QACI,6BAAwB,GAAG,KAAK,CAAC;QAExC;;WAEG;QACI,0BAAqB,GAAG,KAAK,CAAC;QAErC;;;WAGG;QACI,kBAAa,GAAoC,IAAI,CAAC;QAE7D;;;WAGG;QACI,cAAS,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5C;;;WAGG;QACI,oBAAe,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAwD9C,QAAQ;QACR;;;WAGG;QACI,eAAU,GAAG,CAAC,CAAC;QACtB;;;WAGG;QACI,eAAU,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,gBAAgB;QACT,mBAAc,GAA6B,IAAI,CAAC;QAEvD,gBAAgB;QACT,gBAAW,GAA2B,IAAI,CAAC;QACxC,kBAAa,GAA2B,IAAI,CAAC;QAC7C,yBAAoB,GAAG,IAAI,CAAC;QACtC,gBAAgB;QACT,cAAS,GAAG,CAAC,CAAC;QAQrB,gBAAgB;QACT,6BAAwB,GAAG,IAAI,KAAK,EAAgB,CAAC;QAE5D,gBAAgB;QACT,eAAU,GAAG,KAAK,CAAC;QAE1B,gBAAgB;QACT,kBAAa,GAAG,IAAI,KAAK,EAAS,CAAC;QAU1C,qBAAqB;QACrB,gBAAgB;QACT,iBAAY,GAIf;YACA,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,IAAI;SAC1B,CAAC;QAEF,gBAAgB;QACT,4BAAuB,GAA2B,IAAI,CAAC;QAE9D,gBAAgB;QACT,4BAAuB,GAAyB,IAAI,CAAC;QA6B5D;;WAEG;QACI,wBAAmB,GAAG,IAAI,UAAU,EAAgB,CAAC;QAm8BpD,+BAA0B,GAAG,CAAC,WAAmB,EAAE,WAAoB,EAAE,eAAuC,IAAI,EAAE,EAAE;YAC5H,WAAW,CAAC,aAAa,CACrB,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,yBAAyB,EAC/E,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,0BAA0B,CACnF,CAAC;YAEF,IAAI,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,0BAA0B,CAAC,MAAM,EAAE,GAAG,cAAc,CAAC,iBAAiB,EAAE,CAAC;gBAC/H,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;YAC/G,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACf,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;YAC3D,CAAC;YAED,IAAI,CAAC,mCAAmC,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5E,CAAC,CAAC;QAh8BE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAExB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEpB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,uBAAuB;QACvB,IAAI,CAAC,cAAc,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;QACxI,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,QAAQ,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAChC;gBACI,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;YACtC,0CAA0C;YAC1C;gBACI,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;gBACrC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,MAAM;QACd,CAAC;IACL,CAAC;IAES,mBAAmB;QACzB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,gBAAgB,CAAC,KAAa;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAEhC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjC,GAAG,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,6BAA6B,CAAC,WAAW,CAAC,CAAC;QAE9E,GAAG,CAAC,MAAM,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACI,oBAAoB;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACa,YAAY;QACxB,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACa,QAAQ,CAAC,WAAqB;QAC1C,IAAI,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7G,GAAG,IAAI,oBAAoB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3E,MAAM,QAAQ,GAAG,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC;QAC9D,IAAI,QAAQ,EAAE,CAAC;YACX,GAAG,IAAI,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC1C,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YACd,GAAG,IAAI,oBAAoB,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACnG,GAAG,IAAI,qBAAqB,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrH,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;OAEG;IACgB,mBAAmB;QAClC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa,CAAC,kBAAkB,EAAE,CAAC;YAC9E,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;QAED,OAAO,KAAK,CAAC,mBAAmB,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACa,2BAA2B,CAAC,OAAgB,EAAE,WAAW,GAAG,IAAI;QAC5E,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YACxE,IAAI,OAAO,EAAE,CAAC;gBACV,IAAI,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACjD,OAAO,IAAI,CAAC,aAAa,CAAC;gBAC9B,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,OAAO,IAAI,CAAC,aAAa,CAAC;YAC9B,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,6DAA6D;IACtD,QAAQ,CAAC,OAAO,GAAG,KAAK;QAC3B,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO;QACX,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,gBAAgB;IACT,mBAAmB;QACtB,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;gBACrB,SAAS;YACb,CAAC;YAED,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,0BAA0B,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,KAAY;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC;QAErF,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,OAAO;YACX,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACJ,IAAI,IAAI,EAAE,CAAC;gBACP,OAAO;YACX,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,gBAAgB;IACT,aAAa;QAChB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,KAAY,EAAE,OAAgB;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEhD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,OAAO;QACX,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEpC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEO,qBAAqB,CAAC,IAAwC;QAClE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO;QACX,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBACpD,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAE,WAAW,CAAC,OAA2B,CAAC,cAAc,EAAE,CAAC;oBACnG,SAAS;gBACb,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,OAA0B,CAAC,CAAC;YACjD,CAAC;QACL,CAAC;IACL,CAAC;IAED;;OAEG;IACI,0BAA0B,CAAC,UAAmB,KAAK;QACtD,IAAI,CAAC,qBAAqB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,gBAAgB;IACT,+BAA+B;QAClC,IAAI,CAAC,qBAAqB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,gBAAgB;IACT,yBAAyB;QAC5B,IAAI,CAAC,qBAAqB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACvE,CAAC;IAED;;;;OAIG;IACH,6DAA6D;IAC7C,WAAW,CAAC,QAAiB;QACzC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC;QACzC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,MAAe,EAAE,SAAS,GAAG,KAAK;QACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO;QACX,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;IAED,UAAU;IACV;;OAEG;IACH,IAAW,SAAS;QAChB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,6DAA6D;IACtD,MAAM,CAAC,MAAc;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;IAOD;;;OAGG;IACI,gBAAgB;QACnB,OAAO,CAAC,CAAC;IACb,CAAC;IAED;;;OAGG;IACI,eAAe;QAClB,OAAO,CAAC,CAAC;IACb,CAAC;IAED;;;OAGG;IACI,UAAU;QACb,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,6DAA6D;IACtD,eAAe,CAAC,IAAY;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;IA8BD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,6DAA6D;IACtD,eAAe,CAAC,IAAY,EAAE,IAAgB,EAAE,SAAmB,EAAE,MAAe;QACvF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,6DAA6D;IACtD,kBAAkB,CAAC,IAAY,EAAE,IAAgB,EAAE,aAAuB,EAAE,YAAsB;QACrG,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,6DAA6D;IACtD,UAAU,CAAC,OAAqB,EAAE,aAA+B;QACpE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,6DAA6D;IACtD,qBAAqB,CAAC,IAAY;QACrC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACI,eAAe;QAClB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QAC9C,CAAC;QAED,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YAClC,mDAAmD;YACnD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC/B,CAAC;QACD,kBAAkB;QAClB,OAAO,IAAI,CAAC,aAAc,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,kBAAkB;QACrB,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;IAC1D,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,YAA0B;QAC7C,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACI,iBAAiB,CAAC,OAA+B,EAAE,OAA+B,EAAE,WAAmC;QAC1H,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACa,mBAAmB,CAAC,kBAAkB,GAAG,IAAI,EAAE,cAAc,GAAG,KAAK,EAAE,SAAqD;QACxI,OAAqB,KAAK,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAClG,CAAC;IAED,wFAAwF;IACxF,IAAW,QAAQ;QACf,OAAgB,CACZ,CAAC,IAAI,CAAC,QAAQ;YACV,IAAI,CAAC,QAAQ,EAAE,CAAC,gBAAgB;YAChC,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,mBAAmB,CAAC;YAC5D,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CACpE,CAAC;IACN,CAAC;IAED,gBAAgB;IACT,YAAY,KAAU,CAAC;IAE9B;;OAEG;IACH,6DAA6D;IACtD,oCAAoC,CAAC,QAAgB,IAAS,CAAC;IAEtE;;OAEG;IACH,6DAA6D;IACtD,SAAS,CAAC,QAAgB,EAAE,qBAA8B;QAC7D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB;IACT,aAAa;QAChB,aAAa;IACjB,CAAC;IAED,gBAAgB;IACT,OAAO;QACV,aAAa;IACjB,CAAC;IAED,gBAAgB;IACT,SAAS;QACZ,aAAa;IACjB,CAAC;IAED;;;OAGG;IACa,cAAc;QAC1B,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa,CAAC,kBAAkB,EAAE,CAAC;YAC9E,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;QAC7C,CAAC;QAED,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;IAClC,CAAC;IAED,gBAAgB;IACA,0BAA0B;QACtC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,WAAW,CAAC,0BAA0B,EAAE,CAAC;QACzD,CAAC;QAED,OAAO,KAAK,CAAC,0BAA0B,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,IAAW,YAAY;QACnB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,IAAW,YAAY;QACnB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,IAAW,gBAAgB;QACvB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,8FAA8F;IAE9F;;;;;;;;OAQG;IACI,OAAO,CAAC,WAAmB,EAAE,QAAgB,EAAE,aAAqB;QACvE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;;OAQG;IACI,WAAW,CAAC,WAAmB,EAAE,QAAgB,EAAE,aAAqB;QAC3E,MAAM,SAAS,GAAG,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7J,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAE1C,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,mCAAmC,CAAC,WAAW,GAAG,cAAc,EAAE,QAAQ,EAAE,aAAa,GAAG,cAAc,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACjJ,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IACD,8FAA8F;IAC9F;;;;;;;OAOG;IACI,SAAS,CAAC,QAAgB,EAAE,cAAsB,EAAE,SAAiB;QACxE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;OAOG;IACI,aAAa,CAAC,QAAgB,EAAE,cAAsB,EAAE,SAAiB;QAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,OAAO,CAAC,QAAQ,GAAG,cAAc,EAAE,cAAc,EAAE,SAAS,GAAG,cAAc,CAAC,CAAC;IAC9F,CAAC;IAmBD;;OAEG;IACI,oBAAoB,CAAC,IAA0B,EAAE,IAAuB;QAC3E,IAAI,IAAI,EAAE,CAAC;YACP,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,CAAC;YACxE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1E,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACpD,CAAC;QACL,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,0BAA0B,CAAC,MAA8C;QAC5E,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACpD,CAAC;QACL,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAED,2EAA2E;IAS5D,AAAP,MAAM,CAAC,cAAc,CACzB,IAAgB,EAChB,IAAY,EACZ,gBAA8B,EAC9B,mBAA+B,EAC/B,mBAA+B,EAC/B,wBAA8C,EAC9C,wBAA8C;QAE9C,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;IAC9I,CAAC;IAED,gBAAgB;IACT,QAAQ,CAAC,OAAyB,EAAE,IAA0B,EAAE,OAAe,YAAY,CAAC,YAAY;QAC3G,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,MAAM,aAAa,GAAG,CAAC,IAAY,EAAwB,EAAE;YACzD,IAAI,KAAK,EAAE,CAAC;gBACR,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,WAAW,KAAjB,KAAK,CAAC,WAAW,GAAK,EAAE,EAAC,CAAC;gBAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC5C,CAAC;gBACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAED,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC;QAEF,IAAI,KAAJ,IAAI,GAAK,aAAa,CAAC,IAAI,CAAC,EAAC;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACpB,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACJ,KAAK,CAAC,WAAW,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC;QAC7B,CAAC;aAAM,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChD,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,mBAAmB,GAAG,aAAa,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;YAC5E,MAAM,mBAAmB,GAAG,aAAa,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;YAC5E,IAAI,mBAAmB,IAAI,mBAAmB,EAAE,CAAC;gBAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;gBAC/C,MAAM,wBAAwB,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC1G,MAAM,wBAAwB,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC1G,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBAClE,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;YAC5J,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,oBAAoB,KAAK,KAAK,IAAI,IAAI,KAAK,YAAY,CAAC,YAAY,EAAE,CAAC;YAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,6BAA6B,CAAC,UAAU,IAAI,EAAE,CAAC;YACtE,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC;YACxC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACnC,IAAI,cAAc,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;gBACpC,KAAK,IAAI,aAAa,GAAG,cAAc,EAAE,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC;oBACzF,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC7C,CAAC;YACL,CAAC;YAED,KAAK,IAAI,aAAa,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,SAAS,IAAI,CAAC,EAAE,CAAC;gBAC3G,SAAS,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;YACvG,CAAC;YAED,IAAI,CAAC,6BAA6B,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9D,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,aAAa,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK;QAC3D,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACpH,CAAC;IAED;;;;;;OAMG;IACI,eAAe,CAAC,gBAAyB,KAAK,EAAE,aAAsB,KAAK,EAAE,OAA6B,IAAI;QACjH,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;IACtH,CAAC;IAED,gBAAgB;IACT,mBAAmB;QACtB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,4BAA4B,CAAC,MAA6B;QAC7D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QACpC,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACjC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB;IACG,wBAAwB;QACvC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QACD,gBAAgB;QAChB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACI,WAAW,CAAC,aAAsB;QACrC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACnF,CAAC;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,aAAsB;QAC/C,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACvE,CAAC;IAED;;;;;;OAMG;IACI,cAAc,CAAC,IAAkC,EAAE,UAAmB,KAAK,EAAE,kBAA4B;QAC5G,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAEjD,IAAI,YAAY,CAAC,UAAU,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,kBAAkB,EAAE,CAAC;YACrB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;oBAC5C,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,KAAc;QACjC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,aAAa;IAEb;;;OAGG;IACH,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,gBAAgB,CAAC;IAClF,CAAC;IAED,IAAW,eAAe,CAAC,gBAAyB;QAChD,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,SAAS,CAAC;IAC3E,CAAC;IAED;;;;;;OAMG;IACI,kBAAkB,CAAC,YAAqB,EAAE,iBAA0B,IAAI;QAC3E,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAElD,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;QAC/H,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,oBAAoB,CAAC;QAEzD,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC;YACnE,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,SAAS,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;QACnG,CAAC;QAED,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAEzF,WAAW,CAAC,cAAc,CACtB,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,yBAAyB,EAC/E,YAAY,EACZ,IAAI,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,SAAS,EAC/D,IAAI,CAAC,mBAAmB,EACxB,IAAI,EACJ,IAAI,CAAC,0BAA0B,EAC/B,IAAI,CAAC,QAAQ,EACb,cAAc,CACjB,CAAC;QACF,OAAO,IAAI,CAAC;IAChB,CAAC;IAmBD,aAAa;IACb;;OAEG;IACI,kBAAkB,CAAC,OAAgB,EAAE,eAAuB,EAAE,QAAkB;QACnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,OAAO,CAAC,0BAA0B,IAAI,CAAC,OAAO,CAAC,4BAA6B,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;YACxG,OAAO,CAAC,4BAA4B,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC;YAC/D,OAAO,CAAC,0BAA0B,GAAG,EAAE,CAAC;YACxC,OAAO,CAAC,eAAe,GAAG,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC;YACpC,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;YAC1D,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,OAAO,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;YAC/G,CAAC;QACL,CAAC;QAED,UAAU;QACV,QAAQ,CAAC,QAAQ,CACb,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,0BAA0B,EACpB,IAAI,CAAC,UAAU,EAAE,EAC/B,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,EACvC,OAAO,CAAC,aAAa,EACrB,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EACvB,IAAI,EACJ,IAAI,CAAC,iBAAiB,EAAE,EACxB,OAAO,CAAC,WAAW,EAAE,EAAE,QAAQ,KAAK,SAAS,CAAC,8BAA8B,CAC/E,CAAC;QACF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,8BAA8B,CAAC,QAAkB,EAAE,eAAuB;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,6BAA6B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;QAE7B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEtC,gBAAgB;YAChB,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChD,SAAS;YACb,CAAC;YAED,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB;IACT,iBAAiB;QACpB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,QAAkB;QACrC,oBAAoB;QACpB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,wBAAwB;QACxB,MAAM,uBAAuB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,yBAAyB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC;QAC3H,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,uBAAuB,EAAE,yBAAyB,CAAC,CAAC;QAC5F,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,UAAU;IACV,gBAAgB;IACT,oBAAoB;QACvB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;;;;;;OAWG;IACI,UAAU,CACb,GAAQ,EACR,SAAmB,EACnB,iBAA4C,EAC5C,gBAAgB,GAAG,KAAK,EACxB,UAAmB,EACnB,gBAAgB,GAAG,KAAK;QAExB,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,qBAAqB,GAAG,SAAS,KAAK,oBAAoB,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,iBAAiB,CAAC,CAAC,CAAE,IAAY,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3K,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO,WAAW,CAAC;QACvB,CAAC;QACD,IACI,CAAC,gBAAgB;YACjB,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC,EACpJ,CAAC;YACC,OAAO,WAAW,CAAC;QACvB,CAAC;QAED,IAAI,gBAAgB,EAAE,CAAC;YACnB,WAAW,CAAC,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAClD,WAAW,CAAC,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACxD,WAAW,CAAC,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC/G,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC;YAC1B,OAAO,WAAW,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;YAC/B,OAAO,WAAW,CAAC;QACvB,CAAC;QAED,IAAI,aAAa,GAA+B,IAAI,CAAC;QAErD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,gCAAgC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAW,SAAS,CAAC,MAAM,CAAC;QAErC,+FAA+F;QAC/F,sEAAsE;QACtE,IAAI,0BAA0B,GAAG,KAAK,CAAC;QACvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,SAAS;YACb,CAAC;YACD,IACI,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC,8BAA8B;gBAC7D,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC,yBAAyB;gBACxD,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC,0BAA0B;gBACzD,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC,sBAAsB;gBACrD,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC,yBAAyB,EAC1D,CAAC;gBACC,0BAA0B,GAAG,IAAI,CAAC;gBAClC,MAAM;YACV,CAAC;QACL,CAAC;QAED,8EAA8E;QAC9E,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC9B,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC;YACvB,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YAC9B,WAAW,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACxF,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YAC3B,OAAO,WAAW,CAAC;QACvB,CAAC;QAED,uDAAuD;QACvD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEtC,gBAAgB;YAChB,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9D,SAAS;YACb,CAAC;YAED,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAa,IAAI,CAAC,UAAU,EAAgB,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;YAEhJ,IAAI,oBAAoB,EAAE,CAAC;gBACvB,IAAI,SAAS,IAAI,CAAC,aAAa,IAAI,oBAAoB,CAAC,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;oBACxF,aAAa,GAAG,oBAAoB,CAAC;oBACrC,aAAa,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC;oBACtC,aAAa,CAAC,kBAAkB,GAAG,KAAK,CAAC;oBAEzC,IAAI,SAAS,EAAE,CAAC;wBACZ,MAAM;oBACV,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAChB,mBAAmB;YACnB,MAAM,KAAK,GAAG,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAClD,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YAClE,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC5D,MAAM,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACjE,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAE3D,gBAAgB;YAChB,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC;YACvB,WAAW,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAClE,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC;YACtC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YAC9B,WAAW,CAAC,EAAE,GAAG,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;YACvC,WAAW,CAAC,EAAE,GAAG,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;YACvC,WAAW,CAAC,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC;YACjD,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpK,WAAW,CAAC,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;YAChD,OAAO,WAAW,CAAC;QACvB,CAAC;QAED,OAAO,WAAW,CAAC;IACvB,CAAC;IAED;;;;;;OAMG;IACH,6DAA6D;IAC7C,KAAK,CAAC,IAAY,EAAE,SAAyB,EAAE,kBAA4B;QACvF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CAAC,SAAS,GAAG,KAAK;QACrC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,SAAS,GAAG,EAAe,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACa,OAAO,CAAC,YAAsB,EAAE,0BAA0B,GAAG,KAAK;QAC9E,IAAI,KAAa,CAAC;QAElB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE9B,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACjC,0CAA0C;YAC1C,IAAI,IAAI,CAAC,6BAA6B,CAAC,SAAS,IAAI,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACvG,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;YACpF,CAAC;QACL,CAAC;QAED,yBAAyB;QACzB,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACzB,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,gBAAgB,CAAC,0BAA0B,EAAE,CAAC;YACpD,KAAK,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,CAAC;QACnD,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAClE,iIAAiI;YACjI,IAAI,IAAI,CAAC,aAAa,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YACjC,CAAC;YACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC9B,CAAC;QAED,WAAW;QACX,IAAI,CAAC,6BAA6B,CAAC,SAAS,GAAG,IAAI,CAAC;QAEpD,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACxC,CAAC;QAED,4BAA4B;QAC5B,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACpE,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;YAEnD,MAAM,GAAG,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzD,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,wBAAwB,CAAC,MAAM,GAAG,CAAC,CAAC;QAEzC,SAAS;QACT,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAE5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,SAAS,GAAG,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEvD,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnB,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;YAED,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAE/C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnB,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;YAED,oBAAoB;YACpB,MAAM,UAAU,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAC/C,IAAI,UAAU,EAAE,CAAC;gBACb,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;gBACrC,KAAK,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;oBACvE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC;oBAC5B,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC;oBAE3C,IAAI,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;wBACpC,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBAE/C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;4BACnB,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;wBAC9C,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,YAAY;QACZ,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,eAAe,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,oBAAoB,EAAE,CAAC;YAC1F,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,QAAQ;QACR,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;YACxC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAChC,CAAC;QAED,SAAS;QACT,MAAM,CAAC,UAAU,EAAE,CAAC;QAEpB,oBAAoB;QACpB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEvB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACb,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QACjC,CAAC;QAED,IAAI,0BAA0B,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,eAAe,EAAE,CAAC;oBACnD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7C,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACvC,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,YAAY;YACZ,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC5D,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;oBAChD,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;oBACvC,KAAK,EAAE,CAAC;gBACZ,CAAC;YACL,CAAC;QACL,CAAC;QAED,aAAa;QACb,IAAI,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;YACjE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAE9B,IAAI,CAAC,kCAAkC,CAAC,KAAK,EAAE,CAAC;QAChD,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,mCAAmC,CAAC,KAAK,EAAE,CAAC;QACjD,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAEjC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;IAC5D,CAAC;IAED,aAAa;IACb,gBAAgB;IACR,cAAc;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,GAAG,EAAe,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,GAAG,EAAe,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,KAAK,EAAY,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,CAAgB,IAAI,CAAC,UAAU,EAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAClE,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,+CAA+C;QACnJ,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,2EAA2E;QACxK,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACI,eAAe;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAErC,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACrD,sDAAsD;YACtD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;YAClC,IAAI,OAAO,YAAY,WAAW,EAAE,CAAC;gBACjC,IAAI,CAAC,kBAAkB,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;YACvD,CAAC;iBAAM,IAAI,OAAO,YAAY,WAAW,EAAE,CAAC;gBACxC,IAAI,CAAC,kBAAkB,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACJ,IAAI,WAAW,GAAG,KAAK,CAAC;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvC,IAAI,OAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;wBACtB,WAAW,GAAG,IAAI,CAAC;wBACnB,MAAM;oBACV,CAAC;gBACL,CAAC;gBACD,IAAI,WAAW,EAAE,CAAC;oBACd,IAAI,CAAC,kBAAkB,GAAG,IAAI,WAAW,CAAC,OAAQ,CAAC,CAAC;gBACxD,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,kBAAkB,GAAG,IAAI,WAAW,CAAC,OAAQ,CAAC,CAAC;gBACxD,CAAC;YACL,CAAC;YACD,IAAI,CAAC,sBAAsB,GAAG,UAAU,EAAE,EAAE,EAAE;gBAC1C,OAAO,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;YACzC,CAAC,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC;gBAC5C,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACxE,CAAC;YACD,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;gBACzD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1G,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1G,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1G,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9E,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,wBAAwB,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,6CAA6C;QACxH,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,uCAAuC;QAClH,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,2BAA2B;QAClF,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,0CAA0C;QAC1C,IAAI,CAAC,eAAe,CAAC,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChE,IAAI,CAAC,eAAe,CAAC,cAAc,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACpE,IAAI,CAAC,eAAe,CAAC,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC1E,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC;QACxD,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;QACrD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACpD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnD,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC3G,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAChE,IAAI,OAAO,EAAE,CAAC;YACV,UAAU,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACpD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACzD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3C,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAQ,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;gBACxD,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,oBAAoB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;QAChE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,SAAS,CAAC,YAAY,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACI,sBAAsB;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;QAChE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,SAAS,CAAC,cAAc,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACI,yBAAyB;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;QAEhE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,SAAS,CAAC,iBAAiB,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACI,gBAAgB,CAAC,CAAS;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;;;;;OAMG;IACI,qBAAqB,CAAC,CAAS,EAAE,GAAY;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,OAAO,CAAC,yBAAyB,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACI,cAAc,CAAC,CAAS;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACI,mBAAmB,CAAC,CAAS,EAAE,GAAY;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;OAOG;IACI,2BAA2B,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;QAE3D,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzI,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzI,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzI,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACrG,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;IACtG,CAAC;IAED;;;;;;;;;;OAUG;IACI,4BAA4B,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,SAAmB,EAAE,YAAqB,KAAK,EAAE,SAAkB,IAAI;QACxI,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,mCAAmC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,2DAA2D;QAClI,MAAM,OAAO,GAAG,IAAI,CAAC,iCAAiC,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACtH,IAAI,SAAS,EAAE,CAAC;YACZ,qEAAqE;YACrE,OAAO,CAAC,mCAAmC,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACzG,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;;;;;;OAUG;IACI,iCAAiC,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,SAAmB,EAAE,YAAqB,KAAK,EAAE,SAAkB,IAAI;QAC7I,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,wCAAwC;QACrD,IAAI,EAAE,GAAG,GAAG,CAAC;QACb,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,mEAAmE;QACnE,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACjD,MAAM,aAAa,GAAG,IAAI,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,qCAAqC;QACrC,IAAI,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB;QACtD,IAAI,WAAW,GAAG,QAAQ,CAAC;QAC3B,IAAI,GAAG,CAAC,CAAC,6BAA6B;QACtC,IAAI,IAAI,CAAC,CAAC,uBAAuB;QACjC,IAAI,EAAE,CAAC,CAAC,oCAAoC;QAC5C,2DAA2D;QAC3D,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;YAClD,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACzB,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YAEzB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACxF,kEAAkE;gBAClE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAClD,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;gBACxB,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;gBACxB,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;gBAExB,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;gBACjB,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;gBACjB,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;gBACjB,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,mEAAmE;gBAC1H,IAAI,WAAW,GAAG,QAAQ,EAAE,CAAC;oBACzB,2CAA2C;oBAC3C,QAAQ,GAAG,WAAW,CAAC;oBACvB,OAAO,GAAG,GAAG,CAAC;oBACd,IAAI,SAAS,EAAE,CAAC;wBACZ,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC;wBACpB,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC;wBACpB,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACI,sBAAsB;QACzB,OAAO,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,eAAe,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACI,gBAAgB;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;QAChE,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;YAC7B,SAAS,CAAC,gBAAgB,GAAG,KAAK,CAAC;YACnC,SAAS,CAAC,cAAc,GAAG,EAAe,CAAC;YAC3C,SAAS,CAAC,YAAY,GAAG,EAAe,CAAC;YACzC,SAAS,CAAC,iBAAiB,GAAG,IAAI,KAAK,EAAY,CAAC;YACpD,SAAS,CAAC,eAAe,GAAG,EAAE,CAAC;YAC/B,SAAS,CAAC,kBAAkB,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,6DAA6D;IACtD,aAAa,CAAC,OAAqB,EAAE,MAAe,EAAE,aAAa,GAAG,KAAK;QAC9E,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,aAAa,CAAC,SAAkB;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,OAAmB,CAAC;QAExB,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,OAAO,GAAe,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACJ,OAAO,GAAG,EAAE,CAAC;QACjB,CAAC;QAED,UAAU,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACvH,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,oBAAoB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAElC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAExE,eAAe,CAAC,OAAO,CAAC,CAAC;QAEzB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,eAAe,CAAC,MAAe,EAAE,WAAqB;QACzD,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEzC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,UAAU,CAAC,+BAA+B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9F,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB;IACT,oBAAoB;QACvB,uEAAuE;QACvE,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,uDAAuD;IACvD;;;OAGG;IACH,qBAAqB;QACjB,MAAM,WAAW,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAED,uDAAuD;IACvD;;;;;;;;OAQG;IACH,6DAA6D;IAC7D,oBAAoB,CAAC,OAAgB,EAAE,6BAAuC,EAAE,OAA+B;QAC3G,MAAM,WAAW,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACI,2BAA2B;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;IACnG,CAAC;;AAlhFD,mBAAmB;AACL,gCAAmB,GAAG,CAAC,AAAJ,CAAK;AACtC,kCAAkC;AACpB,sCAAyB,GAAG,CAAC,AAAJ,CAAK;AAC5C,8BAA8B;AAChB,kCAAqB,GAAG,CAAC,AAAJ,CAAK;AACxC,0CAA0C;AAC5B,8CAAiC,GAAG,CAAC,AAAJ,CAAK;AACpD,6CAA6C;AAC/B,kDAAqC,GAAG,CAAC,AAAJ,CAAK;AAExD;;;;;GAKG;AACoB,qCAAwB,GAAG,SAAS,CAAC,+BAA+B,AAA5C,CAA6C;AAC5F;;;;;GAKG;AACoB,gDAAmC,GAAG,SAAS,CAAC,0CAA0C,AAAvD,CAAwD;AAClH;;;;;;;;GAQG;AACoB,iDAAoC,GAAG,SAAS,CAAC,2CAA2C,AAAxD,CAAyD;AACpH;;;;;;;;GAQG;AACoB,mEAAsD,GAAG,SAAS,CAAC,6DAA6D,AAA1E,CAA2E;AAw3CzI;IARd,cAAc,CAAC,MAAM,CAClB,CAAC,GAAG,CAAC,IAAI,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,wBAAwB,CAAiD,EAAE,EAAE,CACxJ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACpB,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACnC,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACnC,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC;QACxC,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAC/C;wCAWA;AAumCL,aAAa,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC","sourcesContent":["import { Observable } from \"../Misc/observable\";\r\nimport type { Nullable, FloatArray, IndicesArray, DeepImmutable } from \"../types\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { ScenePerformancePriority } from \"../scene\";\r\nimport type { Vector2 } from \"../Maths/math.vector\";\r\nimport { Quaternion, Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { Node } from \"../node\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { IGetSetVerticesData } from \"../Meshes/mesh.vertexData\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { MaterialDefines } from \"../Materials/materialDefines\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport type { MorphTargetManager } from \"../Morph/morphTargetManager\";\r\nimport type { IBakedVertexAnimationManager } from \"../BakedVertexAnimation/bakedVertexAnimationManager\";\r\nimport type { IEdgesRenderer } from \"../Rendering/edgesRenderer\";\r\nimport type { SolidParticle } from \"../Particles/solidParticle\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { AbstractActionManager } from \"../Actions/abstractActionManager\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport { _MeshCollisionData } from \"../Collisions/meshCollisionData\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport type { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { extractMinAndMax } from \"../Maths/math.functions\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { Axis } from \"../Maths/math.axis\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nimport type { Ray } from \"../Culling/ray\";\r\nimport type { Collider } from \"../Collisions/collider\";\r\nimport type { TrianglePickingPredicate } from \"../Culling/ray\";\r\nimport type { RenderingGroup } from \"../Rendering/renderingGroup\";\r\nimport type { IEdgesRendererOptions } from \"../Rendering/edgesRenderer\";\r\nimport type { MorphTarget } from \"../Morph/morphTarget\";\r\nimport type { Geometry } from \"./geometry\";\r\nimport { nativeOverride } from \"../Misc/decorators\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\nfunction ApplyMorph(data: FloatArray, kind: string, morphTargetManager: MorphTargetManager): void {\r\n let getTargetData: Nullable<(target: MorphTarget) => Nullable<FloatArray>> = null;\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n getTargetData = (target) => target.getPositions();\r\n break;\r\n case VertexBuffer.NormalKind:\r\n getTargetData = (target) => target.getNormals();\r\n break;\r\n case VertexBuffer.TangentKind:\r\n getTargetData = (target) => target.getTangents();\r\n break;\r\n case VertexBuffer.UVKind:\r\n getTargetData = (target) => target.getUVs();\r\n break;\r\n case VertexBuffer.UV2Kind:\r\n getTargetData = (target) => target.getUV2s();\r\n break;\r\n case VertexBuffer.ColorKind:\r\n getTargetData = (target) => target.getColors();\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n for (let index = 0; index < data.length; index++) {\r\n let value = data[index];\r\n for (let targetCount = 0; targetCount < morphTargetManager.numTargets; targetCount++) {\r\n const target = morphTargetManager.getTarget(targetCount);\r\n const influence = target.influence;\r\n if (influence !== 0) {\r\n const targetData = getTargetData(target);\r\n if (targetData) {\r\n value += (targetData[index] - data[index]) * influence;\r\n }\r\n }\r\n }\r\n data[index] = value;\r\n }\r\n}\r\n\r\nfunction ApplySkeleton(\r\n data: FloatArray,\r\n kind: string,\r\n skeletonMatrices: Float32Array,\r\n matricesIndicesData: FloatArray,\r\n matricesWeightsData: FloatArray,\r\n matricesIndicesExtraData: Nullable<FloatArray>,\r\n matricesWeightsExtraData: Nullable<FloatArray>\r\n): void {\r\n const tempVector = TmpVectors.Vector3[0];\r\n const finalMatrix = TmpVectors.Matrix[0];\r\n const tempMatrix = TmpVectors.Matrix[1];\r\n\r\n const transformFromFloatsToRef = kind === VertexBuffer.NormalKind ? Vector3.TransformNormalFromFloatsToRef : Vector3.TransformCoordinatesFromFloatsToRef;\r\n\r\n for (let index = 0, matWeightIdx = 0; index < data.length; index += 3, matWeightIdx += 4) {\r\n finalMatrix.reset();\r\n\r\n let inf: number;\r\n let weight: number;\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsData[matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesData[matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n if (matricesIndicesExtraData && matricesWeightsExtraData) {\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsExtraData[matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesExtraData[matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n }\r\n\r\n transformFromFloatsToRef(data[index], data[index + 1], data[index + 2], finalMatrix, tempVector);\r\n tempVector.toArray(data, index);\r\n }\r\n}\r\n\r\n/**\r\n * Opaque cache when computing data about a mesh\r\n */\r\nexport interface IMeshDataCache {\r\n /** @internal */\r\n _outputData?: Float32Array;\r\n\r\n /** @internal */\r\n _vertexData?: { [kind: string]: Float32Array };\r\n}\r\n\r\n/**\r\n * Options when computing data about a mesh\r\n */\r\nexport interface IMeshDataOptions {\r\n /** Apply skeleton when computing the bounding info. Defaults to false. */\r\n applySkeleton?: boolean;\r\n\r\n /** Apply morph when computing the bounding info. Defaults to false. */\r\n applyMorph?: boolean;\r\n\r\n /** Update the cached positions stored as a Vector3 array. Defaults to true. */\r\n updatePositionsArray?: boolean;\r\n\r\n /**\r\n * Cache to avoid redundant allocations and computations when computing the bounding info multiple times. Pass in\r\n * an initial empty object and continue with subsequent calls using the same object. Caching is disabled by default.\r\n */\r\n cache?: IMeshDataCache;\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass _FacetDataStorage {\r\n // facetData private properties\r\n public facetPositions: Vector3[]; // facet local positions\r\n public facetNormals: Vector3[]; // facet local normals\r\n public facetPartitioning: number[][]; // partitioning array of facet index arrays\r\n public facetNb: number = 0; // facet number\r\n public partitioningSubdivisions: number = 10; // number of subdivisions per axis in the partitioning space\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public partitioningBBoxRatio: number = 1.01; // the partitioning array space is by default 1% bigger than the bounding box\r\n public facetDataEnabled: boolean = false; // is the facet data feature enabled on this mesh ?\r\n public facetParameters: any = {}; // keep a reference to the object parameters to avoid memory re-allocation\r\n public bbSize: Vector3 = Vector3.Zero(); // bbox size approximated for facet data\r\n public subDiv = {\r\n // actual number of subdivisions per axis for ComputeNormals()\r\n max: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n X: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n Y: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n Z: 1,\r\n };\r\n\r\n public facetDepthSort: boolean = false; // is the facet depth sort to be computed\r\n public facetDepthSortEnabled: boolean = false; // is the facet depth sort initialized\r\n public depthSortedIndices: IndicesArray; // copy of the indices array to store them once sorted\r\n public depthSortedFacets: { ind: number; sqDistance: number }[]; // array of depth sorted facets\r\n public facetDepthSortFunction: (f1: { ind: number; sqDistance: number }, f2: { ind: number; sqDistance: number }) => number; // facet depth sort function\r\n public facetDepthSortFrom: Vector3; // location where to depth sort from\r\n public facetDepthSortOrigin: Vector3; // same as facetDepthSortFrom but expressed in the mesh local space\r\n\r\n public invertedMatrix: Matrix; // Inverted world matrix.\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass _InternalAbstractMeshDataInfo {\r\n public _hasVertexAlpha = false;\r\n public _useVertexColors = true;\r\n public _numBoneInfluencers = 4;\r\n public _applyFog = true;\r\n public _receiveShadows = false;\r\n public _facetData = new _FacetDataStorage();\r\n public _visibility = 1.0;\r\n public _skeleton: Nullable<Skeleton> = null;\r\n public _layerMask: number = 0x0fffffff;\r\n public _computeBonesUsingShaders = true;\r\n public _isActive = false;\r\n public _onlyForInstances = false;\r\n public _isActiveIntermediate = false;\r\n public _onlyForInstancesIntermediate = false;\r\n public _actAsRegularMesh = false;\r\n public _currentLOD: Map<Camera, [Nullable<AbstractMesh>, number]> = new Map();\r\n public _collisionRetryCount: number = 3;\r\n public _morphTargetManager: Nullable<MorphTargetManager> = null;\r\n public _renderingGroupId = 0;\r\n public _bakedVertexAnimationManager: Nullable<IBakedVertexAnimationManager> = null;\r\n public _material: Nullable<Material> = null;\r\n public _materialForRenderPass: Array<Material | undefined>; // map a render pass id (index in the array) to a Material\r\n public _positions: Nullable<Vector3[]> = null;\r\n public _pointerOverDisableMeshTesting: boolean = false;\r\n // Collisions\r\n public _meshCollisionData = new _MeshCollisionData();\r\n public _enableDistantPicking = false;\r\n /** @internal\r\n * Bounding info that is unnafected by the addition of thin instances\r\n */\r\n public _rawBoundingInfo: Nullable<BoundingInfo> = null;\r\n /** @internal\r\n * This value will indicate us that at some point, the mesh was specifically used with the opposite winding order\r\n * We use that as a clue to force the material to sideOrientation = null\r\n */\r\n public _sideOrientationHint = false;\r\n /**\r\n * Used in frame graph mode only, to know which meshes to update when in frozen mode\r\n */\r\n public _wasActiveLastFrame = false;\r\n}\r\n\r\n/**\r\n * Class used to store all common mesh properties\r\n */\r\nexport abstract class AbstractMesh extends TransformNode implements IDisposable, ICullable, IGetSetVerticesData {\r\n /** No occlusion */\r\n public static OCCLUSION_TYPE_NONE = 0;\r\n /** Occlusion set to optimistic */\r\n public static OCCLUSION_TYPE_OPTIMISTIC = 1;\r\n /** Occlusion set to strict */\r\n public static OCCLUSION_TYPE_STRICT = 2;\r\n /** Use an accurate occlusion algorithm */\r\n public static OCCLUSION_ALGORITHM_TYPE_ACCURATE = 0;\r\n /** Use a conservative occlusion algorithm */\r\n public static OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE = 1;\r\n\r\n /** Default culling strategy : this is an exclusion test and it's the more accurate.\r\n * Test order :\r\n * Is the bounding sphere outside the frustum ?\r\n * If not, are the bounding box vertices outside the frustum ?\r\n * It not, then the cullable object is in the frustum.\r\n */\r\n public static readonly CULLINGSTRATEGY_STANDARD = Constants.MESHES_CULLINGSTRATEGY_STANDARD;\r\n /** Culling strategy : Bounding Sphere Only.\r\n * This is an exclusion test. It's faster than the standard strategy because the bounding box is not tested.\r\n * It's also less accurate than the standard because some not visible objects can still be selected.\r\n * Test : is the bounding sphere outside the frustum ?\r\n * If not, then the cullable object is in the frustum.\r\n */\r\n public static readonly CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = Constants.MESHES_CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY;\r\n /** Culling strategy : Optimistic Inclusion.\r\n * This in an inclusion test first, then the standard exclusion test.\r\n * This can be faster when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the standard test when the tested object center is not the frustum but one of its bounding box vertex is still inside.\r\n * Anyway, it's as accurate as the standard strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the default culling strategy.\r\n */\r\n public static readonly CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION;\r\n /** Culling strategy : Optimistic Inclusion then Bounding Sphere Only.\r\n * This in an inclusion test first, then the bounding sphere only exclusion test.\r\n * This can be the fastest test when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the BoundingSphereOnly strategy when the tested object center is not in the frustum but its bounding sphere still intersects it.\r\n * It's less accurate than the standard strategy and as accurate as the BoundingSphereOnly strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the Bounding Sphere Only strategy. No Bounding Box is tested here.\r\n */\r\n public static readonly CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY;\r\n\r\n /**\r\n * No billboard\r\n */\r\n public static override get BILLBOARDMODE_NONE(): number {\r\n return TransformNode.BILLBOARDMODE_NONE;\r\n }\r\n\r\n /** Billboard on X axis */\r\n public static override get BILLBOARDMODE_X(): number {\r\n return TransformNode.BILLBOARDMODE_X;\r\n }\r\n\r\n /** Billboard on Y axis */\r\n public static override get BILLBOARDMODE_Y(): number {\r\n return TransformNode.BILLBOARDMODE_Y;\r\n }\r\n\r\n /** Billboard on Z axis */\r\n public static override get BILLBOARDMODE_Z(): number {\r\n return TransformNode.BILLBOARDMODE_Z;\r\n }\r\n\r\n /** Billboard on all axes */\r\n public static override get BILLBOARDMODE_ALL(): number {\r\n return TransformNode.BILLBOARDMODE_ALL;\r\n }\r\n\r\n /** Billboard on using position instead of orientation */\r\n public static override get BILLBOARDMODE_USE_POSITION(): number {\r\n return TransformNode.BILLBOARDMODE_USE_POSITION;\r\n }\r\n\r\n // Internal data\r\n /** @internal */\r\n public _internalAbstractMeshDataInfo = new _InternalAbstractMeshDataInfo();\r\n\r\n /** @internal */\r\n public _waitingMaterialId: Nullable<string> = null;\r\n\r\n /** @internal */\r\n public _waitingMorphTargetManagerId: Nullable<number> = null;\r\n\r\n /**\r\n * The culling strategy to use to check whether the mesh must be rendered or not.\r\n * This value can be changed at any time and will be used on the next render mesh selection.\r\n * The possible values are :\r\n * - AbstractMesh.CULLINGSTRATEGY_STANDARD\r\n * - AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY\r\n * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION\r\n * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY\r\n * Please read each static variable documentation to get details about the culling process.\r\n * */\r\n public cullingStrategy = AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY;\r\n\r\n /**\r\n * Gets the number of facets in the mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\r\n */\r\n public get facetNb(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.facetNb;\r\n }\r\n /**\r\n * Gets or set the number (integer) of subdivisions per axis in the partitioning space\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\r\n */\r\n public get partitioningSubdivisions(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions;\r\n }\r\n public set partitioningSubdivisions(nb: number) {\r\n this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions = nb;\r\n }\r\n /**\r\n * The ratio (float) to apply to the bounding box size to set to the partitioning space.\r\n * Ex : 1.01 (default) the partitioning space is 1% bigger than the bounding box\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get partitioningBBoxRatio(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public set partitioningBBoxRatio(ratio: number) {\r\n this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio = ratio;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the facets must be depth sorted on next call to `updateFacetData()`.\r\n * Works only for updatable meshes.\r\n * Doesn't work with multi-materials\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\r\n */\r\n public get mustDepthSortFacets(): boolean {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSort;\r\n }\r\n public set mustDepthSortFacets(sort: boolean) {\r\n this._internalAbstractMeshDataInfo._facetData.facetDepthSort = sort;\r\n }\r\n\r\n /**\r\n * The location (Vector3) where the facet depth sort must be computed from.\r\n * By default, the active camera position.\r\n * Used only when facet depth sort is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\r\n */\r\n public get facetDepthSortFrom(): Vector3 {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom;\r\n }\r\n public set facetDepthSortFrom(location: Vector3) {\r\n this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom = location;\r\n }\r\n\r\n /** number of collision detection tries. Change this value if not all collisions are detected and handled properly */\r\n public get collisionRetryCount(): number {\r\n return this._internalAbstractMeshDataInfo._collisionRetryCount;\r\n }\r\n public set collisionRetryCount(retryCount: number) {\r\n this._internalAbstractMeshDataInfo._collisionRetryCount = retryCount;\r\n }\r\n /**\r\n * gets a boolean indicating if facetData is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\r\n */\r\n public get isFacetDataEnabled(): boolean {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDataEnabled;\r\n }\r\n\r\n /**\r\n * Gets or sets the morph target manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\r\n */\r\n public get morphTargetManager(): Nullable<MorphTargetManager> {\r\n return this._internalAbstractMeshDataInfo._morphTargetManager;\r\n }\r\n\r\n public set morphTargetManager(value: Nullable<MorphTargetManager>) {\r\n if (this._internalAbstractMeshDataInfo._morphTargetManager === value) {\r\n return;\r\n }\r\n this._internalAbstractMeshDataInfo._morphTargetManager = value;\r\n this._syncGeometryWithMorphTargetManager();\r\n }\r\n\r\n /**\r\n * Gets or sets the baked vertex animation manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/baked_texture_animations\r\n */\r\n public get bakedVertexAnimationManager(): Nullable<IBakedVertexAnimationManager> {\r\n return this._internalAbstractMeshDataInfo._bakedVertexAnimationManager;\r\n }\r\n\r\n public set bakedVertexAnimationManager(value: Nullable<IBakedVertexAnimationManager>) {\r\n if (this._internalAbstractMeshDataInfo._bakedVertexAnimationManager === value) {\r\n return;\r\n }\r\n this._internalAbstractMeshDataInfo._bakedVertexAnimationManager = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** @internal */\r\n public _syncGeometryWithMorphTargetManager(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _updateNonUniformScalingState(value: boolean): boolean {\r\n if (!super._updateNonUniformScalingState(value)) {\r\n return false;\r\n }\r\n this._markSubMeshesAsMiscDirty();\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public get rawBoundingInfo(): Nullable<BoundingInfo> {\r\n return this._internalAbstractMeshDataInfo._rawBoundingInfo;\r\n }\r\n public set rawBoundingInfo(boundingInfo: Nullable<BoundingInfo>) {\r\n this._internalAbstractMeshDataInfo._rawBoundingInfo = boundingInfo;\r\n }\r\n\r\n // Events\r\n\r\n /**\r\n * An event triggered when this mesh collides with another one\r\n */\r\n public onCollideObservable = new Observable<AbstractMesh>();\r\n\r\n /** Set a function to call when this mesh collides with another one */\r\n public set onCollide(callback: (collidedMesh?: AbstractMesh) => void) {\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver) {\r\n this.onCollideObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver);\r\n }\r\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver = this.onCollideObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the collision's position changes\r\n */\r\n public onCollisionPositionChangeObservable = new Observable<Vector3>();\r\n\r\n /** Set a function to call when the collision's position changes */\r\n public set onCollisionPositionChange(callback: () => void) {\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver) {\r\n this.onCollisionPositionChangeObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver);\r\n }\r\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver = this.onCollisionPositionChangeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when material is changed\r\n */\r\n public onMaterialChangedObservable = new Observable<AbstractMesh>();\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets or sets the orientation for POV movement & rotation\r\n */\r\n public definedFacingForward = true;\r\n\r\n /** @internal */\r\n public _occlusionQuery: Nullable<WebGLQuery | number> = null;\r\n\r\n /** @internal */\r\n public _renderingGroup: Nullable<RenderingGroup> = null;\r\n\r\n /**\r\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\r\n */\r\n public get visibility(): number {\r\n return this._internalAbstractMeshDataInfo._visibility;\r\n }\r\n\r\n /**\r\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\r\n */\r\n public set visibility(value: number) {\r\n if (this._internalAbstractMeshDataInfo._visibility === value) {\r\n return;\r\n }\r\n\r\n const oldValue = this._internalAbstractMeshDataInfo._visibility;\r\n\r\n this._internalAbstractMeshDataInfo._visibility = value;\r\n\r\n if ((oldValue === 1 && value !== 1) || (oldValue !== 1 && value === 1)) {\r\n this._markSubMeshesAsDirty((defines) => {\r\n defines.markAsMiscDirty();\r\n defines.markAsPrePassDirty();\r\n });\r\n }\r\n }\r\n\r\n /** Gets or sets the alpha index used to sort transparent meshes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#alpha-index\r\n */\r\n public alphaIndex = Number.MAX_VALUE;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be picked (by scene.pick for instance or through actions). Default is true\r\n */\r\n public isPickable = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be near picked (touched by the XR controller or hands). Default is false\r\n */\r\n public isNearPickable = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be grabbed. Default is false.\r\n * Setting this to true, while using the XR near interaction feature, will trigger a pointer event when the mesh is grabbed.\r\n * Grabbing means that the controller is using the squeeze or main trigger button to grab the mesh.\r\n * This is different from nearPickable which only triggers the event when the mesh is touched by the controller\r\n */\r\n public isNearGrabbable = false;\r\n\r\n /** Gets or sets a boolean indicating that bounding boxes of subMeshes must be rendered as well (false by default) */\r\n public showSubMeshesBoundingBox = false;\r\n\r\n /** Gets or sets a boolean indicating if the mesh must be considered as a ray blocker for lens flares (false by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare\r\n */\r\n public isBlocker = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that pointer move events must be supported on this mesh (false by default)\r\n */\r\n public enablePointerMoveEvents = false;\r\n\r\n /**\r\n * Gets or sets the property which disables the test that is checking that the mesh under the pointer is the same than the previous time we tested for it (default: false).\r\n * Set this property to true if you want thin instances picking to be reported accurately when moving over the mesh.\r\n * Note that setting this property to true will incur some performance penalties when dealing with pointer events for this mesh so use it sparingly.\r\n */\r\n public get pointerOverDisableMeshTesting() {\r\n return this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting;\r\n }\r\n\r\n public set pointerOverDisableMeshTesting(disable: boolean) {\r\n this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting = disable;\r\n }\r\n\r\n /**\r\n * Specifies the rendering group id for this mesh (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#rendering-groups\r\n */\r\n public get renderingGroupId() {\r\n return this._internalAbstractMeshDataInfo._renderingGroupId;\r\n }\r\n\r\n public set renderingGroupId(value: number) {\r\n this._internalAbstractMeshDataInfo._renderingGroupId = value;\r\n }\r\n\r\n /** Gets or sets current material */\r\n public get material(): Nullable<Material> {\r\n return this._internalAbstractMeshDataInfo._material;\r\n }\r\n public set material(value: Nullable<Material>) {\r\n this._setMaterial(value);\r\n }\r\n\r\n /** @internal */\r\n protected _setMaterial(value: Nullable<Material>) {\r\n if (this._internalAbstractMeshDataInfo._material === value) {\r\n return;\r\n }\r\n\r\n // remove from material mesh map id needed\r\n if (this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap) {\r\n this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = undefined;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._material = value;\r\n\r\n if (value && value.meshMap) {\r\n value.meshMap[this.uniqueId] = this;\r\n }\r\n\r\n if (this.onMaterialChangedObservable.hasObservers()) {\r\n this.onMaterialChangedObservable.notifyObservers(this);\r\n }\r\n\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n this.resetDrawCache(undefined, value == null);\r\n this._unBindEffect();\r\n }\r\n\r\n /**\r\n * Gets the material used to render the mesh in a specific render pass\r\n * @param renderPassId render pass id\r\n * @returns material used for the render pass. If no specific material is used for this render pass, undefined is returned (meaning mesh.material is used for this pass)\r\n */\r\n public getMaterialForRenderPass(renderPassId: number): Material | undefined {\r\n return this._internalAbstractMeshDataInfo._materialForRenderPass?.[renderPassId];\r\n }\r\n\r\n /**\r\n * Sets the material to be used to render the mesh in a specific render pass\r\n * @param renderPassId render pass id\r\n * @param material material to use for this render pass. If undefined is passed, no specific material will be used for this render pass but the regular material will be used instead (mesh.material)\r\n */\r\n public setMaterialForRenderPass(renderPassId: number, material?: Material): void {\r\n this.resetDrawCache(renderPassId);\r\n if (!this._internalAbstractMeshDataInfo._materialForRenderPass) {\r\n this._internalAbstractMeshDataInfo._materialForRenderPass = [];\r\n }\r\n const currentMaterial = this._internalAbstractMeshDataInfo._materialForRenderPass[renderPassId];\r\n if (currentMaterial?.meshMap?.[this.uniqueId]) {\r\n currentMaterial.meshMap[this.uniqueId] = undefined;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._materialForRenderPass[renderPassId] = material;\r\n if (material && material.meshMap) {\r\n material.meshMap[this.uniqueId] = this;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh can receive realtime shadows\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows\r\n */\r\n public get receiveShadows(): boolean {\r\n return this._internalAbstractMeshDataInfo._receiveShadows;\r\n }\r\n public set receiveShadows(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._receiveShadows === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._receiveShadows = value;\r\n this._markSubMeshesAsLightDirty();\r\n }\r\n\r\n /** Defines color to use when rendering outline */\r\n public outlineColor = Color3.Red();\r\n /** Define width to use when rendering outline */\r\n public outlineWidth = 0.02;\r\n\r\n /** Defines color to use when rendering overlay */\r\n public overlayColor = Color3.Red();\r\n /** Defines alpha to use when rendering overlay */\r\n public overlayAlpha = 0.5;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh needs to use vertex alpha data to render.\r\n * This property is misnamed and should be `useVertexAlpha`. Note that the mesh will be rendered\r\n * with alpha blending when this flag is set even if vertex alpha data is missing from the geometry.\r\n */\r\n public get hasVertexAlpha(): boolean {\r\n return this._internalAbstractMeshDataInfo._hasVertexAlpha;\r\n }\r\n public set hasVertexAlpha(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._hasVertexAlpha === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._hasVertexAlpha = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n this._markSubMeshesAsMiscDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this mesh needs to use vertex color data to render (if this kind of vertex data is available in the geometry) */\r\n public get useVertexColors(): boolean {\r\n return this._internalAbstractMeshDataInfo._useVertexColors;\r\n }\r\n public set useVertexColors(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._useVertexColors === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._useVertexColors = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that bone animations must be computed by the GPU (true by default)\r\n */\r\n public get computeBonesUsingShaders(): boolean {\r\n return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;\r\n }\r\n public set computeBonesUsingShaders(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._computeBonesUsingShaders === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._computeBonesUsingShaders = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** Gets or sets the number of allowed bone influences per vertex (4 by default) */\r\n public get numBoneInfluencers(): number {\r\n return this._internalAbstractMeshDataInfo._numBoneInfluencers;\r\n }\r\n public set numBoneInfluencers(value: number) {\r\n if (this._internalAbstractMeshDataInfo._numBoneInfluencers === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._numBoneInfluencers = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this mesh will allow fog to be rendered on it (true by default) */\r\n public get applyFog(): boolean {\r\n return this._internalAbstractMeshDataInfo._applyFog;\r\n }\r\n public set applyFog(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._applyFog === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._applyFog = value;\r\n this._markSubMeshesAsMiscDirty();\r\n }\r\n\r\n /** When enabled, decompose picking matrices for better precision with large values for mesh position and scling */\r\n public get enableDistantPicking(): boolean {\r\n return this._internalAbstractMeshDataInfo._enableDistantPicking;\r\n }\r\n public set enableDistantPicking(value: boolean) {\r\n this._internalAbstractMeshDataInfo._enableDistantPicking = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes selection (true by default) */\r\n public useOctreeForRenderingSelection = true;\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes picking (true by default) */\r\n public useOctreeForPicking = true;\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes collision (true by default) */\r\n public useOctreeForCollisions = true;\r\n /**\r\n * Gets or sets the current layer mask (default is 0x0FFFFFFF)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/layerMasksAndMultiCam\r\n */\r\n public get layerMask(): number {\r\n return this._internalAbstractMeshDataInfo._layerMask;\r\n }\r\n\r\n public set layerMask(value: number) {\r\n if (value === this._internalAbstractMeshDataInfo._layerMask) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._layerMask = value;\r\n this._resyncLightSources();\r\n }\r\n\r\n /**\r\n * True if the mesh must be rendered in any case (this will shortcut the frustum clipping phase)\r\n */\r\n public alwaysSelectAsActiveMesh = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the bounding info does not need to be kept in sync (for performance reason)\r\n */\r\n public doNotSyncBoundingInfo = false;\r\n\r\n /**\r\n * Gets or sets the current action manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions\r\n */\r\n public actionManager: Nullable<AbstractActionManager> = null;\r\n\r\n /**\r\n * Gets or sets the ellipsoid used to impersonate this mesh when using collision engine (default is (0.5, 1, 0.5))\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public ellipsoid = new Vector3(0.5, 1, 0.5);\r\n /**\r\n * Gets or sets the ellipsoid offset used to impersonate this mesh when using collision engine (default is (0, 0, 0))\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public ellipsoidOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets a collision mask used to mask collisions (default is -1).\r\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\r\n */\r\n public get collisionMask(): number {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask;\r\n }\r\n\r\n public set collisionMask(mask: number) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * Gets or sets a collision response flag (default is true).\r\n * when collisionResponse is false, events are still triggered but colliding entity has no response\r\n * This helps creating trigger volume when user wants collision feedback events but not position/velocity\r\n * to respond to the collision.\r\n */\r\n public get collisionResponse(): boolean {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse;\r\n }\r\n\r\n public set collisionResponse(response: boolean) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse = response;\r\n }\r\n /**\r\n * Gets or sets the current collision group mask (-1 by default).\r\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\r\n */\r\n public get collisionGroup(): number {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup;\r\n }\r\n\r\n public set collisionGroup(mask: number) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * Gets or sets current surrounding meshes (null by default).\r\n *\r\n * By default collision detection is tested against every mesh in the scene.\r\n * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified\r\n * meshes will be tested for the collision.\r\n *\r\n * Note: if set to an empty array no collision will happen when this mesh is moved.\r\n */\r\n public get surroundingMeshes(): Nullable<AbstractMesh[]> {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes;\r\n }\r\n\r\n public set surroundingMeshes(meshes: Nullable<AbstractMesh[]>) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes = meshes;\r\n }\r\n\r\n // Edges\r\n /**\r\n * Defines edge width used when edgesRenderer is enabled\r\n * @see https://www.babylonjs-playground.com/#10OJSG#13\r\n */\r\n public edgesWidth = 1;\r\n /**\r\n * Defines edge color used when edgesRenderer is enabled\r\n * @see https://www.babylonjs-playground.com/#10OJSG#13\r\n */\r\n public edgesColor = new Color4(1, 0, 0, 1);\r\n /** @internal */\r\n public _edgesRenderer: Nullable<IEdgesRenderer> = null;\r\n\r\n /** @internal */\r\n public _masterMesh: Nullable<AbstractMesh> = null;\r\n protected _boundingInfo: Nullable<BoundingInfo> = null;\r\n protected _boundingInfoIsDirty = true;\r\n /** @internal */\r\n public _renderId = 0;\r\n\r\n /**\r\n * Gets or sets the list of subMeshes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\r\n */\r\n public subMeshes: SubMesh[];\r\n\r\n /** @internal */\r\n public _intersectionsInProgress = new Array<AbstractMesh>();\r\n\r\n /** @internal */\r\n public _unIndexed = false;\r\n\r\n /** @internal */\r\n public _lightSources = new Array<Light>();\r\n\r\n /** Gets the list of lights affecting that mesh */\r\n public get lightSources(): Light[] {\r\n return this._lightSources;\r\n }\r\n\r\n /** @internal */\r\n public abstract get _positions(): Nullable<Vector3[]>;\r\n\r\n // Loading properties\r\n /** @internal */\r\n public _waitingData: {\r\n lods: Nullable<any>;\r\n actions: Nullable<any>;\r\n freezeWorldMatrix: Nullable<boolean>;\r\n } = {\r\n lods: null,\r\n actions: null,\r\n freezeWorldMatrix: null,\r\n };\r\n\r\n /** @internal */\r\n public _bonesTransformMatrices: Nullable<Float32Array> = null;\r\n\r\n /** @internal */\r\n public _transformMatrixTexture: Nullable<RawTexture> = null;\r\n\r\n /**\r\n * Gets or sets a skeleton to apply skinning transformations\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons\r\n */\r\n public set skeleton(value: Nullable<Skeleton>) {\r\n const skeleton = this._internalAbstractMeshDataInfo._skeleton;\r\n if (skeleton && skeleton.needInitialSkinMatrix) {\r\n skeleton._unregisterMeshWithPoseMatrix(this);\r\n }\r\n\r\n if (value && value.needInitialSkinMatrix) {\r\n value._registerMeshWithPoseMatrix(this);\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._skeleton = value;\r\n\r\n if (!this._internalAbstractMeshDataInfo._skeleton) {\r\n this._bonesTransformMatrices = null;\r\n }\r\n\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n public get skeleton(): Nullable<Skeleton> {\r\n return this._internalAbstractMeshDataInfo._skeleton;\r\n }\r\n\r\n /**\r\n * An event triggered when the mesh is rebuilt.\r\n */\r\n public onRebuildObservable = new Observable<AbstractMesh>();\r\n\r\n /**\r\n * The current mesh uniform buffer.\r\n * @internal Internal use only.\r\n */\r\n public _uniformBuffer: UniformBuffer;\r\n\r\n // Constructor\r\n\r\n /**\r\n * Creates a new AbstractMesh\r\n * @param name defines the name of the mesh\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(name: string, scene: Nullable<Scene> = null) {\r\n super(name, scene, false);\r\n\r\n scene = this.getScene();\r\n\r\n scene.addMesh(this);\r\n\r\n this._resyncLightSources();\r\n\r\n // Mesh Uniform Buffer.\r\n this._uniformBuffer = new UniformBuffer(this.getScene().getEngine(), undefined, undefined, name, !this.getScene().getEngine().isWebGPU);\r\n this._buildUniformLayout();\r\n\r\n switch (scene.performancePriority) {\r\n case ScenePerformancePriority.Aggressive:\r\n this.doNotSyncBoundingInfo = true;\r\n // eslint-disable-next-line no-fallthrough\r\n case ScenePerformancePriority.Intermediate:\r\n this.alwaysSelectAsActiveMesh = true;\r\n this.isPickable = false;\r\n break;\r\n }\r\n }\r\n\r\n protected _buildUniformLayout(): void {\r\n this._uniformBuffer.addUniform(\"world\", 16);\r\n this._uniformBuffer.addUniform(\"visibility\", 1);\r\n this._uniformBuffer.create();\r\n }\r\n\r\n /**\r\n * Transfer the mesh values to its UBO.\r\n * @param world The world matrix associated with the mesh\r\n */\r\n public transferToEffect(world: Matrix): void {\r\n const ubo = this._uniformBuffer;\r\n\r\n ubo.updateMatrix(\"world\", world);\r\n ubo.updateFloat(\"visibility\", this._internalAbstractMeshDataInfo._visibility);\r\n\r\n ubo.update();\r\n }\r\n\r\n /**\r\n * Gets the mesh uniform buffer.\r\n * @returns the uniform buffer of the mesh.\r\n */\r\n public getMeshUniformBuffer(): UniformBuffer {\r\n return this._uniformBuffer;\r\n }\r\n\r\n /**\r\n * Returns the string \"AbstractMesh\"\r\n * @returns \"AbstractMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"AbstractMesh\";\r\n }\r\n\r\n /**\r\n * Gets a string representation of the current mesh\r\n * @param fullDetails defines a boolean indicating if full details must be included\r\n * @returns a string representation of the current mesh\r\n */\r\n public override toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name + \", isInstance: \" + (this.getClassName() === \"InstancedMesh\" ? \"YES\" : \"NO\");\r\n ret += \", # of submeshes: \" + (this.subMeshes ? this.subMeshes.length : 0);\r\n\r\n const skeleton = this._internalAbstractMeshDataInfo._skeleton;\r\n if (skeleton) {\r\n ret += \", skeleton: \" + skeleton.name;\r\n }\r\n if (fullDetails) {\r\n ret += \", billboard mode: \" + [\"NONE\", \"X\", \"Y\", null, \"Z\", null, null, \"ALL\"][this.billboardMode];\r\n ret += \", freeze wrld mat: \" + (this._isWorldMatrixFrozen || this._waitingData.freezeWorldMatrix ? \"YES\" : \"NO\");\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected override _getEffectiveParent(): Nullable<Node> {\r\n if (this._masterMesh && this.billboardMode !== TransformNode.BILLBOARDMODE_NONE) {\r\n return this._masterMesh;\r\n }\r\n\r\n return super._getEffectiveParent();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _getActionManagerForTrigger(trigger?: number, initialCall = true): Nullable<AbstractActionManager> {\r\n if (this.actionManager && (initialCall || this.actionManager.isRecursive)) {\r\n if (trigger) {\r\n if (this.actionManager.hasSpecificTrigger(trigger)) {\r\n return this.actionManager;\r\n }\r\n } else {\r\n return this.actionManager;\r\n }\r\n }\r\n\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n return this.parent._getActionManagerForTrigger(trigger, false);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _rebuild(dispose = false): void {\r\n this.onRebuildObservable.notifyObservers(this);\r\n\r\n if (this._occlusionQuery !== null) {\r\n this._occlusionQuery = null;\r\n }\r\n\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n subMesh._rebuild();\r\n }\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /** @internal */\r\n public _resyncLightSources(): void {\r\n this._lightSources.length = 0;\r\n\r\n for (const light of this.getScene().lights) {\r\n if (!light.isEnabled()) {\r\n continue;\r\n }\r\n\r\n if (light.canAffectMesh(this)) {\r\n this._lightSources.push(light);\r\n }\r\n }\r\n\r\n this._markSubMeshesAsLightDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _resyncLightSource(light: Light): void {\r\n const isIn = light.isEnabled() && light.canAffectMesh(this) && light.internalEnabled;\r\n\r\n const index = this._lightSources.indexOf(light);\r\n let removed = false;\r\n if (index === -1) {\r\n if (!isIn) {\r\n return;\r\n }\r\n this._lightSources.push(light);\r\n } else {\r\n if (isIn) {\r\n return;\r\n }\r\n removed = true;\r\n this._lightSources.splice(index, 1);\r\n }\r\n\r\n this._markSubMeshesAsLightDirty(removed);\r\n }\r\n\r\n /** @internal */\r\n public _unBindEffect() {\r\n for (const subMesh of this.subMeshes) {\r\n subMesh.setEffect(null);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _removeLightSource(light: Light, dispose: boolean): void {\r\n const index = this._lightSources.indexOf(light);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n this._lightSources.splice(index, 1);\r\n\r\n this._markSubMeshesAsLightDirty(dispose);\r\n }\r\n\r\n private _markSubMeshesAsDirty(func: (defines: MaterialDefines) => void) {\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n for (let i = 0; i < subMesh._drawWrappers.length; ++i) {\r\n const drawWrapper = subMesh._drawWrappers[i];\r\n if (!drawWrapper || !drawWrapper.defines || !(drawWrapper.defines as MaterialDefines).markAllAsDirty) {\r\n continue;\r\n }\r\n func(drawWrapper.defines as MaterialDefines);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _markSubMeshesAsLightDirty(dispose: boolean = false) {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsLightDirty(dispose));\r\n }\r\n\r\n /** @internal */\r\n public _markSubMeshesAsAttributesDirty() {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsAttributesDirty());\r\n }\r\n\r\n /** @internal */\r\n public _markSubMeshesAsMiscDirty() {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsMiscDirty());\r\n }\r\n\r\n /**\r\n * Flag the AbstractMesh as dirty (Forcing it to update everything)\r\n * @param property if set to \"rotation\" the objects rotationQuaternion will be set to null\r\n * @returns this AbstractMesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override markAsDirty(property?: string): AbstractMesh {\r\n this._currentRenderId = Number.MAX_VALUE;\r\n super.markAsDirty(property);\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache for all submeshes of this abstract mesh\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n * @param immediate If true, the effect will be released immediately, otherwise it will be released at the next frame\r\n */\r\n public resetDrawCache(passId?: number, immediate = false): void {\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n subMesh.resetDrawCache(passId, immediate);\r\n }\r\n }\r\n\r\n // Methods\r\n /**\r\n * Returns true if the mesh is blocked. Implemented by child classes\r\n */\r\n public get isBlocked(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns the mesh itself by default. Implemented by child classes\r\n * @param camera defines the camera to use to pick the right LOD level\r\n * @returns the currentAbstractMesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getLOD(camera: Camera): Nullable<AbstractMesh> {\r\n return this;\r\n }\r\n\r\n /**\r\n * The mesh's internal Geometry object. Implemented by child classes.\r\n */\r\n public abstract get geometry(): Nullable<Geometry>;\r\n\r\n /**\r\n * Returns 0 by default. Implemented by child classes\r\n * @returns an integer\r\n */\r\n public getTotalVertices(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Returns a positive integer : the total number of indices in this mesh geometry.\r\n * @returns the number of indices or zero if the mesh has no geometry.\r\n */\r\n public getTotalIndices(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Returns null by default. Implemented by child classes\r\n * @returns null\r\n */\r\n public getIndices(): Nullable<IndicesArray> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the array of the requested vertex data kind. Implemented by child classes\r\n * @param kind defines the vertex data kind to use\r\n * @returns null\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getVerticesData(kind: string): Nullable<FloatArray> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Copies the requested vertex data kind into the given vertex data map. Float data is constructed if the map doesn't have the data.\r\n * @param kind defines the vertex data kind to use\r\n * @param vertexData defines the map that stores the resulting data\r\n */\r\n public abstract copyVerticesData(kind: string, vertexData: { [kind: string]: Float32Array }): void;\r\n\r\n /**\r\n * Returns the mesh VertexBuffer object from the requested `kind`\r\n * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.NormalKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns a FloatArray or null if the mesh has no vertex buffer for this kind.\r\n */\r\n public abstract getVertexBuffer(kind: string, bypassInstanceData?: boolean): Nullable<VertexBuffer>;\r\n\r\n /**\r\n * Sets the vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.\r\n * Note that a new underlying VertexBuffer object is created each call.\r\n * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\r\n * @param kind defines vertex data kind:\r\n * * VertexBuffer.PositionKind\r\n * * VertexBuffer.UVKind\r\n * * VertexBuffer.UV2Kind\r\n * * VertexBuffer.UV3Kind\r\n * * VertexBuffer.UV4Kind\r\n * * VertexBuffer.UV5Kind\r\n * * VertexBuffer.UV6Kind\r\n * * VertexBuffer.ColorKind\r\n * * VertexBuffer.MatricesIndicesKind\r\n * * VertexBuffer.MatricesIndicesExtraKind\r\n * * VertexBuffer.MatricesWeightsKind\r\n * * VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updatable defines if the data must be flagged as updatable (or static)\r\n * @param stride defines the vertex stride (size of an entire vertex). Can be null and in this case will be deduced from vertex data kind\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setVerticesData(kind: string, data: FloatArray, updatable?: boolean, stride?: number): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the existing vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, it is simply returned as it is.\r\n * @param kind defines vertex data kind:\r\n * * VertexBuffer.PositionKind\r\n * * VertexBuffer.UVKind\r\n * * VertexBuffer.UV2Kind\r\n * * VertexBuffer.UV3Kind\r\n * * VertexBuffer.UV4Kind\r\n * * VertexBuffer.UV5Kind\r\n * * VertexBuffer.UV6Kind\r\n * * VertexBuffer.ColorKind\r\n * * VertexBuffer.MatricesIndicesKind\r\n * * VertexBuffer.MatricesIndicesExtraKind\r\n * * VertexBuffer.MatricesWeightsKind\r\n * * VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updateExtends If `kind` is `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed\r\n * @param makeItUnique If true, a new global geometry is created from this data and is set to the mesh\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the mesh indices,\r\n * If the mesh has no geometry, a new Geometry object is created and set to the mesh.\r\n * @param indices Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array)\r\n * @param totalVertices Defines the total number of vertices\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setIndices(indices: IndicesArray, totalVertices: Nullable<number>): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if specific vertex data is present\r\n * @param kind defines the vertex data kind to use\r\n * @returns true is data kind is present\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isVerticesDataPresent(kind: string): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns the mesh BoundingInfo object or creates a new one and returns if it was undefined.\r\n * Note that it returns a shallow bounding of the mesh (i.e. it does not include children).\r\n * However, if the mesh contains thin instances, it will be expanded to include them. If you want the \"raw\" bounding data instead, then use `getRawBoundingInfo()`.\r\n * To get the full bounding of all children, call `getHierarchyBoundingVectors` instead.\r\n * @returns a BoundingInfo\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this._masterMesh) {\r\n return this._masterMesh.getBoundingInfo();\r\n }\r\n\r\n if (this._boundingInfoIsDirty) {\r\n this._boundingInfoIsDirty = false;\r\n // this._boundingInfo is being created if undefined\r\n this._updateBoundingInfo();\r\n }\r\n // cannot be null.\r\n return this._boundingInfo!;\r\n }\r\n\r\n /**\r\n * Returns the bounding info unnafected by instance data.\r\n * @returns the bounding info of the mesh unaffected by instance data.\r\n */\r\n public getRawBoundingInfo() {\r\n return this.rawBoundingInfo ?? this.getBoundingInfo();\r\n }\r\n\r\n /**\r\n * Overwrite the current bounding info\r\n * @param boundingInfo defines the new bounding info\r\n * @returns the current mesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): AbstractMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns true if there is already a bounding info\r\n */\r\n public get hasBoundingInfo(): boolean {\r\n return this._boundingInfo !== null;\r\n }\r\n\r\n /**\r\n * Creates a new bounding info for the mesh\r\n * @param minimum min vector of the bounding box/sphere\r\n * @param maximum max vector of the bounding box/sphere\r\n * @param worldMatrix defines the new world matrix\r\n * @returns the new bounding info\r\n */\r\n public buildBoundingInfo(minimum: DeepImmutable<Vector3>, maximum: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>) {\r\n this._boundingInfo = new BoundingInfo(minimum, maximum, worldMatrix);\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)\r\n * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false\r\n * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false\r\n * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling\r\n * @returns the current mesh\r\n */\r\n public override normalizeToUnitCube(includeDescendants = true, ignoreRotation = false, predicate?: Nullable<(node: AbstractMesh) => boolean>): AbstractMesh {\r\n return <AbstractMesh>super.normalizeToUnitCube(includeDescendants, ignoreRotation, predicate);\r\n }\r\n\r\n /** Gets a boolean indicating if this mesh has skinning data and an attached skeleton */\r\n public get useBones(): boolean {\r\n return <boolean>(\r\n (this.skeleton &&\r\n this.getScene().skeletonsEnabled &&\r\n this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind) &&\r\n this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind))\r\n );\r\n }\r\n\r\n /** @internal */\r\n public _preActivate(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _preActivateForIntermediateRendering(renderId: number): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _activate(renderId: number, intermediateRendering: boolean): boolean {\r\n this._renderId = renderId;\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _postActivate(): void {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _freeze() {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _unFreeze() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Gets the current world matrix\r\n * @returns a Matrix\r\n */\r\n public override getWorldMatrix(): Matrix {\r\n if (this._masterMesh && this.billboardMode === TransformNode.BILLBOARDMODE_NONE) {\r\n return this._masterMesh.getWorldMatrix();\r\n }\r\n\r\n return super.getWorldMatrix();\r\n }\r\n\r\n /** @internal */\r\n public override _getWorldMatrixDeterminant(): number {\r\n if (this._masterMesh) {\r\n return this._masterMesh._getWorldMatrixDeterminant();\r\n }\r\n\r\n return super._getWorldMatrixDeterminant();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh is an instance or a regular mesh\r\n */\r\n public get isAnInstance(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh has instances\r\n */\r\n public get hasInstances(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh has thin instances\r\n */\r\n public get hasThinInstances(): boolean {\r\n return false;\r\n }\r\n\r\n // ================================== Point of View Movement =================================\r\n\r\n /**\r\n * Perform relative position change from the point of view of behind the front of the mesh.\r\n * This is performed taking into account the meshes current rotation, so you do not have to care.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param amountRight defines the distance on the right axis\r\n * @param amountUp defines the distance on the up axis\r\n * @param amountForward defines the distance on the forward axis\r\n * @returns the current mesh\r\n */\r\n public movePOV(amountRight: number, amountUp: number, amountForward: number): AbstractMesh {\r\n this.position.addInPlace(this.calcMovePOV(amountRight, amountUp, amountForward));\r\n return this;\r\n }\r\n\r\n /**\r\n * Calculate relative position change from the point of view of behind the front of the mesh.\r\n * This is performed taking into account the meshes current rotation, so you do not have to care.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param amountRight defines the distance on the right axis\r\n * @param amountUp defines the distance on the up axis\r\n * @param amountForward defines the distance on the forward axis\r\n * @returns the new displacement vector\r\n */\r\n public calcMovePOV(amountRight: number, amountUp: number, amountForward: number): Vector3 {\r\n const rotMatrix = new Matrix();\r\n const rotQuaternion = this.rotationQuaternion ? this.rotationQuaternion : Quaternion.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z);\r\n rotQuaternion.toRotationMatrix(rotMatrix);\r\n\r\n const translationDelta = Vector3.Zero();\r\n const defForwardMult = this.definedFacingForward ? -1 : 1;\r\n Vector3.TransformCoordinatesFromFloatsToRef(amountRight * defForwardMult, amountUp, amountForward * defForwardMult, rotMatrix, translationDelta);\r\n return translationDelta;\r\n }\r\n // ================================== Point of View Rotation =================================\r\n /**\r\n * Perform relative rotation change from the point of view of behind the front of the mesh.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param flipBack defines the flip\r\n * @param twirlClockwise defines the twirl\r\n * @param tiltRight defines the tilt\r\n * @returns the current mesh\r\n */\r\n public rotatePOV(flipBack: number, twirlClockwise: number, tiltRight: number): AbstractMesh {\r\n this.rotation.addInPlace(this.calcRotatePOV(flipBack, twirlClockwise, tiltRight));\r\n return this;\r\n }\r\n\r\n /**\r\n * Calculate relative rotation change from the point of view of behind the front of the mesh.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param flipBack defines the flip\r\n * @param twirlClockwise defines the twirl\r\n * @param tiltRight defines the tilt\r\n * @returns the new rotation vector\r\n */\r\n public calcRotatePOV(flipBack: number, twirlClockwise: number, tiltRight: number): Vector3 {\r\n const defForwardMult = this.definedFacingForward ? 1 : -1;\r\n return new Vector3(flipBack * defForwardMult, twirlClockwise, tiltRight * defForwardMult);\r\n }\r\n\r\n /**\r\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\r\n * This means the mesh underlying bounding box and sphere are recomputed.\r\n * @param options defines a set of options for computing the bounding info\r\n * @returns the current mesh\r\n */\r\n public abstract refreshBoundingInfo(options: IMeshDataOptions): AbstractMesh;\r\n\r\n /**\r\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\r\n * This means the mesh underlying bounding box and sphere are recomputed.\r\n * @param applySkeletonOrOptions defines whether to apply the skeleton before computing the bounding info or a set of options\r\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\r\n * @returns the current mesh\r\n */\r\n public abstract refreshBoundingInfo(applySkeletonOrOptions: boolean | IMeshDataOptions, applyMorph: boolean): AbstractMesh;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _refreshBoundingInfo(data: Nullable<FloatArray>, bias: Nullable<Vector2>): void {\r\n if (data) {\r\n const extend = extractMinAndMax(data, 0, this.getTotalVertices(), bias);\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n }\r\n\r\n if (this.subMeshes) {\r\n for (let index = 0; index < this.subMeshes.length; index++) {\r\n this.subMeshes[index].refreshBoundingInfo(data);\r\n }\r\n }\r\n\r\n this._updateBoundingInfo();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _refreshBoundingInfoDirect(extend: { minimum: Vector3; maximum: Vector3 }): void {\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n\r\n if (this.subMeshes) {\r\n for (let index = 0; index < this.subMeshes.length; index++) {\r\n this.subMeshes[index].refreshBoundingInfo(null);\r\n }\r\n }\r\n\r\n this._updateBoundingInfo();\r\n }\r\n\r\n // This function is only here so we can apply the nativeOverride decorator.\r\n @nativeOverride.filter(\r\n (...[data, matricesIndicesData, matricesWeightsData, matricesIndicesExtraData, matricesWeightsExtraData]: Parameters<typeof AbstractMesh._ApplySkeleton>) =>\r\n !Array.isArray(data) &&\r\n !Array.isArray(matricesIndicesData) &&\r\n !Array.isArray(matricesWeightsData) &&\r\n !Array.isArray(matricesIndicesExtraData) &&\r\n !Array.isArray(matricesWeightsExtraData)\r\n )\r\n private static _ApplySkeleton(\r\n data: FloatArray,\r\n kind: string,\r\n skeletonMatrices: Float32Array,\r\n matricesIndicesData: FloatArray,\r\n matricesWeightsData: FloatArray,\r\n matricesIndicesExtraData: Nullable<FloatArray>,\r\n matricesWeightsExtraData: Nullable<FloatArray>\r\n ): void {\r\n ApplySkeleton(data, kind, skeletonMatrices, matricesIndicesData, matricesWeightsData, matricesIndicesExtraData, matricesWeightsExtraData);\r\n }\r\n\r\n /** @internal */\r\n public _getData(options: IMeshDataOptions, data: Nullable<FloatArray>, kind: string = VertexBuffer.PositionKind): Nullable<FloatArray> {\r\n const cache = options.cache;\r\n\r\n const getVertexData = (kind: string): Nullable<FloatArray> => {\r\n if (cache) {\r\n const vertexData = (cache._vertexData ||= {});\r\n if (!vertexData[kind]) {\r\n this.copyVerticesData(kind, vertexData);\r\n }\r\n return vertexData[kind];\r\n }\r\n\r\n return this.getVerticesData(kind);\r\n };\r\n\r\n data ||= getVertexData(kind);\r\n if (!data) {\r\n return null;\r\n }\r\n\r\n if (cache) {\r\n if (cache._outputData) {\r\n cache._outputData.set(data);\r\n } else {\r\n cache._outputData = new Float32Array(data);\r\n }\r\n\r\n data = cache._outputData;\r\n } else if ((options.applyMorph && this.morphTargetManager) || (options.applySkeleton && this.skeleton)) {\r\n data = data.slice();\r\n }\r\n\r\n if (options.applyMorph && this.morphTargetManager) {\r\n ApplyMorph(data, kind, this.morphTargetManager);\r\n }\r\n\r\n if (options.applySkeleton && this.skeleton) {\r\n const matricesIndicesData = getVertexData(VertexBuffer.MatricesIndicesKind);\r\n const matricesWeightsData = getVertexData(VertexBuffer.MatricesWeightsKind);\r\n if (matricesWeightsData && matricesIndicesData) {\r\n const needExtras = this.numBoneInfluencers > 4;\r\n const matricesIndicesExtraData = needExtras ? getVertexData(VertexBuffer.MatricesIndicesExtraKind) : null;\r\n const matricesWeightsExtraData = needExtras ? getVertexData(VertexBuffer.MatricesWeightsExtraKind) : null;\r\n const skeletonMatrices = this.skeleton.getTransformMatrices(this);\r\n AbstractMesh._ApplySkeleton(data, kind, skeletonMatrices, matricesIndicesData, matricesWeightsData, matricesIndicesExtraData, matricesWeightsExtraData);\r\n }\r\n }\r\n\r\n if (options.updatePositionsArray !== false && kind === VertexBuffer.PositionKind) {\r\n const positions = this._internalAbstractMeshDataInfo._positions || [];\r\n const previousLength = positions.length;\r\n positions.length = data.length / 3;\r\n if (previousLength < positions.length) {\r\n for (let positionIndex = previousLength; positionIndex < positions.length; positionIndex++) {\r\n positions[positionIndex] = new Vector3();\r\n }\r\n }\r\n\r\n for (let positionIndex = 0, dataIndex = 0; positionIndex < positions.length; positionIndex++, dataIndex += 3) {\r\n positions[positionIndex].copyFromFloats(data[dataIndex], data[dataIndex + 1], data[dataIndex + 2]);\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._positions = positions;\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Get the normals vertex data and optionally apply skeleton and morphing.\r\n * @param applySkeleton defines whether to apply the skeleton\r\n * @param applyMorph defines whether to apply the morph target\r\n * @returns the normals data\r\n */\r\n public getNormalsData(applySkeleton = false, applyMorph = false): Nullable<FloatArray> {\r\n return this._getData({ applySkeleton, applyMorph, updatePositionsArray: false }, null, VertexBuffer.NormalKind);\r\n }\r\n\r\n /**\r\n * Get the position vertex data and optionally apply skeleton and morphing.\r\n * @param applySkeleton defines whether to apply the skeleton\r\n * @param applyMorph defines whether to apply the morph target\r\n * @param data defines the position data to apply the skeleton and morph to\r\n * @returns the position data\r\n */\r\n public getPositionData(applySkeleton: boolean = false, applyMorph: boolean = false, data: Nullable<FloatArray> = null): Nullable<FloatArray> {\r\n return this._getData({ applySkeleton, applyMorph, updatePositionsArray: false }, data, VertexBuffer.PositionKind);\r\n }\r\n\r\n /** @internal */\r\n public _updateBoundingInfo(): AbstractMesh {\r\n if (this._boundingInfo) {\r\n this._boundingInfo.update(this.worldMatrixFromCache);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(Vector3.Zero(), Vector3.Zero(), this.worldMatrixFromCache);\r\n }\r\n this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateSubMeshesBoundingInfo(matrix: DeepImmutable<Matrix>): AbstractMesh {\r\n if (!this.subMeshes) {\r\n return this;\r\n }\r\n const count = this.subMeshes.length;\r\n for (let subIndex = 0; subIndex < count; subIndex++) {\r\n const subMesh = this.subMeshes[subIndex];\r\n if (count > 1 || !subMesh.IsGlobal) {\r\n subMesh.updateBoundingInfo(matrix);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n protected override _afterComputeWorldMatrix(): void {\r\n if (this.doNotSyncBoundingInfo) {\r\n return;\r\n }\r\n // Bounding info\r\n this._boundingInfoIsDirty = true;\r\n }\r\n\r\n /**\r\n * Returns `true` if the mesh is within the frustum defined by the passed array of planes.\r\n * A mesh is in the frustum if its bounding box intersects the frustum\r\n * @param frustumPlanes defines the frustum to test\r\n * @returns true if the mesh is in the frustum planes\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n return this.getBoundingInfo().isInFrustum(frustumPlanes, this.cullingStrategy);\r\n }\r\n\r\n /**\r\n * Returns `true` if the mesh is completely in the frustum defined be the passed array of planes.\r\n * A mesh is completely in the frustum if its bounding box it completely inside the frustum.\r\n * @param frustumPlanes defines the frustum to test\r\n * @returns true if the mesh is completely in the frustum planes\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n return this.getBoundingInfo().isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * True if the mesh intersects another mesh or a SolidParticle object\r\n * @param mesh defines a target mesh or SolidParticle to test\r\n * @param precise Unless the parameter `precise` is set to `true` the intersection is computed according to Axis Aligned Bounding Boxes (AABB), else according to OBB (Oriented BBoxes)\r\n * @param includeDescendants Can be set to true to test if the mesh defined in parameters intersects with the current mesh or any child meshes\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsMesh(mesh: AbstractMesh | SolidParticle, precise: boolean = false, includeDescendants?: boolean): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n const otherBoundingInfo = mesh.getBoundingInfo();\r\n\r\n if (boundingInfo.intersects(otherBoundingInfo, precise)) {\r\n return true;\r\n }\r\n\r\n if (includeDescendants) {\r\n for (const child of this.getChildMeshes()) {\r\n if (child.intersectsMesh(mesh, precise, true)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns true if the passed point (Vector3) is inside the mesh bounding box\r\n * @param point defines the point to test\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsPoint(point: Vector3): boolean {\r\n return this.getBoundingInfo().intersectsPoint(point);\r\n }\r\n\r\n // Collisions\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh can be used in the collision engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public get checkCollisions(): boolean {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions;\r\n }\r\n\r\n public set checkCollisions(collisionEnabled: boolean) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions = collisionEnabled;\r\n }\r\n\r\n /**\r\n * Gets Collider object used to compute collisions (not physics)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public get collider(): Nullable<Collider> {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collider;\r\n }\r\n\r\n /**\r\n * Move the mesh using collision engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n * @param displacement defines the requested displacement vector\r\n * @param slideOnCollide If true, the mesh will slide along a collider's surface. If false, it will stop moving at the first collision. (true by default)\r\n * @returns the current mesh\r\n */\r\n public moveWithCollisions(displacement: Vector3, slideOnCollide: boolean = true): AbstractMesh {\r\n const globalPosition = this.getAbsolutePosition();\r\n\r\n globalPosition.addToRef(this.ellipsoidOffset, this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions);\r\n const coordinator = this.getScene().collisionCoordinator;\r\n\r\n if (!this._internalAbstractMeshDataInfo._meshCollisionData._collider) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider = coordinator.createCollider();\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider._radius = this.ellipsoid;\r\n\r\n coordinator.getNewPosition(\r\n this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions,\r\n displacement,\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider,\r\n this.collisionRetryCount,\r\n this,\r\n this._onCollisionPositionChange,\r\n this.uniqueId,\r\n slideOnCollide\r\n );\r\n return this;\r\n }\r\n\r\n private _onCollisionPositionChange = (collisionId: number, newPosition: Vector3, collidedMesh: Nullable<AbstractMesh> = null) => {\r\n newPosition.subtractToRef(\r\n this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions,\r\n this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions\r\n );\r\n\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions.length() > AbstractEngine.CollisionsEpsilon) {\r\n this.position.addInPlace(this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions);\r\n }\r\n\r\n if (collidedMesh) {\r\n this.onCollideObservable.notifyObservers(collidedMesh);\r\n }\r\n\r\n this.onCollisionPositionChangeObservable.notifyObservers(this.position);\r\n };\r\n\r\n // Collisions\r\n /**\r\n * @internal\r\n */\r\n public _collideForSubMesh(subMesh: SubMesh, transformMatrix: Matrix, collider: Collider): AbstractMesh {\r\n this._generatePointsArray();\r\n\r\n if (!this._positions) {\r\n return this;\r\n }\r\n\r\n // Transformation\r\n if (!subMesh._lastColliderWorldVertices || !subMesh._lastColliderTransformMatrix!.equals(transformMatrix)) {\r\n subMesh._lastColliderTransformMatrix = transformMatrix.clone();\r\n subMesh._lastColliderWorldVertices = [];\r\n subMesh._trianglePlanes = [];\r\n const start = subMesh.verticesStart;\r\n const end = subMesh.verticesStart + subMesh.verticesCount;\r\n for (let i = start; i < end; i++) {\r\n subMesh._lastColliderWorldVertices.push(Vector3.TransformCoordinates(this._positions[i], transformMatrix));\r\n }\r\n }\r\n\r\n // Collide\r\n collider._collide(\r\n subMesh._trianglePlanes,\r\n subMesh._lastColliderWorldVertices,\r\n <IndicesArray>this.getIndices(),\r\n subMesh.indexStart,\r\n subMesh.indexStart + subMesh.indexCount,\r\n subMesh.verticesStart,\r\n !!subMesh.getMaterial(),\r\n this,\r\n this._shouldConvertRHS(),\r\n subMesh.getMaterial()?.fillMode === Constants.MATERIAL_TriangleStripDrawMode\r\n );\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processCollisionsForSubMeshes(collider: Collider, transformMatrix: Matrix): AbstractMesh {\r\n const subMeshes = this._scene.getCollidingSubMeshCandidates(this, collider);\r\n const len = subMeshes.length;\r\n\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n\r\n // Bounding test\r\n if (len > 1 && !subMesh._checkCollision(collider)) {\r\n continue;\r\n }\r\n\r\n this._collideForSubMesh(subMesh, transformMatrix, collider);\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _shouldConvertRHS() {\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _checkCollision(collider: Collider): AbstractMesh {\r\n // Bounding box test\r\n if (!this.getBoundingInfo()._checkCollision(collider)) {\r\n return this;\r\n }\r\n\r\n // Transformation matrix\r\n const collisionsScalingMatrix = TmpVectors.Matrix[0];\r\n const collisionsTransformMatrix = TmpVectors.Matrix[1];\r\n Matrix.ScalingToRef(1.0 / collider._radius.x, 1.0 / collider._radius.y, 1.0 / collider._radius.z, collisionsScalingMatrix);\r\n this.worldMatrixFromCache.multiplyToRef(collisionsScalingMatrix, collisionsTransformMatrix);\r\n this._processCollisionsForSubMeshes(collider, collisionsTransformMatrix);\r\n return this;\r\n }\r\n\r\n // Picking\r\n /** @internal */\r\n public _generatePointsArray(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the passed Ray intersects with the mesh. A mesh triangle can be picked both from its front and back sides,\r\n * irrespective of orientation.\r\n * @param ray defines the ray to use. It should be in the mesh's LOCAL coordinate space.\r\n * @param fastCheck defines if fast mode (but less precise) must be used (false by default)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\r\n * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point\r\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\r\n * @returns the picking info\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\r\n */\r\n public intersects(\r\n ray: Ray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n onlyBoundingInfo = false,\r\n worldToUse?: Matrix,\r\n skipBoundingInfo = false\r\n ): PickingInfo {\r\n const pickingInfo = new PickingInfo();\r\n const className = this.getClassName();\r\n const intersectionThreshold = className === \"InstancedLinesMesh\" || className === \"LinesMesh\" || className === \"GreasedLineMesh\" ? (this as any).intersectionThreshold : 0;\r\n const boundingInfo = this.getBoundingInfo();\r\n if (!this.subMeshes) {\r\n return pickingInfo;\r\n }\r\n if (\r\n !skipBoundingInfo &&\r\n (!ray.intersectsSphere(boundingInfo.boundingSphere, intersectionThreshold) || !ray.intersectsBox(boundingInfo.boundingBox, intersectionThreshold))\r\n ) {\r\n return pickingInfo;\r\n }\r\n\r\n if (onlyBoundingInfo) {\r\n pickingInfo.hit = skipBoundingInfo ? false : true;\r\n pickingInfo.pickedMesh = skipBoundingInfo ? null : this;\r\n pickingInfo.distance = skipBoundingInfo ? 0 : Vector3.Distance(ray.origin, boundingInfo.boundingSphere.center);\r\n pickingInfo.subMeshId = 0;\r\n return pickingInfo;\r\n }\r\n\r\n if (!this._generatePointsArray()) {\r\n return pickingInfo;\r\n }\r\n\r\n let intersectInfo: Nullable<IntersectionInfo> = null;\r\n\r\n const subMeshes = this._scene.getIntersectingSubMeshCandidates(this, ray);\r\n const len: number = subMeshes.length;\r\n\r\n // Check if all submeshes are using a material that don't allow picking (point/lines rendering)\r\n // if no submesh can be picked that way, then fallback to BBox picking\r\n let anySubmeshSupportIntersect = false;\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n const material = subMesh.getMaterial();\r\n if (!material) {\r\n continue;\r\n }\r\n if (\r\n material.fillMode == Constants.MATERIAL_TriangleStripDrawMode ||\r\n material.fillMode == Constants.MATERIAL_TriangleFillMode ||\r\n material.fillMode == Constants.MATERIAL_WireFrameFillMode ||\r\n material.fillMode == Constants.MATERIAL_PointFillMode ||\r\n material.fillMode == Constants.MATERIAL_LineListDrawMode\r\n ) {\r\n anySubmeshSupportIntersect = true;\r\n break;\r\n }\r\n }\r\n\r\n // no sub mesh support intersection, fallback to BBox that has already be done\r\n if (!anySubmeshSupportIntersect) {\r\n pickingInfo.hit = true;\r\n pickingInfo.pickedMesh = this;\r\n pickingInfo.distance = Vector3.Distance(ray.origin, boundingInfo.boundingSphere.center);\r\n pickingInfo.subMeshId = -1;\r\n return pickingInfo;\r\n }\r\n\r\n // at least 1 submesh supports intersection, keep going\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n\r\n // Bounding test\r\n if (len > 1 && !skipBoundingInfo && !subMesh.canIntersects(ray)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = subMesh.intersects(ray, <Vector3[]>this._positions, <IndicesArray>this.getIndices(), fastCheck, trianglePredicate);\r\n\r\n if (currentIntersectInfo) {\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.subMeshId = subMesh._id;\r\n intersectInfo._internalSubMeshId = index;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (intersectInfo) {\r\n // Get picked point\r\n const world = worldToUse ?? this.getWorldMatrix();\r\n const worldOrigin = TmpVectors.Vector3[0];\r\n const direction = TmpVectors.Vector3[1];\r\n Vector3.TransformCoordinatesToRef(ray.origin, world, worldOrigin);\r\n ray.direction.scaleToRef(intersectInfo.distance, direction);\r\n const worldDirection = Vector3.TransformNormal(direction, world);\r\n const pickedPoint = worldDirection.addInPlace(worldOrigin);\r\n\r\n // Return result\r\n pickingInfo.hit = true;\r\n pickingInfo.distance = Vector3.Distance(worldOrigin, pickedPoint);\r\n pickingInfo.pickedPoint = pickedPoint;\r\n pickingInfo.pickedMesh = this;\r\n pickingInfo.bu = intersectInfo.bu || 0;\r\n pickingInfo.bv = intersectInfo.bv || 0;\r\n pickingInfo.subMeshFaceId = intersectInfo.faceId;\r\n pickingInfo.faceId = intersectInfo.faceId + subMeshes.data[intersectInfo._internalSubMeshId].indexStart / (this.getClassName().indexOf(\"LinesMesh\") !== -1 ? 2 : 3);\r\n pickingInfo.subMeshId = intersectInfo.subMeshId;\r\n return pickingInfo;\r\n }\r\n\r\n return pickingInfo;\r\n }\r\n\r\n /**\r\n * Clones the current mesh\r\n * @param name defines the mesh name\r\n * @param newParent defines the new mesh parent\r\n * @param doNotCloneChildren defines a boolean indicating that children must not be cloned (false by default)\r\n * @returns the new mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public override clone(name: string, newParent: Nullable<Node>, doNotCloneChildren?: boolean): Nullable<AbstractMesh> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Disposes all the submeshes of the current mesh\r\n * @param immediate should dispose the effects immediately or not\r\n * @returns the current mesh\r\n */\r\n public releaseSubMeshes(immediate = false): AbstractMesh {\r\n if (this.subMeshes) {\r\n while (this.subMeshes.length) {\r\n this.subMeshes[0].dispose(immediate);\r\n }\r\n } else {\r\n this.subMeshes = [] as SubMesh[];\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Releases resources associated with this abstract mesh.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public override dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n let index: number;\r\n\r\n const scene = this.getScene();\r\n\r\n // mesh map release.\r\n if (this._scene.useMaterialMeshMap) {\r\n // remove from material mesh map id needed\r\n if (this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap) {\r\n this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = undefined;\r\n }\r\n }\r\n\r\n // Smart Array Retainers.\r\n scene.freeActiveMeshes();\r\n scene.freeRenderingGroups();\r\n if (scene.renderingManager.maintainStateBetweenFrames) {\r\n scene.renderingManager.restoreDispachedFlags();\r\n }\r\n\r\n // Action manager\r\n if (this.actionManager !== undefined && this.actionManager !== null) {\r\n // If we are the only mesh using the action manager, dispose of the action manager too unless it has opted out from that behavior\r\n if (this.actionManager.disposeWhenUnowned && !this._scene.meshes.some((m) => m !== this && m.actionManager === this.actionManager)) {\r\n this.actionManager.dispose();\r\n }\r\n this.actionManager = null;\r\n }\r\n\r\n // Skeleton\r\n this._internalAbstractMeshDataInfo._skeleton = null;\r\n\r\n if (this._transformMatrixTexture) {\r\n this._transformMatrixTexture.dispose();\r\n this._transformMatrixTexture = null;\r\n }\r\n\r\n // Intersections in progress\r\n for (index = 0; index < this._intersectionsInProgress.length; index++) {\r\n const other = this._intersectionsInProgress[index];\r\n\r\n const pos = other._intersectionsInProgress.indexOf(this);\r\n other._intersectionsInProgress.splice(pos, 1);\r\n }\r\n\r\n this._intersectionsInProgress.length = 0;\r\n\r\n // Lights\r\n const lights = scene.lights;\r\n\r\n for (const light of lights) {\r\n let meshIndex = light.includedOnlyMeshes.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n light.includedOnlyMeshes.splice(meshIndex, 1);\r\n }\r\n\r\n meshIndex = light.excludedMeshes.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n light.excludedMeshes.splice(meshIndex, 1);\r\n }\r\n\r\n // Shadow generators\r\n const generators = light.getShadowGenerators();\r\n if (generators) {\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n const shadowMap = generator.getShadowMap();\r\n\r\n if (shadowMap && shadowMap.renderList) {\r\n meshIndex = shadowMap.renderList.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n shadowMap.renderList.splice(meshIndex, 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // SubMeshes\r\n if (this.getClassName() !== \"InstancedMesh\" || this.getClassName() !== \"InstancedLinesMesh\") {\r\n this.releaseSubMeshes(true);\r\n }\r\n\r\n // Query\r\n const engine = scene.getEngine();\r\n if (this._occlusionQuery !== null) {\r\n this.isOcclusionQueryInProgress = false;\r\n engine.deleteQuery(this._occlusionQuery);\r\n this._occlusionQuery = null;\r\n }\r\n\r\n // Engine\r\n engine.wipeCaches();\r\n\r\n // Remove from scene\r\n scene.removeMesh(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.meshes.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.meshes.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n if (disposeMaterialAndTextures) {\r\n if (this.material) {\r\n if (this.material.getClassName() === \"MultiMaterial\") {\r\n this.material.dispose(false, true, true);\r\n } else {\r\n this.material.dispose(false, true);\r\n }\r\n }\r\n }\r\n\r\n if (!doNotRecurse) {\r\n // Particles\r\n for (index = 0; index < scene.particleSystems.length; index++) {\r\n if (scene.particleSystems[index].emitter === this) {\r\n scene.particleSystems[index].dispose();\r\n index--;\r\n }\r\n }\r\n }\r\n\r\n // facet data\r\n if (this._internalAbstractMeshDataInfo._facetData.facetDataEnabled) {\r\n this.disableFacetData();\r\n }\r\n\r\n this._uniformBuffer.dispose();\r\n\r\n this.onAfterWorldMatrixUpdateObservable.clear();\r\n this.onCollideObservable.clear();\r\n this.onCollisionPositionChangeObservable.clear();\r\n this.onRebuildObservable.clear();\r\n\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n // Facet data\r\n /** @internal */\r\n private _initFacetData(): AbstractMesh {\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n if (!data.facetNormals) {\r\n data.facetNormals = [] as Vector3[];\r\n }\r\n if (!data.facetPositions) {\r\n data.facetPositions = [] as Vector3[];\r\n }\r\n if (!data.facetPartitioning) {\r\n data.facetPartitioning = new Array<number[]>();\r\n }\r\n data.facetNb = ((<IndicesArray>this.getIndices()).length / 3) | 0;\r\n data.partitioningSubdivisions = data.partitioningSubdivisions ? data.partitioningSubdivisions : 10; // default nb of partitioning subdivisions = 10\r\n data.partitioningBBoxRatio = data.partitioningBBoxRatio ? data.partitioningBBoxRatio : 1.01; // default ratio 1.01 = the partitioning is 1% bigger than the bounding box\r\n for (let f = 0; f < data.facetNb; f++) {\r\n data.facetNormals[f] = Vector3.Zero();\r\n data.facetPositions[f] = Vector3.Zero();\r\n }\r\n data.facetDataEnabled = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the mesh facetData arrays and the internal partitioning when the mesh is morphed or updated.\r\n * This method can be called within the render loop.\r\n * You don't need to call this method by yourself in the render loop when you update/morph a mesh with the methods CreateXXX() as they automatically manage this computation\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public updateFacetData(): AbstractMesh {\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n if (!data.facetDataEnabled) {\r\n this._initFacetData();\r\n }\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this.getIndices();\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind)?.slice();\r\n const bInfo = this.getBoundingInfo();\r\n\r\n if (data.facetDepthSort && !data.facetDepthSortEnabled) {\r\n // init arrays, matrix and sort function on first call\r\n data.facetDepthSortEnabled = true;\r\n if (indices instanceof Uint16Array) {\r\n data.depthSortedIndices = new Uint16Array(indices);\r\n } else if (indices instanceof Uint32Array) {\r\n data.depthSortedIndices = new Uint32Array(indices);\r\n } else {\r\n let needs32bits = false;\r\n for (let i = 0; i < indices!.length; i++) {\r\n if (indices![i] > 65535) {\r\n needs32bits = true;\r\n break;\r\n }\r\n }\r\n if (needs32bits) {\r\n data.depthSortedIndices = new Uint32Array(indices!);\r\n } else {\r\n data.depthSortedIndices = new Uint16Array(indices!);\r\n }\r\n }\r\n data.facetDepthSortFunction = function (f1, f2) {\r\n return f2.sqDistance - f1.sqDistance;\r\n };\r\n if (!data.facetDepthSortFrom) {\r\n const camera = this.getScene().activeCamera;\r\n data.facetDepthSortFrom = camera ? camera.position : Vector3.Zero();\r\n }\r\n data.depthSortedFacets = [];\r\n for (let f = 0; f < data.facetNb; f++) {\r\n const depthSortedFacet = { ind: f * 3, sqDistance: 0.0 };\r\n data.depthSortedFacets.push(depthSortedFacet);\r\n }\r\n data.invertedMatrix = Matrix.Identity();\r\n data.facetDepthSortOrigin = Vector3.Zero();\r\n }\r\n\r\n data.bbSize.x = bInfo.maximum.x - bInfo.minimum.x > Epsilon ? bInfo.maximum.x - bInfo.minimum.x : Epsilon;\r\n data.bbSize.y = bInfo.maximum.y - bInfo.minimum.y > Epsilon ? bInfo.maximum.y - bInfo.minimum.y : Epsilon;\r\n data.bbSize.z = bInfo.maximum.z - bInfo.minimum.z > Epsilon ? bInfo.maximum.z - bInfo.minimum.z : Epsilon;\r\n let bbSizeMax = data.bbSize.x > data.bbSize.y ? data.bbSize.x : data.bbSize.y;\r\n bbSizeMax = bbSizeMax > data.bbSize.z ? bbSizeMax : data.bbSize.z;\r\n data.subDiv.max = data.partitioningSubdivisions;\r\n data.subDiv.X = Math.floor((data.subDiv.max * data.bbSize.x) / bbSizeMax); // adjust the number of subdivisions per axis\r\n data.subDiv.Y = Math.floor((data.subDiv.max * data.bbSize.y) / bbSizeMax); // according to each bbox size per axis\r\n data.subDiv.Z = Math.floor((data.subDiv.max * data.bbSize.z) / bbSizeMax);\r\n data.subDiv.X = data.subDiv.X < 1 ? 1 : data.subDiv.X; // at least one subdivision\r\n data.subDiv.Y = data.subDiv.Y < 1 ? 1 : data.subDiv.Y;\r\n data.subDiv.Z = data.subDiv.Z < 1 ? 1 : data.subDiv.Z;\r\n // set the parameters for ComputeNormals()\r\n data.facetParameters.facetNormals = this.getFacetLocalNormals();\r\n data.facetParameters.facetPositions = this.getFacetLocalPositions();\r\n data.facetParameters.facetPartitioning = this.getFacetLocalPartitioning();\r\n data.facetParameters.bInfo = bInfo;\r\n data.facetParameters.bbSize = data.bbSize;\r\n data.facetParameters.subDiv = data.subDiv;\r\n data.facetParameters.ratio = this.partitioningBBoxRatio;\r\n data.facetParameters.depthSort = data.facetDepthSort;\r\n if (data.facetDepthSort && data.facetDepthSortEnabled) {\r\n this.computeWorldMatrix(true);\r\n this._worldMatrix.invertToRef(data.invertedMatrix);\r\n Vector3.TransformCoordinatesToRef(data.facetDepthSortFrom, data.invertedMatrix, data.facetDepthSortOrigin);\r\n data.facetParameters.distanceTo = data.facetDepthSortOrigin;\r\n }\r\n data.facetParameters.depthSortedFacets = data.depthSortedFacets;\r\n if (normals) {\r\n VertexData.ComputeNormals(positions, indices, normals, data.facetParameters);\r\n }\r\n\r\n if (data.facetDepthSort && data.facetDepthSortEnabled) {\r\n data.depthSortedFacets.sort(data.facetDepthSortFunction);\r\n const l = (data.depthSortedIndices.length / 3) | 0;\r\n for (let f = 0; f < l; f++) {\r\n const sind = data.depthSortedFacets[f].ind;\r\n data.depthSortedIndices[f * 3] = indices![sind];\r\n data.depthSortedIndices[f * 3 + 1] = indices![sind + 1];\r\n data.depthSortedIndices[f * 3 + 2] = indices![sind + 2];\r\n }\r\n this.updateIndices(data.depthSortedIndices, undefined, true);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalNormals array.\r\n * The normals are expressed in the mesh local spac\r\n * @returns an array of Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalNormals(): Vector3[] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (!facetData.facetNormals) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetNormals;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalPositions array.\r\n * The facet positions are expressed in the mesh local space\r\n * @returns an array of Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalPositions(): Vector3[] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (!facetData.facetPositions) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetPositions;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalPartitioning array\r\n * @returns an array of array of numbers\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalPartitioning(): number[][] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n\r\n if (!facetData.facetPartitioning) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetPartitioning;\r\n }\r\n\r\n /**\r\n * Returns the i-th facet position in the world system.\r\n * This method allocates a new Vector3 per call\r\n * @param i defines the facet index\r\n * @returns a new Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetPosition(i: number): Vector3 {\r\n const pos = Vector3.Zero();\r\n this.getFacetPositionToRef(i, pos);\r\n return pos;\r\n }\r\n\r\n /**\r\n * Sets the reference Vector3 with the i-th facet position in the world system\r\n * @param i defines the facet index\r\n * @param ref defines the target vector\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetPositionToRef(i: number, ref: Vector3): AbstractMesh {\r\n const localPos = this.getFacetLocalPositions()[i];\r\n const world = this.getWorldMatrix();\r\n Vector3.TransformCoordinatesToRef(localPos, world, ref);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the i-th facet normal in the world system.\r\n * This method allocates a new Vector3 per call\r\n * @param i defines the facet index\r\n * @returns a new Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetNormal(i: number): Vector3 {\r\n const norm = Vector3.Zero();\r\n this.getFacetNormalToRef(i, norm);\r\n return norm;\r\n }\r\n\r\n /**\r\n * Sets the reference Vector3 with the i-th facet normal in the world system\r\n * @param i defines the facet index\r\n * @param ref defines the target vector\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetNormalToRef(i: number, ref: Vector3) {\r\n const localNorm = this.getFacetLocalNormals()[i];\r\n Vector3.TransformNormalToRef(localNorm, this.getWorldMatrix(), ref);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the facets (in an array) in the same partitioning block than the one the passed coordinates are located (expressed in the mesh local system)\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @returns the array of facet indexes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetsAtLocalCoordinates(x: number, y: number, z: number): Nullable<number[]> {\r\n const bInfo = this.getBoundingInfo();\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n\r\n const ox = Math.floor(((x - bInfo.minimum.x * data.partitioningBBoxRatio) * data.subDiv.X * data.partitioningBBoxRatio) / data.bbSize.x);\r\n const oy = Math.floor(((y - bInfo.minimum.y * data.partitioningBBoxRatio) * data.subDiv.Y * data.partitioningBBoxRatio) / data.bbSize.y);\r\n const oz = Math.floor(((z - bInfo.minimum.z * data.partitioningBBoxRatio) * data.subDiv.Z * data.partitioningBBoxRatio) / data.bbSize.z);\r\n if (ox < 0 || ox > data.subDiv.max || oy < 0 || oy > data.subDiv.max || oz < 0 || oz > data.subDiv.max) {\r\n return null;\r\n }\r\n return data.facetPartitioning[ox + data.subDiv.max * oy + data.subDiv.max * data.subDiv.max * oz];\r\n }\r\n\r\n /**\r\n * Returns the closest mesh facet index at (x,y,z) World coordinates, null if not found\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @param projected sets as the (x,y,z) world projection on the facet\r\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\r\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\r\n * @returns the face index if found (or null instead)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getClosestFacetAtCoordinates(x: number, y: number, z: number, projected?: Vector3, checkFace: boolean = false, facing: boolean = true): Nullable<number> {\r\n const world = this.getWorldMatrix();\r\n const invMat = TmpVectors.Matrix[5];\r\n world.invertToRef(invMat);\r\n const invVect = TmpVectors.Vector3[8];\r\n Vector3.TransformCoordinatesFromFloatsToRef(x, y, z, invMat, invVect); // transform (x,y,z) to coordinates in the mesh local space\r\n const closest = this.getClosestFacetAtLocalCoordinates(invVect.x, invVect.y, invVect.z, projected, checkFace, facing);\r\n if (projected) {\r\n // transform the local computed projected vector to world coordinates\r\n Vector3.TransformCoordinatesFromFloatsToRef(projected.x, projected.y, projected.z, world, projected);\r\n }\r\n return closest;\r\n }\r\n\r\n /**\r\n * Returns the closest mesh facet index at (x,y,z) local coordinates, null if not found\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @param projected sets as the (x,y,z) local projection on the facet\r\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\r\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\r\n * @returns the face index if found (or null instead)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getClosestFacetAtLocalCoordinates(x: number, y: number, z: number, projected?: Vector3, checkFace: boolean = false, facing: boolean = true): Nullable<number> {\r\n let closest = null;\r\n let tmpx = 0.0;\r\n let tmpy = 0.0;\r\n let tmpz = 0.0;\r\n let d = 0.0; // tmp dot facet normal * facet position\r\n let t0 = 0.0;\r\n let projx = 0.0;\r\n let projy = 0.0;\r\n let projz = 0.0;\r\n // Get all the facets in the same partitioning block than (x, y, z)\r\n const facetPositions = this.getFacetLocalPositions();\r\n const facetNormals = this.getFacetLocalNormals();\r\n const facetsInBlock = this.getFacetsAtLocalCoordinates(x, y, z);\r\n if (!facetsInBlock) {\r\n return null;\r\n }\r\n // Get the closest facet to (x, y, z)\r\n let shortest = Number.MAX_VALUE; // init distance vars\r\n let tmpDistance = shortest;\r\n let fib; // current facet in the block\r\n let norm; // current facet normal\r\n let p0; // current facet barycenter position\r\n // loop on all the facets in the current partitioning block\r\n for (let idx = 0; idx < facetsInBlock.length; idx++) {\r\n fib = facetsInBlock[idx];\r\n norm = facetNormals[fib];\r\n p0 = facetPositions[fib];\r\n\r\n d = (x - p0.x) * norm.x + (y - p0.y) * norm.y + (z - p0.z) * norm.z;\r\n if (!checkFace || (checkFace && facing && d >= 0.0) || (checkFace && !facing && d <= 0.0)) {\r\n // compute (x,y,z) projection on the facet = (projx, projy, projz)\r\n d = norm.x * p0.x + norm.y * p0.y + norm.z * p0.z;\r\n t0 = -(norm.x * x + norm.y * y + norm.z * z - d) / (norm.x * norm.x + norm.y * norm.y + norm.z * norm.z);\r\n projx = x + norm.x * t0;\r\n projy = y + norm.y * t0;\r\n projz = z + norm.z * t0;\r\n\r\n tmpx = projx - x;\r\n tmpy = projy - y;\r\n tmpz = projz - z;\r\n tmpDistance = tmpx * tmpx + tmpy * tmpy + tmpz * tmpz; // compute length between (x, y, z) and its projection on the facet\r\n if (tmpDistance < shortest) {\r\n // just keep the closest facet to (x, y, z)\r\n shortest = tmpDistance;\r\n closest = fib;\r\n if (projected) {\r\n projected.x = projx;\r\n projected.y = projy;\r\n projected.z = projz;\r\n }\r\n }\r\n }\r\n }\r\n return closest;\r\n }\r\n\r\n /**\r\n * Returns the object \"parameter\" set with all the expected parameters for facetData computation by ComputeNormals()\r\n * @returns the parameters\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetDataParameters(): any {\r\n return this._internalAbstractMeshDataInfo._facetData.facetParameters;\r\n }\r\n\r\n /**\r\n * Disables the feature FacetData and frees the related memory\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public disableFacetData(): AbstractMesh {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (facetData.facetDataEnabled) {\r\n facetData.facetDataEnabled = false;\r\n facetData.facetPositions = [] as Vector3[];\r\n facetData.facetNormals = [] as Vector3[];\r\n facetData.facetPartitioning = new Array<number[]>();\r\n facetData.facetParameters = {};\r\n facetData.depthSortedIndices = new Uint32Array(0);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the AbstractMesh indices array\r\n * @param indices defines the data source\r\n * @param offset defines the offset in the index buffer where to store the new data (can be null)\r\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly = false): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates new normals data for the mesh\r\n * @param updatable defines if the normal vertex buffer must be flagged as updatable\r\n * @returns the current mesh\r\n */\r\n public createNormals(updatable: boolean): AbstractMesh {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this.getIndices();\r\n let normals: FloatArray;\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) {\r\n normals = <FloatArray>this.getVerticesData(VertexBuffer.NormalKind);\r\n } else {\r\n normals = [];\r\n }\r\n\r\n VertexData.ComputeNormals(positions, indices, normals, { useRightHandedSystem: this.getScene().useRightHandedSystem });\r\n this.setVerticesData(VertexBuffer.NormalKind, normals, updatable);\r\n return this;\r\n }\r\n\r\n /**\r\n * Optimize the indices order so that we keep the faces with similar indices together\r\n * @returns the current mesh\r\n */\r\n public async optimizeIndicesAsync(): Promise<AbstractMesh> {\r\n const indices = this.getIndices();\r\n\r\n if (!indices) {\r\n return this;\r\n }\r\n\r\n const { OptimizeIndices } = await import(\"./mesh.vertexData.functions\");\r\n\r\n OptimizeIndices(indices);\r\n\r\n this.setIndices(indices, this.getTotalVertices());\r\n return this;\r\n }\r\n\r\n /**\r\n * Align the mesh with a normal\r\n * @param normal defines the normal to use\r\n * @param upDirection can be used to redefined the up vector to use (will use the (0, 1, 0) by default)\r\n * @returns the current mesh\r\n */\r\n public alignWithNormal(normal: Vector3, upDirection?: Vector3): AbstractMesh {\r\n if (!upDirection) {\r\n upDirection = Axis.Y;\r\n }\r\n\r\n const axisX = TmpVectors.Vector3[0];\r\n const axisZ = TmpVectors.Vector3[1];\r\n Vector3.CrossToRef(upDirection, normal, axisZ);\r\n Vector3.CrossToRef(normal, axisZ, axisX);\r\n\r\n if (this.rotationQuaternion) {\r\n Quaternion.RotationQuaternionFromAxisToRef(axisX, normal, axisZ, this.rotationQuaternion);\r\n } else {\r\n Vector3.RotationFromAxisToRef(axisX, normal, axisZ, this.rotation);\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _checkOcclusionQuery(): boolean {\r\n // Will be replaced by correct code if Occlusion queries are referenced\r\n return false;\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Disables the mesh edge rendering mode\r\n * @returns the currentAbstractMesh\r\n */\r\n disableEdgesRendering(): AbstractMesh {\r\n throw _WarnImport(\"EdgesRenderer\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Enables the edge rendering mode on the mesh.\r\n * This mode makes the mesh edges visible\r\n * @param epsilon defines the maximal distance between two angles to detect a face\r\n * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces\r\n * @param options options to the edge renderer\r\n * @returns the currentAbstractMesh\r\n * @see https://www.babylonjs-playground.com/#19O9TU#0\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean, options?: IEdgesRendererOptions): AbstractMesh {\r\n throw _WarnImport(\"EdgesRenderer\");\r\n }\r\n\r\n /**\r\n * This function returns all of the particle systems in the scene that use the mesh as an emitter.\r\n * @returns an array of particle systems in the scene that use the mesh as an emitter\r\n */\r\n public getConnectedParticleSystems(): IParticleSystem[] {\r\n return this._scene.particleSystems.filter((particleSystem) => particleSystem.emitter === this);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.AbstractMesh\", AbstractMesh);\r\n"]}