소스 검색

Reverted WebGLRenderer.

Mr.doob 11 년 전
부모
커밋
a4a7dd2b57
1개의 변경된 파일121개의 추가작업 그리고 3개의 파일을 삭제
  1. 121 3
      src/renderers/WebGLRenderer.js

+ 121 - 3
src/renderers/WebGLRenderer.js

@@ -615,7 +615,41 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 		} else {
 		} else {
 
 
-			deleteBuffers( geometry );
+			if ( geometry.geometryGroups !== undefined ) {
+
+				for ( var g in geometry.geometryGroups ) {
+
+					var geometryGroup = geometry.geometryGroups[ g ];
+
+					if ( geometryGroup.numMorphTargets !== undefined ) {
+
+						for ( var m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {
+
+							_gl.deleteBuffer( geometryGroup.__webglMorphTargetsBuffers[ m ] );
+
+						}
+
+					}
+
+					if ( geometryGroup.numMorphNormals !== undefined ) {
+
+						for ( var m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {
+
+							_gl.deleteBuffer( geometryGroup.__webglMorphNormalsBuffers[ m ] );
+
+						}
+
+					}
+
+					deleteBuffers( geometryGroup );
+
+				}
+
+			} else {
+
+				deleteBuffers( geometry );
+
+			}
 
 
 		}
 		}
 
 
@@ -2493,7 +2527,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 					enableAttribute( attributePointer );
 					enableAttribute( attributePointer );
 					_gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, startIndex * attributeSize * 4 ); // 4 bytes per Float32
 					_gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, startIndex * attributeSize * 4 ); // 4 bytes per Float32
 
 
-				} else if ( material.defaultAttributeValues && material.defaultAttributeValues[ attributeName ] ) {
+				} else if ( material.defaultAttributeValues ) {
 
 
 					if ( material.defaultAttributeValues[ attributeName ].length === 2 ) {
 					if ( material.defaultAttributeValues[ attributeName ].length === 2 ) {
 
 
@@ -3673,12 +3707,46 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 				geometry.__webglInit = true;
 				geometry.__webglInit = true;
 				geometry.addEventListener( 'dispose', onGeometryDispose );
 				geometry.addEventListener( 'dispose', onGeometryDispose );
-				geometry.dispatchEvent( { type: 'allocate' } );
 
 
 				if ( geometry instanceof THREE.BufferGeometry ) {
 				if ( geometry instanceof THREE.BufferGeometry ) {
 
 
 					initDirectBuffers( geometry );
 					initDirectBuffers( geometry );
 
 
+				} else if ( object instanceof THREE.Mesh ) {
+
+					material = object.material;
+
+					if ( geometry.geometryGroups === undefined ) {
+
+						geometry.makeGroups( material instanceof THREE.MeshFaceMaterial, _glExtensionElementIndexUint ? 4294967296 : 65535  );
+
+					}
+
+					// create separate VBOs per geometry chunk
+
+					for ( g in geometry.geometryGroups ) {
+
+						geometryGroup = geometry.geometryGroups[ g ];
+
+						// initialise VBO on the first access
+
+						if ( ! geometryGroup.__webglVertexBuffer ) {
+
+							createMeshBuffers( geometryGroup );
+							initMeshBuffers( geometryGroup, object );
+
+							geometry.verticesNeedUpdate = true;
+							geometry.morphTargetsNeedUpdate = true;
+							geometry.elementsNeedUpdate = true;
+							geometry.uvsNeedUpdate = true;
+							geometry.normalsNeedUpdate = true;
+							geometry.tangentsNeedUpdate = true;
+							geometry.colorsNeedUpdate = true;
+
+						}
+
+					}
+
 				} else if ( object instanceof THREE.Line ) {
 				} else if ( object instanceof THREE.Line ) {
 
 
 					if ( ! geometry.__webglVertexBuffer ) {
 					if ( ! geometry.__webglVertexBuffer ) {
@@ -3720,6 +3788,16 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 					addBuffer( scene.__webglObjects, geometry, object );
 					addBuffer( scene.__webglObjects, geometry, object );
 
 
+				} else if ( geometry instanceof THREE.Geometry ) {
+
+					for ( g in geometry.geometryGroups ) {
+
+						geometryGroup = geometry.geometryGroups[ g ];
+
+						addBuffer( scene.__webglObjects, geometryGroup, object );
+
+					}
+
 				}
 				}
 
 
 			} else if ( object instanceof THREE.Line ||
 			} else if ( object instanceof THREE.Line ||
@@ -3788,6 +3866,46 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 			setDirectBuffers( geometry, _gl.DYNAMIC_DRAW );
 			setDirectBuffers( geometry, _gl.DYNAMIC_DRAW );
 
 
+		} else if ( object instanceof THREE.Mesh ) {
+
+			// check all geometry groups
+
+			for( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) {
+
+				geometryGroup = geometry.geometryGroupsList[ i ];
+
+				material = getBufferMaterial( object, geometryGroup );
+
+				if ( geometry.buffersNeedUpdate ) {
+
+					initMeshBuffers( geometryGroup, object );
+
+				}
+
+				customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
+
+				if ( geometry.verticesNeedUpdate || geometry.morphTargetsNeedUpdate || geometry.elementsNeedUpdate ||
+					 geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
+					 geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate || customAttributesDirty ) {
+
+					setMeshBuffers( geometryGroup, object, _gl.DYNAMIC_DRAW, !geometry.dynamic, material );
+
+				}
+
+			}
+
+			geometry.verticesNeedUpdate = false;
+			geometry.morphTargetsNeedUpdate = false;
+			geometry.elementsNeedUpdate = false;
+			geometry.uvsNeedUpdate = false;
+			geometry.normalsNeedUpdate = false;
+			geometry.colorsNeedUpdate = false;
+			geometry.tangentsNeedUpdate = false;
+
+			geometry.buffersNeedUpdate = false;
+
+			material.attributes && clearCustomAttributes( material );
+
 		} else if ( object instanceof THREE.Line ) {
 		} else if ( object instanceof THREE.Line ) {
 
 
 			material = getBufferMaterial( object, geometry );
 			material = getBufferMaterial( object, geometry );