浏览代码

Supporting updates with BufferGeometry as discussed in #3088

Use

geometry.attributes.index.needsUpdate
geometry.attributes.position.needsUpdate
geometry.attributes.normal.needsUpdate
geometry.attributes.uv.needsUpdate
geometry.attributes.color.needsUpdate
geometry.attributes.custom.needsUpdate

instead of for usual geometries

geometry.verticesNeedUpdate
geometry.elementsNeedUpdate
geometry.uvsNeedUpdate
geometry.normalsNeedUpdate
geometry.colorsNeedUpdate
geometry.tangentsNeedUpdate
zz85 12 年之前
父节点
当前提交
632ab5740c
共有 1 个文件被更改,包括 99 次插入67 次删除
  1. 99 67
      src/renderers/WebGLRenderer.js

+ 99 - 67
src/renderers/WebGLRenderer.js

@@ -3238,54 +3238,80 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		var attributes = geometry.attributes;
 
-		var index = attributes[ "index" ];
-		var position = attributes[ "position" ];
-		var normal = attributes[ "normal" ];
-		var uv = attributes[ "uv" ];
-		var color = attributes[ "color" ];
-		var tangent = attributes[ "tangent" ];
+		var attributeName, attributeItem;
 
-		if ( geometry.elementsNeedUpdate && index !== undefined ) {
+		for ( attributeName in attributes ) {
 
-			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
-			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, index.array, hint );
+			attributeItem = attributes[ attributeName ];
 
-		}
+			if ( ! attributeItem.needsUpdate ) continue;
 
-		if ( geometry.verticesNeedUpdate && position !== undefined ) {
+			// console.log( attributeName );
 
-			_gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
-			_gl.bufferData( _gl.ARRAY_BUFFER, position.array, hint );
+			if ( attributeName === 'index' ) {
 
-		}
+				_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attributeItem.buffer );
+				_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, attributeItem.array, hint );
+
+			} else {
+
+				_gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );
+				_gl.bufferData( _gl.ARRAY_BUFFER, attributeItem.array, hint );
 
-		if ( geometry.normalsNeedUpdate && normal !== undefined ) {
+			}
 
-			_gl.bindBuffer( _gl.ARRAY_BUFFER, normal.buffer );
-			_gl.bufferData( _gl.ARRAY_BUFFER, normal.array, hint );
+			attributeItem.needsUpdate = false;
 
 		}
 
-		if ( geometry.uvsNeedUpdate && uv !== undefined ) {
+		// var index = attributes[ "index" ];
+		// var position = attributes[ "position" ];
+		// var normal = attributes[ "normal" ];
+		// var uv = attributes[ "uv" ];
+		// var color = attributes[ "color" ];
+		// var tangent = attributes[ "tangent" ];
 
-			_gl.bindBuffer( _gl.ARRAY_BUFFER, uv.buffer );
-			_gl.bufferData( _gl.ARRAY_BUFFER, uv.array, hint );
+		// if ( geometry.elementsNeedUpdate && index !== undefined ) {
 
-		}
+		// 	_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
+		// 	_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, index.array, hint );
 
-		if ( geometry.colorsNeedUpdate && color !== undefined ) {
+		// }
 
-			_gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
-			_gl.bufferData( _gl.ARRAY_BUFFER, color.array, hint );
+		// if ( geometry.verticesNeedUpdate && position !== undefined ) {
 
-		}
+		// 	_gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
+		// 	_gl.bufferData( _gl.ARRAY_BUFFER, position.array, hint );
 
