瀏覽代碼

Added util for converting Geometry to BufferGeometry. Thx @spite.

Mr.doob 12 年之前
父節點
當前提交
18863f61bd
共有 1 個文件被更改,包括 175 次插入0 次删除
  1. 175 0
      examples/js/BufferGeometryUtils.js

+ 175 - 0
examples/js/BufferGeometryUtils.js

@@ -0,0 +1,175 @@
+/**
+ * @author spite / http://www.clicktorelease.com/
+ * @author mrdoob / http://mrdoob.com/
+ */
+
+THREE.BufferGeometryUtils = {
+
+	fromGeometry: function geometryToBufferGeometry( geometry ) {
+
+		var vertices = geometry.vertices;
+		var faces = geometry.faces;
+		var faceVertexUvs = geometry.faceVertexUvs;
+		var hasFaceVertexUv = faceVertexUvs[ 0 ].length > 0;
+
+		var triangles = 0;
+
+		for ( var i = 0; i < faces.length; i ++ ) {
+
+			triangles += faces[ i ] instanceof THREE.Face3 ? 1 : 2;
+
+		}
+
+		console.log( faces.length, triangles );
+
+		var bufferGeometry = new THREE.BufferGeometry();
+
+		bufferGeometry.attributes = {
+
+			position: {
+				itemSize: 3,
+				array: new Float32Array( triangles * 3 * 3 )
+			},
+			normal: {
+				itemSize: 3,
+				array: new Float32Array( triangles * 3 * 3 )
+			}
+			/*
+			color: {
+				itemSize: 3,
+				array: new Float32Array( triangles * 3 * 3 )
+			}*/
+
+		}
+
+		if ( hasFaceVertexUv === true ) {
+
+			bufferGeometry.attributes.uv = {
+				itemSize: 2,
+				array: new Float32Array( triangles * 3 * 2 )
+			};
+
+			var uvs = bufferGeometry.attributes.uv.array;
+
+		}
+
+		var positions = bufferGeometry.attributes.position.array;
+		var normals = bufferGeometry.attributes.normal.array;
+		// var colors = bufferGeometry.attributes.color.array;
+
+		var i2 = 0, i3 = 0;
+
+		for ( var i = 0; i < faces.length; i ++ ) {
+
+			var face = faces[ i ];
+
+			var a = vertices[ face.a ];
+			var b = vertices[ face.b ];
+			var c = vertices[ face.c ];
+
+			positions[ i3     ] = a.x;
+			positions[ i3 + 1 ] = a.y;
+			positions[ i3 + 2 ] = a.z;
+			
+			positions[ i3 + 3 ] = b.x;
+			positions[ i3 + 4 ] = b.y;
+			positions[ i3 + 5 ] = b.z;
+			
+			positions[ i3 + 6 ] = c.x;
+			positions[ i3 + 7 ] = c.y;
+			positions[ i3 + 8 ] = c.z;
+
+			var na = face.vertexNormals[ 0 ];
+			var nb = face.vertexNormals[ 1 ];
+			var nc = face.vertexNormals[ 2 ];
+
+			normals[ i3     ] = na.x;
+			normals[ i3 + 1 ] = na.y;
+			normals[ i3 + 2 ] = na.z;
+
+			normals[ i3 + 3 ] = nb.x;
+			normals[ i3 + 4 ] = nb.y;
+			normals[ i3 + 5 ] = nb.z;
+
+			normals[ i3 + 6 ] = nc.x;
+			normals[ i3 + 7 ] = nc.y;
+			normals[ i3 + 8 ] = nc.z;
+
+			if ( hasFaceVertexUv === true ) {
+
+				var uva = faceVertexUvs[ 0 ][ i ][ 0 ];
+				var uvb = faceVertexUvs[ 0 ][ i ][ 1 ];
+				var uvc = faceVertexUvs[ 0 ][ i ][ 2 ];
+
+				uvs[ i2     ] = uva.x;
+				uvs[ i2 + 1 ] = uva.y;
+			
+				uvs[ i2 + 2 ] = uvb.x;
+				uvs[ i2 + 3 ] = uvb.y;
+			
+				uvs[ i2 + 4 ] = uvc.x;
+				uvs[ i2 + 5 ] = uvc.y;
+
+			}
+
+			i3 += 9;
+			i2 += 6;
+
+			if ( face instanceof THREE.Face4 ) {
+
+				var d = vertices[ face.d ];
+				var nd = face.vertexNormals[ 3 ];
+
+				positions[ i3     ] = a.x;
+				positions[ i3 + 1 ] = a.y;
+				positions[ i3 + 2 ] = a.z;
+				
+				positions[ i3 + 3 ] = c.x;
+				positions[ i3 + 4 ] = c.y;
+				positions[ i3 + 5 ] = c.z;
+				
+				positions[ i3 + 6 ] = d.x;
+				positions[ i3 + 7 ] = d.y;
+				positions[ i3 + 8 ] = d.z;
+
+				normals[ i3     ] = na.x;
+				normals[ i3 + 1 ] = na.y;
+				normals[ i3 + 2 ] = na.z;
+
+				normals[ i3 + 3 ] = nc.x;
+				normals[ i3 + 4 ] = nc.y;
+				normals[ i3 + 5 ] = nc.z;
+
+				normals[ i3 + 6 ] = nd.x;
+				normals[ i3 + 7 ] = nd.y;
+				normals[ i3 + 8 ] = nd.z;
+
+				if ( hasFaceVertexUv === true ) {
+
+					var uvd = faceVertexUvs[ 0 ][ i ][ 3 ];
+
+					uvs[ i2     ] = uva.x;
+					uvs[ i2 + 1 ] = uva.y;
+				
+					uvs[ i2 + 2 ] = uvc.x;
+					uvs[ i2 + 3 ] = uvc.y;
+				
+					uvs[ i2 + 4 ] = uvd.x;
+					uvs[ i2 + 5 ] = uvd.y;
+								
+				}
+
+				i3 += 9;
+				i2 += 6;
+			
+			}
+
+		}
+
+		bufferGeometry.computeBoundingSphere();
+
+		return bufferGeometry;
+
+	}
+
+}