Bläddra i källkod

Added vertex reordering to CTMLoader.

This is needed to avoid endless loop when generating offsets (when some triangles have vertices spread across offset boundaries).
alteredq 14 år sedan
förälder
incheckning
0d904dd3a8
1 ändrade filer med 110 tillägg och 10 borttagningar
  1. 110 10
      examples/js/ctm/CTMLoader.js

+ 110 - 10
examples/js/ctm/CTMLoader.js

@@ -131,7 +131,8 @@ THREE.CTMLoader.prototype.createModelBuffers = function ( file, callback ) {
 
 
 		var dynamic = false,
 		var dynamic = false,
 		computeNormals = true,
 		computeNormals = true,
-		normalizeNormals = true;
+		normalizeNormals = true,
+		reorderVertices = true;
 
 
 		scope.materials = [];
 		scope.materials = [];
 
 
@@ -145,6 +146,18 @@ THREE.CTMLoader.prototype.createModelBuffers = function ( file, callback ) {
 
 
 		var vertexUvArray, vertexColorArray;
 		var vertexUvArray, vertexColorArray;
 
 
+		if ( file.body.uvMaps !== undefined && file.body.uvMaps.length > 0 ) {
+
+			vertexUvArray = file.body.uvMaps[ 0 ].uv;
+
+		}
+
+		if ( file.body.attrMaps !== undefined && file.body.attrMaps.length > 0 && file.body.attrMaps[ 0 ].name === "Color" ) {
+
+			vertexColorArray = file.body.attrMaps[ 0 ].attr;
+
+		}
+
 		//console.log( "vertices", vertexPositionArray.length/3 );
 		//console.log( "vertices", vertexPositionArray.length/3 );
 		//console.log( "triangles", vertexIndexArray.length/3 );
 		//console.log( "triangles", vertexIndexArray.length/3 );
 
 
@@ -225,14 +238,105 @@ THREE.CTMLoader.prototype.createModelBuffers = function ( file, callback ) {
 
 
 		}
 		}
 
 
+		// reorder vertices
+		// (needed for buffer splitting, to keep together face vertices)
+
+		if ( reorderVertices ) {
+
+			var newFaces = new Uint32Array( vertexIndexArray.length ),
+				newVertices = new Float32Array( vertexPositionArray.length );
+
+			var newNormals, newUvs, newColors;
+
+			if ( vertexNormalArray ) newNormals = new Float32Array( vertexNormalArray.length );
+			if ( vertexUvArray ) newUvs = new Float32Array( vertexUvArray.length );
+			if ( vertexColorArray ) newColors = new Float32Array( vertexColorArray.length );
+
+			var indexMap = {}, vertexCounter = 0;
+
+			function handleVertex( v ) {
+
+				if ( indexMap[ v ] === undefined ) {
+
+					indexMap[ v ] = vertexCounter;
+
+					var sx = v * 3,
+						sy = v * 3 + 1,
+						sz = v * 3 + 2,
+
+						dx = vertexCounter * 3,
+						dy = vertexCounter * 3 + 1,
+						dz = vertexCounter * 3 + 2;
+
+					newVertices[ dx ] = vertexPositionArray[ sx ];
+					newVertices[ dy ] = vertexPositionArray[ sy ];
+					newVertices[ dz ] = vertexPositionArray[ sz ];
+
+					if ( vertexNormalArray ) {
+
+						newNormals[ dx ] = vertexNormalArray[ sx ];
+						newNormals[ dy ] = vertexNormalArray[ sy ];
+						newNormals[ dz ] = vertexNormalArray[ sz ];
+
+					}
+
+					if ( vertexUvArray ) {
+
+						newUvs[ vertexCounter * 2 ] 	= vertexUvArray[ v * 2 ];
+						newUvs[ vertexCounter * 2 + 1 ] = vertexUvArray[ v * 2 + 1 ];
+
+					}
+
+					if ( vertexColorArray ) {
+
+						newColors[ vertexCounter * 4 ] 	   = vertexNormalArray[ v * 4 ];
+						newColors[ vertexCounter * 4 + 1 ] = vertexNormalArray[ v * 4 + 1 ];
+						newColors[ vertexCounter * 4 + 2 ] = vertexNormalArray[ v * 4 + 2 ];
+						newColors[ vertexCounter * 4 + 3 ] = vertexNormalArray[ v * 4 + 3 ];
+
+					}
+
+					vertexCounter += 1;
+
+				}
+
+			}
+
+			var a, b, c;
+
+			for ( var i = 0; i < vertexIndexArray.length; i += 3 ) {
+
+				a = vertexIndexArray[ i ];
+				b = vertexIndexArray[ i + 1 ];
+				c = vertexIndexArray[ i + 2 ];
+
+				handleVertex( a );
+				handleVertex( b );
+				handleVertex( c );
+
+				newFaces[ i ] 	  = indexMap[ a ];
+				newFaces[ i + 1 ] = indexMap[ b ];
+				newFaces[ i + 2 ] = indexMap[ c ];
+
+			}
+
+			vertexIndexArray = newFaces;
+			vertexPositionArray = newVertices;
+
+			if ( vertexNormalArray ) vertexNormalArray = newNormals;
+			if ( vertexUvArray ) vertexUvArray = newUvs;
+			if ( vertexColorArray ) vertexColorArray = newColors;
+
+		}
+
 		// compute offsets
 		// compute offsets
 
 
 		scope.offsets = [];
 		scope.offsets = [];
 
 
-		var indices = file.body.indices;
+		var indices = vertexIndexArray;
 
 
 		var start = 0,
 		var start = 0,
-			min = file.body.vertices.length,
+			min = vertexPositionArray.length,
 			max = 0,
 			max = 0,
 			minPrev = min;
 			minPrev = min;
 
 
@@ -260,7 +364,7 @@ THREE.CTMLoader.prototype.createModelBuffers = function ( file, callback ) {
 				scope.offsets.push( { start: start, count: i - start, index: minPrev } );
 				scope.offsets.push( { start: start, count: i - start, index: minPrev } );
 
 
 				start = i;
 				start = i;
-				min = file.body.vertices.length;
+				min = vertexPositionArray.length;
 				max = 0;
 				max = 0;
 
 
 			}
 			}
@@ -311,9 +415,7 @@ THREE.CTMLoader.prototype.createModelBuffers = function ( file, callback ) {
 
 
 		// uvs
 		// uvs
 
 
-		if ( file.body.uvMaps !== undefined && file.body.uvMaps.length > 0 ) {
-
-			vertexUvArray = file.body.uvMaps[ 0 ].uv;
+		if ( vertexUvArray !== undefined ) {
 
 
 			// "fix" flipping
 			// "fix" flipping
 
 
@@ -334,9 +436,7 @@ THREE.CTMLoader.prototype.createModelBuffers = function ( file, callback ) {
 
 
 		// colors
 		// colors
 
 
-		if ( file.body.attrMaps !== undefined && file.body.attrMaps.length > 0 && file.body.attrMaps[ 0 ].name === "Color" ) {
-
-			vertexColorArray = file.body.attrMaps[ 0 ].attr;
+		if ( vertexColorArray !== undefined ) {
 
 
 			scope.vertexColorBuffer = gl.createBuffer();
 			scope.vertexColorBuffer = gl.createBuffer();
 			gl.bindBuffer( gl.ARRAY_BUFFER, scope.vertexColorBuffer );
 			gl.bindBuffer( gl.ARRAY_BUFFER, scope.vertexColorBuffer );

粤ICP备19079148号