123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- /**
- * @author spite / http://www.clicktorelease.com/
- * @author mrdoob / http://mrdoob.com/
- */
- THREE.BufferGeometryUtils = {
- fromGeometry: function geometryToBufferGeometry( geometry, settings ) {
- if ( geometry instanceof THREE.BufferGeometry ) {
- return geometry;
- }
- settings = settings || { 'vertexColors': THREE.NoColors };
- var vertices = geometry.vertices;
- var faces = geometry.faces;
- var faceVertexUvs = geometry.faceVertexUvs;
- var vertexColors = settings.vertexColors;
- var hasFaceVertexUv = faceVertexUvs[ 0 ].length > 0;
- var hasFaceVertexNormals = faces[ 0 ].vertexNormals.length == 3;
- var bufferGeometry = new THREE.BufferGeometry();
- bufferGeometry.attributes = {
- position: {
- itemSize: 3,
- array: new Float32Array( faces.length * 3 * 3 )
- },
- normal: {
- itemSize: 3,
- array: new Float32Array( faces.length * 3 * 3 )
- }
- }
- var positions = bufferGeometry.attributes.position.array;
- var normals = bufferGeometry.attributes.normal.array;
- if ( vertexColors !== THREE.NoColors ) {
- bufferGeometry.attributes.color = {
- itemSize: 3,
- array: new Float32Array( faces.length * 3 * 3 )
- };
- var colors = bufferGeometry.attributes.color.array;
- }
- if ( hasFaceVertexUv === true ) {
- bufferGeometry.attributes.uv = {
- itemSize: 2,
- array: new Float32Array( faces.length * 3 * 2 )
- };
- var uvs = bufferGeometry.attributes.uv.array;
- }
- for ( var i = 0, i2 = 0, i3 = 0; i < faces.length; i ++, i2 += 6, i3 += 9 ) {
- 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;
- if ( hasFaceVertexNormals === true ) {
- 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;
- } else {
- var n = face.normal;
- normals[ i3 ] = n.x;
- normals[ i3 + 1 ] = n.y;
- normals[ i3 + 2 ] = n.z;
- normals[ i3 + 3 ] = n.x;
- normals[ i3 + 4 ] = n.y;
- normals[ i3 + 5 ] = n.z;
- normals[ i3 + 6 ] = n.x;
- normals[ i3 + 7 ] = n.y;
- normals[ i3 + 8 ] = n.z;
- }
- if ( vertexColors === THREE.FaceColors ) {
- var fc = face.color;
- colors[ i3 ] = fc.r;
- colors[ i3 + 1 ] = fc.g;
- colors[ i3 + 2 ] = fc.b;
- colors[ i3 + 3 ] = fc.r;
- colors[ i3 + 4 ] = fc.g;
- colors[ i3 + 5 ] = fc.b;
- colors[ i3 + 6 ] = fc.r;
- colors[ i3 + 7 ] = fc.g;
- colors[ i3 + 8 ] = fc.b;
- } else if ( vertexColors === THREE.VertexColors ) {
- var vca = face.vertexColors[ 0 ];
- var vcb = face.vertexColors[ 1 ];
- var vcc = face.vertexColors[ 2 ];
- colors[ i3 ] = vca.r;
- colors[ i3 + 1 ] = vca.g;
- colors[ i3 + 2 ] = vca.b;
- colors[ i3 + 3 ] = vcb.r;
- colors[ i3 + 4 ] = vcb.g;
- colors[ i3 + 5 ] = vcb.b;
- colors[ i3 + 6 ] = vcc.r;
- colors[ i3 + 7 ] = vcc.g;
- colors[ i3 + 8 ] = vcc.b;
- }
- 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;
- }
- }
- bufferGeometry.computeBoundingSphere();
- return bufferGeometry;
- }
- }
|