Browse Source

WebGLRenderer: Made MultiMaterial more robust

Mugen87 8 years ago
parent
commit
5423d932b4
1 changed files with 32 additions and 2 deletions
  1. 32 2
      src/renderers/WebGLRenderer.js

+ 32 - 2
src/renderers/WebGLRenderer.js

@@ -1434,14 +1434,44 @@ function WebGLRenderer( parameters ) {
 							var groups = geometry.groups;
 							var materials = material.materials;
 
+							// there must be at least one group if a MultiMaterial is used
+
+							if ( groups.length === 0 ) {
+
+								if ( geometry.index !== undefined ) {
+
+									// indexed geometry
+
+									geometry.addGroup( 0, geometry.index.count );
+
+								} else {
+
+									// non-indexed geometry
+
+									geometry.addGroup( 0, geometry.position.count / 3 );
+
+								}
+
+							}
+
+							// push a render item for each group of the geometry
+
 							for ( var i = 0, l = groups.length; i < l; i ++ ) {
 
 								var group = groups[ i ];
 								var groupMaterial = materials[ group.materialIndex ];
 
-								if ( groupMaterial.visible === true ) {
+								if ( groupMaterial === undefined ) {
+
+									console.warn( 'THREE.WebGLRenderer: MultiMaterial has insufficient amount of materials for geometry. %i material(s) expected but only %i provided.', groups.length, materials.length );
+
+								} else {
+
+									if ( groupMaterial.visible === true ) {
+
+										pushRenderItem( object, geometry, groupMaterial, _vector3.z, group );
 
-									pushRenderItem( object, geometry, groupMaterial, _vector3.z, group );
+									}
 
 								}