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

Simplified Wireframe Index Buffer code. Also fixed MeshFaceMaterial.material.wireframe.

Mr.doob пре 10 година
родитељ
комит
55ecba7ff7

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

@@ -1,67 +0,0 @@
-/**
- * @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;
-
-			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;

+ 6 - 0
src/renderers/WebGLRenderer.js

@@ -838,6 +838,12 @@ THREE.WebGLRenderer = function ( parameters ) {
 		var index = geometry.attributes.index;
 		var position = geometry.attributes.position;
 
+		if ( material.wireframe === true ) {
+
+			index = geometry.attributes.wireframe;
+
+		}
+
 		var groups = geometry.drawcalls;
 
 		var renderer;

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

@@ -18,9 +18,11 @@ THREE.WebGLGeometries = function ( gl, properties, info ) {
 
 		geometry.addEventListener( 'dispose', onGeometryDispose );
 
+		var buffergeometry;
+
 		if ( geometry instanceof THREE.BufferGeometry ) {
 
-			geometries[ geometry.id ] = geometry;
+			buffergeometry = geometry;
 
 		} else if ( geometry instanceof THREE.Geometry ) {
 
@@ -30,29 +32,80 @@ THREE.WebGLGeometries = function ( gl, properties, info ) {
 
 			}
 
-			geometries[ geometry.id ] = geometry._bufferGeometry;
+			buffergeometry = geometry._bufferGeometry;
+
+		}
+
+		if ( object instanceof THREE.Mesh ) {
+
+			buffergeometry.addAttribute( 'wireframe', createWireframeIndexBuffer( buffergeometry ) );
 
 		}
 
+		geometries[ geometry.id ] = buffergeometry;
+
 		info.memory.geometries ++;
 
-		return geometries[ geometry.id ];
+		return buffergeometry;
 
 	};
 
-	function onGeometryDispose( event ) {
+	function createWireframeIndexBuffer( geometry ) {
 
-		var geometry = event.target;
-		var buffergeometry = geometries[ geometry.id ];
+		var attributes = geometry.attributes;
 
-		deleteAttributes( buffergeometry.attributes );
+		// create wireframe indices
 
-		if ( buffergeometry._wireframe !== undefined ) {
+		var indices = [];
 
-			deleteAttributes( buffergeometry._wireframe.attributes );
+		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;
+
+				indices.push( a, b, b, c, c, a );
+
+			}
 
 		}
 
+		var TypeArray = position.array.length > 65535 ? Uint32Array : Uint16Array;
+
+		return new THREE.BufferAttribute( new TypeArray( indices ), 1 );
+
+	}
+
+	function onGeometryDispose( event ) {
+
+		var geometry = event.target;
+		var buffergeometry = geometries[ geometry.id ];
+
+		deleteAttributes( buffergeometry.attributes );
+
 		geometry.removeEventListener( 'dispose', onGeometryDispose );
 
 		delete geometries[ geometry.id ];

+ 11 - 13
src/renderers/webgl/WebGLObjects.js

@@ -82,18 +82,6 @@ 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 );
@@ -130,7 +118,17 @@ THREE.WebGLObjects = function ( gl, properties, info ) {
 
 	function updateAttribute( attribute, name ) {
 
-		var bufferType = ( name === 'index' ) ? gl.ELEMENT_ARRAY_BUFFER : gl.ARRAY_BUFFER;
+		var bufferType;
+
+		if ( name === 'index' || name === 'wireframe' ) {
+
+			bufferType = gl.ELEMENT_ARRAY_BUFFER;
+
+		} else {
+
+			bufferType = gl.ARRAY_BUFFER;
+
+		}
 
 		var data = ( attribute instanceof THREE.InterleavedBufferAttribute ) ? attribute.data : attribute;
 

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

@@ -48,7 +48,6 @@
 	"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",