Browse Source

Rename function to 'mergeVertices', create new BufferAttribute objects, make it work with interleavedAttributes

Garrett Johnson 7 years ago
parent
commit
b9951cc54f
1 changed files with 26 additions and 28 deletions
  1. 26 28
      src/core/BufferGeometry.js

+ 26 - 28
src/core/BufferGeometry.js

@@ -915,7 +915,7 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 
 	},
 	},
 
 
-	optimizeTriangleIndices: function ( precision = 3 ) {
+	mergeVertices: function ( precision = 4 ) {
 
 
 		// Generate an index buffer if the geometry doesn't have one, or optimize it
 		// Generate an index buffer if the geometry doesn't have one, or optimize it
 		// if it's already available.
 		// if it's already available.
@@ -931,6 +931,7 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 		var attributeNames = Object.keys( this.attributes );
 		var attributeNames = Object.keys( this.attributes );
 		var attrArrays = {};
 		var attrArrays = {};
 		var newIndices = [];
 		var newIndices = [];
+		var getters = [ 'getX', 'getY', 'getZ', 'getW' ];
 
 
 		var precisionMultiplier = Math.pow( 10, precision + 1 );
 		var precisionMultiplier = Math.pow( 10, precision + 1 );
 		for ( var i = 0; i < vertexCount; i ++ ) {
 		for ( var i = 0; i < vertexCount; i ++ ) {
@@ -941,14 +942,12 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 
 				var name = attributeNames[ j ];
 				var name = attributeNames[ j ];
 				var attribute = this.getAttribute( name );
 				var attribute = this.getAttribute( name );
-				var size = attribute.itemSize;
-				var array = attribute.array;
+				var itemSize = attribute.itemSize;
 
 
-				for ( var k = 0; k < size; k ++ ) {
+				for ( var k = 0; k < itemSize; k ++ ) {
 
 
 					// double tilde truncates the decimal value
 					// double tilde truncates the decimal value
-					var val = array[ i * size + k ];
-					hash += `${ ~ ~ ( val * precisionMultiplier ) / precisionMultiplier },`;
+					hash += `${ ~ ~ ( attribute[ getters[ k ] ]( i ) * precisionMultiplier ) },`;
 
 
 				}
 				}
 
 
@@ -967,14 +966,13 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 
 					var name = attributeNames[ j ];
 					var name = attributeNames[ j ];
 					var attribute = this.getAttribute( name );
 					var attribute = this.getAttribute( name );
-					var array = attribute.array;
 					var itemSize = attribute.itemSize;
 					var itemSize = attribute.itemSize;
 
 
 					attrArrays[ name ] = attrArrays[ name ] || [];
 					attrArrays[ name ] = attrArrays[ name ] || [];
 					var newarray = attrArrays[ name ];
 					var newarray = attrArrays[ name ];
 					for ( var k = 0; k < itemSize; k ++ ) {
 					for ( var k = 0; k < itemSize; k ++ ) {
 
 
-						newarray.push( array[ i * itemSize + k ] );
+						newarray.push( attribute[ getters[ k ] ]( i ) );
 
 
 					}
 					}
 
 
@@ -993,11 +991,22 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 		for ( var i = 0, l = attributeNames.length; i < l; i ++ ) {
 		for ( var i = 0, l = attributeNames.length; i < l; i ++ ) {
 
 
 			var name = attributeNames[ i ];
 			var name = attributeNames[ i ];
-			var attribute = this.getAttribute( name );
+			var oldAttribute = this.getAttribute( name );
+			var attribute;
+
 			var buffer = new attribute.array.constructor( attrArrays[ name ] );
 			var buffer = new attribute.array.constructor( attrArrays[ name ] );
+			if ( oldAttribute.isInterleavedBufferAttribute ) {
+
+				attribute = new THREE.BufferAttribute( buffer, oldAttribute.itemSize, oldAttribute.itemSize );
+
+			} else {
+
+				attribute = this.getAttribute( name ).clone();
+				attribute.setArray( buffer );
+
+			}
 
 
-			attribute.setArray( buffer );
-			attribute.needsUpdate = true;
+			this.addAttribute( name, attribute );
 
 
 		}
 		}
 
 
@@ -1007,32 +1016,21 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 		if ( newIndices.length >= Math.pow( 2, 16 ) ) cons = Uint32Array;
 		if ( newIndices.length >= Math.pow( 2, 16 ) ) cons = Uint32Array;
 
 
 		var newIndexBuffer = new cons( newIndices );
 		var newIndexBuffer = new cons( newIndices );
+		var newIndices = null;
 		if ( indices === null ) {
 		if ( indices === null ) {
 
 
-			indices = new THREE.BufferAttribute( newIndexBuffer, 1 );
-			this.setIndex( indices );
+			newIndices = new THREE.BufferAttribute( newIndexBuffer, 1 );
 
 
 		} else {
 		} else {
 
 
-			indices.setArray( newIndexBuffer );
-			indices.needsUpdate = true;
+			newIndices = this.getIndex().clone();
+			newIndices.setArray( newIndexBuffer );
 
 
 		}
 		}
 
 
-	},
-
-	getMemoryUsage: function () {
-
-		// Return the estimated memory used by this geometry
-		var mem = 0;
-		for ( var name in this.attributes ) {
-
-			mem += this.attributes[ name ].array.byteLength;
+		this.setIndex( newIndices );
 
 
-		}
-
-		mem += this.index ? this.index.array.byteLength : 0;
-		return mem;
+		return this;
 
 
 	},
 	},