瀏覽代碼

ColladaLoader: Added support for polylists with more than four vertices.

Mugen87 7 年之前
父節點
當前提交
a9dbbcd372
共有 1 個文件被更改,包括 46 次插入19 次删除
  1. 46 19
      examples/js/loaders/ColladaLoader.js

+ 46 - 19
examples/js/loaders/ColladaLoader.js

@@ -2172,29 +2172,56 @@ THREE.ColladaLoader.prototype = {
 
 			var materialKeys = [];
 
-			var start = 0, count = 0;
+			var start = 0;
 
 			for ( var p = 0; p < primitives.length; p ++ ) {
 
 				var primitive = primitives[ p ];
 				var inputs = primitive.inputs;
-				var triangleCount = 1;
 
-				if ( primitive.vcount && primitive.vcount[ 0 ] === 4 ) {
+				// groups
 
-					triangleCount = 2; // one quad -> two triangles
+				var count = 0;
 
-				}
+				for ( var g = 0; g < primitive.count; g ++ ) {
 
-				// groups
+					var type = primitive.type;
 
-				if ( primitive.type === 'lines' || primitive.type === 'linestrips' ) {
+					switch ( type ) {
 
-					count = primitive.count * 2;
+						case 'lines':
+						case 'linestrips':
+							count += 2;
+							break;
 
-				} else {
+						case 'triangles':
+							count += 3;
+							break;
+
+						case 'polylist':
+							var vc = primitive.vcount[ g ];
 
-					count = primitive.count * 3 * triangleCount;
+							switch ( vc ) {
+
+								case 3:
+									count += 3; // single triangle
+									break;
+
+								case 4:
+									count += 6; // quad, subdivided into two triangles
+									break;
+
+								default:
+									count += ( vc - 2 ) * 3; // polylist with more than four vertices
+									break;
+
+							}
+							break;
+
+						default:
+							console.warn( 'THREE.ColladaLoader: Unknow primitive type:', type );
+
+					}
 
 				}
 
@@ -2334,8 +2361,6 @@ THREE.ColladaLoader.prototype = {
 
 			}
 
-			var maxcount = 0;
-
 			var sourceArray = source.array;
 			var sourceStride = source.stride;
 
@@ -2365,19 +2390,21 @@ THREE.ColladaLoader.prototype = {
 
 						pushVector( a ); pushVector( b ); pushVector( c );
 
-					} else {
+					} else if ( count > 4 ) {
 
-						maxcount = Math.max( maxcount, count );
+						for ( var k = 1, kl = ( count - 2 ); k <= kl; k ++ ) {
 
-					}
+							var a = index + stride * 0;
+							var b = index + stride * k;
+							var c = index + stride * ( k + 1 );
 
-					index += stride * count;
+							pushVector( a ); pushVector( b ); pushVector( c );
 
-				}
+						}
 
-				if ( maxcount > 0 ) {
+					}
 
-					console.log( 'THREE.ColladaLoader: Geometry has faces with more than 4 vertices.' );
+					index += stride * count;
 
 				}