Browse Source

WebGLRenderer: Refactored renderMesh, renderLine and renderPoints.

Mr.doob 10 years ago
parent
commit
7cf8e9666f
1 changed files with 67 additions and 101 deletions
  1. 67 101
      src/renderers/WebGLRenderer.js

+ 67 - 101
src/renderers/WebGLRenderer.js

@@ -756,6 +756,10 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
+	function getDefaultGroups( position ) {
+
+	}
+
 	this.renderBufferDirect = function ( camera, lights, fog, geometry, material, object ) {
 
 		setMaterial( material );
@@ -831,6 +835,9 @@ THREE.WebGLRenderer = function ( parameters ) {
 		}
 
 		var index = geometry.attributes.index;
+		var position = geometry.attributes.position;
+
+		var groups = geometry.drawcalls;
 
 		if ( index !== undefined ) {
 
@@ -870,6 +877,15 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 			}
 
+			if ( groups.length === 0 ) {
+
+				groups.push( {
+					start: 0,
+					count: position.array.length / 3
+				} );
+
+			}
+
 			var mode;
 
 			if ( object instanceof THREE.Mesh ) {
@@ -886,7 +902,19 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 				}
 
-				renderMesh( mode, geometry );
+				if ( geometry instanceof THREE.InstancedBufferGeometry && geometry.maxInstancedCount > 0 ) {
+
+					renderInstancedMesh( mode, geometry );
+
+				} else if ( position instanceof THREE.InterleavedBufferAttribute ) {
+
+					renderMesh( mode, 0, position.data.count );
+
+				} else {
+
+					renderGroups( groups, renderMesh, mode );
+
+				}
 
 			} else if ( object instanceof THREE.Line ) {
 
@@ -906,11 +934,11 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 				}
 
-				renderLine( mode, geometry );
+				renderGroups( groups, renderLine, mode );
 
 			} else if ( object instanceof THREE.PointCloud ) {
 
-				renderPoints( _gl.POINTS, geometry );
+				renderGroups( groups, renderPoints, _gl.POINTS );
 
 			}
 
@@ -1049,6 +1077,17 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	}
 
+	function renderGroups( groups, renderFunction, mode ) {
+
+		for ( var i = 0, il = groups.length; i < il; i ++ ) {
+
+			var group = groups[ i ];
+			renderFunction( mode, group.start, group.count );
+
+		}
+
+	}
+
 	function renderIndexedMesh( type, size, material, geometry, program, updateBuffers ) {
 
 		var mode = _gl.TRIANGLES;
@@ -1146,75 +1185,38 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	}
 
-	function renderMesh( mode, geometry ) {
+	function renderInstancedMesh( mode, geometry ) {
 
-		var drawcall = geometry.drawcalls;
+		var extension = extensions.get( 'ANGLE_instanced_arrays' );
 
-		if ( drawcall.length === 0 ) {
+		if ( extension === null ) {
 
-			var position = geometry.attributes.position;
-
-			// render non-indexed triangles
-
-			if ( geometry instanceof THREE.InstancedBufferGeometry && geometry.maxInstancedCount > 0 ) {
-
-				var extension = extensions.get( 'ANGLE_instanced_arrays' );
-
-				if ( extension === null ) {
-
-					console.error( 'THREE.WebGLRenderer.renderMesh: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
-					return;
-
-				}
-
-				if ( position instanceof THREE.InterleavedBufferAttribute ) {
-
-					extension.drawArraysInstancedANGLE( mode, 0, position.data.count, geometry.maxInstancedCount ); // Draw the instanced meshes
-
-				} else {
-
-					extension.drawArraysInstancedANGLE( mode, 0, position.count, geometry.maxInstancedCount ); // Draw the instanced meshes
-
-				}
-
-			} else {
-
-				if ( position instanceof THREE.InterleavedBufferAttribute ) {
-
-					_gl.drawArrays( mode, 0, position.data.count );
-
-				} else {
+			console.error( 'THREE.WebGLRenderer.renderMesh: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
+			return;
 
-					_gl.drawArrays( mode, 0, position.count );
+		}
 
-				}
+		var position = geometry.attributes.position;
 
-			}
+		if ( position instanceof THREE.InterleavedBufferAttribute ) {
 
-			_infoRender.calls ++;
-			_infoRender.vertices += position.count;
-			_infoRender.faces += position.array.length / 3;
+			extension.drawArraysInstancedANGLE( mode, 0, position.data.count, geometry.maxInstancedCount );
 
 		} else {
 
-			if ( geometry instanceof THREE.InstancedBufferGeometry ) {
-
-				console.error( 'THREE.WebGLRenderer.renderMesh: cannot use drawCalls with THREE.InstancedBufferGeometry.' );
-				return;
+			extension.drawArraysInstancedANGLE( mode, 0, position.count, geometry.maxInstancedCount );
 
-			}
+		}
 
-			for ( var i = 0, il = drawcall.length; i < il; i ++ ) {
+	}
 
-				_gl.drawArrays( mode, drawcall[ i ].start, drawcall[ i ].count );
+	function renderMesh( mode, start, count ) {
 
-				_infoRender.calls ++;
-				_infoRender.vertices += drawcall[ i ].count;
-				_infoRender.faces += ( drawcall[ i ].count  ) / 3;
+		_gl.drawArrays( mode, start, count );
 
-			}
-
-		}
+		_infoRender.calls ++;
+		_infoRender.vertices += count;
+		_infoRender.faces += count / 3;
 
 	}
 
@@ -1276,30 +1278,12 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	}
 
-	function renderLine( mode, geometry ) {
-
-		var position = geometry.attributes.position;
-		var drawcall = geometry.drawcalls;
-
-		if ( drawcall.length === 0 ) {
-
-			_gl.drawArrays( mode, 0, position.array.length / 3 );
-
-			_infoRender.calls ++;
-			_infoRender.vertices += position.array.length / 3;
-
-		} else {
-
-			for ( var i = 0, il = drawcall.length; i < il; i ++ ) {
-
-				_gl.drawArrays( mode, drawcall[ i ].index, drawcall[ i ].count );
+	function renderLine( mode, start, count ) {
 
-				_infoRender.calls ++;
-				_infoRender.vertices += drawcall[ i ].count;
+		_gl.drawArrays( mode, start, count );
 
-			}
-
-		}
+		_infoRender.calls ++;
+		_infoRender.vertices += count;
 
 	}
 
@@ -1356,30 +1340,12 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	}
 
-	function renderPoints( mode, geometry ) {
+	function renderPoints( mode, start, count ) {
 
-		var position = geometry.attributes.position;
-		var drawcall = geometry.drawcalls;
-
-		if ( drawcall.length === 0 ) {
-
-			_gl.drawArrays( mode, 0, position.array.length / 3 );
+		_gl.drawArrays( mode, start, count );
 
-			_infoRender.calls ++;
-			_infoRender.points += position.array.length / 3;
-
-		} else {
-
-			for ( var i = 0, il = drawcall.length; i < il; i ++ ) {
-
-				_gl.drawArrays( mode, drawcall[ i ].index, drawcall[ i ].count );
-
-				_infoRender.calls ++;
-				_infoRender.points += drawcall[ i ].count;
-
-			}
-
-		}
+		_infoRender.calls ++;
+		_infoRender.points += count;
 
 	}