Browse Source

GLTFLoader: Added basic material/textures support.

Mr.doob 9 years ago
parent
commit
fc720616d9
1 changed files with 90 additions and 19 deletions
  1. 90 19
      examples/js/loaders/GLTFLoader.js

+ 90 - 19
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() );
 
 				}