@babylonjs/serializers 7.43.0 → 7.44.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.
@@ -43,8 +43,8 @@ export interface IUSDZExportOptions {
43
43
  * @param options options to configure the export
44
44
  * @param meshPredicate predicate to filter the meshes to export
45
45
  * @returns a uint8 array containing the USDZ file
46
- * #H2G5XW#3 - Simple sphere
47
- * #H2G5XW#4 - Red sphere
48
- * #5N3RWK#4 - Boombox
46
+ * #H2G5XW#6 - Simple sphere
47
+ * #H2G5XW#7 - Red sphere
48
+ * #5N3RWK#5 - Boombox
49
49
  */
50
50
  export declare function USDZExportAsync(scene: Scene, options: Partial<IUSDZExportOptions>, meshPredicate?: (m: Mesh) => boolean): Promise<Uint8Array>;
@@ -449,9 +449,9 @@ function BuildCamera(camera, options) {
449
449
  * @param options options to configure the export
450
450
  * @param meshPredicate predicate to filter the meshes to export
451
451
  * @returns a uint8 array containing the USDZ file
452
- * #H2G5XW#3 - Simple sphere
453
- * #H2G5XW#4 - Red sphere
454
- * #5N3RWK#4 - Boombox
452
+ * #H2G5XW#6 - Simple sphere
453
+ * #H2G5XW#7 - Red sphere
454
+ * #5N3RWK#5 - Boombox
455
455
  */
456
456
  export async function USDZExportAsync(scene, options, meshPredicate) {
457
457
  const localOptions = {
@@ -1 +1 @@
1
- {"version":3,"file":"usdzExporter.js","sourceRoot":"","sources":["../../../../dev/serializers/src/USDZ/usdzExporter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport type { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { PBRMetallicRoughnessMaterial } from \"core/Materials/PBR/pbrMetallicRoughnessMaterial\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Texture } from \"core/Materials/Textures/texture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Matrix, Vector2 } from \"core/Maths/math.vector\";\r\nimport type { Geometry } from \"core/Meshes/geometry\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { DumpTools } from \"core/Misc/dumpTools\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { FloatArray, Nullable } from \"core/types\";\r\n\r\n/**\r\n * Ported from https://github.com/mrdoob/three.js/blob/master/examples/jsm/exporters/USDZExporter.js\r\n * Thanks a lot to the three.js team for their amazing work!\r\n */\r\n\r\n// FFlate access\r\ndeclare const fflate: any;\r\n\r\n/**\r\n * Options for the USDZ export\r\n */\r\nexport interface IUSDZExportOptions {\r\n /**\r\n * URL to load the fflate library from\r\n */\r\n fflateUrl?: string;\r\n /**\r\n * Include anchoring properties in the USDZ file\r\n */\r\n includeAnchoringProperties?: boolean;\r\n /**\r\n * Anchoring type (plane by default)\r\n */\r\n anchoringType?: string;\r\n /**\r\n * Plane anchoring alignment (horizontal by default)\r\n */\r\n planeAnchoringAlignment?: string;\r\n /**\r\n * Model file name (model.usda by default)\r\n */\r\n modelFileName?: string;\r\n /**\r\n * Precision to use for number (5 by default)\r\n */\r\n precision?: number;\r\n /**\r\n * Export the camera (false by default)\r\n */\r\n exportCamera?: boolean;\r\n /**\r\n * Camera sensor width (35 by default)\r\n */\r\n cameraSensorWidth?: number;\r\n}\r\n\r\nfunction BuildHeader() {\r\n return `#usda 1.0\r\n (\r\n customLayerData = {\r\n string creator = \"Babylon.js USDZExportAsync\"\r\n }\r\n defaultPrim = \"Root\"\r\n metersPerUnit = 1\r\n upAxis = \"Y\"\r\n )`;\r\n}\r\n\r\nfunction BuildSceneStart(options: IUSDZExportOptions) {\r\n const alignment =\r\n options.includeAnchoringProperties === true\r\n ? `\r\n\t\ttoken preliminary:anchoring:type = \"${options.anchoringType}\"\r\n\t\ttoken preliminary:planeAnchoring:alignment = \"${options.planeAnchoringAlignment}\"`\r\n : \"\";\r\n return `def Xform \"Root\"\r\n {\r\n def Scope \"Scenes\" (\r\n kind = \"sceneLibrary\"\r\n )\r\n {\r\n def Xform \"Scene\" (\r\n customData = {\r\n bool preliminary_collidesWithEnvironment = 0\r\n string sceneName = \"Scene\"\r\n }\r\n sceneName = \"Scene\"\r\n )\r\n {${alignment}\r\n `;\r\n}\r\n\r\nfunction BuildSceneEnd() {\r\n return `\r\n }\r\n }\r\n }`;\r\n}\r\n\r\nfunction BuildMeshVertexCount(geometry: Geometry) {\r\n const count = geometry.getIndices()?.length ? geometry.getTotalIndices() : geometry.getTotalVertices();\r\n\r\n return Array(count / 3)\r\n .fill(3)\r\n .join(\", \");\r\n}\r\n\r\nfunction BuildMeshVertexIndices(geometry: Geometry) {\r\n const index = geometry.getIndices();\r\n const array = [];\r\n\r\n if (index !== null) {\r\n for (let i = 0; i < index.length; i++) {\r\n array.push(index[i]);\r\n }\r\n } else {\r\n const length = geometry.getTotalVertices();\r\n\r\n for (let i = 0; i < length; i++) {\r\n array.push(i);\r\n }\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildVector3Array(attribute: FloatArray, options: IUSDZExportOptions, stride = 3) {\r\n const array = [];\r\n\r\n for (let i = 0; i < attribute.length / stride; i++) {\r\n const x = attribute[i * stride];\r\n const y = attribute[i * stride + 1];\r\n const z = attribute[i * stride + 2];\r\n\r\n array.push(`(${x.toPrecision(options.precision)}, ${y.toPrecision(options.precision)}, ${z.toPrecision(options.precision)})`);\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildVector2Array(attribute: FloatArray, options: IUSDZExportOptions) {\r\n const array = [];\r\n\r\n for (let i = 0; i < attribute.length / 2; i++) {\r\n const x = attribute[i * 2];\r\n const y = attribute[i * 2 + 1];\r\n\r\n array.push(`(${x.toPrecision(options.precision)}, ${(1 - y).toPrecision(options.precision)})`);\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildAdditionalAttributes(geometry: Geometry, options: IUSDZExportOptions) {\r\n let string = \"\";\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const id = i > 0 ? i : \"\";\r\n const uvAttribute = geometry.getVerticesData(VertexBuffer.UVKind + (id ? id : \"\"));\r\n\r\n if (uvAttribute) {\r\n string += `\r\n\t\ttexCoord2f[] primvars:st${id} = [${BuildVector2Array(uvAttribute, options)}] (\r\n\t\t\tinterpolation = \"vertex\"\r\n\t\t)`;\r\n }\r\n }\r\n\r\n // vertex colors\r\n\r\n const colorAttribute = geometry.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n if (colorAttribute) {\r\n string += `\r\n\tcolor3f[] primvars:displayColor = [${BuildVector3Array(colorAttribute, options, 4)}] (\r\n\t\tinterpolation = \"vertex\"\r\n\t\t)`;\r\n }\r\n\r\n return string;\r\n}\r\n\r\nfunction BuildMesh(geometry: Geometry, options: IUSDZExportOptions) {\r\n const name = \"Geometry\";\r\n const position = geometry.getVerticesData(VertexBuffer.PositionKind);\r\n const normal = geometry.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!position || !normal) {\r\n return;\r\n }\r\n\r\n return `\r\n\tdef Mesh \"${name}\"\r\n\t{\r\n\t\tint[] faceVertexCounts = [${BuildMeshVertexCount(geometry)}]\r\n\t\tint[] faceVertexIndices = [${BuildMeshVertexIndices(geometry)}]\r\n\t\tnormal3f[] normals = [${BuildVector3Array(normal, options)}] (\r\n\t\t\tinterpolation = \"vertex\"\r\n\t\t)\r\n\t\tpoint3f[] points = [${BuildVector3Array(position, options)}]\r\n ${BuildAdditionalAttributes(geometry, options)}\r\n\t\tuniform token subdivisionScheme = \"none\"\r\n\t}\r\n`;\r\n}\r\n\r\nfunction BuildMeshObject(geometry: Geometry, options: IUSDZExportOptions) {\r\n const mesh = BuildMesh(geometry, options);\r\n return `\r\n def \"Geometry\"\r\n {\r\n ${mesh}\r\n }\r\n `;\r\n}\r\n\r\nfunction BuildUSDFileAsString(dataToInsert: string) {\r\n let output = BuildHeader();\r\n output += dataToInsert;\r\n return fflate.strToU8(output);\r\n}\r\n\r\nfunction BuildMatrix(matrix: Matrix) {\r\n const array = matrix.m as number[];\r\n\r\n return `( ${BuildMatrixRow(array, 0)}, ${BuildMatrixRow(array, 4)}, ${BuildMatrixRow(array, 8)}, ${BuildMatrixRow(array, 12)} )`;\r\n}\r\n\r\nfunction BuildMatrixRow(array: number[], offset: number) {\r\n return `(${array[offset + 0]}, ${array[offset + 1]}, ${array[offset + 2]}, ${array[offset + 3]})`;\r\n}\r\n\r\nfunction BuildXform(mesh: Mesh) {\r\n const name = \"Object_\" + mesh.uniqueId;\r\n const matrix = mesh.getWorldMatrix().clone();\r\n\r\n if (matrix.determinant() < 0) {\r\n matrix.multiplyToRef(Matrix.Scaling(-1, 1, 1), matrix);\r\n }\r\n const transform = BuildMatrix(matrix);\r\n\r\n return `def Xform \"${name}\" (\r\n\tprepend references = @./geometries/Geometry_${mesh.geometry!.uniqueId}.usda@</Geometry>\r\n\tprepend apiSchemas = [\"MaterialBindingAPI\"]\r\n)\r\n{\r\n\tmatrix4d xformOp:transform = ${transform}\r\n\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\t\r\n\r\n rel material:binding = </Materials/Material_${mesh.material!.uniqueId}>\r\n}\r\n\r\n`;\r\n}\r\n\r\nfunction BuildMaterials(materials: { [key: string]: Material }, textureToExports: { [key: string]: BaseTexture }, options: IUSDZExportOptions) {\r\n const array = [];\r\n\r\n for (const uuid in materials) {\r\n const material = materials[uuid];\r\n\r\n array.push(BuildMaterial(material, textureToExports, options));\r\n }\r\n\r\n return `\r\n def \"Materials\"\r\n{\r\n${array.join(\"\")}\r\n}\r\n\r\n`;\r\n}\r\n\r\nfunction BuildWrapping(wrapping: number) {\r\n switch (wrapping) {\r\n case Constants.TEXTURE_CLAMP_ADDRESSMODE:\r\n return \"clamp\";\r\n case Constants.TEXTURE_MIRROR_ADDRESSMODE:\r\n return \"mirror\";\r\n case Constants.TEXTURE_WRAP_ADDRESSMODE:\r\n default:\r\n return \"repeat\";\r\n }\r\n}\r\n\r\nfunction BuildColor4(color: Color3) {\r\n return `(${color.r}, ${color.g}, ${color.b}, 1.0)`;\r\n}\r\n\r\nfunction BuildVector2(vector: Vector2) {\r\n return `(${vector.x}, ${vector.y})`;\r\n}\r\n\r\nfunction BuildColor(color: Color3) {\r\n return `(${color.r}, ${color.g}, ${color.b})`;\r\n}\r\n\r\nfunction BuildTexture(\r\n texture: Texture,\r\n material: Material,\r\n mapType: string,\r\n color: Nullable<Color3>,\r\n textureToExports: { [key: string]: BaseTexture },\r\n options: IUSDZExportOptions\r\n) {\r\n const id = texture.getInternalTexture()!.uniqueId + \"_\" + texture.invertY;\r\n\r\n textureToExports[id] = texture;\r\n\r\n const uv = texture.coordinatesIndex > 0 ? \"st\" + texture.coordinatesIndex : \"st\";\r\n const repeat = new Vector2(texture.uScale, texture.vScale);\r\n const offset = new Vector2(texture.uOffset, texture.vOffset);\r\n const rotation = texture.wAng;\r\n\r\n // rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot\r\n const xRotationOffset = Math.sin(rotation);\r\n const yRotationOffset = Math.cos(rotation);\r\n\r\n // texture coordinates start in the opposite corner, need to correct\r\n offset.y = 1 - offset.y - repeat.y;\r\n\r\n offset.x += xRotationOffset * repeat.x;\r\n offset.y += (1 - yRotationOffset) * repeat.y;\r\n\r\n return `\r\n def Shader \"PrimvarReader_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdPrimvarReader_float2\"\r\n float2 inputs:fallback = (0.0, 0.0)\r\n token inputs:varname = \"${uv}\"\r\n float2 outputs:result\r\n }\r\n\r\n def Shader \"Transform2d_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdTransform2d\"\r\n token inputs:in.connect = </Materials/Material_${material.uniqueId}/PrimvarReader_${mapType}.outputs:result>\r\n float inputs:rotation = ${(rotation * (180 / Math.PI)).toFixed(options.precision)}\r\n float2 inputs:scale = ${BuildVector2(repeat)}\r\n float2 inputs:translation = ${BuildVector2(offset)}\r\n float2 outputs:result\r\n }\r\n\r\n def Shader \"Texture_${texture.uniqueId}_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdUVTexture\"\r\n asset inputs:file = @textures/Texture_${id}.png@\r\n float2 inputs:st.connect = </Materials/Material_${material.uniqueId}/Transform2d_${mapType}.outputs:result>\r\n ${color ? \"float4 inputs:scale = \" + BuildColor4(color) : \"\"}\r\n token inputs:sourceColorSpace = \"${texture.gammaSpace ? \"raw\" : \"sRGB\"}\"\r\n token inputs:wrapS = \"${BuildWrapping(texture.wrapU)}\"\r\n token inputs:wrapT = \"${BuildWrapping(texture.wrapV)}\"\r\n float outputs:r\r\n float outputs:g\r\n float outputs:b\r\n float3 outputs:rgb\r\n ${material.needAlphaBlending() ? \"float outputs:a\" : \"\"}\r\n }`;\r\n}\r\n\r\nfunction ExtractTextureInformations(material: Material) {\r\n const className = material.getClassName();\r\n\r\n switch (className) {\r\n case \"StandardMaterial\":\r\n return {\r\n diffuseMap: (material as StandardMaterial).diffuseTexture,\r\n diffuse: (material as StandardMaterial).diffuseColor,\r\n alphaCutOff: (material as StandardMaterial).alphaCutOff,\r\n emissiveMap: (material as StandardMaterial).emissiveTexture,\r\n emissive: (material as StandardMaterial).emissiveColor,\r\n roughnessMap: null,\r\n normalMap: null,\r\n metalnessMap: null,\r\n roughness: 1,\r\n metalness: 0,\r\n aoMap: null,\r\n aoMapIntensity: 0,\r\n alphaMap: (material as StandardMaterial).opacityTexture,\r\n ior: 1,\r\n };\r\n case \"PBRMaterial\":\r\n return {\r\n diffuseMap: (material as PBRMaterial).albedoTexture,\r\n diffuse: (material as PBRMaterial).albedoColor,\r\n alphaCutOff: (material as PBRMaterial).alphaCutOff,\r\n emissiveMap: (material as PBRMaterial).emissiveTexture,\r\n emissive: (material as PBRMaterial).emissiveColor,\r\n normalMap: (material as PBRMaterial).bumpTexture,\r\n roughnessMap: (material as PBRMaterial).metallicTexture,\r\n roughnessChannel: (material as PBRMaterial).useRoughnessFromMetallicTextureAlpha ? \"a\" : \"g\",\r\n roughness: (material as PBRMaterial).roughness || 1,\r\n metalnessMap: (material as PBRMaterial).metallicTexture,\r\n metalnessChannel: (material as PBRMaterial).useMetallnessFromMetallicTextureBlue ? \"b\" : \"r\",\r\n metalness: (material as PBRMaterial).metallic || 0,\r\n aoMap: (material as PBRMaterial).ambientTexture,\r\n aoMapChannel: (material as PBRMaterial).useAmbientInGrayScale ? \"r\" : \"rgb\",\r\n aoMapIntensity: (material as PBRMaterial).ambientTextureStrength,\r\n alphaMap: (material as PBRMaterial).opacityTexture,\r\n ior: (material as PBRMaterial).indexOfRefraction,\r\n };\r\n case \"PBRMetallicRoughnessMaterial\":\r\n return {\r\n diffuseMap: (material as PBRMetallicRoughnessMaterial).baseTexture,\r\n diffuse: (material as PBRMetallicRoughnessMaterial).baseColor,\r\n alphaCutOff: (material as PBRMetallicRoughnessMaterial).alphaCutOff,\r\n emissiveMap: (material as PBRMetallicRoughnessMaterial).emissiveTexture,\r\n emissive: (material as PBRMetallicRoughnessMaterial).emissiveColor,\r\n normalMap: (material as PBRMetallicRoughnessMaterial).normalTexture,\r\n roughnessMap: (material as PBRMaterial).metallicTexture,\r\n roughnessChannel: (material as PBRMaterial).useRoughnessFromMetallicTextureAlpha ? \"a\" : \"g\",\r\n roughness: (material as PBRMetallicRoughnessMaterial).roughness || 1,\r\n metalnessMap: (material as PBRMaterial).metallicTexture,\r\n metalnessChannel: (material as PBRMaterial).useMetallnessFromMetallicTextureBlue ? \"b\" : \"r\",\r\n metalness: (material as PBRMetallicRoughnessMaterial).metallic || 0,\r\n aoMap: (material as PBRMaterial).ambientTexture,\r\n aoMapChannel: (material as PBRMaterial).useAmbientInGrayScale ? \"r\" : \"rgb\",\r\n aoMapIntensity: (material as PBRMaterial).ambientTextureStrength,\r\n alphaMap: (material as PBRMaterial).opacityTexture,\r\n ior: (material as PBRMaterial).indexOfRefraction,\r\n };\r\n default:\r\n return {\r\n diffuseMap: null,\r\n diffuse: null,\r\n emissiveMap: null,\r\n emissemissiveiveColor: null,\r\n normalMap: null,\r\n roughnessMap: null,\r\n metalnessMap: null,\r\n alphaCutOff: 0,\r\n roughness: 0,\r\n metalness: 0,\r\n aoMap: null,\r\n aoMapIntensity: 0,\r\n alphaMap: null,\r\n ior: 1,\r\n };\r\n }\r\n}\r\n\r\nfunction BuildMaterial(material: Material, textureToExports: { [key: string]: BaseTexture }, options: IUSDZExportOptions) {\r\n // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\r\n\r\n const pad = \"\t\t\t\";\r\n const inputs = [];\r\n const samplers = [];\r\n\r\n const {\r\n diffuseMap,\r\n diffuse,\r\n alphaCutOff,\r\n emissiveMap,\r\n emissive,\r\n normalMap,\r\n roughnessMap,\r\n roughnessChannel,\r\n roughness,\r\n metalnessMap,\r\n metalnessChannel,\r\n metalness,\r\n aoMap,\r\n aoMapChannel,\r\n aoMapIntensity,\r\n alphaMap,\r\n ior,\r\n } = ExtractTextureInformations(material);\r\n\r\n if (diffuseMap !== null) {\r\n inputs.push(`${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:rgb>`);\r\n\r\n if (material.needAlphaBlending()) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:a>`);\r\n } else if (material.needAlphaTesting()) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:a>`);\r\n inputs.push(`${pad}float inputs:opacityThreshold = ${alphaCutOff}`);\r\n }\r\n\r\n samplers.push(BuildTexture(diffuseMap as Texture, material, \"diffuse\", diffuse, textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}color3f inputs:diffuseColor = ${BuildColor(diffuse || Color3.White())}`);\r\n }\r\n\r\n if (emissiveMap !== null) {\r\n inputs.push(`${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.uniqueId}/Texture_${emissiveMap.uniqueId}_emissive.outputs:rgb>`);\r\n\r\n samplers.push(BuildTexture(emissiveMap as Texture, material, \"emissive\", emissive, textureToExports, options));\r\n } else if (emissive && emissive.toLuminance() > 0) {\r\n inputs.push(`${pad}color3f inputs:emissiveColor = ${BuildColor(emissive)}`);\r\n }\r\n\r\n if (normalMap !== null) {\r\n inputs.push(`${pad}normal3f inputs:normal.connect = </Materials/Material_${material.uniqueId}/Texture_${normalMap.uniqueId}_normal.outputs:rgb>`);\r\n\r\n samplers.push(BuildTexture(normalMap as Texture, material, \"normal\", null, textureToExports, options));\r\n }\r\n\r\n if (aoMap !== null) {\r\n inputs.push(`${pad}float inputs:occlusion.connect = </Materials/Material_${material.uniqueId}/Texture_${aoMap.uniqueId}_occlusion.outputs:${aoMapChannel}>`);\r\n\r\n samplers.push(BuildTexture(aoMap as Texture, material, \"occlusion\", new Color3(aoMapIntensity, aoMapIntensity, aoMapIntensity), textureToExports, options));\r\n }\r\n\r\n if (roughnessMap !== null) {\r\n inputs.push(`${pad}float inputs:roughness.connect = </Materials/Material_${material.uniqueId}/Texture_${roughnessMap.uniqueId}_roughness.outputs:${roughnessChannel}>`);\r\n\r\n samplers.push(BuildTexture(roughnessMap as Texture, material, \"roughness\", new Color3(roughness, roughness, roughness), textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:roughness = ${roughness}`);\r\n }\r\n\r\n if (metalnessMap !== null) {\r\n inputs.push(`${pad}float inputs:metallic.connect = </Materials/Material_${material.uniqueId}/Texture_${metalnessMap.uniqueId}_metallic.outputs:${metalnessChannel}>`);\r\n\r\n samplers.push(BuildTexture(metalnessMap as Texture, material, \"metallic\", new Color3(metalness, metalness, metalness), textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:metallic = ${metalness}`);\r\n }\r\n\r\n if (alphaMap !== null) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${alphaMap.uniqueId}_opacity.outputs:r>`);\r\n inputs.push(`${pad}float inputs:opacityThreshold = 0.0001`);\r\n\r\n samplers.push(BuildTexture(alphaMap as Texture, material, \"opacity\", null, textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:opacity = ${material.alpha}`);\r\n }\r\n\r\n inputs.push(`${pad}float inputs:ior = ${ior}`);\r\n\r\n return `\r\n\tdef Material \"Material_${material.uniqueId}\"\r\n\t{\r\n\t\tdef Shader \"PreviewSurface\"\r\n\t\t{\r\n\t\t\tuniform token info:id = \"UsdPreviewSurface\"\r\n${inputs.join(\"\\n\")}\r\n\t\t\tint inputs:useSpecularWorkflow = 0\r\n\t\t\ttoken outputs:surface\r\n\t\t}\r\n\r\n\t\ttoken outputs:surface.connect = </Materials/Material_${material.uniqueId}/PreviewSurface.outputs:surface>\r\n\r\n${samplers.join(\"\\n\")}\r\n\r\n\t}\r\n`;\r\n}\r\n\r\nfunction BuildCamera(camera: Camera, options: IUSDZExportOptions) {\r\n const name = \"Camera_\" + camera.uniqueId;\r\n const matrix = Matrix.RotationY(Math.PI).multiply(camera.getWorldMatrix()); // work towards positive z\r\n\r\n const transform = BuildMatrix(matrix);\r\n\r\n if (camera.mode === Constants.ORTHOGRAPHIC_CAMERA) {\r\n return `def Camera \"${name}\"\r\n\t\t{\r\n\t\t\tmatrix4d xformOp:transform = ${transform}\r\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\r\n\r\n\t\t\tfloat2 clippingRange = (${camera.minZ.toPrecision(options.precision)}, ${camera.maxZ.toPrecision(options.precision)})\r\n\t\t\tfloat horizontalAperture = ${((Math.abs(camera.orthoLeft || 1) + Math.abs(camera.orthoRight || 1)) * 10).toPrecision(options.precision)}\r\n\t\t\tfloat verticalAperture = ${((Math.abs(camera.orthoTop || 1) + Math.abs(camera.orthoBottom || 1)) * 10).toPrecision(options.precision)}\r\n\t\t\ttoken projection = \"orthographic\"\r\n\t\t}\r\n\t\r\n\t`;\r\n } else {\r\n const aspect = camera.getEngine().getAspectRatio(camera);\r\n const sensorwidth = options.cameraSensorWidth || 35;\r\n\r\n return `def Camera \"${name}\"\r\n\t\t{\r\n\t\t\tmatrix4d xformOp:transform = ${transform}\r\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\r\n\r\n\t\t\tfloat2 clippingRange = (${camera.minZ.toPrecision(options.precision)}, ${camera.maxZ.toPrecision(options.precision)})\r\n\t\t\tfloat focalLength = ${(sensorwidth / (2 * Math.tan(camera.fov * 0.5))).toPrecision(options.precision)}\r\n token projection = \"perspective\"\r\n\t\t\tfloat horizontalAperture = ${(sensorwidth * aspect).toPrecision(options.precision)}\r\n\t\t\tfloat verticalAperture = ${(sensorwidth / aspect).toPrecision(options.precision)} \r\n\t\t}\r\n\t\r\n\t`;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param scene scene to export\r\n * @param options options to configure the export\r\n * @param meshPredicate predicate to filter the meshes to export\r\n * @returns a uint8 array containing the USDZ file\r\n * #H2G5XW#3 - Simple sphere\r\n * #H2G5XW#4 - Red sphere\r\n * #5N3RWK#4 - Boombox\r\n */\r\nexport async function USDZExportAsync(scene: Scene, options: Partial<IUSDZExportOptions>, meshPredicate?: (m: Mesh) => boolean): Promise<Uint8Array> {\r\n const localOptions = {\r\n fflateUrl: \"https://unpkg.com/fflate@0.8.2\",\r\n includeAnchoringProperties: true,\r\n anchoringType: \"plane\",\r\n planeAnchoringAlignment: \"horizontal\",\r\n modelFileName: \"model.usda\",\r\n precision: 5,\r\n exportCamera: false,\r\n cameraSensorWidth: 35,\r\n ...options,\r\n };\r\n\r\n // Get the fflate library\r\n if (typeof fflate === \"undefined\") {\r\n await Tools.LoadScriptAsync(localOptions.fflateUrl);\r\n }\r\n\r\n // Start the export\r\n const files: { [key: string]: any } = {};\r\n\r\n // model file should be first in USDZ archive so we init it here\r\n files[localOptions.modelFileName] = null;\r\n\r\n let output = BuildHeader();\r\n output += BuildSceneStart(localOptions);\r\n\r\n const materialToExports: { [key: string]: Material } = {};\r\n\r\n // Meshes\r\n for (const abstractMesh of scene.meshes) {\r\n if (abstractMesh.getTotalVertices() === 0) {\r\n continue;\r\n }\r\n const mesh = abstractMesh as Mesh;\r\n const geometry = mesh.geometry;\r\n const material = mesh.material;\r\n\r\n if (!material || !geometry || (meshPredicate && !meshPredicate(mesh))) {\r\n continue;\r\n }\r\n\r\n const supportedMaterials = [\"StandardMaterial\", \"PBRMaterial\", \"PBRMetallicRoughnessMaterial\"];\r\n\r\n if (supportedMaterials.indexOf(material.getClassName()) !== -1) {\r\n const geometryFileName = \"geometries/Geometry_\" + geometry.uniqueId + \".usda\";\r\n\r\n if (!(geometryFileName in files)) {\r\n const meshObject = BuildMeshObject(geometry, localOptions);\r\n files[geometryFileName] = BuildUSDFileAsString(meshObject);\r\n }\r\n\r\n if (!(material.uniqueId in materialToExports)) {\r\n materialToExports[material.uniqueId] = material;\r\n }\r\n\r\n output += BuildXform(mesh);\r\n } else {\r\n Tools.Warn(\"USDZExportAsync does not support this material type: \" + material.getClassName());\r\n }\r\n }\r\n\r\n // Camera\r\n if (scene.activeCamera && localOptions.exportCamera) {\r\n output += BuildCamera(scene.activeCamera, localOptions);\r\n }\r\n\r\n // Close scene\r\n output += BuildSceneEnd();\r\n\r\n // Materials\r\n const textureToExports: { [key: string]: BaseTexture } = {};\r\n output += BuildMaterials(materialToExports, textureToExports, localOptions);\r\n\r\n // Compress\r\n files[localOptions.modelFileName] = fflate.strToU8(output);\r\n\r\n // Textures\r\n for (const id in textureToExports) {\r\n const texture = textureToExports[id];\r\n\r\n const size = texture.getSize();\r\n const textureData = await texture.readPixels();\r\n\r\n if (!textureData) {\r\n throw new Error(\"Texture data is not available\");\r\n }\r\n\r\n const fileContent = await DumpTools.DumpDataAsync(size.width, size.height, textureData, \"image/png\", undefined, false, true);\r\n\r\n files[`textures/Texture_${id}.png`] = new Uint8Array(fileContent as ArrayBuffer).slice(); // This is to avoid getting a link and not a copy\r\n }\r\n\r\n // 64 byte alignment\r\n // https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\r\n\r\n let offset = 0;\r\n\r\n for (const filename in files) {\r\n const file = files[filename];\r\n if (!file) {\r\n continue;\r\n }\r\n const headerSize = 34 + filename.length;\r\n\r\n offset += headerSize;\r\n\r\n const offsetMod64 = offset & 63;\r\n\r\n if (offsetMod64 !== 4) {\r\n const padLength = 64 - offsetMod64;\r\n const padding = new Uint8Array(padLength);\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n files[filename] = [file, { extra: { 12345: padding } }];\r\n }\r\n\r\n offset = file.length;\r\n }\r\n\r\n return fflate.zipSync(files, { level: 0 });\r\n}\r\n"]}
1
+ {"version":3,"file":"usdzExporter.js","sourceRoot":"","sources":["../../../../dev/serializers/src/USDZ/usdzExporter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport type { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { PBRMetallicRoughnessMaterial } from \"core/Materials/PBR/pbrMetallicRoughnessMaterial\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Texture } from \"core/Materials/Textures/texture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Matrix, Vector2 } from \"core/Maths/math.vector\";\r\nimport type { Geometry } from \"core/Meshes/geometry\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { DumpTools } from \"core/Misc/dumpTools\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { FloatArray, Nullable } from \"core/types\";\r\n\r\n/**\r\n * Ported from https://github.com/mrdoob/three.js/blob/master/examples/jsm/exporters/USDZExporter.js\r\n * Thanks a lot to the three.js team for their amazing work!\r\n */\r\n\r\n// FFlate access\r\ndeclare const fflate: any;\r\n\r\n/**\r\n * Options for the USDZ export\r\n */\r\nexport interface IUSDZExportOptions {\r\n /**\r\n * URL to load the fflate library from\r\n */\r\n fflateUrl?: string;\r\n /**\r\n * Include anchoring properties in the USDZ file\r\n */\r\n includeAnchoringProperties?: boolean;\r\n /**\r\n * Anchoring type (plane by default)\r\n */\r\n anchoringType?: string;\r\n /**\r\n * Plane anchoring alignment (horizontal by default)\r\n */\r\n planeAnchoringAlignment?: string;\r\n /**\r\n * Model file name (model.usda by default)\r\n */\r\n modelFileName?: string;\r\n /**\r\n * Precision to use for number (5 by default)\r\n */\r\n precision?: number;\r\n /**\r\n * Export the camera (false by default)\r\n */\r\n exportCamera?: boolean;\r\n /**\r\n * Camera sensor width (35 by default)\r\n */\r\n cameraSensorWidth?: number;\r\n}\r\n\r\nfunction BuildHeader() {\r\n return `#usda 1.0\r\n (\r\n customLayerData = {\r\n string creator = \"Babylon.js USDZExportAsync\"\r\n }\r\n defaultPrim = \"Root\"\r\n metersPerUnit = 1\r\n upAxis = \"Y\"\r\n )`;\r\n}\r\n\r\nfunction BuildSceneStart(options: IUSDZExportOptions) {\r\n const alignment =\r\n options.includeAnchoringProperties === true\r\n ? `\r\n\t\ttoken preliminary:anchoring:type = \"${options.anchoringType}\"\r\n\t\ttoken preliminary:planeAnchoring:alignment = \"${options.planeAnchoringAlignment}\"`\r\n : \"\";\r\n return `def Xform \"Root\"\r\n {\r\n def Scope \"Scenes\" (\r\n kind = \"sceneLibrary\"\r\n )\r\n {\r\n def Xform \"Scene\" (\r\n customData = {\r\n bool preliminary_collidesWithEnvironment = 0\r\n string sceneName = \"Scene\"\r\n }\r\n sceneName = \"Scene\"\r\n )\r\n {${alignment}\r\n `;\r\n}\r\n\r\nfunction BuildSceneEnd() {\r\n return `\r\n }\r\n }\r\n }`;\r\n}\r\n\r\nfunction BuildMeshVertexCount(geometry: Geometry) {\r\n const count = geometry.getIndices()?.length ? geometry.getTotalIndices() : geometry.getTotalVertices();\r\n\r\n return Array(count / 3)\r\n .fill(3)\r\n .join(\", \");\r\n}\r\n\r\nfunction BuildMeshVertexIndices(geometry: Geometry) {\r\n const index = geometry.getIndices();\r\n const array = [];\r\n\r\n if (index !== null) {\r\n for (let i = 0; i < index.length; i++) {\r\n array.push(index[i]);\r\n }\r\n } else {\r\n const length = geometry.getTotalVertices();\r\n\r\n for (let i = 0; i < length; i++) {\r\n array.push(i);\r\n }\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildVector3Array(attribute: FloatArray, options: IUSDZExportOptions, stride = 3) {\r\n const array = [];\r\n\r\n for (let i = 0; i < attribute.length / stride; i++) {\r\n const x = attribute[i * stride];\r\n const y = attribute[i * stride + 1];\r\n const z = attribute[i * stride + 2];\r\n\r\n array.push(`(${x.toPrecision(options.precision)}, ${y.toPrecision(options.precision)}, ${z.toPrecision(options.precision)})`);\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildVector2Array(attribute: FloatArray, options: IUSDZExportOptions) {\r\n const array = [];\r\n\r\n for (let i = 0; i < attribute.length / 2; i++) {\r\n const x = attribute[i * 2];\r\n const y = attribute[i * 2 + 1];\r\n\r\n array.push(`(${x.toPrecision(options.precision)}, ${(1 - y).toPrecision(options.precision)})`);\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildAdditionalAttributes(geometry: Geometry, options: IUSDZExportOptions) {\r\n let string = \"\";\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const id = i > 0 ? i : \"\";\r\n const uvAttribute = geometry.getVerticesData(VertexBuffer.UVKind + (id ? id : \"\"));\r\n\r\n if (uvAttribute) {\r\n string += `\r\n\t\ttexCoord2f[] primvars:st${id} = [${BuildVector2Array(uvAttribute, options)}] (\r\n\t\t\tinterpolation = \"vertex\"\r\n\t\t)`;\r\n }\r\n }\r\n\r\n // vertex colors\r\n\r\n const colorAttribute = geometry.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n if (colorAttribute) {\r\n string += `\r\n\tcolor3f[] primvars:displayColor = [${BuildVector3Array(colorAttribute, options, 4)}] (\r\n\t\tinterpolation = \"vertex\"\r\n\t\t)`;\r\n }\r\n\r\n return string;\r\n}\r\n\r\nfunction BuildMesh(geometry: Geometry, options: IUSDZExportOptions) {\r\n const name = \"Geometry\";\r\n const position = geometry.getVerticesData(VertexBuffer.PositionKind);\r\n const normal = geometry.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!position || !normal) {\r\n return;\r\n }\r\n\r\n return `\r\n\tdef Mesh \"${name}\"\r\n\t{\r\n\t\tint[] faceVertexCounts = [${BuildMeshVertexCount(geometry)}]\r\n\t\tint[] faceVertexIndices = [${BuildMeshVertexIndices(geometry)}]\r\n\t\tnormal3f[] normals = [${BuildVector3Array(normal, options)}] (\r\n\t\t\tinterpolation = \"vertex\"\r\n\t\t)\r\n\t\tpoint3f[] points = [${BuildVector3Array(position, options)}]\r\n ${BuildAdditionalAttributes(geometry, options)}\r\n\t\tuniform token subdivisionScheme = \"none\"\r\n\t}\r\n`;\r\n}\r\n\r\nfunction BuildMeshObject(geometry: Geometry, options: IUSDZExportOptions) {\r\n const mesh = BuildMesh(geometry, options);\r\n return `\r\n def \"Geometry\"\r\n {\r\n ${mesh}\r\n }\r\n `;\r\n}\r\n\r\nfunction BuildUSDFileAsString(dataToInsert: string) {\r\n let output = BuildHeader();\r\n output += dataToInsert;\r\n return fflate.strToU8(output);\r\n}\r\n\r\nfunction BuildMatrix(matrix: Matrix) {\r\n const array = matrix.m as number[];\r\n\r\n return `( ${BuildMatrixRow(array, 0)}, ${BuildMatrixRow(array, 4)}, ${BuildMatrixRow(array, 8)}, ${BuildMatrixRow(array, 12)} )`;\r\n}\r\n\r\nfunction BuildMatrixRow(array: number[], offset: number) {\r\n return `(${array[offset + 0]}, ${array[offset + 1]}, ${array[offset + 2]}, ${array[offset + 3]})`;\r\n}\r\n\r\nfunction BuildXform(mesh: Mesh) {\r\n const name = \"Object_\" + mesh.uniqueId;\r\n const matrix = mesh.getWorldMatrix().clone();\r\n\r\n if (matrix.determinant() < 0) {\r\n matrix.multiplyToRef(Matrix.Scaling(-1, 1, 1), matrix);\r\n }\r\n const transform = BuildMatrix(matrix);\r\n\r\n return `def Xform \"${name}\" (\r\n\tprepend references = @./geometries/Geometry_${mesh.geometry!.uniqueId}.usda@</Geometry>\r\n\tprepend apiSchemas = [\"MaterialBindingAPI\"]\r\n)\r\n{\r\n\tmatrix4d xformOp:transform = ${transform}\r\n\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\t\r\n\r\n rel material:binding = </Materials/Material_${mesh.material!.uniqueId}>\r\n}\r\n\r\n`;\r\n}\r\n\r\nfunction BuildMaterials(materials: { [key: string]: Material }, textureToExports: { [key: string]: BaseTexture }, options: IUSDZExportOptions) {\r\n const array = [];\r\n\r\n for (const uuid in materials) {\r\n const material = materials[uuid];\r\n\r\n array.push(BuildMaterial(material, textureToExports, options));\r\n }\r\n\r\n return `\r\n def \"Materials\"\r\n{\r\n${array.join(\"\")}\r\n}\r\n\r\n`;\r\n}\r\n\r\nfunction BuildWrapping(wrapping: number) {\r\n switch (wrapping) {\r\n case Constants.TEXTURE_CLAMP_ADDRESSMODE:\r\n return \"clamp\";\r\n case Constants.TEXTURE_MIRROR_ADDRESSMODE:\r\n return \"mirror\";\r\n case Constants.TEXTURE_WRAP_ADDRESSMODE:\r\n default:\r\n return \"repeat\";\r\n }\r\n}\r\n\r\nfunction BuildColor4(color: Color3) {\r\n return `(${color.r}, ${color.g}, ${color.b}, 1.0)`;\r\n}\r\n\r\nfunction BuildVector2(vector: Vector2) {\r\n return `(${vector.x}, ${vector.y})`;\r\n}\r\n\r\nfunction BuildColor(color: Color3) {\r\n return `(${color.r}, ${color.g}, ${color.b})`;\r\n}\r\n\r\nfunction BuildTexture(\r\n texture: Texture,\r\n material: Material,\r\n mapType: string,\r\n color: Nullable<Color3>,\r\n textureToExports: { [key: string]: BaseTexture },\r\n options: IUSDZExportOptions\r\n) {\r\n const id = texture.getInternalTexture()!.uniqueId + \"_\" + texture.invertY;\r\n\r\n textureToExports[id] = texture;\r\n\r\n const uv = texture.coordinatesIndex > 0 ? \"st\" + texture.coordinatesIndex : \"st\";\r\n const repeat = new Vector2(texture.uScale, texture.vScale);\r\n const offset = new Vector2(texture.uOffset, texture.vOffset);\r\n const rotation = texture.wAng;\r\n\r\n // rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot\r\n const xRotationOffset = Math.sin(rotation);\r\n const yRotationOffset = Math.cos(rotation);\r\n\r\n // texture coordinates start in the opposite corner, need to correct\r\n offset.y = 1 - offset.y - repeat.y;\r\n\r\n offset.x += xRotationOffset * repeat.x;\r\n offset.y += (1 - yRotationOffset) * repeat.y;\r\n\r\n return `\r\n def Shader \"PrimvarReader_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdPrimvarReader_float2\"\r\n float2 inputs:fallback = (0.0, 0.0)\r\n token inputs:varname = \"${uv}\"\r\n float2 outputs:result\r\n }\r\n\r\n def Shader \"Transform2d_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdTransform2d\"\r\n token inputs:in.connect = </Materials/Material_${material.uniqueId}/PrimvarReader_${mapType}.outputs:result>\r\n float inputs:rotation = ${(rotation * (180 / Math.PI)).toFixed(options.precision)}\r\n float2 inputs:scale = ${BuildVector2(repeat)}\r\n float2 inputs:translation = ${BuildVector2(offset)}\r\n float2 outputs:result\r\n }\r\n\r\n def Shader \"Texture_${texture.uniqueId}_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdUVTexture\"\r\n asset inputs:file = @textures/Texture_${id}.png@\r\n float2 inputs:st.connect = </Materials/Material_${material.uniqueId}/Transform2d_${mapType}.outputs:result>\r\n ${color ? \"float4 inputs:scale = \" + BuildColor4(color) : \"\"}\r\n token inputs:sourceColorSpace = \"${texture.gammaSpace ? \"raw\" : \"sRGB\"}\"\r\n token inputs:wrapS = \"${BuildWrapping(texture.wrapU)}\"\r\n token inputs:wrapT = \"${BuildWrapping(texture.wrapV)}\"\r\n float outputs:r\r\n float outputs:g\r\n float outputs:b\r\n float3 outputs:rgb\r\n ${material.needAlphaBlending() ? \"float outputs:a\" : \"\"}\r\n }`;\r\n}\r\n\r\nfunction ExtractTextureInformations(material: Material) {\r\n const className = material.getClassName();\r\n\r\n switch (className) {\r\n case \"StandardMaterial\":\r\n return {\r\n diffuseMap: (material as StandardMaterial).diffuseTexture,\r\n diffuse: (material as StandardMaterial).diffuseColor,\r\n alphaCutOff: (material as StandardMaterial).alphaCutOff,\r\n emissiveMap: (material as StandardMaterial).emissiveTexture,\r\n emissive: (material as StandardMaterial).emissiveColor,\r\n roughnessMap: null,\r\n normalMap: null,\r\n metalnessMap: null,\r\n roughness: 1,\r\n metalness: 0,\r\n aoMap: null,\r\n aoMapIntensity: 0,\r\n alphaMap: (material as StandardMaterial).opacityTexture,\r\n ior: 1,\r\n };\r\n case \"PBRMaterial\":\r\n return {\r\n diffuseMap: (material as PBRMaterial).albedoTexture,\r\n diffuse: (material as PBRMaterial).albedoColor,\r\n alphaCutOff: (material as PBRMaterial).alphaCutOff,\r\n emissiveMap: (material as PBRMaterial).emissiveTexture,\r\n emissive: (material as PBRMaterial).emissiveColor,\r\n normalMap: (material as PBRMaterial).bumpTexture,\r\n roughnessMap: (material as PBRMaterial).metallicTexture,\r\n roughnessChannel: (material as PBRMaterial).useRoughnessFromMetallicTextureAlpha ? \"a\" : \"g\",\r\n roughness: (material as PBRMaterial).roughness || 1,\r\n metalnessMap: (material as PBRMaterial).metallicTexture,\r\n metalnessChannel: (material as PBRMaterial).useMetallnessFromMetallicTextureBlue ? \"b\" : \"r\",\r\n metalness: (material as PBRMaterial).metallic || 0,\r\n aoMap: (material as PBRMaterial).ambientTexture,\r\n aoMapChannel: (material as PBRMaterial).useAmbientInGrayScale ? \"r\" : \"rgb\",\r\n aoMapIntensity: (material as PBRMaterial).ambientTextureStrength,\r\n alphaMap: (material as PBRMaterial).opacityTexture,\r\n ior: (material as PBRMaterial).indexOfRefraction,\r\n };\r\n case \"PBRMetallicRoughnessMaterial\":\r\n return {\r\n diffuseMap: (material as PBRMetallicRoughnessMaterial).baseTexture,\r\n diffuse: (material as PBRMetallicRoughnessMaterial).baseColor,\r\n alphaCutOff: (material as PBRMetallicRoughnessMaterial).alphaCutOff,\r\n emissiveMap: (material as PBRMetallicRoughnessMaterial).emissiveTexture,\r\n emissive: (material as PBRMetallicRoughnessMaterial).emissiveColor,\r\n normalMap: (material as PBRMetallicRoughnessMaterial).normalTexture,\r\n roughnessMap: (material as PBRMaterial).metallicTexture,\r\n roughnessChannel: (material as PBRMaterial).useRoughnessFromMetallicTextureAlpha ? \"a\" : \"g\",\r\n roughness: (material as PBRMetallicRoughnessMaterial).roughness || 1,\r\n metalnessMap: (material as PBRMaterial).metallicTexture,\r\n metalnessChannel: (material as PBRMaterial).useMetallnessFromMetallicTextureBlue ? \"b\" : \"r\",\r\n metalness: (material as PBRMetallicRoughnessMaterial).metallic || 0,\r\n aoMap: (material as PBRMaterial).ambientTexture,\r\n aoMapChannel: (material as PBRMaterial).useAmbientInGrayScale ? \"r\" : \"rgb\",\r\n aoMapIntensity: (material as PBRMaterial).ambientTextureStrength,\r\n alphaMap: (material as PBRMaterial).opacityTexture,\r\n ior: (material as PBRMaterial).indexOfRefraction,\r\n };\r\n default:\r\n return {\r\n diffuseMap: null,\r\n diffuse: null,\r\n emissiveMap: null,\r\n emissemissiveiveColor: null,\r\n normalMap: null,\r\n roughnessMap: null,\r\n metalnessMap: null,\r\n alphaCutOff: 0,\r\n roughness: 0,\r\n metalness: 0,\r\n aoMap: null,\r\n aoMapIntensity: 0,\r\n alphaMap: null,\r\n ior: 1,\r\n };\r\n }\r\n}\r\n\r\nfunction BuildMaterial(material: Material, textureToExports: { [key: string]: BaseTexture }, options: IUSDZExportOptions) {\r\n // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\r\n\r\n const pad = \"\t\t\t\";\r\n const inputs = [];\r\n const samplers = [];\r\n\r\n const {\r\n diffuseMap,\r\n diffuse,\r\n alphaCutOff,\r\n emissiveMap,\r\n emissive,\r\n normalMap,\r\n roughnessMap,\r\n roughnessChannel,\r\n roughness,\r\n metalnessMap,\r\n metalnessChannel,\r\n metalness,\r\n aoMap,\r\n aoMapChannel,\r\n aoMapIntensity,\r\n alphaMap,\r\n ior,\r\n } = ExtractTextureInformations(material);\r\n\r\n if (diffuseMap !== null) {\r\n inputs.push(`${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:rgb>`);\r\n\r\n if (material.needAlphaBlending()) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:a>`);\r\n } else if (material.needAlphaTesting()) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:a>`);\r\n inputs.push(`${pad}float inputs:opacityThreshold = ${alphaCutOff}`);\r\n }\r\n\r\n samplers.push(BuildTexture(diffuseMap as Texture, material, \"diffuse\", diffuse, textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}color3f inputs:diffuseColor = ${BuildColor(diffuse || Color3.White())}`);\r\n }\r\n\r\n if (emissiveMap !== null) {\r\n inputs.push(`${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.uniqueId}/Texture_${emissiveMap.uniqueId}_emissive.outputs:rgb>`);\r\n\r\n samplers.push(BuildTexture(emissiveMap as Texture, material, \"emissive\", emissive, textureToExports, options));\r\n } else if (emissive && emissive.toLuminance() > 0) {\r\n inputs.push(`${pad}color3f inputs:emissiveColor = ${BuildColor(emissive)}`);\r\n }\r\n\r\n if (normalMap !== null) {\r\n inputs.push(`${pad}normal3f inputs:normal.connect = </Materials/Material_${material.uniqueId}/Texture_${normalMap.uniqueId}_normal.outputs:rgb>`);\r\n\r\n samplers.push(BuildTexture(normalMap as Texture, material, \"normal\", null, textureToExports, options));\r\n }\r\n\r\n if (aoMap !== null) {\r\n inputs.push(`${pad}float inputs:occlusion.connect = </Materials/Material_${material.uniqueId}/Texture_${aoMap.uniqueId}_occlusion.outputs:${aoMapChannel}>`);\r\n\r\n samplers.push(BuildTexture(aoMap as Texture, material, \"occlusion\", new Color3(aoMapIntensity, aoMapIntensity, aoMapIntensity), textureToExports, options));\r\n }\r\n\r\n if (roughnessMap !== null) {\r\n inputs.push(`${pad}float inputs:roughness.connect = </Materials/Material_${material.uniqueId}/Texture_${roughnessMap.uniqueId}_roughness.outputs:${roughnessChannel}>`);\r\n\r\n samplers.push(BuildTexture(roughnessMap as Texture, material, \"roughness\", new Color3(roughness, roughness, roughness), textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:roughness = ${roughness}`);\r\n }\r\n\r\n if (metalnessMap !== null) {\r\n inputs.push(`${pad}float inputs:metallic.connect = </Materials/Material_${material.uniqueId}/Texture_${metalnessMap.uniqueId}_metallic.outputs:${metalnessChannel}>`);\r\n\r\n samplers.push(BuildTexture(metalnessMap as Texture, material, \"metallic\", new Color3(metalness, metalness, metalness), textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:metallic = ${metalness}`);\r\n }\r\n\r\n if (alphaMap !== null) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${alphaMap.uniqueId}_opacity.outputs:r>`);\r\n inputs.push(`${pad}float inputs:opacityThreshold = 0.0001`);\r\n\r\n samplers.push(BuildTexture(alphaMap as Texture, material, \"opacity\", null, textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:opacity = ${material.alpha}`);\r\n }\r\n\r\n inputs.push(`${pad}float inputs:ior = ${ior}`);\r\n\r\n return `\r\n\tdef Material \"Material_${material.uniqueId}\"\r\n\t{\r\n\t\tdef Shader \"PreviewSurface\"\r\n\t\t{\r\n\t\t\tuniform token info:id = \"UsdPreviewSurface\"\r\n${inputs.join(\"\\n\")}\r\n\t\t\tint inputs:useSpecularWorkflow = 0\r\n\t\t\ttoken outputs:surface\r\n\t\t}\r\n\r\n\t\ttoken outputs:surface.connect = </Materials/Material_${material.uniqueId}/PreviewSurface.outputs:surface>\r\n\r\n${samplers.join(\"\\n\")}\r\n\r\n\t}\r\n`;\r\n}\r\n\r\nfunction BuildCamera(camera: Camera, options: IUSDZExportOptions) {\r\n const name = \"Camera_\" + camera.uniqueId;\r\n const matrix = Matrix.RotationY(Math.PI).multiply(camera.getWorldMatrix()); // work towards positive z\r\n\r\n const transform = BuildMatrix(matrix);\r\n\r\n if (camera.mode === Constants.ORTHOGRAPHIC_CAMERA) {\r\n return `def Camera \"${name}\"\r\n\t\t{\r\n\t\t\tmatrix4d xformOp:transform = ${transform}\r\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\r\n\r\n\t\t\tfloat2 clippingRange = (${camera.minZ.toPrecision(options.precision)}, ${camera.maxZ.toPrecision(options.precision)})\r\n\t\t\tfloat horizontalAperture = ${((Math.abs(camera.orthoLeft || 1) + Math.abs(camera.orthoRight || 1)) * 10).toPrecision(options.precision)}\r\n\t\t\tfloat verticalAperture = ${((Math.abs(camera.orthoTop || 1) + Math.abs(camera.orthoBottom || 1)) * 10).toPrecision(options.precision)}\r\n\t\t\ttoken projection = \"orthographic\"\r\n\t\t}\r\n\t\r\n\t`;\r\n } else {\r\n const aspect = camera.getEngine().getAspectRatio(camera);\r\n const sensorwidth = options.cameraSensorWidth || 35;\r\n\r\n return `def Camera \"${name}\"\r\n\t\t{\r\n\t\t\tmatrix4d xformOp:transform = ${transform}\r\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\r\n\r\n\t\t\tfloat2 clippingRange = (${camera.minZ.toPrecision(options.precision)}, ${camera.maxZ.toPrecision(options.precision)})\r\n\t\t\tfloat focalLength = ${(sensorwidth / (2 * Math.tan(camera.fov * 0.5))).toPrecision(options.precision)}\r\n token projection = \"perspective\"\r\n\t\t\tfloat horizontalAperture = ${(sensorwidth * aspect).toPrecision(options.precision)}\r\n\t\t\tfloat verticalAperture = ${(sensorwidth / aspect).toPrecision(options.precision)} \r\n\t\t}\r\n\t\r\n\t`;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param scene scene to export\r\n * @param options options to configure the export\r\n * @param meshPredicate predicate to filter the meshes to export\r\n * @returns a uint8 array containing the USDZ file\r\n * #H2G5XW#6 - Simple sphere\r\n * #H2G5XW#7 - Red sphere\r\n * #5N3RWK#5 - Boombox\r\n */\r\nexport async function USDZExportAsync(scene: Scene, options: Partial<IUSDZExportOptions>, meshPredicate?: (m: Mesh) => boolean): Promise<Uint8Array> {\r\n const localOptions = {\r\n fflateUrl: \"https://unpkg.com/fflate@0.8.2\",\r\n includeAnchoringProperties: true,\r\n anchoringType: \"plane\",\r\n planeAnchoringAlignment: \"horizontal\",\r\n modelFileName: \"model.usda\",\r\n precision: 5,\r\n exportCamera: false,\r\n cameraSensorWidth: 35,\r\n ...options,\r\n };\r\n\r\n // Get the fflate library\r\n if (typeof fflate === \"undefined\") {\r\n await Tools.LoadScriptAsync(localOptions.fflateUrl);\r\n }\r\n\r\n // Start the export\r\n const files: { [key: string]: any } = {};\r\n\r\n // model file should be first in USDZ archive so we init it here\r\n files[localOptions.modelFileName] = null;\r\n\r\n let output = BuildHeader();\r\n output += BuildSceneStart(localOptions);\r\n\r\n const materialToExports: { [key: string]: Material } = {};\r\n\r\n // Meshes\r\n for (const abstractMesh of scene.meshes) {\r\n if (abstractMesh.getTotalVertices() === 0) {\r\n continue;\r\n }\r\n const mesh = abstractMesh as Mesh;\r\n const geometry = mesh.geometry;\r\n const material = mesh.material;\r\n\r\n if (!material || !geometry || (meshPredicate && !meshPredicate(mesh))) {\r\n continue;\r\n }\r\n\r\n const supportedMaterials = [\"StandardMaterial\", \"PBRMaterial\", \"PBRMetallicRoughnessMaterial\"];\r\n\r\n if (supportedMaterials.indexOf(material.getClassName()) !== -1) {\r\n const geometryFileName = \"geometries/Geometry_\" + geometry.uniqueId + \".usda\";\r\n\r\n if (!(geometryFileName in files)) {\r\n const meshObject = BuildMeshObject(geometry, localOptions);\r\n files[geometryFileName] = BuildUSDFileAsString(meshObject);\r\n }\r\n\r\n if (!(material.uniqueId in materialToExports)) {\r\n materialToExports[material.uniqueId] = material;\r\n }\r\n\r\n output += BuildXform(mesh);\r\n } else {\r\n Tools.Warn(\"USDZExportAsync does not support this material type: \" + material.getClassName());\r\n }\r\n }\r\n\r\n // Camera\r\n if (scene.activeCamera && localOptions.exportCamera) {\r\n output += BuildCamera(scene.activeCamera, localOptions);\r\n }\r\n\r\n // Close scene\r\n output += BuildSceneEnd();\r\n\r\n // Materials\r\n const textureToExports: { [key: string]: BaseTexture } = {};\r\n output += BuildMaterials(materialToExports, textureToExports, localOptions);\r\n\r\n // Compress\r\n files[localOptions.modelFileName] = fflate.strToU8(output);\r\n\r\n // Textures\r\n for (const id in textureToExports) {\r\n const texture = textureToExports[id];\r\n\r\n const size = texture.getSize();\r\n const textureData = await texture.readPixels();\r\n\r\n if (!textureData) {\r\n throw new Error(\"Texture data is not available\");\r\n }\r\n\r\n const fileContent = await DumpTools.DumpDataAsync(size.width, size.height, textureData, \"image/png\", undefined, false, true);\r\n\r\n files[`textures/Texture_${id}.png`] = new Uint8Array(fileContent as ArrayBuffer).slice(); // This is to avoid getting a link and not a copy\r\n }\r\n\r\n // 64 byte alignment\r\n // https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\r\n\r\n let offset = 0;\r\n\r\n for (const filename in files) {\r\n const file = files[filename];\r\n if (!file) {\r\n continue;\r\n }\r\n const headerSize = 34 + filename.length;\r\n\r\n offset += headerSize;\r\n\r\n const offsetMod64 = offset & 63;\r\n\r\n if (offsetMod64 !== 4) {\r\n const padLength = 64 - offsetMod64;\r\n const padding = new Uint8Array(padLength);\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n files[filename] = [file, { extra: { 12345: padding } }];\r\n }\r\n\r\n offset = file.length;\r\n }\r\n\r\n return fflate.zipSync(files, { level: 0 });\r\n}\r\n"]}
@@ -9,17 +9,18 @@ import { Engine } from "@babylonjs/core/Engines/engine.js";
9
9
  import { EngineStore } from "@babylonjs/core/Engines/engineStore.js";
10
10
  import { GLTFMaterialExporter } from "./glTFMaterialExporter.js";
11
11
  import { GLTFData } from "./glTFData.js";
12
- import { AreIndices32Bits, ConvertToRightHandedPosition, ConvertToRightHandedRotation, CreateAccessor, CreateBufferView, DataArrayToUint8Array, GetAccessorType, GetAttributeType, GetMinMax, GetPrimitiveMode, IndicesArrayToUint8Array, IsNoopNode, IsTriangleFillMode, IsParentAddedByImporter, ConvertToRightHandedNode, RotateNode180Y, FloatsNeed16BitInteger, IsStandardVertexAttribute, } from "./glTFUtilities.js";
12
+ import { ConvertToRightHandedPosition, ConvertToRightHandedRotation, CreateAccessor, CreateBufferView, DataArrayToUint8Array, GetAccessorType, GetAttributeType, GetMinMax, GetPrimitiveMode, IndicesArrayToUint8Array, IsNoopNode, IsTriangleFillMode, IsParentAddedByImporter, ConvertToRightHandedNode, RotateNode180Y, FloatsNeed16BitInteger, IsStandardVertexAttribute, } from "./glTFUtilities.js";
13
13
  import { DataWriter } from "./dataWriter.js";
14
14
  import { Camera } from "@babylonjs/core/Cameras/camera.js";
15
15
  import { MultiMaterial } from "@babylonjs/core/Materials/multiMaterial.js";
16
16
  import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
17
17
  import { StandardMaterial } from "@babylonjs/core/Materials/standardMaterial.js";
18
18
  import { Logger } from "@babylonjs/core/Misc/logger.js";
19
- import { EnumerateFloatValues } from "@babylonjs/core/Buffers/bufferUtils.js";
19
+ import { EnumerateFloatValues, AreIndices32Bits } from "@babylonjs/core/Buffers/bufferUtils.js";
20
20
  import { _GLTFAnimation } from "./glTFAnimation.js";
21
21
  import { BuildMorphTargetBuffers } from "./glTFMorphTargetsUtilities.js";
22
22
  import { LinesMesh } from "@babylonjs/core/Meshes/linesMesh.js";
23
+ import { GreasedLineBaseMesh } from "@babylonjs/core/Meshes/GreasedLine/greasedLineBaseMesh.js";
23
24
  import { Color3, Color4 } from "@babylonjs/core/Maths/math.color.js";
24
25
  class ExporterState {
25
26
  constructor(convertToRightHanded, wasAddedByNoopNode) {
@@ -288,7 +289,6 @@ export class GLTFExporter {
288
289
  }
289
290
  _generateJSON(shouldUseGlb, bufferByteLength, fileName, prettyPrint) {
290
291
  const buffer = { byteLength: bufferByteLength };
291
- let imageName;
292
292
  let imageData;
293
293
  let bufferView;
294
294
  let byteOffset = bufferByteLength;
@@ -343,7 +343,7 @@ export class GLTFExporter {
343
343
  byteOffset += imageData.data.byteLength;
344
344
  this._bufferViews.push(bufferView);
345
345
  image.bufferView = this._bufferViews.length - 1;
346
- image.name = imageName;
346
+ image.name = fileName;
347
347
  image.mimeType = imageData.mimeType;
348
348
  image.uri = undefined;
349
349
  this._glTF.images.push(image);
@@ -1130,17 +1130,31 @@ export class GLTFExporter {
1130
1130
  const indices = babylonMesh.isUnIndexed ? null : babylonMesh.getIndices();
1131
1131
  const vertexBuffers = babylonMesh.geometry?.getVertexBuffers();
1132
1132
  const morphTargets = state.getMorphTargetsFromMesh(babylonMesh);
1133
- let isLinesMesh = false;
1134
- if (babylonMesh instanceof LinesMesh) {
1135
- isLinesMesh = true;
1136
- }
1133
+ const isLinesMesh = babylonMesh instanceof LinesMesh;
1134
+ const isGreasedLineMesh = babylonMesh instanceof GreasedLineBaseMesh;
1137
1135
  const subMeshes = babylonMesh.subMeshes;
1138
1136
  if (vertexBuffers && subMeshes && subMeshes.length > 0) {
1139
1137
  for (const subMesh of subMeshes) {
1140
1138
  const primitive = { attributes: {} };
1141
1139
  const babylonMaterial = subMesh.getMaterial() || this._babylonScene.defaultMaterial;
1142
- // Special case for LinesMesh
1143
- if (isLinesMesh) {
1140
+ if (isGreasedLineMesh) {
1141
+ const material = {
1142
+ name: babylonMaterial.name,
1143
+ };
1144
+ const babylonLinesMesh = babylonMesh;
1145
+ const colorWhite = Color3.White();
1146
+ const alpha = babylonLinesMesh.material?.alpha ?? 1;
1147
+ const color = babylonLinesMesh.greasedLineMaterial?.color ?? colorWhite;
1148
+ if (!color.equals(colorWhite) || alpha < 1) {
1149
+ material.pbrMetallicRoughness = {
1150
+ baseColorFactor: [...color.asArray(), alpha],
1151
+ };
1152
+ }
1153
+ this._materials.push(material);
1154
+ primitive.material = this._materials.length - 1;
1155
+ }
1156
+ else if (isLinesMesh) {
1157
+ // Special case for LinesMesh
1144
1158
  const material = {
1145
1159
  name: babylonMaterial.name,
1146
1160
  };
@@ -1158,7 +1172,7 @@ export class GLTFExporter {
1158
1172
  await this._exportMaterialAsync(babylonMaterial, vertexBuffers, subMesh, primitive);
1159
1173
  }
1160
1174
  // Index buffer
1161
- const fillMode = isLinesMesh ? Material.LineListDrawMode : (babylonMesh.overrideRenderingFillMode ?? babylonMaterial.fillMode);
1175
+ const fillMode = isLinesMesh || isGreasedLineMesh ? Material.LineListDrawMode : (babylonMesh.overrideRenderingFillMode ?? babylonMaterial.fillMode);
1162
1176
  const sideOrientation = babylonMaterial._getEffectiveOrientation(babylonMesh);
1163
1177
  this._exportIndices(indices, subMesh.indexStart, subMesh.indexCount, -subMesh.verticesStart, fillMode, sideOrientation, state, primitive);
1164
1178
  // Vertex buffers
@@ -1 +1 @@
1
- {"version":3,"file":"glTFExporter.js","sourceRoot":"","sources":["../../../../../dev/serializers/src/glTF/2.0/glTFExporter.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n IBufferView,\r\n IAccessor,\r\n INode,\r\n IScene,\r\n IMesh,\r\n IMaterial,\r\n ITexture,\r\n IImage,\r\n ISampler,\r\n IAnimation,\r\n IMeshPrimitive,\r\n IBuffer,\r\n IGLTF,\r\n ITextureInfo,\r\n ISkin,\r\n ICamera,\r\n} from \"babylonjs-gltf2interface\";\r\nimport { AccessorComponentType, AccessorType, CameraType, ImageMimeType } from \"babylonjs-gltf2interface\";\r\n\r\nimport type { FloatArray, IndicesArray, Nullable } from \"core/types\";\r\nimport { TmpVectors, Quaternion, Matrix } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Buffer } from \"core/Buffers/buffer\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { Node } from \"core/node\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Texture } from \"core/Materials/Textures/texture\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { Engine } from \"core/Engines/engine\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\n\r\nimport type { IGLTFExporterExtensionV2 } from \"./glTFExporterExtension\";\r\nimport { GLTFMaterialExporter } from \"./glTFMaterialExporter\";\r\nimport type { IExportOptions } from \"./glTFSerializer\";\r\nimport { GLTFData } from \"./glTFData\";\r\nimport {\r\n AreIndices32Bits,\r\n ConvertToRightHandedPosition,\r\n ConvertToRightHandedRotation,\r\n CreateAccessor,\r\n CreateBufferView,\r\n DataArrayToUint8Array,\r\n GetAccessorType,\r\n GetAttributeType,\r\n GetMinMax,\r\n GetPrimitiveMode,\r\n IndicesArrayToUint8Array,\r\n IsNoopNode,\r\n IsTriangleFillMode,\r\n IsParentAddedByImporter,\r\n ConvertToRightHandedNode,\r\n RotateNode180Y,\r\n FloatsNeed16BitInteger,\r\n IsStandardVertexAttribute,\r\n} from \"./glTFUtilities\";\r\nimport { DataWriter } from \"./dataWriter\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { EnumerateFloatValues } from \"core/Buffers/bufferUtils\";\r\nimport type { Bone, Skeleton } from \"core/Bones\";\r\nimport { _GLTFAnimation } from \"./glTFAnimation\";\r\nimport type { MorphTarget } from \"core/Morph\";\r\nimport { BuildMorphTargetBuffers } from \"./glTFMorphTargetsUtilities\";\r\nimport type { IMorphTargetData } from \"./glTFMorphTargetsUtilities\";\r\nimport { LinesMesh } from \"core/Meshes/linesMesh\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\n\r\nclass ExporterState {\r\n // Babylon indices array, start, count, offset, flip -> glTF accessor index\r\n private _indicesAccessorMap = new Map<Nullable<IndicesArray>, Map<number, Map<number, Map<number, Map<boolean, number>>>>>();\r\n\r\n // Babylon buffer -> glTF buffer view index\r\n private _vertexBufferViewMap = new Map<Buffer, number>();\r\n\r\n // Babylon vertex buffer, start, count -> glTF accessor index\r\n private _vertexAccessorMap = new Map<VertexBuffer, Map<number, Map<number, number>>>();\r\n\r\n private _remappedBufferView = new Map<Buffer, Map<VertexBuffer, number>>();\r\n\r\n private _meshMorphTargetMap = new Map<Mesh, IMorphTargetData[]>();\r\n\r\n private _vertexMapColorAlpha = new Map<VertexBuffer, boolean>();\r\n\r\n private _exportedNodes = new Set<Node>();\r\n\r\n // Babylon mesh -> glTF mesh index\r\n private _meshMap = new Map<Mesh, number>();\r\n\r\n public constructor(convertToRightHanded: boolean, wasAddedByNoopNode: boolean) {\r\n this.convertToRightHanded = convertToRightHanded;\r\n this.wasAddedByNoopNode = wasAddedByNoopNode;\r\n }\r\n\r\n public readonly convertToRightHanded: boolean;\r\n\r\n public readonly wasAddedByNoopNode: boolean;\r\n\r\n // Only used when convertToRightHanded is true.\r\n public readonly convertedToRightHandedBuffers = new Map<Buffer, Uint8Array>();\r\n\r\n public getIndicesAccessor(indices: Nullable<IndicesArray>, start: number, count: number, offset: number, flip: boolean): number | undefined {\r\n return this._indicesAccessorMap.get(indices)?.get(start)?.get(count)?.get(offset)?.get(flip);\r\n }\r\n\r\n public setIndicesAccessor(indices: Nullable<IndicesArray>, start: number, count: number, offset: number, flip: boolean, accessorIndex: number): void {\r\n let map1 = this._indicesAccessorMap.get(indices);\r\n if (!map1) {\r\n map1 = new Map<number, Map<number, Map<number, Map<boolean, number>>>>();\r\n this._indicesAccessorMap.set(indices, map1);\r\n }\r\n\r\n let map2 = map1.get(start);\r\n if (!map2) {\r\n map2 = new Map<number, Map<number, Map<boolean, number>>>();\r\n map1.set(start, map2);\r\n }\r\n\r\n let map3 = map2.get(count);\r\n if (!map3) {\r\n map3 = new Map<number, Map<boolean, number>>();\r\n map2.set(count, map3);\r\n }\r\n\r\n let map4 = map3.get(offset);\r\n if (!map4) {\r\n map4 = new Map<boolean, number>();\r\n map3.set(offset, map4);\r\n }\r\n\r\n map4.set(flip, accessorIndex);\r\n }\r\n\r\n public pushExportedNode(node: Node) {\r\n if (!this._exportedNodes.has(node)) {\r\n this._exportedNodes.add(node);\r\n }\r\n }\r\n\r\n public getNodesSet(): Set<Node> {\r\n return this._exportedNodes;\r\n }\r\n\r\n public getVertexBufferView(buffer: Buffer): number | undefined {\r\n return this._vertexBufferViewMap.get(buffer);\r\n }\r\n\r\n public setVertexBufferView(buffer: Buffer, bufferViewIndex: number): void {\r\n this._vertexBufferViewMap.set(buffer, bufferViewIndex);\r\n }\r\n\r\n public setRemappedBufferView(buffer: Buffer, vertexBuffer: VertexBuffer, bufferViewIndex: number) {\r\n this._remappedBufferView.set(buffer, new Map<VertexBuffer, number>());\r\n this._remappedBufferView.get(buffer)!.set(vertexBuffer, bufferViewIndex);\r\n }\r\n\r\n public getRemappedBufferView(buffer: Buffer, vertexBuffer: VertexBuffer): number | undefined {\r\n return this._remappedBufferView.get(buffer)?.get(vertexBuffer);\r\n }\r\n\r\n public getVertexAccessor(vertexBuffer: VertexBuffer, start: number, count: number): number | undefined {\r\n return this._vertexAccessorMap.get(vertexBuffer)?.get(start)?.get(count);\r\n }\r\n\r\n public setVertexAccessor(vertexBuffer: VertexBuffer, start: number, count: number, accessorIndex: number): void {\r\n let map1 = this._vertexAccessorMap.get(vertexBuffer);\r\n if (!map1) {\r\n map1 = new Map<number, Map<number, number>>();\r\n this._vertexAccessorMap.set(vertexBuffer, map1);\r\n }\r\n\r\n let map2 = map1.get(start);\r\n if (!map2) {\r\n map2 = new Map<number, number>();\r\n map1.set(start, map2);\r\n }\r\n\r\n map2.set(count, accessorIndex);\r\n }\r\n\r\n public hasVertexColorAlpha(vertexBuffer: VertexBuffer): boolean {\r\n return this._vertexMapColorAlpha.get(vertexBuffer) || false;\r\n }\r\n\r\n public setHasVertexColorAlpha(vertexBuffer: VertexBuffer, hasAlpha: boolean) {\r\n return this._vertexMapColorAlpha.set(vertexBuffer, hasAlpha);\r\n }\r\n\r\n public getMesh(mesh: Mesh): number | undefined {\r\n return this._meshMap.get(mesh);\r\n }\r\n\r\n public setMesh(mesh: Mesh, meshIndex: number): void {\r\n this._meshMap.set(mesh, meshIndex);\r\n }\r\n\r\n public bindMorphDataToMesh(mesh: Mesh, morphData: IMorphTargetData) {\r\n const morphTargets = this._meshMorphTargetMap.get(mesh) || [];\r\n this._meshMorphTargetMap.set(mesh, morphTargets);\r\n if (morphTargets.indexOf(morphData) === -1) {\r\n morphTargets.push(morphData);\r\n }\r\n }\r\n\r\n public getMorphTargetsFromMesh(mesh: Mesh): IMorphTargetData[] | undefined {\r\n return this._meshMorphTargetMap.get(mesh);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class GLTFExporter {\r\n public readonly _glTF: IGLTF = {\r\n asset: { generator: `Babylon.js v${Engine.Version}`, version: \"2.0\" },\r\n };\r\n\r\n public readonly _animations: IAnimation[] = [];\r\n public readonly _accessors: IAccessor[] = [];\r\n public readonly _bufferViews: IBufferView[] = [];\r\n public readonly _cameras: ICamera[] = [];\r\n public readonly _images: IImage[] = [];\r\n public readonly _materials: IMaterial[] = [];\r\n public readonly _meshes: IMesh[] = [];\r\n public readonly _nodes: INode[] = [];\r\n public readonly _samplers: ISampler[] = [];\r\n public readonly _scenes: IScene[] = [];\r\n public readonly _skins: ISkin[] = [];\r\n public readonly _textures: ITexture[] = [];\r\n\r\n public readonly _babylonScene: Scene;\r\n public readonly _imageData: { [fileName: string]: { data: ArrayBuffer; mimeType: ImageMimeType } } = {};\r\n private readonly _orderedImageData: Array<{ data: ArrayBuffer; mimeType: ImageMimeType }> = [];\r\n\r\n /**\r\n * Baked animation sample rate\r\n */\r\n private _animationSampleRate: number;\r\n\r\n private readonly _options: Required<IExportOptions>;\r\n\r\n public readonly _materialExporter = new GLTFMaterialExporter(this);\r\n\r\n private readonly _extensions: { [name: string]: IGLTFExporterExtensionV2 } = {};\r\n\r\n private readonly _dataWriter = new DataWriter(4);\r\n\r\n private readonly _shouldExportNodeMap = new Map<Node, boolean>();\r\n\r\n // Babylon node -> glTF node index\r\n private readonly _nodeMap = new Map<Node, number>();\r\n\r\n // Babylon material -> glTF material index\r\n public readonly _materialMap = new Map<Material, number>();\r\n private readonly _camerasMap = new Map<Camera, ICamera>();\r\n private readonly _nodesCameraMap = new Map<ICamera, INode[]>();\r\n private readonly _skinMap = new Map<Skeleton, ISkin>();\r\n private readonly _nodesSkinMap = new Map<ISkin, INode[]>();\r\n\r\n // A material in this set requires UVs\r\n public readonly _materialNeedsUVsSet = new Set<Material>();\r\n\r\n private static readonly _ExtensionNames = new Array<string>();\r\n private static readonly _ExtensionFactories: { [name: string]: (exporter: GLTFExporter) => IGLTFExporterExtensionV2 } = {};\r\n\r\n private _applyExtension<T>(\r\n node: T,\r\n extensions: IGLTFExporterExtensionV2[],\r\n index: number,\r\n actionAsync: (extension: IGLTFExporterExtensionV2, node: T) => Promise<Nullable<T>> | undefined\r\n ): Promise<Nullable<T>> {\r\n if (index >= extensions.length) {\r\n return Promise.resolve(node);\r\n }\r\n\r\n const currentPromise = actionAsync(extensions[index], node);\r\n\r\n if (!currentPromise) {\r\n return this._applyExtension(node, extensions, index + 1, actionAsync);\r\n }\r\n\r\n return currentPromise.then((newNode) => (newNode ? this._applyExtension(newNode, extensions, index + 1, actionAsync) : null));\r\n }\r\n\r\n private _applyExtensions<T>(node: T, actionAsync: (extension: IGLTFExporterExtensionV2, node: T) => Promise<Nullable<T>> | undefined): Promise<Nullable<T>> {\r\n const extensions: IGLTFExporterExtensionV2[] = [];\r\n for (const name of GLTFExporter._ExtensionNames) {\r\n extensions.push(this._extensions[name]);\r\n }\r\n\r\n return this._applyExtension(node, extensions, 0, actionAsync);\r\n }\r\n\r\n public _extensionsPreExportTextureAsync(context: string, babylonTexture: Texture, mimeType: ImageMimeType): Promise<Nullable<BaseTexture>> {\r\n return this._applyExtensions(babylonTexture, (extension, node) => extension.preExportTextureAsync && extension.preExportTextureAsync(context, node, mimeType));\r\n }\r\n\r\n public _extensionsPostExportMeshPrimitiveAsync(context: string, meshPrimitive: IMeshPrimitive, babylonSubMesh: SubMesh): Promise<Nullable<IMeshPrimitive>> {\r\n return this._applyExtensions(\r\n meshPrimitive,\r\n (extension, node) => extension.postExportMeshPrimitiveAsync && extension.postExportMeshPrimitiveAsync(context, node, babylonSubMesh)\r\n );\r\n }\r\n\r\n public _extensionsPostExportNodeAsync(context: string, node: INode, babylonNode: Node, nodeMap: Map<Node, number>, convertToRightHanded: boolean): Promise<Nullable<INode>> {\r\n return this._applyExtensions(\r\n node,\r\n (extension, node) => extension.postExportNodeAsync && extension.postExportNodeAsync(context, node, babylonNode, nodeMap, convertToRightHanded, this._dataWriter)\r\n );\r\n }\r\n\r\n public _extensionsPostExportMaterialAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise<Nullable<IMaterial>> {\r\n return this._applyExtensions(material, (extension, node) => extension.postExportMaterialAsync && extension.postExportMaterialAsync(context, node, babylonMaterial));\r\n }\r\n\r\n public _extensionsPostExportMaterialAdditionalTextures(context: string, material: IMaterial, babylonMaterial: Material): BaseTexture[] {\r\n const output: BaseTexture[] = [];\r\n\r\n for (const name of GLTFExporter._ExtensionNames) {\r\n const extension = this._extensions[name];\r\n\r\n if (extension.postExportMaterialAdditionalTextures) {\r\n output.push(...extension.postExportMaterialAdditionalTextures(context, material, babylonMaterial));\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n public _extensionsPostExportTextures(context: string, textureInfo: ITextureInfo, babylonTexture: BaseTexture): void {\r\n for (const name of GLTFExporter._ExtensionNames) {\r\n const extension = this._extensions[name];\r\n\r\n if (extension.postExportTexture) {\r\n extension.postExportTexture(context, textureInfo, babylonTexture);\r\n }\r\n }\r\n }\r\n\r\n private _forEachExtensions(action: (extension: IGLTFExporterExtensionV2) => void): void {\r\n for (const name of GLTFExporter._ExtensionNames) {\r\n const extension = this._extensions[name];\r\n if (extension.enabled) {\r\n action(extension);\r\n }\r\n }\r\n }\r\n\r\n private _extensionsOnExporting(): void {\r\n this._forEachExtensions((extension) => {\r\n if (extension.wasUsed) {\r\n this._glTF.extensionsUsed ||= [];\r\n if (this._glTF.extensionsUsed.indexOf(extension.name) === -1) {\r\n this._glTF.extensionsUsed.push(extension.name);\r\n }\r\n\r\n if (extension.required) {\r\n this._glTF.extensionsRequired ||= [];\r\n if (this._glTF.extensionsRequired.indexOf(extension.name) === -1) {\r\n this._glTF.extensionsRequired.push(extension.name);\r\n }\r\n }\r\n\r\n this._glTF.extensions ||= {};\r\n if (extension.onExporting) {\r\n extension.onExporting();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _loadExtensions(): void {\r\n for (const name of GLTFExporter._ExtensionNames) {\r\n const extension = GLTFExporter._ExtensionFactories[name](this);\r\n this._extensions[name] = extension;\r\n }\r\n }\r\n\r\n public constructor(babylonScene: Nullable<Scene> = EngineStore.LastCreatedScene, options?: IExportOptions) {\r\n if (!babylonScene) {\r\n throw new Error(\"No scene available to export\");\r\n }\r\n\r\n this._babylonScene = babylonScene;\r\n\r\n this._options = {\r\n shouldExportNode: () => true,\r\n shouldExportAnimation: () => true,\r\n metadataSelector: (metadata) => metadata,\r\n animationSampleRate: 1 / 60,\r\n exportWithoutWaitingForScene: false,\r\n exportUnusedUVs: false,\r\n removeNoopRootNodes: true,\r\n includeCoordinateSystemConversionNodes: false,\r\n ...options,\r\n };\r\n\r\n this._loadExtensions();\r\n }\r\n\r\n public dispose() {\r\n for (const key in this._extensions) {\r\n const extension = this._extensions[key];\r\n extension.dispose();\r\n }\r\n }\r\n\r\n public get options() {\r\n return this._options;\r\n }\r\n\r\n public static RegisterExtension(name: string, factory: (exporter: GLTFExporter) => IGLTFExporterExtensionV2): void {\r\n if (GLTFExporter.UnregisterExtension(name)) {\r\n Tools.Warn(`Extension with the name ${name} already exists`);\r\n }\r\n\r\n GLTFExporter._ExtensionFactories[name] = factory;\r\n GLTFExporter._ExtensionNames.push(name);\r\n }\r\n\r\n public static UnregisterExtension(name: string): boolean {\r\n if (!GLTFExporter._ExtensionFactories[name]) {\r\n return false;\r\n }\r\n delete GLTFExporter._ExtensionFactories[name];\r\n\r\n const index = GLTFExporter._ExtensionNames.indexOf(name);\r\n if (index !== -1) {\r\n GLTFExporter._ExtensionNames.splice(index, 1);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _generateJSON(shouldUseGlb: boolean, bufferByteLength: number, fileName?: string, prettyPrint?: boolean): string {\r\n const buffer: IBuffer = { byteLength: bufferByteLength };\r\n let imageName: string;\r\n let imageData: { data: ArrayBuffer; mimeType: ImageMimeType };\r\n let bufferView: IBufferView;\r\n let byteOffset: number = bufferByteLength;\r\n\r\n if (buffer.byteLength) {\r\n this._glTF.buffers = [buffer];\r\n }\r\n if (this._nodes && this._nodes.length) {\r\n this._glTF.nodes = this._nodes;\r\n }\r\n if (this._meshes && this._meshes.length) {\r\n this._glTF.meshes = this._meshes;\r\n }\r\n if (this._scenes && this._scenes.length) {\r\n this._glTF.scenes = this._scenes;\r\n this._glTF.scene = 0;\r\n }\r\n if (this._cameras && this._cameras.length) {\r\n this._glTF.cameras = this._cameras;\r\n }\r\n if (this._bufferViews && this._bufferViews.length) {\r\n this._glTF.bufferViews = this._bufferViews;\r\n }\r\n if (this._accessors && this._accessors.length) {\r\n this._glTF.accessors = this._accessors;\r\n }\r\n if (this._animations && this._animations.length) {\r\n this._glTF.animations = this._animations;\r\n }\r\n if (this._materials && this._materials.length) {\r\n this._glTF.materials = this._materials;\r\n }\r\n if (this._textures && this._textures.length) {\r\n this._glTF.textures = this._textures;\r\n }\r\n if (this._samplers && this._samplers.length) {\r\n this._glTF.samplers = this._samplers;\r\n }\r\n if (this._skins && this._skins.length) {\r\n this._glTF.skins = this._skins;\r\n }\r\n if (this._images && this._images.length) {\r\n if (!shouldUseGlb) {\r\n this._glTF.images = this._images;\r\n } else {\r\n this._glTF.images = [];\r\n\r\n this._images.forEach((image) => {\r\n if (image.uri) {\r\n imageData = this._imageData[image.uri];\r\n this._orderedImageData.push(imageData);\r\n bufferView = CreateBufferView(0, byteOffset, imageData.data.byteLength, undefined);\r\n byteOffset += imageData.data.byteLength;\r\n this._bufferViews.push(bufferView);\r\n image.bufferView = this._bufferViews.length - 1;\r\n image.name = imageName;\r\n image.mimeType = imageData.mimeType;\r\n image.uri = undefined;\r\n this._glTF.images!.push(image);\r\n }\r\n });\r\n\r\n // Replace uri with bufferview and mime type for glb\r\n buffer.byteLength = byteOffset;\r\n }\r\n }\r\n\r\n if (!shouldUseGlb) {\r\n buffer.uri = fileName + \".bin\";\r\n }\r\n\r\n return prettyPrint ? JSON.stringify(this._glTF, null, 2) : JSON.stringify(this._glTF);\r\n }\r\n\r\n public async generateGLTFAsync(glTFPrefix: string): Promise<GLTFData> {\r\n const binaryBuffer = await this._generateBinaryAsync();\r\n\r\n this._extensionsOnExporting();\r\n const jsonText = this._generateJSON(false, binaryBuffer.byteLength, glTFPrefix, true);\r\n const bin = new Blob([binaryBuffer], { type: \"application/octet-stream\" });\r\n\r\n const glTFFileName = glTFPrefix + \".gltf\";\r\n const glTFBinFile = glTFPrefix + \".bin\";\r\n\r\n const container = new GLTFData();\r\n\r\n container.files[glTFFileName] = jsonText;\r\n container.files[glTFBinFile] = bin;\r\n\r\n if (this._imageData) {\r\n for (const image in this._imageData) {\r\n container.files[image] = new Blob([this._imageData[image].data], { type: this._imageData[image].mimeType });\r\n }\r\n }\r\n\r\n return container;\r\n }\r\n\r\n private async _generateBinaryAsync(): Promise<Uint8Array> {\r\n await this._exportSceneAsync();\r\n return this._dataWriter.getOutputData();\r\n }\r\n\r\n /**\r\n * Pads the number to a multiple of 4\r\n * @param num number to pad\r\n * @returns padded number\r\n */\r\n private _getPadding(num: number): number {\r\n const remainder = num % 4;\r\n const padding = remainder === 0 ? remainder : 4 - remainder;\r\n\r\n return padding;\r\n }\r\n\r\n public async generateGLBAsync(glTFPrefix: string): Promise<GLTFData> {\r\n const binaryBuffer = await this._generateBinaryAsync();\r\n\r\n this._extensionsOnExporting();\r\n const jsonText = this._generateJSON(true, binaryBuffer.byteLength);\r\n const glbFileName = glTFPrefix + \".glb\";\r\n const headerLength = 12;\r\n const chunkLengthPrefix = 8;\r\n let jsonLength = jsonText.length;\r\n let encodedJsonText;\r\n let imageByteLength = 0;\r\n // make use of TextEncoder when available\r\n if (typeof TextEncoder !== \"undefined\") {\r\n const encoder = new TextEncoder();\r\n encodedJsonText = encoder.encode(jsonText);\r\n jsonLength = encodedJsonText.length;\r\n }\r\n for (let i = 0; i < this._orderedImageData.length; ++i) {\r\n imageByteLength += this._orderedImageData[i].data.byteLength;\r\n }\r\n const jsonPadding = this._getPadding(jsonLength);\r\n const binPadding = this._getPadding(binaryBuffer.byteLength);\r\n const imagePadding = this._getPadding(imageByteLength);\r\n\r\n const byteLength = headerLength + 2 * chunkLengthPrefix + jsonLength + jsonPadding + binaryBuffer.byteLength + binPadding + imageByteLength + imagePadding;\r\n\r\n // header\r\n const headerBuffer = new ArrayBuffer(headerLength);\r\n const headerBufferView = new DataView(headerBuffer);\r\n headerBufferView.setUint32(0, 0x46546c67, true); //glTF\r\n headerBufferView.setUint32(4, 2, true); // version\r\n headerBufferView.setUint32(8, byteLength, true); // total bytes in file\r\n\r\n // json chunk\r\n const jsonChunkBuffer = new ArrayBuffer(chunkLengthPrefix + jsonLength + jsonPadding);\r\n const jsonChunkBufferView = new DataView(jsonChunkBuffer);\r\n jsonChunkBufferView.setUint32(0, jsonLength + jsonPadding, true);\r\n jsonChunkBufferView.setUint32(4, 0x4e4f534a, true);\r\n\r\n // json chunk bytes\r\n const jsonData = new Uint8Array(jsonChunkBuffer, chunkLengthPrefix);\r\n // if TextEncoder was available, we can simply copy the encoded array\r\n if (encodedJsonText) {\r\n jsonData.set(encodedJsonText);\r\n } else {\r\n const blankCharCode = \"_\".charCodeAt(0);\r\n for (let i = 0; i < jsonLength; ++i) {\r\n const charCode = jsonText.charCodeAt(i);\r\n // if the character doesn't fit into a single UTF-16 code unit, just put a blank character\r\n if (charCode != jsonText.codePointAt(i)) {\r\n jsonData[i] = blankCharCode;\r\n } else {\r\n jsonData[i] = charCode;\r\n }\r\n }\r\n }\r\n\r\n // json padding\r\n const jsonPaddingView = new Uint8Array(jsonChunkBuffer, chunkLengthPrefix + jsonLength);\r\n for (let i = 0; i < jsonPadding; ++i) {\r\n jsonPaddingView[i] = 0x20;\r\n }\r\n\r\n // binary chunk\r\n const binaryChunkBuffer = new ArrayBuffer(chunkLengthPrefix);\r\n const binaryChunkBufferView = new DataView(binaryChunkBuffer);\r\n binaryChunkBufferView.setUint32(0, binaryBuffer.byteLength + binPadding + imageByteLength + imagePadding, true);\r\n binaryChunkBufferView.setUint32(4, 0x004e4942, true);\r\n\r\n // binary padding\r\n const binPaddingBuffer = new ArrayBuffer(binPadding);\r\n const binPaddingView = new Uint8Array(binPaddingBuffer);\r\n for (let i = 0; i < binPadding; ++i) {\r\n binPaddingView[i] = 0;\r\n }\r\n\r\n const imagePaddingBuffer = new ArrayBuffer(imagePadding);\r\n const imagePaddingView = new Uint8Array(imagePaddingBuffer);\r\n for (let i = 0; i < imagePadding; ++i) {\r\n imagePaddingView[i] = 0;\r\n }\r\n\r\n const glbData = [headerBuffer, jsonChunkBuffer, binaryChunkBuffer, binaryBuffer];\r\n\r\n // binary data\r\n for (let i = 0; i < this._orderedImageData.length; ++i) {\r\n glbData.push(this._orderedImageData[i].data);\r\n }\r\n\r\n glbData.push(binPaddingBuffer);\r\n\r\n glbData.push(imagePaddingBuffer);\r\n\r\n const glbFile = new Blob(glbData, { type: \"application/octet-stream\" });\r\n\r\n const container = new GLTFData();\r\n container.files[glbFileName] = glbFile;\r\n\r\n return container;\r\n }\r\n\r\n private _setNodeTransformation(node: INode, babylonTransformNode: TransformNode, convertToRightHanded: boolean): void {\r\n if (!babylonTransformNode.getPivotPoint().equalsToFloats(0, 0, 0)) {\r\n Tools.Warn(\"Pivot points are not supported in the glTF serializer\");\r\n }\r\n\r\n if (!babylonTransformNode.position.equalsToFloats(0, 0, 0)) {\r\n const translation = TmpVectors.Vector3[0].copyFrom(babylonTransformNode.position);\r\n if (convertToRightHanded) {\r\n ConvertToRightHandedPosition(translation);\r\n }\r\n\r\n node.translation = translation.asArray();\r\n }\r\n\r\n if (!babylonTransformNode.scaling.equalsToFloats(1, 1, 1)) {\r\n node.scale = babylonTransformNode.scaling.asArray();\r\n }\r\n\r\n const rotationQuaternion = Quaternion.FromEulerAngles(babylonTransformNode.rotation.x, babylonTransformNode.rotation.y, babylonTransformNode.rotation.z);\r\n if (babylonTransformNode.rotationQuaternion) {\r\n rotationQuaternion.multiplyInPlace(babylonTransformNode.rotationQuaternion);\r\n }\r\n if (!Quaternion.IsIdentity(rotationQuaternion)) {\r\n if (convertToRightHanded) {\r\n ConvertToRightHandedRotation(rotationQuaternion);\r\n }\r\n\r\n node.rotation = rotationQuaternion.normalize().asArray();\r\n }\r\n }\r\n\r\n private _setCameraTransformation(node: INode, babylonCamera: Camera, convertToRightHanded: boolean, parent: Nullable<Node>): void {\r\n const translation = TmpVectors.Vector3[0];\r\n const rotation = TmpVectors.Quaternion[0];\r\n\r\n if (parent !== null) {\r\n // Camera.getWorldMatrix returns global coordinates. GLTF node must use local coordinates. If camera has parent we need to use local translation/rotation.\r\n const parentWorldMatrix = Matrix.Invert(parent.getWorldMatrix());\r\n const cameraWorldMatrix = babylonCamera.getWorldMatrix();\r\n const cameraLocal = cameraWorldMatrix.multiply(parentWorldMatrix);\r\n cameraLocal.decompose(undefined, rotation, translation);\r\n } else {\r\n babylonCamera.getWorldMatrix().decompose(undefined, rotation, translation);\r\n }\r\n\r\n if (!translation.equalsToFloats(0, 0, 0)) {\r\n node.translation = translation.asArray();\r\n }\r\n\r\n if (!Quaternion.IsIdentity(rotation)) {\r\n node.rotation = rotation.asArray();\r\n }\r\n }\r\n\r\n // Export babylon cameras to glTF cameras\r\n private _listAvailableCameras(): void {\r\n for (const camera of this._babylonScene.cameras) {\r\n const glTFCamera: ICamera = {\r\n type: camera.mode === Camera.PERSPECTIVE_CAMERA ? CameraType.PERSPECTIVE : CameraType.ORTHOGRAPHIC,\r\n };\r\n\r\n if (camera.name) {\r\n glTFCamera.name = camera.name;\r\n }\r\n\r\n if (glTFCamera.type === CameraType.PERSPECTIVE) {\r\n glTFCamera.perspective = {\r\n aspectRatio: camera.getEngine().getAspectRatio(camera),\r\n yfov: camera.fovMode === Camera.FOVMODE_VERTICAL_FIXED ? camera.fov : camera.fov * camera.getEngine().getAspectRatio(camera),\r\n znear: camera.minZ,\r\n zfar: camera.maxZ,\r\n };\r\n } else if (glTFCamera.type === CameraType.ORTHOGRAPHIC) {\r\n const halfWidth = camera.orthoLeft && camera.orthoRight ? 0.5 * (camera.orthoRight - camera.orthoLeft) : camera.getEngine().getRenderWidth() * 0.5;\r\n const halfHeight = camera.orthoBottom && camera.orthoTop ? 0.5 * (camera.orthoTop - camera.orthoBottom) : camera.getEngine().getRenderHeight() * 0.5;\r\n glTFCamera.orthographic = {\r\n xmag: halfWidth,\r\n ymag: halfHeight,\r\n znear: camera.minZ,\r\n zfar: camera.maxZ,\r\n };\r\n }\r\n this._camerasMap.set(camera, glTFCamera);\r\n }\r\n }\r\n\r\n // Cleanup unused cameras and assign index to nodes.\r\n private _exportAndAssignCameras(): void {\r\n const gltfCameras = Array.from(this._camerasMap.values());\r\n for (const gltfCamera of gltfCameras) {\r\n const usedNodes = this._nodesCameraMap.get(gltfCamera);\r\n if (usedNodes !== undefined) {\r\n this._cameras.push(gltfCamera);\r\n for (const node of usedNodes) {\r\n node.camera = this._cameras.length - 1;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Builds all skins in the skins array so nodes can reference it during node parsing.\r\n private _listAvailableSkeletons(): void {\r\n for (const skeleton of this._babylonScene.skeletons) {\r\n if (skeleton.bones.length <= 0) {\r\n continue;\r\n }\r\n\r\n const skin: ISkin = { joints: [] };\r\n this._skinMap.set(skeleton, skin);\r\n }\r\n }\r\n\r\n private _exportAndAssignSkeletons() {\r\n for (const skeleton of this._babylonScene.skeletons) {\r\n if (skeleton.bones.length <= 0) {\r\n continue;\r\n }\r\n\r\n const skin = this._skinMap.get(skeleton);\r\n\r\n if (skin == undefined) {\r\n continue;\r\n }\r\n\r\n const boneIndexMap: { [index: number]: Bone } = {};\r\n const inverseBindMatrices: Matrix[] = [];\r\n\r\n let maxBoneIndex = -1;\r\n for (let i = 0; i < skeleton.bones.length; ++i) {\r\n const bone = skeleton.bones[i];\r\n const boneIndex = bone.getIndex() ?? i;\r\n if (boneIndex !== -1) {\r\n boneIndexMap[boneIndex] = bone;\r\n if (boneIndex > maxBoneIndex) {\r\n maxBoneIndex = boneIndex;\r\n }\r\n }\r\n }\r\n\r\n // Set joints index to scene node.\r\n for (let boneIndex = 0; boneIndex <= maxBoneIndex; ++boneIndex) {\r\n const bone = boneIndexMap[boneIndex];\r\n inverseBindMatrices.push(bone.getAbsoluteInverseBindMatrix());\r\n const transformNode = bone.getTransformNode();\r\n\r\n if (transformNode !== null) {\r\n const nodeID = this._nodeMap.get(transformNode);\r\n if (transformNode && nodeID !== null && nodeID !== undefined) {\r\n skin.joints.push(nodeID);\r\n } else {\r\n Tools.Warn(\"Exporting a bone without a linked transform node is currently unsupported\");\r\n }\r\n } else {\r\n Tools.Warn(\"Exporting a bone without a linked transform node is currently unsupported\");\r\n }\r\n }\r\n\r\n // Nodes that use this skin.\r\n const skinedNodes = this._nodesSkinMap.get(skin);\r\n\r\n // Only create skeleton if it has at least one joint and is used by a mesh.\r\n if (skin.joints.length > 0 && skinedNodes !== undefined) {\r\n // create buffer view for inverse bind matrices\r\n const byteStride = 64; // 4 x 4 matrix of 32 bit float\r\n const byteLength = inverseBindMatrices.length * byteStride;\r\n const bufferViewOffset = this._dataWriter.byteOffset;\r\n const bufferView = CreateBufferView(0, bufferViewOffset, byteLength, undefined);\r\n this._bufferViews.push(bufferView);\r\n const bufferViewIndex = this._bufferViews.length - 1;\r\n const bindMatrixAccessor = CreateAccessor(bufferViewIndex, AccessorType.MAT4, AccessorComponentType.FLOAT, inverseBindMatrices.length, null, null);\r\n const inverseBindAccessorIndex = this._accessors.push(bindMatrixAccessor) - 1;\r\n skin.inverseBindMatrices = inverseBindAccessorIndex;\r\n inverseBindMatrices.forEach((mat) => {\r\n mat.m.forEach((cell: number) => {\r\n this._dataWriter.writeFloat32(cell);\r\n });\r\n });\r\n\r\n this._skins.push(skin);\r\n for (const skinedNode of skinedNodes) {\r\n skinedNode.skin = this._skins.length - 1;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async _exportSceneAsync(): Promise<void> {\r\n const scene: IScene = { nodes: [] };\r\n\r\n // Scene metadata\r\n if (this._babylonScene.metadata) {\r\n if (this._options.metadataSelector) {\r\n scene.extras = this._options.metadataSelector(this._babylonScene.metadata);\r\n } else if (this._babylonScene.metadata.gltf) {\r\n scene.extras = this._babylonScene.metadata.gltf.extras;\r\n }\r\n }\r\n\r\n // TODO:\r\n // deal with this from the loader:\r\n // babylonMaterial.invertNormalMapX = !this._babylonScene.useRightHandedSystem;\r\n // babylonMaterial.invertNormalMapY = this._babylonScene.useRightHandedSystem;\r\n\r\n const rootNodesRH = new Array<Node>();\r\n const rootNodesLH = new Array<Node>();\r\n const rootNoopNodesRH = new Array<Node>();\r\n\r\n for (const rootNode of this._babylonScene.rootNodes) {\r\n if (this._options.removeNoopRootNodes && !this._options.includeCoordinateSystemConversionNodes && IsNoopNode(rootNode, this._babylonScene.useRightHandedSystem)) {\r\n rootNoopNodesRH.push(...rootNode.getChildren());\r\n } else if (this._babylonScene.useRightHandedSystem) {\r\n rootNodesRH.push(rootNode);\r\n } else {\r\n rootNodesLH.push(rootNode);\r\n }\r\n }\r\n\r\n this._listAvailableCameras();\r\n this._listAvailableSkeletons();\r\n\r\n const stateLH = new ExporterState(true, false);\r\n scene.nodes.push(...(await this._exportNodesAsync(rootNodesLH, stateLH)));\r\n const stateRH = new ExporterState(false, false);\r\n scene.nodes.push(...(await this._exportNodesAsync(rootNodesRH, stateRH)));\r\n const noopRH = new ExporterState(false, true);\r\n scene.nodes.push(...(await this._exportNodesAsync(rootNoopNodesRH, noopRH)));\r\n\r\n if (scene.nodes.length) {\r\n this._scenes.push(scene);\r\n }\r\n\r\n this._exportAndAssignCameras();\r\n this._exportAndAssignSkeletons();\r\n\r\n if (this._babylonScene.animationGroups.length) {\r\n _GLTFAnimation._CreateNodeAndMorphAnimationFromAnimationGroups(\r\n this._babylonScene,\r\n this._animations,\r\n this._nodeMap,\r\n this._dataWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\r\n stateLH.getNodesSet()\r\n );\r\n }\r\n }\r\n\r\n private _shouldExportNode(babylonNode: Node): boolean {\r\n let result = this._shouldExportNodeMap.get(babylonNode);\r\n\r\n if (result === undefined) {\r\n result = this._options.shouldExportNode(babylonNode);\r\n this._shouldExportNodeMap.set(babylonNode, result);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private async _exportNodesAsync(babylonRootNodes: Node[], state: ExporterState): Promise<number[]> {\r\n const nodes = new Array<number>();\r\n\r\n this._exportBuffers(babylonRootNodes, state);\r\n\r\n for (const babylonNode of babylonRootNodes) {\r\n await this._exportNodeAsync(babylonNode, nodes, state);\r\n }\r\n\r\n return nodes;\r\n }\r\n\r\n private _collectBuffers(\r\n babylonNode: Node,\r\n bufferToVertexBuffersMap: Map<Buffer, VertexBuffer[]>,\r\n vertexBufferToMeshesMap: Map<VertexBuffer, Mesh[]>,\r\n morphTargetsToMeshesMap: Map<MorphTarget, Mesh[]>,\r\n state: ExporterState\r\n ): void {\r\n if (this._shouldExportNode(babylonNode) && babylonNode instanceof Mesh && babylonNode.geometry) {\r\n const vertexBuffers = babylonNode.geometry.getVertexBuffers();\r\n if (vertexBuffers) {\r\n for (const kind in vertexBuffers) {\r\n const vertexBuffer = vertexBuffers[kind];\r\n state.setHasVertexColorAlpha(vertexBuffer, babylonNode.hasVertexAlpha);\r\n const buffer = vertexBuffer._buffer;\r\n const vertexBufferArray = bufferToVertexBuffersMap.get(buffer) || [];\r\n bufferToVertexBuffersMap.set(buffer, vertexBufferArray);\r\n if (vertexBufferArray.indexOf(vertexBuffer) === -1) {\r\n vertexBufferArray.push(vertexBuffer);\r\n }\r\n\r\n const meshes = vertexBufferToMeshesMap.get(vertexBuffer) || [];\r\n vertexBufferToMeshesMap.set(vertexBuffer, meshes);\r\n if (meshes.indexOf(babylonNode) === -1) {\r\n meshes.push(babylonNode);\r\n }\r\n }\r\n }\r\n\r\n const morphTargetManager = babylonNode.morphTargetManager;\r\n\r\n if (morphTargetManager) {\r\n for (let morphIndex = 0; morphIndex < morphTargetManager.numTargets; morphIndex++) {\r\n const morphTarget = morphTargetManager.getTarget(morphIndex);\r\n\r\n const meshes = morphTargetsToMeshesMap.get(morphTarget) || [];\r\n morphTargetsToMeshesMap.set(morphTarget, meshes);\r\n if (meshes.indexOf(babylonNode) === -1) {\r\n meshes.push(babylonNode);\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const babylonChildNode of babylonNode.getChildren()) {\r\n this._collectBuffers(babylonChildNode, bufferToVertexBuffersMap, vertexBufferToMeshesMap, morphTargetsToMeshesMap, state);\r\n }\r\n }\r\n\r\n private _exportBuffers(babylonRootNodes: Node[], state: ExporterState): void {\r\n const bufferToVertexBuffersMap = new Map<Buffer, VertexBuffer[]>();\r\n const vertexBufferToMeshesMap = new Map<VertexBuffer, Mesh[]>();\r\n const morphTagetsMeshesMap = new Map<MorphTarget, Mesh[]>();\r\n\r\n for (const babylonNode of babylonRootNodes) {\r\n this._collectBuffers(babylonNode, bufferToVertexBuffersMap, vertexBufferToMeshesMap, morphTagetsMeshesMap, state);\r\n }\r\n\r\n const buffers = Array.from(bufferToVertexBuffersMap.keys());\r\n\r\n for (const buffer of buffers) {\r\n const data = buffer.getData();\r\n if (!data) {\r\n throw new Error(\"Buffer data is not available\");\r\n }\r\n\r\n const vertexBuffers = bufferToVertexBuffersMap.get(buffer);\r\n\r\n if (!vertexBuffers) {\r\n continue;\r\n }\r\n\r\n const byteStride = vertexBuffers[0].byteStride;\r\n if (vertexBuffers.some((vertexBuffer) => vertexBuffer.byteStride !== byteStride)) {\r\n throw new Error(\"Vertex buffers pointing to the same buffer must have the same byte stride\");\r\n }\r\n\r\n const bytes = DataArrayToUint8Array(data).slice();\r\n\r\n // Apply conversions to buffer data in-place.\r\n for (const vertexBuffer of vertexBuffers) {\r\n const { byteOffset, byteStride, type, normalized } = vertexBuffer;\r\n const size = vertexBuffer.getSize();\r\n const meshes = vertexBufferToMeshesMap.get(vertexBuffer)!;\r\n const maxTotalVertices = meshes.reduce((max, current) => {\r\n return current.getTotalVertices() > max ? current.getTotalVertices() : max;\r\n }, -Number.MAX_VALUE); // To ensure nothing is missed when enumerating, but may not be necessary.\r\n\r\n switch (vertexBuffer.getKind()) {\r\n // Normalize normals and tangents.\r\n case VertexBuffer.NormalKind:\r\n case VertexBuffer.TangentKind: {\r\n EnumerateFloatValues(bytes, byteOffset, byteStride, size, type, maxTotalVertices * size, normalized, (values) => {\r\n const invLength = 1 / Math.sqrt(values[0] * values[0] + values[1] * values[1] + values[2] * values[2]);\r\n values[0] *= invLength;\r\n values[1] *= invLength;\r\n values[2] *= invLength;\r\n });\r\n break;\r\n }\r\n // Convert StandardMaterial vertex colors from gamma to linear space.\r\n case VertexBuffer.ColorKind: {\r\n const stdMaterialCount = meshes.filter((mesh) => mesh.material instanceof StandardMaterial || mesh.material == null).length;\r\n\r\n if (stdMaterialCount == 0) {\r\n break; // Buffer not used by StandardMaterials, so no conversion needed.\r\n }\r\n\r\n // TODO: Implement this case.\r\n if (stdMaterialCount != meshes.length) {\r\n Logger.Warn(\"Not converting vertex color space, as buffer is shared by StandardMaterials and other material types. Results may look incorrect.\");\r\n break;\r\n }\r\n\r\n if (type == VertexBuffer.UNSIGNED_BYTE) {\r\n Logger.Warn(\"Converting uint8 vertex colors to linear space. Results may look incorrect.\");\r\n }\r\n\r\n const vertexData3 = new Color3();\r\n const vertexData4 = new Color4();\r\n const useExactSrgbConversions = this._babylonScene.getEngine().useExactSrgbConversions;\r\n\r\n EnumerateFloatValues(bytes, byteOffset, byteStride, size, type, maxTotalVertices * size, normalized, (values) => {\r\n // Using separate Color3 and Color4 objects to ensure the right functions are called.\r\n if (values.length === 3) {\r\n vertexData3.fromArray(values, 0);\r\n vertexData3.toLinearSpaceToRef(vertexData3, useExactSrgbConversions);\r\n vertexData3.toArray(values, 0);\r\n } else {\r\n vertexData4.fromArray(values, 0);\r\n vertexData4.toLinearSpaceToRef(vertexData4, useExactSrgbConversions);\r\n vertexData4.toArray(values, 0);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Performs coordinate conversion if needed (only for position, normal and tanget).\r\n if (state.convertToRightHanded) {\r\n for (const vertexBuffer of vertexBuffers) {\r\n switch (vertexBuffer.getKind()) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind:\r\n case VertexBuffer.TangentKind: {\r\n for (const mesh of vertexBufferToMeshesMap.get(vertexBuffer)!) {\r\n const { byteOffset, byteStride, type, normalized } = vertexBuffer;\r\n const size = vertexBuffer.getSize();\r\n EnumerateFloatValues(bytes, byteOffset, byteStride, size, type, mesh.getTotalVertices() * size, normalized, (values) => {\r\n values[0] = -values[0];\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Save converted bytes for min/max computation.\r\n state.convertedToRightHandedBuffers.set(buffer, bytes);\r\n }\r\n\r\n const byteOffset = this._dataWriter.byteOffset;\r\n this._dataWriter.writeUint8Array(bytes);\r\n this._bufferViews.push(CreateBufferView(0, byteOffset, bytes.length, byteStride));\r\n state.setVertexBufferView(buffer, this._bufferViews.length - 1);\r\n\r\n const floatMatricesIndices = new Map<VertexBuffer, FloatArray>();\r\n\r\n // If buffers are of type MatricesWeightsKind and have float values, we need to create a new buffer instead.\r\n for (const vertexBuffer of vertexBuffers) {\r\n switch (vertexBuffer.getKind()) {\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind: {\r\n if (vertexBuffer.type == VertexBuffer.FLOAT) {\r\n for (const mesh of vertexBufferToMeshesMap.get(vertexBuffer)!) {\r\n const floatData = vertexBuffer.getFloatData(mesh.getTotalVertices());\r\n if (floatData !== null) {\r\n floatMatricesIndices.set(vertexBuffer, floatData);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (floatMatricesIndices.size !== 0) {\r\n Logger.Warn(\r\n `Joints conversion needed: some joints are stored as floats in Babylon but GLTF requires UNSIGNED BYTES. We will perform the conversion but this might lead to unused data in the buffer.`\r\n );\r\n }\r\n\r\n const floatArrayVertexBuffers = Array.from(floatMatricesIndices.keys());\r\n\r\n for (const vertexBuffer of floatArrayVertexBuffers) {\r\n const array = floatMatricesIndices.get(vertexBuffer);\r\n\r\n if (!array) {\r\n continue;\r\n }\r\n\r\n const byteOffset = this._dataWriter.byteOffset;\r\n if (FloatsNeed16BitInteger(array)) {\r\n const newArray = new Uint16Array(array.length);\r\n for (let index = 0; index < array.length; index++) {\r\n newArray[index] = array[index];\r\n }\r\n this._dataWriter.writeUint16Array(newArray);\r\n this._bufferViews.push(CreateBufferView(0, byteOffset, newArray.byteLength, 4 * 2));\r\n } else {\r\n const newArray = new Uint8Array(array.length);\r\n for (let index = 0; index < array.length; index++) {\r\n newArray[index] = array[index];\r\n }\r\n this._dataWriter.writeUint8Array(newArray);\r\n this._bufferViews.push(CreateBufferView(0, byteOffset, newArray.byteLength, 4));\r\n }\r\n\r\n state.setRemappedBufferView(buffer, vertexBuffer, this._bufferViews.length - 1);\r\n }\r\n }\r\n\r\n const morphTargets = Array.from(morphTagetsMeshesMap.keys());\r\n\r\n for (const morphTarget of morphTargets) {\r\n const meshes = morphTagetsMeshesMap.get(morphTarget);\r\n\r\n if (!meshes) {\r\n continue;\r\n }\r\n\r\n const glTFMorphTarget = BuildMorphTargetBuffers(morphTarget, meshes[0], this._dataWriter, this._bufferViews, this._accessors, state.convertToRightHanded);\r\n\r\n for (const mesh of meshes) {\r\n state.bindMorphDataToMesh(mesh, glTFMorphTarget);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Processes a node to be exported to the glTF file\r\n * @returns A promise that resolves once the node has been exported\r\n * @internal\r\n */\r\n private async _exportNodeAsync(babylonNode: Node, parentNodeChildren: Array<number>, state: ExporterState): Promise<void> {\r\n let nodeIndex = this._nodeMap.get(babylonNode);\r\n if (nodeIndex !== undefined) {\r\n if (!parentNodeChildren.includes(nodeIndex)) {\r\n parentNodeChildren.push(nodeIndex);\r\n }\r\n return;\r\n }\r\n\r\n const node = await this._createNodeAsync(babylonNode, state);\r\n\r\n if (node) {\r\n nodeIndex = this._nodes.length;\r\n this._nodes.push(node);\r\n this._nodeMap.set(babylonNode, nodeIndex);\r\n state.pushExportedNode(babylonNode);\r\n parentNodeChildren.push(nodeIndex);\r\n\r\n // Process node's animations once the node has been added to nodeMap (TODO: This should be refactored)\r\n const runtimeGLTFAnimation: IAnimation = {\r\n name: \"runtime animations\",\r\n channels: [],\r\n samplers: [],\r\n };\r\n const idleGLTFAnimations: IAnimation[] = [];\r\n\r\n if (!this._babylonScene.animationGroups.length) {\r\n _GLTFAnimation._CreateMorphTargetAnimationFromMorphTargetAnimations(\r\n babylonNode,\r\n runtimeGLTFAnimation,\r\n idleGLTFAnimations,\r\n this._nodeMap,\r\n this._nodes,\r\n this._dataWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\r\n state.convertToRightHanded,\r\n this._options.shouldExportAnimation\r\n );\r\n if (babylonNode.animations.length) {\r\n _GLTFAnimation._CreateNodeAnimationFromNodeAnimations(\r\n babylonNode,\r\n runtimeGLTFAnimation,\r\n idleGLTFAnimations,\r\n this._nodeMap,\r\n this._nodes,\r\n this._dataWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\r\n state.convertToRightHanded,\r\n this._options.shouldExportAnimation\r\n );\r\n }\r\n }\r\n\r\n if (runtimeGLTFAnimation.channels.length && runtimeGLTFAnimation.samplers.length) {\r\n this._animations.push(runtimeGLTFAnimation);\r\n }\r\n idleGLTFAnimations.forEach((idleGLTFAnimation) => {\r\n if (idleGLTFAnimation.channels.length && idleGLTFAnimation.samplers.length) {\r\n this._animations.push(idleGLTFAnimation);\r\n }\r\n });\r\n }\r\n\r\n // Begin processing child nodes once parent has been added to the node list\r\n const children = node ? [] : parentNodeChildren;\r\n for (const babylonChildNode of babylonNode.getChildren()) {\r\n await this._exportNodeAsync(babylonChildNode, children, state);\r\n }\r\n\r\n if (node && children.length) {\r\n node.children = children;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a glTF node from a Babylon.js node. If skipped, returns null.\r\n * @internal\r\n */\r\n private async _createNodeAsync(babylonNode: Node, state: ExporterState): Promise<Nullable<INode>> {\r\n if (!this._shouldExportNode(babylonNode)) {\r\n return null;\r\n }\r\n\r\n const node: INode = {};\r\n\r\n if (babylonNode.name) {\r\n node.name = babylonNode.name;\r\n }\r\n\r\n if (babylonNode instanceof TransformNode) {\r\n this._setNodeTransformation(node, babylonNode, state.convertToRightHanded);\r\n\r\n if (babylonNode instanceof Mesh || babylonNode instanceof InstancedMesh) {\r\n const babylonMesh = babylonNode instanceof Mesh ? babylonNode : babylonNode.sourceMesh;\r\n if (babylonMesh.subMeshes && babylonMesh.subMeshes.length > 0) {\r\n node.mesh = await this._exportMeshAsync(babylonMesh, state);\r\n }\r\n\r\n if (babylonNode.skeleton) {\r\n const skin = this._skinMap.get(babylonNode.skeleton);\r\n\r\n if (skin !== undefined) {\r\n if (this._nodesSkinMap.get(skin) === undefined) {\r\n this._nodesSkinMap.set(skin, []);\r\n }\r\n\r\n this._nodesSkinMap.get(skin)?.push(node);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (babylonNode instanceof Camera) {\r\n const gltfCamera = this._camerasMap.get(babylonNode);\r\n\r\n if (gltfCamera) {\r\n if (this._nodesCameraMap.get(gltfCamera) === undefined) {\r\n this._nodesCameraMap.set(gltfCamera, []);\r\n }\r\n\r\n const parentBabylonNode = babylonNode.parent;\r\n this._setCameraTransformation(node, babylonNode, state.convertToRightHanded, parentBabylonNode);\r\n\r\n // If a camera has a node that was added by the GLTF importer, we can just use the parent node transform as the \"camera\" transform.\r\n if (parentBabylonNode && IsParentAddedByImporter(babylonNode, parentBabylonNode)) {\r\n const parentNodeIndex = this._nodeMap.get(parentBabylonNode);\r\n if (parentNodeIndex) {\r\n const parentNode = this._nodes[parentNodeIndex];\r\n this._nodesCameraMap.get(gltfCamera)?.push(parentNode);\r\n return null; // Skip exporting this node\r\n }\r\n }\r\n if (state.convertToRightHanded) {\r\n ConvertToRightHandedNode(node);\r\n RotateNode180Y(node);\r\n }\r\n this._nodesCameraMap.get(gltfCamera)?.push(node);\r\n }\r\n }\r\n\r\n // Apply extensions to the node. If this resolves to null, it means we should skip exporting this node\r\n const processedNode = await this._extensionsPostExportNodeAsync(\"exportNodeAsync\", node, babylonNode, this._nodeMap, state.convertToRightHanded);\r\n if (!processedNode) {\r\n Logger.Warn(`Not exporting node ${babylonNode.name}`);\r\n return null;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n private _exportIndices(\r\n indices: Nullable<IndicesArray>,\r\n start: number,\r\n count: number,\r\n offset: number,\r\n fillMode: number,\r\n sideOrientation: number,\r\n state: ExporterState,\r\n primitive: IMeshPrimitive\r\n ): void {\r\n const is32Bits = AreIndices32Bits(indices, count);\r\n let indicesToExport = indices;\r\n\r\n primitive.mode = GetPrimitiveMode(fillMode);\r\n\r\n // Flip if triangle winding order is not CCW as glTF is always CCW.\r\n const invertedMaterial = sideOrientation !== Material.CounterClockWiseSideOrientation;\r\n\r\n const flipWhenInvertedMaterial = !state.wasAddedByNoopNode && invertedMaterial;\r\n\r\n const flip = IsTriangleFillMode(fillMode) && flipWhenInvertedMaterial;\r\n\r\n if (flip) {\r\n if (fillMode === Material.TriangleStripDrawMode || fillMode === Material.TriangleFanDrawMode) {\r\n throw new Error(\"Triangle strip/fan fill mode is not implemented\");\r\n }\r\n\r\n primitive.mode = GetPrimitiveMode(fillMode);\r\n\r\n const newIndices = is32Bits ? new Uint32Array(count) : new Uint16Array(count);\r\n\r\n if (indices) {\r\n for (let i = 0; i + 2 < count; i += 3) {\r\n newIndices[i] = indices[start + i] + offset;\r\n newIndices[i + 1] = indices[start + i + 2] + offset;\r\n newIndices[i + 2] = indices[start + i + 1] + offset;\r\n }\r\n } else {\r\n for (let i = 0; i + 2 < count; i += 3) {\r\n newIndices[i] = i;\r\n newIndices[i + 1] = i + 2;\r\n newIndices[i + 2] = i + 1;\r\n }\r\n }\r\n\r\n indicesToExport = newIndices;\r\n } else if (indices && offset !== 0) {\r\n const newIndices = is32Bits ? new Uint32Array(count) : new Uint16Array(count);\r\n for (let i = 0; i < count; i++) {\r\n newIndices[i] = indices[start + i] + offset;\r\n }\r\n\r\n indicesToExport = newIndices;\r\n }\r\n\r\n if (indicesToExport) {\r\n let accessorIndex = state.getIndicesAccessor(indices, start, count, offset, flip);\r\n if (accessorIndex === undefined) {\r\n const bufferViewByteOffset = this._dataWriter.byteOffset;\r\n const bytes = IndicesArrayToUint8Array(indicesToExport, start, count, is32Bits);\r\n this._dataWriter.writeUint8Array(bytes);\r\n this._bufferViews.push(CreateBufferView(0, bufferViewByteOffset, bytes.length));\r\n const bufferViewIndex = this._bufferViews.length - 1;\r\n\r\n const componentType = is32Bits ? AccessorComponentType.UNSIGNED_INT : AccessorComponentType.UNSIGNED_SHORT;\r\n this._accessors.push(CreateAccessor(bufferViewIndex, AccessorType.SCALAR, componentType, count, 0));\r\n accessorIndex = this._accessors.length - 1;\r\n state.setIndicesAccessor(indices, start, count, offset, flip, accessorIndex);\r\n }\r\n\r\n primitive.indices = accessorIndex;\r\n }\r\n }\r\n\r\n private _exportVertexBuffer(vertexBuffer: VertexBuffer, babylonMaterial: Material, start: number, count: number, state: ExporterState, primitive: IMeshPrimitive): void {\r\n const kind = vertexBuffer.getKind();\r\n\r\n if (!IsStandardVertexAttribute(kind)) {\r\n return;\r\n }\r\n\r\n if (kind.startsWith(\"uv\") && !this._options.exportUnusedUVs) {\r\n if (!babylonMaterial || !this._materialNeedsUVsSet.has(babylonMaterial)) {\r\n return;\r\n }\r\n }\r\n\r\n let accessorIndex = state.getVertexAccessor(vertexBuffer, start, count);\r\n\r\n if (accessorIndex === undefined) {\r\n // Get min/max from converted or original data.\r\n const data = state.convertedToRightHandedBuffers.get(vertexBuffer._buffer) || vertexBuffer._buffer.getData()!;\r\n const minMax = kind === VertexBuffer.PositionKind ? GetMinMax(data, vertexBuffer, start, count) : null;\r\n\r\n if ((kind === VertexBuffer.MatricesIndicesKind || kind === VertexBuffer.MatricesIndicesExtraKind) && vertexBuffer.type === VertexBuffer.FLOAT) {\r\n const bufferViewIndex = state.getRemappedBufferView(vertexBuffer._buffer, vertexBuffer);\r\n if (bufferViewIndex !== undefined) {\r\n const byteOffset = vertexBuffer.byteOffset + start * vertexBuffer.byteStride;\r\n this._accessors.push(\r\n CreateAccessor(bufferViewIndex, GetAccessorType(kind, state.hasVertexColorAlpha(vertexBuffer)), VertexBuffer.UNSIGNED_BYTE, count, byteOffset, minMax)\r\n );\r\n accessorIndex = this._accessors.length - 1;\r\n state.setVertexAccessor(vertexBuffer, start, count, accessorIndex);\r\n primitive.attributes[GetAttributeType(kind)] = accessorIndex;\r\n }\r\n } else {\r\n const bufferViewIndex = state.getVertexBufferView(vertexBuffer._buffer)!;\r\n const byteOffset = vertexBuffer.byteOffset + start * vertexBuffer.byteStride;\r\n this._accessors.push(\r\n CreateAccessor(\r\n bufferViewIndex,\r\n GetAccessorType(kind, state.hasVertexColorAlpha(vertexBuffer)),\r\n vertexBuffer.type,\r\n count,\r\n byteOffset,\r\n minMax,\r\n vertexBuffer.normalized // TODO: Find other places where this is needed.\r\n )\r\n );\r\n accessorIndex = this._accessors.length - 1;\r\n state.setVertexAccessor(vertexBuffer, start, count, accessorIndex);\r\n primitive.attributes[GetAttributeType(kind)] = accessorIndex;\r\n }\r\n } else {\r\n primitive.attributes[GetAttributeType(kind)] = accessorIndex;\r\n }\r\n }\r\n\r\n private async _exportMaterialAsync(babylonMaterial: Material, vertexBuffers: { [kind: string]: VertexBuffer }, subMesh: SubMesh, primitive: IMeshPrimitive): Promise<void> {\r\n let materialIndex = this._materialMap.get(babylonMaterial);\r\n if (materialIndex === undefined) {\r\n const hasUVs = vertexBuffers && Object.keys(vertexBuffers).some((kind) => kind.startsWith(\"uv\"));\r\n babylonMaterial = babylonMaterial instanceof MultiMaterial ? babylonMaterial.subMaterials[subMesh.materialIndex]! : babylonMaterial;\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n materialIndex = await this._materialExporter.exportPBRMaterialAsync(babylonMaterial, ImageMimeType.PNG, hasUVs);\r\n } else if (babylonMaterial instanceof StandardMaterial) {\r\n materialIndex = await this._materialExporter.exportStandardMaterialAsync(babylonMaterial, ImageMimeType.PNG, hasUVs);\r\n } else {\r\n Logger.Warn(`Unsupported material '${babylonMaterial.name}' with type ${babylonMaterial.getClassName()}`);\r\n return;\r\n }\r\n\r\n this._materialMap.set(babylonMaterial, materialIndex);\r\n }\r\n\r\n primitive.material = materialIndex;\r\n }\r\n\r\n private async _exportMeshAsync(babylonMesh: Mesh, state: ExporterState): Promise<number> {\r\n let meshIndex = state.getMesh(babylonMesh);\r\n if (meshIndex !== undefined) {\r\n return meshIndex;\r\n }\r\n\r\n const mesh: IMesh = { primitives: [] };\r\n meshIndex = this._meshes.length;\r\n this._meshes.push(mesh);\r\n state.setMesh(babylonMesh, meshIndex);\r\n\r\n const indices = babylonMesh.isUnIndexed ? null : babylonMesh.getIndices();\r\n const vertexBuffers = babylonMesh.geometry?.getVertexBuffers();\r\n const morphTargets = state.getMorphTargetsFromMesh(babylonMesh);\r\n\r\n let isLinesMesh = false;\r\n\r\n if (babylonMesh instanceof LinesMesh) {\r\n isLinesMesh = true;\r\n }\r\n\r\n const subMeshes = babylonMesh.subMeshes;\r\n if (vertexBuffers && subMeshes && subMeshes.length > 0) {\r\n for (const subMesh of subMeshes) {\r\n const primitive: IMeshPrimitive = { attributes: {} };\r\n\r\n const babylonMaterial = subMesh.getMaterial() || this._babylonScene.defaultMaterial;\r\n\r\n // Special case for LinesMesh\r\n if (isLinesMesh) {\r\n const material: IMaterial = {\r\n name: babylonMaterial.name,\r\n };\r\n\r\n const babylonLinesMesh = babylonMesh as LinesMesh;\r\n\r\n if (!babylonLinesMesh.color.equals(Color3.White()) || babylonLinesMesh.alpha < 1) {\r\n material.pbrMetallicRoughness = {\r\n baseColorFactor: [...babylonLinesMesh.color.asArray(), babylonLinesMesh.alpha],\r\n };\r\n }\r\n\r\n this._materials.push(material);\r\n primitive.material = this._materials.length - 1;\r\n } else {\r\n // Material\r\n await this._exportMaterialAsync(babylonMaterial, vertexBuffers, subMesh, primitive);\r\n }\r\n\r\n // Index buffer\r\n const fillMode = isLinesMesh ? Material.LineListDrawMode : (babylonMesh.overrideRenderingFillMode ?? babylonMaterial.fillMode);\r\n\r\n const sideOrientation = babylonMaterial._getEffectiveOrientation(babylonMesh);\r\n\r\n this._exportIndices(indices, subMesh.indexStart, subMesh.indexCount, -subMesh.verticesStart, fillMode, sideOrientation, state, primitive);\r\n\r\n // Vertex buffers\r\n for (const vertexBuffer of Object.values(vertexBuffers)) {\r\n this._exportVertexBuffer(vertexBuffer, babylonMaterial, subMesh.verticesStart, subMesh.verticesCount, state, primitive);\r\n }\r\n\r\n mesh.primitives.push(primitive);\r\n\r\n if (morphTargets) {\r\n primitive.targets = [];\r\n for (const gltfMorphTarget of morphTargets) {\r\n primitive.targets.push(gltfMorphTarget.attributes);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (morphTargets) {\r\n mesh.weights = [];\r\n\r\n if (!mesh.extras) {\r\n mesh.extras = {};\r\n }\r\n mesh.extras.targetNames = [];\r\n\r\n for (const gltfMorphTarget of morphTargets) {\r\n mesh.weights.push(gltfMorphTarget.influence);\r\n mesh.extras.targetNames.push(gltfMorphTarget.name);\r\n }\r\n }\r\n\r\n return meshIndex;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"glTFExporter.js","sourceRoot":"","sources":["../../../../../dev/serializers/src/glTF/2.0/glTFExporter.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n IBufferView,\r\n IAccessor,\r\n INode,\r\n IScene,\r\n IMesh,\r\n IMaterial,\r\n ITexture,\r\n IImage,\r\n ISampler,\r\n IAnimation,\r\n IMeshPrimitive,\r\n IBuffer,\r\n IGLTF,\r\n ITextureInfo,\r\n ISkin,\r\n ICamera,\r\n} from \"babylonjs-gltf2interface\";\r\nimport { AccessorComponentType, AccessorType, CameraType, ImageMimeType } from \"babylonjs-gltf2interface\";\r\n\r\nimport type { FloatArray, IndicesArray, Nullable } from \"core/types\";\r\nimport { TmpVectors, Quaternion, Matrix } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Buffer } from \"core/Buffers/buffer\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { Node } from \"core/node\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Texture } from \"core/Materials/Textures/texture\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { Engine } from \"core/Engines/engine\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\n\r\nimport type { IGLTFExporterExtensionV2 } from \"./glTFExporterExtension\";\r\nimport { GLTFMaterialExporter } from \"./glTFMaterialExporter\";\r\nimport type { IExportOptions } from \"./glTFSerializer\";\r\nimport { GLTFData } from \"./glTFData\";\r\nimport {\r\n ConvertToRightHandedPosition,\r\n ConvertToRightHandedRotation,\r\n CreateAccessor,\r\n CreateBufferView,\r\n DataArrayToUint8Array,\r\n GetAccessorType,\r\n GetAttributeType,\r\n GetMinMax,\r\n GetPrimitiveMode,\r\n IndicesArrayToUint8Array,\r\n IsNoopNode,\r\n IsTriangleFillMode,\r\n IsParentAddedByImporter,\r\n ConvertToRightHandedNode,\r\n RotateNode180Y,\r\n FloatsNeed16BitInteger,\r\n IsStandardVertexAttribute,\r\n} from \"./glTFUtilities\";\r\nimport { DataWriter } from \"./dataWriter\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { EnumerateFloatValues, AreIndices32Bits } from \"core/Buffers/bufferUtils\";\r\nimport type { Bone, Skeleton } from \"core/Bones\";\r\nimport { _GLTFAnimation } from \"./glTFAnimation\";\r\nimport type { MorphTarget } from \"core/Morph\";\r\nimport { BuildMorphTargetBuffers } from \"./glTFMorphTargetsUtilities\";\r\nimport type { IMorphTargetData } from \"./glTFMorphTargetsUtilities\";\r\nimport { LinesMesh } from \"core/Meshes/linesMesh\";\r\nimport { GreasedLineBaseMesh } from \"core/Meshes/GreasedLine/greasedLineBaseMesh\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\n\r\nclass ExporterState {\r\n // Babylon indices array, start, count, offset, flip -> glTF accessor index\r\n private _indicesAccessorMap = new Map<Nullable<IndicesArray>, Map<number, Map<number, Map<number, Map<boolean, number>>>>>();\r\n\r\n // Babylon buffer -> glTF buffer view index\r\n private _vertexBufferViewMap = new Map<Buffer, number>();\r\n\r\n // Babylon vertex buffer, start, count -> glTF accessor index\r\n private _vertexAccessorMap = new Map<VertexBuffer, Map<number, Map<number, number>>>();\r\n\r\n private _remappedBufferView = new Map<Buffer, Map<VertexBuffer, number>>();\r\n\r\n private _meshMorphTargetMap = new Map<Mesh, IMorphTargetData[]>();\r\n\r\n private _vertexMapColorAlpha = new Map<VertexBuffer, boolean>();\r\n\r\n private _exportedNodes = new Set<Node>();\r\n\r\n // Babylon mesh -> glTF mesh index\r\n private _meshMap = new Map<Mesh, number>();\r\n\r\n public constructor(convertToRightHanded: boolean, wasAddedByNoopNode: boolean) {\r\n this.convertToRightHanded = convertToRightHanded;\r\n this.wasAddedByNoopNode = wasAddedByNoopNode;\r\n }\r\n\r\n public readonly convertToRightHanded: boolean;\r\n\r\n public readonly wasAddedByNoopNode: boolean;\r\n\r\n // Only used when convertToRightHanded is true.\r\n public readonly convertedToRightHandedBuffers = new Map<Buffer, Uint8Array>();\r\n\r\n public getIndicesAccessor(indices: Nullable<IndicesArray>, start: number, count: number, offset: number, flip: boolean): number | undefined {\r\n return this._indicesAccessorMap.get(indices)?.get(start)?.get(count)?.get(offset)?.get(flip);\r\n }\r\n\r\n public setIndicesAccessor(indices: Nullable<IndicesArray>, start: number, count: number, offset: number, flip: boolean, accessorIndex: number): void {\r\n let map1 = this._indicesAccessorMap.get(indices);\r\n if (!map1) {\r\n map1 = new Map<number, Map<number, Map<number, Map<boolean, number>>>>();\r\n this._indicesAccessorMap.set(indices, map1);\r\n }\r\n\r\n let map2 = map1.get(start);\r\n if (!map2) {\r\n map2 = new Map<number, Map<number, Map<boolean, number>>>();\r\n map1.set(start, map2);\r\n }\r\n\r\n let map3 = map2.get(count);\r\n if (!map3) {\r\n map3 = new Map<number, Map<boolean, number>>();\r\n map2.set(count, map3);\r\n }\r\n\r\n let map4 = map3.get(offset);\r\n if (!map4) {\r\n map4 = new Map<boolean, number>();\r\n map3.set(offset, map4);\r\n }\r\n\r\n map4.set(flip, accessorIndex);\r\n }\r\n\r\n public pushExportedNode(node: Node) {\r\n if (!this._exportedNodes.has(node)) {\r\n this._exportedNodes.add(node);\r\n }\r\n }\r\n\r\n public getNodesSet(): Set<Node> {\r\n return this._exportedNodes;\r\n }\r\n\r\n public getVertexBufferView(buffer: Buffer): number | undefined {\r\n return this._vertexBufferViewMap.get(buffer);\r\n }\r\n\r\n public setVertexBufferView(buffer: Buffer, bufferViewIndex: number): void {\r\n this._vertexBufferViewMap.set(buffer, bufferViewIndex);\r\n }\r\n\r\n public setRemappedBufferView(buffer: Buffer, vertexBuffer: VertexBuffer, bufferViewIndex: number) {\r\n this._remappedBufferView.set(buffer, new Map<VertexBuffer, number>());\r\n this._remappedBufferView.get(buffer)!.set(vertexBuffer, bufferViewIndex);\r\n }\r\n\r\n public getRemappedBufferView(buffer: Buffer, vertexBuffer: VertexBuffer): number | undefined {\r\n return this._remappedBufferView.get(buffer)?.get(vertexBuffer);\r\n }\r\n\r\n public getVertexAccessor(vertexBuffer: VertexBuffer, start: number, count: number): number | undefined {\r\n return this._vertexAccessorMap.get(vertexBuffer)?.get(start)?.get(count);\r\n }\r\n\r\n public setVertexAccessor(vertexBuffer: VertexBuffer, start: number, count: number, accessorIndex: number): void {\r\n let map1 = this._vertexAccessorMap.get(vertexBuffer);\r\n if (!map1) {\r\n map1 = new Map<number, Map<number, number>>();\r\n this._vertexAccessorMap.set(vertexBuffer, map1);\r\n }\r\n\r\n let map2 = map1.get(start);\r\n if (!map2) {\r\n map2 = new Map<number, number>();\r\n map1.set(start, map2);\r\n }\r\n\r\n map2.set(count, accessorIndex);\r\n }\r\n\r\n public hasVertexColorAlpha(vertexBuffer: VertexBuffer): boolean {\r\n return this._vertexMapColorAlpha.get(vertexBuffer) || false;\r\n }\r\n\r\n public setHasVertexColorAlpha(vertexBuffer: VertexBuffer, hasAlpha: boolean) {\r\n return this._vertexMapColorAlpha.set(vertexBuffer, hasAlpha);\r\n }\r\n\r\n public getMesh(mesh: Mesh): number | undefined {\r\n return this._meshMap.get(mesh);\r\n }\r\n\r\n public setMesh(mesh: Mesh, meshIndex: number): void {\r\n this._meshMap.set(mesh, meshIndex);\r\n }\r\n\r\n public bindMorphDataToMesh(mesh: Mesh, morphData: IMorphTargetData) {\r\n const morphTargets = this._meshMorphTargetMap.get(mesh) || [];\r\n this._meshMorphTargetMap.set(mesh, morphTargets);\r\n if (morphTargets.indexOf(morphData) === -1) {\r\n morphTargets.push(morphData);\r\n }\r\n }\r\n\r\n public getMorphTargetsFromMesh(mesh: Mesh): IMorphTargetData[] | undefined {\r\n return this._meshMorphTargetMap.get(mesh);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class GLTFExporter {\r\n public readonly _glTF: IGLTF = {\r\n asset: { generator: `Babylon.js v${Engine.Version}`, version: \"2.0\" },\r\n };\r\n\r\n public readonly _animations: IAnimation[] = [];\r\n public readonly _accessors: IAccessor[] = [];\r\n public readonly _bufferViews: IBufferView[] = [];\r\n public readonly _cameras: ICamera[] = [];\r\n public readonly _images: IImage[] = [];\r\n public readonly _materials: IMaterial[] = [];\r\n public readonly _meshes: IMesh[] = [];\r\n public readonly _nodes: INode[] = [];\r\n public readonly _samplers: ISampler[] = [];\r\n public readonly _scenes: IScene[] = [];\r\n public readonly _skins: ISkin[] = [];\r\n public readonly _textures: ITexture[] = [];\r\n\r\n public readonly _babylonScene: Scene;\r\n public readonly _imageData: { [fileName: string]: { data: ArrayBuffer; mimeType: ImageMimeType } } = {};\r\n private readonly _orderedImageData: Array<{ data: ArrayBuffer; mimeType: ImageMimeType }> = [];\r\n\r\n /**\r\n * Baked animation sample rate\r\n */\r\n private _animationSampleRate: number;\r\n\r\n private readonly _options: Required<IExportOptions>;\r\n\r\n public readonly _materialExporter = new GLTFMaterialExporter(this);\r\n\r\n private readonly _extensions: { [name: string]: IGLTFExporterExtensionV2 } = {};\r\n\r\n private readonly _dataWriter = new DataWriter(4);\r\n\r\n private readonly _shouldExportNodeMap = new Map<Node, boolean>();\r\n\r\n // Babylon node -> glTF node index\r\n private readonly _nodeMap = new Map<Node, number>();\r\n\r\n // Babylon material -> glTF material index\r\n public readonly _materialMap = new Map<Material, number>();\r\n private readonly _camerasMap = new Map<Camera, ICamera>();\r\n private readonly _nodesCameraMap = new Map<ICamera, INode[]>();\r\n private readonly _skinMap = new Map<Skeleton, ISkin>();\r\n private readonly _nodesSkinMap = new Map<ISkin, INode[]>();\r\n\r\n // A material in this set requires UVs\r\n public readonly _materialNeedsUVsSet = new Set<Material>();\r\n\r\n private static readonly _ExtensionNames = new Array<string>();\r\n private static readonly _ExtensionFactories: { [name: string]: (exporter: GLTFExporter) => IGLTFExporterExtensionV2 } = {};\r\n\r\n private _applyExtension<T>(\r\n node: T,\r\n extensions: IGLTFExporterExtensionV2[],\r\n index: number,\r\n actionAsync: (extension: IGLTFExporterExtensionV2, node: T) => Promise<Nullable<T>> | undefined\r\n ): Promise<Nullable<T>> {\r\n if (index >= extensions.length) {\r\n return Promise.resolve(node);\r\n }\r\n\r\n const currentPromise = actionAsync(extensions[index], node);\r\n\r\n if (!currentPromise) {\r\n return this._applyExtension(node, extensions, index + 1, actionAsync);\r\n }\r\n\r\n return currentPromise.then((newNode) => (newNode ? this._applyExtension(newNode, extensions, index + 1, actionAsync) : null));\r\n }\r\n\r\n private _applyExtensions<T>(node: T, actionAsync: (extension: IGLTFExporterExtensionV2, node: T) => Promise<Nullable<T>> | undefined): Promise<Nullable<T>> {\r\n const extensions: IGLTFExporterExtensionV2[] = [];\r\n for (const name of GLTFExporter._ExtensionNames) {\r\n extensions.push(this._extensions[name]);\r\n }\r\n\r\n return this._applyExtension(node, extensions, 0, actionAsync);\r\n }\r\n\r\n public _extensionsPreExportTextureAsync(context: string, babylonTexture: Texture, mimeType: ImageMimeType): Promise<Nullable<BaseTexture>> {\r\n return this._applyExtensions(babylonTexture, (extension, node) => extension.preExportTextureAsync && extension.preExportTextureAsync(context, node, mimeType));\r\n }\r\n\r\n public _extensionsPostExportMeshPrimitiveAsync(context: string, meshPrimitive: IMeshPrimitive, babylonSubMesh: SubMesh): Promise<Nullable<IMeshPrimitive>> {\r\n return this._applyExtensions(\r\n meshPrimitive,\r\n (extension, node) => extension.postExportMeshPrimitiveAsync && extension.postExportMeshPrimitiveAsync(context, node, babylonSubMesh)\r\n );\r\n }\r\n\r\n public _extensionsPostExportNodeAsync(context: string, node: INode, babylonNode: Node, nodeMap: Map<Node, number>, convertToRightHanded: boolean): Promise<Nullable<INode>> {\r\n return this._applyExtensions(\r\n node,\r\n (extension, node) => extension.postExportNodeAsync && extension.postExportNodeAsync(context, node, babylonNode, nodeMap, convertToRightHanded, this._dataWriter)\r\n );\r\n }\r\n\r\n public _extensionsPostExportMaterialAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise<Nullable<IMaterial>> {\r\n return this._applyExtensions(material, (extension, node) => extension.postExportMaterialAsync && extension.postExportMaterialAsync(context, node, babylonMaterial));\r\n }\r\n\r\n public _extensionsPostExportMaterialAdditionalTextures(context: string, material: IMaterial, babylonMaterial: Material): BaseTexture[] {\r\n const output: BaseTexture[] = [];\r\n\r\n for (const name of GLTFExporter._ExtensionNames) {\r\n const extension = this._extensions[name];\r\n\r\n if (extension.postExportMaterialAdditionalTextures) {\r\n output.push(...extension.postExportMaterialAdditionalTextures(context, material, babylonMaterial));\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n public _extensionsPostExportTextures(context: string, textureInfo: ITextureInfo, babylonTexture: BaseTexture): void {\r\n for (const name of GLTFExporter._ExtensionNames) {\r\n const extension = this._extensions[name];\r\n\r\n if (extension.postExportTexture) {\r\n extension.postExportTexture(context, textureInfo, babylonTexture);\r\n }\r\n }\r\n }\r\n\r\n private _forEachExtensions(action: (extension: IGLTFExporterExtensionV2) => void): void {\r\n for (const name of GLTFExporter._ExtensionNames) {\r\n const extension = this._extensions[name];\r\n if (extension.enabled) {\r\n action(extension);\r\n }\r\n }\r\n }\r\n\r\n private _extensionsOnExporting(): void {\r\n this._forEachExtensions((extension) => {\r\n if (extension.wasUsed) {\r\n this._glTF.extensionsUsed ||= [];\r\n if (this._glTF.extensionsUsed.indexOf(extension.name) === -1) {\r\n this._glTF.extensionsUsed.push(extension.name);\r\n }\r\n\r\n if (extension.required) {\r\n this._glTF.extensionsRequired ||= [];\r\n if (this._glTF.extensionsRequired.indexOf(extension.name) === -1) {\r\n this._glTF.extensionsRequired.push(extension.name);\r\n }\r\n }\r\n\r\n this._glTF.extensions ||= {};\r\n if (extension.onExporting) {\r\n extension.onExporting();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _loadExtensions(): void {\r\n for (const name of GLTFExporter._ExtensionNames) {\r\n const extension = GLTFExporter._ExtensionFactories[name](this);\r\n this._extensions[name] = extension;\r\n }\r\n }\r\n\r\n public constructor(babylonScene: Nullable<Scene> = EngineStore.LastCreatedScene, options?: IExportOptions) {\r\n if (!babylonScene) {\r\n throw new Error(\"No scene available to export\");\r\n }\r\n\r\n this._babylonScene = babylonScene;\r\n\r\n this._options = {\r\n shouldExportNode: () => true,\r\n shouldExportAnimation: () => true,\r\n metadataSelector: (metadata) => metadata,\r\n animationSampleRate: 1 / 60,\r\n exportWithoutWaitingForScene: false,\r\n exportUnusedUVs: false,\r\n removeNoopRootNodes: true,\r\n includeCoordinateSystemConversionNodes: false,\r\n ...options,\r\n };\r\n\r\n this._loadExtensions();\r\n }\r\n\r\n public dispose() {\r\n for (const key in this._extensions) {\r\n const extension = this._extensions[key];\r\n extension.dispose();\r\n }\r\n }\r\n\r\n public get options() {\r\n return this._options;\r\n }\r\n\r\n public static RegisterExtension(name: string, factory: (exporter: GLTFExporter) => IGLTFExporterExtensionV2): void {\r\n if (GLTFExporter.UnregisterExtension(name)) {\r\n Tools.Warn(`Extension with the name ${name} already exists`);\r\n }\r\n\r\n GLTFExporter._ExtensionFactories[name] = factory;\r\n GLTFExporter._ExtensionNames.push(name);\r\n }\r\n\r\n public static UnregisterExtension(name: string): boolean {\r\n if (!GLTFExporter._ExtensionFactories[name]) {\r\n return false;\r\n }\r\n delete GLTFExporter._ExtensionFactories[name];\r\n\r\n const index = GLTFExporter._ExtensionNames.indexOf(name);\r\n if (index !== -1) {\r\n GLTFExporter._ExtensionNames.splice(index, 1);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _generateJSON(shouldUseGlb: boolean, bufferByteLength: number, fileName?: string, prettyPrint?: boolean): string {\r\n const buffer: IBuffer = { byteLength: bufferByteLength };\r\n let imageData: { data: ArrayBuffer; mimeType: ImageMimeType };\r\n let bufferView: IBufferView;\r\n let byteOffset: number = bufferByteLength;\r\n\r\n if (buffer.byteLength) {\r\n this._glTF.buffers = [buffer];\r\n }\r\n if (this._nodes && this._nodes.length) {\r\n this._glTF.nodes = this._nodes;\r\n }\r\n if (this._meshes && this._meshes.length) {\r\n this._glTF.meshes = this._meshes;\r\n }\r\n if (this._scenes && this._scenes.length) {\r\n this._glTF.scenes = this._scenes;\r\n this._glTF.scene = 0;\r\n }\r\n if (this._cameras && this._cameras.length) {\r\n this._glTF.cameras = this._cameras;\r\n }\r\n if (this._bufferViews && this._bufferViews.length) {\r\n this._glTF.bufferViews = this._bufferViews;\r\n }\r\n if (this._accessors && this._accessors.length) {\r\n this._glTF.accessors = this._accessors;\r\n }\r\n if (this._animations && this._animations.length) {\r\n this._glTF.animations = this._animations;\r\n }\r\n if (this._materials && this._materials.length) {\r\n this._glTF.materials = this._materials;\r\n }\r\n if (this._textures && this._textures.length) {\r\n this._glTF.textures = this._textures;\r\n }\r\n if (this._samplers && this._samplers.length) {\r\n this._glTF.samplers = this._samplers;\r\n }\r\n if (this._skins && this._skins.length) {\r\n this._glTF.skins = this._skins;\r\n }\r\n if (this._images && this._images.length) {\r\n if (!shouldUseGlb) {\r\n this._glTF.images = this._images;\r\n } else {\r\n this._glTF.images = [];\r\n\r\n this._images.forEach((image) => {\r\n if (image.uri) {\r\n imageData = this._imageData[image.uri];\r\n this._orderedImageData.push(imageData);\r\n bufferView = CreateBufferView(0, byteOffset, imageData.data.byteLength, undefined);\r\n byteOffset += imageData.data.byteLength;\r\n this._bufferViews.push(bufferView);\r\n image.bufferView = this._bufferViews.length - 1;\r\n image.name = fileName;\r\n image.mimeType = imageData.mimeType;\r\n image.uri = undefined;\r\n this._glTF.images!.push(image);\r\n }\r\n });\r\n\r\n // Replace uri with bufferview and mime type for glb\r\n buffer.byteLength = byteOffset;\r\n }\r\n }\r\n\r\n if (!shouldUseGlb) {\r\n buffer.uri = fileName + \".bin\";\r\n }\r\n\r\n return prettyPrint ? JSON.stringify(this._glTF, null, 2) : JSON.stringify(this._glTF);\r\n }\r\n\r\n public async generateGLTFAsync(glTFPrefix: string): Promise<GLTFData> {\r\n const binaryBuffer = await this._generateBinaryAsync();\r\n\r\n this._extensionsOnExporting();\r\n const jsonText = this._generateJSON(false, binaryBuffer.byteLength, glTFPrefix, true);\r\n const bin = new Blob([binaryBuffer], { type: \"application/octet-stream\" });\r\n\r\n const glTFFileName = glTFPrefix + \".gltf\";\r\n const glTFBinFile = glTFPrefix + \".bin\";\r\n\r\n const container = new GLTFData();\r\n\r\n container.files[glTFFileName] = jsonText;\r\n container.files[glTFBinFile] = bin;\r\n\r\n if (this._imageData) {\r\n for (const image in this._imageData) {\r\n container.files[image] = new Blob([this._imageData[image].data], { type: this._imageData[image].mimeType });\r\n }\r\n }\r\n\r\n return container;\r\n }\r\n\r\n private async _generateBinaryAsync(): Promise<Uint8Array> {\r\n await this._exportSceneAsync();\r\n return this._dataWriter.getOutputData();\r\n }\r\n\r\n /**\r\n * Pads the number to a multiple of 4\r\n * @param num number to pad\r\n * @returns padded number\r\n */\r\n private _getPadding(num: number): number {\r\n const remainder = num % 4;\r\n const padding = remainder === 0 ? remainder : 4 - remainder;\r\n\r\n return padding;\r\n }\r\n\r\n public async generateGLBAsync(glTFPrefix: string): Promise<GLTFData> {\r\n const binaryBuffer = await this._generateBinaryAsync();\r\n\r\n this._extensionsOnExporting();\r\n const jsonText = this._generateJSON(true, binaryBuffer.byteLength);\r\n const glbFileName = glTFPrefix + \".glb\";\r\n const headerLength = 12;\r\n const chunkLengthPrefix = 8;\r\n let jsonLength = jsonText.length;\r\n let encodedJsonText;\r\n let imageByteLength = 0;\r\n // make use of TextEncoder when available\r\n if (typeof TextEncoder !== \"undefined\") {\r\n const encoder = new TextEncoder();\r\n encodedJsonText = encoder.encode(jsonText);\r\n jsonLength = encodedJsonText.length;\r\n }\r\n for (let i = 0; i < this._orderedImageData.length; ++i) {\r\n imageByteLength += this._orderedImageData[i].data.byteLength;\r\n }\r\n const jsonPadding = this._getPadding(jsonLength);\r\n const binPadding = this._getPadding(binaryBuffer.byteLength);\r\n const imagePadding = this._getPadding(imageByteLength);\r\n\r\n const byteLength = headerLength + 2 * chunkLengthPrefix + jsonLength + jsonPadding + binaryBuffer.byteLength + binPadding + imageByteLength + imagePadding;\r\n\r\n // header\r\n const headerBuffer = new ArrayBuffer(headerLength);\r\n const headerBufferView = new DataView(headerBuffer);\r\n headerBufferView.setUint32(0, 0x46546c67, true); //glTF\r\n headerBufferView.setUint32(4, 2, true); // version\r\n headerBufferView.setUint32(8, byteLength, true); // total bytes in file\r\n\r\n // json chunk\r\n const jsonChunkBuffer = new ArrayBuffer(chunkLengthPrefix + jsonLength + jsonPadding);\r\n const jsonChunkBufferView = new DataView(jsonChunkBuffer);\r\n jsonChunkBufferView.setUint32(0, jsonLength + jsonPadding, true);\r\n jsonChunkBufferView.setUint32(4, 0x4e4f534a, true);\r\n\r\n // json chunk bytes\r\n const jsonData = new Uint8Array(jsonChunkBuffer, chunkLengthPrefix);\r\n // if TextEncoder was available, we can simply copy the encoded array\r\n if (encodedJsonText) {\r\n jsonData.set(encodedJsonText);\r\n } else {\r\n const blankCharCode = \"_\".charCodeAt(0);\r\n for (let i = 0; i < jsonLength; ++i) {\r\n const charCode = jsonText.charCodeAt(i);\r\n // if the character doesn't fit into a single UTF-16 code unit, just put a blank character\r\n if (charCode != jsonText.codePointAt(i)) {\r\n jsonData[i] = blankCharCode;\r\n } else {\r\n jsonData[i] = charCode;\r\n }\r\n }\r\n }\r\n\r\n // json padding\r\n const jsonPaddingView = new Uint8Array(jsonChunkBuffer, chunkLengthPrefix + jsonLength);\r\n for (let i = 0; i < jsonPadding; ++i) {\r\n jsonPaddingView[i] = 0x20;\r\n }\r\n\r\n // binary chunk\r\n const binaryChunkBuffer = new ArrayBuffer(chunkLengthPrefix);\r\n const binaryChunkBufferView = new DataView(binaryChunkBuffer);\r\n binaryChunkBufferView.setUint32(0, binaryBuffer.byteLength + binPadding + imageByteLength + imagePadding, true);\r\n binaryChunkBufferView.setUint32(4, 0x004e4942, true);\r\n\r\n // binary padding\r\n const binPaddingBuffer = new ArrayBuffer(binPadding);\r\n const binPaddingView = new Uint8Array(binPaddingBuffer);\r\n for (let i = 0; i < binPadding; ++i) {\r\n binPaddingView[i] = 0;\r\n }\r\n\r\n const imagePaddingBuffer = new ArrayBuffer(imagePadding);\r\n const imagePaddingView = new Uint8Array(imagePaddingBuffer);\r\n for (let i = 0; i < imagePadding; ++i) {\r\n imagePaddingView[i] = 0;\r\n }\r\n\r\n const glbData = [headerBuffer, jsonChunkBuffer, binaryChunkBuffer, binaryBuffer];\r\n\r\n // binary data\r\n for (let i = 0; i < this._orderedImageData.length; ++i) {\r\n glbData.push(this._orderedImageData[i].data);\r\n }\r\n\r\n glbData.push(binPaddingBuffer);\r\n\r\n glbData.push(imagePaddingBuffer);\r\n\r\n const glbFile = new Blob(glbData, { type: \"application/octet-stream\" });\r\n\r\n const container = new GLTFData();\r\n container.files[glbFileName] = glbFile;\r\n\r\n return container;\r\n }\r\n\r\n private _setNodeTransformation(node: INode, babylonTransformNode: TransformNode, convertToRightHanded: boolean): void {\r\n if (!babylonTransformNode.getPivotPoint().equalsToFloats(0, 0, 0)) {\r\n Tools.Warn(\"Pivot points are not supported in the glTF serializer\");\r\n }\r\n\r\n if (!babylonTransformNode.position.equalsToFloats(0, 0, 0)) {\r\n const translation = TmpVectors.Vector3[0].copyFrom(babylonTransformNode.position);\r\n if (convertToRightHanded) {\r\n ConvertToRightHandedPosition(translation);\r\n }\r\n\r\n node.translation = translation.asArray();\r\n }\r\n\r\n if (!babylonTransformNode.scaling.equalsToFloats(1, 1, 1)) {\r\n node.scale = babylonTransformNode.scaling.asArray();\r\n }\r\n\r\n const rotationQuaternion = Quaternion.FromEulerAngles(babylonTransformNode.rotation.x, babylonTransformNode.rotation.y, babylonTransformNode.rotation.z);\r\n if (babylonTransformNode.rotationQuaternion) {\r\n rotationQuaternion.multiplyInPlace(babylonTransformNode.rotationQuaternion);\r\n }\r\n if (!Quaternion.IsIdentity(rotationQuaternion)) {\r\n if (convertToRightHanded) {\r\n ConvertToRightHandedRotation(rotationQuaternion);\r\n }\r\n\r\n node.rotation = rotationQuaternion.normalize().asArray();\r\n }\r\n }\r\n\r\n private _setCameraTransformation(node: INode, babylonCamera: Camera, convertToRightHanded: boolean, parent: Nullable<Node>): void {\r\n const translation = TmpVectors.Vector3[0];\r\n const rotation = TmpVectors.Quaternion[0];\r\n\r\n if (parent !== null) {\r\n // Camera.getWorldMatrix returns global coordinates. GLTF node must use local coordinates. If camera has parent we need to use local translation/rotation.\r\n const parentWorldMatrix = Matrix.Invert(parent.getWorldMatrix());\r\n const cameraWorldMatrix = babylonCamera.getWorldMatrix();\r\n const cameraLocal = cameraWorldMatrix.multiply(parentWorldMatrix);\r\n cameraLocal.decompose(undefined, rotation, translation);\r\n } else {\r\n babylonCamera.getWorldMatrix().decompose(undefined, rotation, translation);\r\n }\r\n\r\n if (!translation.equalsToFloats(0, 0, 0)) {\r\n node.translation = translation.asArray();\r\n }\r\n\r\n if (!Quaternion.IsIdentity(rotation)) {\r\n node.rotation = rotation.asArray();\r\n }\r\n }\r\n\r\n // Export babylon cameras to glTF cameras\r\n private _listAvailableCameras(): void {\r\n for (const camera of this._babylonScene.cameras) {\r\n const glTFCamera: ICamera = {\r\n type: camera.mode === Camera.PERSPECTIVE_CAMERA ? CameraType.PERSPECTIVE : CameraType.ORTHOGRAPHIC,\r\n };\r\n\r\n if (camera.name) {\r\n glTFCamera.name = camera.name;\r\n }\r\n\r\n if (glTFCamera.type === CameraType.PERSPECTIVE) {\r\n glTFCamera.perspective = {\r\n aspectRatio: camera.getEngine().getAspectRatio(camera),\r\n yfov: camera.fovMode === Camera.FOVMODE_VERTICAL_FIXED ? camera.fov : camera.fov * camera.getEngine().getAspectRatio(camera),\r\n znear: camera.minZ,\r\n zfar: camera.maxZ,\r\n };\r\n } else if (glTFCamera.type === CameraType.ORTHOGRAPHIC) {\r\n const halfWidth = camera.orthoLeft && camera.orthoRight ? 0.5 * (camera.orthoRight - camera.orthoLeft) : camera.getEngine().getRenderWidth() * 0.5;\r\n const halfHeight = camera.orthoBottom && camera.orthoTop ? 0.5 * (camera.orthoTop - camera.orthoBottom) : camera.getEngine().getRenderHeight() * 0.5;\r\n glTFCamera.orthographic = {\r\n xmag: halfWidth,\r\n ymag: halfHeight,\r\n znear: camera.minZ,\r\n zfar: camera.maxZ,\r\n };\r\n }\r\n this._camerasMap.set(camera, glTFCamera);\r\n }\r\n }\r\n\r\n // Cleanup unused cameras and assign index to nodes.\r\n private _exportAndAssignCameras(): void {\r\n const gltfCameras = Array.from(this._camerasMap.values());\r\n for (const gltfCamera of gltfCameras) {\r\n const usedNodes = this._nodesCameraMap.get(gltfCamera);\r\n if (usedNodes !== undefined) {\r\n this._cameras.push(gltfCamera);\r\n for (const node of usedNodes) {\r\n node.camera = this._cameras.length - 1;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Builds all skins in the skins array so nodes can reference it during node parsing.\r\n private _listAvailableSkeletons(): void {\r\n for (const skeleton of this._babylonScene.skeletons) {\r\n if (skeleton.bones.length <= 0) {\r\n continue;\r\n }\r\n\r\n const skin: ISkin = { joints: [] };\r\n this._skinMap.set(skeleton, skin);\r\n }\r\n }\r\n\r\n private _exportAndAssignSkeletons() {\r\n for (const skeleton of this._babylonScene.skeletons) {\r\n if (skeleton.bones.length <= 0) {\r\n continue;\r\n }\r\n\r\n const skin = this._skinMap.get(skeleton);\r\n\r\n if (skin == undefined) {\r\n continue;\r\n }\r\n\r\n const boneIndexMap: { [index: number]: Bone } = {};\r\n const inverseBindMatrices: Matrix[] = [];\r\n\r\n let maxBoneIndex = -1;\r\n for (let i = 0; i < skeleton.bones.length; ++i) {\r\n const bone = skeleton.bones[i];\r\n const boneIndex = bone.getIndex() ?? i;\r\n if (boneIndex !== -1) {\r\n boneIndexMap[boneIndex] = bone;\r\n if (boneIndex > maxBoneIndex) {\r\n maxBoneIndex = boneIndex;\r\n }\r\n }\r\n }\r\n\r\n // Set joints index to scene node.\r\n for (let boneIndex = 0; boneIndex <= maxBoneIndex; ++boneIndex) {\r\n const bone = boneIndexMap[boneIndex];\r\n inverseBindMatrices.push(bone.getAbsoluteInverseBindMatrix());\r\n const transformNode = bone.getTransformNode();\r\n\r\n if (transformNode !== null) {\r\n const nodeID = this._nodeMap.get(transformNode);\r\n if (transformNode && nodeID !== null && nodeID !== undefined) {\r\n skin.joints.push(nodeID);\r\n } else {\r\n Tools.Warn(\"Exporting a bone without a linked transform node is currently unsupported\");\r\n }\r\n } else {\r\n Tools.Warn(\"Exporting a bone without a linked transform node is currently unsupported\");\r\n }\r\n }\r\n\r\n // Nodes that use this skin.\r\n const skinedNodes = this._nodesSkinMap.get(skin);\r\n\r\n // Only create skeleton if it has at least one joint and is used by a mesh.\r\n if (skin.joints.length > 0 && skinedNodes !== undefined) {\r\n // create buffer view for inverse bind matrices\r\n const byteStride = 64; // 4 x 4 matrix of 32 bit float\r\n const byteLength = inverseBindMatrices.length * byteStride;\r\n const bufferViewOffset = this._dataWriter.byteOffset;\r\n const bufferView = CreateBufferView(0, bufferViewOffset, byteLength, undefined);\r\n this._bufferViews.push(bufferView);\r\n const bufferViewIndex = this._bufferViews.length - 1;\r\n const bindMatrixAccessor = CreateAccessor(bufferViewIndex, AccessorType.MAT4, AccessorComponentType.FLOAT, inverseBindMatrices.length, null, null);\r\n const inverseBindAccessorIndex = this._accessors.push(bindMatrixAccessor) - 1;\r\n skin.inverseBindMatrices = inverseBindAccessorIndex;\r\n inverseBindMatrices.forEach((mat) => {\r\n mat.m.forEach((cell: number) => {\r\n this._dataWriter.writeFloat32(cell);\r\n });\r\n });\r\n\r\n this._skins.push(skin);\r\n for (const skinedNode of skinedNodes) {\r\n skinedNode.skin = this._skins.length - 1;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async _exportSceneAsync(): Promise<void> {\r\n const scene: IScene = { nodes: [] };\r\n\r\n // Scene metadata\r\n if (this._babylonScene.metadata) {\r\n if (this._options.metadataSelector) {\r\n scene.extras = this._options.metadataSelector(this._babylonScene.metadata);\r\n } else if (this._babylonScene.metadata.gltf) {\r\n scene.extras = this._babylonScene.metadata.gltf.extras;\r\n }\r\n }\r\n\r\n // TODO:\r\n // deal with this from the loader:\r\n // babylonMaterial.invertNormalMapX = !this._babylonScene.useRightHandedSystem;\r\n // babylonMaterial.invertNormalMapY = this._babylonScene.useRightHandedSystem;\r\n\r\n const rootNodesRH = new Array<Node>();\r\n const rootNodesLH = new Array<Node>();\r\n const rootNoopNodesRH = new Array<Node>();\r\n\r\n for (const rootNode of this._babylonScene.rootNodes) {\r\n if (this._options.removeNoopRootNodes && !this._options.includeCoordinateSystemConversionNodes && IsNoopNode(rootNode, this._babylonScene.useRightHandedSystem)) {\r\n rootNoopNodesRH.push(...rootNode.getChildren());\r\n } else if (this._babylonScene.useRightHandedSystem) {\r\n rootNodesRH.push(rootNode);\r\n } else {\r\n rootNodesLH.push(rootNode);\r\n }\r\n }\r\n\r\n this._listAvailableCameras();\r\n this._listAvailableSkeletons();\r\n\r\n const stateLH = new ExporterState(true, false);\r\n scene.nodes.push(...(await this._exportNodesAsync(rootNodesLH, stateLH)));\r\n const stateRH = new ExporterState(false, false);\r\n scene.nodes.push(...(await this._exportNodesAsync(rootNodesRH, stateRH)));\r\n const noopRH = new ExporterState(false, true);\r\n scene.nodes.push(...(await this._exportNodesAsync(rootNoopNodesRH, noopRH)));\r\n\r\n if (scene.nodes.length) {\r\n this._scenes.push(scene);\r\n }\r\n\r\n this._exportAndAssignCameras();\r\n this._exportAndAssignSkeletons();\r\n\r\n if (this._babylonScene.animationGroups.length) {\r\n _GLTFAnimation._CreateNodeAndMorphAnimationFromAnimationGroups(\r\n this._babylonScene,\r\n this._animations,\r\n this._nodeMap,\r\n this._dataWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\r\n stateLH.getNodesSet()\r\n );\r\n }\r\n }\r\n\r\n private _shouldExportNode(babylonNode: Node): boolean {\r\n let result = this._shouldExportNodeMap.get(babylonNode);\r\n\r\n if (result === undefined) {\r\n result = this._options.shouldExportNode(babylonNode);\r\n this._shouldExportNodeMap.set(babylonNode, result);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private async _exportNodesAsync(babylonRootNodes: Node[], state: ExporterState): Promise<number[]> {\r\n const nodes = new Array<number>();\r\n\r\n this._exportBuffers(babylonRootNodes, state);\r\n\r\n for (const babylonNode of babylonRootNodes) {\r\n await this._exportNodeAsync(babylonNode, nodes, state);\r\n }\r\n\r\n return nodes;\r\n }\r\n\r\n private _collectBuffers(\r\n babylonNode: Node,\r\n bufferToVertexBuffersMap: Map<Buffer, VertexBuffer[]>,\r\n vertexBufferToMeshesMap: Map<VertexBuffer, Mesh[]>,\r\n morphTargetsToMeshesMap: Map<MorphTarget, Mesh[]>,\r\n state: ExporterState\r\n ): void {\r\n if (this._shouldExportNode(babylonNode) && babylonNode instanceof Mesh && babylonNode.geometry) {\r\n const vertexBuffers = babylonNode.geometry.getVertexBuffers();\r\n if (vertexBuffers) {\r\n for (const kind in vertexBuffers) {\r\n const vertexBuffer = vertexBuffers[kind];\r\n state.setHasVertexColorAlpha(vertexBuffer, babylonNode.hasVertexAlpha);\r\n const buffer = vertexBuffer._buffer;\r\n const vertexBufferArray = bufferToVertexBuffersMap.get(buffer) || [];\r\n bufferToVertexBuffersMap.set(buffer, vertexBufferArray);\r\n if (vertexBufferArray.indexOf(vertexBuffer) === -1) {\r\n vertexBufferArray.push(vertexBuffer);\r\n }\r\n\r\n const meshes = vertexBufferToMeshesMap.get(vertexBuffer) || [];\r\n vertexBufferToMeshesMap.set(vertexBuffer, meshes);\r\n if (meshes.indexOf(babylonNode) === -1) {\r\n meshes.push(babylonNode);\r\n }\r\n }\r\n }\r\n\r\n const morphTargetManager = babylonNode.morphTargetManager;\r\n\r\n if (morphTargetManager) {\r\n for (let morphIndex = 0; morphIndex < morphTargetManager.numTargets; morphIndex++) {\r\n const morphTarget = morphTargetManager.getTarget(morphIndex);\r\n\r\n const meshes = morphTargetsToMeshesMap.get(morphTarget) || [];\r\n morphTargetsToMeshesMap.set(morphTarget, meshes);\r\n if (meshes.indexOf(babylonNode) === -1) {\r\n meshes.push(babylonNode);\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const babylonChildNode of babylonNode.getChildren()) {\r\n this._collectBuffers(babylonChildNode, bufferToVertexBuffersMap, vertexBufferToMeshesMap, morphTargetsToMeshesMap, state);\r\n }\r\n }\r\n\r\n private _exportBuffers(babylonRootNodes: Node[], state: ExporterState): void {\r\n const bufferToVertexBuffersMap = new Map<Buffer, VertexBuffer[]>();\r\n const vertexBufferToMeshesMap = new Map<VertexBuffer, Mesh[]>();\r\n const morphTagetsMeshesMap = new Map<MorphTarget, Mesh[]>();\r\n\r\n for (const babylonNode of babylonRootNodes) {\r\n this._collectBuffers(babylonNode, bufferToVertexBuffersMap, vertexBufferToMeshesMap, morphTagetsMeshesMap, state);\r\n }\r\n\r\n const buffers = Array.from(bufferToVertexBuffersMap.keys());\r\n\r\n for (const buffer of buffers) {\r\n const data = buffer.getData();\r\n if (!data) {\r\n throw new Error(\"Buffer data is not available\");\r\n }\r\n\r\n const vertexBuffers = bufferToVertexBuffersMap.get(buffer);\r\n\r\n if (!vertexBuffers) {\r\n continue;\r\n }\r\n\r\n const byteStride = vertexBuffers[0].byteStride;\r\n if (vertexBuffers.some((vertexBuffer) => vertexBuffer.byteStride !== byteStride)) {\r\n throw new Error(\"Vertex buffers pointing to the same buffer must have the same byte stride\");\r\n }\r\n\r\n const bytes = DataArrayToUint8Array(data).slice();\r\n\r\n // Apply conversions to buffer data in-place.\r\n for (const vertexBuffer of vertexBuffers) {\r\n const { byteOffset, byteStride, type, normalized } = vertexBuffer;\r\n const size = vertexBuffer.getSize();\r\n const meshes = vertexBufferToMeshesMap.get(vertexBuffer)!;\r\n const maxTotalVertices = meshes.reduce((max, current) => {\r\n return current.getTotalVertices() > max ? current.getTotalVertices() : max;\r\n }, -Number.MAX_VALUE); // To ensure nothing is missed when enumerating, but may not be necessary.\r\n\r\n switch (vertexBuffer.getKind()) {\r\n // Normalize normals and tangents.\r\n case VertexBuffer.NormalKind:\r\n case VertexBuffer.TangentKind: {\r\n EnumerateFloatValues(bytes, byteOffset, byteStride, size, type, maxTotalVertices * size, normalized, (values) => {\r\n const invLength = 1 / Math.sqrt(values[0] * values[0] + values[1] * values[1] + values[2] * values[2]);\r\n values[0] *= invLength;\r\n values[1] *= invLength;\r\n values[2] *= invLength;\r\n });\r\n break;\r\n }\r\n // Convert StandardMaterial vertex colors from gamma to linear space.\r\n case VertexBuffer.ColorKind: {\r\n const stdMaterialCount = meshes.filter((mesh) => mesh.material instanceof StandardMaterial || mesh.material == null).length;\r\n\r\n if (stdMaterialCount == 0) {\r\n break; // Buffer not used by StandardMaterials, so no conversion needed.\r\n }\r\n\r\n // TODO: Implement this case.\r\n if (stdMaterialCount != meshes.length) {\r\n Logger.Warn(\"Not converting vertex color space, as buffer is shared by StandardMaterials and other material types. Results may look incorrect.\");\r\n break;\r\n }\r\n\r\n if (type == VertexBuffer.UNSIGNED_BYTE) {\r\n Logger.Warn(\"Converting uint8 vertex colors to linear space. Results may look incorrect.\");\r\n }\r\n\r\n const vertexData3 = new Color3();\r\n const vertexData4 = new Color4();\r\n const useExactSrgbConversions = this._babylonScene.getEngine().useExactSrgbConversions;\r\n\r\n EnumerateFloatValues(bytes, byteOffset, byteStride, size, type, maxTotalVertices * size, normalized, (values) => {\r\n // Using separate Color3 and Color4 objects to ensure the right functions are called.\r\n if (values.length === 3) {\r\n vertexData3.fromArray(values, 0);\r\n vertexData3.toLinearSpaceToRef(vertexData3, useExactSrgbConversions);\r\n vertexData3.toArray(values, 0);\r\n } else {\r\n vertexData4.fromArray(values, 0);\r\n vertexData4.toLinearSpaceToRef(vertexData4, useExactSrgbConversions);\r\n vertexData4.toArray(values, 0);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Performs coordinate conversion if needed (only for position, normal and tanget).\r\n if (state.convertToRightHanded) {\r\n for (const vertexBuffer of vertexBuffers) {\r\n switch (vertexBuffer.getKind()) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind:\r\n case VertexBuffer.TangentKind: {\r\n for (const mesh of vertexBufferToMeshesMap.get(vertexBuffer)!) {\r\n const { byteOffset, byteStride, type, normalized } = vertexBuffer;\r\n const size = vertexBuffer.getSize();\r\n EnumerateFloatValues(bytes, byteOffset, byteStride, size, type, mesh.getTotalVertices() * size, normalized, (values) => {\r\n values[0] = -values[0];\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Save converted bytes for min/max computation.\r\n state.convertedToRightHandedBuffers.set(buffer, bytes);\r\n }\r\n\r\n const byteOffset = this._dataWriter.byteOffset;\r\n this._dataWriter.writeUint8Array(bytes);\r\n this._bufferViews.push(CreateBufferView(0, byteOffset, bytes.length, byteStride));\r\n state.setVertexBufferView(buffer, this._bufferViews.length - 1);\r\n\r\n const floatMatricesIndices = new Map<VertexBuffer, FloatArray>();\r\n\r\n // If buffers are of type MatricesWeightsKind and have float values, we need to create a new buffer instead.\r\n for (const vertexBuffer of vertexBuffers) {\r\n switch (vertexBuffer.getKind()) {\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind: {\r\n if (vertexBuffer.type == VertexBuffer.FLOAT) {\r\n for (const mesh of vertexBufferToMeshesMap.get(vertexBuffer)!) {\r\n const floatData = vertexBuffer.getFloatData(mesh.getTotalVertices());\r\n if (floatData !== null) {\r\n floatMatricesIndices.set(vertexBuffer, floatData);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (floatMatricesIndices.size !== 0) {\r\n Logger.Warn(\r\n `Joints conversion needed: some joints are stored as floats in Babylon but GLTF requires UNSIGNED BYTES. We will perform the conversion but this might lead to unused data in the buffer.`\r\n );\r\n }\r\n\r\n const floatArrayVertexBuffers = Array.from(floatMatricesIndices.keys());\r\n\r\n for (const vertexBuffer of floatArrayVertexBuffers) {\r\n const array = floatMatricesIndices.get(vertexBuffer);\r\n\r\n if (!array) {\r\n continue;\r\n }\r\n\r\n const byteOffset = this._dataWriter.byteOffset;\r\n if (FloatsNeed16BitInteger(array)) {\r\n const newArray = new Uint16Array(array.length);\r\n for (let index = 0; index < array.length; index++) {\r\n newArray[index] = array[index];\r\n }\r\n this._dataWriter.writeUint16Array(newArray);\r\n this._bufferViews.push(CreateBufferView(0, byteOffset, newArray.byteLength, 4 * 2));\r\n } else {\r\n const newArray = new Uint8Array(array.length);\r\n for (let index = 0; index < array.length; index++) {\r\n newArray[index] = array[index];\r\n }\r\n this._dataWriter.writeUint8Array(newArray);\r\n this._bufferViews.push(CreateBufferView(0, byteOffset, newArray.byteLength, 4));\r\n }\r\n\r\n state.setRemappedBufferView(buffer, vertexBuffer, this._bufferViews.length - 1);\r\n }\r\n }\r\n\r\n const morphTargets = Array.from(morphTagetsMeshesMap.keys());\r\n\r\n for (const morphTarget of morphTargets) {\r\n const meshes = morphTagetsMeshesMap.get(morphTarget);\r\n\r\n if (!meshes) {\r\n continue;\r\n }\r\n\r\n const glTFMorphTarget = BuildMorphTargetBuffers(morphTarget, meshes[0], this._dataWriter, this._bufferViews, this._accessors, state.convertToRightHanded);\r\n\r\n for (const mesh of meshes) {\r\n state.bindMorphDataToMesh(mesh, glTFMorphTarget);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Processes a node to be exported to the glTF file\r\n * @returns A promise that resolves once the node has been exported\r\n * @internal\r\n */\r\n private async _exportNodeAsync(babylonNode: Node, parentNodeChildren: Array<number>, state: ExporterState): Promise<void> {\r\n let nodeIndex = this._nodeMap.get(babylonNode);\r\n if (nodeIndex !== undefined) {\r\n if (!parentNodeChildren.includes(nodeIndex)) {\r\n parentNodeChildren.push(nodeIndex);\r\n }\r\n return;\r\n }\r\n\r\n const node = await this._createNodeAsync(babylonNode, state);\r\n\r\n if (node) {\r\n nodeIndex = this._nodes.length;\r\n this._nodes.push(node);\r\n this._nodeMap.set(babylonNode, nodeIndex);\r\n state.pushExportedNode(babylonNode);\r\n parentNodeChildren.push(nodeIndex);\r\n\r\n // Process node's animations once the node has been added to nodeMap (TODO: This should be refactored)\r\n const runtimeGLTFAnimation: IAnimation = {\r\n name: \"runtime animations\",\r\n channels: [],\r\n samplers: [],\r\n };\r\n const idleGLTFAnimations: IAnimation[] = [];\r\n\r\n if (!this._babylonScene.animationGroups.length) {\r\n _GLTFAnimation._CreateMorphTargetAnimationFromMorphTargetAnimations(\r\n babylonNode,\r\n runtimeGLTFAnimation,\r\n idleGLTFAnimations,\r\n this._nodeMap,\r\n this._nodes,\r\n this._dataWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\r\n state.convertToRightHanded,\r\n this._options.shouldExportAnimation\r\n );\r\n if (babylonNode.animations.length) {\r\n _GLTFAnimation._CreateNodeAnimationFromNodeAnimations(\r\n babylonNode,\r\n runtimeGLTFAnimation,\r\n idleGLTFAnimations,\r\n this._nodeMap,\r\n this._nodes,\r\n this._dataWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\r\n state.convertToRightHanded,\r\n this._options.shouldExportAnimation\r\n );\r\n }\r\n }\r\n\r\n if (runtimeGLTFAnimation.channels.length && runtimeGLTFAnimation.samplers.length) {\r\n this._animations.push(runtimeGLTFAnimation);\r\n }\r\n idleGLTFAnimations.forEach((idleGLTFAnimation) => {\r\n if (idleGLTFAnimation.channels.length && idleGLTFAnimation.samplers.length) {\r\n this._animations.push(idleGLTFAnimation);\r\n }\r\n });\r\n }\r\n\r\n // Begin processing child nodes once parent has been added to the node list\r\n const children = node ? [] : parentNodeChildren;\r\n for (const babylonChildNode of babylonNode.getChildren()) {\r\n await this._exportNodeAsync(babylonChildNode, children, state);\r\n }\r\n\r\n if (node && children.length) {\r\n node.children = children;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a glTF node from a Babylon.js node. If skipped, returns null.\r\n * @internal\r\n */\r\n private async _createNodeAsync(babylonNode: Node, state: ExporterState): Promise<Nullable<INode>> {\r\n if (!this._shouldExportNode(babylonNode)) {\r\n return null;\r\n }\r\n\r\n const node: INode = {};\r\n\r\n if (babylonNode.name) {\r\n node.name = babylonNode.name;\r\n }\r\n\r\n if (babylonNode instanceof TransformNode) {\r\n this._setNodeTransformation(node, babylonNode, state.convertToRightHanded);\r\n\r\n if (babylonNode instanceof Mesh || babylonNode instanceof InstancedMesh) {\r\n const babylonMesh = babylonNode instanceof Mesh ? babylonNode : babylonNode.sourceMesh;\r\n if (babylonMesh.subMeshes && babylonMesh.subMeshes.length > 0) {\r\n node.mesh = await this._exportMeshAsync(babylonMesh, state);\r\n }\r\n\r\n if (babylonNode.skeleton) {\r\n const skin = this._skinMap.get(babylonNode.skeleton);\r\n\r\n if (skin !== undefined) {\r\n if (this._nodesSkinMap.get(skin) === undefined) {\r\n this._nodesSkinMap.set(skin, []);\r\n }\r\n\r\n this._nodesSkinMap.get(skin)?.push(node);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (babylonNode instanceof Camera) {\r\n const gltfCamera = this._camerasMap.get(babylonNode);\r\n\r\n if (gltfCamera) {\r\n if (this._nodesCameraMap.get(gltfCamera) === undefined) {\r\n this._nodesCameraMap.set(gltfCamera, []);\r\n }\r\n\r\n const parentBabylonNode = babylonNode.parent;\r\n this._setCameraTransformation(node, babylonNode, state.convertToRightHanded, parentBabylonNode);\r\n\r\n // If a camera has a node that was added by the GLTF importer, we can just use the parent node transform as the \"camera\" transform.\r\n if (parentBabylonNode && IsParentAddedByImporter(babylonNode, parentBabylonNode)) {\r\n const parentNodeIndex = this._nodeMap.get(parentBabylonNode);\r\n if (parentNodeIndex) {\r\n const parentNode = this._nodes[parentNodeIndex];\r\n this._nodesCameraMap.get(gltfCamera)?.push(parentNode);\r\n return null; // Skip exporting this node\r\n }\r\n }\r\n if (state.convertToRightHanded) {\r\n ConvertToRightHandedNode(node);\r\n RotateNode180Y(node);\r\n }\r\n this._nodesCameraMap.get(gltfCamera)?.push(node);\r\n }\r\n }\r\n\r\n // Apply extensions to the node. If this resolves to null, it means we should skip exporting this node\r\n const processedNode = await this._extensionsPostExportNodeAsync(\"exportNodeAsync\", node, babylonNode, this._nodeMap, state.convertToRightHanded);\r\n if (!processedNode) {\r\n Logger.Warn(`Not exporting node ${babylonNode.name}`);\r\n return null;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n private _exportIndices(\r\n indices: Nullable<IndicesArray>,\r\n start: number,\r\n count: number,\r\n offset: number,\r\n fillMode: number,\r\n sideOrientation: number,\r\n state: ExporterState,\r\n primitive: IMeshPrimitive\r\n ): void {\r\n const is32Bits = AreIndices32Bits(indices, count);\r\n let indicesToExport = indices;\r\n\r\n primitive.mode = GetPrimitiveMode(fillMode);\r\n\r\n // Flip if triangle winding order is not CCW as glTF is always CCW.\r\n const invertedMaterial = sideOrientation !== Material.CounterClockWiseSideOrientation;\r\n\r\n const flipWhenInvertedMaterial = !state.wasAddedByNoopNode && invertedMaterial;\r\n\r\n const flip = IsTriangleFillMode(fillMode) && flipWhenInvertedMaterial;\r\n\r\n if (flip) {\r\n if (fillMode === Material.TriangleStripDrawMode || fillMode === Material.TriangleFanDrawMode) {\r\n throw new Error(\"Triangle strip/fan fill mode is not implemented\");\r\n }\r\n\r\n primitive.mode = GetPrimitiveMode(fillMode);\r\n\r\n const newIndices = is32Bits ? new Uint32Array(count) : new Uint16Array(count);\r\n\r\n if (indices) {\r\n for (let i = 0; i + 2 < count; i += 3) {\r\n newIndices[i] = indices[start + i] + offset;\r\n newIndices[i + 1] = indices[start + i + 2] + offset;\r\n newIndices[i + 2] = indices[start + i + 1] + offset;\r\n }\r\n } else {\r\n for (let i = 0; i + 2 < count; i += 3) {\r\n newIndices[i] = i;\r\n newIndices[i + 1] = i + 2;\r\n newIndices[i + 2] = i + 1;\r\n }\r\n }\r\n\r\n indicesToExport = newIndices;\r\n } else if (indices && offset !== 0) {\r\n const newIndices = is32Bits ? new Uint32Array(count) : new Uint16Array(count);\r\n for (let i = 0; i < count; i++) {\r\n newIndices[i] = indices[start + i] + offset;\r\n }\r\n\r\n indicesToExport = newIndices;\r\n }\r\n\r\n if (indicesToExport) {\r\n let accessorIndex = state.getIndicesAccessor(indices, start, count, offset, flip);\r\n if (accessorIndex === undefined) {\r\n const bufferViewByteOffset = this._dataWriter.byteOffset;\r\n const bytes = IndicesArrayToUint8Array(indicesToExport, start, count, is32Bits);\r\n this._dataWriter.writeUint8Array(bytes);\r\n this._bufferViews.push(CreateBufferView(0, bufferViewByteOffset, bytes.length));\r\n const bufferViewIndex = this._bufferViews.length - 1;\r\n\r\n const componentType = is32Bits ? AccessorComponentType.UNSIGNED_INT : AccessorComponentType.UNSIGNED_SHORT;\r\n this._accessors.push(CreateAccessor(bufferViewIndex, AccessorType.SCALAR, componentType, count, 0));\r\n accessorIndex = this._accessors.length - 1;\r\n state.setIndicesAccessor(indices, start, count, offset, flip, accessorIndex);\r\n }\r\n\r\n primitive.indices = accessorIndex;\r\n }\r\n }\r\n\r\n private _exportVertexBuffer(vertexBuffer: VertexBuffer, babylonMaterial: Material, start: number, count: number, state: ExporterState, primitive: IMeshPrimitive): void {\r\n const kind = vertexBuffer.getKind();\r\n\r\n if (!IsStandardVertexAttribute(kind)) {\r\n return;\r\n }\r\n\r\n if (kind.startsWith(\"uv\") && !this._options.exportUnusedUVs) {\r\n if (!babylonMaterial || !this._materialNeedsUVsSet.has(babylonMaterial)) {\r\n return;\r\n }\r\n }\r\n\r\n let accessorIndex = state.getVertexAccessor(vertexBuffer, start, count);\r\n\r\n if (accessorIndex === undefined) {\r\n // Get min/max from converted or original data.\r\n const data = state.convertedToRightHandedBuffers.get(vertexBuffer._buffer) || vertexBuffer._buffer.getData()!;\r\n const minMax = kind === VertexBuffer.PositionKind ? GetMinMax(data, vertexBuffer, start, count) : null;\r\n\r\n if ((kind === VertexBuffer.MatricesIndicesKind || kind === VertexBuffer.MatricesIndicesExtraKind) && vertexBuffer.type === VertexBuffer.FLOAT) {\r\n const bufferViewIndex = state.getRemappedBufferView(vertexBuffer._buffer, vertexBuffer);\r\n if (bufferViewIndex !== undefined) {\r\n const byteOffset = vertexBuffer.byteOffset + start * vertexBuffer.byteStride;\r\n this._accessors.push(\r\n CreateAccessor(bufferViewIndex, GetAccessorType(kind, state.hasVertexColorAlpha(vertexBuffer)), VertexBuffer.UNSIGNED_BYTE, count, byteOffset, minMax)\r\n );\r\n accessorIndex = this._accessors.length - 1;\r\n state.setVertexAccessor(vertexBuffer, start, count, accessorIndex);\r\n primitive.attributes[GetAttributeType(kind)] = accessorIndex;\r\n }\r\n } else {\r\n const bufferViewIndex = state.getVertexBufferView(vertexBuffer._buffer)!;\r\n const byteOffset = vertexBuffer.byteOffset + start * vertexBuffer.byteStride;\r\n this._accessors.push(\r\n CreateAccessor(\r\n bufferViewIndex,\r\n GetAccessorType(kind, state.hasVertexColorAlpha(vertexBuffer)),\r\n vertexBuffer.type,\r\n count,\r\n byteOffset,\r\n minMax,\r\n vertexBuffer.normalized // TODO: Find other places where this is needed.\r\n )\r\n );\r\n accessorIndex = this._accessors.length - 1;\r\n state.setVertexAccessor(vertexBuffer, start, count, accessorIndex);\r\n primitive.attributes[GetAttributeType(kind)] = accessorIndex;\r\n }\r\n } else {\r\n primitive.attributes[GetAttributeType(kind)] = accessorIndex;\r\n }\r\n }\r\n\r\n private async _exportMaterialAsync(babylonMaterial: Material, vertexBuffers: { [kind: string]: VertexBuffer }, subMesh: SubMesh, primitive: IMeshPrimitive): Promise<void> {\r\n let materialIndex = this._materialMap.get(babylonMaterial);\r\n if (materialIndex === undefined) {\r\n const hasUVs = vertexBuffers && Object.keys(vertexBuffers).some((kind) => kind.startsWith(\"uv\"));\r\n babylonMaterial = babylonMaterial instanceof MultiMaterial ? babylonMaterial.subMaterials[subMesh.materialIndex]! : babylonMaterial;\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n materialIndex = await this._materialExporter.exportPBRMaterialAsync(babylonMaterial, ImageMimeType.PNG, hasUVs);\r\n } else if (babylonMaterial instanceof StandardMaterial) {\r\n materialIndex = await this._materialExporter.exportStandardMaterialAsync(babylonMaterial, ImageMimeType.PNG, hasUVs);\r\n } else {\r\n Logger.Warn(`Unsupported material '${babylonMaterial.name}' with type ${babylonMaterial.getClassName()}`);\r\n return;\r\n }\r\n\r\n this._materialMap.set(babylonMaterial, materialIndex);\r\n }\r\n\r\n primitive.material = materialIndex;\r\n }\r\n\r\n private async _exportMeshAsync(babylonMesh: Mesh, state: ExporterState): Promise<number> {\r\n let meshIndex = state.getMesh(babylonMesh);\r\n if (meshIndex !== undefined) {\r\n return meshIndex;\r\n }\r\n\r\n const mesh: IMesh = { primitives: [] };\r\n meshIndex = this._meshes.length;\r\n this._meshes.push(mesh);\r\n state.setMesh(babylonMesh, meshIndex);\r\n\r\n const indices = babylonMesh.isUnIndexed ? null : babylonMesh.getIndices();\r\n const vertexBuffers = babylonMesh.geometry?.getVertexBuffers();\r\n const morphTargets = state.getMorphTargetsFromMesh(babylonMesh);\r\n\r\n const isLinesMesh = babylonMesh instanceof LinesMesh;\r\n const isGreasedLineMesh = babylonMesh instanceof GreasedLineBaseMesh;\r\n\r\n const subMeshes = babylonMesh.subMeshes;\r\n if (vertexBuffers && subMeshes && subMeshes.length > 0) {\r\n for (const subMesh of subMeshes) {\r\n const primitive: IMeshPrimitive = { attributes: {} };\r\n\r\n const babylonMaterial = subMesh.getMaterial() || this._babylonScene.defaultMaterial;\r\n\r\n if (isGreasedLineMesh) {\r\n const material: IMaterial = {\r\n name: babylonMaterial.name,\r\n };\r\n\r\n const babylonLinesMesh = babylonMesh as GreasedLineBaseMesh;\r\n\r\n const colorWhite = Color3.White();\r\n const alpha = babylonLinesMesh.material?.alpha ?? 1;\r\n const color = babylonLinesMesh.greasedLineMaterial?.color ?? colorWhite;\r\n if (!color.equals(colorWhite) || alpha < 1) {\r\n material.pbrMetallicRoughness = {\r\n baseColorFactor: [...color.asArray(), alpha],\r\n };\r\n }\r\n\r\n this._materials.push(material);\r\n primitive.material = this._materials.length - 1;\r\n } else if (isLinesMesh) {\r\n // Special case for LinesMesh\r\n const material: IMaterial = {\r\n name: babylonMaterial.name,\r\n };\r\n\r\n const babylonLinesMesh = babylonMesh as LinesMesh;\r\n\r\n if (!babylonLinesMesh.color.equals(Color3.White()) || babylonLinesMesh.alpha < 1) {\r\n material.pbrMetallicRoughness = {\r\n baseColorFactor: [...babylonLinesMesh.color.asArray(), babylonLinesMesh.alpha],\r\n };\r\n }\r\n\r\n this._materials.push(material);\r\n primitive.material = this._materials.length - 1;\r\n } else {\r\n // Material\r\n await this._exportMaterialAsync(babylonMaterial, vertexBuffers, subMesh, primitive);\r\n }\r\n\r\n // Index buffer\r\n const fillMode = isLinesMesh || isGreasedLineMesh ? Material.LineListDrawMode : (babylonMesh.overrideRenderingFillMode ?? babylonMaterial.fillMode);\r\n\r\n const sideOrientation = babylonMaterial._getEffectiveOrientation(babylonMesh);\r\n\r\n this._exportIndices(indices, subMesh.indexStart, subMesh.indexCount, -subMesh.verticesStart, fillMode, sideOrientation, state, primitive);\r\n\r\n // Vertex buffers\r\n for (const vertexBuffer of Object.values(vertexBuffers)) {\r\n this._exportVertexBuffer(vertexBuffer, babylonMaterial, subMesh.verticesStart, subMesh.verticesCount, state, primitive);\r\n }\r\n\r\n mesh.primitives.push(primitive);\r\n\r\n if (morphTargets) {\r\n primitive.targets = [];\r\n for (const gltfMorphTarget of morphTargets) {\r\n primitive.targets.push(gltfMorphTarget.attributes);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (morphTargets) {\r\n mesh.weights = [];\r\n\r\n if (!mesh.extras) {\r\n mesh.extras = {};\r\n }\r\n mesh.extras.targetNames = [];\r\n\r\n for (const gltfMorphTarget of morphTargets) {\r\n mesh.weights.push(gltfMorphTarget.influence);\r\n mesh.extras.targetNames.push(gltfMorphTarget.name);\r\n }\r\n }\r\n\r\n return meshIndex;\r\n }\r\n}\r\n"]}
@@ -61,7 +61,6 @@ export declare function CollapseParentNode(node: INode, parentNode: INode): void
61
61
  */
62
62
  export declare function IsParentAddedByImporter(babylonNode: Node, parentBabylonNode: Node): boolean;
63
63
  export declare function IsNoopNode(node: Node, useRightHandedSystem: boolean): boolean;
64
- export declare function AreIndices32Bits(indices: Nullable<IndicesArray>, count: number): boolean;
65
64
  export declare function IndicesArrayToUint8Array(indices: IndicesArray, start: number, count: number, is32Bits: boolean): Uint8Array;
66
65
  export declare function DataArrayToUint8Array(data: DataArray): Uint8Array;
67
66
  export declare function GetMinMax(data: DataArray, vertexBuffer: VertexBuffer, start: number, count: number): {
@@ -301,15 +301,6 @@ export function IsNoopNode(node, useRightHandedSystem) {
301
301
  }
302
302
  return true;
303
303
  }
304
- export function AreIndices32Bits(indices, count) {
305
- if (indices) {
306
- if (indices instanceof Array) {
307
- return indices.some((value) => value >= 65536);
308
- }
309
- return indices.BYTES_PER_ELEMENT === 4;
310
- }
311
- return count >= 65536;
312
- }
313
304
  export function IndicesArrayToUint8Array(indices, start, count, is32Bits) {
314
305
  if (indices instanceof Array) {
315
306
  const subarray = indices.slice(start, start + count);
@@ -1 +1 @@
1
- {"version":3,"file":"glTFUtilities.js","sourceRoot":"","sources":["../../../../../dev/serializers/src/glTF/2.0/glTFUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\r\n\r\nimport type { IBufferView, AccessorComponentType, IAccessor, INode } from \"babylonjs-gltf2interface\";\r\nimport { AccessorType, MeshPrimitiveMode } from \"babylonjs-gltf2interface\";\r\n\r\nimport type { FloatArray, DataArray, IndicesArray, Nullable } from \"core/types\";\r\nimport type { Vector4 } from \"core/Maths/math.vector\";\r\nimport { Quaternion, TmpVectors, Matrix, Vector3 } from \"core/Maths/math.vector\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport { EnumerateFloatValues } from \"core/Buffers/bufferUtils\";\r\nimport type { Node } from \"core/node\";\r\n\r\n// Matrix that converts handedness on the X-axis.\r\nconst convertHandednessMatrix = Matrix.Compose(new Vector3(-1, 1, 1), Quaternion.Identity(), Vector3.Zero());\r\n\r\n// 180 degrees rotation in Y.\r\nconst rotation180Y = new Quaternion(0, 1, 0, 0);\r\n\r\n// Default values for comparison.\r\nconst epsilon = 1e-6;\r\nconst defaultTranslation = Vector3.Zero();\r\nconst defaultScale = Vector3.One();\r\n\r\n/**\r\n * Creates a buffer view based on the supplied arguments\r\n * @param bufferIndex index value of the specified buffer\r\n * @param byteOffset byte offset value\r\n * @param byteLength byte length of the bufferView\r\n * @param byteStride byte distance between conequential elements\r\n * @returns bufferView for glTF\r\n */\r\nexport function CreateBufferView(bufferIndex: number, byteOffset: number, byteLength: number, byteStride?: number): IBufferView {\r\n const bufferview: IBufferView = { buffer: bufferIndex, byteLength: byteLength };\r\n\r\n if (byteOffset) {\r\n bufferview.byteOffset = byteOffset;\r\n }\r\n\r\n if (byteStride) {\r\n bufferview.byteStride = byteStride;\r\n }\r\n\r\n return bufferview;\r\n}\r\n\r\n/**\r\n * Creates an accessor based on the supplied arguments\r\n * @param bufferViewIndex The index of the bufferview referenced by this accessor\r\n * @param type The type of the accessor\r\n * @param componentType The datatype of components in the attribute\r\n * @param count The number of attributes referenced by this accessor\r\n * @param byteOffset The offset relative to the start of the bufferView in bytes\r\n * @param minMax Minimum and maximum value of each component in this attribute\r\n * @param normalized Specifies whether integer data values are normalized before usage\r\n * @returns accessor for glTF\r\n */\r\nexport function CreateAccessor(\r\n bufferViewIndex: number,\r\n type: AccessorType,\r\n componentType: AccessorComponentType,\r\n count: number,\r\n byteOffset: Nullable<number>,\r\n minMax: Nullable<{ min: number[]; max: number[] }> = null,\r\n normalized?: boolean\r\n): IAccessor {\r\n const accessor: IAccessor = { bufferView: bufferViewIndex, componentType: componentType, count: count, type: type };\r\n\r\n if (minMax != null) {\r\n accessor.min = minMax.min;\r\n accessor.max = minMax.max;\r\n }\r\n\r\n if (normalized) {\r\n accessor.normalized = normalized;\r\n }\r\n\r\n if (byteOffset != null) {\r\n accessor.byteOffset = byteOffset;\r\n }\r\n\r\n return accessor;\r\n}\r\n\r\nexport function GetAccessorElementCount(accessorType: AccessorType): number {\r\n switch (accessorType) {\r\n case AccessorType.MAT2:\r\n return 4;\r\n case AccessorType.MAT3:\r\n return 9;\r\n case AccessorType.MAT4:\r\n return 16;\r\n case AccessorType.SCALAR:\r\n return 1;\r\n case AccessorType.VEC2:\r\n return 2;\r\n case AccessorType.VEC3:\r\n return 3;\r\n case AccessorType.VEC4:\r\n return 4;\r\n }\r\n}\r\n\r\nexport function FloatsNeed16BitInteger(floatArray: FloatArray): boolean {\r\n return floatArray.some((value) => value >= 256);\r\n}\r\n\r\nexport function IsStandardVertexAttribute(type: string): boolean {\r\n switch (type) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind:\r\n case VertexBuffer.TangentKind:\r\n case VertexBuffer.ColorKind:\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n case VertexBuffer.MatricesWeightsKind:\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind:\r\n case VertexBuffer.UV3Kind:\r\n case VertexBuffer.UV4Kind:\r\n case VertexBuffer.UV5Kind:\r\n case VertexBuffer.UV6Kind:\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function GetAccessorType(kind: string, hasVertexColorAlpha: boolean): AccessorType {\r\n if (kind == VertexBuffer.ColorKind) {\r\n return hasVertexColorAlpha ? AccessorType.VEC4 : AccessorType.VEC3;\r\n }\r\n\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind:\r\n return AccessorType.VEC3;\r\n case VertexBuffer.TangentKind:\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n case VertexBuffer.MatricesWeightsKind:\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n return AccessorType.VEC4;\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind:\r\n case VertexBuffer.UV3Kind:\r\n case VertexBuffer.UV4Kind:\r\n case VertexBuffer.UV5Kind:\r\n case VertexBuffer.UV6Kind:\r\n return AccessorType.VEC2;\r\n }\r\n\r\n throw new Error(`Unknown kind ${kind}`);\r\n}\r\n\r\nexport function GetAttributeType(kind: string): string {\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n return \"POSITION\";\r\n case VertexBuffer.NormalKind:\r\n return \"NORMAL\";\r\n case VertexBuffer.TangentKind:\r\n return \"TANGENT\";\r\n case VertexBuffer.ColorKind:\r\n return \"COLOR_0\";\r\n case VertexBuffer.UVKind:\r\n return \"TEXCOORD_0\";\r\n case VertexBuffer.UV2Kind:\r\n return \"TEXCOORD_1\";\r\n case VertexBuffer.UV3Kind:\r\n return \"TEXCOORD_2\";\r\n case VertexBuffer.UV4Kind:\r\n return \"TEXCOORD_3\";\r\n case VertexBuffer.UV5Kind:\r\n return \"TEXCOORD_4\";\r\n case VertexBuffer.UV6Kind:\r\n return \"TEXCOORD_5\";\r\n case VertexBuffer.MatricesIndicesKind:\r\n return \"JOINTS_0\";\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n return \"JOINTS_1\";\r\n case VertexBuffer.MatricesWeightsKind:\r\n return \"WEIGHTS_0\";\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n return \"WEIGHTS_1\";\r\n }\r\n\r\n throw new Error(`Unknown kind: ${kind}`);\r\n}\r\n\r\nexport function GetPrimitiveMode(fillMode: number): MeshPrimitiveMode {\r\n switch (fillMode) {\r\n case Material.TriangleFillMode:\r\n return MeshPrimitiveMode.TRIANGLES;\r\n case Material.TriangleStripDrawMode:\r\n return MeshPrimitiveMode.TRIANGLE_STRIP;\r\n case Material.TriangleFanDrawMode:\r\n return MeshPrimitiveMode.TRIANGLE_FAN;\r\n case Material.PointListDrawMode:\r\n case Material.PointFillMode:\r\n return MeshPrimitiveMode.POINTS;\r\n case Material.LineLoopDrawMode:\r\n return MeshPrimitiveMode.LINE_LOOP;\r\n case Material.LineListDrawMode:\r\n return MeshPrimitiveMode.LINES;\r\n case Material.LineStripDrawMode:\r\n return MeshPrimitiveMode.LINE_STRIP;\r\n }\r\n\r\n throw new Error(`Unknown fill mode: ${fillMode}`);\r\n}\r\n\r\nexport function IsTriangleFillMode(fillMode: number): boolean {\r\n switch (fillMode) {\r\n case Material.TriangleFillMode:\r\n case Material.TriangleStripDrawMode:\r\n case Material.TriangleFanDrawMode:\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function NormalizeTangent(tangent: Vector4 | Vector3) {\r\n const length = Math.sqrt(tangent.x * tangent.x + tangent.y * tangent.y + tangent.z * tangent.z);\r\n if (length > 0) {\r\n tangent.x /= length;\r\n tangent.y /= length;\r\n tangent.z /= length;\r\n }\r\n}\r\n\r\nexport function ConvertToRightHandedPosition(value: Vector3): Vector3 {\r\n value.x *= -1;\r\n return value;\r\n}\r\n\r\nexport function ConvertToRightHandedRotation(value: Quaternion): Quaternion {\r\n value.x *= -1;\r\n value.y *= -1;\r\n return value;\r\n}\r\n\r\nexport function ConvertToRightHandedNode(value: INode) {\r\n let translation = Vector3.FromArrayToRef(value.translation || [0, 0, 0], 0, TmpVectors.Vector3[0]);\r\n let rotation = Quaternion.FromArrayToRef(value.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[0]);\r\n\r\n translation = ConvertToRightHandedPosition(translation);\r\n rotation = ConvertToRightHandedRotation(rotation);\r\n\r\n if (translation.equalsWithEpsilon(defaultTranslation, epsilon)) {\r\n delete value.translation;\r\n } else {\r\n value.translation = translation.asArray();\r\n }\r\n\r\n if (Quaternion.IsIdentity(rotation)) {\r\n delete value.rotation;\r\n } else {\r\n value.rotation = rotation.asArray();\r\n }\r\n}\r\n\r\n/**\r\n * Rotation by 180 as glTF has a different convention than Babylon.\r\n * @param rotation Target camera rotation.\r\n * @returns Ref to camera rotation.\r\n */\r\nexport function ConvertCameraRotationToGLTF(rotation: Quaternion): Quaternion {\r\n return rotation.multiplyInPlace(rotation180Y);\r\n}\r\n\r\nexport function RotateNode180Y(node: INode) {\r\n if (node.rotation) {\r\n const rotation = Quaternion.FromArrayToRef(node.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[1]);\r\n rotation180Y.multiplyToRef(rotation, rotation);\r\n node.rotation = rotation.asArray();\r\n }\r\n}\r\n\r\n/**\r\n * Collapses GLTF parent and node into a single node. This is useful for removing nodes that were added by the GLTF importer.\r\n * @param node Target parent node.\r\n * @param parentNode Original GLTF node (Light or Camera).\r\n */\r\nexport function CollapseParentNode(node: INode, parentNode: INode) {\r\n const parentTranslation = Vector3.FromArrayToRef(parentNode.translation || [0, 0, 0], 0, TmpVectors.Vector3[0]);\r\n const parentRotation = Quaternion.FromArrayToRef(parentNode.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[0]);\r\n const parentScale = Vector3.FromArrayToRef(parentNode.scale || [1, 1, 1], 0, TmpVectors.Vector3[1]);\r\n const parentMatrix = Matrix.ComposeToRef(parentScale, parentRotation, parentTranslation, TmpVectors.Matrix[0]);\r\n\r\n const translation = Vector3.FromArrayToRef(node.translation || [0, 0, 0], 0, TmpVectors.Vector3[2]);\r\n const rotation = Quaternion.FromArrayToRef(node.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[1]);\r\n const scale = Vector3.FromArrayToRef(node.scale || [1, 1, 1], 0, TmpVectors.Vector3[1]);\r\n const matrix = Matrix.ComposeToRef(scale, rotation, translation, TmpVectors.Matrix[1]);\r\n\r\n parentMatrix.multiplyToRef(matrix, matrix);\r\n matrix.decompose(parentScale, parentRotation, parentTranslation);\r\n\r\n if (parentTranslation.equalsWithEpsilon(defaultTranslation, epsilon)) {\r\n delete parentNode.translation;\r\n } else {\r\n parentNode.translation = parentTranslation.asArray();\r\n }\r\n\r\n if (Quaternion.IsIdentity(parentRotation)) {\r\n delete parentNode.rotation;\r\n } else {\r\n parentNode.rotation = parentRotation.asArray();\r\n }\r\n\r\n if (parentScale.equalsWithEpsilon(defaultScale, epsilon)) {\r\n delete parentNode.scale;\r\n } else {\r\n parentNode.scale = parentScale.asArray();\r\n }\r\n}\r\n\r\n/**\r\n * Sometimes the GLTF Importer can add extra transform nodes (for lights and cameras). This checks if a parent node was added by the GLTF Importer. If so, it should be removed during serialization.\r\n * @param babylonNode Original GLTF node (Light or Camera).\r\n * @param parentBabylonNode Target parent node.\r\n * @returns True if the parent node was added by the GLTF importer.\r\n */\r\nexport function IsParentAddedByImporter(babylonNode: Node, parentBabylonNode: Node): boolean {\r\n return parentBabylonNode instanceof TransformNode && parentBabylonNode.getChildren().length == 1 && babylonNode.getChildren().length == 0;\r\n}\r\n\r\nexport function IsNoopNode(node: Node, useRightHandedSystem: boolean): boolean {\r\n if (!(node instanceof TransformNode)) {\r\n return false;\r\n }\r\n\r\n // Transform\r\n if (useRightHandedSystem) {\r\n const matrix = node.getWorldMatrix();\r\n if (!matrix.isIdentity()) {\r\n return false;\r\n }\r\n } else {\r\n const matrix = node.getWorldMatrix().multiplyToRef(convertHandednessMatrix, TmpVectors.Matrix[0]);\r\n if (!matrix.isIdentity()) {\r\n return false;\r\n }\r\n }\r\n\r\n // Geometry\r\n if ((node instanceof Mesh && node.geometry) || (node instanceof InstancedMesh && node.sourceMesh.geometry)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function AreIndices32Bits(indices: Nullable<IndicesArray>, count: number): boolean {\r\n if (indices) {\r\n if (indices instanceof Array) {\r\n return indices.some((value) => value >= 65536);\r\n }\r\n\r\n return indices.BYTES_PER_ELEMENT === 4;\r\n }\r\n\r\n return count >= 65536;\r\n}\r\n\r\nexport function IndicesArrayToUint8Array(indices: IndicesArray, start: number, count: number, is32Bits: boolean): Uint8Array {\r\n if (indices instanceof Array) {\r\n const subarray = indices.slice(start, start + count);\r\n indices = is32Bits ? new Uint32Array(subarray) : new Uint16Array(subarray);\r\n return new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength);\r\n }\r\n\r\n return ArrayBuffer.isView(indices) ? new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength) : new Uint8Array(indices);\r\n}\r\n\r\nexport function DataArrayToUint8Array(data: DataArray): Uint8Array {\r\n if (data instanceof Array) {\r\n const floatData = new Float32Array(data);\r\n return new Uint8Array(floatData.buffer, floatData.byteOffset, floatData.byteLength);\r\n }\r\n\r\n return ArrayBuffer.isView(data) ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength) : new Uint8Array(data);\r\n}\r\n\r\nexport function GetMinMax(data: DataArray, vertexBuffer: VertexBuffer, start: number, count: number): { min: number[]; max: number[] } {\r\n const { byteOffset, byteStride, type, normalized } = vertexBuffer;\r\n const size = vertexBuffer.getSize();\r\n const min = new Array<number>(size).fill(Infinity);\r\n const max = new Array<number>(size).fill(-Infinity);\r\n EnumerateFloatValues(data, byteOffset + start * byteStride, byteStride, size, type, count * size, normalized, (values) => {\r\n for (let i = 0; i < size; i++) {\r\n min[i] = Math.min(min[i], values[i]);\r\n max[i] = Math.max(max[i], values[i]);\r\n }\r\n });\r\n\r\n return { min, max };\r\n}\r\n\r\n/**\r\n * Removes, in-place, object properties which have the same value as the default value.\r\n * Useful for avoiding unnecessary properties in the glTF JSON.\r\n * @param object the object to omit default values from\r\n * @param defaultValues a partial object with default values\r\n * @returns object with default values omitted\r\n */\r\nexport function OmitDefaultValues<T extends Object>(object: T, defaultValues: Partial<T>): T {\r\n for (const [key, value] of Object.entries(object)) {\r\n const defaultValue = defaultValues[key as keyof T];\r\n if ((Array.isArray(value) && Array.isArray(defaultValue) && AreArraysEqual(value, defaultValue)) || value === defaultValue) {\r\n delete object[key as keyof T];\r\n }\r\n }\r\n return object;\r\n}\r\n\r\nfunction AreArraysEqual(array1: unknown[], array2: unknown[]): boolean {\r\n return array1.length === array2.length && array1.every((val, i) => val === array2[i]);\r\n}\r\n"]}
1
+ {"version":3,"file":"glTFUtilities.js","sourceRoot":"","sources":["../../../../../dev/serializers/src/glTF/2.0/glTFUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\r\n\r\nimport type { IBufferView, AccessorComponentType, IAccessor, INode } from \"babylonjs-gltf2interface\";\r\nimport { AccessorType, MeshPrimitiveMode } from \"babylonjs-gltf2interface\";\r\n\r\nimport type { FloatArray, DataArray, IndicesArray, Nullable } from \"core/types\";\r\nimport type { Vector4 } from \"core/Maths/math.vector\";\r\nimport { Quaternion, TmpVectors, Matrix, Vector3 } from \"core/Maths/math.vector\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport { EnumerateFloatValues } from \"core/Buffers/bufferUtils\";\r\nimport type { Node } from \"core/node\";\r\n\r\n// Matrix that converts handedness on the X-axis.\r\nconst convertHandednessMatrix = Matrix.Compose(new Vector3(-1, 1, 1), Quaternion.Identity(), Vector3.Zero());\r\n\r\n// 180 degrees rotation in Y.\r\nconst rotation180Y = new Quaternion(0, 1, 0, 0);\r\n\r\n// Default values for comparison.\r\nconst epsilon = 1e-6;\r\nconst defaultTranslation = Vector3.Zero();\r\nconst defaultScale = Vector3.One();\r\n\r\n/**\r\n * Creates a buffer view based on the supplied arguments\r\n * @param bufferIndex index value of the specified buffer\r\n * @param byteOffset byte offset value\r\n * @param byteLength byte length of the bufferView\r\n * @param byteStride byte distance between conequential elements\r\n * @returns bufferView for glTF\r\n */\r\nexport function CreateBufferView(bufferIndex: number, byteOffset: number, byteLength: number, byteStride?: number): IBufferView {\r\n const bufferview: IBufferView = { buffer: bufferIndex, byteLength: byteLength };\r\n\r\n if (byteOffset) {\r\n bufferview.byteOffset = byteOffset;\r\n }\r\n\r\n if (byteStride) {\r\n bufferview.byteStride = byteStride;\r\n }\r\n\r\n return bufferview;\r\n}\r\n\r\n/**\r\n * Creates an accessor based on the supplied arguments\r\n * @param bufferViewIndex The index of the bufferview referenced by this accessor\r\n * @param type The type of the accessor\r\n * @param componentType The datatype of components in the attribute\r\n * @param count The number of attributes referenced by this accessor\r\n * @param byteOffset The offset relative to the start of the bufferView in bytes\r\n * @param minMax Minimum and maximum value of each component in this attribute\r\n * @param normalized Specifies whether integer data values are normalized before usage\r\n * @returns accessor for glTF\r\n */\r\nexport function CreateAccessor(\r\n bufferViewIndex: number,\r\n type: AccessorType,\r\n componentType: AccessorComponentType,\r\n count: number,\r\n byteOffset: Nullable<number>,\r\n minMax: Nullable<{ min: number[]; max: number[] }> = null,\r\n normalized?: boolean\r\n): IAccessor {\r\n const accessor: IAccessor = { bufferView: bufferViewIndex, componentType: componentType, count: count, type: type };\r\n\r\n if (minMax != null) {\r\n accessor.min = minMax.min;\r\n accessor.max = minMax.max;\r\n }\r\n\r\n if (normalized) {\r\n accessor.normalized = normalized;\r\n }\r\n\r\n if (byteOffset != null) {\r\n accessor.byteOffset = byteOffset;\r\n }\r\n\r\n return accessor;\r\n}\r\n\r\nexport function GetAccessorElementCount(accessorType: AccessorType): number {\r\n switch (accessorType) {\r\n case AccessorType.MAT2:\r\n return 4;\r\n case AccessorType.MAT3:\r\n return 9;\r\n case AccessorType.MAT4:\r\n return 16;\r\n case AccessorType.SCALAR:\r\n return 1;\r\n case AccessorType.VEC2:\r\n return 2;\r\n case AccessorType.VEC3:\r\n return 3;\r\n case AccessorType.VEC4:\r\n return 4;\r\n }\r\n}\r\n\r\nexport function FloatsNeed16BitInteger(floatArray: FloatArray): boolean {\r\n return floatArray.some((value) => value >= 256);\r\n}\r\n\r\nexport function IsStandardVertexAttribute(type: string): boolean {\r\n switch (type) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind:\r\n case VertexBuffer.TangentKind:\r\n case VertexBuffer.ColorKind:\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n case VertexBuffer.MatricesWeightsKind:\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind:\r\n case VertexBuffer.UV3Kind:\r\n case VertexBuffer.UV4Kind:\r\n case VertexBuffer.UV5Kind:\r\n case VertexBuffer.UV6Kind:\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function GetAccessorType(kind: string, hasVertexColorAlpha: boolean): AccessorType {\r\n if (kind == VertexBuffer.ColorKind) {\r\n return hasVertexColorAlpha ? AccessorType.VEC4 : AccessorType.VEC3;\r\n }\r\n\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind:\r\n return AccessorType.VEC3;\r\n case VertexBuffer.TangentKind:\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n case VertexBuffer.MatricesWeightsKind:\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n return AccessorType.VEC4;\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind:\r\n case VertexBuffer.UV3Kind:\r\n case VertexBuffer.UV4Kind:\r\n case VertexBuffer.UV5Kind:\r\n case VertexBuffer.UV6Kind:\r\n return AccessorType.VEC2;\r\n }\r\n\r\n throw new Error(`Unknown kind ${kind}`);\r\n}\r\n\r\nexport function GetAttributeType(kind: string): string {\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n return \"POSITION\";\r\n case VertexBuffer.NormalKind:\r\n return \"NORMAL\";\r\n case VertexBuffer.TangentKind:\r\n return \"TANGENT\";\r\n case VertexBuffer.ColorKind:\r\n return \"COLOR_0\";\r\n case VertexBuffer.UVKind:\r\n return \"TEXCOORD_0\";\r\n case VertexBuffer.UV2Kind:\r\n return \"TEXCOORD_1\";\r\n case VertexBuffer.UV3Kind:\r\n return \"TEXCOORD_2\";\r\n case VertexBuffer.UV4Kind:\r\n return \"TEXCOORD_3\";\r\n case VertexBuffer.UV5Kind:\r\n return \"TEXCOORD_4\";\r\n case VertexBuffer.UV6Kind:\r\n return \"TEXCOORD_5\";\r\n case VertexBuffer.MatricesIndicesKind:\r\n return \"JOINTS_0\";\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n return \"JOINTS_1\";\r\n case VertexBuffer.MatricesWeightsKind:\r\n return \"WEIGHTS_0\";\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n return \"WEIGHTS_1\";\r\n }\r\n\r\n throw new Error(`Unknown kind: ${kind}`);\r\n}\r\n\r\nexport function GetPrimitiveMode(fillMode: number): MeshPrimitiveMode {\r\n switch (fillMode) {\r\n case Material.TriangleFillMode:\r\n return MeshPrimitiveMode.TRIANGLES;\r\n case Material.TriangleStripDrawMode:\r\n return MeshPrimitiveMode.TRIANGLE_STRIP;\r\n case Material.TriangleFanDrawMode:\r\n return MeshPrimitiveMode.TRIANGLE_FAN;\r\n case Material.PointListDrawMode:\r\n case Material.PointFillMode:\r\n return MeshPrimitiveMode.POINTS;\r\n case Material.LineLoopDrawMode:\r\n return MeshPrimitiveMode.LINE_LOOP;\r\n case Material.LineListDrawMode:\r\n return MeshPrimitiveMode.LINES;\r\n case Material.LineStripDrawMode:\r\n return MeshPrimitiveMode.LINE_STRIP;\r\n }\r\n\r\n throw new Error(`Unknown fill mode: ${fillMode}`);\r\n}\r\n\r\nexport function IsTriangleFillMode(fillMode: number): boolean {\r\n switch (fillMode) {\r\n case Material.TriangleFillMode:\r\n case Material.TriangleStripDrawMode:\r\n case Material.TriangleFanDrawMode:\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function NormalizeTangent(tangent: Vector4 | Vector3) {\r\n const length = Math.sqrt(tangent.x * tangent.x + tangent.y * tangent.y + tangent.z * tangent.z);\r\n if (length > 0) {\r\n tangent.x /= length;\r\n tangent.y /= length;\r\n tangent.z /= length;\r\n }\r\n}\r\n\r\nexport function ConvertToRightHandedPosition(value: Vector3): Vector3 {\r\n value.x *= -1;\r\n return value;\r\n}\r\n\r\nexport function ConvertToRightHandedRotation(value: Quaternion): Quaternion {\r\n value.x *= -1;\r\n value.y *= -1;\r\n return value;\r\n}\r\n\r\nexport function ConvertToRightHandedNode(value: INode) {\r\n let translation = Vector3.FromArrayToRef(value.translation || [0, 0, 0], 0, TmpVectors.Vector3[0]);\r\n let rotation = Quaternion.FromArrayToRef(value.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[0]);\r\n\r\n translation = ConvertToRightHandedPosition(translation);\r\n rotation = ConvertToRightHandedRotation(rotation);\r\n\r\n if (translation.equalsWithEpsilon(defaultTranslation, epsilon)) {\r\n delete value.translation;\r\n } else {\r\n value.translation = translation.asArray();\r\n }\r\n\r\n if (Quaternion.IsIdentity(rotation)) {\r\n delete value.rotation;\r\n } else {\r\n value.rotation = rotation.asArray();\r\n }\r\n}\r\n\r\n/**\r\n * Rotation by 180 as glTF has a different convention than Babylon.\r\n * @param rotation Target camera rotation.\r\n * @returns Ref to camera rotation.\r\n */\r\nexport function ConvertCameraRotationToGLTF(rotation: Quaternion): Quaternion {\r\n return rotation.multiplyInPlace(rotation180Y);\r\n}\r\n\r\nexport function RotateNode180Y(node: INode) {\r\n if (node.rotation) {\r\n const rotation = Quaternion.FromArrayToRef(node.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[1]);\r\n rotation180Y.multiplyToRef(rotation, rotation);\r\n node.rotation = rotation.asArray();\r\n }\r\n}\r\n\r\n/**\r\n * Collapses GLTF parent and node into a single node. This is useful for removing nodes that were added by the GLTF importer.\r\n * @param node Target parent node.\r\n * @param parentNode Original GLTF node (Light or Camera).\r\n */\r\nexport function CollapseParentNode(node: INode, parentNode: INode) {\r\n const parentTranslation = Vector3.FromArrayToRef(parentNode.translation || [0, 0, 0], 0, TmpVectors.Vector3[0]);\r\n const parentRotation = Quaternion.FromArrayToRef(parentNode.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[0]);\r\n const parentScale = Vector3.FromArrayToRef(parentNode.scale || [1, 1, 1], 0, TmpVectors.Vector3[1]);\r\n const parentMatrix = Matrix.ComposeToRef(parentScale, parentRotation, parentTranslation, TmpVectors.Matrix[0]);\r\n\r\n const translation = Vector3.FromArrayToRef(node.translation || [0, 0, 0], 0, TmpVectors.Vector3[2]);\r\n const rotation = Quaternion.FromArrayToRef(node.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[1]);\r\n const scale = Vector3.FromArrayToRef(node.scale || [1, 1, 1], 0, TmpVectors.Vector3[1]);\r\n const matrix = Matrix.ComposeToRef(scale, rotation, translation, TmpVectors.Matrix[1]);\r\n\r\n parentMatrix.multiplyToRef(matrix, matrix);\r\n matrix.decompose(parentScale, parentRotation, parentTranslation);\r\n\r\n if (parentTranslation.equalsWithEpsilon(defaultTranslation, epsilon)) {\r\n delete parentNode.translation;\r\n } else {\r\n parentNode.translation = parentTranslation.asArray();\r\n }\r\n\r\n if (Quaternion.IsIdentity(parentRotation)) {\r\n delete parentNode.rotation;\r\n } else {\r\n parentNode.rotation = parentRotation.asArray();\r\n }\r\n\r\n if (parentScale.equalsWithEpsilon(defaultScale, epsilon)) {\r\n delete parentNode.scale;\r\n } else {\r\n parentNode.scale = parentScale.asArray();\r\n }\r\n}\r\n\r\n/**\r\n * Sometimes the GLTF Importer can add extra transform nodes (for lights and cameras). This checks if a parent node was added by the GLTF Importer. If so, it should be removed during serialization.\r\n * @param babylonNode Original GLTF node (Light or Camera).\r\n * @param parentBabylonNode Target parent node.\r\n * @returns True if the parent node was added by the GLTF importer.\r\n */\r\nexport function IsParentAddedByImporter(babylonNode: Node, parentBabylonNode: Node): boolean {\r\n return parentBabylonNode instanceof TransformNode && parentBabylonNode.getChildren().length == 1 && babylonNode.getChildren().length == 0;\r\n}\r\n\r\nexport function IsNoopNode(node: Node, useRightHandedSystem: boolean): boolean {\r\n if (!(node instanceof TransformNode)) {\r\n return false;\r\n }\r\n\r\n // Transform\r\n if (useRightHandedSystem) {\r\n const matrix = node.getWorldMatrix();\r\n if (!matrix.isIdentity()) {\r\n return false;\r\n }\r\n } else {\r\n const matrix = node.getWorldMatrix().multiplyToRef(convertHandednessMatrix, TmpVectors.Matrix[0]);\r\n if (!matrix.isIdentity()) {\r\n return false;\r\n }\r\n }\r\n\r\n // Geometry\r\n if ((node instanceof Mesh && node.geometry) || (node instanceof InstancedMesh && node.sourceMesh.geometry)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function IndicesArrayToUint8Array(indices: IndicesArray, start: number, count: number, is32Bits: boolean): Uint8Array {\r\n if (indices instanceof Array) {\r\n const subarray = indices.slice(start, start + count);\r\n indices = is32Bits ? new Uint32Array(subarray) : new Uint16Array(subarray);\r\n return new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength);\r\n }\r\n\r\n return ArrayBuffer.isView(indices) ? new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength) : new Uint8Array(indices);\r\n}\r\n\r\nexport function DataArrayToUint8Array(data: DataArray): Uint8Array {\r\n if (data instanceof Array) {\r\n const floatData = new Float32Array(data);\r\n return new Uint8Array(floatData.buffer, floatData.byteOffset, floatData.byteLength);\r\n }\r\n\r\n return ArrayBuffer.isView(data) ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength) : new Uint8Array(data);\r\n}\r\n\r\nexport function GetMinMax(data: DataArray, vertexBuffer: VertexBuffer, start: number, count: number): { min: number[]; max: number[] } {\r\n const { byteOffset, byteStride, type, normalized } = vertexBuffer;\r\n const size = vertexBuffer.getSize();\r\n const min = new Array<number>(size).fill(Infinity);\r\n const max = new Array<number>(size).fill(-Infinity);\r\n EnumerateFloatValues(data, byteOffset + start * byteStride, byteStride, size, type, count * size, normalized, (values) => {\r\n for (let i = 0; i < size; i++) {\r\n min[i] = Math.min(min[i], values[i]);\r\n max[i] = Math.max(max[i], values[i]);\r\n }\r\n });\r\n\r\n return { min, max };\r\n}\r\n\r\n/**\r\n * Removes, in-place, object properties which have the same value as the default value.\r\n * Useful for avoiding unnecessary properties in the glTF JSON.\r\n * @param object the object to omit default values from\r\n * @param defaultValues a partial object with default values\r\n * @returns object with default values omitted\r\n */\r\nexport function OmitDefaultValues<T extends Object>(object: T, defaultValues: Partial<T>): T {\r\n for (const [key, value] of Object.entries(object)) {\r\n const defaultValue = defaultValues[key as keyof T];\r\n if ((Array.isArray(value) && Array.isArray(defaultValue) && AreArraysEqual(value, defaultValue)) || value === defaultValue) {\r\n delete object[key as keyof T];\r\n }\r\n }\r\n return object;\r\n}\r\n\r\nfunction AreArraysEqual(array1: unknown[], array2: unknown[]): boolean {\r\n return array1.length === array2.length && array1.every((val, i) => val === array2[i]);\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/serializers",
3
- "version": "7.43.0",
3
+ "version": "7.44.0",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -18,10 +18,10 @@
18
18
  "postcompile": "build-tools -c add-js-to-es6"
19
19
  },
20
20
  "devDependencies": {
21
- "@babylonjs/core": "^7.43.0",
21
+ "@babylonjs/core": "^7.44.0",
22
22
  "@dev/build-tools": "^1.0.0",
23
23
  "@lts/serializers": "^1.0.0",
24
- "babylonjs-gltf2interface": "^7.43.0"
24
+ "babylonjs-gltf2interface": "^7.44.0"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "@babylonjs/core": "^7.0.0",