@babylonjs/core 6.46.0 → 6.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/Animations/animationGroup.d.ts +5 -3
  2. package/Animations/animationGroup.js +19 -4
  3. package/Animations/animationGroup.js.map +1 -1
  4. package/BakedVertexAnimation/vertexAnimationBaker.d.ts +4 -2
  5. package/BakedVertexAnimation/vertexAnimationBaker.js +25 -17
  6. package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -1
  7. package/Bones/skeleton.d.ts +1 -1
  8. package/Bones/skeleton.js +3 -0
  9. package/Bones/skeleton.js.map +1 -1
  10. package/Cameras/arcRotateCamera.d.ts +3 -3
  11. package/Cameras/arcRotateCamera.js +3 -3
  12. package/Cameras/arcRotateCamera.js.map +1 -1
  13. package/Engines/Extensions/engine.dynamicBuffer.js.map +1 -1
  14. package/Engines/Native/nativeInterfaces.d.ts +4 -4
  15. package/Engines/Native/nativeInterfaces.js.map +1 -1
  16. package/Engines/nativeEngine.d.ts +1 -1
  17. package/Engines/nativeEngine.js +4 -3
  18. package/Engines/nativeEngine.js.map +1 -1
  19. package/Engines/thinEngine.js +2 -2
  20. package/Engines/thinEngine.js.map +1 -1
  21. package/FlowGraph/Blocks/Execution/Animation/flowGraphPauseAnimationBlock.d.ts +1 -1
  22. package/FlowGraph/Blocks/Execution/Animation/flowGraphPauseAnimationBlock.js.map +1 -1
  23. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.d.ts +1 -1
  24. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.js.map +1 -1
  25. package/Gizmos/gizmo.d.ts +1 -1
  26. package/Gizmos/gizmo.js.map +1 -1
  27. package/Materials/Node/nodeMaterial.js +2 -0
  28. package/Materials/Node/nodeMaterial.js.map +1 -1
  29. package/Meshes/Compression/dracoCompressionWorker.d.ts +1 -2
  30. package/Meshes/Compression/dracoCompressionWorker.js +1 -1
  31. package/Meshes/Compression/dracoCompressionWorker.js.map +1 -1
  32. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +10 -3
  33. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  34. package/Physics/castingResult.d.ts +1 -1
  35. package/Physics/castingResult.js.map +1 -1
  36. package/Physics/physicsPointProximityQuery.d.ts +1 -1
  37. package/Physics/physicsPointProximityQuery.js.map +1 -1
  38. package/Physics/v2/ragdoll.d.ts +16 -5
  39. package/Physics/v2/ragdoll.js +91 -42
  40. package/Physics/v2/ragdoll.js.map +1 -1
  41. package/XR/features/WebXRControllerTeleportation.d.ts +4 -0
  42. package/XR/features/WebXRControllerTeleportation.js +33 -1
  43. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  44. package/XR/features/WebXRNearInteraction.js +11 -1
  45. package/XR/features/WebXRNearInteraction.js.map +1 -1
  46. package/package.json +1 -1
