Преглед изворни кода

fix the hack __webglInit for geometry that needs buffer updates.

OpenShift guest пре 11 година
родитељ
комит
ddbbcae13b

+ 5 - 3
editor/js/Menubar.Edit.js

@@ -47,7 +47,7 @@ Menubar.Edit = function ( editor ) {
 
 			if ( confirm( 'Convert ' + object.name + ' to BufferGeometry?' ) === false ) return;
 
-			delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
+			delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring) This is not yet fixed for buffergeometry
 
 			object.geometry = new THREE.BufferGeometry().fromGeometry( object.geometry );
 
@@ -65,17 +65,19 @@ Menubar.Edit = function ( editor ) {
 
 		if ( confirm( 'Flatten ' + object.name + '?' ) === false ) return;
 
-		delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
+		//delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
 
 		var geometry = object.geometry.clone();
 		geometry.applyMatrix( object.matrix );
 
+
 		object.geometry = geometry;
 
 		object.position.set( 0, 0, 0 );
 		object.rotation.set( 0, 0, 0 );
 		object.scale.set( 1, 1, 1 );
-
+		
+		object.geometry.buffersNeedUpdate = true;
 		editor.signals.objectChanged.dispatch( object );
 
 	}

+ 2 - 1
editor/js/Sidebar.Geometry.BoxGeometry.js

