From 1101c741324f11f0ee36446df230ecf00266b99f Mon Sep 17 00:00:00 2001 From: Thomas FORGIONE Date: Mon, 18 May 2015 11:59:14 +0200 Subject: [PATCH] Old version of OBJLoader so we can keep the vertices merged --- static/js/three/OBJLoader.js | 299 +++++++++++++++-------------------- 1 file changed, 128 insertions(+), 171 deletions(-) diff --git a/static/js/three/OBJLoader.js b/static/js/three/OBJLoader.js index f66badd..d774d64 100644 --- a/static/js/three/OBJLoader.js +++ b/static/js/three/OBJLoader.js @@ -22,156 +22,139 @@ THREE.OBJLoader.prototype = { onLoad( scope.parse( text ) ); - }, onProgress, onError ); + } ); }, parse: function ( text ) { - console.time( 'OBJLoader' ); + function vector( x, y, z ) { - var object, objects = []; - var geometry, material; - - function parseVertexIndex( value ) { - - var index = parseInt( value ); - - return ( index >= 0 ? index - 1 : index + vertices.length / 3 ) * 3; + return new THREE.Vector3( parseFloat( x ), parseFloat( y ), parseFloat( z ) ); } - function parseNormalIndex( value ) { + function uv( u, v ) { - var index = parseInt( value ); - - return ( index >= 0 ? index - 1 : index + normals.length / 3 ) * 3; + return new THREE.Vector2( parseFloat( u ), parseFloat( v ) ); } - function parseUVIndex( value ) { + function face3( a, b, c, normals ) { - var index = parseInt( value ); + return new THREE.Face3( a, b, c, normals ); - return ( index >= 0 ? index - 1 : index + uvs.length / 2 ) * 2; + } + + var object = new THREE.Object3D(); + var geometry, material, mesh; + + function parseVertexIndex( index ) { + + index = parseInt( index ); + + return index >= 0 ? index - 1 : index + vertices.length; } - function addVertex( a, b, c ) { + function parseNormalIndex( index ) { - geometry.vertices.push( - vertices[ a ], vertices[ a + 1 ], vertices[ a + 2 ], - vertices[ b ], vertices[ b + 1 ], vertices[ b + 2 ], - vertices[ c ], vertices[ c + 1 ], vertices[ c + 2 ] - ); + index = parseInt( index ); + + return index >= 0 ? index - 1 : index + normals.length; } - function addNormal( a, b, c ) { + function parseUVIndex( index ) { - geometry.normals.push( - normals[ a ], normals[ a + 1 ], normals[ a + 2 ], - normals[ b ], normals[ b + 1 ], normals[ b + 2 ], - normals[ c ], normals[ c + 1 ], normals[ c + 2 ] - ); + index = parseInt( index ); + + return index >= 0 ? index - 1 : index + uvs.length; } + + function add_face( a, b, c, normals_inds ) { - function addUV( a, b, c ) { + if ( normals_inds === undefined ) { - geometry.uvs.push( - uvs[ a ], uvs[ a + 1 ], - uvs[ b ], uvs[ b + 1 ], - uvs[ c ], uvs[ c + 1 ] - ); - - } - - function addFace( a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd ) { - - var ia = parseVertexIndex( a ); - var ib = parseVertexIndex( b ); - var ic = parseVertexIndex( c ); - var id; - - if ( d === undefined ) { - - addVertex( ia, ib, ic ); + geometry.faces.push( face3( + vertices[ parseVertexIndex( a ) ] - 1, + vertices[ parseVertexIndex( b ) ] - 1, + vertices[ parseVertexIndex( c ) ] - 1 + ) ); } else { - id = parseVertexIndex( d ); - - addVertex( ia, ib, id ); - addVertex( ib, ic, id ); + geometry.faces.push( face3( + vertices[ parseVertexIndex( a ) ] - 1, + vertices[ parseVertexIndex( b ) ] - 1, + vertices[ parseVertexIndex( c ) ] - 1, + [ + normals[ parseNormalIndex( normals_inds[ 0 ] ) ].clone(), + normals[ parseNormalIndex( normals_inds[ 1 ] ) ].clone(), + normals[ parseNormalIndex( normals_inds[ 2 ] ) ].clone() + ] + ) ); } - if ( ua !== undefined ) { + } + + function add_uvs( a, b, c ) { + + geometry.faceVertexUvs[ 0 ].push( [ + uvs[ parseUVIndex( a ) ].clone(), + uvs[ parseUVIndex( b ) ].clone(), + uvs[ parseUVIndex( c ) ].clone() + ] ); - ia = parseUVIndex( ua ); - ib = parseUVIndex( ub ); - ic = parseUVIndex( uc ); + } + + function handle_face_line(faces, uvs, normals_inds) { - if ( d === undefined ) { + if ( faces[ 3 ] === undefined ) { + + add_face( faces[ 0 ], faces[ 1 ], faces[ 2 ], normals_inds ); + + if ( uvs !== undefined && uvs.length > 0 ) { - addUV( ia, ib, ic ); + add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 2 ] ); + + } + + } else { + + if ( normals_inds !== undefined && normals_inds.length > 0 ) { + + add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ], [ normals_inds[ 0 ], normals_inds[ 1 ], normals_inds[ 3 ] ] ); + add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ], [ normals_inds[ 1 ], normals_inds[ 2 ], normals_inds[ 3 ] ] ); } else { - id = parseUVIndex( ud ); + add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ] ); + add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ] ); - addUV( ia, ib, id ); - addUV( ib, ic, id ); + } + + if ( uvs !== undefined && uvs.length > 0 ) { + + add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ); + add_uvs( uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ); } } - - if ( na !== undefined ) { - - ia = parseNormalIndex( na ); - ib = parseNormalIndex( nb ); - ic = parseNormalIndex( nc ); - - if ( d === undefined ) { - - addNormal( ia, ib, ic ); - - } else { - - id = parseNormalIndex( nd ); - - addNormal( ia, ib, id ); - addNormal( ib, ic, id ); - - } - - } - + } // create mesh if no objects in text if ( /^o /gm.test( text ) === false ) { - geometry = { - vertices: [], - normals: [], - uvs: [] - }; - - material = { - name: '' - }; - - object = { - name: '', - geometry: geometry, - material: material - }; - - objects.push( object ); + geometry = new THREE.Geometry(); + material = new THREE.MeshLambertMaterial(); + mesh = new THREE.Mesh( geometry, material ); + object.add( mesh ); } @@ -181,15 +164,15 @@ THREE.OBJLoader.prototype = { // v float float float - var vertex_pattern = /v( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; + var vertex_pattern = /v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; // vn float float float - var normal_pattern = /vn( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; + var normal_pattern = /vn( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; // vt float float - var uv_pattern = /vt( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; + var uv_pattern = /vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; // f vertex vertex vertex ... @@ -203,11 +186,13 @@ THREE.OBJLoader.prototype = { var face_pattern3 = /f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?/; - // f vertex//normal vertex//normal vertex//normal ... + // f vertex//normal vertex//normal vertex//normal ... var face_pattern4 = /f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?/ - // + // fixes + + text = text.replace( /\\\r?\n/g, '' ); // handles line continuations \ var lines = text.split( '\n' ); @@ -226,10 +211,12 @@ THREE.OBJLoader.prototype = { // ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"] - vertices.push( - parseFloat( result[ 1 ] ), - parseFloat( result[ 2 ] ), - parseFloat( result[ 3 ] ) + vertices.push( + geometry.vertices.push( + vector( + result[ 1 ], result[ 2 ], result[ 3 ] + ) + ) ); } else if ( ( result = normal_pattern.exec( line ) ) !== null ) { @@ -237,9 +224,9 @@ THREE.OBJLoader.prototype = { // ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"] normals.push( - parseFloat( result[ 1 ] ), - parseFloat( result[ 2 ] ), - parseFloat( result[ 3 ] ) + vector( + result[ 1 ], result[ 2 ], result[ 3 ] + ) ); } else if ( ( result = uv_pattern.exec( line ) ) !== null ) { @@ -247,66 +234,56 @@ THREE.OBJLoader.prototype = { // ["vt 0.1 0.2", "0.1", "0.2"] uvs.push( - parseFloat( result[ 1 ] ), - parseFloat( result[ 2 ] ) + uv( + result[ 1 ], result[ 2 ] + ) ); } else if ( ( result = face_pattern1.exec( line ) ) !== null ) { // ["f 1 2 3", "1", "2", "3", undefined] - addFace( - result[ 1 ], result[ 2 ], result[ 3 ], result[ 4 ] + handle_face_line( + [ result[ 1 ], result[ 2 ], result[ 3 ], result[ 4 ] ] ); } else if ( ( result = face_pattern2.exec( line ) ) !== null ) { // ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined] - - addFace( - result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ], - result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] + + handle_face_line( + [ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces + [ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //uv ); } else if ( ( result = face_pattern3.exec( line ) ) !== null ) { // ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined] - addFace( - result[ 2 ], result[ 6 ], result[ 10 ], result[ 14 ], - result[ 3 ], result[ 7 ], result[ 11 ], result[ 15 ], - result[ 4 ], result[ 8 ], result[ 12 ], result[ 16 ] + handle_face_line( + [ result[ 2 ], result[ 6 ], result[ 10 ], result[ 14 ] ], //faces + [ result[ 3 ], result[ 7 ], result[ 11 ], result[ 15 ] ], //uv + [ result[ 4 ], result[ 8 ], result[ 12 ], result[ 16 ] ] //normal ); } else if ( ( result = face_pattern4.exec( line ) ) !== null ) { // ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined] - addFace( - result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ], - undefined, undefined, undefined, undefined, - result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] + handle_face_line( + [ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces + [ ], //uv + [ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //normal ); } else if ( /^o /.test( line ) ) { - geometry = { - vertices: [], - normals: [], - uvs: [] - }; + geometry = new THREE.Geometry(); + material = new THREE.MeshLambertMaterial(); - material = { - name: '' - }; - - object = { - name: line.substring( 2 ).trim(), - geometry: geometry, - material: material - }; - - objects.push( object ) + mesh = new THREE.Mesh( geometry, material ); + mesh.name = line.substring( 2 ).trim(); + object.add( mesh ); } else if ( /^g /.test( line ) ) { @@ -334,38 +311,18 @@ THREE.OBJLoader.prototype = { } - var container = new THREE.Object3D(); + var children = object.children; - for ( var i = 0, l = objects.length; i < l; i ++ ) { + for ( var i = 0, l = children.length; i < l; i ++ ) { - object = objects[ i ]; - geometry = object.geometry; + var geometry = children[ i ].geometry; - var buffergeometry = new THREE.BufferGeometry(); - - buffergeometry.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( geometry.vertices ), 3 ) ); - - if ( geometry.normals.length > 0 ) { - buffergeometry.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( geometry.normals ), 3 ) ); - } - - if ( geometry.uvs.length > 0 ) { - buffergeometry.addAttribute( 'uv', new THREE.BufferAttribute( new Float32Array( geometry.uvs ), 2 ) ); - } - - material = new THREE.MeshLambertMaterial(); - material.name = object.material.name; - - var mesh = new THREE.Mesh( buffergeometry, material ); - mesh.name = object.name; - - container.add( mesh ); + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); } - - console.timeEnd( 'OBJLoader' ); - - return container; + + return object; }