loadMesh( meshIndex ) {

    		const parser = this;
    		const json = this.json;
    		const extensions = this.extensions;

    		const meshDef = json.meshes[ meshIndex ];
    		const primitives = meshDef.primitives;

    		const pending = [];

    		for ( let i = 0, il = primitives.length; i < il; i ++ ) {

    			const material = primitives[ i ].material === undefined
    				? createDefaultMaterial( this.cache )
    				: this.getDependency( 'material', primitives[ i ].material );

    			pending.push( material );

    		}

    		pending.push( parser.loadGeometries( primitives ) );

    		return Promise.all( pending ).then( function ( results ) {

    			const materials = results.slice( 0, results.length - 1 );
    			const geometries = results[ results.length - 1 ];

    			const meshes = [];

    			for ( let i = 0, il = geometries.length; i < il; i ++ ) {

    				const geometry = geometries[ i ];
    				const primitive = primitives[ i ];

    				// 1. create Mesh

    				let mesh;

    				const material = materials[ i ];

    				if ( primitive.mode === WEBGL_CONSTANTS$1.TRIANGLES ||
    						primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_STRIP ||
    						primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_FAN ||
    						primitive.mode === undefined ) {

    					// .isSkinnedMesh isn't in glTF spec. See ._markDefs()
    					mesh = meshDef.isSkinnedMesh === true
    						? new SkinnedMesh( geometry, material )
    						: new Mesh( geometry, material );

    					if ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) {

    						// we normalize floating point skin weight array to fix malformed assets (see #15319)
    						// it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs
    						mesh.normalizeSkinWeights();

    					}

    					if ( primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_STRIP ) {

    						mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );

    					} else if ( primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_FAN ) {

    						mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );

    					}

    				} else if ( primitive.mode === WEBGL_CONSTANTS$1.LINES ) {

    					mesh = new LineSegments( geometry, material );

    				} else if ( primitive.mode === WEBGL_CONSTANTS$1.LINE_STRIP ) {

    					mesh = new Line( geometry, material );

    				} else if ( primitive.mode === WEBGL_CONSTANTS$1.LINE_LOOP ) {

    					mesh = new LineLoop( geometry, material );

    				} else if ( primitive.mode === WEBGL_CONSTANTS$1.POINTS ) {

    					mesh = new Points( geometry, material );

    				} else {

    					throw new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );

    				}

    				if ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {

    					updateMorphTargets( mesh, meshDef );

    				}

    				mesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );

    				assignExtrasToUserData( mesh, meshDef );

    				if ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );

    				parser.assignFinalMaterial( mesh );

    				meshes.push( mesh );

    			}

    			for ( let i = 0, il = meshes.length; i < il; i ++ ) {

    				parser.associations.set( meshes[ i ], {
    					meshes: meshIndex,
    					primitives: i
    				} );

    			}

    			if ( meshes.length === 1 ) {

    				return meshes[ 0 ];

    			}

    			const group = new Group();

    			parser.associations.set( group, { meshes: meshIndex } );

    			for ( let i = 0, il = meshes.length; i < il; i ++ ) {

    				group.add( meshes[ i ] );

    			}

    			return group;

    		} );

    	}
Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes
@param {number} meshIndex
@return {Promise<Group|Mesh|SkinnedMesh>}