2
0
Эх сурвалжийг харах

SimplifyModifier: Move to BufferGeometry.

Mugen87 4 жил өмнө
parent
commit
a68cb2bf70

+ 57 - 22
examples/js/modifiers/SimplifyModifier.js

@@ -6,7 +6,15 @@
  *    - http://www.melax.com/polychop/
  */
 
-THREE.SimplifyModifier = function () {};
+THREE.SimplifyModifier = function () {
+
+	if ( THREE.BufferGeometryUtils === undefined ) {
+
+		throw 'THREE.SimplifyModifier relies on THREE.BufferGeometryUtils';
+
+	}
+
+};
 
 ( function () {
 
@@ -379,54 +387,81 @@ THREE.SimplifyModifier = function () {};
 
 	THREE.SimplifyModifier.prototype.modify = function ( geometry, count ) {
 
-		if ( geometry.isBufferGeometry ) {
+		if ( geometry.isGeometry === true ) {
 
-			geometry = new THREE.Geometry().fromBufferGeometry( geometry );
+			console.error( 'THREE.EdgeSplitModifier no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );
+			return;
 
 		}
 
-		geometry.mergeVertices();
+		geometry = geometry.clone();
+		var attributes = geometry.attributes;
 
-		var oldVertices = geometry.vertices; // Three Position
-		var oldFaces = geometry.faces; // Three Face
+		// this modifier can only process indexed and non-indexed geomtries with a position attribute
 
-		// conversion
-		var vertices = [];
-		var faces = [];
+		for ( var name in attributes ) {
+
+			if ( name !== 'position' ) geometry.deleteAttribute( name );
+
+		}
 
-		var i, il;
+		geometry = THREE.BufferGeometryUtils.mergeVertices( geometry );
 
 		//
 		// put data of original geometry in different data structures
 		//
 
+		var vertices = [];
+		var faces = [];
+
 		// add vertices
 
-		for ( i = 0, il = oldVertices.length; i < il; i ++ ) {
+		var positionAttribute = geometry.getAttribute( 'position' );
 
-			var vertex = new Vertex( oldVertices[ i ], i );
+		for ( var i = 0; i < positionAttribute.count; i ++ ) {
+
+			var v = new THREE.Vector3().fromBufferAttribute( positionAttribute, i );
+
+			var vertex = new Vertex( v, i );
 			vertices.push( vertex );
 
 		}
 
 		// add faces
 
-		for ( i = 0, il = oldFaces.length; i < il; i ++ ) {
+		var index = geometry.getIndex();
+
+		if ( index !== null ) {
+
+			for ( var i = 0; i < index.count; i += 3 ) {
 
-			var face = oldFaces[ i ];
+				var a = index.getX( i );
+				var b = index.getX( i + 1 );
+				var c = index.getX( i + 2 );
+
+				var triangle = new Triangle( vertices[ a ], vertices[ b ], vertices[ c ], a, b, c );
+				faces.push( triangle );
+
+			}
 
-			var a = face.a;
-			var b = face.b;
-			var c = face.c;
+		} else {
 
-			var triangle = new Triangle( vertices[ a ], vertices[ b ], vertices[ c ], a, b, c );
-			faces.push( triangle );
+			for ( var i = 0; i < positionAttribute.count; i += 3 ) {
+
+				var a = i;
+				var b = i + 1;
+				var c = i + 2;
+
+				var triangle = new Triangle( vertices[ a ], vertices[ b ], vertices[ c ], a, b, c );
+				faces.push( triangle );
+
+			}
 
 		}
 
 		// compute all edge collapse costs
 
-		for ( i = 0, il = vertices.length; i < il; i ++ ) {
+		for ( var i = 0, il = vertices.length; i < il; i ++ ) {
 
 			computeEdgeCostAtVertex( vertices[ i ] );
 
@@ -459,7 +494,7 @@ THREE.SimplifyModifier = function () {};
 
 		//
 
-		for ( i = 0; i < vertices.length; i ++ ) {
+		for ( var i = 0; i < vertices.length; i ++ ) {
 
 			var vertex = vertices[ i ].position;
 			position.push( vertex.x, vertex.y, vertex.z );
@@ -468,7 +503,7 @@ THREE.SimplifyModifier = function () {};
 
 		//
 
-		for ( i = 0; i < faces.length; i ++ ) {
+		for ( var i = 0; i < faces.length; i ++ ) {
 
 			var face = faces[ i ];
 

+ 54 - 15
examples/jsm/modifiers/SimplifyModifier.js

@@ -4,6 +4,7 @@ import {
 	Geometry,
 	Vector3
 } from '../../../build/three.module.js';
+import { BufferGeometryUtils } from '../utils/BufferGeometryUtils.js';
 
 /**
  *	Simplification Geometry Modifier
@@ -13,7 +14,15 @@ import {
  *    - http://www.melax.com/polychop/
  */
 
-var SimplifyModifier = function () {};
+var SimplifyModifier = function () {
+
+	if ( BufferGeometryUtils === undefined ) {
+
+		throw 'THREE.SimplifyModifier relies on BufferGeometryUtils';
+
+	}
+
+};
 
 ( function () {
 
@@ -386,16 +395,25 @@ var SimplifyModifier = function () {};
 
 	SimplifyModifier.prototype.modify = function ( geometry, count ) {
 
-		if ( geometry.isBufferGeometry ) {
+		if ( geometry.isGeometry === true ) {
 
-			geometry = new Geometry().fromBufferGeometry( geometry );
+			console.error( 'THREE.EdgeSplitModifier no longer supports Geometry. Use BufferGeometry instead.' );
+			return;
 
 		}
 
-		geometry.mergeVertices();
+		geometry = geometry.clone();
+		var attributes = geometry.attributes;
+
+		// this modifier can only process indexed and non-indexed geomtries with a position attribute
+
+		for ( var name in attributes ) {
+
+			if ( name !== 'position' ) geometry.deleteAttribute( name );
+
+		}
 
-		var oldVertices = geometry.vertices; // Three Position
-		var oldFaces = geometry.faces; // Three Face
+		geometry = BufferGeometryUtils.mergeVertices( geometry );
 
 		// conversion
 		var vertices = [];
@@ -409,25 +427,46 @@ var SimplifyModifier = function () {};
 
 		// add vertices
 
-		for ( i = 0, il = oldVertices.length; i < il; i ++ ) {
+		var positionAttribute = geometry.getAttribute( 'position' );
 
-			var vertex = new Vertex( oldVertices[ i ], i );
+		for ( i = 0; i < positionAttribute.count; i ++ ) {
+
+			var v = new Vector3().fromBufferAttribute( positionAttribute, i );
+
+			var vertex = new Vertex( v, i );
 			vertices.push( vertex );
 
 		}
 
 		// add faces
 
-		for ( i = 0, il = oldFaces.length; i < il; i ++ ) {
+		var index = geometry.getIndex();
+
+		if ( index !== null ) {
 
-			var face = oldFaces[ i ];
+			for ( i = 0; i < index.count; i += 3 ) {
 
-			var a = face.a;
-			var b = face.b;
-			var c = face.c;
+				var a = index.getX( i );
+				var b = index.getX( i + 1 );
+				var c = index.getX( i + 2 );
+
+				var triangle = new Triangle( vertices[ a ], vertices[ b ], vertices[ c ], a, b, c );
+				faces.push( triangle );
+
+			}
 
-			var triangle = new Triangle( vertices[ a ], vertices[ b ], vertices[ c ], a, b, c );
-			faces.push( triangle );
+		} else {
+
+			for ( i = 0; i < positionAttribute.count; i += 3 ) {
+
+				var a = i;
+				var b = i + 1;
+				var c = i + 2;
+
+				var triangle = new Triangle( vertices[ a ], vertices[ b ], vertices[ c ], a, b, c );
+				faces.push( triangle );
+
+			}
 
 		}
 

+ 1 - 1
utils/modularize.js

@@ -119,7 +119,7 @@ var files = [
 	{ path: 'misc/VolumeSlice.js', dependencies: [], ignoreList: [] },
 
 	{ path: 'modifiers/EdgeSplitModifier.js', dependencies: [ { name: 'BufferGeometryUtils', path: 'utils/BufferGeometryUtils.js' } ], ignoreList: [ 'Geometry' ] },
-	{ path: 'modifiers/SimplifyModifier.js', dependencies: [], ignoreList: [] },
+	{ path: 'modifiers/SimplifyModifier.js', dependencies: [ { name: 'BufferGeometryUtils', path: 'utils/BufferGeometryUtils.js' } ], ignoreList: [] },
 	{ path: 'modifiers/SubdivisionModifier.js', dependencies: [], ignoreList: [] },
 	{ path: 'modifiers/TessellateModifier.js', dependencies: [], ignoreList: [] },