@babylonjs/loaders 5.20.0 → 5.22.1
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/mtlFileLoader.js +25 -27
- package/OBJ/mtlFileLoader.js.map +1 -1
- package/OBJ/objFileLoader.js +112 -124
- package/OBJ/objFileLoader.js.map +1 -1
- package/OBJ/solidParser.js +118 -125
- package/OBJ/solidParser.js.map +1 -1
- package/STL/stlFileLoader.js +61 -63
- package/STL/stlFileLoader.js.map +1 -1
- package/glTF/1.0/glTFBinaryExtension.js +26 -30
- package/glTF/1.0/glTFBinaryExtension.js.map +1 -1
- package/glTF/1.0/glTFLoader.js +409 -432
- package/glTF/1.0/glTFLoader.js.map +1 -1
- package/glTF/1.0/glTFLoaderUtils.js +33 -37
- package/glTF/1.0/glTFLoaderUtils.js.map +1 -1
- package/glTF/1.0/glTFMaterialsCommonExtension.js +27 -31
- package/glTF/1.0/glTFMaterialsCommonExtension.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_lights_image_based.js +48 -59
- package/glTF/2.0/Extensions/EXT_lights_image_based.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +24 -29
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_meshopt_compression.js +13 -16
- package/glTF/2.0/Extensions/EXT_meshopt_compression.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_texture_webp.js +13 -16
- package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -1
- package/glTF/2.0/Extensions/ExtrasAsMetadata.js +22 -26
- package/glTF/2.0/Extensions/ExtrasAsMetadata.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_animation_pointer.js +63 -76
- package/glTF/2.0/Extensions/KHR_animation_pointer.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_animation_pointer.map.js +90 -120
- package/glTF/2.0/Extensions/KHR_animation_pointer.map.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js +25 -28
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_lights_punctual.js +27 -30
- package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +25 -28
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +15 -18
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_ior.js +21 -24
- package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js +27 -31
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js +24 -27
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_sheen.js +23 -26
- package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_specular.js +23 -26
- package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_translucency.js +20 -23
- package/glTF/2.0/Extensions/KHR_materials_translucency.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_transmission.js +82 -86
- package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_unlit.js +19 -22
- package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_variants.js +79 -97
- package/glTF/2.0/Extensions/KHR_materials_variants.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_volume.js +20 -23
- package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_mesh_quantization.js +6 -8
- package/glTF/2.0/Extensions/KHR_mesh_quantization.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_texture_basisu.js +13 -16
- package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_texture_transform.js +12 -15
- package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.js +12 -15
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_audio_emitter.js +77 -95
- package/glTF/2.0/Extensions/MSFT_audio_emitter.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_lod.js +114 -139
- package/glTF/2.0/Extensions/MSFT_lod.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.js +12 -15
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.js +12 -15
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.js.map +1 -1
- package/glTF/2.0/glTFLoader.js +739 -823
- package/glTF/2.0/glTFLoader.js.map +1 -1
- package/glTF/glTFFileLoader.js +337 -404
- package/glTF/glTFFileLoader.js.map +1 -1
- package/glTF/glTFValidation.js +32 -39
- package/glTF/glTFValidation.js.map +1 -1
- package/legacy/legacy-glTF.js +3 -3
- package/legacy/legacy-glTF.js.map +1 -1
- package/legacy/legacy-glTF1.js +2 -2
- package/legacy/legacy-glTF1.js.map +1 -1
- package/legacy/legacy-glTF2.js +12 -12
- package/legacy/legacy-glTF2.js.map +1 -1
- package/legacy/legacy-objFileLoader.js +2 -2
- package/legacy/legacy-objFileLoader.js.map +1 -1
- package/legacy/legacy-stlFileLoader.js +2 -2
- package/legacy/legacy-stlFileLoader.js.map +1 -1
- package/package.json +5 -8
package/OBJ/objFileLoader.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"objFileLoader.js","sourceRoot":"","sources":["../../../../../lts/loaders/generated/OBJ/objFileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { ISceneLoaderPluginAsync, ISceneLoaderPluginFactory, ISceneLoaderPlugin, ISceneLoaderAsyncResult } from \"core/Loading/sceneLoader\";\r\nimport { SceneLoader } from \"core/Loading/sceneLoader\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { WebRequest } from \"core/Misc/webRequest\";\r\nimport { MTLFileLoader } from \"./mtlFileLoader\";\r\nimport type { OBJLoadingOptions } from \"./objLoadingOptions\";\r\nimport { SolidParser } from \"./solidParser\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\n\r\n/**\r\n * OBJ file type loader.\r\n * This is a babylon scene loader plugin.\r\n */\r\nexport class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /**\r\n * Defines if UVs are optimized by default during load.\r\n */\r\n public static OPTIMIZE_WITH_UV = true;\r\n /**\r\n * Invert model on y-axis (does a model scaling inversion)\r\n */\r\n public static INVERT_Y = false;\r\n /**\r\n * Invert Y-Axis of referenced textures on load\r\n */\r\n public static get INVERT_TEXTURE_Y() {\r\n return MTLFileLoader.INVERT_TEXTURE_Y;\r\n }\r\n\r\n public static set INVERT_TEXTURE_Y(value: boolean) {\r\n MTLFileLoader.INVERT_TEXTURE_Y = value;\r\n }\r\n\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 public static IMPORT_VERTEX_COLORS = false;\r\n /**\r\n * Compute the normals for the model, even if normals are present in the file.\r\n */\r\n public static COMPUTE_NORMALS = false;\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 public static OPTIMIZE_NORMALS = false;\r\n /**\r\n * Defines custom scaling of UV coordinates of loaded meshes.\r\n */\r\n public static UV_SCALING = new Vector2(1, 1);\r\n /**\r\n * Skip loading the materials even if defined in the OBJ file (materials are ignored).\r\n */\r\n public static SKIP_MATERIALS = false;\r\n\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 * Defaults to true for backwards compatibility.\r\n */\r\n public static MATERIAL_LOADING_FAILS_SILENTLY = true;\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public name = \"obj\";\r\n /**\r\n * Defines the extension the plugin is able to load.\r\n */\r\n public extensions = \".obj\";\r\n\r\n private _assetContainer: Nullable<AssetContainer> = null;\r\n\r\n private _loadingOptions: OBJLoadingOptions;\r\n\r\n /**\r\n * Creates loader for .OBJ files\r\n *\r\n * @param loadingOptions options for loading and parsing OBJ/MTL files.\r\n */\r\n constructor(loadingOptions?: OBJLoadingOptions) {\r\n this._loadingOptions = loadingOptions || OBJFileLoader._DefaultLoadingOptions;\r\n }\r\n\r\n private static get _DefaultLoadingOptions(): OBJLoadingOptions {\r\n return {\r\n computeNormals: OBJFileLoader.COMPUTE_NORMALS,\r\n optimizeNormals: OBJFileLoader.OPTIMIZE_NORMALS,\r\n importVertexColors: OBJFileLoader.IMPORT_VERTEX_COLORS,\r\n invertY: OBJFileLoader.INVERT_Y,\r\n invertTextureY: OBJFileLoader.INVERT_TEXTURE_Y,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n UVScaling: OBJFileLoader.UV_SCALING,\r\n materialLoadingFailsSilently: OBJFileLoader.MATERIAL_LOADING_FAILS_SILENTLY,\r\n optimizeWithUV: OBJFileLoader.OPTIMIZE_WITH_UV,\r\n skipMaterials: OBJFileLoader.SKIP_MATERIALS,\r\n };\r\n }\r\n\r\n /**\r\n * Calls synchronously the MTL file attached to this obj.\r\n * Load function or importMesh function don't enable to load 2 files in the same time asynchronously.\r\n * Without this function materials are not displayed in the first frame (but displayed after).\r\n * In consequence it is impossible to get material information in your HTML file\r\n *\r\n * @param url The URL of the MTL file\r\n * @param rootUrl defines where to load data from\r\n * @param onSuccess Callback function to be called when the MTL file is loaded\r\n * @param onFailure\r\n */\r\n private _loadMTL(\r\n url: string,\r\n rootUrl: string,\r\n onSuccess: (response: string | ArrayBuffer, responseUrl?: string) => any,\r\n onFailure: (pathOfFile: string, exception?: any) => void\r\n ) {\r\n //The complete path to the mtl file\r\n const pathOfFile = rootUrl + url;\r\n\r\n // Loads through the babylon tools to allow fileInput search.\r\n Tools.LoadFile(pathOfFile, onSuccess, undefined, undefined, false, (request?: WebRequest | undefined, exception?: any) => {\r\n onFailure(pathOfFile, exception);\r\n });\r\n }\r\n\r\n /**\r\n * Instantiates a OBJ file loader plugin.\r\n * @returns the created plugin\r\n */\r\n createPlugin(): ISceneLoaderPluginAsync | ISceneLoaderPlugin {\r\n return new OBJFileLoader(OBJFileLoader._DefaultLoadingOptions);\r\n }\r\n\r\n /**\r\n * If the data string can be loaded directly.\r\n * @returns if the data can be loaded directly\r\n */\r\n public canDirectLoad(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Imports one or more meshes from the loaded OBJ data and adds them to the scene\r\n * @param meshesNames a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene the scene the meshes should be added to\r\n * @param data the OBJ data to load\r\n * @param rootUrl root url to load from\r\n * @returns a promise containing the loaded meshes, particles, skeletons and animations\r\n */\r\n public importMeshAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string): Promise<ISceneLoaderAsyncResult> {\r\n //get the meshes from OBJ file\r\n return this._parseSolid(meshesNames, scene, data, rootUrl).then((meshes) => {\r\n return {\r\n meshes: meshes,\r\n particleSystems: [],\r\n skeletons: [],\r\n animationGroups: [],\r\n transformNodes: [],\r\n geometries: [],\r\n lights: [],\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Imports all objects from the loaded OBJ data and adds them to the scene\r\n * @param scene the scene the objects should be added to\r\n * @param data the OBJ data to load\r\n * @param rootUrl root url to load from\r\n * @returns a promise which completes when objects have been loaded to the scene\r\n */\r\n public loadAsync(scene: Scene, data: string, rootUrl: string): Promise<void> {\r\n //Get the 3D model\r\n return this.importMeshAsync(null, scene, data, rootUrl).then(() => {\r\n // return void\r\n });\r\n }\r\n\r\n /**\r\n * Load into an asset container.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @returns The loaded asset container\r\n */\r\n public loadAssetContainerAsync(scene: Scene, data: string, rootUrl: string): Promise<AssetContainer> {\r\n const container = new AssetContainer(scene);\r\n this._assetContainer = container;\r\n\r\n return this.importMeshAsync(null, scene, data, rootUrl)\r\n .then((result) => {\r\n result.meshes.forEach((mesh) => container.meshes.push(mesh));\r\n result.meshes.forEach((mesh) => {\r\n const material = mesh.material;\r\n if (material) {\r\n // Materials\r\n if (container.materials.indexOf(material) == -1) {\r\n container.materials.push(material);\r\n\r\n // Textures\r\n const textures = material.getActiveTextures();\r\n textures.forEach((t) => {\r\n if (container.textures.indexOf(t) == -1) {\r\n container.textures.push(t);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n this._assetContainer = null;\r\n return container;\r\n })\r\n .catch((ex) => {\r\n this._assetContainer = null;\r\n throw ex;\r\n });\r\n }\r\n\r\n /**\r\n * Read the OBJ file and create an Array of meshes.\r\n * Each mesh contains all information given by the OBJ and the MTL file.\r\n * i.e. vertices positions and indices, optional normals values, optional UV values, optional material\r\n * @param meshesNames defines a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene defines the scene where are displayed the data\r\n * @param data defines the content of the obj file\r\n * @param rootUrl defines the path to the folder\r\n * @returns the list of loaded meshes\r\n */\r\n private _parseSolid(meshesNames: any, scene: Scene, data: string, rootUrl: string): Promise<Array<AbstractMesh>> {\r\n let fileToLoad: string = \"\"; //The name of the mtlFile to load\r\n const materialsFromMTLFile: MTLFileLoader = new MTLFileLoader();\r\n const materialToUse = new Array<string>();\r\n const babylonMeshesArray: Array<Mesh> = []; //The mesh for babylon\r\n\r\n // Main function\r\n const solidParser = new SolidParser(materialToUse, babylonMeshesArray, this._loadingOptions);\r\n\r\n solidParser.parse(meshesNames, data, scene, this._assetContainer, (fileName: string) => {\r\n fileToLoad = fileName;\r\n });\r\n\r\n // load the materials\r\n const mtlPromises: Array<Promise<void>> = [];\r\n // Check if we have a file to load\r\n if (fileToLoad !== \"\" && !this._loadingOptions.skipMaterials) {\r\n //Load the file synchronously\r\n mtlPromises.push(\r\n new Promise((resolve, reject) => {\r\n this._loadMTL(\r\n fileToLoad,\r\n rootUrl,\r\n (dataLoaded) => {\r\n try {\r\n //Create materials thanks MTLLoader function\r\n materialsFromMTLFile.parseMTL(scene, dataLoaded, rootUrl, this._assetContainer);\r\n //Look at each material loaded in the mtl file\r\n for (let n = 0; n < materialsFromMTLFile.materials.length; n++) {\r\n //Three variables to get all meshes with the same material\r\n let startIndex = 0;\r\n const _indices = [];\r\n let _index;\r\n\r\n //The material from MTL file is used in the meshes loaded\r\n //Push the indice in an array\r\n //Check if the material is not used for another mesh\r\n while ((_index = materialToUse.indexOf(materialsFromMTLFile.materials[n].name, startIndex)) > -1) {\r\n _indices.push(_index);\r\n startIndex = _index + 1;\r\n }\r\n //If the material is not used dispose it\r\n if (_index === -1 && _indices.length === 0) {\r\n //If the material is not needed, remove it\r\n materialsFromMTLFile.materials[n].dispose();\r\n } else {\r\n for (let o = 0; o < _indices.length; o++) {\r\n //Apply the material to the Mesh for each mesh with the material\r\n const mesh = babylonMeshesArray[_indices[o]];\r\n const material = materialsFromMTLFile.materials[n];\r\n mesh.material = material;\r\n\r\n if (!mesh.getTotalIndices()) {\r\n // No indices, we need to turn on point cloud\r\n material.pointsCloud = true;\r\n }\r\n }\r\n }\r\n }\r\n resolve();\r\n } catch (e) {\r\n Tools.Warn(`Error processing MTL file: '${fileToLoad}'`);\r\n if (this._loadingOptions.materialLoadingFailsSilently) {\r\n resolve();\r\n } else {\r\n reject(e);\r\n }\r\n }\r\n },\r\n (pathOfFile: string, exception?: any) => {\r\n Tools.Warn(`Error downloading MTL file: '${fileToLoad}'`);\r\n if (this._loadingOptions.materialLoadingFailsSilently) {\r\n resolve();\r\n } else {\r\n reject(exception);\r\n }\r\n }\r\n );\r\n })\r\n );\r\n }\r\n //Return an array with all Mesh\r\n return Promise.all(mtlPromises).then(() => {\r\n return babylonMeshesArray;\r\n });\r\n }\r\n}\r\n\r\nif (SceneLoader) {\r\n //Add this loader into the register plugin\r\n SceneLoader.RegisterPlugin(new OBJFileLoader());\r\n}\r\n"]}
|
1
|
+
{"version":3,"file":"objFileLoader.js","sourceRoot":"","sources":["../../../../../lts/loaders/generated/OBJ/objFileLoader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,6CAA+B;AACjD,OAAO,EAAE,KAAK,EAAE,sCAAwB;AAGxC,OAAO,EAAE,WAAW,EAAE,+CAAiC;AACvD,OAAO,EAAE,cAAc,EAAE,0CAA4B;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C;;;GAGG;AACH,MAAM,OAAO,aAAa;IA6DtB;;;;OAIG;IACH,YAAY,cAAkC;QAlB9C;;WAEG;QACI,SAAI,GAAG,KAAK,CAAC;QACpB;;WAEG;QACI,eAAU,GAAG,MAAM,CAAC;QAEnB,oBAAe,GAA6B,IAAI,CAAC;QAUrD,IAAI,CAAC,eAAe,GAAG,cAAc,IAAI,aAAa,CAAC,sBAAsB,CAAC;IAClF,CAAC;IA3DD;;OAEG;IACI,MAAM,KAAK,gBAAgB;QAC9B,OAAO,aAAa,CAAC,gBAAgB,CAAC;IAC1C,CAAC;IAEM,MAAM,KAAK,gBAAgB,CAAC,KAAc;QAC7C,aAAa,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAC3C,CAAC;IAoDO,MAAM,KAAK,sBAAsB;QACrC,OAAO;YACH,cAAc,EAAE,aAAa,CAAC,eAAe;YAC7C,eAAe,EAAE,aAAa,CAAC,gBAAgB;YAC/C,kBAAkB,EAAE,aAAa,CAAC,oBAAoB;YACtD,OAAO,EAAE,aAAa,CAAC,QAAQ;YAC/B,cAAc,EAAE,aAAa,CAAC,gBAAgB;YAC9C,gEAAgE;YAChE,SAAS,EAAE,aAAa,CAAC,UAAU;YACnC,4BAA4B,EAAE,aAAa,CAAC,+BAA+B;YAC3E,cAAc,EAAE,aAAa,CAAC,gBAAgB;YAC9C,aAAa,EAAE,aAAa,CAAC,cAAc;SAC9C,CAAC;IACN,CAAC;IAED;;;;;;;;;;OAUG;IACK,QAAQ,CACZ,GAAW,EACX,OAAe,EACf,SAAwE,EACxE,SAAwD;QAExD,mCAAmC;QACnC,MAAM,UAAU,GAAG,OAAO,GAAG,GAAG,CAAC;QAEjC,6DAA6D;QAC7D,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,OAAgC,EAAE,SAAe,EAAE,EAAE;YACrH,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACH,YAAY;QACR,OAAO,IAAI,aAAa,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;IACnE,CAAC;IAED;;;OAGG;IACI,aAAa;QAChB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;;OAOG;IACI,eAAe,CAAC,WAAgB,EAAE,KAAY,EAAE,IAAS,EAAE,OAAe;QAC7E,8BAA8B;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACvE,OAAO;gBACH,MAAM,EAAE,MAAM;gBACd,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,EAAE;gBACb,eAAe,EAAE,EAAE;gBACnB,cAAc,EAAE,EAAE;gBAClB,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,EAAE;aACb,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;OAMG;IACI,SAAS,CAAC,KAAY,EAAE,IAAY,EAAE,OAAe;QACxD,kBAAkB;QAClB,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9D,cAAc;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;OAMG;IACI,uBAAuB,CAAC,KAAY,EAAE,IAAY,EAAE,OAAe;QACtE,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QAEjC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;aAClD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACb,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC/B,IAAI,QAAQ,EAAE;oBACV,YAAY;oBACZ,IAAI,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE;wBAC7C,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAEnC,WAAW;wBACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;wBAC9C,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;4BACnB,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;gCACrC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;6BAC9B;wBACL,CAAC,CAAC,CAAC;qBACN;iBACJ;YACL,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,OAAO,SAAS,CAAC;QACrB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;YACV,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,MAAM,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;IACX,CAAC;IAED;;;;;;;;;OASG;IACK,WAAW,CAAC,WAAgB,EAAE,KAAY,EAAE,IAAY,EAAE,OAAe;QAC7E,IAAI,UAAU,GAAW,EAAE,CAAC,CAAC,iCAAiC;QAC9D,MAAM,oBAAoB,GAAkB,IAAI,aAAa,EAAE,CAAC;QAChE,MAAM,aAAa,GAAG,IAAI,KAAK,EAAU,CAAC;QAC1C,MAAM,kBAAkB,GAAgB,EAAE,CAAC,CAAC,sBAAsB;QAElE,gBAAgB;QAChB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,aAAa,EAAE,kBAAkB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAE7F,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,QAAgB,EAAE,EAAE;YACnF,UAAU,GAAG,QAAQ,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,WAAW,GAAyB,EAAE,CAAC;QAC7C,kCAAkC;QAClC,IAAI,UAAU,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE;YAC1D,6BAA6B;YAC7B,WAAW,CAAC,IAAI,CACZ,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC5B,IAAI,CAAC,QAAQ,CACT,UAAU,EACV,OAAO,EACP,CAAC,UAAU,EAAE,EAAE;oBACX,IAAI;wBACA,4CAA4C;wBAC5C,oBAAoB,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;wBAChF,8CAA8C;wBAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;4BAC5D,0DAA0D;4BAC1D,IAAI,UAAU,GAAG,CAAC,CAAC;4BACnB,MAAM,QAAQ,GAAG,EAAE,CAAC;4BACpB,IAAI,MAAM,CAAC;4BAEX,yDAAyD;4BACzD,6BAA6B;4BAC7B,oDAAoD;4BACpD,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;gCAC9F,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gCACtB,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC;6BAC3B;4BACD,wCAAwC;4BACxC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gCACxC,0CAA0C;gCAC1C,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;6BAC/C;iCAAM;gCACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oCACtC,gEAAgE;oCAChE,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oCAC7C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oCACnD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;oCAEzB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;wCACzB,6CAA6C;wCAC7C,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;qCAC/B;iCACJ;6BACJ;yBACJ;wBACD,OAAO,EAAE,CAAC;qBACb;oBAAC,OAAO,CAAC,EAAE;wBACR,KAAK,CAAC,IAAI,CAAC,+BAA+B,UAAU,GAAG,CAAC,CAAC;wBACzD,IAAI,IAAI,CAAC,eAAe,CAAC,4BAA4B,EAAE;4BACnD,OAAO,EAAE,CAAC;yBACb;6BAAM;4BACH,MAAM,CAAC,CAAC,CAAC,CAAC;yBACb;qBACJ;gBACL,CAAC,EACD,CAAC,UAAkB,EAAE,SAAe,EAAE,EAAE;oBACpC,KAAK,CAAC,IAAI,CAAC,gCAAgC,UAAU,GAAG,CAAC,CAAC;oBAC1D,IAAI,IAAI,CAAC,eAAe,CAAC,4BAA4B,EAAE;wBACnD,OAAO,EAAE,CAAC;qBACb;yBAAM;wBACH,MAAM,CAAC,SAAS,CAAC,CAAC;qBACrB;gBACL,CAAC,CACJ,CAAC;YACN,CAAC,CAAC,CACL,CAAC;SACL;QACD,+BAA+B;QAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACtC,OAAO,kBAAkB,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC;;AA1SD;;GAEG;AACW,8BAAgB,GAAG,IAAI,CAAC;AACtC;;GAEG;AACW,sBAAQ,GAAG,KAAK,CAAC;AAY/B;;GAEG;AACW,kCAAoB,GAAG,KAAK,CAAC;AAC3C;;GAEG;AACW,6BAAe,GAAG,KAAK,CAAC;AACtC;;;GAGG;AACW,8BAAgB,GAAG,KAAK,CAAC;AACvC;;GAEG;AACW,wBAAU,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7C;;GAEG;AACW,4BAAc,GAAG,KAAK,CAAC;AAErC;;;;GAIG;AACW,6CAA+B,GAAG,IAAI,CAAC;AA+PzD,IAAI,WAAW,EAAE;IACb,0CAA0C;IAC1C,WAAW,CAAC,cAAc,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;CACnD","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { ISceneLoaderPluginAsync, ISceneLoaderPluginFactory, ISceneLoaderPlugin, ISceneLoaderAsyncResult } from \"core/Loading/sceneLoader\";\r\nimport { SceneLoader } from \"core/Loading/sceneLoader\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { WebRequest } from \"core/Misc/webRequest\";\r\nimport { MTLFileLoader } from \"./mtlFileLoader\";\r\nimport type { OBJLoadingOptions } from \"./objLoadingOptions\";\r\nimport { SolidParser } from \"./solidParser\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\n\r\n/**\r\n * OBJ file type loader.\r\n * This is a babylon scene loader plugin.\r\n */\r\nexport class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /**\r\n * Defines if UVs are optimized by default during load.\r\n */\r\n public static OPTIMIZE_WITH_UV = true;\r\n /**\r\n * Invert model on y-axis (does a model scaling inversion)\r\n */\r\n public static INVERT_Y = false;\r\n /**\r\n * Invert Y-Axis of referenced textures on load\r\n */\r\n public static get INVERT_TEXTURE_Y() {\r\n return MTLFileLoader.INVERT_TEXTURE_Y;\r\n }\r\n\r\n public static set INVERT_TEXTURE_Y(value: boolean) {\r\n MTLFileLoader.INVERT_TEXTURE_Y = value;\r\n }\r\n\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 public static IMPORT_VERTEX_COLORS = false;\r\n /**\r\n * Compute the normals for the model, even if normals are present in the file.\r\n */\r\n public static COMPUTE_NORMALS = false;\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 public static OPTIMIZE_NORMALS = false;\r\n /**\r\n * Defines custom scaling of UV coordinates of loaded meshes.\r\n */\r\n public static UV_SCALING = new Vector2(1, 1);\r\n /**\r\n * Skip loading the materials even if defined in the OBJ file (materials are ignored).\r\n */\r\n public static SKIP_MATERIALS = false;\r\n\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 * Defaults to true for backwards compatibility.\r\n */\r\n public static MATERIAL_LOADING_FAILS_SILENTLY = true;\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public name = \"obj\";\r\n /**\r\n * Defines the extension the plugin is able to load.\r\n */\r\n public extensions = \".obj\";\r\n\r\n private _assetContainer: Nullable<AssetContainer> = null;\r\n\r\n private _loadingOptions: OBJLoadingOptions;\r\n\r\n /**\r\n * Creates loader for .OBJ files\r\n *\r\n * @param loadingOptions options for loading and parsing OBJ/MTL files.\r\n */\r\n constructor(loadingOptions?: OBJLoadingOptions) {\r\n this._loadingOptions = loadingOptions || OBJFileLoader._DefaultLoadingOptions;\r\n }\r\n\r\n private static get _DefaultLoadingOptions(): OBJLoadingOptions {\r\n return {\r\n computeNormals: OBJFileLoader.COMPUTE_NORMALS,\r\n optimizeNormals: OBJFileLoader.OPTIMIZE_NORMALS,\r\n importVertexColors: OBJFileLoader.IMPORT_VERTEX_COLORS,\r\n invertY: OBJFileLoader.INVERT_Y,\r\n invertTextureY: OBJFileLoader.INVERT_TEXTURE_Y,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n UVScaling: OBJFileLoader.UV_SCALING,\r\n materialLoadingFailsSilently: OBJFileLoader.MATERIAL_LOADING_FAILS_SILENTLY,\r\n optimizeWithUV: OBJFileLoader.OPTIMIZE_WITH_UV,\r\n skipMaterials: OBJFileLoader.SKIP_MATERIALS,\r\n };\r\n }\r\n\r\n /**\r\n * Calls synchronously the MTL file attached to this obj.\r\n * Load function or importMesh function don't enable to load 2 files in the same time asynchronously.\r\n * Without this function materials are not displayed in the first frame (but displayed after).\r\n * In consequence it is impossible to get material information in your HTML file\r\n *\r\n * @param url The URL of the MTL file\r\n * @param rootUrl defines where to load data from\r\n * @param onSuccess Callback function to be called when the MTL file is loaded\r\n * @param onFailure\r\n */\r\n private _loadMTL(\r\n url: string,\r\n rootUrl: string,\r\n onSuccess: (response: string | ArrayBuffer, responseUrl?: string) => any,\r\n onFailure: (pathOfFile: string, exception?: any) => void\r\n ) {\r\n //The complete path to the mtl file\r\n const pathOfFile = rootUrl + url;\r\n\r\n // Loads through the babylon tools to allow fileInput search.\r\n Tools.LoadFile(pathOfFile, onSuccess, undefined, undefined, false, (request?: WebRequest | undefined, exception?: any) => {\r\n onFailure(pathOfFile, exception);\r\n });\r\n }\r\n\r\n /**\r\n * Instantiates a OBJ file loader plugin.\r\n * @returns the created plugin\r\n */\r\n createPlugin(): ISceneLoaderPluginAsync | ISceneLoaderPlugin {\r\n return new OBJFileLoader(OBJFileLoader._DefaultLoadingOptions);\r\n }\r\n\r\n /**\r\n * If the data string can be loaded directly.\r\n * @returns if the data can be loaded directly\r\n */\r\n public canDirectLoad(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Imports one or more meshes from the loaded OBJ data and adds them to the scene\r\n * @param meshesNames a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene the scene the meshes should be added to\r\n * @param data the OBJ data to load\r\n * @param rootUrl root url to load from\r\n * @returns a promise containing the loaded meshes, particles, skeletons and animations\r\n */\r\n public importMeshAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string): Promise<ISceneLoaderAsyncResult> {\r\n //get the meshes from OBJ file\r\n return this._parseSolid(meshesNames, scene, data, rootUrl).then((meshes) => {\r\n return {\r\n meshes: meshes,\r\n particleSystems: [],\r\n skeletons: [],\r\n animationGroups: [],\r\n transformNodes: [],\r\n geometries: [],\r\n lights: [],\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Imports all objects from the loaded OBJ data and adds them to the scene\r\n * @param scene the scene the objects should be added to\r\n * @param data the OBJ data to load\r\n * @param rootUrl root url to load from\r\n * @returns a promise which completes when objects have been loaded to the scene\r\n */\r\n public loadAsync(scene: Scene, data: string, rootUrl: string): Promise<void> {\r\n //Get the 3D model\r\n return this.importMeshAsync(null, scene, data, rootUrl).then(() => {\r\n // return void\r\n });\r\n }\r\n\r\n /**\r\n * Load into an asset container.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @returns The loaded asset container\r\n */\r\n public loadAssetContainerAsync(scene: Scene, data: string, rootUrl: string): Promise<AssetContainer> {\r\n const container = new AssetContainer(scene);\r\n this._assetContainer = container;\r\n\r\n return this.importMeshAsync(null, scene, data, rootUrl)\r\n .then((result) => {\r\n result.meshes.forEach((mesh) => container.meshes.push(mesh));\r\n result.meshes.forEach((mesh) => {\r\n const material = mesh.material;\r\n if (material) {\r\n // Materials\r\n if (container.materials.indexOf(material) == -1) {\r\n container.materials.push(material);\r\n\r\n // Textures\r\n const textures = material.getActiveTextures();\r\n textures.forEach((t) => {\r\n if (container.textures.indexOf(t) == -1) {\r\n container.textures.push(t);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n this._assetContainer = null;\r\n return container;\r\n })\r\n .catch((ex) => {\r\n this._assetContainer = null;\r\n throw ex;\r\n });\r\n }\r\n\r\n /**\r\n * Read the OBJ file and create an Array of meshes.\r\n * Each mesh contains all information given by the OBJ and the MTL file.\r\n * i.e. vertices positions and indices, optional normals values, optional UV values, optional material\r\n * @param meshesNames defines a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene defines the scene where are displayed the data\r\n * @param data defines the content of the obj file\r\n * @param rootUrl defines the path to the folder\r\n * @returns the list of loaded meshes\r\n */\r\n private _parseSolid(meshesNames: any, scene: Scene, data: string, rootUrl: string): Promise<Array<AbstractMesh>> {\r\n let fileToLoad: string = \"\"; //The name of the mtlFile to load\r\n const materialsFromMTLFile: MTLFileLoader = new MTLFileLoader();\r\n const materialToUse = new Array<string>();\r\n const babylonMeshesArray: Array<Mesh> = []; //The mesh for babylon\r\n\r\n // Main function\r\n const solidParser = new SolidParser(materialToUse, babylonMeshesArray, this._loadingOptions);\r\n\r\n solidParser.parse(meshesNames, data, scene, this._assetContainer, (fileName: string) => {\r\n fileToLoad = fileName;\r\n });\r\n\r\n // load the materials\r\n const mtlPromises: Array<Promise<void>> = [];\r\n // Check if we have a file to load\r\n if (fileToLoad !== \"\" && !this._loadingOptions.skipMaterials) {\r\n //Load the file synchronously\r\n mtlPromises.push(\r\n new Promise((resolve, reject) => {\r\n this._loadMTL(\r\n fileToLoad,\r\n rootUrl,\r\n (dataLoaded) => {\r\n try {\r\n //Create materials thanks MTLLoader function\r\n materialsFromMTLFile.parseMTL(scene, dataLoaded, rootUrl, this._assetContainer);\r\n //Look at each material loaded in the mtl file\r\n for (let n = 0; n < materialsFromMTLFile.materials.length; n++) {\r\n //Three variables to get all meshes with the same material\r\n let startIndex = 0;\r\n const _indices = [];\r\n let _index;\r\n\r\n //The material from MTL file is used in the meshes loaded\r\n //Push the indice in an array\r\n //Check if the material is not used for another mesh\r\n while ((_index = materialToUse.indexOf(materialsFromMTLFile.materials[n].name, startIndex)) > -1) {\r\n _indices.push(_index);\r\n startIndex = _index + 1;\r\n }\r\n //If the material is not used dispose it\r\n if (_index === -1 && _indices.length === 0) {\r\n //If the material is not needed, remove it\r\n materialsFromMTLFile.materials[n].dispose();\r\n } else {\r\n for (let o = 0; o < _indices.length; o++) {\r\n //Apply the material to the Mesh for each mesh with the material\r\n const mesh = babylonMeshesArray[_indices[o]];\r\n const material = materialsFromMTLFile.materials[n];\r\n mesh.material = material;\r\n\r\n if (!mesh.getTotalIndices()) {\r\n // No indices, we need to turn on point cloud\r\n material.pointsCloud = true;\r\n }\r\n }\r\n }\r\n }\r\n resolve();\r\n } catch (e) {\r\n Tools.Warn(`Error processing MTL file: '${fileToLoad}'`);\r\n if (this._loadingOptions.materialLoadingFailsSilently) {\r\n resolve();\r\n } else {\r\n reject(e);\r\n }\r\n }\r\n },\r\n (pathOfFile: string, exception?: any) => {\r\n Tools.Warn(`Error downloading MTL file: '${fileToLoad}'`);\r\n if (this._loadingOptions.materialLoadingFailsSilently) {\r\n resolve();\r\n } else {\r\n reject(exception);\r\n }\r\n }\r\n );\r\n })\r\n );\r\n }\r\n //Return an array with all Mesh\r\n return Promise.all(mtlPromises).then(() => {\r\n return babylonMeshesArray;\r\n });\r\n }\r\n}\r\n\r\nif (SceneLoader) {\r\n //Add this loader into the register plugin\r\n SceneLoader.RegisterPlugin(new OBJFileLoader());\r\n}\r\n"]}
|
package/OBJ/solidParser.js
CHANGED
@@ -8,14 +8,14 @@ import { VertexData } from "@babylonjs/core/Meshes/mesh.vertexData.js";
|
|
8
8
|
/**
|
9
9
|
* Class used to load mesh data from OBJ content
|
10
10
|
*/
|
11
|
-
|
11
|
+
export class SolidParser {
|
12
12
|
/**
|
13
13
|
* Creates a new SolidParser
|
14
14
|
* @param materialToUse defines the array to fill with the list of materials to use (it will be filled by the parse function)
|
15
15
|
* @param babylonMeshesArray defines the array to fill with the list of loaded meshes (it will be filled by the parse function)
|
16
16
|
* @param loadingOptions defines the loading options to use
|
17
17
|
*/
|
18
|
-
|
18
|
+
constructor(materialToUse, babylonMeshesArray, loadingOptions) {
|
19
19
|
this._positions = []; //values for the positions of vertices
|
20
20
|
this._normals = []; //Values for the normals
|
21
21
|
this._uvs = []; //Values for the textures
|
@@ -52,23 +52,23 @@ var SolidParser = /** @class */ (function () {
|
|
52
52
|
* @param obj Array<number>
|
53
53
|
* @returns {boolean}
|
54
54
|
*/
|
55
|
-
|
55
|
+
_isInArray(arr, obj) {
|
56
56
|
if (!arr[obj[0]]) {
|
57
57
|
arr[obj[0]] = { normals: [], idx: [] };
|
58
58
|
}
|
59
|
-
|
59
|
+
const idx = arr[obj[0]].normals.indexOf(obj[1]);
|
60
60
|
return idx === -1 ? -1 : arr[obj[0]].idx[idx];
|
61
|
-
}
|
62
|
-
|
61
|
+
}
|
62
|
+
_isInArrayUV(arr, obj) {
|
63
63
|
if (!arr[obj[0]]) {
|
64
64
|
arr[obj[0]] = { normals: [], idx: [], uv: [] };
|
65
65
|
}
|
66
|
-
|
66
|
+
const idx = arr[obj[0]].normals.indexOf(obj[1]);
|
67
67
|
if (idx != 1 && obj[2] === arr[obj[0]].uv[idx]) {
|
68
68
|
return arr[obj[0]].idx[idx];
|
69
69
|
}
|
70
70
|
return -1;
|
71
|
-
}
|
71
|
+
}
|
72
72
|
/**
|
73
73
|
* This function set the data for each triangle.
|
74
74
|
* Data are position, normals and uvs
|
@@ -83,9 +83,9 @@ var SolidParser = /** @class */ (function () {
|
|
83
83
|
* @param normalsVectorFromOBJ Vector3 The value of normals at index objNormale
|
84
84
|
* @param positionColorsFromOBJ
|
85
85
|
*/
|
86
|
-
|
86
|
+
_setData(indicePositionFromObj, indiceUvsFromObj, indiceNormalFromObj, positionVectorFromOBJ, textureVectorFromOBJ, normalsVectorFromOBJ, positionColorsFromOBJ) {
|
87
87
|
//Check if this tuple already exists in the list of tuples
|
88
|
-
|
88
|
+
let _index;
|
89
89
|
if (this._loadingOptions.optimizeWithUV) {
|
90
90
|
_index = this._isInArrayUV(this._tuplePosNorm, [indicePositionFromObj, indiceNormalFromObj, indiceUvsFromObj]);
|
91
91
|
}
|
@@ -125,13 +125,13 @@ var SolidParser = /** @class */ (function () {
|
|
125
125
|
//At this index we can get the value of position, normal, color and uvs of vertex
|
126
126
|
this._indicesForBabylon.push(_index);
|
127
127
|
}
|
128
|
-
}
|
128
|
+
}
|
129
129
|
/**
|
130
130
|
* Transform Vector() and BABYLON.Color() objects into numbers in an array
|
131
131
|
*/
|
132
|
-
|
132
|
+
_unwrapData() {
|
133
133
|
//Every array has the same length
|
134
|
-
for (
|
134
|
+
for (let l = 0; l < this._wrappedPositionForBabylon.length; l++) {
|
135
135
|
//Push the x, y, z values of each element in the unwrapped array
|
136
136
|
this._unwrappedPositionsForBabylon.push(this._wrappedPositionForBabylon[l].x, this._wrappedPositionForBabylon[l].y, this._wrappedPositionForBabylon[l].z);
|
137
137
|
this._unwrappedNormalsForBabylon.push(this._wrappedNormalsForBabylon[l].x, this._wrappedNormalsForBabylon[l].y, this._wrappedNormalsForBabylon[l].z);
|
@@ -148,7 +148,7 @@ var SolidParser = /** @class */ (function () {
|
|
148
148
|
this._wrappedColorsForBabylon.length = 0;
|
149
149
|
this._tuplePosNorm.length = 0;
|
150
150
|
this._curPositionInIndices = 0;
|
151
|
-
}
|
151
|
+
}
|
152
152
|
/**
|
153
153
|
* Create triangles from polygons
|
154
154
|
* It is important to notice that a triangle is a polygon
|
@@ -162,9 +162,9 @@ var SolidParser = /** @class */ (function () {
|
|
162
162
|
* @param faces Array[String] The indices of elements
|
163
163
|
* @param v Integer The variable to increment
|
164
164
|
*/
|
165
|
-
|
165
|
+
_getTriangles(faces, v) {
|
166
166
|
//Work for each element of the array
|
167
|
-
for (
|
167
|
+
for (let faceIndex = v; faceIndex < faces.length - 1; faceIndex++) {
|
168
168
|
//Add on the triangle variable the indexes to obtain triangles
|
169
169
|
this._triangles.push(faces[0], faces[faceIndex], faces[faceIndex + 1]);
|
170
170
|
}
|
@@ -174,21 +174,21 @@ var SolidParser = /** @class */ (function () {
|
|
174
174
|
//Pattern3 => triangle = ["1/1/1","2/2/2","3/3/3","1/1/1","3/3/3","4/4/4"];
|
175
175
|
//Pattern4 => triangle = ["1//1","2//2","3//3","1//1","3//3","4//4"];
|
176
176
|
//Pattern5 => triangle = ["-1/-1/-1","-2/-2/-2","-3/-3/-3","-1/-1/-1","-3/-3/-3","-4/-4/-4"];
|
177
|
-
}
|
177
|
+
}
|
178
178
|
/**
|
179
179
|
* Create triangles and push the data for each polygon for the pattern 1
|
180
180
|
* In this pattern we get vertice positions
|
181
181
|
* @param face
|
182
182
|
* @param v
|
183
183
|
*/
|
184
|
-
|
184
|
+
_setDataForCurrentFaceWithPattern1(face, v) {
|
185
185
|
//Get the indices of triangles for each polygon
|
186
186
|
this._getTriangles(face, v);
|
187
187
|
//For each element in the triangles array.
|
188
188
|
//This var could contains 1 to an infinity of triangles
|
189
|
-
for (
|
189
|
+
for (let k = 0; k < this._triangles.length; k++) {
|
190
190
|
// Set position indice
|
191
|
-
|
191
|
+
const indicePositionFromObj = parseInt(this._triangles[k]) - 1;
|
192
192
|
this._setData(indicePositionFromObj, 0, 0, // In the pattern 1, normals and uvs are not defined
|
193
193
|
this._positions[indicePositionFromObj], // Get the vectors data
|
194
194
|
Vector2.Zero(), Vector3.Up(), // Create default vectors
|
@@ -196,24 +196,24 @@ var SolidParser = /** @class */ (function () {
|
|
196
196
|
}
|
197
197
|
//Reset variable for the next line
|
198
198
|
this._triangles.length = 0;
|
199
|
-
}
|
199
|
+
}
|
200
200
|
/**
|
201
201
|
* Create triangles and push the data for each polygon for the pattern 2
|
202
202
|
* In this pattern we get vertice positions and uvsu
|
203
203
|
* @param face
|
204
204
|
* @param v
|
205
205
|
*/
|
206
|
-
|
206
|
+
_setDataForCurrentFaceWithPattern2(face, v) {
|
207
207
|
//Get the indices of triangles for each polygon
|
208
208
|
this._getTriangles(face, v);
|
209
|
-
for (
|
209
|
+
for (let k = 0; k < this._triangles.length; k++) {
|
210
210
|
//triangle[k] = "1/1"
|
211
211
|
//Split the data for getting position and uv
|
212
|
-
|
212
|
+
const point = this._triangles[k].split("/"); // ["1", "1"]
|
213
213
|
//Set position indice
|
214
|
-
|
214
|
+
const indicePositionFromObj = parseInt(point[0]) - 1;
|
215
215
|
//Set uv indice
|
216
|
-
|
216
|
+
const indiceUvsFromObj = parseInt(point[1]) - 1;
|
217
217
|
this._setData(indicePositionFromObj, indiceUvsFromObj, 0, //Default value for normals
|
218
218
|
this._positions[indicePositionFromObj], //Get the values for each element
|
219
219
|
this._uvs[indiceUvsFromObj], Vector3.Up(), //Default value for normals
|
@@ -221,80 +221,80 @@ var SolidParser = /** @class */ (function () {
|
|
221
221
|
}
|
222
222
|
//Reset variable for the next line
|
223
223
|
this._triangles.length = 0;
|
224
|
-
}
|
224
|
+
}
|
225
225
|
/**
|
226
226
|
* Create triangles and push the data for each polygon for the pattern 3
|
227
227
|
* In this pattern we get vertice positions, uvs and normals
|
228
228
|
* @param face
|
229
229
|
* @param v
|
230
230
|
*/
|
231
|
-
|
231
|
+
_setDataForCurrentFaceWithPattern3(face, v) {
|
232
232
|
//Get the indices of triangles for each polygon
|
233
233
|
this._getTriangles(face, v);
|
234
|
-
for (
|
234
|
+
for (let k = 0; k < this._triangles.length; k++) {
|
235
235
|
//triangle[k] = "1/1/1"
|
236
236
|
//Split the data for getting position, uv, and normals
|
237
|
-
|
237
|
+
const point = this._triangles[k].split("/"); // ["1", "1", "1"]
|
238
238
|
// Set position indice
|
239
|
-
|
239
|
+
const indicePositionFromObj = parseInt(point[0]) - 1;
|
240
240
|
// Set uv indice
|
241
|
-
|
241
|
+
const indiceUvsFromObj = parseInt(point[1]) - 1;
|
242
242
|
// Set normal indice
|
243
|
-
|
243
|
+
const indiceNormalFromObj = parseInt(point[2]) - 1;
|
244
244
|
this._setData(indicePositionFromObj, indiceUvsFromObj, indiceNormalFromObj, this._positions[indicePositionFromObj], this._uvs[indiceUvsFromObj], this._normals[indiceNormalFromObj] //Set the vector for each component
|
245
245
|
);
|
246
246
|
}
|
247
247
|
//Reset variable for the next line
|
248
248
|
this._triangles.length = 0;
|
249
|
-
}
|
249
|
+
}
|
250
250
|
/**
|
251
251
|
* Create triangles and push the data for each polygon for the pattern 4
|
252
252
|
* In this pattern we get vertice positions and normals
|
253
253
|
* @param face
|
254
254
|
* @param v
|
255
255
|
*/
|
256
|
-
|
256
|
+
_setDataForCurrentFaceWithPattern4(face, v) {
|
257
257
|
this._getTriangles(face, v);
|
258
|
-
for (
|
258
|
+
for (let k = 0; k < this._triangles.length; k++) {
|
259
259
|
//triangle[k] = "1//1"
|
260
260
|
//Split the data for getting position and normals
|
261
|
-
|
261
|
+
const point = this._triangles[k].split("//"); // ["1", "1"]
|
262
262
|
// We check indices, and normals
|
263
|
-
|
264
|
-
|
263
|
+
const indicePositionFromObj = parseInt(point[0]) - 1;
|
264
|
+
const indiceNormalFromObj = parseInt(point[1]) - 1;
|
265
265
|
this._setData(indicePositionFromObj, 1, //Default value for uv
|
266
266
|
indiceNormalFromObj, this._positions[indicePositionFromObj], //Get each vector of data
|
267
267
|
Vector2.Zero(), this._normals[indiceNormalFromObj], this._loadingOptions.importVertexColors ? this._colors[indicePositionFromObj] : undefined);
|
268
268
|
}
|
269
269
|
//Reset variable for the next line
|
270
270
|
this._triangles.length = 0;
|
271
|
-
}
|
271
|
+
}
|
272
272
|
/*
|
273
273
|
* Create triangles and push the data for each polygon for the pattern 3
|
274
274
|
* In this pattern we get vertice positions, uvs and normals
|
275
275
|
* @param face
|
276
276
|
* @param v
|
277
277
|
*/
|
278
|
-
|
278
|
+
_setDataForCurrentFaceWithPattern5(face, v) {
|
279
279
|
//Get the indices of triangles for each polygon
|
280
280
|
this._getTriangles(face, v);
|
281
|
-
for (
|
281
|
+
for (let k = 0; k < this._triangles.length; k++) {
|
282
282
|
//triangle[k] = "-1/-1/-1"
|
283
283
|
//Split the data for getting position, uv, and normals
|
284
|
-
|
284
|
+
const point = this._triangles[k].split("/"); // ["-1", "-1", "-1"]
|
285
285
|
// Set position indice
|
286
|
-
|
286
|
+
const indicePositionFromObj = this._positions.length + parseInt(point[0]);
|
287
287
|
// Set uv indice
|
288
|
-
|
288
|
+
const indiceUvsFromObj = this._uvs.length + parseInt(point[1]);
|
289
289
|
// Set normal indice
|
290
|
-
|
290
|
+
const indiceNormalFromObj = this._normals.length + parseInt(point[2]);
|
291
291
|
this._setData(indicePositionFromObj, indiceUvsFromObj, indiceNormalFromObj, this._positions[indicePositionFromObj], this._uvs[indiceUvsFromObj], this._normals[indiceNormalFromObj], //Set the vector for each component
|
292
292
|
this._loadingOptions.importVertexColors ? this._colors[indicePositionFromObj] : undefined);
|
293
293
|
}
|
294
294
|
//Reset variable for the next line
|
295
295
|
this._triangles.length = 0;
|
296
|
-
}
|
297
|
-
|
296
|
+
}
|
297
|
+
_addPreviousObjMesh() {
|
298
298
|
//Check if it is not the first mesh. Otherwise we don't have data.
|
299
299
|
if (this._meshesFromObj.length > 0) {
|
300
300
|
//Get the previous mesh for applying the data about the faces
|
@@ -320,50 +320,50 @@ var SolidParser = /** @class */ (function () {
|
|
320
320
|
this._unwrappedNormalsForBabylon.length = 0;
|
321
321
|
this._unwrappedUVForBabylon.length = 0;
|
322
322
|
}
|
323
|
-
}
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
323
|
+
}
|
324
|
+
_optimizeNormals(mesh) {
|
325
|
+
const positions = mesh.getVerticesData(VertexBuffer.PositionKind);
|
326
|
+
const normals = mesh.getVerticesData(VertexBuffer.NormalKind);
|
327
|
+
const mapVertices = {};
|
328
328
|
if (!positions || !normals) {
|
329
329
|
return;
|
330
330
|
}
|
331
|
-
for (
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
331
|
+
for (let i = 0; i < positions.length / 3; i++) {
|
332
|
+
const x = positions[i * 3 + 0];
|
333
|
+
const y = positions[i * 3 + 1];
|
334
|
+
const z = positions[i * 3 + 2];
|
335
|
+
const key = x + "_" + y + "_" + z;
|
336
|
+
let lst = mapVertices[key];
|
337
337
|
if (!lst) {
|
338
338
|
lst = [];
|
339
339
|
mapVertices[key] = lst;
|
340
340
|
}
|
341
341
|
lst.push(i);
|
342
342
|
}
|
343
|
-
|
344
|
-
for (
|
345
|
-
|
343
|
+
const normal = new Vector3();
|
344
|
+
for (const key in mapVertices) {
|
345
|
+
const lst = mapVertices[key];
|
346
346
|
if (lst.length < 2) {
|
347
347
|
continue;
|
348
348
|
}
|
349
|
-
|
350
|
-
for (
|
351
|
-
|
349
|
+
const v0Idx = lst[0];
|
350
|
+
for (let i = 1; i < lst.length; ++i) {
|
351
|
+
const vIdx = lst[i];
|
352
352
|
normals[v0Idx * 3 + 0] += normals[vIdx * 3 + 0];
|
353
353
|
normals[v0Idx * 3 + 1] += normals[vIdx * 3 + 1];
|
354
354
|
normals[v0Idx * 3 + 2] += normals[vIdx * 3 + 2];
|
355
355
|
}
|
356
356
|
normal.copyFromFloats(normals[v0Idx * 3 + 0], normals[v0Idx * 3 + 1], normals[v0Idx * 3 + 2]);
|
357
357
|
normal.normalize();
|
358
|
-
for (
|
359
|
-
|
358
|
+
for (let i = 0; i < lst.length; ++i) {
|
359
|
+
const vIdx = lst[i];
|
360
360
|
normals[vIdx * 3 + 0] = normal.x;
|
361
361
|
normals[vIdx * 3 + 1] = normal.y;
|
362
362
|
normals[vIdx * 3 + 2] = normal.z;
|
363
363
|
}
|
364
364
|
}
|
365
365
|
mesh.setVerticesData(VertexBuffer.NormalKind, normals);
|
366
|
-
}
|
366
|
+
}
|
367
367
|
/**
|
368
368
|
* Function used to parse an OBJ string
|
369
369
|
* @param meshesNames defines the list of meshes to load (all if not defined)
|
@@ -372,14 +372,13 @@ var SolidParser = /** @class */ (function () {
|
|
372
372
|
* @param assetContainer defines the asset container to load data in
|
373
373
|
* @param onFileToLoadFound defines a callback that will be called if a MTL file is found
|
374
374
|
*/
|
375
|
-
|
376
|
-
var _a;
|
375
|
+
parse(meshesNames, data, scene, assetContainer, onFileToLoadFound) {
|
377
376
|
// Split the file into lines
|
378
|
-
|
377
|
+
const lines = data.split("\n");
|
379
378
|
// Look at each line
|
380
|
-
for (
|
381
|
-
|
382
|
-
|
379
|
+
for (let i = 0; i < lines.length; i++) {
|
380
|
+
const line = lines[i].trim().replace(/\s\s/g, " ");
|
381
|
+
let result;
|
383
382
|
// Comment or newLine
|
384
383
|
if (line.length === 0 || line.charAt(0) === "#") {
|
385
384
|
continue;
|
@@ -393,9 +392,9 @@ var SolidParser = /** @class */ (function () {
|
|
393
392
|
this._positions.push(new Vector3(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3])));
|
394
393
|
if (this._loadingOptions.importVertexColors) {
|
395
394
|
if (result.length >= 7) {
|
396
|
-
|
397
|
-
|
398
|
-
|
395
|
+
const r = parseFloat(result[4]);
|
396
|
+
const g = parseFloat(result[5]);
|
397
|
+
const b = parseFloat(result[6]);
|
399
398
|
this._colors.push(new Color4(r > 1 ? r / 255 : r, g > 1 ? g / 255 : g, b > 1 ? b / 255 : b, result.length === 7 || result[7] === undefined ? 1 : parseFloat(result[7])));
|
400
399
|
}
|
401
400
|
else {
|
@@ -460,7 +459,7 @@ var SolidParser = /** @class */ (function () {
|
|
460
459
|
else if (SolidParser.GroupDescriptor.test(line) || SolidParser.ObjectDescriptor.test(line)) {
|
461
460
|
// Create a new mesh corresponding to the name of the group.
|
462
461
|
// Definition of the mesh
|
463
|
-
|
462
|
+
const objMesh = {
|
464
463
|
name: line.substring(2).trim(),
|
465
464
|
indices: undefined,
|
466
465
|
positions: undefined,
|
@@ -486,7 +485,7 @@ var SolidParser = /** @class */ (function () {
|
|
486
485
|
//Set the data for the previous mesh
|
487
486
|
this._addPreviousObjMesh();
|
488
487
|
//Create a new mesh
|
489
|
-
|
488
|
+
const objMesh =
|
490
489
|
//Set the name of the current obj mesh
|
491
490
|
{
|
492
491
|
name: (this._objMeshName || "mesh") + "_mm" + this._increment.toString(),
|
@@ -544,7 +543,7 @@ var SolidParser = /** @class */ (function () {
|
|
544
543
|
}
|
545
544
|
// If any o or g keyword not found, create a mesh with a random id
|
546
545
|
if (!this._hasMeshes) {
|
547
|
-
|
546
|
+
let newMaterial = null;
|
548
547
|
if (this._indicesForBabylon.length) {
|
549
548
|
// reverse tab of indices
|
550
549
|
this._indicesForBabylon.reverse();
|
@@ -553,25 +552,21 @@ var SolidParser = /** @class */ (function () {
|
|
553
552
|
}
|
554
553
|
else {
|
555
554
|
// There is no indices in the file. We will have to switch to point cloud rendering
|
556
|
-
for (
|
557
|
-
var pos = _b[_i];
|
555
|
+
for (const pos of this._positions) {
|
558
556
|
this._unwrappedPositionsForBabylon.push(pos.x, pos.y, pos.z);
|
559
557
|
}
|
560
558
|
if (this._normals.length) {
|
561
|
-
for (
|
562
|
-
var normal = _d[_c];
|
559
|
+
for (const normal of this._normals) {
|
563
560
|
this._unwrappedNormalsForBabylon.push(normal.x, normal.y, normal.z);
|
564
561
|
}
|
565
562
|
}
|
566
563
|
if (this._uvs.length) {
|
567
|
-
for (
|
568
|
-
var uv = _f[_e];
|
564
|
+
for (const uv of this._uvs) {
|
569
565
|
this._unwrappedUVForBabylon.push(uv.x, uv.y);
|
570
566
|
}
|
571
567
|
}
|
572
568
|
if (this._colors.length) {
|
573
|
-
for (
|
574
|
-
var color = _h[_g];
|
569
|
+
for (const color of this._colors) {
|
575
570
|
this._unwrappedColorsForBabylon.push(color.r, color.g, color.b, color.a);
|
576
571
|
}
|
577
572
|
}
|
@@ -599,7 +594,7 @@ var SolidParser = /** @class */ (function () {
|
|
599
594
|
});
|
600
595
|
}
|
601
596
|
//Set data for each mesh
|
602
|
-
for (
|
597
|
+
for (let j = 0; j < this._meshesFromObj.length; j++) {
|
603
598
|
//check meshesNames (stlFileLoader)
|
604
599
|
if (meshesNames && this._meshesFromObj[j].name) {
|
605
600
|
if (meshesNames instanceof Array) {
|
@@ -618,24 +613,24 @@ var SolidParser = /** @class */ (function () {
|
|
618
613
|
this._handledMesh = this._meshesFromObj[j];
|
619
614
|
//Create a Mesh with the name of the obj mesh
|
620
615
|
scene._blockEntityCollection = !!assetContainer;
|
621
|
-
|
616
|
+
const babylonMesh = new Mesh(this._meshesFromObj[j].name, scene);
|
622
617
|
babylonMesh._parentContainer = assetContainer;
|
623
618
|
scene._blockEntityCollection = false;
|
624
619
|
//Push the name of the material to an array
|
625
620
|
//This is indispensable for the importMesh function
|
626
621
|
this._materialToUse.push(this._meshesFromObj[j].materialName);
|
627
|
-
if (
|
622
|
+
if (this._handledMesh.positions?.length === 0) {
|
628
623
|
//Push the mesh into an array
|
629
624
|
this._babylonMeshesArray.push(babylonMesh);
|
630
625
|
continue;
|
631
626
|
}
|
632
|
-
|
627
|
+
const vertexData = new VertexData(); //The container for the values
|
633
628
|
//Set the data for the babylonMesh
|
634
629
|
vertexData.uvs = this._handledMesh.uvs;
|
635
630
|
vertexData.indices = this._handledMesh.indices;
|
636
631
|
vertexData.positions = this._handledMesh.positions;
|
637
632
|
if (this._loadingOptions.computeNormals) {
|
638
|
-
|
633
|
+
const normals = new Array();
|
639
634
|
VertexData.ComputeNormals(this._handledMesh.positions, this._handledMesh.indices, normals);
|
640
635
|
vertexData.normals = normals;
|
641
636
|
}
|
@@ -659,36 +654,34 @@ var SolidParser = /** @class */ (function () {
|
|
659
654
|
babylonMesh.material = this._handledMesh.directMaterial;
|
660
655
|
}
|
661
656
|
}
|
662
|
-
}
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
}());
|
693
|
-
export { SolidParser };
|
657
|
+
}
|
658
|
+
}
|
659
|
+
// Descriptor
|
660
|
+
/** Object descriptor */
|
661
|
+
SolidParser.ObjectDescriptor = /^o/;
|
662
|
+
/** Group descriptor */
|
663
|
+
SolidParser.GroupDescriptor = /^g/;
|
664
|
+
/** Material lib descriptor */
|
665
|
+
SolidParser.MtlLibGroupDescriptor = /^mtllib /;
|
666
|
+
/** Use a material descriptor */
|
667
|
+
SolidParser.UseMtlDescriptor = /^usemtl /;
|
668
|
+
/** Smooth descriptor */
|
669
|
+
SolidParser.SmoothDescriptor = /^s /;
|
670
|
+
// Patterns
|
671
|
+
/** Pattern used to detect a vertex */
|
672
|
+
SolidParser.VertexPattern = /v(\s+[\d|.|+|\-|e|E]+){3,7}/;
|
673
|
+
/** Pattern used to detect a normal */
|
674
|
+
SolidParser.NormalPattern = /vn(\s+[\d|.|+|\-|e|E]+)( +[\d|.|+|\-|e|E]+)( +[\d|.|+|\-|e|E]+)/;
|
675
|
+
/** Pattern used to detect a UV set */
|
676
|
+
SolidParser.UVPattern = /vt(\s+[\d|.|+|\-|e|E]+)( +[\d|.|+|\-|e|E]+)/;
|
677
|
+
/** Pattern used to detect a first kind of face (f vertex vertex vertex) */
|
678
|
+
SolidParser.FacePattern1 = /f\s+(([\d]{1,}[\s]?){3,})+/;
|
679
|
+
/** Pattern used to detect a second kind of face (f vertex/uvs vertex/uvs vertex/uvs) */
|
680
|
+
SolidParser.FacePattern2 = /f\s+((([\d]{1,}\/[\d]{1,}[\s]?){3,})+)/;
|
681
|
+
/** Pattern used to detect a third kind of face (f vertex/uvs/normal vertex/uvs/normal vertex/uvs/normal) */
|
682
|
+
SolidParser.FacePattern3 = /f\s+((([\d]{1,}\/[\d]{1,}\/[\d]{1,}[\s]?){3,})+)/;
|
683
|
+
/** Pattern used to detect a fourth kind of face (f vertex//normal vertex//normal vertex//normal)*/
|
684
|
+
SolidParser.FacePattern4 = /f\s+((([\d]{1,}\/\/[\d]{1,}[\s]?){3,})+)/;
|
685
|
+
/** Pattern used to detect a fifth kind of face (f -vertex/-uvs/-normal -vertex/-uvs/-normal -vertex/-uvs/-normal) */
|
686
|
+
SolidParser.FacePattern5 = /f\s+(((-[\d]{1,}\/-[\d]{1,}\/-[\d]{1,}[\s]?){3,})+)/;
|
694
687
|
//# sourceMappingURL=solidParser.js.map
|