@babylonjs/serializers 7.34.3 → 7.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/OBJ/objSerializer.js.map +1 -1
  2. package/USDZ/usdzExporter.js.map +1 -1
  3. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
  4. package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
  5. package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -1
  6. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
  7. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -1
  8. package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -1
  9. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
  10. package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
  11. package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
  12. package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
  13. package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
  14. package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
  15. package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
  16. package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
  17. package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
  18. package/glTF/2.0/glTFAnimation.js.map +1 -1
  19. package/glTF/2.0/glTFData.js.map +1 -1
  20. package/glTF/2.0/glTFExporter.js.map +1 -1
  21. package/glTF/2.0/glTFMaterialExporter.js.map +1 -1
  22. package/glTF/2.0/glTFSerializer.js.map +1 -1
  23. package/glTF/2.0/glTFUtilities.js.map +1 -1
  24. package/legacy/legacy-glTF2Serializer.js.map +1 -1
  25. package/legacy/legacy-objSerializer.js.map +1 -1
  26. package/legacy/legacy-stlSerializer.js.map +1 -1
  27. package/legacy/legacy-usdzSerializer.js.map +1 -1
  28. package/package.json +3 -3
  29. package/stl/stlSerializer.js.map +1 -1
@@ -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 { AccessorType, ImageMimeType, MeshPrimitiveMode, AccessorComponentType, CameraType } from \"babylonjs-gltf2interface\";\r\n\r\nimport type { FloatArray, IndicesArray, Nullable } from \"core/types\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3, Vector4, Quaternion } from \"core/Maths/math.vector\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { Node } from \"core/node\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport type { MorphTarget } from \"core/Morph/morphTarget\";\r\nimport { LinesMesh } from \"core/Meshes/linesMesh\";\r\nimport { InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport type { Bone } from \"core/Bones/bone\";\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\n\r\nimport type { IGLTFExporterExtensionV2 } from \"./glTFExporterExtension\";\r\nimport { _GLTFMaterialExporter } from \"./glTFMaterialExporter\";\r\nimport type { IExportOptions } from \"./glTFSerializer\";\r\nimport { _GLTFUtilities } from \"./glTFUtilities\";\r\nimport { GLTFData } from \"./glTFData\";\r\nimport { _GLTFAnimation } from \"./glTFAnimation\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\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\nfunction 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\nfunction convertNodeHandedness(node: INode): void {\r\n const translation = Vector3.FromArrayToRef(node.translation || [0, 0, 0], 0, TmpVectors.Vector3[0]);\r\n const rotation = Quaternion.FromArrayToRef(node.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[0]);\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[0]).multiplyToRef(convertHandednessMatrix, TmpVectors.Matrix[0]);\r\n\r\n matrix.decompose(scale, rotation, translation);\r\n\r\n if (translation.equalsToFloats(0, 0, 0)) {\r\n delete node.translation;\r\n } else {\r\n node.translation = translation.asArray();\r\n }\r\n\r\n if (Quaternion.IsIdentity(rotation)) {\r\n delete node.rotation;\r\n } else {\r\n node.rotation = rotation.asArray();\r\n }\r\n\r\n if (scale.equalsToFloats(1, 1, 1)) {\r\n delete node.scale;\r\n } else {\r\n node.scale = scale.asArray();\r\n }\r\n}\r\n\r\nfunction getBinaryWriterFunc(binaryWriter: _BinaryWriter, attributeComponentKind: AccessorComponentType): Nullable<(entry: number, byteOffset?: number) => void> {\r\n switch (attributeComponentKind) {\r\n case AccessorComponentType.UNSIGNED_BYTE: {\r\n return binaryWriter.setUInt8.bind(binaryWriter);\r\n }\r\n case AccessorComponentType.UNSIGNED_SHORT: {\r\n return binaryWriter.setUInt16.bind(binaryWriter);\r\n }\r\n case AccessorComponentType.UNSIGNED_INT: {\r\n return binaryWriter.setUInt32.bind(binaryWriter);\r\n }\r\n case AccessorComponentType.FLOAT: {\r\n return binaryWriter.setFloat32.bind(binaryWriter);\r\n }\r\n default: {\r\n Tools.Warn(\"Unsupported Attribute Component kind: \" + attributeComponentKind);\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Utility interface for storing vertex attribute data\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ninterface _IVertexAttributeData {\r\n /**\r\n * Specifies the Babylon Vertex Buffer Type (Position, Normal, Color, etc.)\r\n */\r\n kind: string;\r\n\r\n /**\r\n * Specifies the glTF Accessor Type (VEC2, VEC3, etc.)\r\n */\r\n accessorType: AccessorType;\r\n\r\n /**\r\n * Specifies the glTF Accessor Component Type (BYTE, UNSIGNED_BYTE, FLOAT, SHORT, INT, etc..)\r\n */\r\n accessorComponentType: AccessorComponentType;\r\n\r\n /**\r\n * Specifies the BufferView index for the vertex attribute data\r\n */\r\n bufferViewIndex?: number;\r\n\r\n /**\r\n * Specifies the number of bytes per attribute element (e.g. position would be 3 floats (x/y/z) where each float is 4 bytes, so a 12 byte stride)\r\n */\r\n byteStride?: number;\r\n\r\n /**\r\n * Specifies information about each morph target associated with this attribute\r\n */\r\n morphTargetInfo?: Readonly<{ bufferViewIndex: number; vertexCount: number; accessorType: AccessorType; minMax?: { min: Vector3; max: Vector3 } }>[];\r\n}\r\n\r\n/**\r\n * Converts Babylon Scene into glTF 2.0.\r\n * @internal\r\n */\r\nexport class _Exporter {\r\n /**\r\n * Stores the glTF to export\r\n */\r\n public _glTF: IGLTF;\r\n /**\r\n * Stores all generated buffer views, which represents views into the main glTF buffer data\r\n */\r\n public _bufferViews: IBufferView[];\r\n /**\r\n * Stores all the generated accessors, which is used for accessing the data within the buffer views in glTF\r\n */\r\n public _accessors: IAccessor[];\r\n /**\r\n * Stores all the generated nodes, which contains transform and/or mesh information per node\r\n */\r\n public _nodes: INode[];\r\n /**\r\n * Stores all the generated glTF scenes, which stores multiple node hierarchies\r\n */\r\n private _scenes: IScene[];\r\n /**\r\n * Stores all the generated glTF cameras\r\n */\r\n private _cameras: ICamera[];\r\n /**\r\n * Stores all the generated mesh information, each containing a set of primitives to render in glTF\r\n */\r\n private _meshes: IMesh[];\r\n /**\r\n * Stores all the generated material information, which represents the appearance of each primitive\r\n */\r\n public _materials: IMaterial[];\r\n\r\n public _materialMap: { [materialID: number]: number };\r\n /**\r\n * Stores all the generated texture information, which is referenced by glTF materials\r\n */\r\n public _textures: ITexture[];\r\n /**\r\n * Stores all the generated image information, which is referenced by glTF textures\r\n */\r\n public _images: IImage[];\r\n\r\n /**\r\n * Stores all the texture samplers\r\n */\r\n public _samplers: ISampler[];\r\n /**\r\n * Stores all the generated glTF skins\r\n */\r\n public _skins: ISkin[];\r\n /**\r\n * Stores all the generated animation samplers, which is referenced by glTF animations\r\n */\r\n /**\r\n * Stores the animations for glTF models\r\n */\r\n private _animations: IAnimation[];\r\n /**\r\n * Stores the total amount of bytes stored in the glTF buffer\r\n */\r\n private _totalByteLength: number;\r\n /**\r\n * Stores a reference to the Babylon scene containing the source geometry and material information\r\n */\r\n public _babylonScene: Scene;\r\n /**\r\n * Stores a map of the image data, where the key is the file name and the value\r\n * is the image data\r\n */\r\n public _imageData: { [fileName: string]: { data: ArrayBuffer; mimeType: ImageMimeType } };\r\n\r\n private _orderedImageData: Array<{ data: ArrayBuffer; mimeType: ImageMimeType }>;\r\n\r\n /**\r\n * Stores a map of the unique id of a node to its index in the node array\r\n */\r\n private _nodeMap: { [key: number]: number };\r\n\r\n /**\r\n * Baked animation sample rate\r\n */\r\n private _animationSampleRate: number;\r\n\r\n private _options: IExportOptions;\r\n\r\n private _localEngine: Engine;\r\n\r\n public _glTFMaterialExporter: _GLTFMaterialExporter;\r\n\r\n private _extensions: { [name: string]: IGLTFExporterExtensionV2 } = {};\r\n\r\n private static _ExtensionNames = new Array<string>();\r\n private static _ExtensionFactories: { [name: string]: (exporter: _Exporter) => IGLTFExporterExtensionV2 } = {};\r\n\r\n private _applyExtension<T>(\r\n node: Nullable<T>,\r\n extensions: IGLTFExporterExtensionV2[],\r\n index: number,\r\n actionAsync: (extension: IGLTFExporterExtensionV2, node: Nullable<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) => this._applyExtension(newNode, extensions, index + 1, actionAsync));\r\n }\r\n\r\n private _applyExtensions<T>(\r\n node: Nullable<T>,\r\n actionAsync: (extension: IGLTFExporterExtensionV2, node: Nullable<T>) => Promise<Nullable<T>> | undefined\r\n ): Promise<Nullable<T>> {\r\n const extensions: IGLTFExporterExtensionV2[] = [];\r\n for (const name of _Exporter._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: Nullable<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(\r\n context: string,\r\n meshPrimitive: IMeshPrimitive,\r\n babylonSubMesh: SubMesh,\r\n binaryWriter: _BinaryWriter\r\n ): Promise<Nullable<IMeshPrimitive>> {\r\n return this._applyExtensions(\r\n meshPrimitive,\r\n (extension, node) => extension.postExportMeshPrimitiveAsync && extension.postExportMeshPrimitiveAsync(context, node, babylonSubMesh, binaryWriter)\r\n );\r\n }\r\n\r\n public _extensionsPostExportNodeAsync(\r\n context: string,\r\n node: Nullable<INode>,\r\n babylonNode: Node,\r\n nodeMap: { [key: number]: number },\r\n binaryWriter: _BinaryWriter\r\n ): Promise<Nullable<INode>> {\r\n return this._applyExtensions(node, (extension, node) => extension.postExportNodeAsync && extension.postExportNodeAsync(context, node, babylonNode, nodeMap, binaryWriter));\r\n }\r\n\r\n public _extensionsPostExportMaterialAsync(context: string, material: Nullable<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 _Exporter._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 _Exporter._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 _Exporter._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 if (this._glTF.extensionsUsed == null) {\r\n this._glTF.extensionsUsed = [];\r\n }\r\n\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 if (this._glTF.extensionsRequired == null) {\r\n this._glTF.extensionsRequired = [];\r\n }\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 if (this._glTF.extensions == null) {\r\n this._glTF.extensions = {};\r\n }\r\n\r\n if (extension.onExporting) {\r\n extension.onExporting();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Load glTF serializer extensions\r\n */\r\n private _loadExtensions(): void {\r\n for (const name of _Exporter._ExtensionNames) {\r\n const extension = _Exporter._ExtensionFactories[name](this);\r\n this._extensions[name] = extension;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a glTF Exporter instance, which can accept optional exporter options\r\n * @param babylonScene Babylon scene object\r\n * @param options Options to modify the behavior of the exporter\r\n */\r\n public constructor(babylonScene?: Nullable<Scene>, options?: IExportOptions) {\r\n this._glTF = {\r\n asset: { generator: `Babylon.js v${Engine.Version}`, version: \"2.0\" },\r\n };\r\n babylonScene = babylonScene || EngineStore.LastCreatedScene;\r\n if (!babylonScene) {\r\n return;\r\n }\r\n this._babylonScene = babylonScene;\r\n this._bufferViews = [];\r\n this._accessors = [];\r\n this._meshes = [];\r\n this._scenes = [];\r\n this._cameras = [];\r\n this._nodes = [];\r\n this._images = [];\r\n this._materials = [];\r\n this._materialMap = [];\r\n this._textures = [];\r\n this._samplers = [];\r\n this._skins = [];\r\n this._animations = [];\r\n this._imageData = {};\r\n this._orderedImageData = [];\r\n this._options = options || {};\r\n this._animationSampleRate = this._options.animationSampleRate || 1 / 60;\r\n\r\n this._glTFMaterialExporter = new _GLTFMaterialExporter(this);\r\n this._loadExtensions();\r\n }\r\n\r\n public dispose() {\r\n for (const extensionKey in this._extensions) {\r\n const extension = this._extensions[extensionKey];\r\n\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 /**\r\n * Registers a glTF exporter extension\r\n * @param name Name of the extension to export\r\n * @param factory The factory function that creates the exporter extension\r\n */\r\n public static RegisterExtension(name: string, factory: (exporter: _Exporter) => IGLTFExporterExtensionV2): void {\r\n if (_Exporter.UnregisterExtension(name)) {\r\n Tools.Warn(`Extension with the name ${name} already exists`);\r\n }\r\n\r\n _Exporter._ExtensionFactories[name] = factory;\r\n _Exporter._ExtensionNames.push(name);\r\n }\r\n\r\n /**\r\n * Un-registers an exporter extension\r\n * @param name The name fo the exporter extension\r\n * @returns A boolean indicating whether the extension has been un-registered\r\n */\r\n public static UnregisterExtension(name: string): boolean {\r\n if (!_Exporter._ExtensionFactories[name]) {\r\n return false;\r\n }\r\n delete _Exporter._ExtensionFactories[name];\r\n\r\n const index = _Exporter._ExtensionNames.indexOf(name);\r\n if (index !== -1) {\r\n _Exporter._ExtensionNames.splice(index, 1);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _reorderIndicesBasedOnPrimitiveMode(submesh: SubMesh, primitiveMode: number, babylonIndices: IndicesArray, byteOffset: number, binaryWriter: _BinaryWriter) {\r\n switch (primitiveMode) {\r\n case Material.TriangleFillMode: {\r\n if (!byteOffset) {\r\n byteOffset = 0;\r\n }\r\n for (let i = submesh.indexStart, length = submesh.indexStart + submesh.indexCount; i < length; i = i + 3) {\r\n const index = byteOffset + i * 4;\r\n // swap the second and third indices\r\n const secondIndex = binaryWriter.getUInt32(index + 4);\r\n const thirdIndex = binaryWriter.getUInt32(index + 8);\r\n binaryWriter.setUInt32(thirdIndex, index + 4);\r\n binaryWriter.setUInt32(secondIndex, index + 8);\r\n }\r\n break;\r\n }\r\n case Material.TriangleFanDrawMode: {\r\n for (let i = submesh.indexStart + submesh.indexCount - 1, start = submesh.indexStart; i >= start; --i) {\r\n binaryWriter.setUInt32(babylonIndices[i], byteOffset);\r\n byteOffset += 4;\r\n }\r\n break;\r\n }\r\n case Material.TriangleStripDrawMode: {\r\n if (submesh.indexCount >= 3) {\r\n binaryWriter.setUInt32(babylonIndices[submesh.indexStart + 2], byteOffset + 4);\r\n binaryWriter.setUInt32(babylonIndices[submesh.indexStart + 1], byteOffset + 8);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Reorders the vertex attribute data based on the primitive mode. This is necessary when indices are not available and the winding order is\r\n * clock-wise during export to glTF\r\n * @param submesh BabylonJS submesh\r\n * @param primitiveMode Primitive mode of the mesh\r\n * @param vertexBufferKind The type of vertex attribute\r\n * @param meshAttributeArray The vertex attribute data\r\n * @param byteOffset The offset to the binary data\r\n * @param binaryWriter The binary data for the glTF file\r\n */\r\n private _reorderVertexAttributeDataBasedOnPrimitiveMode(\r\n submesh: SubMesh,\r\n primitiveMode: number,\r\n vertexBufferKind: string,\r\n meshAttributeArray: FloatArray,\r\n byteOffset: number,\r\n binaryWriter: _BinaryWriter\r\n ): void {\r\n switch (primitiveMode) {\r\n case Material.TriangleFillMode: {\r\n this._reorderTriangleFillMode(submesh, vertexBufferKind, meshAttributeArray, byteOffset, binaryWriter);\r\n break;\r\n }\r\n case Material.TriangleStripDrawMode: {\r\n this._reorderTriangleStripDrawMode(submesh, vertexBufferKind, meshAttributeArray, byteOffset, binaryWriter);\r\n break;\r\n }\r\n case Material.TriangleFanDrawMode: {\r\n this._reorderTriangleFanMode(submesh, vertexBufferKind, meshAttributeArray, byteOffset, binaryWriter);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Reorders the vertex attributes in the correct triangle mode order . This is necessary when indices are not available and the winding order is\r\n * clock-wise during export to glTF\r\n * @param submesh BabylonJS submesh\r\n * @param vertexBufferKind The type of vertex attribute\r\n * @param meshAttributeArray The vertex attribute data\r\n * @param byteOffset The offset to the binary data\r\n * @param binaryWriter The binary data for the glTF file\r\n */\r\n private _reorderTriangleFillMode(submesh: SubMesh, vertexBufferKind: string, meshAttributeArray: FloatArray, byteOffset: number, binaryWriter: _BinaryWriter) {\r\n const vertexBuffer = this._getVertexBufferFromMesh(vertexBufferKind, submesh.getMesh() as Mesh);\r\n if (vertexBuffer) {\r\n const stride = vertexBuffer.byteStride / VertexBuffer.GetTypeByteLength(vertexBuffer.type);\r\n if (submesh.verticesCount % 3 !== 0) {\r\n Tools.Error(\"The submesh vertices for the triangle fill mode is not divisible by 3!\");\r\n } else {\r\n const vertexData: Vector2[] | Vector3[] | Vector4[] = [];\r\n let index = 0;\r\n switch (vertexBufferKind) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind: {\r\n for (let x = submesh.verticesStart; x < submesh.verticesStart + submesh.verticesCount; x = x + 3) {\r\n index = x * stride;\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index));\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + stride));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n for (let x = submesh.verticesStart; x < submesh.verticesStart + submesh.verticesCount; x = x + 3) {\r\n index = x * stride;\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index));\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index + stride));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.ColorKind: {\r\n const size = vertexBuffer.getSize();\r\n for (let x = submesh.verticesStart; x < submesh.verticesStart + submesh.verticesCount; x = x + size) {\r\n index = x * stride;\r\n if (size === 4) {\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index));\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index + stride));\r\n } else {\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index));\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + stride));\r\n }\r\n }\r\n break;\r\n }\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind: {\r\n for (let x = submesh.verticesStart; x < submesh.verticesStart + submesh.verticesCount; x = x + 3) {\r\n index = x * stride;\r\n (vertexData as Vector2[]).push(Vector2.FromArray(meshAttributeArray, index));\r\n (vertexData as Vector2[]).push(Vector2.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector2[]).push(Vector2.FromArray(meshAttributeArray, index + stride));\r\n }\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported Vertex Buffer type: ${vertexBufferKind}`);\r\n }\r\n }\r\n this._writeVertexAttributeData(vertexData, byteOffset, vertexBufferKind, binaryWriter);\r\n }\r\n } else {\r\n Tools.Warn(`reorderTriangleFillMode: Vertex Buffer Kind ${vertexBufferKind} not present!`);\r\n }\r\n }\r\n\r\n /**\r\n * Reorders the vertex attributes in the correct triangle strip order. This is necessary when indices are not available and the winding order is\r\n * clock-wise during export to glTF\r\n * @param submesh BabylonJS submesh\r\n * @param vertexBufferKind The type of vertex attribute\r\n * @param meshAttributeArray The vertex attribute data\r\n * @param byteOffset The offset to the binary data\r\n * @param binaryWriter The binary data for the glTF file\r\n */\r\n private _reorderTriangleStripDrawMode(submesh: SubMesh, vertexBufferKind: string, meshAttributeArray: FloatArray, byteOffset: number, binaryWriter: _BinaryWriter) {\r\n const vertexBuffer = this._getVertexBufferFromMesh(vertexBufferKind, submesh.getMesh() as Mesh);\r\n if (vertexBuffer) {\r\n const stride = vertexBuffer.byteStride / VertexBuffer.GetTypeByteLength(vertexBuffer.type);\r\n\r\n const vertexData: Vector2[] | Vector3[] | Vector4[] = [];\r\n let index = 0;\r\n switch (vertexBufferKind) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind: {\r\n index = submesh.verticesStart;\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + stride));\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.ColorKind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n vertexBuffer.getSize() === 4\r\n ? (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index))\r\n : (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector2[]).push(Vector2.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported Vertex Buffer type: ${vertexBufferKind}`);\r\n }\r\n }\r\n this._writeVertexAttributeData(vertexData, byteOffset + 12, vertexBufferKind, binaryWriter);\r\n } else {\r\n Tools.Warn(`reorderTriangleStripDrawMode: Vertex buffer kind ${vertexBufferKind} not present!`);\r\n }\r\n }\r\n\r\n /**\r\n * Reorders the vertex attributes in the correct triangle fan order. This is necessary when indices are not available and the winding order is\r\n * clock-wise during export to glTF\r\n * @param submesh BabylonJS submesh\r\n * @param vertexBufferKind The type of vertex attribute\r\n * @param meshAttributeArray The vertex attribute data\r\n * @param byteOffset The offset to the binary data\r\n * @param binaryWriter The binary data for the glTF file\r\n */\r\n private _reorderTriangleFanMode(submesh: SubMesh, vertexBufferKind: string, meshAttributeArray: FloatArray, byteOffset: number, binaryWriter: _BinaryWriter) {\r\n const vertexBuffer = this._getVertexBufferFromMesh(vertexBufferKind, submesh.getMesh() as Mesh);\r\n if (vertexBuffer) {\r\n const stride = vertexBuffer.byteStride / VertexBuffer.GetTypeByteLength(vertexBuffer.type);\r\n\r\n const vertexData: Vector2[] | Vector3[] | Vector4[] = [];\r\n let index = 0;\r\n switch (vertexBufferKind) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.ColorKind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index));\r\n vertexBuffer.getSize() === 4\r\n ? (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index))\r\n : (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector2[]).push(Vector2.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported Vertex Buffer type: ${vertexBufferKind}`);\r\n }\r\n }\r\n this._writeVertexAttributeData(vertexData, byteOffset, vertexBufferKind, binaryWriter);\r\n } else {\r\n Tools.Warn(`reorderTriangleFanMode: Vertex buffer kind ${vertexBufferKind} not present!`);\r\n }\r\n }\r\n\r\n /**\r\n * Writes the vertex attribute data to binary\r\n * @param vertices The vertices to write to the binary writer\r\n * @param byteOffset The offset into the binary writer to overwrite binary data\r\n * @param vertexAttributeKind The vertex attribute type\r\n * @param binaryWriter The writer containing the binary data\r\n */\r\n private _writeVertexAttributeData(vertices: Vector2[] | Vector3[] | Vector4[], byteOffset: number, vertexAttributeKind: string, binaryWriter: _BinaryWriter) {\r\n for (const vertex of vertices) {\r\n if (vertexAttributeKind === VertexBuffer.NormalKind) {\r\n vertex.normalize();\r\n } else if (vertexAttributeKind === VertexBuffer.TangentKind && vertex instanceof Vector4) {\r\n _GLTFUtilities._NormalizeTangentFromRef(vertex);\r\n }\r\n\r\n for (const component of vertex.asArray()) {\r\n binaryWriter.setFloat32(component, byteOffset);\r\n byteOffset += 4;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Writes mesh attribute data to a data buffer\r\n * Returns the bytelength of the data\r\n * @param vertexBufferKind Indicates what kind of vertex data is being passed in\r\n * @param attributeComponentKind\r\n * @param meshAttributeArray Array containing the attribute data\r\n * @param stride Specifies the space between data\r\n * @param binaryWriter The buffer to write the binary data to\r\n * @param babylonTransformNode\r\n */\r\n public _writeAttributeData(\r\n vertexBufferKind: string,\r\n attributeComponentKind: AccessorComponentType,\r\n meshAttributeArray: FloatArray,\r\n stride: number,\r\n binaryWriter: _BinaryWriter,\r\n babylonTransformNode: TransformNode\r\n ) {\r\n let vertexAttributes: number[][] = [];\r\n let index: number;\r\n\r\n switch (vertexBufferKind) {\r\n case VertexBuffer.PositionKind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector3.FromArray(meshAttributeArray, index);\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.NormalKind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector3.FromArray(meshAttributeArray, index);\r\n vertexAttributes.push(vertexData.normalize().asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector4.FromArray(meshAttributeArray, index);\r\n _GLTFUtilities._NormalizeTangentFromRef(vertexData);\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.ColorKind: {\r\n const meshMaterial = (babylonTransformNode as Mesh).material;\r\n const convertToLinear = meshMaterial ? meshMaterial.getClassName() === \"StandardMaterial\" : true;\r\n const vertexData: Color3 | Color4 = stride === 3 ? new Color3() : new Color4();\r\n const useExactSrgbConversions = this._babylonScene.getEngine().useExactSrgbConversions;\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n if (stride === 3) {\r\n Color3.FromArrayToRef(meshAttributeArray, index, vertexData as Color3);\r\n if (convertToLinear) {\r\n (vertexData as Color3).toLinearSpaceToRef(vertexData as Color3, useExactSrgbConversions);\r\n }\r\n } else {\r\n Color4.FromArrayToRef(meshAttributeArray, index, vertexData as Color4);\r\n if (convertToLinear) {\r\n (vertexData as Color4).toLinearSpaceToRef(vertexData as Color4, useExactSrgbConversions);\r\n }\r\n }\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector2.FromArray(meshAttributeArray, index);\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector4.FromArray(meshAttributeArray, index);\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.MatricesWeightsKind:\r\n case VertexBuffer.MatricesWeightsExtraKind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector4.FromArray(meshAttributeArray, index);\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n default: {\r\n Tools.Warn(\"Unsupported Vertex Buffer Type: \" + vertexBufferKind);\r\n vertexAttributes = [];\r\n }\r\n }\r\n\r\n const writeBinaryFunc = getBinaryWriterFunc(binaryWriter, attributeComponentKind);\r\n\r\n if (writeBinaryFunc) {\r\n for (const vertexAttribute of vertexAttributes) {\r\n for (const component of vertexAttribute) {\r\n writeBinaryFunc(component);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _createMorphTargetBufferViewKind(\r\n vertexBufferKind: string,\r\n accessorType: AccessorType,\r\n attributeComponentKind: AccessorComponentType,\r\n mesh: Mesh,\r\n morphTarget: MorphTarget,\r\n binaryWriter: _BinaryWriter,\r\n byteStride: number\r\n ): Nullable<{ bufferViewIndex: number; vertexCount: number; accessorType: AccessorType; minMax?: { min: Vector3; max: Vector3 } }> {\r\n let vertexCount: number;\r\n let minMax: { min: Vector3; max: Vector3 } | undefined;\r\n const morphData: number[] = [];\r\n const difference: Vector3 = TmpVectors.Vector3[0];\r\n\r\n switch (vertexBufferKind) {\r\n case VertexBuffer.PositionKind: {\r\n const morphPositions = morphTarget.getPositions();\r\n if (!morphPositions) {\r\n return null;\r\n }\r\n\r\n const originalPositions = mesh.getVerticesData(VertexBuffer.PositionKind, undefined, undefined, true)!;\r\n const vertexStart = 0;\r\n const min = new Vector3(Infinity, Infinity, Infinity);\r\n const max = new Vector3(-Infinity, -Infinity, -Infinity);\r\n vertexCount = originalPositions.length / 3;\r\n for (let i = vertexStart; i < vertexCount; ++i) {\r\n const originalPosition = Vector3.FromArray(originalPositions, i * 3);\r\n const morphPosition = Vector3.FromArray(morphPositions, i * 3);\r\n morphPosition.subtractToRef(originalPosition, difference);\r\n min.copyFromFloats(Math.min(difference.x, min.x), Math.min(difference.y, min.y), Math.min(difference.z, min.z));\r\n max.copyFromFloats(Math.max(difference.x, max.x), Math.max(difference.y, max.y), Math.max(difference.z, max.z));\r\n morphData.push(difference.x, difference.y, difference.z);\r\n }\r\n\r\n minMax = { min, max };\r\n\r\n break;\r\n }\r\n case VertexBuffer.NormalKind: {\r\n const morphNormals = morphTarget.getNormals();\r\n if (!morphNormals) {\r\n return null;\r\n }\r\n\r\n const originalNormals = mesh.getVerticesData(VertexBuffer.NormalKind, undefined, undefined, true)!;\r\n const vertexStart = 0;\r\n vertexCount = originalNormals.length / 3;\r\n for (let i = vertexStart; i < vertexCount; ++i) {\r\n const originalNormal = Vector3.FromArray(originalNormals, i * 3).normalize();\r\n const morphNormal = Vector3.FromArray(morphNormals, i * 3).normalize();\r\n morphNormal.subtractToRef(originalNormal, difference);\r\n morphData.push(difference.x, difference.y, difference.z);\r\n }\r\n\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n const morphTangents = morphTarget.getTangents();\r\n if (!morphTangents) {\r\n return null;\r\n }\r\n\r\n // Handedness cannot be displaced, so morph target tangents omit the w component\r\n accessorType = AccessorType.VEC3;\r\n byteStride = 12; // 3 components (x/y/z) * 4 bytes (float32)\r\n\r\n const originalTangents = mesh.getVerticesData(VertexBuffer.TangentKind, undefined, undefined, true)!;\r\n const vertexStart = 0;\r\n vertexCount = originalTangents.length / 4;\r\n for (let i = vertexStart; i < vertexCount; ++i) {\r\n // Only read the x, y, z components and ignore w\r\n const originalTangent = Vector3.FromArray(originalTangents, i * 4);\r\n _GLTFUtilities._NormalizeTangentFromRef(originalTangent);\r\n\r\n // Morph target tangents omit the w component so it won't be present in the data\r\n const morphTangent = Vector3.FromArray(morphTangents, i * 3);\r\n _GLTFUtilities._NormalizeTangentFromRef(morphTangent);\r\n\r\n morphTangent.subtractToRef(originalTangent, difference);\r\n morphData.push(difference.x, difference.y, difference.z);\r\n }\r\n\r\n break;\r\n }\r\n default: {\r\n return null;\r\n }\r\n }\r\n\r\n const binaryWriterFunc = getBinaryWriterFunc(binaryWriter, attributeComponentKind);\r\n if (!binaryWriterFunc) {\r\n return null;\r\n }\r\n\r\n const typeByteLength = VertexBuffer.GetTypeByteLength(attributeComponentKind);\r\n const byteLength = morphData.length * typeByteLength;\r\n const bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, byteStride, `${vertexBufferKind} - ${morphTarget.name} (Morph Target)`);\r\n this._bufferViews.push(bufferView);\r\n const bufferViewIndex = this._bufferViews.length - 1;\r\n\r\n for (const value of morphData) {\r\n binaryWriterFunc(value);\r\n }\r\n\r\n return { bufferViewIndex, vertexCount, accessorType, minMax };\r\n }\r\n\r\n /**\r\n * Generates glTF json data\r\n * @param shouldUseGlb Indicates whether the json should be written for a glb file\r\n * @param glTFPrefix Text to use when prefixing a glTF file\r\n * @param prettyPrint Indicates whether the json file should be pretty printed (true) or not (false)\r\n * @returns json data as string\r\n */\r\n private _generateJSON(shouldUseGlb: boolean, glTFPrefix?: string, prettyPrint?: boolean): string {\r\n const buffer: IBuffer = { byteLength: this._totalByteLength };\r\n let imageName: string;\r\n let imageData: { data: ArrayBuffer; mimeType: ImageMimeType };\r\n let bufferView: IBufferView;\r\n let byteOffset: number = this._totalByteLength;\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 imageName = image.uri.split(\".\")[0] + \" image\";\r\n bufferView = _GLTFUtilities._CreateBufferView(0, byteOffset, imageData.data.byteLength, undefined, imageName);\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 if (!this._glTF.images) {\r\n this._glTF.images = [];\r\n }\r\n this._glTF.images.push(image);\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 = glTFPrefix + \".bin\";\r\n }\r\n\r\n const jsonText = prettyPrint ? JSON.stringify(this._glTF, null, 2) : JSON.stringify(this._glTF);\r\n\r\n return jsonText;\r\n }\r\n\r\n /**\r\n * Generates data for .gltf and .bin files based on the glTF prefix string\r\n * @param glTFPrefix Text to use when prefixing a glTF file\r\n * @param dispose Dispose the exporter\r\n * @returns GLTFData with glTF file data\r\n */\r\n public _generateGLTFAsync(glTFPrefix: string, dispose = true): Promise<GLTFData> {\r\n return this._generateBinaryAsync().then((binaryBuffer) => {\r\n this._extensionsOnExporting();\r\n const jsonText = this._generateJSON(false, 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.glTFFiles[glTFFileName] = jsonText;\r\n container.glTFFiles[glTFBinFile] = bin;\r\n\r\n if (this._imageData) {\r\n for (const image in this._imageData) {\r\n container.glTFFiles[image] = new Blob([this._imageData[image].data], { type: this._imageData[image].mimeType });\r\n }\r\n }\r\n\r\n if (dispose) {\r\n this.dispose();\r\n }\r\n\r\n return container;\r\n });\r\n }\r\n\r\n /**\r\n * Creates a binary buffer for glTF\r\n * @returns array buffer for binary data\r\n */\r\n private _generateBinaryAsync(): Promise<ArrayBuffer> {\r\n const binaryWriter = new _BinaryWriter(4);\r\n return this._createSceneAsync(binaryWriter).then(() => {\r\n if (this._localEngine) {\r\n this._localEngine.dispose();\r\n }\r\n return binaryWriter.getArrayBuffer();\r\n });\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 /**\r\n * @internal\r\n */\r\n public _generateGLBAsync(glTFPrefix: string, dispose = true): Promise<GLTFData> {\r\n return this._generateBinaryAsync().then((binaryBuffer) => {\r\n this._extensionsOnExporting();\r\n const jsonText = this._generateJSON(true);\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 + 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.glTFFiles[glbFileName] = glbFile;\r\n\r\n if (this._localEngine != null) {\r\n this._localEngine.dispose();\r\n }\r\n\r\n if (dispose) {\r\n this.dispose();\r\n }\r\n\r\n return container;\r\n });\r\n }\r\n\r\n /**\r\n * Sets the TRS for each node\r\n * @param node glTF Node for storing the transformation data\r\n * @param babylonTransformNode Babylon mesh used as the source for the transformation data\r\n */\r\n private _setNodeTransformation(node: INode, babylonTransformNode: TransformNode): 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 if (!babylonTransformNode.position.equalsToFloats(0, 0, 0)) {\r\n node.translation = babylonTransformNode.position.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 node.rotation = rotationQuaternion.normalize().asArray();\r\n }\r\n }\r\n\r\n private _setCameraTransformation(node: INode, babylonCamera: Camera): void {\r\n const translation = TmpVectors.Vector3[0];\r\n const rotation = TmpVectors.Quaternion[0];\r\n babylonCamera.getWorldMatrix().decompose(undefined, rotation, translation);\r\n\r\n if (!translation.equalsToFloats(0, 0, 0)) {\r\n node.translation = translation.asArray();\r\n }\r\n\r\n // // Rotation by 180 as glTF has a different convention than Babylon.\r\n rotation.multiplyInPlace(rotation180Y);\r\n\r\n if (!Quaternion.IsIdentity(rotation)) {\r\n node.rotation = rotation.asArray();\r\n }\r\n }\r\n\r\n private _getVertexBufferFromMesh(attributeKind: string, bufferMesh: Mesh): Nullable<VertexBuffer> {\r\n if (bufferMesh.isVerticesDataPresent(attributeKind, true)) {\r\n const vertexBuffer = bufferMesh.getVertexBuffer(attributeKind, true);\r\n if (vertexBuffer) {\r\n return vertexBuffer;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Creates a bufferview based on the vertices type for the Babylon mesh\r\n * @param kind Indicates the type of vertices data\r\n * @param attributeComponentKind Indicates the numerical type used to store the data\r\n * @param babylonTransformNode The Babylon mesh to get the vertices data from\r\n * @param binaryWriter The buffer to write the bufferview data to\r\n * @param byteStride\r\n */\r\n private _createBufferViewKind(\r\n kind: string,\r\n attributeComponentKind: AccessorComponentType,\r\n babylonTransformNode: TransformNode,\r\n binaryWriter: _BinaryWriter,\r\n byteStride: number\r\n ) {\r\n const bufferMesh =\r\n babylonTransformNode instanceof Mesh\r\n ? (babylonTransformNode as Mesh)\r\n : babylonTransformNode instanceof InstancedMesh\r\n ? (babylonTransformNode as InstancedMesh).sourceMesh\r\n : null;\r\n\r\n if (bufferMesh) {\r\n const vertexBuffer = bufferMesh.getVertexBuffer(kind, true);\r\n const vertexData = bufferMesh.getVerticesData(kind, undefined, undefined, true);\r\n\r\n if (vertexBuffer && vertexData) {\r\n const typeByteLength = VertexBuffer.GetTypeByteLength(attributeComponentKind);\r\n const byteLength = vertexData.length * typeByteLength;\r\n const bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, byteStride, kind + \" - \" + bufferMesh.name);\r\n this._bufferViews.push(bufferView);\r\n\r\n this._writeAttributeData(kind, attributeComponentKind, vertexData, byteStride / typeByteLength, binaryWriter, babylonTransformNode);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The primitive mode of the Babylon mesh\r\n * @param babylonMesh The BabylonJS mesh\r\n * @returns Unsigned integer of the primitive mode or null\r\n */\r\n private _getMeshPrimitiveMode(babylonMesh: AbstractMesh): number {\r\n if (babylonMesh instanceof LinesMesh) {\r\n return Material.LineListDrawMode;\r\n }\r\n if (babylonMesh instanceof InstancedMesh || babylonMesh instanceof Mesh) {\r\n const baseMesh = babylonMesh instanceof Mesh ? babylonMesh : babylonMesh.sourceMesh;\r\n if (typeof baseMesh.overrideRenderingFillMode === \"number\") {\r\n return baseMesh.overrideRenderingFillMode;\r\n }\r\n }\r\n return babylonMesh.material ? babylonMesh.material.fillMode : Material.TriangleFillMode;\r\n }\r\n\r\n /**\r\n * Sets the primitive mode of the glTF mesh primitive\r\n * @param meshPrimitive glTF mesh primitive\r\n * @param primitiveMode The primitive mode\r\n */\r\n private _setPrimitiveMode(meshPrimitive: IMeshPrimitive, primitiveMode: number) {\r\n switch (primitiveMode) {\r\n case Material.TriangleFillMode: {\r\n // glTF defaults to using Triangle Mode\r\n break;\r\n }\r\n case Material.TriangleStripDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.TRIANGLE_STRIP;\r\n break;\r\n }\r\n case Material.TriangleFanDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.TRIANGLE_FAN;\r\n break;\r\n }\r\n case Material.PointListDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.POINTS;\r\n break;\r\n }\r\n case Material.PointFillMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.POINTS;\r\n break;\r\n }\r\n case Material.LineLoopDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.LINE_LOOP;\r\n break;\r\n }\r\n case Material.LineListDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.LINES;\r\n break;\r\n }\r\n case Material.LineStripDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.LINE_STRIP;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the vertex attribute accessor based of the glTF mesh primitive\r\n * @param meshPrimitive glTF mesh primitive\r\n * @param attributeKind vertex attribute\r\n */\r\n private _setAttributeKind(attributes: { [name: string]: number }, attributeKind: string): void {\r\n switch (attributeKind) {\r\n case VertexBuffer.PositionKind: {\r\n attributes.POSITION = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.NormalKind: {\r\n attributes.NORMAL = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.ColorKind: {\r\n attributes.COLOR_0 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n attributes.TANGENT = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.UVKind: {\r\n attributes.TEXCOORD_0 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.UV2Kind: {\r\n attributes.TEXCOORD_1 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.MatricesIndicesKind: {\r\n attributes.JOINTS_0 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.MatricesIndicesExtraKind: {\r\n attributes.JOINTS_1 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.MatricesWeightsKind: {\r\n attributes.WEIGHTS_0 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.MatricesWeightsExtraKind: {\r\n attributes.WEIGHTS_1 = this._accessors.length - 1;\r\n break;\r\n }\r\n default: {\r\n Tools.Warn(\"Unsupported Vertex Buffer Type: \" + attributeKind);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets data for the primitive attributes of each submesh\r\n * @param mesh glTF Mesh object to store the primitive attribute information\r\n * @param babylonTransformNode Babylon mesh to get the primitive attribute data from\r\n * @param binaryWriter Buffer to write the attribute data to\r\n * @returns promise that resolves when done setting the primitive attributes\r\n */\r\n private _setPrimitiveAttributesAsync(mesh: IMesh, babylonTransformNode: TransformNode, binaryWriter: _BinaryWriter): Promise<void> {\r\n const promises: Promise<IMeshPrimitive>[] = [];\r\n let bufferMesh: Nullable<Mesh> = null;\r\n let bufferView: IBufferView;\r\n let minMax: { min: Nullable<number[]>; max: Nullable<number[]> };\r\n\r\n if (babylonTransformNode instanceof Mesh) {\r\n bufferMesh = babylonTransformNode as Mesh;\r\n } else if (babylonTransformNode instanceof InstancedMesh) {\r\n bufferMesh = (babylonTransformNode as InstancedMesh).sourceMesh;\r\n }\r\n const attributeData: _IVertexAttributeData[] = [\r\n { kind: VertexBuffer.PositionKind, accessorType: AccessorType.VEC3, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 12 },\r\n { kind: VertexBuffer.NormalKind, accessorType: AccessorType.VEC3, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 12 },\r\n { kind: VertexBuffer.ColorKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 16 },\r\n { kind: VertexBuffer.TangentKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 16 },\r\n { kind: VertexBuffer.UVKind, accessorType: AccessorType.VEC2, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 8 },\r\n { kind: VertexBuffer.UV2Kind, accessorType: AccessorType.VEC2, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 8 },\r\n { kind: VertexBuffer.MatricesIndicesKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.UNSIGNED_SHORT, byteStride: 8 },\r\n { kind: VertexBuffer.MatricesIndicesExtraKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.UNSIGNED_SHORT, byteStride: 8 },\r\n { kind: VertexBuffer.MatricesWeightsKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 16 },\r\n { kind: VertexBuffer.MatricesWeightsExtraKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 16 },\r\n ];\r\n\r\n if (bufferMesh) {\r\n let indexBufferViewIndex: Nullable<number> = null;\r\n const primitiveMode = this._getMeshPrimitiveMode(bufferMesh);\r\n const vertexAttributeBufferViews: { [attributeKind: string]: number } = {};\r\n const morphTargetManager = bufferMesh.morphTargetManager;\r\n\r\n // For each BabylonMesh, create bufferviews for each 'kind'\r\n for (const attribute of attributeData) {\r\n const attributeKind = attribute.kind;\r\n const attributeComponentKind = attribute.accessorComponentType;\r\n if (bufferMesh.isVerticesDataPresent(attributeKind, true)) {\r\n const vertexBuffer = this._getVertexBufferFromMesh(attributeKind, bufferMesh);\r\n attribute.byteStride = vertexBuffer\r\n ? vertexBuffer.getSize() * VertexBuffer.GetTypeByteLength(attribute.accessorComponentType)\r\n : VertexBuffer.DeduceStride(attributeKind) * 4;\r\n if (attribute.byteStride === 12) {\r\n attribute.accessorType = AccessorType.VEC3;\r\n }\r\n\r\n this._createBufferViewKind(attributeKind, attributeComponentKind, babylonTransformNode, binaryWriter, attribute.byteStride);\r\n attribute.bufferViewIndex = this._bufferViews.length - 1;\r\n vertexAttributeBufferViews[attributeKind] = attribute.bufferViewIndex;\r\n\r\n // Write any morph target data to the buffer and create an associated buffer view\r\n if (morphTargetManager) {\r\n for (let i = 0; i < morphTargetManager.numTargets; ++i) {\r\n const morphTarget = morphTargetManager.getTarget(i);\r\n const morphTargetInfo = this._createMorphTargetBufferViewKind(\r\n attributeKind,\r\n attribute.accessorType,\r\n attributeComponentKind,\r\n bufferMesh,\r\n morphTarget,\r\n binaryWriter,\r\n attribute.byteStride\r\n );\r\n\r\n // Store info about the morph target that will be needed later when creating per-submesh accessors\r\n if (morphTargetInfo) {\r\n if (!attribute.morphTargetInfo) {\r\n attribute.morphTargetInfo = [];\r\n }\r\n attribute.morphTargetInfo[i] = morphTargetInfo;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (bufferMesh.getTotalIndices()) {\r\n const indices = bufferMesh.getIndices();\r\n if (indices) {\r\n const byteLength = indices.length * 4;\r\n bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, undefined, \"Indices - \" + bufferMesh.name);\r\n this._bufferViews.push(bufferView);\r\n indexBufferViewIndex = this._bufferViews.length - 1;\r\n\r\n for (let k = 0, length = indices.length; k < length; ++k) {\r\n binaryWriter.setUInt32(indices[k]);\r\n }\r\n }\r\n }\r\n\r\n if (bufferMesh.subMeshes) {\r\n // go through all mesh primitives (submeshes)\r\n for (const submesh of bufferMesh.subMeshes) {\r\n let babylonMaterial = submesh.getMaterial() || bufferMesh.getScene().defaultMaterial;\r\n\r\n let materialIndex: Nullable<number> = null;\r\n if (babylonMaterial) {\r\n if (bufferMesh instanceof LinesMesh) {\r\n // get the color from the lines mesh and set it in the material\r\n const material: IMaterial = {\r\n name: bufferMesh.name + \" material\",\r\n };\r\n if (!bufferMesh.color.equals(Color3.White()) || bufferMesh.alpha < 1) {\r\n material.pbrMetallicRoughness = {\r\n baseColorFactor: bufferMesh.color.asArray().concat([bufferMesh.alpha]),\r\n };\r\n }\r\n this._materials.push(material);\r\n materialIndex = this._materials.length - 1;\r\n } else if (babylonMaterial instanceof MultiMaterial) {\r\n const subMaterial = babylonMaterial.subMaterials[submesh.materialIndex];\r\n if (subMaterial) {\r\n babylonMaterial = subMaterial;\r\n materialIndex = this._materialMap[babylonMaterial.uniqueId];\r\n }\r\n } else {\r\n materialIndex = this._materialMap[babylonMaterial.uniqueId];\r\n }\r\n }\r\n\r\n const glTFMaterial: Nullable<IMaterial> = materialIndex != null ? this._materials[materialIndex] : null;\r\n\r\n const meshPrimitive: IMeshPrimitive = { attributes: {} };\r\n this._setPrimitiveMode(meshPrimitive, primitiveMode);\r\n\r\n for (const attribute of attributeData) {\r\n const attributeKind = attribute.kind;\r\n if ((attributeKind === VertexBuffer.UVKind || attributeKind === VertexBuffer.UV2Kind) && !this._options.exportUnusedUVs) {\r\n if (!glTFMaterial || !this._glTFMaterialExporter._hasTexturesPresent(glTFMaterial)) {\r\n continue;\r\n }\r\n }\r\n const vertexData = bufferMesh.getVerticesData(attributeKind, undefined, undefined, true);\r\n if (vertexData) {\r\n const vertexBuffer = this._getVertexBufferFromMesh(attributeKind, bufferMesh);\r\n if (vertexBuffer) {\r\n const stride = vertexBuffer.getSize();\r\n const bufferViewIndex = attribute.bufferViewIndex;\r\n if (bufferViewIndex != undefined) {\r\n // check to see if bufferviewindex has a numeric value assigned.\r\n minMax = { min: null, max: null };\r\n if (attributeKind == VertexBuffer.PositionKind) {\r\n minMax = _GLTFUtilities._CalculateMinMaxPositions(vertexData, 0, vertexData.length / stride);\r\n }\r\n const accessor = _GLTFUtilities._CreateAccessor(\r\n bufferViewIndex,\r\n attributeKind + \" - \" + babylonTransformNode.name,\r\n attribute.accessorType,\r\n attribute.accessorComponentType,\r\n vertexData.length / stride,\r\n 0,\r\n minMax.min,\r\n minMax.max\r\n );\r\n this._accessors.push(accessor);\r\n this._setAttributeKind(meshPrimitive.attributes, attributeKind);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (indexBufferViewIndex) {\r\n // Create accessor\r\n const accessor = _GLTFUtilities._CreateAccessor(\r\n indexBufferViewIndex,\r\n \"indices - \" + babylonTransformNode.name,\r\n AccessorType.SCALAR,\r\n AccessorComponentType.UNSIGNED_INT,\r\n submesh.indexCount,\r\n submesh.indexStart * 4,\r\n null,\r\n null\r\n );\r\n this._accessors.push(accessor);\r\n meshPrimitive.indices = this._accessors.length - 1;\r\n }\r\n\r\n if (Object.keys(meshPrimitive.attributes).length > 0) {\r\n const sideOrientation = babylonMaterial._getEffectiveOrientation(bufferMesh);\r\n\r\n if (sideOrientation === (this._babylonScene.useRightHandedSystem ? Material.ClockWiseSideOrientation : Material.CounterClockWiseSideOrientation)) {\r\n let byteOffset = indexBufferViewIndex != null ? this._bufferViews[indexBufferViewIndex].byteOffset : null;\r\n if (byteOffset == null) {\r\n byteOffset = 0;\r\n }\r\n let babylonIndices: Nullable<IndicesArray> = null;\r\n if (indexBufferViewIndex != null) {\r\n babylonIndices = bufferMesh.getIndices();\r\n }\r\n if (babylonIndices) {\r\n this._reorderIndicesBasedOnPrimitiveMode(submesh, primitiveMode, babylonIndices, byteOffset, binaryWriter);\r\n } else {\r\n for (const attribute of attributeData) {\r\n const vertexData = bufferMesh.getVerticesData(attribute.kind, undefined, undefined, true);\r\n if (vertexData) {\r\n const byteOffset = this._bufferViews[vertexAttributeBufferViews[attribute.kind]].byteOffset || 0;\r\n this._reorderVertexAttributeDataBasedOnPrimitiveMode(submesh, primitiveMode, attribute.kind, vertexData, byteOffset, binaryWriter);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (materialIndex != null) {\r\n meshPrimitive.material = materialIndex;\r\n }\r\n }\r\n\r\n // If there are morph targets, write out targets and associated accessors\r\n if (morphTargetManager) {\r\n // By convention, morph target names are stored in the mesh extras.\r\n if (!mesh.extras) {\r\n mesh.extras = {};\r\n }\r\n mesh.extras.targetNames = [];\r\n\r\n for (let i = 0; i < morphTargetManager.numTargets; ++i) {\r\n const morphTarget = morphTargetManager.getTarget(i);\r\n mesh.extras.targetNames.push(morphTarget.name);\r\n\r\n for (const attribute of attributeData) {\r\n const morphTargetInfo = attribute.morphTargetInfo?.[i];\r\n if (morphTargetInfo) {\r\n // Write the accessor\r\n const byteOffset = 0;\r\n const accessor = _GLTFUtilities._CreateAccessor(\r\n morphTargetInfo.bufferViewIndex,\r\n `${attribute.kind} - ${morphTarget.name} (Morph Target)`,\r\n morphTargetInfo.accessorType,\r\n attribute.accessorComponentType,\r\n morphTargetInfo.vertexCount,\r\n byteOffset,\r\n morphTargetInfo.minMax?.min?.asArray() ?? null,\r\n morphTargetInfo.minMax?.max?.asArray() ?? null\r\n );\r\n this._accessors.push(accessor);\r\n\r\n // Create a target that references the new accessor\r\n if (!meshPrimitive.targets) {\r\n meshPrimitive.targets = [];\r\n }\r\n\r\n if (!meshPrimitive.targets[i]) {\r\n meshPrimitive.targets[i] = {};\r\n }\r\n\r\n this._setAttributeKind(meshPrimitive.targets[i], attribute.kind);\r\n }\r\n }\r\n }\r\n }\r\n\r\n mesh.primitives.push(meshPrimitive);\r\n\r\n this._extensionsPostExportMeshPrimitiveAsync(\"postExport\", meshPrimitive, submesh, binaryWriter);\r\n promises.push();\r\n }\r\n }\r\n }\r\n return Promise.all(promises).then(() => {\r\n /* do nothing */\r\n });\r\n }\r\n\r\n /**\r\n * Creates a glTF scene based on the array of meshes\r\n * Returns the total byte offset\r\n * @param binaryWriter Buffer to write binary data to\r\n * @returns a promise that resolves when done\r\n */\r\n private _createSceneAsync(binaryWriter: _BinaryWriter): Promise<void> {\r\n const scene: IScene = { nodes: [] };\r\n let glTFNodeIndex: number;\r\n let glTFNode: INode;\r\n let directDescendents: Node[];\r\n const nodes: Node[] = [...this._babylonScene.transformNodes, ...this._babylonScene.meshes, ...this._babylonScene.lights, ...this._babylonScene.cameras];\r\n const removedRootNodes = new Set<Node>();\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 // Remove no-op root nodes\r\n if ((this._options.removeNoopRootNodes ?? true) && !this._options.includeCoordinateSystemConversionNodes) {\r\n for (const rootNode of this._babylonScene.rootNodes) {\r\n if (isNoopNode(rootNode, this._babylonScene.useRightHandedSystem)) {\r\n removedRootNodes.add(rootNode);\r\n\r\n // Exclude the node from list of nodes to export\r\n nodes.splice(nodes.indexOf(rootNode), 1);\r\n }\r\n }\r\n }\r\n\r\n // Export babylon cameras to glTFCamera\r\n const cameraMap = new Map<Camera, number>();\r\n this._babylonScene.cameras.forEach((camera) => {\r\n if (this._options.shouldExportNode && !this._options.shouldExportNode(camera)) {\r\n return;\r\n }\r\n\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\r\n cameraMap.set(camera, this._cameras.length);\r\n this._cameras.push(glTFCamera);\r\n });\r\n\r\n const [exportNodes, exportMaterials] = this._getExportNodes(nodes);\r\n return this._glTFMaterialExporter._convertMaterialsToGLTFAsync(exportMaterials, ImageMimeType.PNG, true).then(() => {\r\n return this._createNodeMapAndAnimationsAsync(exportNodes, binaryWriter).then((nodeMap) => {\r\n return this._createSkinsAsync(nodeMap, binaryWriter).then((skinMap) => {\r\n this._nodeMap = nodeMap;\r\n\r\n this._totalByteLength = binaryWriter.getByteOffset();\r\n if (this._totalByteLength == undefined) {\r\n throw new Error(\"undefined byte length!\");\r\n }\r\n\r\n // Build Hierarchy with the node map.\r\n for (const babylonNode of nodes) {\r\n glTFNodeIndex = this._nodeMap[babylonNode.uniqueId];\r\n if (glTFNodeIndex !== undefined) {\r\n glTFNode = this._nodes[glTFNodeIndex];\r\n\r\n if (babylonNode.metadata) {\r\n if (this._options.metadataSelector) {\r\n glTFNode.extras = this._options.metadataSelector(babylonNode.metadata);\r\n } else if (babylonNode.metadata.gltf) {\r\n glTFNode.extras = babylonNode.metadata.gltf.extras;\r\n }\r\n }\r\n\r\n if (babylonNode instanceof Camera) {\r\n glTFNode.camera = cameraMap.get(babylonNode);\r\n }\r\n\r\n if (this._options.shouldExportNode && !this._options.shouldExportNode(babylonNode)) {\r\n Tools.Log(\"Omitting \" + babylonNode.name + \" from scene.\");\r\n } else {\r\n if (!babylonNode.parent && !this._babylonScene.useRightHandedSystem) {\r\n convertNodeHandedness(glTFNode);\r\n }\r\n\r\n if (!babylonNode.parent || removedRootNodes.has(babylonNode.parent)) {\r\n scene.nodes.push(glTFNodeIndex);\r\n }\r\n }\r\n\r\n if (babylonNode instanceof Mesh) {\r\n if (babylonNode.skeleton) {\r\n glTFNode.skin = skinMap[babylonNode.skeleton.uniqueId];\r\n }\r\n }\r\n\r\n directDescendents = babylonNode.getDescendants(true);\r\n if (!glTFNode.children && directDescendents && directDescendents.length) {\r\n const children: number[] = [];\r\n for (const descendent of directDescendents) {\r\n if (this._nodeMap[descendent.uniqueId] != null) {\r\n children.push(this._nodeMap[descendent.uniqueId]);\r\n }\r\n }\r\n if (children.length) {\r\n glTFNode.children = children;\r\n }\r\n }\r\n }\r\n }\r\n if (scene.nodes.length) {\r\n this._scenes.push(scene);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Getting the nodes and materials that would be exported.\r\n * @param nodes Babylon transform nodes\r\n * @returns Set of materials which would be exported.\r\n */\r\n private _getExportNodes(nodes: Node[]): [Node[], Set<Material>] {\r\n const exportNodes: Node[] = [];\r\n const exportMaterials: Set<Material> = new Set<Material>();\r\n\r\n for (const babylonNode of nodes) {\r\n if (!this._options.shouldExportNode || this._options.shouldExportNode(babylonNode)) {\r\n exportNodes.push(babylonNode);\r\n\r\n const babylonMesh = babylonNode as AbstractMesh;\r\n if (babylonMesh.subMeshes && babylonMesh.subMeshes.length > 0) {\r\n const material = babylonMesh.material || babylonMesh.getScene().defaultMaterial;\r\n if (material instanceof MultiMaterial) {\r\n for (const subMaterial of material.subMaterials) {\r\n if (subMaterial) {\r\n exportMaterials.add(subMaterial);\r\n }\r\n }\r\n } else {\r\n exportMaterials.add(material);\r\n }\r\n }\r\n } else {\r\n `Excluding node ${babylonNode.name}`;\r\n }\r\n }\r\n\r\n return [exportNodes, exportMaterials];\r\n }\r\n\r\n /**\r\n * Creates a mapping of Node unique id to node index and handles animations\r\n * @param nodes Babylon transform nodes\r\n * @param binaryWriter Buffer to write binary data to\r\n * @returns Node mapping of unique id to index\r\n */\r\n private _createNodeMapAndAnimationsAsync(nodes: Node[], binaryWriter: _BinaryWriter): Promise<{ [key: number]: number }> {\r\n let promiseChain = Promise.resolve();\r\n const nodeMap: { [key: number]: number } = {};\r\n let nodeIndex: number;\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 for (const babylonNode of nodes) {\r\n promiseChain = promiseChain.then(() => {\r\n return this._createNodeAsync(babylonNode, binaryWriter).then((node) => {\r\n const promise = this._extensionsPostExportNodeAsync(\"createNodeAsync\", node, babylonNode, nodeMap, binaryWriter);\r\n if (promise == null) {\r\n Tools.Warn(`Not exporting node ${babylonNode.name}`);\r\n return Promise.resolve();\r\n } else {\r\n return promise.then((node) => {\r\n if (!node) {\r\n return;\r\n }\r\n this._nodes.push(node);\r\n nodeIndex = this._nodes.length - 1;\r\n nodeMap[babylonNode.uniqueId] = nodeIndex;\r\n\r\n if (!this._babylonScene.animationGroups.length) {\r\n _GLTFAnimation._CreateMorphTargetAnimationFromMorphTargetAnimations(\r\n babylonNode,\r\n runtimeGLTFAnimation,\r\n idleGLTFAnimations,\r\n nodeMap,\r\n this._nodes,\r\n binaryWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\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 nodeMap,\r\n this._nodes,\r\n binaryWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\r\n this._options.shouldExportAnimation\r\n );\r\n }\r\n }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n return promiseChain.then(() => {\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 if (this._babylonScene.animationGroups.length) {\r\n _GLTFAnimation._CreateNodeAndMorphAnimationFromAnimationGroups(\r\n this._babylonScene,\r\n this._animations,\r\n nodeMap,\r\n binaryWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\r\n this._options.shouldExportAnimation\r\n );\r\n }\r\n\r\n return nodeMap;\r\n });\r\n }\r\n\r\n /**\r\n * Creates a glTF node from a Babylon mesh\r\n * @param babylonNode Source Babylon mesh\r\n * @param binaryWriter Buffer for storing geometry data\r\n * @returns glTF node\r\n */\r\n private _createNodeAsync(babylonNode: Node, binaryWriter: _BinaryWriter): Promise<INode> {\r\n return Promise.resolve().then(() => {\r\n // create node to hold translation/rotation/scale and the mesh\r\n const node: INode = {};\r\n // create mesh\r\n const mesh: IMesh = { primitives: [] };\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 // Set transformation\r\n this._setNodeTransformation(node, babylonNode);\r\n if (babylonNode instanceof Mesh) {\r\n const morphTargetManager = babylonNode.morphTargetManager;\r\n if (morphTargetManager && morphTargetManager.numTargets > 0) {\r\n mesh.weights = [];\r\n for (let i = 0; i < morphTargetManager.numTargets; ++i) {\r\n mesh.weights.push(morphTargetManager.getTarget(i).influence);\r\n }\r\n }\r\n }\r\n return this._setPrimitiveAttributesAsync(mesh, babylonNode, binaryWriter).then(() => {\r\n if (mesh.primitives.length) {\r\n this._meshes.push(mesh);\r\n node.mesh = this._meshes.length - 1;\r\n }\r\n return node;\r\n });\r\n } else if (babylonNode instanceof Camera) {\r\n this._setCameraTransformation(node, babylonNode);\r\n return node;\r\n } else {\r\n return node;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Creates a glTF skin from a Babylon skeleton\r\n * @param nodeMap Babylon transform nodes\r\n * @param binaryWriter Buffer to write binary data to\r\n * @returns Node mapping of unique id to index\r\n */\r\n private _createSkinsAsync(nodeMap: { [key: number]: number }, binaryWriter: _BinaryWriter): Promise<{ [key: number]: number }> {\r\n const promiseChain = Promise.resolve();\r\n const skinMap: { [key: number]: number } = {};\r\n for (const skeleton of this._babylonScene.skeletons) {\r\n if (skeleton.bones.length <= 0) {\r\n continue;\r\n }\r\n // create skin\r\n const skin: ISkin = { joints: [] };\r\n const inverseBindMatrices: Matrix[] = [];\r\n\r\n const boneIndexMap: { [index: number]: Bone } = {};\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 for (let boneIndex = 0; boneIndex <= maxBoneIndex; ++boneIndex) {\r\n const bone = boneIndexMap[boneIndex];\r\n inverseBindMatrices.push(bone.getInvertedAbsoluteTransform());\r\n\r\n const transformNode = bone.getTransformNode();\r\n if (transformNode && nodeMap[transformNode.uniqueId] !== null && nodeMap[transformNode.uniqueId] !== undefined) {\r\n skin.joints.push(nodeMap[transformNode.uniqueId]);\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 if (skin.joints.length > 0) {\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 = binaryWriter.getByteOffset();\r\n const bufferView = _GLTFUtilities._CreateBufferView(0, bufferViewOffset, byteLength, undefined, \"InverseBindMatrices\" + \" - \" + skeleton.name);\r\n this._bufferViews.push(bufferView);\r\n const bufferViewIndex = this._bufferViews.length - 1;\r\n const bindMatrixAccessor = _GLTFUtilities._CreateAccessor(\r\n bufferViewIndex,\r\n \"InverseBindMatrices\" + \" - \" + skeleton.name,\r\n AccessorType.MAT4,\r\n AccessorComponentType.FLOAT,\r\n inverseBindMatrices.length,\r\n null,\r\n null,\r\n null\r\n );\r\n const inverseBindAccessorIndex = this._accessors.push(bindMatrixAccessor) - 1;\r\n skin.inverseBindMatrices = inverseBindAccessorIndex;\r\n this._skins.push(skin);\r\n skinMap[skeleton.uniqueId] = this._skins.length - 1;\r\n\r\n inverseBindMatrices.forEach((mat) => {\r\n mat.m.forEach((cell: number) => {\r\n binaryWriter.setFloat32(cell);\r\n });\r\n });\r\n }\r\n }\r\n return promiseChain.then(() => {\r\n return skinMap;\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n *\r\n * Stores glTF binary data. If the array buffer byte length is exceeded, it doubles in size dynamically\r\n */\r\nexport class _BinaryWriter {\r\n /**\r\n * Array buffer which stores all binary data\r\n */\r\n private _arrayBuffer: ArrayBuffer;\r\n /**\r\n * View of the array buffer\r\n */\r\n private _dataView: DataView;\r\n /**\r\n * byte offset of data in array buffer\r\n */\r\n private _byteOffset: number;\r\n /**\r\n * Initialize binary writer with an initial byte length\r\n * @param byteLength Initial byte length of the array buffer\r\n */\r\n constructor(byteLength: number) {\r\n this._arrayBuffer = new ArrayBuffer(byteLength);\r\n this._dataView = new DataView(this._arrayBuffer);\r\n this._byteOffset = 0;\r\n }\r\n /**\r\n * Resize the array buffer to the specified byte length\r\n * @param byteLength The new byte length\r\n * @returns The resized array buffer\r\n */\r\n private _resizeBuffer(byteLength: number): ArrayBuffer {\r\n const newBuffer = new ArrayBuffer(byteLength);\r\n const copyOldBufferSize = Math.min(this._arrayBuffer.byteLength, byteLength);\r\n const oldUint8Array = new Uint8Array(this._arrayBuffer, 0, copyOldBufferSize);\r\n const newUint8Array = new Uint8Array(newBuffer);\r\n newUint8Array.set(oldUint8Array, 0);\r\n this._arrayBuffer = newBuffer;\r\n this._dataView = new DataView(this._arrayBuffer);\r\n\r\n return newBuffer;\r\n }\r\n /**\r\n * Get an array buffer with the length of the byte offset\r\n * @returns ArrayBuffer resized to the byte offset\r\n */\r\n public getArrayBuffer(): ArrayBuffer {\r\n return this._resizeBuffer(this.getByteOffset());\r\n }\r\n /**\r\n * Get the byte offset of the array buffer\r\n * @returns byte offset\r\n */\r\n public getByteOffset(): number {\r\n if (this._byteOffset == undefined) {\r\n throw new Error(\"Byte offset is undefined!\");\r\n }\r\n return this._byteOffset;\r\n }\r\n /**\r\n * Stores an UInt8 in the array buffer\r\n * @param entry\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n */\r\n public setUInt8(entry: number, byteOffset?: number) {\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setUint8(byteOffset, entry);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n } else {\r\n if (this._byteOffset + 1 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setUint8(this._byteOffset, entry);\r\n this._byteOffset += 1;\r\n }\r\n }\r\n\r\n /**\r\n * Stores an UInt16 in the array buffer\r\n * @param entry\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n */\r\n public setUInt16(entry: number, byteOffset?: number) {\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setUint16(byteOffset, entry, true);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n } else {\r\n if (this._byteOffset + 2 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setUint16(this._byteOffset, entry, true);\r\n this._byteOffset += 2;\r\n }\r\n }\r\n\r\n /**\r\n * Gets an UInt32 in the array buffer\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n * @returns entry\r\n */\r\n public getUInt32(byteOffset: number): number {\r\n if (byteOffset < this._byteOffset) {\r\n return this._dataView.getUint32(byteOffset, true);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n throw new Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n }\r\n\r\n public getVector3Float32FromRef(vector3: Vector3, byteOffset: number): void {\r\n if (byteOffset + 8 > this._byteOffset) {\r\n Tools.Error(`BinaryWriter: byteoffset is greater than the current binary buffer length!`);\r\n } else {\r\n vector3.x = this._dataView.getFloat32(byteOffset, true);\r\n vector3.y = this._dataView.getFloat32(byteOffset + 4, true);\r\n vector3.z = this._dataView.getFloat32(byteOffset + 8, true);\r\n }\r\n }\r\n\r\n public setVector3Float32FromRef(vector3: Vector3, byteOffset: number): void {\r\n if (byteOffset + 8 > this._byteOffset) {\r\n Tools.Error(`BinaryWriter: byteoffset is greater than the current binary buffer length!`);\r\n } else {\r\n this._dataView.setFloat32(byteOffset, vector3.x, true);\r\n this._dataView.setFloat32(byteOffset + 4, vector3.y, true);\r\n this._dataView.setFloat32(byteOffset + 8, vector3.z, true);\r\n }\r\n }\r\n\r\n public getVector4Float32FromRef(vector4: Vector4, byteOffset: number): void {\r\n if (byteOffset + 12 > this._byteOffset) {\r\n Tools.Error(`BinaryWriter: byteoffset is greater than the current binary buffer length!`);\r\n } else {\r\n vector4.x = this._dataView.getFloat32(byteOffset, true);\r\n vector4.y = this._dataView.getFloat32(byteOffset + 4, true);\r\n vector4.z = this._dataView.getFloat32(byteOffset + 8, true);\r\n vector4.w = this._dataView.getFloat32(byteOffset + 12, true);\r\n }\r\n }\r\n\r\n public setVector4Float32FromRef(vector4: Vector4, byteOffset: number): void {\r\n if (byteOffset + 12 > this._byteOffset) {\r\n Tools.Error(`BinaryWriter: byteoffset is greater than the current binary buffer length!`);\r\n } else {\r\n this._dataView.setFloat32(byteOffset, vector4.x, true);\r\n this._dataView.setFloat32(byteOffset + 4, vector4.y, true);\r\n this._dataView.setFloat32(byteOffset + 8, vector4.z, true);\r\n this._dataView.setFloat32(byteOffset + 12, vector4.w, true);\r\n }\r\n }\r\n /**\r\n * Stores a Float32 in the array buffer\r\n * @param entry\r\n * @param byteOffset\r\n */\r\n public setFloat32(entry: number, byteOffset?: number) {\r\n if (isNaN(entry)) {\r\n Tools.Error(\"Invalid data being written!\");\r\n }\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setFloat32(byteOffset, entry, true);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary length!\");\r\n }\r\n }\r\n if (this._byteOffset + 4 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setFloat32(this._byteOffset, entry, true);\r\n this._byteOffset += 4;\r\n }\r\n /**\r\n * Stores an UInt32 in the array buffer\r\n * @param entry\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n */\r\n public setUInt32(entry: number, byteOffset?: number) {\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setUint32(byteOffset, entry, true);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n } else {\r\n if (this._byteOffset + 4 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setUint32(this._byteOffset, entry, true);\r\n this._byteOffset += 4;\r\n }\r\n }\r\n /**\r\n * Stores an Int16 in the array buffer\r\n * @param entry\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n */\r\n public setInt16(entry: number, byteOffset?: number) {\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setInt16(byteOffset, entry, true);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n } else {\r\n if (this._byteOffset + 2 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setInt16(this._byteOffset, entry, true);\r\n this._byteOffset += 2;\r\n }\r\n }\r\n /**\r\n * Stores a byte in the array buffer\r\n * @param entry\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n */\r\n public setByte(entry: number, byteOffset?: number) {\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setInt8(byteOffset, entry);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n } else {\r\n if (this._byteOffset + 1 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setInt8(this._byteOffset, entry);\r\n this._byteOffset++;\r\n }\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 { AccessorType, ImageMimeType, MeshPrimitiveMode, AccessorComponentType, CameraType } from \"babylonjs-gltf2interface\";\r\n\r\nimport type { FloatArray, IndicesArray, Nullable } from \"core/types\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3, Vector4, Quaternion } from \"core/Maths/math.vector\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { Node } from \"core/node\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport type { MorphTarget } from \"core/Morph/morphTarget\";\r\nimport { LinesMesh } from \"core/Meshes/linesMesh\";\r\nimport { InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport type { Bone } from \"core/Bones/bone\";\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\n\r\nimport type { IGLTFExporterExtensionV2 } from \"./glTFExporterExtension\";\r\nimport { _GLTFMaterialExporter } from \"./glTFMaterialExporter\";\r\nimport type { IExportOptions } from \"./glTFSerializer\";\r\nimport { _GLTFUtilities } from \"./glTFUtilities\";\r\nimport { GLTFData } from \"./glTFData\";\r\nimport { _GLTFAnimation } from \"./glTFAnimation\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\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\nfunction 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\nfunction convertNodeHandedness(node: INode): void {\r\n const translation = Vector3.FromArrayToRef(node.translation || [0, 0, 0], 0, TmpVectors.Vector3[0]);\r\n const rotation = Quaternion.FromArrayToRef(node.rotation || [0, 0, 0, 1], 0, TmpVectors.Quaternion[0]);\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[0]).multiplyToRef(convertHandednessMatrix, TmpVectors.Matrix[0]);\r\n\r\n matrix.decompose(scale, rotation, translation);\r\n\r\n if (translation.equalsToFloats(0, 0, 0)) {\r\n delete node.translation;\r\n } else {\r\n node.translation = translation.asArray();\r\n }\r\n\r\n if (Quaternion.IsIdentity(rotation)) {\r\n delete node.rotation;\r\n } else {\r\n node.rotation = rotation.asArray();\r\n }\r\n\r\n if (scale.equalsToFloats(1, 1, 1)) {\r\n delete node.scale;\r\n } else {\r\n node.scale = scale.asArray();\r\n }\r\n}\r\n\r\nfunction getBinaryWriterFunc(binaryWriter: _BinaryWriter, attributeComponentKind: AccessorComponentType): Nullable<(entry: number, byteOffset?: number) => void> {\r\n switch (attributeComponentKind) {\r\n case AccessorComponentType.UNSIGNED_BYTE: {\r\n return binaryWriter.setUInt8.bind(binaryWriter);\r\n }\r\n case AccessorComponentType.UNSIGNED_SHORT: {\r\n return binaryWriter.setUInt16.bind(binaryWriter);\r\n }\r\n case AccessorComponentType.UNSIGNED_INT: {\r\n return binaryWriter.setUInt32.bind(binaryWriter);\r\n }\r\n case AccessorComponentType.FLOAT: {\r\n return binaryWriter.setFloat32.bind(binaryWriter);\r\n }\r\n default: {\r\n Tools.Warn(\"Unsupported Attribute Component kind: \" + attributeComponentKind);\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Utility interface for storing vertex attribute data\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ninterface _IVertexAttributeData {\r\n /**\r\n * Specifies the Babylon Vertex Buffer Type (Position, Normal, Color, etc.)\r\n */\r\n kind: string;\r\n\r\n /**\r\n * Specifies the glTF Accessor Type (VEC2, VEC3, etc.)\r\n */\r\n accessorType: AccessorType;\r\n\r\n /**\r\n * Specifies the glTF Accessor Component Type (BYTE, UNSIGNED_BYTE, FLOAT, SHORT, INT, etc..)\r\n */\r\n accessorComponentType: AccessorComponentType;\r\n\r\n /**\r\n * Specifies the BufferView index for the vertex attribute data\r\n */\r\n bufferViewIndex?: number;\r\n\r\n /**\r\n * Specifies the number of bytes per attribute element (e.g. position would be 3 floats (x/y/z) where each float is 4 bytes, so a 12 byte stride)\r\n */\r\n byteStride?: number;\r\n\r\n /**\r\n * Specifies information about each morph target associated with this attribute\r\n */\r\n morphTargetInfo?: Readonly<{ bufferViewIndex: number; vertexCount: number; accessorType: AccessorType; minMax?: { min: Vector3; max: Vector3 } }>[];\r\n}\r\n\r\n/**\r\n * Converts Babylon Scene into glTF 2.0.\r\n * @internal\r\n */\r\nexport class _Exporter {\r\n /**\r\n * Stores the glTF to export\r\n */\r\n public _glTF: IGLTF;\r\n /**\r\n * Stores all generated buffer views, which represents views into the main glTF buffer data\r\n */\r\n public _bufferViews: IBufferView[];\r\n /**\r\n * Stores all the generated accessors, which is used for accessing the data within the buffer views in glTF\r\n */\r\n public _accessors: IAccessor[];\r\n /**\r\n * Stores all the generated nodes, which contains transform and/or mesh information per node\r\n */\r\n public _nodes: INode[];\r\n /**\r\n * Stores all the generated glTF scenes, which stores multiple node hierarchies\r\n */\r\n private _scenes: IScene[];\r\n /**\r\n * Stores all the generated glTF cameras\r\n */\r\n private _cameras: ICamera[];\r\n /**\r\n * Stores all the generated mesh information, each containing a set of primitives to render in glTF\r\n */\r\n private _meshes: IMesh[];\r\n /**\r\n * Stores all the generated material information, which represents the appearance of each primitive\r\n */\r\n public _materials: IMaterial[];\r\n\r\n public _materialMap: { [materialID: number]: number };\r\n /**\r\n * Stores all the generated texture information, which is referenced by glTF materials\r\n */\r\n public _textures: ITexture[];\r\n /**\r\n * Stores all the generated image information, which is referenced by glTF textures\r\n */\r\n public _images: IImage[];\r\n\r\n /**\r\n * Stores all the texture samplers\r\n */\r\n public _samplers: ISampler[];\r\n /**\r\n * Stores all the generated glTF skins\r\n */\r\n public _skins: ISkin[];\r\n /**\r\n * Stores all the generated animation samplers, which is referenced by glTF animations\r\n */\r\n /**\r\n * Stores the animations for glTF models\r\n */\r\n private _animations: IAnimation[];\r\n /**\r\n * Stores the total amount of bytes stored in the glTF buffer\r\n */\r\n private _totalByteLength: number;\r\n /**\r\n * Stores a reference to the Babylon scene containing the source geometry and material information\r\n */\r\n public _babylonScene: Scene;\r\n /**\r\n * Stores a map of the image data, where the key is the file name and the value\r\n * is the image data\r\n */\r\n public _imageData: { [fileName: string]: { data: ArrayBuffer; mimeType: ImageMimeType } };\r\n\r\n private _orderedImageData: Array<{ data: ArrayBuffer; mimeType: ImageMimeType }>;\r\n\r\n /**\r\n * Stores a map of the unique id of a node to its index in the node array\r\n */\r\n private _nodeMap: { [key: number]: number };\r\n\r\n /**\r\n * Baked animation sample rate\r\n */\r\n private _animationSampleRate: number;\r\n\r\n private _options: IExportOptions;\r\n\r\n private _localEngine: Engine;\r\n\r\n public _glTFMaterialExporter: _GLTFMaterialExporter;\r\n\r\n private _extensions: { [name: string]: IGLTFExporterExtensionV2 } = {};\r\n\r\n private static _ExtensionNames = new Array<string>();\r\n private static _ExtensionFactories: { [name: string]: (exporter: _Exporter) => IGLTFExporterExtensionV2 } = {};\r\n\r\n private _applyExtension<T>(\r\n node: Nullable<T>,\r\n extensions: IGLTFExporterExtensionV2[],\r\n index: number,\r\n actionAsync: (extension: IGLTFExporterExtensionV2, node: Nullable<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) => this._applyExtension(newNode, extensions, index + 1, actionAsync));\r\n }\r\n\r\n private _applyExtensions<T>(\r\n node: Nullable<T>,\r\n actionAsync: (extension: IGLTFExporterExtensionV2, node: Nullable<T>) => Promise<Nullable<T>> | undefined\r\n ): Promise<Nullable<T>> {\r\n const extensions: IGLTFExporterExtensionV2[] = [];\r\n for (const name of _Exporter._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: Nullable<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(\r\n context: string,\r\n meshPrimitive: IMeshPrimitive,\r\n babylonSubMesh: SubMesh,\r\n binaryWriter: _BinaryWriter\r\n ): Promise<Nullable<IMeshPrimitive>> {\r\n return this._applyExtensions(\r\n meshPrimitive,\r\n (extension, node) => extension.postExportMeshPrimitiveAsync && extension.postExportMeshPrimitiveAsync(context, node, babylonSubMesh, binaryWriter)\r\n );\r\n }\r\n\r\n public _extensionsPostExportNodeAsync(\r\n context: string,\r\n node: Nullable<INode>,\r\n babylonNode: Node,\r\n nodeMap: { [key: number]: number },\r\n binaryWriter: _BinaryWriter\r\n ): Promise<Nullable<INode>> {\r\n return this._applyExtensions(node, (extension, node) => extension.postExportNodeAsync && extension.postExportNodeAsync(context, node, babylonNode, nodeMap, binaryWriter));\r\n }\r\n\r\n public _extensionsPostExportMaterialAsync(context: string, material: Nullable<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 _Exporter._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 _Exporter._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 _Exporter._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 if (this._glTF.extensionsUsed == null) {\r\n this._glTF.extensionsUsed = [];\r\n }\r\n\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 if (this._glTF.extensionsRequired == null) {\r\n this._glTF.extensionsRequired = [];\r\n }\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 if (this._glTF.extensions == null) {\r\n this._glTF.extensions = {};\r\n }\r\n\r\n if (extension.onExporting) {\r\n extension.onExporting();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Load glTF serializer extensions\r\n */\r\n private _loadExtensions(): void {\r\n for (const name of _Exporter._ExtensionNames) {\r\n const extension = _Exporter._ExtensionFactories[name](this);\r\n this._extensions[name] = extension;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a glTF Exporter instance, which can accept optional exporter options\r\n * @param babylonScene Babylon scene object\r\n * @param options Options to modify the behavior of the exporter\r\n */\r\n public constructor(babylonScene?: Nullable<Scene>, options?: IExportOptions) {\r\n this._glTF = {\r\n asset: { generator: `Babylon.js v${Engine.Version}`, version: \"2.0\" },\r\n };\r\n babylonScene = babylonScene || EngineStore.LastCreatedScene;\r\n if (!babylonScene) {\r\n return;\r\n }\r\n this._babylonScene = babylonScene;\r\n this._bufferViews = [];\r\n this._accessors = [];\r\n this._meshes = [];\r\n this._scenes = [];\r\n this._cameras = [];\r\n this._nodes = [];\r\n this._images = [];\r\n this._materials = [];\r\n this._materialMap = [];\r\n this._textures = [];\r\n this._samplers = [];\r\n this._skins = [];\r\n this._animations = [];\r\n this._imageData = {};\r\n this._orderedImageData = [];\r\n this._options = options || {};\r\n this._animationSampleRate = this._options.animationSampleRate || 1 / 60;\r\n\r\n this._glTFMaterialExporter = new _GLTFMaterialExporter(this);\r\n this._loadExtensions();\r\n }\r\n\r\n public dispose() {\r\n for (const extensionKey in this._extensions) {\r\n const extension = this._extensions[extensionKey];\r\n\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 /**\r\n * Registers a glTF exporter extension\r\n * @param name Name of the extension to export\r\n * @param factory The factory function that creates the exporter extension\r\n */\r\n public static RegisterExtension(name: string, factory: (exporter: _Exporter) => IGLTFExporterExtensionV2): void {\r\n if (_Exporter.UnregisterExtension(name)) {\r\n Tools.Warn(`Extension with the name ${name} already exists`);\r\n }\r\n\r\n _Exporter._ExtensionFactories[name] = factory;\r\n _Exporter._ExtensionNames.push(name);\r\n }\r\n\r\n /**\r\n * Un-registers an exporter extension\r\n * @param name The name fo the exporter extension\r\n * @returns A boolean indicating whether the extension has been un-registered\r\n */\r\n public static UnregisterExtension(name: string): boolean {\r\n if (!_Exporter._ExtensionFactories[name]) {\r\n return false;\r\n }\r\n delete _Exporter._ExtensionFactories[name];\r\n\r\n const index = _Exporter._ExtensionNames.indexOf(name);\r\n if (index !== -1) {\r\n _Exporter._ExtensionNames.splice(index, 1);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _reorderIndicesBasedOnPrimitiveMode(submesh: SubMesh, primitiveMode: number, babylonIndices: IndicesArray, byteOffset: number, binaryWriter: _BinaryWriter) {\r\n switch (primitiveMode) {\r\n case Material.TriangleFillMode: {\r\n if (!byteOffset) {\r\n byteOffset = 0;\r\n }\r\n for (let i = submesh.indexStart, length = submesh.indexStart + submesh.indexCount; i < length; i = i + 3) {\r\n const index = byteOffset + i * 4;\r\n // swap the second and third indices\r\n const secondIndex = binaryWriter.getUInt32(index + 4);\r\n const thirdIndex = binaryWriter.getUInt32(index + 8);\r\n binaryWriter.setUInt32(thirdIndex, index + 4);\r\n binaryWriter.setUInt32(secondIndex, index + 8);\r\n }\r\n break;\r\n }\r\n case Material.TriangleFanDrawMode: {\r\n for (let i = submesh.indexStart + submesh.indexCount - 1, start = submesh.indexStart; i >= start; --i) {\r\n binaryWriter.setUInt32(babylonIndices[i], byteOffset);\r\n byteOffset += 4;\r\n }\r\n break;\r\n }\r\n case Material.TriangleStripDrawMode: {\r\n if (submesh.indexCount >= 3) {\r\n binaryWriter.setUInt32(babylonIndices[submesh.indexStart + 2], byteOffset + 4);\r\n binaryWriter.setUInt32(babylonIndices[submesh.indexStart + 1], byteOffset + 8);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Reorders the vertex attribute data based on the primitive mode. This is necessary when indices are not available and the winding order is\r\n * clock-wise during export to glTF\r\n * @param submesh BabylonJS submesh\r\n * @param primitiveMode Primitive mode of the mesh\r\n * @param vertexBufferKind The type of vertex attribute\r\n * @param meshAttributeArray The vertex attribute data\r\n * @param byteOffset The offset to the binary data\r\n * @param binaryWriter The binary data for the glTF file\r\n */\r\n private _reorderVertexAttributeDataBasedOnPrimitiveMode(\r\n submesh: SubMesh,\r\n primitiveMode: number,\r\n vertexBufferKind: string,\r\n meshAttributeArray: FloatArray,\r\n byteOffset: number,\r\n binaryWriter: _BinaryWriter\r\n ): void {\r\n switch (primitiveMode) {\r\n case Material.TriangleFillMode: {\r\n this._reorderTriangleFillMode(submesh, vertexBufferKind, meshAttributeArray, byteOffset, binaryWriter);\r\n break;\r\n }\r\n case Material.TriangleStripDrawMode: {\r\n this._reorderTriangleStripDrawMode(submesh, vertexBufferKind, meshAttributeArray, byteOffset, binaryWriter);\r\n break;\r\n }\r\n case Material.TriangleFanDrawMode: {\r\n this._reorderTriangleFanMode(submesh, vertexBufferKind, meshAttributeArray, byteOffset, binaryWriter);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Reorders the vertex attributes in the correct triangle mode order . This is necessary when indices are not available and the winding order is\r\n * clock-wise during export to glTF\r\n * @param submesh BabylonJS submesh\r\n * @param vertexBufferKind The type of vertex attribute\r\n * @param meshAttributeArray The vertex attribute data\r\n * @param byteOffset The offset to the binary data\r\n * @param binaryWriter The binary data for the glTF file\r\n */\r\n private _reorderTriangleFillMode(submesh: SubMesh, vertexBufferKind: string, meshAttributeArray: FloatArray, byteOffset: number, binaryWriter: _BinaryWriter) {\r\n const vertexBuffer = this._getVertexBufferFromMesh(vertexBufferKind, submesh.getMesh() as Mesh);\r\n if (vertexBuffer) {\r\n const stride = vertexBuffer.byteStride / VertexBuffer.GetTypeByteLength(vertexBuffer.type);\r\n if (submesh.verticesCount % 3 !== 0) {\r\n Tools.Error(\"The submesh vertices for the triangle fill mode is not divisible by 3!\");\r\n } else {\r\n const vertexData: Vector2[] | Vector3[] | Vector4[] = [];\r\n let index = 0;\r\n switch (vertexBufferKind) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind: {\r\n for (let x = submesh.verticesStart; x < submesh.verticesStart + submesh.verticesCount; x = x + 3) {\r\n index = x * stride;\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index));\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + stride));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n for (let x = submesh.verticesStart; x < submesh.verticesStart + submesh.verticesCount; x = x + 3) {\r\n index = x * stride;\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index));\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index + stride));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.ColorKind: {\r\n const size = vertexBuffer.getSize();\r\n for (let x = submesh.verticesStart; x < submesh.verticesStart + submesh.verticesCount; x = x + size) {\r\n index = x * stride;\r\n if (size === 4) {\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index));\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index + stride));\r\n } else {\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index));\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + stride));\r\n }\r\n }\r\n break;\r\n }\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind: {\r\n for (let x = submesh.verticesStart; x < submesh.verticesStart + submesh.verticesCount; x = x + 3) {\r\n index = x * stride;\r\n (vertexData as Vector2[]).push(Vector2.FromArray(meshAttributeArray, index));\r\n (vertexData as Vector2[]).push(Vector2.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector2[]).push(Vector2.FromArray(meshAttributeArray, index + stride));\r\n }\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported Vertex Buffer type: ${vertexBufferKind}`);\r\n }\r\n }\r\n this._writeVertexAttributeData(vertexData, byteOffset, vertexBufferKind, binaryWriter);\r\n }\r\n } else {\r\n Tools.Warn(`reorderTriangleFillMode: Vertex Buffer Kind ${vertexBufferKind} not present!`);\r\n }\r\n }\r\n\r\n /**\r\n * Reorders the vertex attributes in the correct triangle strip order. This is necessary when indices are not available and the winding order is\r\n * clock-wise during export to glTF\r\n * @param submesh BabylonJS submesh\r\n * @param vertexBufferKind The type of vertex attribute\r\n * @param meshAttributeArray The vertex attribute data\r\n * @param byteOffset The offset to the binary data\r\n * @param binaryWriter The binary data for the glTF file\r\n */\r\n private _reorderTriangleStripDrawMode(submesh: SubMesh, vertexBufferKind: string, meshAttributeArray: FloatArray, byteOffset: number, binaryWriter: _BinaryWriter) {\r\n const vertexBuffer = this._getVertexBufferFromMesh(vertexBufferKind, submesh.getMesh() as Mesh);\r\n if (vertexBuffer) {\r\n const stride = vertexBuffer.byteStride / VertexBuffer.GetTypeByteLength(vertexBuffer.type);\r\n\r\n const vertexData: Vector2[] | Vector3[] | Vector4[] = [];\r\n let index = 0;\r\n switch (vertexBufferKind) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind: {\r\n index = submesh.verticesStart;\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + 2 * stride));\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index + stride));\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.ColorKind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n vertexBuffer.getSize() === 4\r\n ? (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index))\r\n : (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector2[]).push(Vector2.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported Vertex Buffer type: ${vertexBufferKind}`);\r\n }\r\n }\r\n this._writeVertexAttributeData(vertexData, byteOffset + 12, vertexBufferKind, binaryWriter);\r\n } else {\r\n Tools.Warn(`reorderTriangleStripDrawMode: Vertex buffer kind ${vertexBufferKind} not present!`);\r\n }\r\n }\r\n\r\n /**\r\n * Reorders the vertex attributes in the correct triangle fan order. This is necessary when indices are not available and the winding order is\r\n * clock-wise during export to glTF\r\n * @param submesh BabylonJS submesh\r\n * @param vertexBufferKind The type of vertex attribute\r\n * @param meshAttributeArray The vertex attribute data\r\n * @param byteOffset The offset to the binary data\r\n * @param binaryWriter The binary data for the glTF file\r\n */\r\n private _reorderTriangleFanMode(submesh: SubMesh, vertexBufferKind: string, meshAttributeArray: FloatArray, byteOffset: number, binaryWriter: _BinaryWriter) {\r\n const vertexBuffer = this._getVertexBufferFromMesh(vertexBufferKind, submesh.getMesh() as Mesh);\r\n if (vertexBuffer) {\r\n const stride = vertexBuffer.byteStride / VertexBuffer.GetTypeByteLength(vertexBuffer.type);\r\n\r\n const vertexData: Vector2[] | Vector3[] | Vector4[] = [];\r\n let index = 0;\r\n switch (vertexBufferKind) {\r\n case VertexBuffer.PositionKind:\r\n case VertexBuffer.NormalKind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.ColorKind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index));\r\n vertexBuffer.getSize() === 4\r\n ? (vertexData as Vector4[]).push(Vector4.FromArray(meshAttributeArray, index))\r\n : (vertexData as Vector3[]).push(Vector3.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind: {\r\n for (let x = submesh.verticesStart + submesh.verticesCount - 1; x >= submesh.verticesStart; --x) {\r\n index = x * stride;\r\n (vertexData as Vector2[]).push(Vector2.FromArray(meshAttributeArray, index));\r\n }\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported Vertex Buffer type: ${vertexBufferKind}`);\r\n }\r\n }\r\n this._writeVertexAttributeData(vertexData, byteOffset, vertexBufferKind, binaryWriter);\r\n } else {\r\n Tools.Warn(`reorderTriangleFanMode: Vertex buffer kind ${vertexBufferKind} not present!`);\r\n }\r\n }\r\n\r\n /**\r\n * Writes the vertex attribute data to binary\r\n * @param vertices The vertices to write to the binary writer\r\n * @param byteOffset The offset into the binary writer to overwrite binary data\r\n * @param vertexAttributeKind The vertex attribute type\r\n * @param binaryWriter The writer containing the binary data\r\n */\r\n private _writeVertexAttributeData(vertices: Vector2[] | Vector3[] | Vector4[], byteOffset: number, vertexAttributeKind: string, binaryWriter: _BinaryWriter) {\r\n for (const vertex of vertices) {\r\n if (vertexAttributeKind === VertexBuffer.NormalKind) {\r\n vertex.normalize();\r\n } else if (vertexAttributeKind === VertexBuffer.TangentKind && vertex instanceof Vector4) {\r\n _GLTFUtilities._NormalizeTangentFromRef(vertex);\r\n }\r\n\r\n for (const component of vertex.asArray()) {\r\n binaryWriter.setFloat32(component, byteOffset);\r\n byteOffset += 4;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Writes mesh attribute data to a data buffer\r\n * Returns the bytelength of the data\r\n * @param vertexBufferKind Indicates what kind of vertex data is being passed in\r\n * @param attributeComponentKind\r\n * @param meshAttributeArray Array containing the attribute data\r\n * @param stride Specifies the space between data\r\n * @param binaryWriter The buffer to write the binary data to\r\n * @param babylonTransformNode\r\n */\r\n public _writeAttributeData(\r\n vertexBufferKind: string,\r\n attributeComponentKind: AccessorComponentType,\r\n meshAttributeArray: FloatArray,\r\n stride: number,\r\n binaryWriter: _BinaryWriter,\r\n babylonTransformNode: TransformNode\r\n ) {\r\n let vertexAttributes: number[][] = [];\r\n let index: number;\r\n\r\n switch (vertexBufferKind) {\r\n case VertexBuffer.PositionKind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector3.FromArray(meshAttributeArray, index);\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.NormalKind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector3.FromArray(meshAttributeArray, index);\r\n vertexAttributes.push(vertexData.normalize().asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector4.FromArray(meshAttributeArray, index);\r\n _GLTFUtilities._NormalizeTangentFromRef(vertexData);\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.ColorKind: {\r\n const meshMaterial = (babylonTransformNode as Mesh).material;\r\n const convertToLinear = meshMaterial ? meshMaterial.getClassName() === \"StandardMaterial\" : true;\r\n const vertexData: Color3 | Color4 = stride === 3 ? new Color3() : new Color4();\r\n const useExactSrgbConversions = this._babylonScene.getEngine().useExactSrgbConversions;\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n if (stride === 3) {\r\n Color3.FromArrayToRef(meshAttributeArray, index, vertexData as Color3);\r\n if (convertToLinear) {\r\n (vertexData as Color3).toLinearSpaceToRef(vertexData as Color3, useExactSrgbConversions);\r\n }\r\n } else {\r\n Color4.FromArrayToRef(meshAttributeArray, index, vertexData as Color4);\r\n if (convertToLinear) {\r\n (vertexData as Color4).toLinearSpaceToRef(vertexData as Color4, useExactSrgbConversions);\r\n }\r\n }\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector2.FromArray(meshAttributeArray, index);\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector4.FromArray(meshAttributeArray, index);\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n case VertexBuffer.MatricesWeightsKind:\r\n case VertexBuffer.MatricesWeightsExtraKind: {\r\n for (let k = 0, length = meshAttributeArray.length / stride; k < length; ++k) {\r\n index = k * stride;\r\n const vertexData = Vector4.FromArray(meshAttributeArray, index);\r\n vertexAttributes.push(vertexData.asArray());\r\n }\r\n break;\r\n }\r\n default: {\r\n Tools.Warn(\"Unsupported Vertex Buffer Type: \" + vertexBufferKind);\r\n vertexAttributes = [];\r\n }\r\n }\r\n\r\n const writeBinaryFunc = getBinaryWriterFunc(binaryWriter, attributeComponentKind);\r\n\r\n if (writeBinaryFunc) {\r\n for (const vertexAttribute of vertexAttributes) {\r\n for (const component of vertexAttribute) {\r\n writeBinaryFunc(component);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _createMorphTargetBufferViewKind(\r\n vertexBufferKind: string,\r\n accessorType: AccessorType,\r\n attributeComponentKind: AccessorComponentType,\r\n mesh: Mesh,\r\n morphTarget: MorphTarget,\r\n binaryWriter: _BinaryWriter,\r\n byteStride: number\r\n ): Nullable<{ bufferViewIndex: number; vertexCount: number; accessorType: AccessorType; minMax?: { min: Vector3; max: Vector3 } }> {\r\n let vertexCount: number;\r\n let minMax: { min: Vector3; max: Vector3 } | undefined;\r\n const morphData: number[] = [];\r\n const difference: Vector3 = TmpVectors.Vector3[0];\r\n\r\n switch (vertexBufferKind) {\r\n case VertexBuffer.PositionKind: {\r\n const morphPositions = morphTarget.getPositions();\r\n if (!morphPositions) {\r\n return null;\r\n }\r\n\r\n const originalPositions = mesh.getVerticesData(VertexBuffer.PositionKind, undefined, undefined, true)!;\r\n const vertexStart = 0;\r\n const min = new Vector3(Infinity, Infinity, Infinity);\r\n const max = new Vector3(-Infinity, -Infinity, -Infinity);\r\n vertexCount = originalPositions.length / 3;\r\n for (let i = vertexStart; i < vertexCount; ++i) {\r\n const originalPosition = Vector3.FromArray(originalPositions, i * 3);\r\n const morphPosition = Vector3.FromArray(morphPositions, i * 3);\r\n morphPosition.subtractToRef(originalPosition, difference);\r\n min.copyFromFloats(Math.min(difference.x, min.x), Math.min(difference.y, min.y), Math.min(difference.z, min.z));\r\n max.copyFromFloats(Math.max(difference.x, max.x), Math.max(difference.y, max.y), Math.max(difference.z, max.z));\r\n morphData.push(difference.x, difference.y, difference.z);\r\n }\r\n\r\n minMax = { min, max };\r\n\r\n break;\r\n }\r\n case VertexBuffer.NormalKind: {\r\n const morphNormals = morphTarget.getNormals();\r\n if (!morphNormals) {\r\n return null;\r\n }\r\n\r\n const originalNormals = mesh.getVerticesData(VertexBuffer.NormalKind, undefined, undefined, true)!;\r\n const vertexStart = 0;\r\n vertexCount = originalNormals.length / 3;\r\n for (let i = vertexStart; i < vertexCount; ++i) {\r\n const originalNormal = Vector3.FromArray(originalNormals, i * 3).normalize();\r\n const morphNormal = Vector3.FromArray(morphNormals, i * 3).normalize();\r\n morphNormal.subtractToRef(originalNormal, difference);\r\n morphData.push(difference.x, difference.y, difference.z);\r\n }\r\n\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n const morphTangents = morphTarget.getTangents();\r\n if (!morphTangents) {\r\n return null;\r\n }\r\n\r\n // Handedness cannot be displaced, so morph target tangents omit the w component\r\n accessorType = AccessorType.VEC3;\r\n byteStride = 12; // 3 components (x/y/z) * 4 bytes (float32)\r\n\r\n const originalTangents = mesh.getVerticesData(VertexBuffer.TangentKind, undefined, undefined, true)!;\r\n const vertexStart = 0;\r\n vertexCount = originalTangents.length / 4;\r\n for (let i = vertexStart; i < vertexCount; ++i) {\r\n // Only read the x, y, z components and ignore w\r\n const originalTangent = Vector3.FromArray(originalTangents, i * 4);\r\n _GLTFUtilities._NormalizeTangentFromRef(originalTangent);\r\n\r\n // Morph target tangents omit the w component so it won't be present in the data\r\n const morphTangent = Vector3.FromArray(morphTangents, i * 3);\r\n _GLTFUtilities._NormalizeTangentFromRef(morphTangent);\r\n\r\n morphTangent.subtractToRef(originalTangent, difference);\r\n morphData.push(difference.x, difference.y, difference.z);\r\n }\r\n\r\n break;\r\n }\r\n default: {\r\n return null;\r\n }\r\n }\r\n\r\n const binaryWriterFunc = getBinaryWriterFunc(binaryWriter, attributeComponentKind);\r\n if (!binaryWriterFunc) {\r\n return null;\r\n }\r\n\r\n const typeByteLength = VertexBuffer.GetTypeByteLength(attributeComponentKind);\r\n const byteLength = morphData.length * typeByteLength;\r\n const bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, byteStride, `${vertexBufferKind} - ${morphTarget.name} (Morph Target)`);\r\n this._bufferViews.push(bufferView);\r\n const bufferViewIndex = this._bufferViews.length - 1;\r\n\r\n for (const value of morphData) {\r\n binaryWriterFunc(value);\r\n }\r\n\r\n return { bufferViewIndex, vertexCount, accessorType, minMax };\r\n }\r\n\r\n /**\r\n * Generates glTF json data\r\n * @param shouldUseGlb Indicates whether the json should be written for a glb file\r\n * @param glTFPrefix Text to use when prefixing a glTF file\r\n * @param prettyPrint Indicates whether the json file should be pretty printed (true) or not (false)\r\n * @returns json data as string\r\n */\r\n private _generateJSON(shouldUseGlb: boolean, glTFPrefix?: string, prettyPrint?: boolean): string {\r\n const buffer: IBuffer = { byteLength: this._totalByteLength };\r\n let imageName: string;\r\n let imageData: { data: ArrayBuffer; mimeType: ImageMimeType };\r\n let bufferView: IBufferView;\r\n let byteOffset: number = this._totalByteLength;\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 imageName = image.uri.split(\".\")[0] + \" image\";\r\n bufferView = _GLTFUtilities._CreateBufferView(0, byteOffset, imageData.data.byteLength, undefined, imageName);\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 if (!this._glTF.images) {\r\n this._glTF.images = [];\r\n }\r\n this._glTF.images.push(image);\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 = glTFPrefix + \".bin\";\r\n }\r\n\r\n const jsonText = prettyPrint ? JSON.stringify(this._glTF, null, 2) : JSON.stringify(this._glTF);\r\n\r\n return jsonText;\r\n }\r\n\r\n /**\r\n * Generates data for .gltf and .bin files based on the glTF prefix string\r\n * @param glTFPrefix Text to use when prefixing a glTF file\r\n * @param dispose Dispose the exporter\r\n * @returns GLTFData with glTF file data\r\n */\r\n public _generateGLTFAsync(glTFPrefix: string, dispose = true): Promise<GLTFData> {\r\n return this._generateBinaryAsync().then((binaryBuffer) => {\r\n this._extensionsOnExporting();\r\n const jsonText = this._generateJSON(false, 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.glTFFiles[glTFFileName] = jsonText;\r\n container.glTFFiles[glTFBinFile] = bin;\r\n\r\n if (this._imageData) {\r\n for (const image in this._imageData) {\r\n container.glTFFiles[image] = new Blob([this._imageData[image].data], { type: this._imageData[image].mimeType });\r\n }\r\n }\r\n\r\n if (dispose) {\r\n this.dispose();\r\n }\r\n\r\n return container;\r\n });\r\n }\r\n\r\n /**\r\n * Creates a binary buffer for glTF\r\n * @returns array buffer for binary data\r\n */\r\n private _generateBinaryAsync(): Promise<ArrayBuffer> {\r\n const binaryWriter = new _BinaryWriter(4);\r\n return this._createSceneAsync(binaryWriter).then(() => {\r\n if (this._localEngine) {\r\n this._localEngine.dispose();\r\n }\r\n return binaryWriter.getArrayBuffer();\r\n });\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 /**\r\n * @internal\r\n */\r\n public _generateGLBAsync(glTFPrefix: string, dispose = true): Promise<GLTFData> {\r\n return this._generateBinaryAsync().then((binaryBuffer) => {\r\n this._extensionsOnExporting();\r\n const jsonText = this._generateJSON(true);\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 + 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.glTFFiles[glbFileName] = glbFile;\r\n\r\n if (this._localEngine != null) {\r\n this._localEngine.dispose();\r\n }\r\n\r\n if (dispose) {\r\n this.dispose();\r\n }\r\n\r\n return container;\r\n });\r\n }\r\n\r\n /**\r\n * Sets the TRS for each node\r\n * @param node glTF Node for storing the transformation data\r\n * @param babylonTransformNode Babylon mesh used as the source for the transformation data\r\n */\r\n private _setNodeTransformation(node: INode, babylonTransformNode: TransformNode): 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 if (!babylonTransformNode.position.equalsToFloats(0, 0, 0)) {\r\n node.translation = babylonTransformNode.position.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 node.rotation = rotationQuaternion.normalize().asArray();\r\n }\r\n }\r\n\r\n private _setCameraTransformation(node: INode, babylonCamera: Camera): void {\r\n const translation = TmpVectors.Vector3[0];\r\n const rotation = TmpVectors.Quaternion[0];\r\n babylonCamera.getWorldMatrix().decompose(undefined, rotation, translation);\r\n\r\n if (!translation.equalsToFloats(0, 0, 0)) {\r\n node.translation = translation.asArray();\r\n }\r\n\r\n // // Rotation by 180 as glTF has a different convention than Babylon.\r\n rotation.multiplyInPlace(rotation180Y);\r\n\r\n if (!Quaternion.IsIdentity(rotation)) {\r\n node.rotation = rotation.asArray();\r\n }\r\n }\r\n\r\n private _getVertexBufferFromMesh(attributeKind: string, bufferMesh: Mesh): Nullable<VertexBuffer> {\r\n if (bufferMesh.isVerticesDataPresent(attributeKind, true)) {\r\n const vertexBuffer = bufferMesh.getVertexBuffer(attributeKind, true);\r\n if (vertexBuffer) {\r\n return vertexBuffer;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Creates a bufferview based on the vertices type for the Babylon mesh\r\n * @param kind Indicates the type of vertices data\r\n * @param attributeComponentKind Indicates the numerical type used to store the data\r\n * @param babylonTransformNode The Babylon mesh to get the vertices data from\r\n * @param binaryWriter The buffer to write the bufferview data to\r\n * @param byteStride\r\n */\r\n private _createBufferViewKind(\r\n kind: string,\r\n attributeComponentKind: AccessorComponentType,\r\n babylonTransformNode: TransformNode,\r\n binaryWriter: _BinaryWriter,\r\n byteStride: number\r\n ) {\r\n const bufferMesh =\r\n babylonTransformNode instanceof Mesh\r\n ? (babylonTransformNode as Mesh)\r\n : babylonTransformNode instanceof InstancedMesh\r\n ? (babylonTransformNode as InstancedMesh).sourceMesh\r\n : null;\r\n\r\n if (bufferMesh) {\r\n const vertexBuffer = bufferMesh.getVertexBuffer(kind, true);\r\n const vertexData = bufferMesh.getVerticesData(kind, undefined, undefined, true);\r\n\r\n if (vertexBuffer && vertexData) {\r\n const typeByteLength = VertexBuffer.GetTypeByteLength(attributeComponentKind);\r\n const byteLength = vertexData.length * typeByteLength;\r\n const bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, byteStride, kind + \" - \" + bufferMesh.name);\r\n this._bufferViews.push(bufferView);\r\n\r\n this._writeAttributeData(kind, attributeComponentKind, vertexData, byteStride / typeByteLength, binaryWriter, babylonTransformNode);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The primitive mode of the Babylon mesh\r\n * @param babylonMesh The BabylonJS mesh\r\n * @returns Unsigned integer of the primitive mode or null\r\n */\r\n private _getMeshPrimitiveMode(babylonMesh: AbstractMesh): number {\r\n if (babylonMesh instanceof LinesMesh) {\r\n return Material.LineListDrawMode;\r\n }\r\n if (babylonMesh instanceof InstancedMesh || babylonMesh instanceof Mesh) {\r\n const baseMesh = babylonMesh instanceof Mesh ? babylonMesh : babylonMesh.sourceMesh;\r\n if (typeof baseMesh.overrideRenderingFillMode === \"number\") {\r\n return baseMesh.overrideRenderingFillMode;\r\n }\r\n }\r\n return babylonMesh.material ? babylonMesh.material.fillMode : Material.TriangleFillMode;\r\n }\r\n\r\n /**\r\n * Sets the primitive mode of the glTF mesh primitive\r\n * @param meshPrimitive glTF mesh primitive\r\n * @param primitiveMode The primitive mode\r\n */\r\n private _setPrimitiveMode(meshPrimitive: IMeshPrimitive, primitiveMode: number) {\r\n switch (primitiveMode) {\r\n case Material.TriangleFillMode: {\r\n // glTF defaults to using Triangle Mode\r\n break;\r\n }\r\n case Material.TriangleStripDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.TRIANGLE_STRIP;\r\n break;\r\n }\r\n case Material.TriangleFanDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.TRIANGLE_FAN;\r\n break;\r\n }\r\n case Material.PointListDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.POINTS;\r\n break;\r\n }\r\n case Material.PointFillMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.POINTS;\r\n break;\r\n }\r\n case Material.LineLoopDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.LINE_LOOP;\r\n break;\r\n }\r\n case Material.LineListDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.LINES;\r\n break;\r\n }\r\n case Material.LineStripDrawMode: {\r\n meshPrimitive.mode = MeshPrimitiveMode.LINE_STRIP;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the vertex attribute accessor based of the glTF mesh primitive\r\n * @param meshPrimitive glTF mesh primitive\r\n * @param attributeKind vertex attribute\r\n */\r\n private _setAttributeKind(attributes: { [name: string]: number }, attributeKind: string): void {\r\n switch (attributeKind) {\r\n case VertexBuffer.PositionKind: {\r\n attributes.POSITION = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.NormalKind: {\r\n attributes.NORMAL = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.ColorKind: {\r\n attributes.COLOR_0 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.TangentKind: {\r\n attributes.TANGENT = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.UVKind: {\r\n attributes.TEXCOORD_0 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.UV2Kind: {\r\n attributes.TEXCOORD_1 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.MatricesIndicesKind: {\r\n attributes.JOINTS_0 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.MatricesIndicesExtraKind: {\r\n attributes.JOINTS_1 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.MatricesWeightsKind: {\r\n attributes.WEIGHTS_0 = this._accessors.length - 1;\r\n break;\r\n }\r\n case VertexBuffer.MatricesWeightsExtraKind: {\r\n attributes.WEIGHTS_1 = this._accessors.length - 1;\r\n break;\r\n }\r\n default: {\r\n Tools.Warn(\"Unsupported Vertex Buffer Type: \" + attributeKind);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets data for the primitive attributes of each submesh\r\n * @param mesh glTF Mesh object to store the primitive attribute information\r\n * @param babylonTransformNode Babylon mesh to get the primitive attribute data from\r\n * @param binaryWriter Buffer to write the attribute data to\r\n * @returns promise that resolves when done setting the primitive attributes\r\n */\r\n private _setPrimitiveAttributesAsync(mesh: IMesh, babylonTransformNode: TransformNode, binaryWriter: _BinaryWriter): Promise<void> {\r\n const promises: Promise<IMeshPrimitive>[] = [];\r\n let bufferMesh: Nullable<Mesh> = null;\r\n let bufferView: IBufferView;\r\n let minMax: { min: Nullable<number[]>; max: Nullable<number[]> };\r\n\r\n if (babylonTransformNode instanceof Mesh) {\r\n bufferMesh = babylonTransformNode as Mesh;\r\n } else if (babylonTransformNode instanceof InstancedMesh) {\r\n bufferMesh = (babylonTransformNode as InstancedMesh).sourceMesh;\r\n }\r\n const attributeData: _IVertexAttributeData[] = [\r\n { kind: VertexBuffer.PositionKind, accessorType: AccessorType.VEC3, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 12 },\r\n { kind: VertexBuffer.NormalKind, accessorType: AccessorType.VEC3, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 12 },\r\n { kind: VertexBuffer.ColorKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 16 },\r\n { kind: VertexBuffer.TangentKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 16 },\r\n { kind: VertexBuffer.UVKind, accessorType: AccessorType.VEC2, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 8 },\r\n { kind: VertexBuffer.UV2Kind, accessorType: AccessorType.VEC2, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 8 },\r\n { kind: VertexBuffer.MatricesIndicesKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.UNSIGNED_SHORT, byteStride: 8 },\r\n { kind: VertexBuffer.MatricesIndicesExtraKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.UNSIGNED_SHORT, byteStride: 8 },\r\n { kind: VertexBuffer.MatricesWeightsKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 16 },\r\n { kind: VertexBuffer.MatricesWeightsExtraKind, accessorType: AccessorType.VEC4, accessorComponentType: AccessorComponentType.FLOAT, byteStride: 16 },\r\n ];\r\n\r\n if (bufferMesh) {\r\n let indexBufferViewIndex: Nullable<number> = null;\r\n const primitiveMode = this._getMeshPrimitiveMode(bufferMesh);\r\n const vertexAttributeBufferViews: { [attributeKind: string]: number } = {};\r\n const morphTargetManager = bufferMesh.morphTargetManager;\r\n\r\n // For each BabylonMesh, create bufferviews for each 'kind'\r\n for (const attribute of attributeData) {\r\n const attributeKind = attribute.kind;\r\n const attributeComponentKind = attribute.accessorComponentType;\r\n if (bufferMesh.isVerticesDataPresent(attributeKind, true)) {\r\n const vertexBuffer = this._getVertexBufferFromMesh(attributeKind, bufferMesh);\r\n attribute.byteStride = vertexBuffer\r\n ? vertexBuffer.getSize() * VertexBuffer.GetTypeByteLength(attribute.accessorComponentType)\r\n : VertexBuffer.DeduceStride(attributeKind) * 4;\r\n if (attribute.byteStride === 12) {\r\n attribute.accessorType = AccessorType.VEC3;\r\n }\r\n\r\n this._createBufferViewKind(attributeKind, attributeComponentKind, babylonTransformNode, binaryWriter, attribute.byteStride);\r\n attribute.bufferViewIndex = this._bufferViews.length - 1;\r\n vertexAttributeBufferViews[attributeKind] = attribute.bufferViewIndex;\r\n\r\n // Write any morph target data to the buffer and create an associated buffer view\r\n if (morphTargetManager) {\r\n for (let i = 0; i < morphTargetManager.numTargets; ++i) {\r\n const morphTarget = morphTargetManager.getTarget(i);\r\n const morphTargetInfo = this._createMorphTargetBufferViewKind(\r\n attributeKind,\r\n attribute.accessorType,\r\n attributeComponentKind,\r\n bufferMesh,\r\n morphTarget,\r\n binaryWriter,\r\n attribute.byteStride\r\n );\r\n\r\n // Store info about the morph target that will be needed later when creating per-submesh accessors\r\n if (morphTargetInfo) {\r\n if (!attribute.morphTargetInfo) {\r\n attribute.morphTargetInfo = [];\r\n }\r\n attribute.morphTargetInfo[i] = morphTargetInfo;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (bufferMesh.getTotalIndices()) {\r\n const indices = bufferMesh.getIndices();\r\n if (indices) {\r\n const byteLength = indices.length * 4;\r\n bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, undefined, \"Indices - \" + bufferMesh.name);\r\n this._bufferViews.push(bufferView);\r\n indexBufferViewIndex = this._bufferViews.length - 1;\r\n\r\n for (let k = 0, length = indices.length; k < length; ++k) {\r\n binaryWriter.setUInt32(indices[k]);\r\n }\r\n }\r\n }\r\n\r\n if (bufferMesh.subMeshes) {\r\n // go through all mesh primitives (submeshes)\r\n for (const submesh of bufferMesh.subMeshes) {\r\n let babylonMaterial = submesh.getMaterial() || bufferMesh.getScene().defaultMaterial;\r\n\r\n let materialIndex: Nullable<number> = null;\r\n if (babylonMaterial) {\r\n if (bufferMesh instanceof LinesMesh) {\r\n // get the color from the lines mesh and set it in the material\r\n const material: IMaterial = {\r\n name: bufferMesh.name + \" material\",\r\n };\r\n if (!bufferMesh.color.equals(Color3.White()) || bufferMesh.alpha < 1) {\r\n material.pbrMetallicRoughness = {\r\n baseColorFactor: bufferMesh.color.asArray().concat([bufferMesh.alpha]),\r\n };\r\n }\r\n this._materials.push(material);\r\n materialIndex = this._materials.length - 1;\r\n } else if (babylonMaterial instanceof MultiMaterial) {\r\n const subMaterial = babylonMaterial.subMaterials[submesh.materialIndex];\r\n if (subMaterial) {\r\n babylonMaterial = subMaterial;\r\n materialIndex = this._materialMap[babylonMaterial.uniqueId];\r\n }\r\n } else {\r\n materialIndex = this._materialMap[babylonMaterial.uniqueId];\r\n }\r\n }\r\n\r\n const glTFMaterial: Nullable<IMaterial> = materialIndex != null ? this._materials[materialIndex] : null;\r\n\r\n const meshPrimitive: IMeshPrimitive = { attributes: {} };\r\n this._setPrimitiveMode(meshPrimitive, primitiveMode);\r\n\r\n for (const attribute of attributeData) {\r\n const attributeKind = attribute.kind;\r\n if ((attributeKind === VertexBuffer.UVKind || attributeKind === VertexBuffer.UV2Kind) && !this._options.exportUnusedUVs) {\r\n if (!glTFMaterial || !this._glTFMaterialExporter._hasTexturesPresent(glTFMaterial)) {\r\n continue;\r\n }\r\n }\r\n const vertexData = bufferMesh.getVerticesData(attributeKind, undefined, undefined, true);\r\n if (vertexData) {\r\n const vertexBuffer = this._getVertexBufferFromMesh(attributeKind, bufferMesh);\r\n if (vertexBuffer) {\r\n const stride = vertexBuffer.getSize();\r\n const bufferViewIndex = attribute.bufferViewIndex;\r\n if (bufferViewIndex != undefined) {\r\n // check to see if bufferviewindex has a numeric value assigned.\r\n minMax = { min: null, max: null };\r\n if (attributeKind == VertexBuffer.PositionKind) {\r\n minMax = _GLTFUtilities._CalculateMinMaxPositions(vertexData, 0, vertexData.length / stride);\r\n }\r\n const accessor = _GLTFUtilities._CreateAccessor(\r\n bufferViewIndex,\r\n attributeKind + \" - \" + babylonTransformNode.name,\r\n attribute.accessorType,\r\n attribute.accessorComponentType,\r\n vertexData.length / stride,\r\n 0,\r\n minMax.min,\r\n minMax.max\r\n );\r\n this._accessors.push(accessor);\r\n this._setAttributeKind(meshPrimitive.attributes, attributeKind);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (indexBufferViewIndex) {\r\n // Create accessor\r\n const accessor = _GLTFUtilities._CreateAccessor(\r\n indexBufferViewIndex,\r\n \"indices - \" + babylonTransformNode.name,\r\n AccessorType.SCALAR,\r\n AccessorComponentType.UNSIGNED_INT,\r\n submesh.indexCount,\r\n submesh.indexStart * 4,\r\n null,\r\n null\r\n );\r\n this._accessors.push(accessor);\r\n meshPrimitive.indices = this._accessors.length - 1;\r\n }\r\n\r\n if (Object.keys(meshPrimitive.attributes).length > 0) {\r\n const sideOrientation = babylonMaterial._getEffectiveOrientation(bufferMesh);\r\n\r\n if (sideOrientation === (this._babylonScene.useRightHandedSystem ? Material.ClockWiseSideOrientation : Material.CounterClockWiseSideOrientation)) {\r\n let byteOffset = indexBufferViewIndex != null ? this._bufferViews[indexBufferViewIndex].byteOffset : null;\r\n if (byteOffset == null) {\r\n byteOffset = 0;\r\n }\r\n let babylonIndices: Nullable<IndicesArray> = null;\r\n if (indexBufferViewIndex != null) {\r\n babylonIndices = bufferMesh.getIndices();\r\n }\r\n if (babylonIndices) {\r\n this._reorderIndicesBasedOnPrimitiveMode(submesh, primitiveMode, babylonIndices, byteOffset, binaryWriter);\r\n } else {\r\n for (const attribute of attributeData) {\r\n const vertexData = bufferMesh.getVerticesData(attribute.kind, undefined, undefined, true);\r\n if (vertexData) {\r\n const byteOffset = this._bufferViews[vertexAttributeBufferViews[attribute.kind]].byteOffset || 0;\r\n this._reorderVertexAttributeDataBasedOnPrimitiveMode(submesh, primitiveMode, attribute.kind, vertexData, byteOffset, binaryWriter);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (materialIndex != null) {\r\n meshPrimitive.material = materialIndex;\r\n }\r\n }\r\n\r\n // If there are morph targets, write out targets and associated accessors\r\n if (morphTargetManager) {\r\n // By convention, morph target names are stored in the mesh extras.\r\n if (!mesh.extras) {\r\n mesh.extras = {};\r\n }\r\n mesh.extras.targetNames = [];\r\n\r\n for (let i = 0; i < morphTargetManager.numTargets; ++i) {\r\n const morphTarget = morphTargetManager.getTarget(i);\r\n mesh.extras.targetNames.push(morphTarget.name);\r\n\r\n for (const attribute of attributeData) {\r\n const morphTargetInfo = attribute.morphTargetInfo?.[i];\r\n if (morphTargetInfo) {\r\n // Write the accessor\r\n const byteOffset = 0;\r\n const accessor = _GLTFUtilities._CreateAccessor(\r\n morphTargetInfo.bufferViewIndex,\r\n `${attribute.kind} - ${morphTarget.name} (Morph Target)`,\r\n morphTargetInfo.accessorType,\r\n attribute.accessorComponentType,\r\n morphTargetInfo.vertexCount,\r\n byteOffset,\r\n morphTargetInfo.minMax?.min?.asArray() ?? null,\r\n morphTargetInfo.minMax?.max?.asArray() ?? null\r\n );\r\n this._accessors.push(accessor);\r\n\r\n // Create a target that references the new accessor\r\n if (!meshPrimitive.targets) {\r\n meshPrimitive.targets = [];\r\n }\r\n\r\n if (!meshPrimitive.targets[i]) {\r\n meshPrimitive.targets[i] = {};\r\n }\r\n\r\n this._setAttributeKind(meshPrimitive.targets[i], attribute.kind);\r\n }\r\n }\r\n }\r\n }\r\n\r\n mesh.primitives.push(meshPrimitive);\r\n\r\n this._extensionsPostExportMeshPrimitiveAsync(\"postExport\", meshPrimitive, submesh, binaryWriter);\r\n promises.push();\r\n }\r\n }\r\n }\r\n return Promise.all(promises).then(() => {\r\n /* do nothing */\r\n });\r\n }\r\n\r\n /**\r\n * Creates a glTF scene based on the array of meshes\r\n * Returns the total byte offset\r\n * @param binaryWriter Buffer to write binary data to\r\n * @returns a promise that resolves when done\r\n */\r\n private _createSceneAsync(binaryWriter: _BinaryWriter): Promise<void> {\r\n const scene: IScene = { nodes: [] };\r\n let glTFNodeIndex: number;\r\n let glTFNode: INode;\r\n let directDescendents: Node[];\r\n const nodes: Node[] = [...this._babylonScene.transformNodes, ...this._babylonScene.meshes, ...this._babylonScene.lights, ...this._babylonScene.cameras];\r\n const removedRootNodes = new Set<Node>();\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 // Remove no-op root nodes\r\n if ((this._options.removeNoopRootNodes ?? true) && !this._options.includeCoordinateSystemConversionNodes) {\r\n for (const rootNode of this._babylonScene.rootNodes) {\r\n if (isNoopNode(rootNode, this._babylonScene.useRightHandedSystem)) {\r\n removedRootNodes.add(rootNode);\r\n\r\n // Exclude the node from list of nodes to export\r\n nodes.splice(nodes.indexOf(rootNode), 1);\r\n }\r\n }\r\n }\r\n\r\n // Export babylon cameras to glTFCamera\r\n const cameraMap = new Map<Camera, number>();\r\n this._babylonScene.cameras.forEach((camera) => {\r\n if (this._options.shouldExportNode && !this._options.shouldExportNode(camera)) {\r\n return;\r\n }\r\n\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\r\n cameraMap.set(camera, this._cameras.length);\r\n this._cameras.push(glTFCamera);\r\n });\r\n\r\n const [exportNodes, exportMaterials] = this._getExportNodes(nodes);\r\n return this._glTFMaterialExporter._convertMaterialsToGLTFAsync(exportMaterials, ImageMimeType.PNG, true).then(() => {\r\n return this._createNodeMapAndAnimationsAsync(exportNodes, binaryWriter).then((nodeMap) => {\r\n return this._createSkinsAsync(nodeMap, binaryWriter).then((skinMap) => {\r\n this._nodeMap = nodeMap;\r\n\r\n this._totalByteLength = binaryWriter.getByteOffset();\r\n if (this._totalByteLength == undefined) {\r\n throw new Error(\"undefined byte length!\");\r\n }\r\n\r\n // Build Hierarchy with the node map.\r\n for (const babylonNode of nodes) {\r\n glTFNodeIndex = this._nodeMap[babylonNode.uniqueId];\r\n if (glTFNodeIndex !== undefined) {\r\n glTFNode = this._nodes[glTFNodeIndex];\r\n\r\n if (babylonNode.metadata) {\r\n if (this._options.metadataSelector) {\r\n glTFNode.extras = this._options.metadataSelector(babylonNode.metadata);\r\n } else if (babylonNode.metadata.gltf) {\r\n glTFNode.extras = babylonNode.metadata.gltf.extras;\r\n }\r\n }\r\n\r\n if (babylonNode instanceof Camera) {\r\n glTFNode.camera = cameraMap.get(babylonNode);\r\n }\r\n\r\n if (this._options.shouldExportNode && !this._options.shouldExportNode(babylonNode)) {\r\n Tools.Log(\"Omitting \" + babylonNode.name + \" from scene.\");\r\n } else {\r\n if (!babylonNode.parent && !this._babylonScene.useRightHandedSystem) {\r\n convertNodeHandedness(glTFNode);\r\n }\r\n\r\n if (!babylonNode.parent || removedRootNodes.has(babylonNode.parent)) {\r\n scene.nodes.push(glTFNodeIndex);\r\n }\r\n }\r\n\r\n if (babylonNode instanceof Mesh) {\r\n if (babylonNode.skeleton) {\r\n glTFNode.skin = skinMap[babylonNode.skeleton.uniqueId];\r\n }\r\n }\r\n\r\n directDescendents = babylonNode.getDescendants(true);\r\n if (!glTFNode.children && directDescendents && directDescendents.length) {\r\n const children: number[] = [];\r\n for (const descendent of directDescendents) {\r\n if (this._nodeMap[descendent.uniqueId] != null) {\r\n children.push(this._nodeMap[descendent.uniqueId]);\r\n }\r\n }\r\n if (children.length) {\r\n glTFNode.children = children;\r\n }\r\n }\r\n }\r\n }\r\n if (scene.nodes.length) {\r\n this._scenes.push(scene);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Getting the nodes and materials that would be exported.\r\n * @param nodes Babylon transform nodes\r\n * @returns Set of materials which would be exported.\r\n */\r\n private _getExportNodes(nodes: Node[]): [Node[], Set<Material>] {\r\n const exportNodes: Node[] = [];\r\n const exportMaterials: Set<Material> = new Set<Material>();\r\n\r\n for (const babylonNode of nodes) {\r\n if (!this._options.shouldExportNode || this._options.shouldExportNode(babylonNode)) {\r\n exportNodes.push(babylonNode);\r\n\r\n const babylonMesh = babylonNode as AbstractMesh;\r\n if (babylonMesh.subMeshes && babylonMesh.subMeshes.length > 0) {\r\n const material = babylonMesh.material || babylonMesh.getScene().defaultMaterial;\r\n if (material instanceof MultiMaterial) {\r\n for (const subMaterial of material.subMaterials) {\r\n if (subMaterial) {\r\n exportMaterials.add(subMaterial);\r\n }\r\n }\r\n } else {\r\n exportMaterials.add(material);\r\n }\r\n }\r\n } else {\r\n `Excluding node ${babylonNode.name}`;\r\n }\r\n }\r\n\r\n return [exportNodes, exportMaterials];\r\n }\r\n\r\n /**\r\n * Creates a mapping of Node unique id to node index and handles animations\r\n * @param nodes Babylon transform nodes\r\n * @param binaryWriter Buffer to write binary data to\r\n * @returns Node mapping of unique id to index\r\n */\r\n private _createNodeMapAndAnimationsAsync(nodes: Node[], binaryWriter: _BinaryWriter): Promise<{ [key: number]: number }> {\r\n let promiseChain = Promise.resolve();\r\n const nodeMap: { [key: number]: number } = {};\r\n let nodeIndex: number;\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 for (const babylonNode of nodes) {\r\n promiseChain = promiseChain.then(() => {\r\n return this._createNodeAsync(babylonNode, binaryWriter).then((node) => {\r\n const promise = this._extensionsPostExportNodeAsync(\"createNodeAsync\", node, babylonNode, nodeMap, binaryWriter);\r\n if (promise == null) {\r\n Tools.Warn(`Not exporting node ${babylonNode.name}`);\r\n return Promise.resolve();\r\n } else {\r\n return promise.then((node) => {\r\n if (!node) {\r\n return;\r\n }\r\n this._nodes.push(node);\r\n nodeIndex = this._nodes.length - 1;\r\n nodeMap[babylonNode.uniqueId] = nodeIndex;\r\n\r\n if (!this._babylonScene.animationGroups.length) {\r\n _GLTFAnimation._CreateMorphTargetAnimationFromMorphTargetAnimations(\r\n babylonNode,\r\n runtimeGLTFAnimation,\r\n idleGLTFAnimations,\r\n nodeMap,\r\n this._nodes,\r\n binaryWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\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 nodeMap,\r\n this._nodes,\r\n binaryWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\r\n this._options.shouldExportAnimation\r\n );\r\n }\r\n }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n return promiseChain.then(() => {\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 if (this._babylonScene.animationGroups.length) {\r\n _GLTFAnimation._CreateNodeAndMorphAnimationFromAnimationGroups(\r\n this._babylonScene,\r\n this._animations,\r\n nodeMap,\r\n binaryWriter,\r\n this._bufferViews,\r\n this._accessors,\r\n this._animationSampleRate,\r\n this._options.shouldExportAnimation\r\n );\r\n }\r\n\r\n return nodeMap;\r\n });\r\n }\r\n\r\n /**\r\n * Creates a glTF node from a Babylon mesh\r\n * @param babylonNode Source Babylon mesh\r\n * @param binaryWriter Buffer for storing geometry data\r\n * @returns glTF node\r\n */\r\n private _createNodeAsync(babylonNode: Node, binaryWriter: _BinaryWriter): Promise<INode> {\r\n return Promise.resolve().then(() => {\r\n // create node to hold translation/rotation/scale and the mesh\r\n const node: INode = {};\r\n // create mesh\r\n const mesh: IMesh = { primitives: [] };\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 // Set transformation\r\n this._setNodeTransformation(node, babylonNode);\r\n if (babylonNode instanceof Mesh) {\r\n const morphTargetManager = babylonNode.morphTargetManager;\r\n if (morphTargetManager && morphTargetManager.numTargets > 0) {\r\n mesh.weights = [];\r\n for (let i = 0; i < morphTargetManager.numTargets; ++i) {\r\n mesh.weights.push(morphTargetManager.getTarget(i).influence);\r\n }\r\n }\r\n }\r\n return this._setPrimitiveAttributesAsync(mesh, babylonNode, binaryWriter).then(() => {\r\n if (mesh.primitives.length) {\r\n this._meshes.push(mesh);\r\n node.mesh = this._meshes.length - 1;\r\n }\r\n return node;\r\n });\r\n } else if (babylonNode instanceof Camera) {\r\n this._setCameraTransformation(node, babylonNode);\r\n return node;\r\n } else {\r\n return node;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Creates a glTF skin from a Babylon skeleton\r\n * @param nodeMap Babylon transform nodes\r\n * @param binaryWriter Buffer to write binary data to\r\n * @returns Node mapping of unique id to index\r\n */\r\n private _createSkinsAsync(nodeMap: { [key: number]: number }, binaryWriter: _BinaryWriter): Promise<{ [key: number]: number }> {\r\n const promiseChain = Promise.resolve();\r\n const skinMap: { [key: number]: number } = {};\r\n for (const skeleton of this._babylonScene.skeletons) {\r\n if (skeleton.bones.length <= 0) {\r\n continue;\r\n }\r\n // create skin\r\n const skin: ISkin = { joints: [] };\r\n const inverseBindMatrices: Matrix[] = [];\r\n\r\n const boneIndexMap: { [index: number]: Bone } = {};\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 for (let boneIndex = 0; boneIndex <= maxBoneIndex; ++boneIndex) {\r\n const bone = boneIndexMap[boneIndex];\r\n inverseBindMatrices.push(bone.getInvertedAbsoluteTransform());\r\n\r\n const transformNode = bone.getTransformNode();\r\n if (transformNode && nodeMap[transformNode.uniqueId] !== null && nodeMap[transformNode.uniqueId] !== undefined) {\r\n skin.joints.push(nodeMap[transformNode.uniqueId]);\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 if (skin.joints.length > 0) {\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 = binaryWriter.getByteOffset();\r\n const bufferView = _GLTFUtilities._CreateBufferView(0, bufferViewOffset, byteLength, undefined, \"InverseBindMatrices\" + \" - \" + skeleton.name);\r\n this._bufferViews.push(bufferView);\r\n const bufferViewIndex = this._bufferViews.length - 1;\r\n const bindMatrixAccessor = _GLTFUtilities._CreateAccessor(\r\n bufferViewIndex,\r\n \"InverseBindMatrices\" + \" - \" + skeleton.name,\r\n AccessorType.MAT4,\r\n AccessorComponentType.FLOAT,\r\n inverseBindMatrices.length,\r\n null,\r\n null,\r\n null\r\n );\r\n const inverseBindAccessorIndex = this._accessors.push(bindMatrixAccessor) - 1;\r\n skin.inverseBindMatrices = inverseBindAccessorIndex;\r\n this._skins.push(skin);\r\n skinMap[skeleton.uniqueId] = this._skins.length - 1;\r\n\r\n inverseBindMatrices.forEach((mat) => {\r\n mat.m.forEach((cell: number) => {\r\n binaryWriter.setFloat32(cell);\r\n });\r\n });\r\n }\r\n }\r\n return promiseChain.then(() => {\r\n return skinMap;\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n *\r\n * Stores glTF binary data. If the array buffer byte length is exceeded, it doubles in size dynamically\r\n */\r\nexport class _BinaryWriter {\r\n /**\r\n * Array buffer which stores all binary data\r\n */\r\n private _arrayBuffer: ArrayBuffer;\r\n /**\r\n * View of the array buffer\r\n */\r\n private _dataView: DataView;\r\n /**\r\n * byte offset of data in array buffer\r\n */\r\n private _byteOffset: number;\r\n /**\r\n * Initialize binary writer with an initial byte length\r\n * @param byteLength Initial byte length of the array buffer\r\n */\r\n constructor(byteLength: number) {\r\n this._arrayBuffer = new ArrayBuffer(byteLength);\r\n this._dataView = new DataView(this._arrayBuffer);\r\n this._byteOffset = 0;\r\n }\r\n /**\r\n * Resize the array buffer to the specified byte length\r\n * @param byteLength The new byte length\r\n * @returns The resized array buffer\r\n */\r\n private _resizeBuffer(byteLength: number): ArrayBuffer {\r\n const newBuffer = new ArrayBuffer(byteLength);\r\n const copyOldBufferSize = Math.min(this._arrayBuffer.byteLength, byteLength);\r\n const oldUint8Array = new Uint8Array(this._arrayBuffer, 0, copyOldBufferSize);\r\n const newUint8Array = new Uint8Array(newBuffer);\r\n newUint8Array.set(oldUint8Array, 0);\r\n this._arrayBuffer = newBuffer;\r\n this._dataView = new DataView(this._arrayBuffer);\r\n\r\n return newBuffer;\r\n }\r\n /**\r\n * Get an array buffer with the length of the byte offset\r\n * @returns ArrayBuffer resized to the byte offset\r\n */\r\n public getArrayBuffer(): ArrayBuffer {\r\n return this._resizeBuffer(this.getByteOffset());\r\n }\r\n /**\r\n * Get the byte offset of the array buffer\r\n * @returns byte offset\r\n */\r\n public getByteOffset(): number {\r\n if (this._byteOffset == undefined) {\r\n throw new Error(\"Byte offset is undefined!\");\r\n }\r\n return this._byteOffset;\r\n }\r\n /**\r\n * Stores an UInt8 in the array buffer\r\n * @param entry\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n */\r\n public setUInt8(entry: number, byteOffset?: number) {\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setUint8(byteOffset, entry);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n } else {\r\n if (this._byteOffset + 1 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setUint8(this._byteOffset, entry);\r\n this._byteOffset += 1;\r\n }\r\n }\r\n\r\n /**\r\n * Stores an UInt16 in the array buffer\r\n * @param entry\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n */\r\n public setUInt16(entry: number, byteOffset?: number) {\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setUint16(byteOffset, entry, true);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n } else {\r\n if (this._byteOffset + 2 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setUint16(this._byteOffset, entry, true);\r\n this._byteOffset += 2;\r\n }\r\n }\r\n\r\n /**\r\n * Gets an UInt32 in the array buffer\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n * @returns entry\r\n */\r\n public getUInt32(byteOffset: number): number {\r\n if (byteOffset < this._byteOffset) {\r\n return this._dataView.getUint32(byteOffset, true);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n throw new Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n }\r\n\r\n public getVector3Float32FromRef(vector3: Vector3, byteOffset: number): void {\r\n if (byteOffset + 8 > this._byteOffset) {\r\n Tools.Error(`BinaryWriter: byteoffset is greater than the current binary buffer length!`);\r\n } else {\r\n vector3.x = this._dataView.getFloat32(byteOffset, true);\r\n vector3.y = this._dataView.getFloat32(byteOffset + 4, true);\r\n vector3.z = this._dataView.getFloat32(byteOffset + 8, true);\r\n }\r\n }\r\n\r\n public setVector3Float32FromRef(vector3: Vector3, byteOffset: number): void {\r\n if (byteOffset + 8 > this._byteOffset) {\r\n Tools.Error(`BinaryWriter: byteoffset is greater than the current binary buffer length!`);\r\n } else {\r\n this._dataView.setFloat32(byteOffset, vector3.x, true);\r\n this._dataView.setFloat32(byteOffset + 4, vector3.y, true);\r\n this._dataView.setFloat32(byteOffset + 8, vector3.z, true);\r\n }\r\n }\r\n\r\n public getVector4Float32FromRef(vector4: Vector4, byteOffset: number): void {\r\n if (byteOffset + 12 > this._byteOffset) {\r\n Tools.Error(`BinaryWriter: byteoffset is greater than the current binary buffer length!`);\r\n } else {\r\n vector4.x = this._dataView.getFloat32(byteOffset, true);\r\n vector4.y = this._dataView.getFloat32(byteOffset + 4, true);\r\n vector4.z = this._dataView.getFloat32(byteOffset + 8, true);\r\n vector4.w = this._dataView.getFloat32(byteOffset + 12, true);\r\n }\r\n }\r\n\r\n public setVector4Float32FromRef(vector4: Vector4, byteOffset: number): void {\r\n if (byteOffset + 12 > this._byteOffset) {\r\n Tools.Error(`BinaryWriter: byteoffset is greater than the current binary buffer length!`);\r\n } else {\r\n this._dataView.setFloat32(byteOffset, vector4.x, true);\r\n this._dataView.setFloat32(byteOffset + 4, vector4.y, true);\r\n this._dataView.setFloat32(byteOffset + 8, vector4.z, true);\r\n this._dataView.setFloat32(byteOffset + 12, vector4.w, true);\r\n }\r\n }\r\n /**\r\n * Stores a Float32 in the array buffer\r\n * @param entry\r\n * @param byteOffset\r\n */\r\n public setFloat32(entry: number, byteOffset?: number) {\r\n if (isNaN(entry)) {\r\n Tools.Error(\"Invalid data being written!\");\r\n }\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setFloat32(byteOffset, entry, true);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary length!\");\r\n }\r\n }\r\n if (this._byteOffset + 4 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setFloat32(this._byteOffset, entry, true);\r\n this._byteOffset += 4;\r\n }\r\n /**\r\n * Stores an UInt32 in the array buffer\r\n * @param entry\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n */\r\n public setUInt32(entry: number, byteOffset?: number) {\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setUint32(byteOffset, entry, true);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n } else {\r\n if (this._byteOffset + 4 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setUint32(this._byteOffset, entry, true);\r\n this._byteOffset += 4;\r\n }\r\n }\r\n /**\r\n * Stores an Int16 in the array buffer\r\n * @param entry\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n */\r\n public setInt16(entry: number, byteOffset?: number) {\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setInt16(byteOffset, entry, true);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n } else {\r\n if (this._byteOffset + 2 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setInt16(this._byteOffset, entry, true);\r\n this._byteOffset += 2;\r\n }\r\n }\r\n /**\r\n * Stores a byte in the array buffer\r\n * @param entry\r\n * @param byteOffset If defined, specifies where to set the value as an offset.\r\n */\r\n public setByte(entry: number, byteOffset?: number) {\r\n if (byteOffset != null) {\r\n if (byteOffset < this._byteOffset) {\r\n this._dataView.setInt8(byteOffset, entry);\r\n } else {\r\n Tools.Error(\"BinaryWriter: byteoffset is greater than the current binary buffer length!\");\r\n }\r\n } else {\r\n if (this._byteOffset + 1 > this._arrayBuffer.byteLength) {\r\n this._resizeBuffer(this._arrayBuffer.byteLength * 2);\r\n }\r\n this._dataView.setInt8(this._byteOffset, entry);\r\n this._byteOffset++;\r\n }\r\n }\r\n}\r\n"]}