浏览代码

WebGLRenderer: Fixed wireframe.

Mr.doob 10 年之前
父节点
当前提交
0048009f4d

+ 69 - 0
src/extras/geometries/WireframeBufferGeometry.js

@@ -0,0 +1,69 @@
+/**
+ * @author mrdoob / http://mrdoob.com/
+ */
+
+THREE.WireframeBufferGeometry = function ( geometry ) {
+
+	THREE.BufferGeometry.call( this );
+
+	var attributes = geometry.attributes;
+
+	// link attributes
+
+	for ( var name in attributes ) {
+
+		this.addAttribute( name, attributes[ name ] );
+
+	}
+
+	this.morphAttributes = geometry.morphAttributes;
+
+	// create wireframe indices
+
+	var indices = [];
+
+	var index = attributes.index;
+	var position = attributes.position;
+
+	if ( index !== undefined ) {
+
+		var array = index.array;
+
+		for ( var i = 0, j = 0, l = array.length; i < l; i += 3 ) {
+
+			var a = array[ i + 0 ];
+			var b = array[ i + 1 ];
+			var c = array[ i + 2 ];
+
+			// TODO: Check for duplicates
+
+			indices.push( a, b, b, c, c, a );
+
+		}
+
+	} else {
+
+		var array = position.array;
+
+		for ( var i = 0, j = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {
+
+			var a = i + 0;
+			var b = i + 1;
+			var c = i + 2;
+
+			// TODO: Check for duplicates
+
+			indices.push( a, b, b, c, c, a );
+
+		}
+
+	}
+
+	var TypeArray = position.array.length > 65535 ? Uint32Array : Uint16Array;
+
+	this.addAttribute( 'index', new THREE.BufferAttribute( new TypeArray( indices ), 1 ) );
+
+};
+
+THREE.WireframeBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
+THREE.WireframeBufferGeometry.prototype.constructor = THREE.WireframeBufferGeometry;

+ 21 - 9
src/renderers/webgl/WebGLGeometries.js

@@ -45,17 +45,11 @@ THREE.WebGLGeometries = function ( gl, properties, info ) {
 		var geometry = event.target;
 		var buffergeometry = geometries[ geometry.id ];
 
-		for ( var name in buffergeometry.attributes ) {
+		deleteAttributes( buffergeometry.attributes );
 
-			var attribute = buffergeometry.attributes[ name ];
-			var buffer = getAttributeBuffer( attribute );
-
-			if ( buffer !== undefined ) {
+		if ( buffergeometry._wireframe !== undefined ) {
 
-				gl.deleteBuffer( buffer );
-				removeAttributeBuffer( attribute );
-
-			}
+			deleteAttributes( buffergeometry._wireframe.attributes );
 
 		}
 
@@ -79,6 +73,24 @@ THREE.WebGLGeometries = function ( gl, properties, info ) {
 
 	}
 
+	function deleteAttributes( attributes ) {
+
+		for ( var name in attributes ) {
+
+			var attribute = attributes[ name ];
+			var buffer = getAttributeBuffer( attribute );
+
+			if ( buffer !== undefined ) {
+
+				gl.deleteBuffer( buffer );
+				removeAttributeBuffer( attribute );
+
+			}
+
+		}
+
+	}
+
 	function removeAttributeBuffer( attribute ) {
 
 		if ( attribute instanceof THREE.InterleavedBufferAttribute ) {

+ 12 - 0
src/renderers/webgl/WebGLObjects.js

@@ -82,6 +82,18 @@ THREE.WebGLObjects = function ( gl, properties, info ) {
 
 		var geometry = geometries.get( object );
 
+		if ( object.material.wireframe === true ) {
+
+			if ( geometry._wireframe === undefined ) {
+
+				geometry._wireframe = new THREE.WireframeBufferGeometry( geometry );
+
+			}
+
+			geometry = geometry._wireframe;
+
+		}
+
 		if ( object.geometry instanceof THREE.Geometry ) {
 
 			geometry.updateFromObject( object );

+ 1 - 0
utils/build/includes/extras.json

@@ -48,6 +48,7 @@
 	"src/extras/geometries/OctahedronGeometry.js",
 	"src/extras/geometries/TetrahedronGeometry.js",
 	"src/extras/geometries/ParametricGeometry.js",
+	"src/extras/geometries/WireframeBufferGeometry.js",
 	"src/extras/geometries/WireframeGeometry.js",
 	"src/extras/helpers/AxisHelper.js",
 	"src/extras/helpers/ArrowHelper.js",