Просмотр исходного кода

Re-added normal map parsing to ColladaLoader (#22647)

James Baicoianu 3 лет назад
Родитель
Сommit
415a3b1966
2 измененных файлов с 113 добавлено и 4 удалено
  1. 56 2
      examples/js/loaders/ColladaLoader.js
  2. 57 2
      examples/jsm/loaders/ColladaLoader.js

+ 56 - 2
examples/js/loaders/ColladaLoader.js

@@ -1110,6 +1110,10 @@
 							data.parameters = parseEffectParameters( child );
 							break;
 
+						case 'extra':
+							data.extra = parseEffectExtra( child );
+							break;
+
 					}
 
 				}
@@ -1267,6 +1271,10 @@
 
 							break;
 
+						case 'bump':
+							data[ child.nodeName ] = parseEffectExtraTechniqueBump( child );
+							break;
+
 					}
 
 				}
@@ -1311,6 +1319,33 @@
 							data[ child.nodeName ] = parseInt( child.textContent );
 							break;
 
+						case 'bump':
+							data[ child.nodeName ] = parseEffectExtraTechniqueBump( child );
+							break;
+
+					}
+
+				}
+
+				return data;
+
+			}
+
+			function parseEffectExtraTechniqueBump( xml ) {
+				var data = {};
+
+				for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
+
+					var child = xml.childNodes[ i ];
+
+					if ( child.nodeType !== 1 ) continue;
+
+					switch ( child.nodeName ) {
+
+						case 'texture':
+							data[ child.nodeName ] = { id: child.getAttribute( 'texture' ), texcoord: child.getAttribute( 'texcoord' ), extra: parseEffectParameterTexture( child ) };
+							break;
+
 					}
 
 				}
@@ -1570,9 +1605,28 @@
 				} //
 
 
-				if ( extra !== undefined && extra.technique !== undefined && extra.technique.double_sided === 1 ) {
+				if ( technique.extra !== undefined && technique.extra.technique !== undefined ) {
+
+					let techniques = technique.extra.technique;
+
+					for ( let k in techniques ) {
 
-					material.side = THREE.DoubleSide;
+						let v = techniques[k];
+
+						switch (k) {
+
+							case 'double_sided':
+								material.side = ( v === 1 ? THREE.DoubleSide : THREE.FrontSide );
+								break;
+
+							case 'bump':
+								material.normalMap = getTexture( v.texture );
+								material.normalScale = new THREE.Vector2( 1, 1 );
+								break;
+
+						}
+
+					}
 
 				}
 

+ 57 - 2
examples/jsm/loaders/ColladaLoader.js

@@ -1239,6 +1239,10 @@ class ColladaLoader extends Loader {
 						data.parameters = parseEffectParameters( child );
 						break;
 
+					case 'extra':
+						data.extra = parseEffectExtra( child );
+						break;
+
 				}
 
 			}
@@ -1399,6 +1403,10 @@ class ColladaLoader extends Loader {
 
 						break;
 
+					case 'bump':
+						data[ child.nodeName ] = parseEffectExtraTechniqueBump( child );
+						break;
+
 				}
 
 			}
@@ -1445,6 +1453,33 @@ class ColladaLoader extends Loader {
 						data[ child.nodeName ] = parseInt( child.textContent );
 						break;
 
+					case 'bump':
+						data[ child.nodeName ] = parseEffectExtraTechniqueBump( child );
+						break;
+
+				}
+
+			}
+
+			return data;
+
+		}
+
+		function parseEffectExtraTechniqueBump( xml ) {
+			var data = {};
+
+			for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
+
+				var child = xml.childNodes[ i ];
+
+				if ( child.nodeType !== 1 ) continue;
+
+				switch ( child.nodeName ) {
+
+					case 'texture':
+						data[ child.nodeName ] = { id: child.getAttribute( 'texture' ), texcoord: child.getAttribute( 'texcoord' ), extra: parseEffectParameterTexture( child ) };
+						break;
+
 				}
 
 			}
@@ -1712,9 +1747,29 @@ class ColladaLoader extends Loader {
 
 			//
 
-			if ( extra !== undefined && extra.technique !== undefined && extra.technique.double_sided === 1 ) {
 
-				material.side = DoubleSide;
+			if ( technique.extra !== undefined && technique.extra.technique !== undefined ) {
+
+				let techniques = technique.extra.technique;
+
+				for ( let k in techniques ) {
+
+					let v = techniques[k];
+
+					switch (k) {
+
+						case 'double_sided':
+							material.side = ( v === 1 ? THREE.DoubleSide : THREE.FrontSide );
+							break;
+
+						case 'bump':
+							material.normalMap = getTexture( v.texture );
+							material.normalScale = new THREE.Vector2( 1, 1 );
+							break;
+
+					}
+
+				}
 
 			}