@@ -68,7 +68,7 @@ Sidebar.Geometry.BoxGeometry = function ( signals, object ) {
 
 	function update() {
 
-		delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
+		//delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
 
 		object.geometry.dispose();
 
@@ -81,6 +81,7 @@ Sidebar.Geometry.BoxGeometry = function ( signals, object ) {
 			depthSegments.getValue()
 		);
 
+		object.geometry.buffersNeedUpdate = true;
 		object.geometry.computeBoundingSphere();
 
 		signals.objectChanged.dispatch( object );

+ 2 - 2
editor/js/Sidebar.Geometry.CircleGeometry.js

@@ -28,7 +28,7 @@ Sidebar.Geometry.CircleGeometry = function ( signals, object ) {
 
 	function update() {
 
-		delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
+		//delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
 
 		object.geometry.dispose();
 
@@ -36,7 +36,7 @@ Sidebar.Geometry.CircleGeometry = function ( signals, object ) {
 			radius.getValue(),
 			segments.getValue()
 		);
-
+		object.geometry.buffersNeedUpdate = true;
 		object.geometry.computeBoundingSphere();
 
 		signals.objectChanged.dispatch( object );

+ 2 - 1
editor/js/Sidebar.Geometry.CylinderGeometry.js

@@ -68,7 +68,7 @@ Sidebar.Geometry.CylinderGeometry = function ( signals, object ) {
 
 	function update() {
 
-		delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
+		//delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
 
 		object.geometry.dispose();
 
@@ -81,6 +81,7 @@ Sidebar.Geometry.CylinderGeometry = function ( signals, object ) {
 			openEnded.getValue()
 		);
 
+		object.geometry.buffersNeedUpdate = true;
 		object.geometry.computeBoundingSphere();
 
 		signals.objectChanged.dispatch( object );

+ 2 - 1
editor/js/Sidebar.Geometry.IcosahedronGeometry.js

@@ -29,7 +29,7 @@ Sidebar.Geometry.IcosahedronGeometry = function ( signals, object ) {
 
 	function update() {
 
-		delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
+		//delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
 
 		object.geometry.dispose();
 
@@ -38,6 +38,7 @@ Sidebar.Geometry.IcosahedronGeometry = function ( signals, object ) {
 			detail.getValue()
 		);
 
+		object.geometry.buffersNeedUpdate = true;
 		object.geometry.computeBoundingSphere();
 
 		signals.objectChanged.dispatch( object );

+ 2 - 1
editor/js/Sidebar.Geometry.PlaneGeometry.js

@@ -49,7 +49,7 @@ Sidebar.Geometry.PlaneGeometry = function ( signals, object ) {
 
 	function update() {
 
-		delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
+		//delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
 
 		object.geometry.dispose();
 
@@ -60,6 +60,7 @@ Sidebar.Geometry.PlaneGeometry = function ( signals, object ) {
 			heightSegments.getValue()
 		);
 
+		object.geometry.buffersNeedUpdate = true;
 		object.geometry.computeBoundingSphere();
 
 		signals.objectChanged.dispatch( object );

+ 2 - 1
editor/js/Sidebar.Geometry.SphereGeometry.js

@@ -79,7 +79,7 @@ Sidebar.Geometry.SphereGeometry = function ( signals, object ) {
 
 	function update() {
 
-		delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
+		//delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
 
 		object.geometry.dispose();
 
@@ -93,6 +93,7 @@ Sidebar.Geometry.SphereGeometry = function ( signals, object ) {
 			thetaLength.getValue()
 		);
 
+		object.geometry.buffersNeedUpdate = true;
 		object.geometry.computeBoundingSphere();
 
 		signals.objectChanged.dispatch( object );

+ 2 - 1
editor/js/Sidebar.Geometry.TorusGeometry.js

@@ -59,7 +59,7 @@ Sidebar.Geometry.TorusGeometry = function ( signals, object ) {
 
 	function update() {
 
-		delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
+		//delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
 
 		object.geometry.dispose();
 
@@ -71,6 +71,7 @@ Sidebar.Geometry.TorusGeometry = function ( signals, object ) {
 			arc.getValue()
 		);
 
+		object.geometry.buffersNeedUpdate = true;
 		object.geometry.computeBoundingSphere();
 
 		signals.objectChanged.dispatch( object );

+ 2 - 1
editor/js/Sidebar.Geometry.TorusKnotGeometry.js

@@ -79,7 +79,7 @@ Sidebar.Geometry.TorusKnotGeometry = function ( signals, object ) {
 
 	function update() {
 
-		delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
+		//delete object.__webglInit; // TODO: Remove hack (WebGLRenderer refactoring)
 
 		object.geometry.dispose();
 
@@ -93,6 +93,7 @@ Sidebar.Geometry.TorusKnotGeometry = function ( signals, object ) {
 			heightScale.getValue()
 		);
 
+		object.geometry.buffersNeedUpdate = true;
 		object.geometry.computeBoundingSphere();
 
 		signals.objectChanged.dispatch( object );

+ 59 - 43
src/renderers/WebGLRenderer.js

@@ -3680,7 +3680,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 			}
 
-			updateObject( object );
+			updateObject(scene, object );
 
 		}
 
@@ -3690,7 +3690,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	function addObject( object, scene ) {
 
-		var g, geometry, material, geometryGroup;
+		var g, geometry, geometryGroup;
 
 		if ( object.__webglInit === undefined ) {
 
@@ -3715,39 +3715,14 @@ THREE.WebGLRenderer = function ( parameters ) {
 					initDirectBuffers( geometry );
 
 				} else if ( object instanceof THREE.Mesh ) {
+					
+					if ( object.__webglActive !== undefined ) {
 
-					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;
-
-						}
+						removeObject( object, scene );
 
 					}
+					
+					initGeometryGroups(scene, object, geometry);
 
 				} else if ( object instanceof THREE.Line ) {
 
@@ -3790,16 +3765,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 					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 ||
@@ -3827,6 +3792,54 @@ THREE.WebGLRenderer = function ( parameters ) {
 		}
 
 	};
+	
+	function initGeometryGroups(scene,object,geometry) {
+		
+		var g, geometryGroup, material,addBuffers = false;
+		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;
+				
+				addBuffers = true;
+				
+			} else {
+				
+				addBuffers = false;
+				
+			}
+			
+			if ( addBuffers || object.__webglActive === undefined ) {
+				addBuffer( scene.__webglObjects, geometryGroup, object );
+			}
+
+		}
+		object.__webglActive = true;
+	}
 
 	function addBuffer( objlist, buffer, object ) {
 
@@ -3859,7 +3872,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	// Objects updates
 
-	function updateObject( object ) {
+	function updateObject(scene, object ) {
 
 		var geometry = object.geometry,
 			geometryGroup, customAttributesDirty, material;
@@ -3871,6 +3884,9 @@ THREE.WebGLRenderer = function ( parameters ) {
 		} else if ( object instanceof THREE.Mesh ) {
 
 			// check all geometry groups
+			if ( geometry.buffersNeedUpdate ) {
+				initGeometryGroups(scene, object,geometry);
+			}
 
 			for ( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) {