@@ -2172,29 +2172,56 @@ THREE.ColladaLoader.prototype = {
21722172
21732173 var materialKeys = [ ] ;
21742174
2175- var start = 0 , count = 0 ;
2175+ var start = 0 ;
21762176
21772177 for ( var p = 0 ; p < primitives . length ; p ++ ) {
21782178
21792179 var primitive = primitives [ p ] ;
21802180 var inputs = primitive . inputs ;
2181- var triangleCount = 1 ;
21822181
2183- if ( primitive . vcount && primitive . vcount [ 0 ] === 4 ) {
2182+ // groups
21842183
2185- triangleCount = 2 ; // one quad -> two triangles
2184+ var count = 0 ;
21862185
2187- }
2186+ switch ( primitive . type ) {
21882187
2189- // groups
2188+ case 'lines' :
2189+ case 'linestrips' :
2190+ count = primitive . count * 2 ;
2191+ break ;
21902192
2191- if ( primitive . type === 'lines' || primitive . type === 'linestrips' ) {
2193+ case 'triangles' :
2194+ count = primitive . count * 3 ;
2195+ break ;
21922196
2193- count = primitive . count * 2 ;
2197+ case 'polylist' :
21942198
2195- } else {
2199+ for ( var g = 0 ; g < primitive . count ; g ++ ) {
2200+
2201+ var vc = primitive . vcount [ g ] ;
2202+
2203+ switch ( vc ) {
2204+
2205+ case 3 :
2206+ count += 3 ; // single triangle
2207+ break ;
2208+
2209+ case 4 :
2210+ count += 6 ; // quad, subdivided into two triangles
2211+ break ;
2212+
2213+ default :
2214+ count += ( vc - 2 ) * 3 ; // polylist with more than four vertices
2215+ break ;
21962216
2197- count = primitive . count * 3 * triangleCount ;
2217+ }
2218+
2219+ }
2220+
2221+ break ;
2222+
2223+ default :
2224+ console . warn ( 'THREE.ColladaLoader: Unknow primitive type:' , primitive . type ) ;
21982225
21992226 }
22002227
@@ -2334,8 +2361,6 @@ THREE.ColladaLoader.prototype = {
23342361
23352362 }
23362363
2337- var maxcount = 0 ;
2338-
23392364 var sourceArray = source . array ;
23402365 var sourceStride = source . stride ;
23412366
@@ -2365,19 +2390,21 @@ THREE.ColladaLoader.prototype = {
23652390
23662391 pushVector ( a ) ; pushVector ( b ) ; pushVector ( c ) ;
23672392
2368- } else {
2393+ } else if ( count > 4 ) {
23692394
2370- maxcount = Math . max ( maxcount , count ) ;
2395+ for ( var k = 1 , kl = ( count - 2 ) ; k <= kl ; k ++ ) {
23712396
2372- }
2397+ var a = index + stride * 0 ;
2398+ var b = index + stride * k ;
2399+ var c = index + stride * ( k + 1 ) ;
23732400
2374- index += stride * count ;
2401+ pushVector ( a ) ; pushVector ( b ) ; pushVector ( c ) ;
23752402
2376- }
2403+ }
23772404
2378- if ( maxcount > 0 ) {
2405+ }
23792406
2380- console . log ( 'THREE.ColladaLoader: Geometry has faces with more than 4 vertices.' ) ;
2407+ index += stride * count ;
23812408
23822409 }
23832410
0 commit comments