-		if ( geometry.tangentsNeedUpdate && tangent !== undefined ) {
+		// }
 
-			_gl.bindBuffer( _gl.ARRAY_BUFFER, tangent.buffer );
-			_gl.bufferData( _gl.ARRAY_BUFFER, tangent.array, hint );
+		// if ( geometry.normalsNeedUpdate && normal !== undefined ) {
 
-		}
+		// 	_gl.bindBuffer( _gl.ARRAY_BUFFER, normal.buffer );
+		// 	_gl.bufferData( _gl.ARRAY_BUFFER, normal.array, hint );
+
+		// }
+
+		// if ( geometry.uvsNeedUpdate && uv !== undefined ) {
+
+		// 	_gl.bindBuffer( _gl.ARRAY_BUFFER, uv.buffer );
+		// 	_gl.bufferData( _gl.ARRAY_BUFFER, uv.array, hint );
+
+		// }
+
+		// if ( geometry.colorsNeedUpdate && color !== undefined ) {
+
+		// 	_gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
+		// 	_gl.bufferData( _gl.ARRAY_BUFFER, color.array, hint );
+
+		// }
+
+		// if ( geometry.tangentsNeedUpdate && tangent !== undefined ) {
+
+		// 	_gl.bindBuffer( _gl.ARRAY_BUFFER, tangent.buffer );
+		// 	_gl.bufferData( _gl.ARRAY_BUFFER, tangent.array, hint );
+
+		// }
 
 		if ( dispose ) {
 
@@ -4601,14 +4627,14 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 					if ( geometry instanceof THREE.Geometry ) {
 
-            createLineBuffers( geometry );
-            initLineBuffers( geometry, object );
+						createLineBuffers( geometry );
+						initLineBuffers( geometry, object );
 
-            geometry.verticesNeedUpdate = true;
-            geometry.colorsNeedUpdate = true;
-            geometry.lineDistancesNeedUpdate = true;
+						geometry.verticesNeedUpdate = true;
+						geometry.colorsNeedUpdate = true;
+						geometry.lineDistancesNeedUpdate = true;
 
-          } else if ( geometry instanceof THREE.BufferGeometry ) {
+					} else if ( geometry instanceof THREE.BufferGeometry ) {
 
 						initDirectBuffers( geometry );
 
@@ -4728,20 +4754,22 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 			if ( geometry instanceof THREE.BufferGeometry ) {
 
-				if ( geometry.verticesNeedUpdate || geometry.elementsNeedUpdate ||
-					 geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
-					 geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate ) {
+				setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
 
-					setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
+				// if ( geometry.verticesNeedUpdate || geometry.elementsNeedUpdate ||
+				// 	 geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
+				// 	 geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate ) {
 
-				}
+				// 	setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
 
-				geometry.verticesNeedUpdate = false;
-				geometry.elementsNeedUpdate = false;
-				geometry.uvsNeedUpdate = false;
-				geometry.normalsNeedUpdate = false;
-				geometry.colorsNeedUpdate = false;
-				geometry.tangentsNeedUpdate = false;
+				// }
+
+				// geometry.verticesNeedUpdate = false;
+				// geometry.elementsNeedUpdate = false;
+				// geometry.uvsNeedUpdate = false;
+				// geometry.normalsNeedUpdate = false;
+				// geometry.colorsNeedUpdate = false;
+				// geometry.tangentsNeedUpdate = false;
 
 			} else {
 
@@ -4805,49 +4833,53 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		} else if ( object instanceof THREE.Line ) {
 
-      if ( geometry instanceof THREE.BufferGeometry ) {
+			if ( geometry instanceof THREE.BufferGeometry ) {
 
-				if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
+				setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
 
-					setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
+				// if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
 
-				}
+				// 	setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
 
-				geometry.verticesNeedUpdate = false;
-				geometry.colorsNeedUpdate = false;
+				// }
+
+				// geometry.verticesNeedUpdate = false;
+				// geometry.colorsNeedUpdate = false;
 
 			} else {
 
-        material = getBufferMaterial( object, geometry );
+				material = getBufferMaterial( object, geometry );
 
-        customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
+				customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
 
-        if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || geometry.lineDistancesNeedUpdate || customAttributesDirty ) {
+				if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || geometry.lineDistancesNeedUpdate || customAttributesDirty ) {
 
-          setLineBuffers( geometry, _gl.DYNAMIC_DRAW );
+					setLineBuffers( geometry, _gl.DYNAMIC_DRAW );
 
-        }
+				}
 
-        geometry.verticesNeedUpdate = false;
-        geometry.colorsNeedUpdate = false;
-        geometry.lineDistancesNeedUpdate = false;
+				geometry.verticesNeedUpdate = false;
+				geometry.colorsNeedUpdate = false;
+				geometry.lineDistancesNeedUpdate = false;
 
-        material.attributes && clearCustomAttributes( material );
+				material.attributes && clearCustomAttributes( material );
 
-      }
+			}
 
 		} else if ( object instanceof THREE.ParticleSystem ) {
 
 			if ( geometry instanceof THREE.BufferGeometry ) {
 
-				if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
+				setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
 
-					setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
+				// if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
 
-				}
+				// 	setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
 
-				geometry.verticesNeedUpdate = false;
-				geometry.colorsNeedUpdate = false;
+				// }
+
+				// geometry.verticesNeedUpdate = false;
+				// geometry.colorsNeedUpdate = false;
 
 			} else {