Browse Source

WebGLRenderer: Fix bug where BufferGeometry generates new buffers when reused.

Mr.doob 11 years ago
parent
commit
2f4dbb9bb6
1 changed files with 47 additions and 42 deletions
  1. 47 42
      src/renderers/WebGLRenderer.js

+ 47 - 42
src/renderers/WebGLRenderer.js

@@ -3680,80 +3680,85 @@ THREE.WebGLRenderer = function ( parameters ) {
 			object._modelViewMatrix = new THREE.Matrix4();
 			object._modelViewMatrix = new THREE.Matrix4();
 			object._normalMatrix = new THREE.Matrix3();
 			object._normalMatrix = new THREE.Matrix3();
 
 
-			if ( object.geometry !== undefined && object.geometry.__webglInit === undefined ) {
+			geometry = object.geometry;
+
+			if ( geometry === undefined ) {
 
 
-				object.geometry.__webglInit = true;
-				object.geometry.addEventListener( 'dispose', onGeometryDispose );
+				// TODO: Hacky...
+
+				object.__webglActive = true;
+				return;
 
 
 			}
 			}
 
 
-			geometry = object.geometry;
+			if ( geometry.__webglInit === undefined ) {
 
 
-			if ( geometry === undefined ) {
+				geometry.__webglInit = true;
+				geometry.addEventListener( 'dispose', onGeometryDispose );
 
 
-				// fail silently for now
+				if ( geometry instanceof THREE.BufferGeometry ) {
 
 
-			} else if ( geometry instanceof THREE.BufferGeometry ) {
+					initDirectBuffers( geometry );
 
 
-				initDirectBuffers( geometry );
+				} else if ( object instanceof THREE.Mesh ) {
 
 
-			} else if ( object instanceof THREE.Mesh ) {
+					material = object.material;
 
 
-				material = object.material;
+					if ( geometry.geometryGroups === undefined ) {
 
 
-				if ( geometry.geometryGroups === undefined ) {
+						geometry.makeGroups( material instanceof THREE.MeshFaceMaterial, _glExtensionElementIndexUint ? 4294967296 : 65535  );
 
 
-					geometry.makeGroups( material instanceof THREE.MeshFaceMaterial, _glExtensionElementIndexUint ? 4294967296 : 65535  );
+					}
 
 
-				}
+					// create separate VBOs per geometry chunk
 
 
-				// create separate VBOs per geometry chunk
+					for ( g in geometry.geometryGroups ) {
 
 
-				for ( g in geometry.geometryGroups ) {
+						geometryGroup = geometry.geometryGroups[ g ];
 
 
-					geometryGroup = geometry.geometryGroups[ g ];
+						// initialise VBO on the first access
 
 
-					// initialise VBO on the first access
+						if ( ! geometryGroup.__webglVertexBuffer ) {
 
 
-					if ( ! geometryGroup.__webglVertexBuffer ) {
+							createMeshBuffers( geometryGroup );
+							initMeshBuffers( geometryGroup, object );
 
 
-						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;
 
 
-						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 ) {
+						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 ( object instanceof THREE.ParticleSystem ) {
 
 
-			} else if ( object instanceof THREE.ParticleSystem ) {
+					if ( ! geometry.__webglVertexBuffer ) {
 
 
-				if ( ! geometry.__webglVertexBuffer ) {
+						createParticleBuffers( geometry );
+						initParticleBuffers( geometry, object );
 
 
-					createParticleBuffers( geometry );
-					initParticleBuffers( geometry, object );
+						geometry.verticesNeedUpdate = true;
+						geometry.colorsNeedUpdate = true;
 
 
-					geometry.verticesNeedUpdate = true;
-					geometry.colorsNeedUpdate = true;
+					}
 
 
 				}
 				}