@@ -1,4 +1,3 @@
1
- import type { DecoderModule } from "draco3dgltf";
2
1
  export interface AttributeData {
3
2
  kind: string;
4
3
  data: ArrayBufferView;
@@ -25,7 +24,7 @@ export type Message = InitDoneMessage | DecodeMeshDoneMessage | IndicesMessage |
25
24
  /**
26
25
  * @internal
27
26
  */
28
- export declare function decodeMesh(decoderModule: DecoderModule, data: Int8Array, attributes: {
27
+ export declare function decodeMesh(decoderModule: any, data: Int8Array, attributes: {
29
28
  [kind: string]: number;
30
29
  } | undefined, onIndicesData: (indices: Uint16Array | Uint32Array) => void, onAttributeData: (kind: string, data: ArrayBufferView, size: number, offset: number, stride: number, normalized: boolean) => void): number;
31
30
  /**
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @internal
3
3
  */
4
- export function decodeMesh(decoderModule, data, attributes, onIndicesData, onAttributeData) {
4
+ export function decodeMesh(decoderModule /*DecoderModule*/, data, attributes, onIndicesData, onAttributeData) {
5
5
  let decoder = null;
6
6
  let buffer = null;
7
7
  let geometry = null;
@@ -1 +1 @@
1
- {"version":3,"file":"dracoCompressionWorker.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/Compression/dracoCompressionWorker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport type { DecoderModule, DecoderBuffer, Decoder, Mesh, PointCloud, Status } from \"draco3dgltf\";\r\nimport { DracoDecoderModule } from \"draco3dgltf\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let DracoDecoderModule: DracoDecoderModule;\r\n\r\nexport interface AttributeData {\r\n kind: string;\r\n data: ArrayBufferView;\r\n size: number;\r\n byteOffset: number;\r\n byteStride: number;\r\n normalized: boolean;\r\n}\r\n\r\ninterface InitDoneMessage {\r\n id: \"initDone\";\r\n}\r\n\r\ninterface DecodeMeshDoneMessage {\r\n id: \"decodeMeshDone\";\r\n totalVertices: number;\r\n}\r\n\r\ninterface IndicesMessage {\r\n id: \"indices\";\r\n data: Uint16Array | Uint32Array;\r\n}\r\n\r\ninterface AttributeMessage extends AttributeData {\r\n id: \"attribute\";\r\n}\r\nexport type Message = InitDoneMessage | DecodeMeshDoneMessage | IndicesMessage | AttributeMessage;\r\n// WorkerGlobalScope\r\ndeclare function importScripts(...urls: string[]): void;\r\ndeclare function postMessage(message: Message, transfer?: any[]): void;\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function decodeMesh(\r\n decoderModule: DecoderModule,\r\n data: Int8Array,\r\n attributes: { [kind: string]: number } | undefined,\r\n onIndicesData: (indices: Uint16Array | Uint32Array) => void,\r\n onAttributeData: (kind: string, data: ArrayBufferView, size: number, offset: number, stride: number, normalized: boolean) => void\r\n): number {\r\n let decoder: Nullable<Decoder> = null;\r\n let buffer: Nullable<DecoderBuffer> = null;\r\n let geometry: Nullable<Mesh | PointCloud> = null;\r\n\r\n try {\r\n decoder = new decoderModule.Decoder();\r\n\r\n buffer = new decoderModule.DecoderBuffer();\r\n buffer.Init(data, data.byteLength);\r\n\r\n let status: Status;\r\n const type = decoder.GetEncodedGeometryType(buffer);\r\n switch (type) {\r\n case decoderModule.TRIANGULAR_MESH: {\r\n const mesh = new decoderModule.Mesh();\r\n status = decoder.DecodeBufferToMesh(buffer, mesh);\r\n if (!status.ok() || mesh.ptr === 0) {\r\n throw new Error(status.error_msg());\r\n }\r\n\r\n const numFaces = mesh.num_faces();\r\n const numIndices = numFaces * 3;\r\n const byteLength = numIndices * 4;\r\n\r\n const ptr = decoderModule._malloc(byteLength);\r\n try {\r\n decoder.GetTrianglesUInt32Array(mesh, byteLength, ptr);\r\n const indices = new Uint32Array(numIndices);\r\n indices.set(new Uint32Array(decoderModule.HEAPF32.buffer, ptr, numIndices));\r\n onIndicesData(indices);\r\n } finally {\r\n decoderModule._free(ptr);\r\n }\r\n\r\n geometry = mesh;\r\n break;\r\n }\r\n case decoderModule.POINT_CLOUD: {\r\n const pointCloud = new decoderModule.PointCloud();\r\n status = decoder.DecodeBufferToPointCloud(buffer, pointCloud);\r\n if (!status.ok() || !pointCloud.ptr) {\r\n throw new Error(status.error_msg());\r\n }\r\n\r\n geometry = pointCloud;\r\n break;\r\n }\r\n default: {\r\n throw new Error(`Invalid geometry type ${type}`);\r\n }\r\n }\r\n\r\n const numPoints = geometry.num_points();\r\n\r\n const processAttribute = (decoder: Decoder, geometry: Mesh | PointCloud, kind: string, attribute: any) => {\r\n const dataType = attribute.data_type();\r\n const numComponents = attribute.num_components();\r\n const normalized = attribute.normalized();\r\n const byteStride = attribute.byte_stride();\r\n const byteOffset = attribute.byte_offset();\r\n\r\n const dataTypeInfo = {\r\n [decoderModule.DT_FLOAT32]: { typedArrayConstructor: Float32Array, heap: decoderModule.HEAPF32 },\r\n [decoderModule.DT_INT8]: { typedArrayConstructor: Int8Array, heap: decoderModule.HEAP8 },\r\n [decoderModule.DT_INT16]: { typedArrayConstructor: Int16Array, heap: decoderModule.HEAP16 },\r\n [decoderModule.DT_INT32]: { typedArrayConstructor: Int32Array, heap: decoderModule.HEAP32 },\r\n [decoderModule.DT_UINT8]: { typedArrayConstructor: Uint8Array, heap: decoderModule.HEAPU8 },\r\n [decoderModule.DT_UINT16]: { typedArrayConstructor: Uint16Array, heap: decoderModule.HEAPU16 },\r\n [decoderModule.DT_UINT32]: { typedArrayConstructor: Uint32Array, heap: decoderModule.HEAPU32 },\r\n };\r\n\r\n const info = dataTypeInfo[dataType];\r\n if (!info) {\r\n throw new Error(`Invalid data type ${dataType}`);\r\n }\r\n\r\n const numValues = numPoints * numComponents;\r\n const byteLength = numValues * info.typedArrayConstructor.BYTES_PER_ELEMENT;\r\n\r\n const ptr = decoderModule._malloc(byteLength);\r\n try {\r\n decoder.GetAttributeDataArrayForAllPoints(geometry, attribute, dataType, byteLength, ptr);\r\n const data = new info.typedArrayConstructor(info.heap.buffer, ptr, numValues);\r\n onAttributeData(kind, data.slice(), numComponents, byteOffset, byteStride, normalized);\r\n } finally {\r\n decoderModule._free(ptr);\r\n }\r\n };\r\n\r\n if (attributes) {\r\n for (const kind in attributes) {\r\n const id = attributes[kind];\r\n const attribute = decoder.GetAttributeByUniqueId(geometry, id);\r\n processAttribute(decoder, geometry, kind, attribute);\r\n }\r\n } else {\r\n const dracoAttributeTypes: { [kind: string]: number } = {\r\n position: decoderModule.POSITION,\r\n normal: decoderModule.NORMAL,\r\n color: decoderModule.COLOR,\r\n uv: decoderModule.TEX_COORD,\r\n };\r\n\r\n for (const kind in dracoAttributeTypes) {\r\n const id = decoder.GetAttributeId(geometry, dracoAttributeTypes[kind]);\r\n if (id !== -1) {\r\n const attribute = decoder.GetAttribute(geometry, id);\r\n processAttribute(decoder, geometry, kind, attribute);\r\n }\r\n }\r\n }\r\n\r\n return numPoints;\r\n } finally {\r\n if (geometry) {\r\n decoderModule.destroy(geometry);\r\n }\r\n\r\n if (buffer) {\r\n decoderModule.destroy(buffer);\r\n }\r\n\r\n if (decoder) {\r\n decoderModule.destroy(decoder);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The worker function that gets converted to a blob url to pass into a worker.\r\n * To be used if a developer wants to create their own worker instance and inject it instead of using the default worker.\r\n */\r\nexport function workerFunction(): void {\r\n let decoderPromise: PromiseLike<any> | undefined;\r\n\r\n onmessage = (event) => {\r\n const message = event.data;\r\n switch (message.id) {\r\n case \"init\": {\r\n const decoder = message.decoder;\r\n // if URL is provided then load the script. Otherwise expect the script to be loaded already\r\n if (decoder.url) {\r\n importScripts(decoder.url);\r\n }\r\n decoderPromise = DracoDecoderModule({ wasmBinary: decoder.wasmBinary });\r\n postMessage({ id: \"initDone\" });\r\n break;\r\n }\r\n case \"decodeMesh\": {\r\n if (!decoderPromise) {\r\n throw new Error(\"Draco decoder module is not available\");\r\n }\r\n decoderPromise.then((decoder) => {\r\n const numPoints = decodeMesh(\r\n decoder,\r\n message.dataView,\r\n message.attributes,\r\n (indices) => {\r\n postMessage({ id: \"indices\", data: indices }, [indices.buffer]);\r\n },\r\n (kind, data, size, offset, stride, normalized) => {\r\n postMessage({ id: \"attribute\", kind, data, size, byteOffset: offset, byteStride: stride, normalized }, [data.buffer]);\r\n }\r\n );\r\n postMessage({ id: \"decodeMeshDone\", totalVertices: numPoints });\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Initializes a worker that was created for the draco agent pool\r\n * @param worker The worker to initialize\r\n * @param decoderWasmBinary The wasm binary to load into the worker\r\n * @param moduleUrl The url to the draco decoder module (optional)\r\n * @returns A promise that resolves when the worker is initialized\r\n */\r\nexport function initializeWebWorker(worker: Worker, decoderWasmBinary: ArrayBuffer, moduleUrl?: string): Promise<Worker> {\r\n return new Promise<Worker>((resolve, reject) => {\r\n const onError = (error: ErrorEvent) => {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n reject(error);\r\n };\r\n\r\n const onMessage = (event: MessageEvent<Message>) => {\r\n if (event.data.id === \"initDone\") {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n resolve(worker);\r\n }\r\n };\r\n\r\n worker.addEventListener(\"error\", onError);\r\n worker.addEventListener(\"message\", onMessage);\r\n\r\n // clone the array buffer to make it transferable\r\n const clone = decoderWasmBinary.slice(0);\r\n worker.postMessage(\r\n {\r\n id: \"init\",\r\n decoder: {\r\n url: moduleUrl,\r\n wasmBinary: clone,\r\n },\r\n },\r\n [clone]\r\n );\r\n // note: no transfer list as the ArrayBuffer is shared across main thread and pool workers\r\n });\r\n}\r\n"]}
1
+ {"version":3,"file":"dracoCompressionWorker.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/Compression/dracoCompressionWorker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport type { DecoderBuffer, Decoder, Mesh, PointCloud, Status } from \"draco3dgltf\";\r\nimport { DracoDecoderModule } from \"draco3dgltf\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let DracoDecoderModule: DracoDecoderModule;\r\n\r\nexport interface AttributeData {\r\n kind: string;\r\n data: ArrayBufferView;\r\n size: number;\r\n byteOffset: number;\r\n byteStride: number;\r\n normalized: boolean;\r\n}\r\n\r\ninterface InitDoneMessage {\r\n id: \"initDone\";\r\n}\r\n\r\ninterface DecodeMeshDoneMessage {\r\n id: \"decodeMeshDone\";\r\n totalVertices: number;\r\n}\r\n\r\ninterface IndicesMessage {\r\n id: \"indices\";\r\n data: Uint16Array | Uint32Array;\r\n}\r\n\r\ninterface AttributeMessage extends AttributeData {\r\n id: \"attribute\";\r\n}\r\nexport type Message = InitDoneMessage | DecodeMeshDoneMessage | IndicesMessage | AttributeMessage;\r\n// WorkerGlobalScope\r\ndeclare function importScripts(...urls: string[]): void;\r\ndeclare function postMessage(message: Message, transfer?: any[]): void;\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function decodeMesh(\r\n decoderModule: any /*DecoderModule*/,\r\n data: Int8Array,\r\n attributes: { [kind: string]: number } | undefined,\r\n onIndicesData: (indices: Uint16Array | Uint32Array) => void,\r\n onAttributeData: (kind: string, data: ArrayBufferView, size: number, offset: number, stride: number, normalized: boolean) => void\r\n): number {\r\n let decoder: Nullable<Decoder> = null;\r\n let buffer: Nullable<DecoderBuffer> = null;\r\n let geometry: Nullable<Mesh | PointCloud> = null;\r\n\r\n try {\r\n decoder = new decoderModule.Decoder() as Decoder;\r\n\r\n buffer = new decoderModule.DecoderBuffer() as DecoderBuffer;\r\n buffer.Init(data, data.byteLength);\r\n\r\n let status: Status;\r\n const type = decoder.GetEncodedGeometryType(buffer);\r\n switch (type) {\r\n case decoderModule.TRIANGULAR_MESH: {\r\n const mesh = new decoderModule.Mesh();\r\n status = decoder.DecodeBufferToMesh(buffer, mesh);\r\n if (!status.ok() || mesh.ptr === 0) {\r\n throw new Error(status.error_msg());\r\n }\r\n\r\n const numFaces = mesh.num_faces();\r\n const numIndices = numFaces * 3;\r\n const byteLength = numIndices * 4;\r\n\r\n const ptr = decoderModule._malloc(byteLength);\r\n try {\r\n decoder.GetTrianglesUInt32Array(mesh, byteLength, ptr);\r\n const indices = new Uint32Array(numIndices);\r\n indices.set(new Uint32Array(decoderModule.HEAPF32.buffer, ptr, numIndices));\r\n onIndicesData(indices);\r\n } finally {\r\n decoderModule._free(ptr);\r\n }\r\n\r\n geometry = mesh as Mesh;\r\n break;\r\n }\r\n case decoderModule.POINT_CLOUD: {\r\n const pointCloud = new decoderModule.PointCloud();\r\n status = decoder.DecodeBufferToPointCloud(buffer, pointCloud);\r\n if (!status.ok() || !pointCloud.ptr) {\r\n throw new Error(status.error_msg());\r\n }\r\n\r\n geometry = pointCloud as PointCloud;\r\n break;\r\n }\r\n default: {\r\n throw new Error(`Invalid geometry type ${type}`);\r\n }\r\n }\r\n\r\n const numPoints = geometry.num_points();\r\n\r\n const processAttribute = (decoder: Decoder, geometry: Mesh | PointCloud, kind: string, attribute: any) => {\r\n const dataType = attribute.data_type();\r\n const numComponents = attribute.num_components();\r\n const normalized = attribute.normalized();\r\n const byteStride = attribute.byte_stride();\r\n const byteOffset = attribute.byte_offset();\r\n\r\n const dataTypeInfo = {\r\n [decoderModule.DT_FLOAT32]: { typedArrayConstructor: Float32Array, heap: decoderModule.HEAPF32 },\r\n [decoderModule.DT_INT8]: { typedArrayConstructor: Int8Array, heap: decoderModule.HEAP8 },\r\n [decoderModule.DT_INT16]: { typedArrayConstructor: Int16Array, heap: decoderModule.HEAP16 },\r\n [decoderModule.DT_INT32]: { typedArrayConstructor: Int32Array, heap: decoderModule.HEAP32 },\r\n [decoderModule.DT_UINT8]: { typedArrayConstructor: Uint8Array, heap: decoderModule.HEAPU8 },\r\n [decoderModule.DT_UINT16]: { typedArrayConstructor: Uint16Array, heap: decoderModule.HEAPU16 },\r\n [decoderModule.DT_UINT32]: { typedArrayConstructor: Uint32Array, heap: decoderModule.HEAPU32 },\r\n };\r\n\r\n const info = dataTypeInfo[dataType];\r\n if (!info) {\r\n throw new Error(`Invalid data type ${dataType}`);\r\n }\r\n\r\n const numValues = numPoints * numComponents;\r\n const byteLength = numValues * info.typedArrayConstructor.BYTES_PER_ELEMENT;\r\n\r\n const ptr = decoderModule._malloc(byteLength);\r\n try {\r\n decoder.GetAttributeDataArrayForAllPoints(geometry, attribute, dataType, byteLength, ptr);\r\n const data = new info.typedArrayConstructor(info.heap.buffer, ptr, numValues);\r\n onAttributeData(kind, data.slice(), numComponents, byteOffset, byteStride, normalized);\r\n } finally {\r\n decoderModule._free(ptr);\r\n }\r\n };\r\n\r\n if (attributes) {\r\n for (const kind in attributes) {\r\n const id = attributes[kind];\r\n const attribute = decoder.GetAttributeByUniqueId(geometry, id);\r\n processAttribute(decoder, geometry, kind, attribute);\r\n }\r\n } else {\r\n const dracoAttributeTypes: { [kind: string]: number } = {\r\n position: decoderModule.POSITION,\r\n normal: decoderModule.NORMAL,\r\n color: decoderModule.COLOR,\r\n uv: decoderModule.TEX_COORD,\r\n };\r\n\r\n for (const kind in dracoAttributeTypes) {\r\n const id = decoder.GetAttributeId(geometry, dracoAttributeTypes[kind]);\r\n if (id !== -1) {\r\n const attribute = decoder.GetAttribute(geometry, id);\r\n processAttribute(decoder, geometry, kind, attribute);\r\n }\r\n }\r\n }\r\n\r\n return numPoints;\r\n } finally {\r\n if (geometry) {\r\n decoderModule.destroy(geometry);\r\n }\r\n\r\n if (buffer) {\r\n decoderModule.destroy(buffer);\r\n }\r\n\r\n if (decoder) {\r\n decoderModule.destroy(decoder);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The worker function that gets converted to a blob url to pass into a worker.\r\n * To be used if a developer wants to create their own worker instance and inject it instead of using the default worker.\r\n */\r\nexport function workerFunction(): void {\r\n let decoderPromise: PromiseLike<any> | undefined;\r\n\r\n onmessage = (event) => {\r\n const message = event.data;\r\n switch (message.id) {\r\n case \"init\": {\r\n const decoder = message.decoder;\r\n // if URL is provided then load the script. Otherwise expect the script to be loaded already\r\n if (decoder.url) {\r\n importScripts(decoder.url);\r\n }\r\n decoderPromise = DracoDecoderModule({ wasmBinary: decoder.wasmBinary });\r\n postMessage({ id: \"initDone\" });\r\n break;\r\n }\r\n case \"decodeMesh\": {\r\n if (!decoderPromise) {\r\n throw new Error(\"Draco decoder module is not available\");\r\n }\r\n decoderPromise.then((decoder) => {\r\n const numPoints = decodeMesh(\r\n decoder,\r\n message.dataView,\r\n message.attributes,\r\n (indices) => {\r\n postMessage({ id: \"indices\", data: indices }, [indices.buffer]);\r\n },\r\n (kind, data, size, offset, stride, normalized) => {\r\n postMessage({ id: \"attribute\", kind, data, size, byteOffset: offset, byteStride: stride, normalized }, [data.buffer]);\r\n }\r\n );\r\n postMessage({ id: \"decodeMeshDone\", totalVertices: numPoints });\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Initializes a worker that was created for the draco agent pool\r\n * @param worker The worker to initialize\r\n * @param decoderWasmBinary The wasm binary to load into the worker\r\n * @param moduleUrl The url to the draco decoder module (optional)\r\n * @returns A promise that resolves when the worker is initialized\r\n */\r\nexport function initializeWebWorker(worker: Worker, decoderWasmBinary: ArrayBuffer, moduleUrl?: string): Promise<Worker> {\r\n return new Promise<Worker>((resolve, reject) => {\r\n const onError = (error: ErrorEvent) => {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n reject(error);\r\n };\r\n\r\n const onMessage = (event: MessageEvent<Message>) => {\r\n if (event.data.id === \"initDone\") {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n resolve(worker);\r\n }\r\n };\r\n\r\n worker.addEventListener(\"error\", onError);\r\n worker.addEventListener(\"message\", onMessage);\r\n\r\n // clone the array buffer to make it transferable\r\n const clone = decoderWasmBinary.slice(0);\r\n worker.postMessage(\r\n {\r\n id: \"init\",\r\n decoder: {\r\n url: moduleUrl,\r\n wasmBinary: clone,\r\n },\r\n },\r\n [clone]\r\n );\r\n // note: no transfer list as the ArrayBuffer is shared across main thread and pool workers\r\n });\r\n}\r\n"]}
@@ -139,9 +139,13 @@ export class GaussianSplattingMesh extends Mesh {
139
139
  for (const prop of filtered) {
140
140
  const [, type, name] = prop.split(" ");
141
141
  properties.push({ name, type, offset: rowOffset });
142
- if (!offsets[type])
143
- throw new Error(`Unsupported property type: ${type}`);
144
- rowOffset += offsets[type];
142
+ if (offsets[type]) {
143
+ rowOffset += offsets[type];
144
+ }
145
+ else {
146
+ Logger.Error(`Unsupported property type: ${type}. Are you sure it's a valid Gaussian Splatting file?`);
147
+ return new ArrayBuffer(0);
148
+ }
145
149
  }
146
150
  const rowLength = 3 * 4 + 3 * 4 + 4 + 4;
147
151
  const SH_C0 = 0.28209479177387814;
@@ -274,6 +278,9 @@ export class GaussianSplattingMesh extends Mesh {
274
278
  super.dispose(doNotRecurse);
275
279
  }
276
280
  _loadData(data) {
281
+ if (!data.byteLength) {
282
+ return;
283
+ }
277
284
  // Parse the data
278
285
  const uBuffer = new Uint8Array(data);
279
286
  const fBuffer = new Float32Array(uBuffer.buffer);
@@ -1 +1 @@
1
- {"version":3,"file":"gaussianSplattingMesh.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"core/scene\";\r\nimport type { DeepImmutable, Nullable } from \"core/types\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { SubMesh } from \"../subMesh\";\r\nimport type { AbstractMesh } from \"../abstractMesh\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3, Quaternion } from \"core/Maths/math.vector\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\n/**\r\n * Class used to render a gaussian splatting mesh\r\n */\r\nexport class GaussianSplattingMesh extends Mesh {\r\n private _vertexCount = 0;\r\n private _worker: Nullable<Worker> = null;\r\n private _frameIdLastUpdate = -1;\r\n private _modelViewMatrix = Matrix.Identity();\r\n private _material: Nullable<GaussianSplattingMaterial> = null;\r\n private _depthMix: BigInt64Array;\r\n private _canPostToWorker = true;\r\n private _lastProj: DeepImmutable<Float32Array | number[]>;\r\n private _covariancesATexture: Nullable<BaseTexture> = null;\r\n private _covariancesBTexture: Nullable<BaseTexture> = null;\r\n private _centersTexture: Nullable<BaseTexture> = null;\r\n private _colorsTexture: Nullable<BaseTexture> = null;\r\n\r\n /**\r\n * Gets the covariancesA texture\r\n */\r\n public get covariancesATexture() {\r\n return this._covariancesATexture;\r\n }\r\n\r\n /**\r\n * Gets the covariancesB texture\r\n */\r\n public get covariancesBTexture() {\r\n return this._covariancesBTexture;\r\n }\r\n\r\n /**\r\n * Gets the centers texture\r\n */\r\n public get centersTexture() {\r\n return this._centersTexture;\r\n }\r\n\r\n /**\r\n * Gets the colors texture\r\n */\r\n public get colorsTexture() {\r\n return this._colorsTexture;\r\n }\r\n\r\n /**\r\n * Creates a new gaussian splatting mesh\r\n * @param name defines the name of the mesh\r\n * @param url defines the url to load from (optional)\r\n * @param scene defines the hosting scene (optional)\r\n */\r\n constructor(name: string, url: Nullable<string> = null, scene: Nullable<Scene> = null) {\r\n super(name, scene);\r\n\r\n const vertexData = new VertexData();\r\n\r\n vertexData.positions = [-2, -2, 0, 2, -2, 0, 2, 2, 0, -2, 2, 0];\r\n vertexData.indices = [0, 1, 2, 0, 2, 3];\r\n vertexData.applyToMesh(this);\r\n\r\n this.subMeshes = [];\r\n new SubMesh(0, 0, 4, 0, 6, this);\r\n\r\n this.doNotSyncBoundingInfo = true;\r\n this.setEnabled(false);\r\n\r\n this._lastProj = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\r\n\r\n if (url) {\r\n this.loadFileAsync(url);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the class name\r\n * @returns \"GaussianSplattingMesh\"\r\n */\r\n public getClassName(): string {\r\n return \"GaussianSplattingMesh\";\r\n }\r\n\r\n /**\r\n * Returns the total number of vertices (splats) within the mesh\r\n * @returns the total number of vertices\r\n */\r\n public getTotalVertices(): number {\r\n return this._vertexCount;\r\n }\r\n\r\n /**\r\n * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager\r\n * @param subMesh defines the subMesh to render\r\n * @param enableAlphaMode defines if alpha mode can be changed\r\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering\r\n * @returns the current mesh\r\n */\r\n public render(subMesh: SubMesh, enableAlphaMode: boolean, effectiveMeshReplacement?: AbstractMesh): Mesh {\r\n if (!this.material) {\r\n this._material = new GaussianSplattingMaterial(this.name + \"_material\", this._scene);\r\n this.material = this._material;\r\n }\r\n\r\n const frameId = this.getScene().getFrameId();\r\n if (frameId !== this._frameIdLastUpdate && this._worker && this._scene.activeCamera && this._canPostToWorker) {\r\n this.getWorldMatrix().multiplyToRef(this._scene.activeCamera.getViewMatrix(), this._modelViewMatrix);\r\n\r\n const dot = this._lastProj[2] * this._modelViewMatrix.m[2] + this._lastProj[6] * this._modelViewMatrix.m[6] + this._lastProj[10] * this._modelViewMatrix.m[10];\r\n if (Math.abs(dot - 1) >= 0.01) {\r\n this._frameIdLastUpdate = frameId;\r\n this._canPostToWorker = false;\r\n this._lastProj = this._modelViewMatrix.m.slice(0);\r\n this._worker.postMessage({ view: this._modelViewMatrix.m, depthMix: this._depthMix }, [this._depthMix.buffer]);\r\n }\r\n }\r\n\r\n return super.render(subMesh, enableAlphaMode, effectiveMeshReplacement);\r\n }\r\n\r\n /**\r\n * Code from https://github.com/dylanebert/gsplat.js/blob/main/src/loaders/PLYLoader.ts Under MIT license\r\n * Converts a .ply data array buffer to splat\r\n * if data array buffer is not ply, returns the original buffer\r\n * @param data the .ply data to load\r\n * @returns the loaded splat buffer\r\n */\r\n public static ConvertPLYToSplat(data: ArrayBuffer): ArrayBuffer {\r\n const ubuf = new Uint8Array(data);\r\n const header = new TextDecoder().decode(ubuf.slice(0, 1024 * 10));\r\n const headerEnd = \"end_header\\n\";\r\n const headerEndIndex = header.indexOf(headerEnd);\r\n if (headerEndIndex < 0 || !header) {\r\n return data;\r\n }\r\n const vertexCount = parseInt(/element vertex (\\d+)\\n/.exec(header)![1]);\r\n\r\n let rowOffset = 0;\r\n const offsets: Record<string, number> = {\r\n double: 8,\r\n int: 4,\r\n uint: 4,\r\n float: 4,\r\n short: 2,\r\n ushort: 2,\r\n uchar: 1,\r\n };\r\n\r\n type PlyProperty = {\r\n name: string;\r\n type: string;\r\n offset: number;\r\n };\r\n const properties: PlyProperty[] = [];\r\n const filtered = header\r\n .slice(0, headerEndIndex)\r\n .split(\"\\n\")\r\n .filter((k) => k.startsWith(\"property \"));\r\n for (const prop of filtered) {\r\n const [, type, name] = prop.split(\" \");\r\n properties.push({ name, type, offset: rowOffset });\r\n if (!offsets[type]) throw new Error(`Unsupported property type: ${type}`);\r\n rowOffset += offsets[type];\r\n }\r\n\r\n const rowLength = 3 * 4 + 3 * 4 + 4 + 4;\r\n const SH_C0 = 0.28209479177387814;\r\n\r\n const dataView = new DataView(data, headerEndIndex + headerEnd.length);\r\n const buffer = new ArrayBuffer(rowLength * vertexCount);\r\n const q = new Quaternion();\r\n\r\n for (let i = 0; i < vertexCount; i++) {\r\n const position = new Float32Array(buffer, i * rowLength, 3);\r\n const scale = new Float32Array(buffer, i * rowLength + 12, 3);\r\n const rgba = new Uint8ClampedArray(buffer, i * rowLength + 24, 4);\r\n const rot = new Uint8ClampedArray(buffer, i * rowLength + 28, 4);\r\n\r\n let r0: number = 255;\r\n let r1: number = 0;\r\n let r2: number = 0;\r\n let r3: number = 0;\r\n\r\n for (let propertyIndex = 0; propertyIndex < properties.length; propertyIndex++) {\r\n const property = properties[propertyIndex];\r\n let value;\r\n switch (property.type) {\r\n case \"float\":\r\n value = dataView.getFloat32(property.offset + i * rowOffset, true);\r\n break;\r\n case \"int\":\r\n value = dataView.getInt32(property.offset + i * rowOffset, true);\r\n break;\r\n default:\r\n throw new Error(`Unsupported property type: ${property.type}`);\r\n }\r\n\r\n switch (property.name) {\r\n case \"x\":\r\n position[0] = value;\r\n break;\r\n case \"y\":\r\n position[1] = value;\r\n break;\r\n case \"z\":\r\n position[2] = value;\r\n break;\r\n case \"scale_0\":\r\n scale[0] = Math.exp(value);\r\n break;\r\n case \"scale_1\":\r\n scale[1] = Math.exp(value);\r\n break;\r\n case \"scale_2\":\r\n scale[2] = Math.exp(value);\r\n break;\r\n case \"red\":\r\n rgba[0] = value;\r\n break;\r\n case \"green\":\r\n rgba[1] = value;\r\n break;\r\n case \"blue\":\r\n rgba[2] = value;\r\n break;\r\n case \"f_dc_0\":\r\n rgba[0] = (0.5 + SH_C0 * value) * 255;\r\n break;\r\n case \"f_dc_1\":\r\n rgba[1] = (0.5 + SH_C0 * value) * 255;\r\n break;\r\n case \"f_dc_2\":\r\n rgba[2] = (0.5 + SH_C0 * value) * 255;\r\n break;\r\n case \"f_dc_3\":\r\n rgba[3] = (0.5 + SH_C0 * value) * 255;\r\n break;\r\n case \"opacity\":\r\n rgba[3] = (1 / (1 + Math.exp(-value))) * 255;\r\n break;\r\n case \"rot_0\":\r\n r0 = value;\r\n break;\r\n case \"rot_1\":\r\n r1 = value;\r\n break;\r\n case \"rot_2\":\r\n r2 = value;\r\n break;\r\n case \"rot_3\":\r\n r3 = value;\r\n break;\r\n }\r\n }\r\n\r\n q.set(r1, r2, r3, r0);\r\n q.normalize();\r\n rot[0] = q.w * 128 + 128;\r\n rot[1] = q.x * 128 + 128;\r\n rot[2] = q.y * 128 + 128;\r\n rot[3] = q.z * 128 + 128;\r\n }\r\n\r\n return buffer;\r\n }\r\n\r\n /**\r\n * Loads a .splat Gaussian Splatting array buffer asynchronously\r\n * @param data arraybuffer containing splat file\r\n * @returns a promise that resolves when the operation is complete\r\n */\r\n\r\n public loadDataAsync(data: ArrayBuffer): Promise<void> {\r\n return Promise.resolve(this._loadData(data));\r\n }\r\n\r\n /**\r\n * Loads a .splat Gaussian or .ply Splatting file asynchronously\r\n * @param url path to the splat file to load\r\n * @returns a promise that resolves when the operation is complete\r\n */\r\n public loadFileAsync(url: string): Promise<void> {\r\n return Tools.LoadFileAsync(url, true).then((data) => {\r\n this._loadData(GaussianSplattingMesh.ConvertPLYToSplat(data));\r\n });\r\n }\r\n\r\n /**\r\n * Releases resources associated with this mesh.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n */\r\n public dispose(doNotRecurse?: boolean): void {\r\n this._covariancesATexture?.dispose();\r\n this._covariancesBTexture?.dispose();\r\n this._centersTexture?.dispose();\r\n this._colorsTexture?.dispose();\r\n\r\n this._covariancesATexture = null;\r\n this._covariancesBTexture = null;\r\n this._centersTexture = null;\r\n this._colorsTexture = null;\r\n\r\n this._material?.dispose(false, true);\r\n this._material = null;\r\n\r\n this._worker?.terminate();\r\n this._worker = null;\r\n\r\n super.dispose(doNotRecurse);\r\n }\r\n\r\n private static _CreateWorker = function (self: Worker) {\r\n let vertexCount = 0;\r\n let positions: Float32Array;\r\n let depthMix: BigInt64Array;\r\n let indices: Uint32Array;\r\n let floatMix: Float32Array;\r\n\r\n self.onmessage = (e: any) => {\r\n // updated on init\r\n if (e.data.positions) {\r\n positions = e.data.positions;\r\n vertexCount = e.data.vertexCount;\r\n }\r\n // udpate on view changed\r\n else {\r\n const viewProj = e.data.view;\r\n if (!positions || !viewProj) {\r\n // Sanity check, it shouldn't happen!\r\n throw new Error(\"positions or view is not defined!\");\r\n }\r\n\r\n depthMix = e.data.depthMix;\r\n indices = new Uint32Array(depthMix.buffer);\r\n floatMix = new Float32Array(depthMix.buffer);\r\n\r\n // Sort\r\n for (let j = 0; j < vertexCount; j++) {\r\n indices[2 * j] = j;\r\n }\r\n\r\n for (let j = 0; j < vertexCount; j++) {\r\n floatMix[2 * j + 1] = 10000 - (viewProj[2] * positions[3 * j + 0] + viewProj[6] * positions[3 * j + 1] + viewProj[10] * positions[3 * j + 2]);\r\n }\r\n\r\n depthMix.sort();\r\n\r\n self.postMessage({ depthMix }, [depthMix.buffer]);\r\n }\r\n };\r\n };\r\n\r\n private _loadData(data: ArrayBuffer): void {\r\n // Parse the data\r\n const uBuffer = new Uint8Array(data);\r\n const fBuffer = new Float32Array(uBuffer.buffer);\r\n\r\n const rowLength = 3 * 4 + 3 * 4 + 4 + 4;\r\n const vertexCount = uBuffer.length / rowLength;\r\n\r\n this._vertexCount = vertexCount;\r\n\r\n const textureSize = this._getTextureSize(vertexCount);\r\n const textureLength = textureSize.x * textureSize.y;\r\n\r\n const positions = new Float32Array(3 * textureLength);\r\n const covA = new Float32Array(3 * textureLength);\r\n const covB = new Float32Array(3 * textureLength);\r\n\r\n const matrixRotation = TmpVectors.Matrix[0];\r\n const matrixScale = TmpVectors.Matrix[1];\r\n const quaternion = TmpVectors.Quaternion[0];\r\n\r\n const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n\r\n for (let i = 0; i < vertexCount; i++) {\r\n const x = fBuffer[8 * i + 0];\r\n const y = -fBuffer[8 * i + 1];\r\n const z = fBuffer[8 * i + 2];\r\n\r\n positions[3 * i + 0] = x;\r\n positions[3 * i + 1] = y;\r\n positions[3 * i + 2] = z;\r\n\r\n minimum.minimizeInPlaceFromFloats(x, y, z);\r\n maximum.maximizeInPlaceFromFloats(x, y, z);\r\n\r\n quaternion.set(\r\n (uBuffer[32 * i + 28 + 1] - 128) / 128,\r\n (uBuffer[32 * i + 28 + 2] - 128) / 128,\r\n (uBuffer[32 * i + 28 + 3] - 128) / 128,\r\n -(uBuffer[32 * i + 28 + 0] - 128) / 128\r\n );\r\n quaternion.toRotationMatrix(matrixRotation);\r\n\r\n Matrix.ScalingToRef(fBuffer[8 * i + 3 + 0] * 2, fBuffer[8 * i + 3 + 1] * 2, fBuffer[8 * i + 3 + 2] * 2, matrixScale);\r\n\r\n const M = matrixRotation.multiplyToRef(matrixScale, TmpVectors.Matrix[0]).m;\r\n\r\n covA[i * 3 + 0] = M[0] * M[0] + M[1] * M[1] + M[2] * M[2];\r\n covA[i * 3 + 1] = M[0] * M[4] + M[1] * M[5] + M[2] * M[6];\r\n covA[i * 3 + 2] = M[0] * M[8] + M[1] * M[9] + M[2] * M[10];\r\n covB[i * 3 + 0] = M[4] * M[4] + M[5] * M[5] + M[6] * M[6];\r\n covB[i * 3 + 1] = M[4] * M[8] + M[5] * M[9] + M[6] * M[10];\r\n covB[i * 3 + 2] = M[8] * M[8] + M[9] * M[9] + M[10] * M[10];\r\n }\r\n\r\n // Update the mesh\r\n const binfo = this.getBoundingInfo();\r\n binfo.reConstruct(minimum, maximum, this.getWorldMatrix());\r\n binfo.isLocked = true;\r\n\r\n this.forcedInstanceCount = this._vertexCount;\r\n this.setEnabled(true);\r\n\r\n const splatIndex = new Float32Array(this._vertexCount * 1);\r\n\r\n this.thinInstanceSetBuffer(\"splatIndex\", splatIndex, 1, false);\r\n\r\n // Update the material\r\n const createTextureFromData = (data: Float32Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURETYPE_FLOAT);\r\n };\r\n\r\n const convertRgbToRgba = (rgb: Float32Array) => {\r\n const count = rgb.length / 3;\r\n const rgba = new Float32Array(count * 4);\r\n for (let i = 0; i < count; ++i) {\r\n rgba[i * 4 + 0] = rgb[i * 3 + 0];\r\n rgba[i * 4 + 1] = rgb[i * 3 + 1];\r\n rgba[i * 4 + 2] = rgb[i * 3 + 2];\r\n rgba[i * 4 + 3] = 1.0;\r\n }\r\n return rgba;\r\n };\r\n\r\n const colorArray = new Float32Array(textureSize.x * textureSize.y * 4);\r\n for (let i = 0; i < this._vertexCount; ++i) {\r\n colorArray[i * 4 + 0] = uBuffer[32 * i + 24 + 0] / 255;\r\n colorArray[i * 4 + 1] = uBuffer[32 * i + 24 + 1] / 255;\r\n colorArray[i * 4 + 2] = uBuffer[32 * i + 24 + 2] / 255;\r\n colorArray[i * 4 + 3] = uBuffer[32 * i + 24 + 3] / 255;\r\n }\r\n\r\n this._covariancesATexture = createTextureFromData(convertRgbToRgba(covA), textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._covariancesBTexture = createTextureFromData(convertRgbToRgba(covB), textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._centersTexture = createTextureFromData(convertRgbToRgba(positions), textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._colorsTexture = createTextureFromData(colorArray, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n\r\n // Start the worker thread\r\n this._worker?.terminate();\r\n this._worker = new Worker(\r\n URL.createObjectURL(\r\n new Blob([\"(\", GaussianSplattingMesh._CreateWorker.toString(), \")(self)\"], {\r\n type: \"application/javascript\",\r\n })\r\n )\r\n );\r\n\r\n this._depthMix = new BigInt64Array(vertexCount);\r\n\r\n this._worker.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n\r\n this._worker.onmessage = (e) => {\r\n this._depthMix = e.data.depthMix;\r\n const indexMix = new Uint32Array(e.data.depthMix.buffer);\r\n for (let j = 0; j < this._vertexCount; j++) {\r\n splatIndex[j] = indexMix[2 * j];\r\n }\r\n this.thinInstanceBufferUpdated(\"splatIndex\");\r\n this._canPostToWorker = true;\r\n };\r\n }\r\n\r\n private _getTextureSize(length: number): Vector2 {\r\n const engine = this._scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n\r\n let height = 1;\r\n\r\n if (engine.webGLVersion === 1 && !engine.isWebGPU) {\r\n while (width * height < length) {\r\n height *= 2;\r\n }\r\n } else {\r\n height = Math.ceil(length / width);\r\n }\r\n\r\n if (height > width) {\r\n Logger.Error(\"GaussianSplatting texture size: (\" + width + \", \" + height + \"), maxTextureSize: \" + width);\r\n height = width;\r\n }\r\n\r\n return new Vector2(width, height);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"gaussianSplattingMesh.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,4BAAwB;AACxC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,mCAA+B;AAC1F,OAAO,EAAE,MAAM,EAAE,6BAAyB;AAC1C,OAAO,EAAE,yBAAyB,EAAE,uEAAmE;AACvG,OAAO,EAAE,UAAU,EAAE,+CAA2C;AAChE,OAAO,EAAE,SAAS,EAAE,mCAA+B;AAEnD;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,IAAI;IAc3C;;OAEG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACH,YAAY,IAAY,EAAE,MAAwB,IAAI,EAAE,QAAyB,IAAI;QACjF,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAhDf,iBAAY,GAAG,CAAC,CAAC;QACjB,YAAO,GAAqB,IAAI,CAAC;QACjC,uBAAkB,GAAG,CAAC,CAAC,CAAC;QACxB,qBAAgB,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,cAAS,GAAwC,IAAI,CAAC;QAEtD,qBAAgB,GAAG,IAAI,CAAC;QAExB,yBAAoB,GAA0B,IAAI,CAAC;QACnD,yBAAoB,GAA0B,IAAI,CAAC;QACnD,oBAAe,GAA0B,IAAI,CAAC;QAC9C,mBAAc,GAA0B,IAAI,CAAC;QAuCjD,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QAEpC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAEjC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAEvB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAElE,IAAI,GAAG,EAAE;YACL,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;SAC3B;IACL,CAAC;IAED;;;OAGG;IACI,YAAY;QACf,OAAO,uBAAuB,CAAC;IACnC,CAAC;IAED;;;OAGG;IACI,gBAAgB;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,OAAgB,EAAE,eAAwB,EAAE,wBAAuC;QAC7F,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACrF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;SAClC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,OAAO,KAAK,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAC1G,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAErG,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/J,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE;gBAC3B,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;gBAClC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;gBAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;aAClH;SACJ;QAED,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,wBAAwB,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,iBAAiB,CAAC,IAAiB;QAC7C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,cAAc,CAAC;QACjC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,cAAc,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE;YAC/B,OAAO,IAAI,CAAC;SACf;QACD,MAAM,WAAW,GAAG,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAExE,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,OAAO,GAA2B;YACpC,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;SACX,CAAC;QAOF,MAAM,UAAU,GAAkB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM;aAClB,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;aACxB,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;YACzB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;gBACf,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;aAC9B;iBAAM;gBACH,MAAM,CAAC,KAAK,CAAC,8BAA8B,IAAI,sDAAsD,CAAC,CAAC;gBACvG,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;aAC7B;SACJ;QAED,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,mBAAmB,CAAC;QAElC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YAClC,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YAEjE,IAAI,EAAE,GAAW,GAAG,CAAC;YACrB,IAAI,EAAE,GAAW,CAAC,CAAC;YACnB,IAAI,EAAE,GAAW,CAAC,CAAC;YACnB,IAAI,EAAE,GAAW,CAAC,CAAC;YAEnB,KAAK,IAAI,aAAa,GAAG,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE;gBAC5E,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;gBAC3C,IAAI,KAAK,CAAC;gBACV,QAAQ,QAAQ,CAAC,IAAI,EAAE;oBACnB,KAAK,OAAO;wBACR,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC;wBACnE,MAAM;oBACV,KAAK,KAAK;wBACN,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC;wBACjE,MAAM;oBACV;wBACI,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;iBACtE;gBAED,QAAQ,QAAQ,CAAC,IAAI,EAAE;oBACnB,KAAK,GAAG;wBACJ,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;wBACpB,MAAM;oBACV,KAAK,GAAG;wBACJ,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;wBACpB,MAAM;oBACV,KAAK,GAAG;wBACJ,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;wBACpB,MAAM;oBACV,KAAK,SAAS;wBACV,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBAC3B,MAAM;oBACV,KAAK,SAAS;wBACV,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBAC3B,MAAM;oBACV,KAAK,SAAS;wBACV,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBAC3B,MAAM;oBACV,KAAK,KAAK;wBACN,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;wBAChB,MAAM;oBACV,KAAK,OAAO;wBACR,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;wBAChB,MAAM;oBACV,KAAK,MAAM;wBACP,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;wBAChB,MAAM;oBACV,KAAK,QAAQ;wBACT,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;wBACtC,MAAM;oBACV,KAAK,QAAQ;wBACT,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;wBACtC,MAAM;oBACV,KAAK,QAAQ;wBACT,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;wBACtC,MAAM;oBACV,KAAK,QAAQ;wBACT,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;wBACtC,MAAM;oBACV,KAAK,SAAS;wBACV,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAC7C,MAAM;oBACV,KAAK,OAAO;wBACR,EAAE,GAAG,KAAK,CAAC;wBACX,MAAM;oBACV,KAAK,OAAO;wBACR,EAAE,GAAG,KAAK,CAAC;wBACX,MAAM;oBACV,KAAK,OAAO;wBACR,EAAE,GAAG,KAAK,CAAC;wBACX,MAAM;oBACV,KAAK,OAAO;wBACR,EAAE,GAAG,KAAK,CAAC;wBACX,MAAM;iBACb;aACJ;YAED,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACtB,CAAC,CAAC,SAAS,EAAE,CAAC;YACd,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;YACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;YACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;YACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;SAC5B;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;OAIG;IAEI,aAAa,CAAC,IAAiB;QAClC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED;;;;OAIG;IACI,aAAa,CAAC,GAAW;QAC5B,OAAO,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAChD,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACI,OAAO,CAAC,YAAsB;QACjC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC;QAE/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAE3B,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IA2CO,SAAS,CAAC,IAAiB;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO;SACV;QACD,iBAAiB;QACjB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEjD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAE/C,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAEhC,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;QAEjD,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAE5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAErF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YAClC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAE7B,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACzB,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACzB,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAEzB,OAAO,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE3C,UAAU,CAAC,GAAG,CACV,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EACtC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EACtC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EACtC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAC1C,CAAC;YACF,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;YAE5C,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;YAErH,MAAM,CAAC,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE5E,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;SAC/D;QAED,kBAAkB;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACrC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEtB,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAE/D,sBAAsB;QACtB,MAAM,qBAAqB,GAAG,CAAC,IAAkB,EAAE,KAAa,EAAE,MAAc,EAAE,MAAc,EAAE,EAAE;YAChG,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,6BAA6B,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACxJ,CAAC,CAAC;QAEF,MAAM,gBAAgB,GAAG,CAAC,GAAiB,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE;gBAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;aACzB;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;YACxC,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACvD,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACvD,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACvD,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;SAC1D;QAED,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACtI,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACtI,IAAI,CAAC,eAAe,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACtI,IAAI,CAAC,cAAc,GAAG,qBAAqB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAEpH,0BAA0B;QAC1B,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CACrB,GAAG,CAAC,eAAe,CACf,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,qBAAqB,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE;YACvE,IAAI,EAAE,wBAAwB;SACjC,CAAC,CACL,CACJ,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;QAEhD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzE,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE;YAC3B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE;gBACxC,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aACnC;YACD,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAC;IACN,CAAC;IAEO,eAAe,CAAC,MAAc;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC;QAE9C,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,IAAI,MAAM,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YAC/C,OAAO,KAAK,GAAG,MAAM,GAAG,MAAM,EAAE;gBAC5B,MAAM,IAAI,CAAC,CAAC;aACf;SACJ;aAAM;YACH,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;SACtC;QAED,IAAI,MAAM,GAAG,KAAK,EAAE;YAChB,MAAM,CAAC,KAAK,CAAC,mCAAmC,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,qBAAqB,GAAG,KAAK,CAAC,CAAC;YAC1G,MAAM,GAAG,KAAK,CAAC;SAClB;QAED,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;;AA3Lc,mCAAa,GAAG,UAAU,IAAY;IACjD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAuB,CAAC;IAC5B,IAAI,QAAuB,CAAC;IAC5B,IAAI,OAAoB,CAAC;IACzB,IAAI,QAAsB,CAAC;IAE3B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAM,EAAE,EAAE;QACxB,kBAAkB;QAClB,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE;YAClB,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;YAC7B,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;SACpC;QACD,yBAAyB;aACpB;YACD,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE;gBACzB,qCAAqC;gBACrC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;aACxD;YAED,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3B,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3C,QAAQ,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE7C,OAAO;YACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;gBAClC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;aACtB;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;gBAClC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACjJ;YAED,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEhB,IAAI,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;SACrD;IACL,CAAC,CAAC;AACN,CAAC,AAvC2B,CAuC1B","sourcesContent":["import type { Scene } from \"core/scene\";\r\nimport type { DeepImmutable, Nullable } from \"core/types\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { SubMesh } from \"../subMesh\";\r\nimport type { AbstractMesh } from \"../abstractMesh\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3, Quaternion } from \"core/Maths/math.vector\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\n/**\r\n * Class used to render a gaussian splatting mesh\r\n */\r\nexport class GaussianSplattingMesh extends Mesh {\r\n private _vertexCount = 0;\r\n private _worker: Nullable<Worker> = null;\r\n private _frameIdLastUpdate = -1;\r\n private _modelViewMatrix = Matrix.Identity();\r\n private _material: Nullable<GaussianSplattingMaterial> = null;\r\n private _depthMix: BigInt64Array;\r\n private _canPostToWorker = true;\r\n private _lastProj: DeepImmutable<Float32Array | number[]>;\r\n private _covariancesATexture: Nullable<BaseTexture> = null;\r\n private _covariancesBTexture: Nullable<BaseTexture> = null;\r\n private _centersTexture: Nullable<BaseTexture> = null;\r\n private _colorsTexture: Nullable<BaseTexture> = null;\r\n\r\n /**\r\n * Gets the covariancesA texture\r\n */\r\n public get covariancesATexture() {\r\n return this._covariancesATexture;\r\n }\r\n\r\n /**\r\n * Gets the covariancesB texture\r\n */\r\n public get covariancesBTexture() {\r\n return this._covariancesBTexture;\r\n }\r\n\r\n /**\r\n * Gets the centers texture\r\n */\r\n public get centersTexture() {\r\n return this._centersTexture;\r\n }\r\n\r\n /**\r\n * Gets the colors texture\r\n */\r\n public get colorsTexture() {\r\n return this._colorsTexture;\r\n }\r\n\r\n /**\r\n * Creates a new gaussian splatting mesh\r\n * @param name defines the name of the mesh\r\n * @param url defines the url to load from (optional)\r\n * @param scene defines the hosting scene (optional)\r\n */\r\n constructor(name: string, url: Nullable<string> = null, scene: Nullable<Scene> = null) {\r\n super(name, scene);\r\n\r\n const vertexData = new VertexData();\r\n\r\n vertexData.positions = [-2, -2, 0, 2, -2, 0, 2, 2, 0, -2, 2, 0];\r\n vertexData.indices = [0, 1, 2, 0, 2, 3];\r\n vertexData.applyToMesh(this);\r\n\r\n this.subMeshes = [];\r\n new SubMesh(0, 0, 4, 0, 6, this);\r\n\r\n this.doNotSyncBoundingInfo = true;\r\n this.setEnabled(false);\r\n\r\n this._lastProj = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\r\n\r\n if (url) {\r\n this.loadFileAsync(url);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the class name\r\n * @returns \"GaussianSplattingMesh\"\r\n */\r\n public getClassName(): string {\r\n return \"GaussianSplattingMesh\";\r\n }\r\n\r\n /**\r\n * Returns the total number of vertices (splats) within the mesh\r\n * @returns the total number of vertices\r\n */\r\n public getTotalVertices(): number {\r\n return this._vertexCount;\r\n }\r\n\r\n /**\r\n * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager\r\n * @param subMesh defines the subMesh to render\r\n * @param enableAlphaMode defines if alpha mode can be changed\r\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering\r\n * @returns the current mesh\r\n */\r\n public render(subMesh: SubMesh, enableAlphaMode: boolean, effectiveMeshReplacement?: AbstractMesh): Mesh {\r\n if (!this.material) {\r\n this._material = new GaussianSplattingMaterial(this.name + \"_material\", this._scene);\r\n this.material = this._material;\r\n }\r\n\r\n const frameId = this.getScene().getFrameId();\r\n if (frameId !== this._frameIdLastUpdate && this._worker && this._scene.activeCamera && this._canPostToWorker) {\r\n this.getWorldMatrix().multiplyToRef(this._scene.activeCamera.getViewMatrix(), this._modelViewMatrix);\r\n\r\n const dot = this._lastProj[2] * this._modelViewMatrix.m[2] + this._lastProj[6] * this._modelViewMatrix.m[6] + this._lastProj[10] * this._modelViewMatrix.m[10];\r\n if (Math.abs(dot - 1) >= 0.01) {\r\n this._frameIdLastUpdate = frameId;\r\n this._canPostToWorker = false;\r\n this._lastProj = this._modelViewMatrix.m.slice(0);\r\n this._worker.postMessage({ view: this._modelViewMatrix.m, depthMix: this._depthMix }, [this._depthMix.buffer]);\r\n }\r\n }\r\n\r\n return super.render(subMesh, enableAlphaMode, effectiveMeshReplacement);\r\n }\r\n\r\n /**\r\n * Code from https://github.com/dylanebert/gsplat.js/blob/main/src/loaders/PLYLoader.ts Under MIT license\r\n * Converts a .ply data array buffer to splat\r\n * if data array buffer is not ply, returns the original buffer\r\n * @param data the .ply data to load\r\n * @returns the loaded splat buffer\r\n */\r\n public static ConvertPLYToSplat(data: ArrayBuffer): ArrayBuffer {\r\n const ubuf = new Uint8Array(data);\r\n const header = new TextDecoder().decode(ubuf.slice(0, 1024 * 10));\r\n const headerEnd = \"end_header\\n\";\r\n const headerEndIndex = header.indexOf(headerEnd);\r\n if (headerEndIndex < 0 || !header) {\r\n return data;\r\n }\r\n const vertexCount = parseInt(/element vertex (\\d+)\\n/.exec(header)![1]);\r\n\r\n let rowOffset = 0;\r\n const offsets: Record<string, number> = {\r\n double: 8,\r\n int: 4,\r\n uint: 4,\r\n float: 4,\r\n short: 2,\r\n ushort: 2,\r\n uchar: 1,\r\n };\r\n\r\n type PlyProperty = {\r\n name: string;\r\n type: string;\r\n offset: number;\r\n };\r\n const properties: PlyProperty[] = [];\r\n const filtered = header\r\n .slice(0, headerEndIndex)\r\n .split(\"\\n\")\r\n .filter((k) => k.startsWith(\"property \"));\r\n for (const prop of filtered) {\r\n const [, type, name] = prop.split(\" \");\r\n properties.push({ name, type, offset: rowOffset });\r\n if (offsets[type]) {\r\n rowOffset += offsets[type];\r\n } else {\r\n Logger.Error(`Unsupported property type: ${type}. Are you sure it's a valid Gaussian Splatting file?`);\r\n return new ArrayBuffer(0);\r\n }\r\n }\r\n\r\n const rowLength = 3 * 4 + 3 * 4 + 4 + 4;\r\n const SH_C0 = 0.28209479177387814;\r\n\r\n const dataView = new DataView(data, headerEndIndex + headerEnd.length);\r\n const buffer = new ArrayBuffer(rowLength * vertexCount);\r\n const q = new Quaternion();\r\n\r\n for (let i = 0; i < vertexCount; i++) {\r\n const position = new Float32Array(buffer, i * rowLength, 3);\r\n const scale = new Float32Array(buffer, i * rowLength + 12, 3);\r\n const rgba = new Uint8ClampedArray(buffer, i * rowLength + 24, 4);\r\n const rot = new Uint8ClampedArray(buffer, i * rowLength + 28, 4);\r\n\r\n let r0: number = 255;\r\n let r1: number = 0;\r\n let r2: number = 0;\r\n let r3: number = 0;\r\n\r\n for (let propertyIndex = 0; propertyIndex < properties.length; propertyIndex++) {\r\n const property = properties[propertyIndex];\r\n let value;\r\n switch (property.type) {\r\n case \"float\":\r\n value = dataView.getFloat32(property.offset + i * rowOffset, true);\r\n break;\r\n case \"int\":\r\n value = dataView.getInt32(property.offset + i * rowOffset, true);\r\n break;\r\n default:\r\n throw new Error(`Unsupported property type: ${property.type}`);\r\n }\r\n\r\n switch (property.name) {\r\n case \"x\":\r\n position[0] = value;\r\n break;\r\n case \"y\":\r\n position[1] = value;\r\n break;\r\n case \"z\":\r\n position[2] = value;\r\n break;\r\n case \"scale_0\":\r\n scale[0] = Math.exp(value);\r\n break;\r\n case \"scale_1\":\r\n scale[1] = Math.exp(value);\r\n break;\r\n case \"scale_2\":\r\n scale[2] = Math.exp(value);\r\n break;\r\n case \"red\":\r\n rgba[0] = value;\r\n break;\r\n case \"green\":\r\n rgba[1] = value;\r\n break;\r\n case \"blue\":\r\n rgba[2] = value;\r\n break;\r\n case \"f_dc_0\":\r\n rgba[0] = (0.5 + SH_C0 * value) * 255;\r\n break;\r\n case \"f_dc_1\":\r\n rgba[1] = (0.5 + SH_C0 * value) * 255;\r\n break;\r\n case \"f_dc_2\":\r\n rgba[2] = (0.5 + SH_C0 * value) * 255;\r\n break;\r\n case \"f_dc_3\":\r\n rgba[3] = (0.5 + SH_C0 * value) * 255;\r\n break;\r\n case \"opacity\":\r\n rgba[3] = (1 / (1 + Math.exp(-value))) * 255;\r\n break;\r\n case \"rot_0\":\r\n r0 = value;\r\n break;\r\n case \"rot_1\":\r\n r1 = value;\r\n break;\r\n case \"rot_2\":\r\n r2 = value;\r\n break;\r\n case \"rot_3\":\r\n r3 = value;\r\n break;\r\n }\r\n }\r\n\r\n q.set(r1, r2, r3, r0);\r\n q.normalize();\r\n rot[0] = q.w * 128 + 128;\r\n rot[1] = q.x * 128 + 128;\r\n rot[2] = q.y * 128 + 128;\r\n rot[3] = q.z * 128 + 128;\r\n }\r\n\r\n return buffer;\r\n }\r\n\r\n /**\r\n * Loads a .splat Gaussian Splatting array buffer asynchronously\r\n * @param data arraybuffer containing splat file\r\n * @returns a promise that resolves when the operation is complete\r\n */\r\n\r\n public loadDataAsync(data: ArrayBuffer): Promise<void> {\r\n return Promise.resolve(this._loadData(data));\r\n }\r\n\r\n /**\r\n * Loads a .splat Gaussian or .ply Splatting file asynchronously\r\n * @param url path to the splat file to load\r\n * @returns a promise that resolves when the operation is complete\r\n */\r\n public loadFileAsync(url: string): Promise<void> {\r\n return Tools.LoadFileAsync(url, true).then((data) => {\r\n this._loadData(GaussianSplattingMesh.ConvertPLYToSplat(data));\r\n });\r\n }\r\n\r\n /**\r\n * Releases resources associated with this mesh.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n */\r\n public dispose(doNotRecurse?: boolean): void {\r\n this._covariancesATexture?.dispose();\r\n this._covariancesBTexture?.dispose();\r\n this._centersTexture?.dispose();\r\n this._colorsTexture?.dispose();\r\n\r\n this._covariancesATexture = null;\r\n this._covariancesBTexture = null;\r\n this._centersTexture = null;\r\n this._colorsTexture = null;\r\n\r\n this._material?.dispose(false, true);\r\n this._material = null;\r\n\r\n this._worker?.terminate();\r\n this._worker = null;\r\n\r\n super.dispose(doNotRecurse);\r\n }\r\n\r\n private static _CreateWorker = function (self: Worker) {\r\n let vertexCount = 0;\r\n let positions: Float32Array;\r\n let depthMix: BigInt64Array;\r\n let indices: Uint32Array;\r\n let floatMix: Float32Array;\r\n\r\n self.onmessage = (e: any) => {\r\n // updated on init\r\n if (e.data.positions) {\r\n positions = e.data.positions;\r\n vertexCount = e.data.vertexCount;\r\n }\r\n // udpate on view changed\r\n else {\r\n const viewProj = e.data.view;\r\n if (!positions || !viewProj) {\r\n // Sanity check, it shouldn't happen!\r\n throw new Error(\"positions or view is not defined!\");\r\n }\r\n\r\n depthMix = e.data.depthMix;\r\n indices = new Uint32Array(depthMix.buffer);\r\n floatMix = new Float32Array(depthMix.buffer);\r\n\r\n // Sort\r\n for (let j = 0; j < vertexCount; j++) {\r\n indices[2 * j] = j;\r\n }\r\n\r\n for (let j = 0; j < vertexCount; j++) {\r\n floatMix[2 * j + 1] = 10000 - (viewProj[2] * positions[3 * j + 0] + viewProj[6] * positions[3 * j + 1] + viewProj[10] * positions[3 * j + 2]);\r\n }\r\n\r\n depthMix.sort();\r\n\r\n self.postMessage({ depthMix }, [depthMix.buffer]);\r\n }\r\n };\r\n };\r\n\r\n private _loadData(data: ArrayBuffer): void {\r\n if (!data.byteLength) {\r\n return;\r\n }\r\n // Parse the data\r\n const uBuffer = new Uint8Array(data);\r\n const fBuffer = new Float32Array(uBuffer.buffer);\r\n\r\n const rowLength = 3 * 4 + 3 * 4 + 4 + 4;\r\n const vertexCount = uBuffer.length / rowLength;\r\n\r\n this._vertexCount = vertexCount;\r\n\r\n const textureSize = this._getTextureSize(vertexCount);\r\n const textureLength = textureSize.x * textureSize.y;\r\n\r\n const positions = new Float32Array(3 * textureLength);\r\n const covA = new Float32Array(3 * textureLength);\r\n const covB = new Float32Array(3 * textureLength);\r\n\r\n const matrixRotation = TmpVectors.Matrix[0];\r\n const matrixScale = TmpVectors.Matrix[1];\r\n const quaternion = TmpVectors.Quaternion[0];\r\n\r\n const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n\r\n for (let i = 0; i < vertexCount; i++) {\r\n const x = fBuffer[8 * i + 0];\r\n const y = -fBuffer[8 * i + 1];\r\n const z = fBuffer[8 * i + 2];\r\n\r\n positions[3 * i + 0] = x;\r\n positions[3 * i + 1] = y;\r\n positions[3 * i + 2] = z;\r\n\r\n minimum.minimizeInPlaceFromFloats(x, y, z);\r\n maximum.maximizeInPlaceFromFloats(x, y, z);\r\n\r\n quaternion.set(\r\n (uBuffer[32 * i + 28 + 1] - 128) / 128,\r\n (uBuffer[32 * i + 28 + 2] - 128) / 128,\r\n (uBuffer[32 * i + 28 + 3] - 128) / 128,\r\n -(uBuffer[32 * i + 28 + 0] - 128) / 128\r\n );\r\n quaternion.toRotationMatrix(matrixRotation);\r\n\r\n Matrix.ScalingToRef(fBuffer[8 * i + 3 + 0] * 2, fBuffer[8 * i + 3 + 1] * 2, fBuffer[8 * i + 3 + 2] * 2, matrixScale);\r\n\r\n const M = matrixRotation.multiplyToRef(matrixScale, TmpVectors.Matrix[0]).m;\r\n\r\n covA[i * 3 + 0] = M[0] * M[0] + M[1] * M[1] + M[2] * M[2];\r\n covA[i * 3 + 1] = M[0] * M[4] + M[1] * M[5] + M[2] * M[6];\r\n covA[i * 3 + 2] = M[0] * M[8] + M[1] * M[9] + M[2] * M[10];\r\n covB[i * 3 + 0] = M[4] * M[4] + M[5] * M[5] + M[6] * M[6];\r\n covB[i * 3 + 1] = M[4] * M[8] + M[5] * M[9] + M[6] * M[10];\r\n covB[i * 3 + 2] = M[8] * M[8] + M[9] * M[9] + M[10] * M[10];\r\n }\r\n\r\n // Update the mesh\r\n const binfo = this.getBoundingInfo();\r\n binfo.reConstruct(minimum, maximum, this.getWorldMatrix());\r\n binfo.isLocked = true;\r\n\r\n this.forcedInstanceCount = this._vertexCount;\r\n this.setEnabled(true);\r\n\r\n const splatIndex = new Float32Array(this._vertexCount * 1);\r\n\r\n this.thinInstanceSetBuffer(\"splatIndex\", splatIndex, 1, false);\r\n\r\n // Update the material\r\n const createTextureFromData = (data: Float32Array, width: number, height: number, format: number) => {\r\n return new RawTexture(data, width, height, format, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURETYPE_FLOAT);\r\n };\r\n\r\n const convertRgbToRgba = (rgb: Float32Array) => {\r\n const count = rgb.length / 3;\r\n const rgba = new Float32Array(count * 4);\r\n for (let i = 0; i < count; ++i) {\r\n rgba[i * 4 + 0] = rgb[i * 3 + 0];\r\n rgba[i * 4 + 1] = rgb[i * 3 + 1];\r\n rgba[i * 4 + 2] = rgb[i * 3 + 2];\r\n rgba[i * 4 + 3] = 1.0;\r\n }\r\n return rgba;\r\n };\r\n\r\n const colorArray = new Float32Array(textureSize.x * textureSize.y * 4);\r\n for (let i = 0; i < this._vertexCount; ++i) {\r\n colorArray[i * 4 + 0] = uBuffer[32 * i + 24 + 0] / 255;\r\n colorArray[i * 4 + 1] = uBuffer[32 * i + 24 + 1] / 255;\r\n colorArray[i * 4 + 2] = uBuffer[32 * i + 24 + 2] / 255;\r\n colorArray[i * 4 + 3] = uBuffer[32 * i + 24 + 3] / 255;\r\n }\r\n\r\n this._covariancesATexture = createTextureFromData(convertRgbToRgba(covA), textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._covariancesBTexture = createTextureFromData(convertRgbToRgba(covB), textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._centersTexture = createTextureFromData(convertRgbToRgba(positions), textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n this._colorsTexture = createTextureFromData(colorArray, textureSize.x, textureSize.y, Constants.TEXTUREFORMAT_RGBA);\r\n\r\n // Start the worker thread\r\n this._worker?.terminate();\r\n this._worker = new Worker(\r\n URL.createObjectURL(\r\n new Blob([\"(\", GaussianSplattingMesh._CreateWorker.toString(), \")(self)\"], {\r\n type: \"application/javascript\",\r\n })\r\n )\r\n );\r\n\r\n this._depthMix = new BigInt64Array(vertexCount);\r\n\r\n this._worker.postMessage({ positions, vertexCount }, [positions.buffer]);\r\n\r\n this._worker.onmessage = (e) => {\r\n this._depthMix = e.data.depthMix;\r\n const indexMix = new Uint32Array(e.data.depthMix.buffer);\r\n for (let j = 0; j < this._vertexCount; j++) {\r\n splatIndex[j] = indexMix[2 * j];\r\n }\r\n this.thinInstanceBufferUpdated(\"splatIndex\");\r\n this._canPostToWorker = true;\r\n };\r\n }\r\n\r\n private _getTextureSize(length: number): Vector2 {\r\n const engine = this._scene.getEngine();\r\n const width = engine.getCaps().maxTextureSize;\r\n\r\n let height = 1;\r\n\r\n if (engine.webGLVersion === 1 && !engine.isWebGPU) {\r\n while (width * height < length) {\r\n height *= 2;\r\n }\r\n } else {\r\n height = Math.ceil(length / width);\r\n }\r\n\r\n if (height > width) {\r\n Logger.Error(\"GaussianSplatting texture size: (\" + width + \", \" + height + \"), maxTextureSize: \" + width);\r\n height = width;\r\n }\r\n\r\n return new Vector2(width, height);\r\n }\r\n}\r\n"]}
@@ -1,5 +1,5 @@
1
1
  import { Vector3 } from "../Maths/math.vector";
2
- import type { PhysicsShape } from "./v2";
2
+ import type { PhysicsShape } from "./v2/physicsShape";
3
3
  import type { PhysicsBody } from "./v2/physicsBody";
4
4
  /**
5
5
  * Base class for results of casts.
@@ -1 +1 @@
1
- {"version":3,"file":"castingResult.js","sourceRoot":"","sources":["../../../../dev/core/src/Physics/castingResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI/C;;GAEG;AACH,MAAM,OAAO,aAAa;IAA1B;QACY,YAAO,GAAY,KAAK,CAAC;QACvB,eAAU,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QACrC,cAAS,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,mBAAc,GAAW,CAAC,CAAC,CAAC;IAsExC,CAAC;IAtDG;;OAEG;IACH,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IACD;;OAEG;IACH,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IACD;;OAEG;IACH,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACI,UAAU,CAAC,SAAe,EAAE,QAAc,EAAE,aAAsB;QACrE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,KAAK;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IAC3B,CAAC;CACJ","sourcesContent":["import { Vector3 } from \"../Maths/math.vector\";\r\nimport type { PhysicsShape } from \"./v2\";\r\nimport type { PhysicsBody } from \"./v2/physicsBody\";\r\n\r\n/**\r\n * Base class for results of casts.\r\n */\r\nexport class CastingResult {\r\n private _hasHit: boolean = false;\r\n protected _hitNormal: Vector3 = Vector3.Zero();\r\n protected _hitPoint: Vector3 = Vector3.Zero();\r\n private _triangleIndex: number = -1;\r\n\r\n /**\r\n * The Physics body that the query hit.\r\n */\r\n public body?: PhysicsBody;\r\n /**\r\n * The body Index in case the Physics body is using instances\r\n */\r\n public bodyIndex?: number;\r\n\r\n /**\r\n * The shape hit by the query.\r\n */\r\n public shape?: PhysicsShape;\r\n\r\n /**\r\n * Gets the hit point.\r\n */\r\n get hitPoint(): Vector3 {\r\n return this._hitPoint;\r\n }\r\n /**\r\n * Gets the hit normal.\r\n */\r\n get hitNormal(): Vector3 {\r\n return this._hitNormal;\r\n }\r\n /**\r\n * Gets if there was a hit\r\n */\r\n get hasHit(): boolean {\r\n return this._hasHit;\r\n }\r\n\r\n /*\r\n * The index of the original triangle which was hit. Will be -1 if contact point is not on a mesh shape\r\n */\r\n get triangleIndex(): number {\r\n return this._triangleIndex;\r\n }\r\n\r\n /**\r\n * Sets the hit data\r\n * @param hitNormal defines the normal in world space\r\n * @param hitPoint defines the point in world space\r\n * @param triangleIndex defines the index of the triangle in case of mesh shape\r\n */\r\n public setHitData(hitNormal: IXYZ, hitPoint: IXYZ, triangleIndex?: number) {\r\n this._hasHit = true;\r\n this._hitNormal.set(hitNormal.x, hitNormal.y, hitNormal.z);\r\n this._hitPoint.set(hitPoint.x, hitPoint.y, hitPoint.z);\r\n this._triangleIndex = triangleIndex ?? -1;\r\n }\r\n\r\n /**\r\n * Resets all the values to default\r\n */\r\n public reset() {\r\n this._hasHit = false;\r\n\r\n this._hitNormal.setAll(0);\r\n this._hitPoint.setAll(0);\r\n this._triangleIndex = -1;\r\n\r\n this.body = undefined;\r\n this.bodyIndex = undefined;\r\n\r\n this.shape = undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Interface for the size containing width and height\r\n */\r\ninterface IXYZ {\r\n /**\r\n * X\r\n */\r\n x: number;\r\n\r\n /**\r\n * Y\r\n */\r\n y: number;\r\n\r\n /**\r\n * Z\r\n */\r\n z: number;\r\n}\r\n"]}
1
+ {"version":3,"file":"castingResult.js","sourceRoot":"","sources":["../../../../dev/core/src/Physics/castingResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI/C;;GAEG;AACH,MAAM,OAAO,aAAa;IAA1B;QACY,YAAO,GAAY,KAAK,CAAC;QACvB,eAAU,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QACrC,cAAS,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,mBAAc,GAAW,CAAC,CAAC,CAAC;IAsExC,CAAC;IAtDG;;OAEG;IACH,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IACD;;OAEG;IACH,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IACD;;OAEG;IACH,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACI,UAAU,CAAC,SAAe,EAAE,QAAc,EAAE,aAAsB;QACrE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,KAAK;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IAC3B,CAAC;CACJ","sourcesContent":["import { Vector3 } from \"../Maths/math.vector\";\r\nimport type { PhysicsShape } from \"./v2/physicsShape\";\r\nimport type { PhysicsBody } from \"./v2/physicsBody\";\r\n\r\n/**\r\n * Base class for results of casts.\r\n */\r\nexport class CastingResult {\r\n private _hasHit: boolean = false;\r\n protected _hitNormal: Vector3 = Vector3.Zero();\r\n protected _hitPoint: Vector3 = Vector3.Zero();\r\n private _triangleIndex: number = -1;\r\n\r\n /**\r\n * The Physics body that the query hit.\r\n */\r\n public body?: PhysicsBody;\r\n /**\r\n * The body Index in case the Physics body is using instances\r\n */\r\n public bodyIndex?: number;\r\n\r\n /**\r\n * The shape hit by the query.\r\n */\r\n public shape?: PhysicsShape;\r\n\r\n /**\r\n * Gets the hit point.\r\n */\r\n get hitPoint(): Vector3 {\r\n return this._hitPoint;\r\n }\r\n /**\r\n * Gets the hit normal.\r\n */\r\n get hitNormal(): Vector3 {\r\n return this._hitNormal;\r\n }\r\n /**\r\n * Gets if there was a hit\r\n */\r\n get hasHit(): boolean {\r\n return this._hasHit;\r\n }\r\n\r\n /*\r\n * The index of the original triangle which was hit. Will be -1 if contact point is not on a mesh shape\r\n */\r\n get triangleIndex(): number {\r\n return this._triangleIndex;\r\n }\r\n\r\n /**\r\n * Sets the hit data\r\n * @param hitNormal defines the normal in world space\r\n * @param hitPoint defines the point in world space\r\n * @param triangleIndex defines the index of the triangle in case of mesh shape\r\n */\r\n public setHitData(hitNormal: IXYZ, hitPoint: IXYZ, triangleIndex?: number) {\r\n this._hasHit = true;\r\n this._hitNormal.set(hitNormal.x, hitNormal.y, hitNormal.z);\r\n this._hitPoint.set(hitPoint.x, hitPoint.y, hitPoint.z);\r\n this._triangleIndex = triangleIndex ?? -1;\r\n }\r\n\r\n /**\r\n * Resets all the values to default\r\n */\r\n public reset() {\r\n this._hasHit = false;\r\n\r\n this._hitNormal.setAll(0);\r\n this._hitPoint.setAll(0);\r\n this._triangleIndex = -1;\r\n\r\n this.body = undefined;\r\n this.bodyIndex = undefined;\r\n\r\n this.shape = undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Interface for the size containing width and height\r\n */\r\ninterface IXYZ {\r\n /**\r\n * X\r\n */\r\n x: number;\r\n\r\n /**\r\n * Y\r\n */\r\n y: number;\r\n\r\n /**\r\n * Z\r\n */\r\n z: number;\r\n}\r\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { Vector3 } from "../Maths/math.vector";
2
2
  import type { IRaycastQuery } from "./physicsRaycastResult";
3
- import type { PhysicsBody } from "./v2";
3
+ import type { PhysicsBody } from "./v2/physicsBody";
4
4
  /**
5
5
  * Interface for point proximity query.
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"physicsPointProximityQuery.js","sourceRoot":"","sources":["../../../../dev/core/src/Physics/physicsPointProximityQuery.ts"],"names":[],"mappings":"","sourcesContent":["import type { Vector3 } from \"../Maths/math.vector\";\r\nimport type { IRaycastQuery } from \"./physicsRaycastResult\";\r\nimport type { PhysicsBody } from \"./v2\";\r\n\r\n/**\r\n * Interface for point proximity query.\r\n */\r\nexport interface IPhysicsPointProximityQuery {\r\n /**\r\n * The position of the query\r\n */\r\n position: Vector3;\r\n /**\r\n * Maximum distance to check for collisions. Can be set to 0 to check for overlaps.\r\n */\r\n maxDistance: number;\r\n /**\r\n * Collision filter for the query.\r\n */\r\n collisionFilter: IRaycastQuery;\r\n /**\r\n * Should trigger collisions be considered in the query?\r\n */\r\n shouldHitTriggers: boolean;\r\n /**\r\n * Should the query ignore the body that is passed in?\r\n */\r\n ignoreBody?: PhysicsBody;\r\n}\r\n"]}
1
+ {"version":3,"file":"physicsPointProximityQuery.js","sourceRoot":"","sources":["../../../../dev/core/src/Physics/physicsPointProximityQuery.ts"],"names":[],"mappings":"","sourcesContent":["import type { Vector3 } from \"../Maths/math.vector\";\r\nimport type { IRaycastQuery } from \"./physicsRaycastResult\";\r\nimport type { PhysicsBody } from \"./v2/physicsBody\";\r\n\r\n/**\r\n * Interface for point proximity query.\r\n */\r\nexport interface IPhysicsPointProximityQuery {\r\n /**\r\n * The position of the query\r\n */\r\n position: Vector3;\r\n /**\r\n * Maximum distance to check for collisions. Can be set to 0 to check for overlaps.\r\n */\r\n maxDistance: number;\r\n /**\r\n * Collision filter for the query.\r\n */\r\n collisionFilter: IRaycastQuery;\r\n /**\r\n * Should trigger collisions be considered in the query?\r\n */\r\n shouldHitTriggers: boolean;\r\n /**\r\n * Should the query ignore the body that is passed in?\r\n */\r\n ignoreBody?: PhysicsBody;\r\n}\r\n"]}
@@ -1,6 +1,8 @@
1
1
  import type { Skeleton } from "../../Bones/skeleton";
2
2
  import { Vector3 } from "../../Maths/math.vector";
3
+ import { PhysicsAggregate } from "./physicsAggregate";
3
4
  import type { Mesh } from "../../Meshes/mesh";
5
+ import { TransformNode } from "../../Meshes/transformNode";
4
6
  /**
5
7
  * Ragdoll bone properties
6
8
  * @experimental
@@ -54,11 +56,13 @@ export declare class RagdollBoneProperties {
54
56
  export declare class Ragdoll {
55
57
  private _skeleton;
56
58
  private _scene;
57
- private _mesh;
59
+ private _rootTransformNode;
58
60
  private _config;
59
61
  private _boxConfigs;
62
+ private _joints;
60
63
  private _bones;
61
64
  private _initialRotation;
65
+ private _initialRotation2;
62
66
  private _boneNames;
63
67
  private _transforms;
64
68
  private _aggregates;
@@ -75,18 +79,25 @@ export declare class Ragdoll {
75
79
  private _defaultJoint;
76
80
  private _defaultJointMin;
77
81
  private _defaultJointMax;
78
- private _boneOffsetAxis;
79
82
  /**
80
83
  * Construct a new Ragdoll object. Once ready, it can be made dynamic by calling `Ragdoll` method
81
84
  * @param skeleton The skeleton containing bones to be physicalized
82
- * @param mesh The mesh used by the skeleton
85
+ * @param rootTransformNode The mesh or its transform used by the skeleton
83
86
  * @param config an array of `RagdollBoneProperties` corresponding to bones and their properties used to instanciate physics bodies
84
87
  */
85
- constructor(skeleton: Skeleton, mesh: Mesh, config: RagdollBoneProperties[]);
88
+ constructor(skeleton: Skeleton, rootTransformNode: Mesh | TransformNode, config: RagdollBoneProperties[]);
89
+ /**
90
+ * Returns the aggregate corresponding to the ragdoll bone index
91
+ * @param index ragdoll bone aggregate index
92
+ * @returns the aggregate for the bone index for the root aggregate if index is invalid
93
+ */
94
+ getAggregate(index: number): PhysicsAggregate;
86
95
  private _createColliders;
87
96
  private _initJoints;
97
+ private _syncBonesToPhysics;
98
+ private _setBoneOrientationToBody;
88
99
  private _syncBonesAndBoxes;
89
- private _addImpostorRotationToBone;
100
+ private _setBodyOrientationToBone;
90
101
  private _defineRootBone;
91
102
  private _findNearestParent;
92
103
  private _init;