@babylonjs/loaders 5.0.0-alpha.8 → 5.0.0-beta.3
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.
- package/OBJ/index.d.ts +2 -0
- package/OBJ/index.js +4 -2
- package/OBJ/index.js.map +1 -1
- package/OBJ/mtlFileLoader.d.ts +4 -2
- package/OBJ/mtlFileLoader.js +7 -6
- package/OBJ/mtlFileLoader.js.map +1 -1
- package/OBJ/objFileLoader.d.ts +12 -84
- package/OBJ/objFileLoader.js +50 -667
- package/OBJ/objFileLoader.js.map +1 -1
- package/OBJ/objLoadingOptions.d.ts +43 -0
- package/OBJ/objLoadingOptions.js +2 -0
- package/OBJ/objLoadingOptions.js.map +1 -0
- package/OBJ/solidParser.d.ts +153 -0
- package/OBJ/solidParser.js +700 -0
- package/OBJ/solidParser.js.map +1 -0
- package/STL/index.js +1 -1
- package/STL/stlFileLoader.d.ts +6 -0
- package/STL/stlFileLoader.js +38 -11
- package/STL/stlFileLoader.js.map +1 -1
- package/glTF/1.0/glTFBinaryExtension.js +4 -4
- package/glTF/1.0/glTFLoader.d.ts +4 -4
- package/glTF/1.0/glTFLoader.js +60 -55
- package/glTF/1.0/glTFLoader.js.map +1 -1
- package/glTF/1.0/glTFLoaderInterfaces.d.ts +3 -1
- package/glTF/1.0/glTFLoaderInterfaces.js.map +1 -1
- package/glTF/1.0/glTFLoaderUtils.js +6 -6
- package/glTF/1.0/glTFMaterialsCommonExtension.js +12 -12
- package/glTF/1.0/index.js +5 -5
- package/glTF/2.0/Extensions/EXT_lights_image_based.js +8 -5
- package/glTF/2.0/Extensions/EXT_lights_image_based.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +3 -3
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_meshopt_compression.d.ts +1 -5
- package/glTF/2.0/Extensions/EXT_meshopt_compression.js +5 -21
- package/glTF/2.0/Extensions/EXT_meshopt_compression.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_texture_webp.js +2 -2
- package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -1
- package/glTF/2.0/Extensions/ExtrasAsMetadata.js +1 -1
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js +8 -4
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_lights_punctual.js +9 -8
- package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +2 -2
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.d.ts +30 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +46 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.d.ts +1 -2
- package/glTF/2.0/Extensions/KHR_materials_ior.js +3 -4
- package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js +3 -4
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +0 -1
- package/glTF/2.0/Extensions/KHR_materials_sheen.js +3 -4
- package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +1 -2
- package/glTF/2.0/Extensions/KHR_materials_specular.js +12 -6
- package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_translucency.js +6 -6
- package/glTF/2.0/Extensions/KHR_materials_translucency.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_transmission.js +93 -84
- package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_unlit.js +3 -3
- package/glTF/2.0/Extensions/KHR_materials_variants.js +70 -5
- package/glTF/2.0/Extensions/KHR_materials_variants.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +31 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.js +79 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_mesh_quantization.js +1 -1
- package/glTF/2.0/Extensions/KHR_texture_basisu.d.ts +1 -2
- package/glTF/2.0/Extensions/KHR_texture_basisu.js +3 -4
- package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_texture_transform.js +2 -2
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.js +6 -3
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_audio_emitter.js +6 -7
- package/glTF/2.0/Extensions/MSFT_audio_emitter.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_lod.d.ts +2 -1
- package/glTF/2.0/Extensions/MSFT_lod.js +48 -8
- package/glTF/2.0/Extensions/MSFT_lod.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.js +2 -2
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.js +2 -2
- package/glTF/2.0/Extensions/index.d.ts +2 -0
- package/glTF/2.0/Extensions/index.js +26 -24
- package/glTF/2.0/Extensions/index.js.map +1 -1
- package/glTF/2.0/glTFLoader.d.ts +6 -11
- package/glTF/2.0/glTFLoader.js +129 -95
- package/glTF/2.0/glTFLoader.js.map +1 -1
- package/glTF/2.0/glTFLoaderInterfaces.d.ts +4 -2
- package/glTF/2.0/glTFLoaderInterfaces.js.map +1 -1
- package/glTF/2.0/index.d.ts +1 -1
- package/glTF/2.0/index.js +4 -4
- package/glTF/2.0/index.js.map +1 -1
- package/glTF/glTFFileLoader.d.ts +15 -9
- package/glTF/glTFFileLoader.js +62 -76
- package/glTF/glTFFileLoader.js.map +1 -1
- package/glTF/glTFValidation.js +1 -1
- package/glTF/glTFValidation.js.map +1 -1
- package/glTF/index.d.ts +2 -2
- package/glTF/index.js +4 -4
- package/glTF/index.js.map +1 -1
- package/index.d.ts +3 -3
- package/index.js +3 -3
- package/index.js.map +1 -1
- package/legacy/legacy-glTF.js +4 -4
- package/legacy/legacy-glTF1.d.ts +1 -1
- package/legacy/legacy-glTF1.js +1 -1
- package/legacy/legacy-glTF1.js.map +1 -1
- package/legacy/legacy-glTF1FileLoader.js +2 -2
- package/legacy/legacy-glTF2.d.ts +1 -1
- package/legacy/legacy-glTF2.js +3 -3
- package/legacy/legacy-glTF2.js.map +1 -1
- package/legacy/legacy-glTF2FileLoader.js +2 -2
- package/legacy/legacy-glTFFileLoader.js +3 -3
- package/legacy/legacy-objFileLoader.d.ts +1 -1
- package/legacy/legacy-objFileLoader.js +2 -2
- package/legacy/legacy-objFileLoader.js.map +1 -1
- package/legacy/legacy-stlFileLoader.d.ts +1 -1
- package/legacy/legacy-stlFileLoader.js +2 -2
- package/legacy/legacy-stlFileLoader.js.map +1 -1
- package/legacy/legacy.js +6 -6
- package/package.json +16 -4
package/OBJ/objFileLoader.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"objFileLoader.js","sourceRoot":"","sources":["../../../sourceES6/loaders/src/OBJ/objFileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import { FloatArray, IndicesArray } from \"@babylonjs/core/types\";\nimport { Vector3, Vector2 } from \"@babylonjs/core/Maths/math.vector\";\nimport { Color4 } from '@babylonjs/core/Maths/math.color';\nimport { Tools } from \"@babylonjs/core/Misc/tools\";\nimport { VertexData } from \"@babylonjs/core/Meshes/mesh.vertexData\";\nimport { Geometry } from \"@babylonjs/core/Meshes/geometry\";\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\nimport { Mesh } from \"@babylonjs/core/Meshes/mesh\";\nimport { SceneLoader, ISceneLoaderPluginAsync, ISceneLoaderProgressEvent, ISceneLoaderPluginFactory, ISceneLoaderPlugin, ISceneLoaderAsyncResult } from \"@babylonjs/core/Loading/sceneLoader\";\n\nimport { AssetContainer } from \"@babylonjs/core/assetContainer\";\nimport { Scene } from \"@babylonjs/core/scene\";\nimport { WebRequest } from '@babylonjs/core/Misc/webRequest';\nimport { MTLFileLoader } from './mtlFileLoader';\nimport { VertexBuffer } from \"@babylonjs/core/Meshes/buffer\";\n\ntype MeshObject = {\n name: string;\n indices?: Array<number>;\n positions?: Array<number>;\n normals?: Array<number>;\n colors?: Array<number>;\n uvs?: Array<number>;\n materialName: string;\n};\n\n/**\n * Options for loading OBJ/MTL files\n */\ntype MeshLoadOptions = {\n /**\n * Defines if UVs are optimized by default during load.\n */\n OptimizeWithUV: boolean,\n /**\n * Defines custom scaling of UV coordinates of loaded meshes.\n */\n UVScaling: Vector2;\n /**\n * Invert model on y-axis (does a model scaling inversion)\n */\n InvertY: boolean,\n /**\n * Invert Y-Axis of referenced textures on load\n */\n InvertTextureY: boolean;\n /**\n * Include in meshes the vertex colors available in some OBJ files. This is not part of OBJ standard.\n */\n ImportVertexColors: boolean,\n /**\n * Compute the normals for the model, even if normals are present in the file.\n */\n ComputeNormals: boolean,\n /**\n * Optimize the normals for the model. Lighting can be uneven if you use OptimizeWithUV = true because new vertices can be created for the same location if they pertain to different faces.\n * Using OptimizehNormals = true will help smoothing the lighting by averaging the normals of those vertices.\n */\n OptimizeNormals: boolean,\n /**\n * Skip loading the materials even if defined in the OBJ file (materials are ignored).\n */\n SkipMaterials: boolean,\n /**\n * When a material fails to load OBJ loader will silently fail and onSuccess() callback will be triggered.\n */\n MaterialLoadingFailsSilently: boolean\n};\n\n/**\n * OBJ file type loader.\n * This is a babylon scene loader plugin.\n */\nexport class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\n\n /**\n * Defines if UVs are optimized by default during load.\n */\n public static OPTIMIZE_WITH_UV = true;\n /**\n * Invert model on y-axis (does a model scaling inversion)\n */\n public static INVERT_Y = false;\n /**\n * Invert Y-Axis of referenced textures on load\n */\n public static get INVERT_TEXTURE_Y() {\n return MTLFileLoader.INVERT_TEXTURE_Y;\n }\n\n public static set INVERT_TEXTURE_Y(value: boolean) {\n MTLFileLoader.INVERT_TEXTURE_Y = value;\n }\n\n /**\n * Include in meshes the vertex colors available in some OBJ files. This is not part of OBJ standard.\n */\n public static IMPORT_VERTEX_COLORS = false;\n /**\n * Compute the normals for the model, even if normals are present in the file.\n */\n public static COMPUTE_NORMALS = false;\n /**\n * Optimize the normals for the model. Lighting can be uneven if you use OptimizeWithUV = true because new vertices can be created for the same location if they pertain to different faces.\n * Using OptimizehNormals = true will help smoothing the lighting by averaging the normals of those vertices.\n */\n public static OPTIMIZE_NORMALS = false;\n /**\n * Defines custom scaling of UV coordinates of loaded meshes.\n */\n public static UV_SCALING = new Vector2(1, 1);\n /**\n * Skip loading the materials even if defined in the OBJ file (materials are ignored).\n */\n public static SKIP_MATERIALS = false;\n\n /**\n * When a material fails to load OBJ loader will silently fail and onSuccess() callback will be triggered.\n *\n * Defaults to true for backwards compatibility.\n */\n public static MATERIAL_LOADING_FAILS_SILENTLY = true;\n /**\n * Defines the name of the plugin.\n */\n public name = \"obj\";\n /**\n * Defines the extension the plugin is able to load.\n */\n public extensions = \".obj\";\n /** @hidden */\n public obj = /^o/;\n /** @hidden */\n public group = /^g/;\n /** @hidden */\n public mtllib = /^mtllib /;\n /** @hidden */\n public usemtl = /^usemtl /;\n /** @hidden */\n public smooth = /^s /;\n /** @hidden */\n public vertexPattern = /v(\\s+[\\d|\\.|\\+|\\-|e|E]+){3,7}/;\n // vn float float float\n /** @hidden */\n public normalPattern = /vn(\\s+[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n // vt float float\n /** @hidden */\n public uvPattern = /vt(\\s+[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n // f vertex vertex vertex ...\n /** @hidden */\n public facePattern1 = /f\\s+(([\\d]{1,}[\\s]?){3,})+/;\n // f vertex/uvs vertex/uvs vertex/uvs ...\n /** @hidden */\n public facePattern2 = /f\\s+((([\\d]{1,}\\/[\\d]{1,}[\\s]?){3,})+)/;\n // f vertex/uvs/normal vertex/uvs/normal vertex/uvs/normal ...\n /** @hidden */\n public facePattern3 = /f\\s+((([\\d]{1,}\\/[\\d]{1,}\\/[\\d]{1,}[\\s]?){3,})+)/;\n // f vertex//normal vertex//normal vertex//normal ...\n /** @hidden */\n public facePattern4 = /f\\s+((([\\d]{1,}\\/\\/[\\d]{1,}[\\s]?){3,})+)/;\n // f -vertex/-uvs/-normal -vertex/-uvs/-normal -vertex/-uvs/-normal ...\n /** @hidden */\n public facePattern5 = /f\\s+(((-[\\d]{1,}\\/-[\\d]{1,}\\/-[\\d]{1,}[\\s]?){3,})+)/;\n\n private _forAssetContainer = false;\n\n private _meshLoadOptions: MeshLoadOptions;\n\n /**\n * Creates loader for .OBJ files\n *\n * @param meshLoadOptions options for loading and parsing OBJ/MTL files.\n */\n constructor(meshLoadOptions?: MeshLoadOptions) {\n this._meshLoadOptions = meshLoadOptions || OBJFileLoader.currentMeshLoadOptions;\n }\n\n private static get currentMeshLoadOptions(): MeshLoadOptions {\n return {\n ComputeNormals: OBJFileLoader.COMPUTE_NORMALS,\n OptimizeNormals: OBJFileLoader.OPTIMIZE_NORMALS,\n ImportVertexColors: OBJFileLoader.IMPORT_VERTEX_COLORS,\n InvertY: OBJFileLoader.INVERT_Y,\n InvertTextureY: OBJFileLoader.INVERT_TEXTURE_Y,\n UVScaling: OBJFileLoader.UV_SCALING,\n MaterialLoadingFailsSilently: OBJFileLoader.MATERIAL_LOADING_FAILS_SILENTLY,\n OptimizeWithUV: OBJFileLoader.OPTIMIZE_WITH_UV,\n SkipMaterials: OBJFileLoader.SKIP_MATERIALS\n };\n }\n\n /**\n * Calls synchronously the MTL file attached to this obj.\n * Load function or importMesh function don't enable to load 2 files in the same time asynchronously.\n * Without this function materials are not displayed in the first frame (but displayed after).\n * In consequence it is impossible to get material information in your HTML file\n *\n * @param url The URL of the MTL file\n * @param rootUrl\n * @param onSuccess Callback function to be called when the MTL file is loaded\n * @private\n */\n private _loadMTL(url: string, rootUrl: string, onSuccess: (response: string | ArrayBuffer, responseUrl?: string) => any, onFailure: (pathOfFile: string, exception?: any) => void) {\n //The complete path to the mtl file\n var pathOfFile = Tools.BaseUrl + rootUrl + url;\n\n // Loads through the babylon tools to allow fileInput search.\n Tools.LoadFile(\n pathOfFile,\n onSuccess,\n undefined,\n undefined,\n false,\n (request?: WebRequest | undefined, exception?: any) => {\n onFailure(pathOfFile, exception);\n }\n );\n }\n\n /**\n * Instantiates a OBJ file loader plugin.\n * @returns the created plugin\n */\n createPlugin(): ISceneLoaderPluginAsync | ISceneLoaderPlugin {\n return new OBJFileLoader(OBJFileLoader.currentMeshLoadOptions);\n }\n\n /**\n * If the data string can be loaded directly.\n *\n * @param data string containing the file data\n * @returns if the data can be loaded directly\n */\n public canDirectLoad(data: string): boolean {\n return false;\n }\n\n /**\n * Imports one or more meshes from the loaded OBJ data and adds them to the scene\n * @param meshesNames a string or array of strings of the mesh names that should be loaded from the file\n * @param scene the scene the meshes should be added to\n * @param data the OBJ data to load\n * @param rootUrl root url to load from\n * @param onProgress event that fires when loading progress has occured\n * @param fileName Defines the name of the file to load\n * @returns a promise containg the loaded meshes, particles, skeletons and animations\n */\n public importMeshAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<ISceneLoaderAsyncResult> {\n //get the meshes from OBJ file\n return this._parseSolid(meshesNames, scene, data, rootUrl).then((meshes) => {\n return {\n meshes: meshes,\n particleSystems: [],\n skeletons: [],\n animationGroups: [],\n transformNodes: [],\n geometries: [],\n lights: []\n };\n });\n }\n\n /**\n * Imports all objects from the loaded OBJ data and adds them to the scene\n * @param scene the scene the objects should be added to\n * @param data the OBJ data to load\n * @param rootUrl root url to load from\n * @param onProgress event that fires when loading progress has occured\n * @param fileName Defines the name of the file to load\n * @returns a promise which completes when objects have been loaded to the scene\n */\n public loadAsync(scene: Scene, data: string, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<void> {\n //Get the 3D model\n return this.importMeshAsync(null, scene, data, rootUrl, onProgress).then(() => {\n // return void\n });\n }\n\n /**\n * Load into an asset container.\n * @param scene The scene to load into\n * @param data The data to import\n * @param rootUrl The root url for scene and resources\n * @param onProgress The callback when the load progresses\n * @param fileName Defines the name of the file to load\n * @returns The loaded asset container\n */\n public loadAssetContainerAsync(scene: Scene, data: string, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<AssetContainer> {\n this._forAssetContainer = true;\n\n return this.importMeshAsync(null, scene, data, rootUrl).then((result) => {\n var container = new AssetContainer(scene);\n result.meshes.forEach((mesh) => container.meshes.push(mesh));\n result.meshes.forEach((mesh) => {\n var material = mesh.material;\n if (material) {\n // Materials\n if (container.materials.indexOf(material) == -1) {\n container.materials.push(material);\n\n // Textures\n var textures = material.getActiveTextures();\n textures.forEach((t) => {\n if (container.textures.indexOf(t) == -1) {\n container.textures.push(t);\n }\n });\n }\n }\n });\n this._forAssetContainer = false;\n return container;\n }).catch((ex) => {\n this._forAssetContainer = false;\n throw ex;\n });\n }\n\n private _optimizeNormals(mesh: AbstractMesh): void {\n const positions = mesh.getVerticesData(VertexBuffer.PositionKind);\n const normals = mesh.getVerticesData(VertexBuffer.NormalKind);\n const mapVertices: { [key: string]: number[] } = {};\n\n if (!positions || !normals) {\n return;\n }\n\n for (let i = 0; i < positions.length / 3; i++) {\n const x = positions[i * 3 + 0];\n const y = positions[i * 3 + 1];\n const z = positions[i * 3 + 2];\n const key = x + \"_\" + y + \"_\" + z;\n\n let lst = mapVertices[key];\n if (!lst) {\n lst = [];\n mapVertices[key] = lst;\n }\n lst.push(i);\n }\n\n const normal = new Vector3();\n for (const key in mapVertices) {\n const lst = mapVertices[key];\n if (lst.length < 2) {\n continue;\n }\n\n const v0Idx = lst[0];\n for (let i = 1; i < lst.length; ++i) {\n const vIdx = lst[i];\n normals[v0Idx * 3 + 0] += normals[vIdx * 3 + 0];\n normals[v0Idx * 3 + 1] += normals[vIdx * 3 + 1];\n normals[v0Idx * 3 + 2] += normals[vIdx * 3 + 2];\n }\n\n normal.copyFromFloats(normals[v0Idx * 3 + 0], normals[v0Idx * 3 + 1], normals[v0Idx * 3 + 2]);\n normal.normalize();\n\n for (let i = 0; i < lst.length; ++i) {\n const vIdx = lst[i];\n normals[vIdx * 3 + 0] = normal.x;\n normals[vIdx * 3 + 1] = normal.y;\n normals[vIdx * 3 + 2] = normal.z;\n }\n }\n mesh.setVerticesData(VertexBuffer.NormalKind, normals);\n }\n\n /**\n * Read the OBJ file and create an Array of meshes.\n * Each mesh contains all information given by the OBJ and the MTL file.\n * i.e. vertices positions and indices, optional normals values, optional UV values, optional material\n *\n * @param meshesNames\n * @param scene Scene The scene where are displayed the data\n * @param data String The content of the obj file\n * @param rootUrl String The path to the folder\n * @returns Array<AbstractMesh>\n * @private\n */\n private _parseSolid(meshesNames: any, scene: Scene, data: string, rootUrl: string): Promise<Array<AbstractMesh>> {\n var positions: Array<Vector3> = []; //values for the positions of vertices\n var normals: Array<Vector3> = []; //Values for the normals\n var uvs: Array<Vector2> = []; //Values for the textures\n var colors: Array<Color4> = [];\n var meshesFromObj: Array<MeshObject> = []; //[mesh] Contains all the obj meshes\n var handledMesh: MeshObject; //The current mesh of meshes array\n var indicesForBabylon: Array<number> = []; //The list of indices for VertexData\n var wrappedPositionForBabylon: Array<Vector3> = []; //The list of position in vectors\n var wrappedUvsForBabylon: Array<Vector2> = []; //Array with all value of uvs to match with the indices\n var wrappedColorsForBabylon: Array<Color4> = []; // Array with all color values to match with the indices\n var wrappedNormalsForBabylon: Array<Vector3> = []; //Array with all value of normals to match with the indices\n var tuplePosNorm: Array<{ normals: Array<number>; idx: Array<number>; uv: Array<number> }> = []; //Create a tuple with indice of Position, Normal, UV [pos, norm, uvs]\n var curPositionInIndices = 0;\n var hasMeshes: Boolean = false; //Meshes are defined in the file\n var unwrappedPositionsForBabylon: Array<number> = []; //Value of positionForBabylon w/o Vector3() [x,y,z]\n var unwrappedColorsForBabylon: Array<number> = []; // Value of colorForBabylon w/o Color4() [r,g,b,a]\n var unwrappedNormalsForBabylon: Array<number> = []; //Value of normalsForBabylon w/o Vector3() [x,y,z]\n var unwrappedUVForBabylon: Array<number> = []; //Value of uvsForBabylon w/o Vector3() [x,y,z]\n var triangles: Array<string> = []; //Indices from new triangles coming from polygons\n var materialNameFromObj: string = \"\"; //The name of the current material\n var fileToLoad: string = \"\"; //The name of the mtlFile to load\n var materialsFromMTLFile: MTLFileLoader = new MTLFileLoader();\n var objMeshName: string = \"\"; //The name of the current obj mesh\n var increment: number = 1; //Id for meshes created by the multimaterial\n var isFirstMaterial: boolean = true;\n var grayColor = new Color4(0.5, 0.5, 0.5, 1);\n\n /**\n * Search for obj in the given array.\n * This function is called to check if a couple of data already exists in an array.\n *\n * If found, returns the index of the founded tuple index. Returns -1 if not found\n * @param arr Array<{ normals: Array<number>, idx: Array<number> }>\n * @param obj Array<number>\n * @returns {boolean}\n */\n var isInArray = (arr: Array<{ normals: Array<number>; idx: Array<number> }>, obj: Array<number>) => {\n if (!arr[obj[0]]) { arr[obj[0]] = { normals: [], idx: [] }; }\n var idx = arr[obj[0]].normals.indexOf(obj[1]);\n\n return idx === -1 ? -1 : arr[obj[0]].idx[idx];\n };\n var isInArrayUV = (arr: Array<{ normals: Array<number>; idx: Array<number>; uv: Array<number> }>, obj: Array<number>) => {\n if (!arr[obj[0]]) { arr[obj[0]] = { normals: [], idx: [], uv: [] }; }\n var idx = arr[obj[0]].normals.indexOf(obj[1]);\n\n if (idx != 1 && (obj[2] === arr[obj[0]].uv[idx])) {\n return arr[obj[0]].idx[idx];\n }\n return -1;\n };\n\n /**\n * This function set the data for each triangle.\n * Data are position, normals and uvs\n * If a tuple of (position, normal) is not set, add the data into the corresponding array\n * If the tuple already exist, add only their indice\n *\n * @param indicePositionFromObj Integer The index in positions array\n * @param indiceUvsFromObj Integer The index in uvs array\n * @param indiceNormalFromObj Integer The index in normals array\n * @param positionVectorFromOBJ Vector3 The value of position at index objIndice\n * @param textureVectorFromOBJ Vector3 The value of uvs\n * @param normalsVectorFromOBJ Vector3 The value of normals at index objNormale\n */\n var setData = (indicePositionFromObj: number, indiceUvsFromObj: number, indiceNormalFromObj: number, positionVectorFromOBJ: Vector3, textureVectorFromOBJ: Vector2, normalsVectorFromOBJ: Vector3, positionColorsFromOBJ?: Color4) => {\n //Check if this tuple already exists in the list of tuples\n var _index: number;\n if (this._meshLoadOptions.OptimizeWithUV) {\n _index = isInArrayUV(\n tuplePosNorm,\n [\n indicePositionFromObj,\n indiceNormalFromObj,\n indiceUvsFromObj\n ]\n );\n }\n else {\n _index = isInArray(\n tuplePosNorm,\n [\n indicePositionFromObj,\n indiceNormalFromObj\n ]\n );\n }\n\n //If it not exists\n if (_index === -1) {\n //Add an new indice.\n //The array of indices is only an array with his length equal to the number of triangles - 1.\n //We add vertices data in this order\n indicesForBabylon.push(wrappedPositionForBabylon.length);\n //Push the position of vertice for Babylon\n //Each element is a Vector3(x,y,z)\n wrappedPositionForBabylon.push(positionVectorFromOBJ);\n //Push the uvs for Babylon\n //Each element is a Vector3(u,v)\n wrappedUvsForBabylon.push(textureVectorFromOBJ);\n //Push the normals for Babylon\n //Each element is a Vector3(x,y,z)\n wrappedNormalsForBabylon.push(normalsVectorFromOBJ);\n\n if (positionColorsFromOBJ !== undefined) {\n //Push the colors for Babylon\n //Each element is a BABYLON.Color4(r,g,b,a)\n wrappedColorsForBabylon.push(positionColorsFromOBJ);\n }\n\n //Add the tuple in the comparison list\n tuplePosNorm[indicePositionFromObj].normals.push(indiceNormalFromObj);\n tuplePosNorm[indicePositionFromObj].idx.push(curPositionInIndices++);\n if (this._meshLoadOptions.OptimizeWithUV) { tuplePosNorm[indicePositionFromObj].uv.push(indiceUvsFromObj); }\n } else {\n //The tuple already exists\n //Add the index of the already existing tuple\n //At this index we can get the value of position, normal, color and uvs of vertex\n indicesForBabylon.push(_index);\n }\n };\n\n /**\n * Transform Vector() and BABYLON.Color() objects into numbers in an array\n */\n var unwrapData = () => {\n //Every array has the same length\n for (var l = 0; l < wrappedPositionForBabylon.length; l++) {\n //Push the x, y, z values of each element in the unwrapped array\n unwrappedPositionsForBabylon.push(wrappedPositionForBabylon[l].x, wrappedPositionForBabylon[l].y, wrappedPositionForBabylon[l].z);\n unwrappedNormalsForBabylon.push(wrappedNormalsForBabylon[l].x, wrappedNormalsForBabylon[l].y, wrappedNormalsForBabylon[l].z);\n unwrappedUVForBabylon.push(wrappedUvsForBabylon[l].x, wrappedUvsForBabylon[l].y); //z is an optional value not supported by BABYLON\n if (this._meshLoadOptions.ImportVertexColors === true) {\n //Push the r, g, b, a values of each element in the unwrapped array\n unwrappedColorsForBabylon.push(wrappedColorsForBabylon[l].r, wrappedColorsForBabylon[l].g, wrappedColorsForBabylon[l].b, wrappedColorsForBabylon[l].a);\n }\n }\n // Reset arrays for the next new meshes\n wrappedPositionForBabylon = [];\n wrappedNormalsForBabylon = [];\n wrappedUvsForBabylon = [];\n wrappedColorsForBabylon = [];\n tuplePosNorm = [];\n curPositionInIndices = 0;\n };\n\n /**\n * Create triangles from polygons\n * It is important to notice that a triangle is a polygon\n * We get 5 patterns of face defined in OBJ File :\n * facePattern1 = [\"1\",\"2\",\"3\",\"4\",\"5\",\"6\"]\n * facePattern2 = [\"1/1\",\"2/2\",\"3/3\",\"4/4\",\"5/5\",\"6/6\"]\n * facePattern3 = [\"1/1/1\",\"2/2/2\",\"3/3/3\",\"4/4/4\",\"5/5/5\",\"6/6/6\"]\n * facePattern4 = [\"1//1\",\"2//2\",\"3//3\",\"4//4\",\"5//5\",\"6//6\"]\n * facePattern5 = [\"-1/-1/-1\",\"-2/-2/-2\",\"-3/-3/-3\",\"-4/-4/-4\",\"-5/-5/-5\",\"-6/-6/-6\"]\n * Each pattern is divided by the same method\n * @param face Array[String] The indices of elements\n * @param v Integer The variable to increment\n */\n var getTriangles = (faces: Array<string>, v: number) => {\n //Work for each element of the array\n for (var faceIndex = v; faceIndex < faces.length - 1; faceIndex++) {\n //Add on the triangle variable the indexes to obtain triangles\n triangles.push(faces[0], faces[faceIndex], faces[faceIndex + 1]);\n }\n\n //Result obtained after 2 iterations:\n //Pattern1 => triangle = [\"1\",\"2\",\"3\",\"1\",\"3\",\"4\"];\n //Pattern2 => triangle = [\"1/1\",\"2/2\",\"3/3\",\"1/1\",\"3/3\",\"4/4\"];\n //Pattern3 => triangle = [\"1/1/1\",\"2/2/2\",\"3/3/3\",\"1/1/1\",\"3/3/3\",\"4/4/4\"];\n //Pattern4 => triangle = [\"1//1\",\"2//2\",\"3//3\",\"1//1\",\"3//3\",\"4//4\"];\n //Pattern5 => triangle = [\"-1/-1/-1\",\"-2/-2/-2\",\"-3/-3/-3\",\"-1/-1/-1\",\"-3/-3/-3\",\"-4/-4/-4\"];\n };\n\n /**\n * Create triangles and push the data for each polygon for the pattern 1\n * In this pattern we get vertice positions\n * @param face\n * @param v\n */\n var setDataForCurrentFaceWithPattern1 = (face: Array<string>, v: number) => {\n //Get the indices of triangles for each polygon\n getTriangles(face, v);\n //For each element in the triangles array.\n //This var could contains 1 to an infinity of triangles\n for (var k = 0; k < triangles.length; k++) {\n // Set position indice\n var indicePositionFromObj = parseInt(triangles[k]) - 1;\n\n setData(\n indicePositionFromObj,\n 0, 0, //In the pattern 1, normals and uvs are not defined\n positions[indicePositionFromObj], //Get the vectors data\n Vector2.Zero(), Vector3.Up(), //Create default vectors\n this._meshLoadOptions.ImportVertexColors === true ? colors[indicePositionFromObj] : undefined\n );\n }\n //Reset variable for the next line\n triangles = [];\n };\n\n /**\n * Create triangles and push the data for each polygon for the pattern 2\n * In this pattern we get vertice positions and uvsu\n * @param face\n * @param v\n */\n var setDataForCurrentFaceWithPattern2 = (face: Array<string>, v: number) => {\n //Get the indices of triangles for each polygon\n getTriangles(face, v);\n for (var k = 0; k < triangles.length; k++) {\n //triangle[k] = \"1/1\"\n //Split the data for getting position and uv\n var point = triangles[k].split(\"/\"); // [\"1\", \"1\"]\n //Set position indice\n var indicePositionFromObj = parseInt(point[0]) - 1;\n //Set uv indice\n var indiceUvsFromObj = parseInt(point[1]) - 1;\n\n setData(\n indicePositionFromObj,\n indiceUvsFromObj,\n 0, //Default value for normals\n positions[indicePositionFromObj], //Get the values for each element\n uvs[indiceUvsFromObj],\n Vector3.Up(), //Default value for normals\n this._meshLoadOptions.ImportVertexColors === true ? colors[indicePositionFromObj] : undefined\n );\n }\n\n //Reset variable for the next line\n triangles = [];\n };\n\n /**\n * Create triangles and push the data for each polygon for the pattern 3\n * In this pattern we get vertice positions, uvs and normals\n * @param face\n * @param v\n */\n var setDataForCurrentFaceWithPattern3 = (face: Array<string>, v: number) => {\n //Get the indices of triangles for each polygon\n getTriangles(face, v);\n\n for (var k = 0; k < triangles.length; k++) {\n //triangle[k] = \"1/1/1\"\n //Split the data for getting position, uv, and normals\n var point = triangles[k].split(\"/\"); // [\"1\", \"1\", \"1\"]\n // Set position indice\n var indicePositionFromObj = parseInt(point[0]) - 1;\n // Set uv indice\n var indiceUvsFromObj = parseInt(point[1]) - 1;\n // Set normal indice\n var indiceNormalFromObj = parseInt(point[2]) - 1;\n\n setData(\n indicePositionFromObj, indiceUvsFromObj, indiceNormalFromObj,\n positions[indicePositionFromObj], uvs[indiceUvsFromObj], normals[indiceNormalFromObj] //Set the vector for each component\n );\n\n }\n //Reset variable for the next line\n triangles = [];\n };\n\n /**\n * Create triangles and push the data for each polygon for the pattern 4\n * In this pattern we get vertice positions and normals\n * @param face\n * @param v\n */\n var setDataForCurrentFaceWithPattern4 = (face: Array<string>, v: number) => {\n getTriangles(face, v);\n\n for (var k = 0; k < triangles.length; k++) {\n //triangle[k] = \"1//1\"\n //Split the data for getting position and normals\n var point = triangles[k].split(\"//\"); // [\"1\", \"1\"]\n // We check indices, and normals\n var indicePositionFromObj = parseInt(point[0]) - 1;\n var indiceNormalFromObj = parseInt(point[1]) - 1;\n\n setData(\n indicePositionFromObj,\n 1, //Default value for uv\n indiceNormalFromObj,\n positions[indicePositionFromObj], //Get each vector of data\n Vector2.Zero(),\n normals[indiceNormalFromObj],\n this._meshLoadOptions.ImportVertexColors === true ? colors[indicePositionFromObj] : undefined\n );\n }\n //Reset variable for the next line\n triangles = [];\n };\n\n /**\n * Create triangles and push the data for each polygon for the pattern 3\n * In this pattern we get vertice positions, uvs and normals\n * @param face\n * @param v\n */\n var setDataForCurrentFaceWithPattern5 = (face: Array<string>, v: number) => {\n //Get the indices of triangles for each polygon\n getTriangles(face, v);\n\n for (var k = 0; k < triangles.length; k++) {\n //triangle[k] = \"-1/-1/-1\"\n //Split the data for getting position, uv, and normals\n var point = triangles[k].split(\"/\"); // [\"-1\", \"-1\", \"-1\"]\n // Set position indice\n var indicePositionFromObj = positions.length + parseInt(point[0]);\n // Set uv indice\n var indiceUvsFromObj = uvs.length + parseInt(point[1]);\n // Set normal indice\n var indiceNormalFromObj = normals.length + parseInt(point[2]);\n\n setData(\n indicePositionFromObj, indiceUvsFromObj, indiceNormalFromObj,\n positions[indicePositionFromObj], uvs[indiceUvsFromObj], normals[indiceNormalFromObj], //Set the vector for each component\n this._meshLoadOptions.ImportVertexColors === true ? colors[indicePositionFromObj] : undefined\n );\n\n }\n //Reset variable for the next line\n triangles = [];\n };\n\n var addPreviousObjMesh = () => {\n\n //Check if it is not the first mesh. Otherwise we don't have data.\n if (meshesFromObj.length > 0) {\n //Get the previous mesh for applying the data about the faces\n //=> in obj file, faces definition append after the name of the mesh\n handledMesh = meshesFromObj[meshesFromObj.length - 1];\n\n //Set the data into Array for the mesh\n unwrapData();\n\n // Reverse tab. Otherwise face are displayed in the wrong sens\n indicesForBabylon.reverse();\n //Set the information for the mesh\n //Slice the array to avoid rewriting because of the fact this is the same var which be rewrited\n handledMesh.indices = indicesForBabylon.slice();\n handledMesh.positions = unwrappedPositionsForBabylon.slice();\n handledMesh.normals = unwrappedNormalsForBabylon.slice();\n handledMesh.uvs = unwrappedUVForBabylon.slice();\n\n if (this._meshLoadOptions.ImportVertexColors === true) {\n handledMesh.colors = unwrappedColorsForBabylon.slice();\n }\n\n //Reset the array for the next mesh\n indicesForBabylon = [];\n unwrappedPositionsForBabylon = [];\n unwrappedColorsForBabylon = [];\n unwrappedNormalsForBabylon = [];\n unwrappedUVForBabylon = [];\n }\n };\n //Main function\n\n //Split the file into lines\n var lines = data.split('\\n');\n //Look at each line\n for (var i = 0; i < lines.length; i++) {\n var line = lines[i].trim().replace(/\\s\\s/g, \" \");\n var result;\n\n //Comment or newLine\n if (line.length === 0 || line.charAt(0) === '#') {\n continue;\n\n //Get information about one position possible for the vertices\n } else if (this.vertexPattern.test(line)) {\n result = line.match(/[^ ]+/g)!; // match will return non-null due to passing regex pattern\n\n // Value of result with line: \"v 1.0 2.0 3.0\"\n // [\"v\", \"1.0\", \"2.0\", \"3.0\"]\n // Create a Vector3 with the position x, y, z\n positions.push(new Vector3(\n parseFloat(result[1]),\n parseFloat(result[2]),\n parseFloat(result[3])\n ));\n\n if (this._meshLoadOptions.ImportVertexColors === true) {\n if (result.length >= 7) {\n // TODO: if these numbers are > 1 we can use Color4.FromInts(r,g,b,a)\n colors.push(new Color4(\n parseFloat(result[4]),\n parseFloat(result[5]),\n parseFloat(result[6]),\n (result.length === 7 || result[7] === undefined) ? 1 : parseFloat(result[7])\n ));\n } else {\n // TODO: maybe push NULL and if all are NULL to skip (and remove grayColor var).\n colors.push(grayColor);\n }\n }\n\n } else if ((result = this.normalPattern.exec(line)) !== null) {\n //Create a Vector3 with the normals x, y, z\n //Value of result\n // [\"vn 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n //Add the Vector in the list of normals\n normals.push(new Vector3(\n parseFloat(result[1]),\n parseFloat(result[2]),\n parseFloat(result[3])\n ));\n\n } else if ((result = this.uvPattern.exec(line)) !== null) {\n //Create a Vector2 with the normals u, v\n //Value of result\n // [\"vt 0.1 0.2 0.3\", \"0.1\", \"0.2\"]\n //Add the Vector in the list of uvs\n uvs.push(new Vector2(\n parseFloat(result[1]) * OBJFileLoader.UV_SCALING.x,\n parseFloat(result[2]) * OBJFileLoader.UV_SCALING.y\n ));\n\n //Identify patterns of faces\n //Face could be defined in different type of pattern\n } else if ((result = this.facePattern3.exec(line)) !== null) {\n //Value of result:\n //[\"f 1/1/1 2/2/2 3/3/3\", \"1/1/1 2/2/2 3/3/3\"...]\n\n //Set the data for this face\n setDataForCurrentFaceWithPattern3(\n result[1].trim().split(\" \"), // [\"1/1/1\", \"2/2/2\", \"3/3/3\"]\n 1\n );\n\n } else if ((result = this.facePattern4.exec(line)) !== null) {\n //Value of result:\n //[\"f 1//1 2//2 3//3\", \"1//1 2//2 3//3\"...]\n\n //Set the data for this face\n setDataForCurrentFaceWithPattern4(\n result[1].trim().split(\" \"), // [\"1//1\", \"2//2\", \"3//3\"]\n 1\n );\n\n } else if ((result = this.facePattern5.exec(line)) !== null) {\n //Value of result:\n //[\"f -1/-1/-1 -2/-2/-2 -3/-3/-3\", \"-1/-1/-1 -2/-2/-2 -3/-3/-3\"...]\n\n //Set the data for this face\n setDataForCurrentFaceWithPattern5(\n result[1].trim().split(\" \"), // [\"-1/-1/-1\", \"-2/-2/-2\", \"-3/-3/-3\"]\n 1\n );\n\n } else if ((result = this.facePattern2.exec(line)) !== null) {\n //Value of result:\n //[\"f 1/1 2/2 3/3\", \"1/1 2/2 3/3\"...]\n\n //Set the data for this face\n setDataForCurrentFaceWithPattern2(\n result[1].trim().split(\" \"), // [\"1/1\", \"2/2\", \"3/3\"]\n 1\n );\n\n } else if ((result = this.facePattern1.exec(line)) !== null) {\n //Value of result\n //[\"f 1 2 3\", \"1 2 3\"...]\n\n //Set the data for this face\n setDataForCurrentFaceWithPattern1(\n result[1].trim().split(\" \"), // [\"1\", \"2\", \"3\"]\n 1\n );\n\n //Define a mesh or an object\n //Each time this keyword is analysed, create a new Object with all data for creating a babylonMesh\n } else if (this.group.test(line) || this.obj.test(line)) {\n //Create a new mesh corresponding to the name of the group.\n //Definition of the mesh\n var objMesh: MeshObject = {\n name: line.substring(2).trim(), //Set the name of the current obj mesh\n indices: undefined,\n positions: undefined,\n normals: undefined,\n uvs: undefined,\n colors: undefined,\n materialName: \"\"\n };\n addPreviousObjMesh();\n\n //Push the last mesh created with only the name\n meshesFromObj.push(objMesh);\n\n //Set this variable to indicate that now meshesFromObj has objects defined inside\n hasMeshes = true;\n isFirstMaterial = true;\n increment = 1;\n //Keyword for applying a material\n } else if (this.usemtl.test(line)) {\n //Get the name of the material\n materialNameFromObj = line.substring(7).trim();\n\n //If this new material is in the same mesh\n\n if (!isFirstMaterial || !hasMeshes) {\n //Set the data for the previous mesh\n addPreviousObjMesh();\n //Create a new mesh\n var objMesh: MeshObject =\n //Set the name of the current obj mesh\n {\n name: (objMeshName || \"mesh\") + \"_mm\" + increment.toString(), //Set the name of the current obj mesh\n indices: undefined,\n positions: undefined,\n normals: undefined,\n uvs: undefined,\n colors: undefined,\n materialName: materialNameFromObj\n };\n increment++;\n //If meshes are already defined\n meshesFromObj.push(objMesh);\n hasMeshes = true;\n }\n //Set the material name if the previous line define a mesh\n\n if (hasMeshes && isFirstMaterial) {\n //Set the material name to the previous mesh (1 material per mesh)\n meshesFromObj[meshesFromObj.length - 1].materialName = materialNameFromObj;\n isFirstMaterial = false;\n }\n //Keyword for loading the mtl file\n } else if (this.mtllib.test(line)) {\n //Get the name of mtl file\n fileToLoad = line.substring(7).trim();\n\n //Apply smoothing\n } else if (this.smooth.test(line)) {\n // smooth shading => apply smoothing\n //Today I don't know it work with babylon and with obj.\n //With the obj file an integer is set\n } else {\n //If there is another possibility\n console.log(\"Unhandled expression at line : \" + line);\n }\n }\n\n //At the end of the file, add the last mesh into the meshesFromObj array\n if (hasMeshes) {\n //Set the data for the last mesh\n handledMesh = meshesFromObj[meshesFromObj.length - 1];\n\n //Reverse indices for displaying faces in the good sense\n indicesForBabylon.reverse();\n //Get the good array\n unwrapData();\n //Set array\n handledMesh.indices = indicesForBabylon;\n handledMesh.positions = unwrappedPositionsForBabylon;\n handledMesh.normals = unwrappedNormalsForBabylon;\n handledMesh.uvs = unwrappedUVForBabylon;\n\n if (this._meshLoadOptions.ImportVertexColors === true) {\n handledMesh.colors = unwrappedColorsForBabylon;\n }\n }\n\n //If any o or g keyword found, create a mesh with a random id\n if (!hasMeshes) {\n // reverse tab of indices\n indicesForBabylon.reverse();\n //Get positions normals uvs\n unwrapData();\n //Set data for one mesh\n meshesFromObj.push({\n name: Geometry.RandomId(),\n indices: indicesForBabylon,\n positions: unwrappedPositionsForBabylon,\n colors: unwrappedColorsForBabylon,\n normals: unwrappedNormalsForBabylon,\n uvs: unwrappedUVForBabylon,\n materialName: materialNameFromObj\n });\n }\n\n //Create a Mesh list\n var babylonMeshesArray: Array<Mesh> = []; //The mesh for babylon\n var materialToUse = new Array<string>();\n\n //Set data for each mesh\n for (var j = 0; j < meshesFromObj.length; j++) {\n\n //check meshesNames (stlFileLoader)\n if (meshesNames && meshesFromObj[j].name) {\n if (meshesNames instanceof Array) {\n if (meshesNames.indexOf(meshesFromObj[j].name) === -1) {\n continue;\n }\n }\n else {\n if (meshesFromObj[j].name !== meshesNames) {\n continue;\n }\n }\n }\n\n //Get the current mesh\n //Set the data with VertexBuffer for each mesh\n handledMesh = meshesFromObj[j];\n //Create a Mesh with the name of the obj mesh\n\n scene._blockEntityCollection = this._forAssetContainer;\n var babylonMesh = new Mesh(meshesFromObj[j].name, scene);\n scene._blockEntityCollection = false;\n\n //Push the name of the material to an array\n //This is indispensable for the importMesh function\n materialToUse.push(meshesFromObj[j].materialName);\n\n var vertexData: VertexData = new VertexData(); //The container for the values\n //Set the data for the babylonMesh\n vertexData.uvs = handledMesh.uvs as FloatArray;\n vertexData.indices = handledMesh.indices as IndicesArray;\n vertexData.positions = handledMesh.positions as FloatArray;\n if (this._meshLoadOptions.ComputeNormals === true) {\n let normals: Array<number> = new Array<number>();\n VertexData.ComputeNormals(handledMesh.positions, handledMesh.indices, normals);\n vertexData.normals = normals;\n } else {\n vertexData.normals = handledMesh.normals as FloatArray;\n }\n if (this._meshLoadOptions.ImportVertexColors === true) {\n vertexData.colors = handledMesh.colors as FloatArray;\n }\n //Set the data from the VertexBuffer to the current Mesh\n vertexData.applyToMesh(babylonMesh);\n if (this._meshLoadOptions.InvertY) {\n babylonMesh.scaling.y *= -1;\n }\n if (this._meshLoadOptions.OptimizeNormals === true) {\n this._optimizeNormals(babylonMesh);\n }\n\n //Push the mesh into an array\n babylonMeshesArray.push(babylonMesh);\n }\n\n let mtlPromises: Array<Promise<void>> = [];\n //load the materials\n //Check if we have a file to load\n if (fileToLoad !== \"\" && this._meshLoadOptions.SkipMaterials === false) {\n //Load the file synchronously\n mtlPromises.push(new Promise((resolve, reject) => {\n this._loadMTL(fileToLoad, rootUrl, (dataLoaded) => {\n try {\n //Create materials thanks MTLLoader function\n materialsFromMTLFile.parseMTL(scene, dataLoaded, rootUrl, this._forAssetContainer);\n //Look at each material loaded in the mtl file\n for (var n = 0; n < materialsFromMTLFile.materials.length; n++) {\n //Three variables to get all meshes with the same material\n var startIndex = 0;\n var _indices = [];\n var _index;\n\n //The material from MTL file is used in the meshes loaded\n //Push the indice in an array\n //Check if the material is not used for another mesh\n while ((_index = materialToUse.indexOf(materialsFromMTLFile.materials[n].name, startIndex)) > -1) {\n _indices.push(_index);\n startIndex = _index + 1;\n }\n //If the material is not used dispose it\n if (_index === -1 && _indices.length === 0) {\n //If the material is not needed, remove it\n materialsFromMTLFile.materials[n].dispose();\n } else {\n for (var o = 0; o < _indices.length; o++) {\n //Apply the material to the Mesh for each mesh with the material\n babylonMeshesArray[_indices[o]].material = materialsFromMTLFile.materials[n];\n }\n }\n }\n resolve();\n } catch (e) {\n Tools.Warn(`Error processing MTL file: '${fileToLoad}'`);\n if (this._meshLoadOptions.MaterialLoadingFailsSilently) {\n resolve();\n } else {\n reject(e);\n }\n }\n }, (pathOfFile: string, exception?: any) => {\n Tools.Warn(`Error downloading MTL file: '${fileToLoad}'`);\n if (this._meshLoadOptions.MaterialLoadingFailsSilently) {\n resolve();\n } else {\n reject(exception);\n }\n });\n }));\n\n }\n //Return an array with all Mesh\n return Promise.all(mtlPromises).then(() => {\n return babylonMeshesArray;\n });\n }\n\n}\n\nif (SceneLoader) {\n //Add this loader into the register plugin\n SceneLoader.RegisterPlugin(new OBJFileLoader());\n}"]}
|
1
|
+
{"version":3,"file":"objFileLoader.js","sourceRoot":"","sources":["../../../sourceES6/loaders/src/OBJ/objFileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"@babylonjs/core/types\";\nimport { Vector2 } from \"@babylonjs/core/Maths/math.vector\";\nimport { Tools } from \"@babylonjs/core/Misc/tools\";\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\nimport { SceneLoader, ISceneLoaderPluginAsync, ISceneLoaderProgressEvent, ISceneLoaderPluginFactory, ISceneLoaderPlugin, ISceneLoaderAsyncResult } from \"@babylonjs/core/Loading/sceneLoader\";\nimport { AssetContainer } from \"@babylonjs/core/assetContainer\";\nimport { Scene } from \"@babylonjs/core/scene\";\nimport { WebRequest } from '@babylonjs/core/Misc/webRequest';\nimport { MTLFileLoader } from './mtlFileLoader';\nimport { OBJLoadingOptions } from \"./objLoadingOptions\";\nimport { SolidParser } from \"./solidParser\";\nimport { Mesh } from \"@babylonjs/core/Meshes/mesh\";\n\n/**\n * OBJ file type loader.\n * This is a babylon scene loader plugin.\n */\nexport class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\n\n /**\n * Defines if UVs are optimized by default during load.\n */\n public static OPTIMIZE_WITH_UV = true;\n /**\n * Invert model on y-axis (does a model scaling inversion)\n */\n public static INVERT_Y = false;\n /**\n * Invert Y-Axis of referenced textures on load\n */\n public static get INVERT_TEXTURE_Y() {\n return MTLFileLoader.INVERT_TEXTURE_Y;\n }\n\n public static set INVERT_TEXTURE_Y(value: boolean) {\n MTLFileLoader.INVERT_TEXTURE_Y = value;\n }\n\n /**\n * Include in meshes the vertex colors available in some OBJ files. This is not part of OBJ standard.\n */\n public static IMPORT_VERTEX_COLORS = false;\n /**\n * Compute the normals for the model, even if normals are present in the file.\n */\n public static COMPUTE_NORMALS = false;\n /**\n * Optimize the normals for the model. Lighting can be uneven if you use OptimizeWithUV = true because new vertices can be created for the same location if they pertain to different faces.\n * Using OptimizehNormals = true will help smoothing the lighting by averaging the normals of those vertices.\n */\n public static OPTIMIZE_NORMALS = false;\n /**\n * Defines custom scaling of UV coordinates of loaded meshes.\n */\n public static UV_SCALING = new Vector2(1, 1);\n /**\n * Skip loading the materials even if defined in the OBJ file (materials are ignored).\n */\n public static SKIP_MATERIALS = false;\n\n /**\n * When a material fails to load OBJ loader will silently fail and onSuccess() callback will be triggered.\n *\n * Defaults to true for backwards compatibility.\n */\n public static MATERIAL_LOADING_FAILS_SILENTLY = true;\n /**\n * Defines the name of the plugin.\n */\n public name = \"obj\";\n /**\n * Defines the extension the plugin is able to load.\n */\n public extensions = \".obj\";\n\n private _assetContainer: Nullable<AssetContainer> = null;\n\n private _loadingOptions: OBJLoadingOptions;\n\n /**\n * Creates loader for .OBJ files\n *\n * @param loadingOptions options for loading and parsing OBJ/MTL files.\n */\n constructor(loadingOptions?: OBJLoadingOptions) {\n this._loadingOptions = loadingOptions || OBJFileLoader.DefaultLoadingOptions;\n }\n\n private static get DefaultLoadingOptions(): OBJLoadingOptions {\n return {\n computeNormals: OBJFileLoader.COMPUTE_NORMALS,\n optimizeNormals: OBJFileLoader.OPTIMIZE_NORMALS,\n importVertexColors: OBJFileLoader.IMPORT_VERTEX_COLORS,\n invertY: OBJFileLoader.INVERT_Y,\n invertTextureY: OBJFileLoader.INVERT_TEXTURE_Y,\n UVScaling: OBJFileLoader.UV_SCALING,\n materialLoadingFailsSilently: OBJFileLoader.MATERIAL_LOADING_FAILS_SILENTLY,\n optimizeWithUV: OBJFileLoader.OPTIMIZE_WITH_UV,\n skipMaterials: OBJFileLoader.SKIP_MATERIALS\n };\n }\n\n /**\n * Calls synchronously the MTL file attached to this obj.\n * Load function or importMesh function don't enable to load 2 files in the same time asynchronously.\n * Without this function materials are not displayed in the first frame (but displayed after).\n * In consequence it is impossible to get material information in your HTML file\n *\n * @param url The URL of the MTL file\n * @param rootUrl defines where to load data from\n * @param onSuccess Callback function to be called when the MTL file is loaded\n */\n private _loadMTL(url: string, rootUrl: string, onSuccess: (response: string | ArrayBuffer, responseUrl?: string) => any, onFailure: (pathOfFile: string, exception?: any) => void) {\n //The complete path to the mtl file\n var pathOfFile = rootUrl + url;\n\n // Loads through the babylon tools to allow fileInput search.\n Tools.LoadFile(\n pathOfFile,\n onSuccess,\n undefined,\n undefined,\n false,\n (request?: WebRequest | undefined, exception?: any) => {\n onFailure(pathOfFile, exception);\n }\n );\n }\n\n /**\n * Instantiates a OBJ file loader plugin.\n * @returns the created plugin\n */\n createPlugin(): ISceneLoaderPluginAsync | ISceneLoaderPlugin {\n return new OBJFileLoader(OBJFileLoader.DefaultLoadingOptions);\n }\n\n /**\n * If the data string can be loaded directly.\n *\n * @param data string containing the file data\n * @returns if the data can be loaded directly\n */\n public canDirectLoad(data: string): boolean {\n return false;\n }\n\n /**\n * Imports one or more meshes from the loaded OBJ data and adds them to the scene\n * @param meshesNames a string or array of strings of the mesh names that should be loaded from the file\n * @param scene the scene the meshes should be added to\n * @param data the OBJ data to load\n * @param rootUrl root url to load from\n * @param onProgress event that fires when loading progress has occured\n * @param fileName Defines the name of the file to load\n * @returns a promise containg the loaded meshes, particles, skeletons and animations\n */\n public importMeshAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<ISceneLoaderAsyncResult> {\n //get the meshes from OBJ file\n return this._parseSolid(meshesNames, scene, data, rootUrl).then((meshes) => {\n return {\n meshes: meshes,\n particleSystems: [],\n skeletons: [],\n animationGroups: [],\n transformNodes: [],\n geometries: [],\n lights: []\n };\n });\n }\n\n /**\n * Imports all objects from the loaded OBJ data and adds them to the scene\n * @param scene the scene the objects should be added to\n * @param data the OBJ data to load\n * @param rootUrl root url to load from\n * @param onProgress event that fires when loading progress has occured\n * @param fileName Defines the name of the file to load\n * @returns a promise which completes when objects have been loaded to the scene\n */\n public loadAsync(scene: Scene, data: string, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<void> {\n //Get the 3D model\n return this.importMeshAsync(null, scene, data, rootUrl, onProgress).then(() => {\n // return void\n });\n }\n\n /**\n * Load into an asset container.\n * @param scene The scene to load into\n * @param data The data to import\n * @param rootUrl The root url for scene and resources\n * @param onProgress The callback when the load progresses\n * @param fileName Defines the name of the file to load\n * @returns The loaded asset container\n */\n public loadAssetContainerAsync(scene: Scene, data: string, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<AssetContainer> {\n var container = new AssetContainer(scene);\n this._assetContainer = container;\n\n return this.importMeshAsync(null, scene, data, rootUrl).then((result) => {\n result.meshes.forEach((mesh) => container.meshes.push(mesh));\n result.meshes.forEach((mesh) => {\n var material = mesh.material;\n if (material) {\n // Materials\n if (container.materials.indexOf(material) == -1) {\n container.materials.push(material);\n\n // Textures\n var textures = material.getActiveTextures();\n textures.forEach((t) => {\n if (container.textures.indexOf(t) == -1) {\n container.textures.push(t);\n }\n });\n }\n }\n });\n this._assetContainer = null;\n return container;\n }).catch((ex) => {\n this._assetContainer = null;\n throw ex;\n });\n }\n\n /**\n * Read the OBJ file and create an Array of meshes.\n * Each mesh contains all information given by the OBJ and the MTL file.\n * i.e. vertices positions and indices, optional normals values, optional UV values, optional material\n * @param meshesNames defines a string or array of strings of the mesh names that should be loaded from the file\n * @param scene defines the scene where are displayed the data\n * @param data defines the content of the obj file\n * @param rootUrl defines the path to the folder\n * @returns the list of loaded meshes\n */\n private _parseSolid(meshesNames: any, scene: Scene, data: string, rootUrl: string): Promise<Array<AbstractMesh>> {\n var fileToLoad: string = \"\"; //The name of the mtlFile to load\n var materialsFromMTLFile: MTLFileLoader = new MTLFileLoader();\n var materialToUse = new Array<string>();\n var babylonMeshesArray: Array<Mesh> = []; //The mesh for babylon\n\n // Main function\n const solidParser = new SolidParser(materialToUse, babylonMeshesArray, this._loadingOptions);\n\n solidParser.parse(meshesNames, data, scene, this._assetContainer, (fileName: string) => {\n fileToLoad = fileName;\n });\n\n // load the materials\n let mtlPromises: Array<Promise<void>> = [];\n // Check if we have a file to load\n if (fileToLoad !== \"\" && !this._loadingOptions.skipMaterials) {\n //Load the file synchronously\n mtlPromises.push(new Promise((resolve, reject) => {\n this._loadMTL(fileToLoad, rootUrl, (dataLoaded) => {\n try {\n //Create materials thanks MTLLoader function\n materialsFromMTLFile.parseMTL(scene, dataLoaded, rootUrl, this._assetContainer);\n //Look at each material loaded in the mtl file\n for (var n = 0; n < materialsFromMTLFile.materials.length; n++) {\n //Three variables to get all meshes with the same material\n var startIndex = 0;\n var _indices = [];\n var _index;\n\n //The material from MTL file is used in the meshes loaded\n //Push the indice in an array\n //Check if the material is not used for another mesh\n while ((_index = materialToUse.indexOf(materialsFromMTLFile.materials[n].name, startIndex)) > -1) {\n _indices.push(_index);\n startIndex = _index + 1;\n }\n //If the material is not used dispose it\n if (_index === -1 && _indices.length === 0) {\n //If the material is not needed, remove it\n materialsFromMTLFile.materials[n].dispose();\n } else {\n for (var o = 0; o < _indices.length; o++) {\n //Apply the material to the Mesh for each mesh with the material\n const mesh = babylonMeshesArray[_indices[o]];\n const material = materialsFromMTLFile.materials[n];\n mesh.material = material;\n\n if (!mesh.getTotalIndices()) {\n // No indices, we need to turn on point cloud\n material.pointsCloud = true;\n }\n }\n }\n }\n resolve();\n } catch (e) {\n Tools.Warn(`Error processing MTL file: '${fileToLoad}'`);\n if (this._loadingOptions.materialLoadingFailsSilently) {\n resolve();\n } else {\n reject(e);\n }\n }\n }, (pathOfFile: string, exception?: any) => {\n Tools.Warn(`Error downloading MTL file: '${fileToLoad}'`);\n if (this._loadingOptions.materialLoadingFailsSilently) {\n resolve();\n } else {\n reject(exception);\n }\n });\n }));\n\n }\n //Return an array with all Mesh\n return Promise.all(mtlPromises).then(() => {\n return babylonMeshesArray;\n });\n }\n\n}\n\nif (SceneLoader) {\n //Add this loader into the register plugin\n SceneLoader.RegisterPlugin(new OBJFileLoader());\n}"]}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import { Vector2 } from "@babylonjs/core/Maths/math.vector";
|
2
|
+
/**
|
3
|
+
* Options for loading OBJ/MTL files
|
4
|
+
*/
|
5
|
+
export declare type OBJLoadingOptions = {
|
6
|
+
/**
|
7
|
+
* Defines if UVs are optimized by default during load.
|
8
|
+
*/
|
9
|
+
optimizeWithUV: boolean;
|
10
|
+
/**
|
11
|
+
* Defines custom scaling of UV coordinates of loaded meshes.
|
12
|
+
*/
|
13
|
+
UVScaling: Vector2;
|
14
|
+
/**
|
15
|
+
* Invert model on y-axis (does a model scaling inversion)
|
16
|
+
*/
|
17
|
+
invertY: boolean;
|
18
|
+
/**
|
19
|
+
* Invert Y-Axis of referenced textures on load
|
20
|
+
*/
|
21
|
+
invertTextureY: boolean;
|
22
|
+
/**
|
23
|
+
* Include in meshes the vertex colors available in some OBJ files. This is not part of OBJ standard.
|
24
|
+
*/
|
25
|
+
importVertexColors: boolean;
|
26
|
+
/**
|
27
|
+
* Compute the normals for the model, even if normals are present in the file.
|
28
|
+
*/
|
29
|
+
computeNormals: boolean;
|
30
|
+
/**
|
31
|
+
* Optimize the normals for the model. Lighting can be uneven if you use OptimizeWithUV = true because new vertices can be created for the same location if they pertain to different faces.
|
32
|
+
* Using OptimizehNormals = true will help smoothing the lighting by averaging the normals of those vertices.
|
33
|
+
*/
|
34
|
+
optimizeNormals: boolean;
|
35
|
+
/**
|
36
|
+
* Skip loading the materials even if defined in the OBJ file (materials are ignored).
|
37
|
+
*/
|
38
|
+
skipMaterials: boolean;
|
39
|
+
/**
|
40
|
+
* When a material fails to load OBJ loader will silently fail and onSuccess() callback will be triggered.
|
41
|
+
*/
|
42
|
+
materialLoadingFailsSilently: boolean;
|
43
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"objLoadingOptions.js","sourceRoot":"","sources":["../../../sourceES6/loaders/src/OBJ/objLoadingOptions.ts"],"names":[],"mappings":"","sourcesContent":["import { Vector2 } from \"@babylonjs/core/Maths/math.vector\";\r\n\r\n/**\r\n * Options for loading OBJ/MTL files\r\n */\r\nexport type OBJLoadingOptions = {\r\n /**\r\n * Defines if UVs are optimized by default during load.\r\n */\r\n optimizeWithUV: boolean,\r\n /**\r\n * Defines custom scaling of UV coordinates of loaded meshes.\r\n */\r\n UVScaling: Vector2;\r\n /**\r\n * Invert model on y-axis (does a model scaling inversion)\r\n */\r\n invertY: boolean,\r\n /**\r\n * Invert Y-Axis of referenced textures on load\r\n */\r\n invertTextureY: boolean;\r\n /**\r\n * Include in meshes the vertex colors available in some OBJ files. This is not part of OBJ standard.\r\n */\r\n importVertexColors: boolean,\r\n /**\r\n * Compute the normals for the model, even if normals are present in the file.\r\n */\r\n computeNormals: boolean,\r\n /**\r\n * Optimize the normals for the model. Lighting can be uneven if you use OptimizeWithUV = true because new vertices can be created for the same location if they pertain to different faces.\r\n * Using OptimizehNormals = true will help smoothing the lighting by averaging the normals of those vertices.\r\n */\r\n optimizeNormals: boolean,\r\n /**\r\n * Skip loading the materials even if defined in the OBJ file (materials are ignored).\r\n */\r\n skipMaterials: boolean,\r\n /**\r\n * When a material fails to load OBJ loader will silently fail and onSuccess() callback will be triggered.\r\n */\r\n materialLoadingFailsSilently: boolean\r\n};\r\n"]}
|
@@ -0,0 +1,153 @@
|
|
1
|
+
import { AssetContainer } from "@babylonjs/core/assetContainer";
|
2
|
+
import { Mesh } from "@babylonjs/core/Meshes/mesh";
|
3
|
+
import { Scene } from "@babylonjs/core/scene";
|
4
|
+
import { Nullable } from "@babylonjs/core/types";
|
5
|
+
import { OBJLoadingOptions } from "./objLoadingOptions";
|
6
|
+
/**
|
7
|
+
* Class used to load mesh data from OBJ content
|
8
|
+
*/
|
9
|
+
export declare class SolidParser {
|
10
|
+
/** Object descriptor */
|
11
|
+
static ObjectDescriptor: RegExp;
|
12
|
+
/** Group descriptor */
|
13
|
+
static GroupDescriptor: RegExp;
|
14
|
+
/** Material lib descriptor */
|
15
|
+
static MtlLibGroupDescriptor: RegExp;
|
16
|
+
/** Use a material descriptor */
|
17
|
+
static UseMtlDescriptor: RegExp;
|
18
|
+
/** Smooth descriptor */
|
19
|
+
static SmoothDescriptor: RegExp;
|
20
|
+
/** Pattern used to detect a vertex */
|
21
|
+
static VertexPattern: RegExp;
|
22
|
+
/** Pattern used to detect a normal */
|
23
|
+
static NormalPattern: RegExp;
|
24
|
+
/** Pattern used to detect a UV set */
|
25
|
+
static UVPattern: RegExp;
|
26
|
+
/** Pattern used to detect a first kind of face (f vertex vertex vertex) */
|
27
|
+
static FacePattern1: RegExp;
|
28
|
+
/** Pattern used to detect a second kind of face (f vertex/uvs vertex/uvs vertex/uvs) */
|
29
|
+
static FacePattern2: RegExp;
|
30
|
+
/** Pattern used to detect a third kind of face (f vertex/uvs/normal vertex/uvs/normal vertex/uvs/normal) */
|
31
|
+
static FacePattern3: RegExp;
|
32
|
+
/** Pattern used to detect a fourth kind of face (f vertex//normal vertex//normal vertex//normal)*/
|
33
|
+
static FacePattern4: RegExp;
|
34
|
+
/** Pattern used to detect a fifth kind of face (f -vertex/-uvs/-normal -vertex/-uvs/-normal -vertex/-uvs/-normal) */
|
35
|
+
static FacePattern5: RegExp;
|
36
|
+
private _loadingOptions;
|
37
|
+
private _positions;
|
38
|
+
private _normals;
|
39
|
+
private _uvs;
|
40
|
+
private _colors;
|
41
|
+
private _meshesFromObj;
|
42
|
+
private _handledMesh;
|
43
|
+
private _indicesForBabylon;
|
44
|
+
private _wrappedPositionForBabylon;
|
45
|
+
private _wrappedUvsForBabylon;
|
46
|
+
private _wrappedColorsForBabylon;
|
47
|
+
private _wrappedNormalsForBabylon;
|
48
|
+
private _tuplePosNorm;
|
49
|
+
private _curPositionInIndices;
|
50
|
+
private _hasMeshes;
|
51
|
+
private _unwrappedPositionsForBabylon;
|
52
|
+
private _unwrappedColorsForBabylon;
|
53
|
+
private _unwrappedNormalsForBabylon;
|
54
|
+
private _unwrappedUVForBabylon;
|
55
|
+
private _triangles;
|
56
|
+
private _materialNameFromObj;
|
57
|
+
private _objMeshName;
|
58
|
+
private _increment;
|
59
|
+
private _isFirstMaterial;
|
60
|
+
private _grayColor;
|
61
|
+
private _materialToUse;
|
62
|
+
private _babylonMeshesArray;
|
63
|
+
/**
|
64
|
+
* Creates a new SolidParser
|
65
|
+
* @param materialToUse defines the array to fill with the list of materials to use (it will be filled by the parse function)
|
66
|
+
* @param babylonMeshesArray defines the array to fill with the list of loaded meshes (it will be filled by the parse function)
|
67
|
+
* @param loadingOptions defines the loading options to use
|
68
|
+
*/
|
69
|
+
constructor(materialToUse: string[], babylonMeshesArray: Array<Mesh>, loadingOptions: OBJLoadingOptions);
|
70
|
+
/**
|
71
|
+
* Search for obj in the given array.
|
72
|
+
* This function is called to check if a couple of data already exists in an array.
|
73
|
+
*
|
74
|
+
* If found, returns the index of the founded tuple index. Returns -1 if not found
|
75
|
+
* @param arr Array<{ normals: Array<number>, idx: Array<number> }>
|
76
|
+
* @param obj Array<number>
|
77
|
+
* @returns {boolean}
|
78
|
+
*/
|
79
|
+
private _isInArray;
|
80
|
+
private _isInArrayUV;
|
81
|
+
/**
|
82
|
+
* This function set the data for each triangle.
|
83
|
+
* Data are position, normals and uvs
|
84
|
+
* If a tuple of (position, normal) is not set, add the data into the corresponding array
|
85
|
+
* If the tuple already exist, add only their indice
|
86
|
+
*
|
87
|
+
* @param indicePositionFromObj Integer The index in positions array
|
88
|
+
* @param indiceUvsFromObj Integer The index in uvs array
|
89
|
+
* @param indiceNormalFromObj Integer The index in normals array
|
90
|
+
* @param positionVectorFromOBJ Vector3 The value of position at index objIndice
|
91
|
+
* @param textureVectorFromOBJ Vector3 The value of uvs
|
92
|
+
* @param normalsVectorFromOBJ Vector3 The value of normals at index objNormale
|
93
|
+
*/
|
94
|
+
private _setData;
|
95
|
+
/**
|
96
|
+
* Transform Vector() and BABYLON.Color() objects into numbers in an array
|
97
|
+
*/
|
98
|
+
private _unwrapData;
|
99
|
+
/**
|
100
|
+
* Create triangles from polygons
|
101
|
+
* It is important to notice that a triangle is a polygon
|
102
|
+
* We get 5 patterns of face defined in OBJ File :
|
103
|
+
* facePattern1 = ["1","2","3","4","5","6"]
|
104
|
+
* facePattern2 = ["1/1","2/2","3/3","4/4","5/5","6/6"]
|
105
|
+
* facePattern3 = ["1/1/1","2/2/2","3/3/3","4/4/4","5/5/5","6/6/6"]
|
106
|
+
* facePattern4 = ["1//1","2//2","3//3","4//4","5//5","6//6"]
|
107
|
+
* facePattern5 = ["-1/-1/-1","-2/-2/-2","-3/-3/-3","-4/-4/-4","-5/-5/-5","-6/-6/-6"]
|
108
|
+
* Each pattern is divided by the same method
|
109
|
+
* @param face Array[String] The indices of elements
|
110
|
+
* @param v Integer The variable to increment
|
111
|
+
*/
|
112
|
+
private _getTriangles;
|
113
|
+
/**
|
114
|
+
* Create triangles and push the data for each polygon for the pattern 1
|
115
|
+
* In this pattern we get vertice positions
|
116
|
+
* @param face
|
117
|
+
* @param v
|
118
|
+
*/
|
119
|
+
private _setDataForCurrentFaceWithPattern1;
|
120
|
+
/**
|
121
|
+
* Create triangles and push the data for each polygon for the pattern 2
|
122
|
+
* In this pattern we get vertice positions and uvsu
|
123
|
+
* @param face
|
124
|
+
* @param v
|
125
|
+
*/
|
126
|
+
private _setDataForCurrentFaceWithPattern2;
|
127
|
+
/**
|
128
|
+
* Create triangles and push the data for each polygon for the pattern 3
|
129
|
+
* In this pattern we get vertice positions, uvs and normals
|
130
|
+
* @param face
|
131
|
+
* @param v
|
132
|
+
*/
|
133
|
+
private _setDataForCurrentFaceWithPattern3;
|
134
|
+
/**
|
135
|
+
* Create triangles and push the data for each polygon for the pattern 4
|
136
|
+
* In this pattern we get vertice positions and normals
|
137
|
+
* @param face
|
138
|
+
* @param v
|
139
|
+
*/
|
140
|
+
private _setDataForCurrentFaceWithPattern4;
|
141
|
+
private _setDataForCurrentFaceWithPattern5;
|
142
|
+
private _addPreviousObjMesh;
|
143
|
+
private _optimizeNormals;
|
144
|
+
/**
|
145
|
+
* Function used to parse an OBJ string
|
146
|
+
* @param meshesNames defines the list of meshes to load (all if not defined)
|
147
|
+
* @param data defines the OBJ string
|
148
|
+
* @param scene defines the hosting scene
|
149
|
+
* @param assetContainer defines the asset container to load data in
|
150
|
+
* @param onFileToLoadFound defines a callback that will be called if a MTL file is found
|
151
|
+
*/
|
152
|
+
parse(meshesNames: any, data: string, scene: Scene, assetContainer: Nullable<AssetContainer>, onFileToLoadFound: (fileToLoad: string) => void): void;
|
153
|
+
}
|