diff --git a/examples/js/loaders/GLTFLoader.js b/examples/js/loaders/GLTFLoader.js index 3aaabb3deed5fb45a3f16c5344d969cfda9a59f8..ddb02e1c77397259af922487a61487dc1e78ebf9 100644 --- a/examples/js/loaders/GLTFLoader.js +++ b/examples/js/loaders/GLTFLoader.js @@ -55,6 +55,8 @@ THREE.GLTFLoader.prototype = { buffers: {}, bufferViews: {}, accessors: {}, + textures: {}, + materials: {}, meshes: {}, nodes: {}, scenes: {} @@ -127,6 +129,86 @@ THREE.GLTFLoader.prototype = { } + // textures + + var FILTERS = { + 9728: THREE.NearestFilter, + 9729: THREE.LinearFilter, + 9984: THREE.NearestMipMapNearestFilter, + 9985: THREE.LinearMipMapNearestFilter, + 9986: THREE.NearestMipMapLinearFilter, + 9987: THREE.LinearMipMapLinearFilter + }; + + var WRAPPINGS = { + 33071: THREE.ClampToEdgeWrapping, + 33648: THREE.MirroredRepeatWrapping, + 10497: THREE.RepeatWrapping + }; + + var textures = json.textures; + + for ( var textureId in textures ) { + + var texture = textures[ textureId ]; + + var _texture = new THREE.Texture(); + _texture.flipY = false; + + if ( texture.source ) { + + var source = json.images[ texture.source ]; + + _texture.image = new Image(); + _texture.image.src = source.uri; + _texture.needsUpdate = true; + + } + + if ( texture.sampler ) { + + var sampler = json.samplers[ texture.sampler ]; + + _texture.magFilter = FILTERS[ sampler.magFilter ]; + _texture.minFilter = FILTERS[ sampler.minFilter ]; + _texture.wrapS = WRAPPINGS[ sampler.wrapS ]; + _texture.wrapT = WRAPPINGS[ sampler.wrapT ]; + + } + + library.textures[ textureId ] = _texture; + + } + + // materials + + var materials = json.materials; + + for ( var materialId in materials ) { + + var material = materials[ materialId ]; + + var _material = new THREE.MeshPhongMaterial(); + _material.name = material.name; + + var values = material.values; + + if ( Array.isArray( values.diffuse ) ) _material.color.fromArray( values.diffuse ); + if ( Array.isArray( values.emission ) ) _material.emissive.fromArray( values.emission ); + if ( Array.isArray( values.specular ) ) _material.specular.fromArray( values.specular ); + + if ( values.shininess !== undefined ) _material.shininess = values.shininess; + + if ( typeof( material.values.diffuse ) === 'string' ) { + + _material.map = library.textures[ material.values.diffuse ]; + + } + + library.materials[ materialId ] = _material; + + } + // meshes var meshes = json.meshes; @@ -135,10 +217,8 @@ THREE.GLTFLoader.prototype = { var mesh = meshes[ meshId ]; - var geometries = { - name: mesh.name, - array: [] - }; + var group = new THREE.Group(); + group.name = mesh.name; var primitives = mesh.primitives; @@ -178,11 +258,13 @@ THREE.GLTFLoader.prototype = { } - geometries.array.push( geometry ); + var material = library.materials[ primitive.material ]; + + group.add( new THREE.Mesh( geometry, material ) ); } - library.meshes[ meshId ] = geometries; + library.meshes[ meshId ] = group; } @@ -228,20 +310,9 @@ THREE.GLTFLoader.prototype = { for ( var i = 0; i < node.meshes.length; i ++ ) { var meshId = node.meshes[ i ]; + var group = library.meshes[ meshId ]; - var geometries = library.meshes[ meshId ]; - - var group = new THREE.Group(); - group.name = geometries.name; - object.add( group ); - - var array = geometries.array; - - for ( var j = 0; j < array.length; j ++ ) { - - group.add( new THREE.Mesh( array[ j ], new THREE.MeshNormalMaterial() ) ); - - } + object.add( group.clone() ); }