1/** 2 * @author mrdoob / http://mrdoob.com/ 3 */ 4 5 THREE.OBJLoader = function ( manager ) { 6 7 this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; 8 9 }; 10 11 THREE.OBJLoader.prototype = { 12 13 constructor: THREE.OBJLoader, 14 15 load: function ( url, onLoad, onProgress, onError ) { 16 17 var scope = this; 18 19 var loader = new THREE.XHRLoader( scope.manager ); 20 loader.setCrossOrigin( this.crossOrigin ); 21 loader.load( url, function ( text ) { 22 23 onLoad( scope.parse( text ) ); 24 25 } ); 26 27 }, 28 29 parse: function ( text ) { 30 31 function vector( x, y, z ) { 32 33 return new THREE.Vector3( x, y, z ); 34 35 } 36 37 function uv( u, v ) { 38 39 return new THREE.Vector2( u, v ); 40 41 } 42 43 function face3( a, b, c, normals ) { 44 45 return new THREE.Face3( a, b, c, normals ); 46 47 } 48 49 var object = new THREE.Object3D(); 50 var geometry, material, mesh; 51 52 // create mesh if no objects in text 53 54 if ( /^o /gm.test( text ) === false ) { 55 56 geometry = new THREE.Geometry(); 57 material = new THREE.MeshLambertMaterial(); 58 mesh = new THREE.Mesh( geometry, material ); 59 object.add( mesh ); 60 61 } 62 63 var vertices = []; 64 var verticesCount = 0; 65 var normals = []; 66 var uvs = []; 67 68 // v float float float 69 70 var vertex_pattern = /v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; 71 72 // vn float float float 73 74 var normal_pattern = /vn( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; 75 76 // vt float float 77 78 var uv_pattern = /vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; 79 80 // f vertex vertex vertex ... 81 82 var face_pattern1 = /f( +\d+)( +\d+)( +\d+)( +\d+)?/; 83 84 // f vertex/uv vertex/uv vertex/uv ... 85 86 var face_pattern2 = /f( +(\d+)\/(\d+))( +(\d+)\/(\d+))( +(\d+)\/(\d+))( +(\d+)\/(\d+))?/; 87 88 // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ... 89 90 var face_pattern3 = /f( +(\d+)\/(\d+)\/(\d+))( +(\d+)\/(\d+)\/(\d+))( +(\d+)\/(\d+)\/(\d+))( +(\d+)\/(\d+)\/(\d+))?/; 91 92 // f vertex//normal vertex//normal vertex//normal ... 93 94 var face_pattern4 = /f( +(\d+)\/\/(\d+))( +(\d+)\/\/(\d+))( +(\d+)\/\/(\d+))( +(\d+)\/\/(\d+))?/ 95 96 // 97 98 var lines = text.split( '\n' ); 99 100 for ( var i = 0; i < lines.length; i ++ ) { 101 102 var line = lines[ i ]; 103 line = line.trim(); 104 105 var result; 106 107 if ( line.length === 0 || line.charAt( 0 ) === '#' ) { 108 109 continue; 110 111 } else if ( ( result = vertex_pattern.exec( line ) ) !== null ) { 112 113 // ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"] 114 115 vertices.push( vector( 116 parseFloat( result[ 1 ] ), 117 parseFloat( result[ 2 ] ), 118 parseFloat( result[ 3 ] ) 119 ) ); 120 121 } else if ( ( result = normal_pattern.exec( line ) ) !== null ) { 122 123 // ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"] 124 125 normals.push( vector( 126 parseFloat( result[ 1 ] ), 127 parseFloat( result[ 2 ] ), 128 parseFloat( result[ 3 ] ) 129 ) ); 130 131 } else if ( ( result = uv_pattern.exec( line ) ) !== null ) { 132 133 // ["vt 0.1 0.2", "0.1", "0.2"] 134 135 uvs.push( uv( 136 parseFloat( result[ 1 ] ), 137 parseFloat( result[ 2 ] ) 138 ) ); 139 140 } else if ( ( result = face_pattern1.exec( line ) ) !== null ) { 141 142 // ["f 1 2 3", "1", "2", "3", undefined] 143 144 if ( result[ 4 ] === undefined ) { 145 146 geometry.vertices.push( 147 vertices[ parseInt( result[ 1 ] ) - 1 ], 148 vertices[ parseInt( result[ 2 ] ) - 1 ], 149 vertices[ parseInt( result[ 3 ] ) - 1 ] 150 ); 151 152 geometry.faces.push( face3( 153 verticesCount ++, 154 verticesCount ++, 155 verticesCount ++ 156 ) ); 157 158 } else { 159 160 geometry.vertices.push( 161 vertices[ parseInt( result[ 1 ] ) - 1 ], 162 vertices[ parseInt( result[ 2 ] ) - 1 ], 163 vertices[ parseInt( result[ 3 ] ) - 1 ], 164 vertices[ parseInt( result[ 4 ] ) - 1 ] 165 ); 166 167 geometry.faces.push( face3( 168 verticesCount, 169 verticesCount + 1, 170 verticesCount + 3 171 ) ); 172 173 geometry.faces.push( face3( 174 verticesCount + 1, 175 verticesCount + 2, 176 verticesCount + 3 177 ) ); 178 179 verticesCount += 4; 180 181 } 182 183 } else if ( ( result = face_pattern2.exec( line ) ) !== null ) { 184 185 // ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined] 186 187 if ( result[ 10 ] === undefined ) { 188 189 geometry.vertices.push( 190 vertices[ parseInt( result[ 2 ] ) - 1 ], 191 vertices[ parseInt( result[ 5 ] ) - 1 ], 192 vertices[ parseInt( result[ 8 ] ) - 1 ] 193 ); 194 195 geometry.faces.push( face3( 196 verticesCount ++, 197 verticesCount ++, 198 verticesCount ++ 199 ) ); 200 201 geometry.faceVertexUvs[ 0 ].push( [ 202 uvs[ parseInt( result[ 3 ] ) - 1 ], 203 uvs[ parseInt( result[ 6 ] ) - 1 ], 204 uvs[ parseInt( result[ 9 ] ) - 1 ] 205 ] ); 206 207 } else { 208 209 geometry.vertices.push( 210 vertices[ parseInt( result[ 2 ] ) - 1 ], 211 vertices[ parseInt( result[ 5 ] ) - 1 ], 212 vertices[ parseInt( result[ 8 ] ) - 1 ], 213 vertices[ parseInt( result[ 11 ] ) - 1 ] 214 ); 215 216 geometry.faces.push( face3( 217 verticesCount, 218 verticesCount + 1, 219 verticesCount + 3 220 ) ); 221 222 geometry.faceVertexUvs[ 0 ].push( [ 223 uvs[ parseInt( result[ 3 ] ) - 1 ], 224 uvs[ parseInt( result[ 6 ] ) - 1 ], 225 uvs[ parseInt( result[ 12 ] ) - 1 ] 226 ] ); 227 228 geometry.faces.push( face3( 229 verticesCount + 1, 230 verticesCount + 2, 231 verticesCount + 3 232 ) ); 233 234 geometry.faceVertexUvs[ 0 ].push( [ 235 uvs[ parseInt( result[ 6 ] ) - 1 ], 236 uvs[ parseInt( result[ 9 ] ) - 1 ], 237 uvs[ parseInt( result[ 12 ] ) - 1 ] 238 ] ); 239 240 verticesCount += 4; 241 242 } 243 244 } else if ( ( result = face_pattern3.exec( line ) ) !== null ) { 245 246 // ["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] 247 248 if ( result[ 13 ] === undefined ) { 249 250 geometry.vertices.push( 251 vertices[ parseInt( result[ 2 ] ) - 1 ], 252 vertices[ parseInt( result[ 6 ] ) - 1 ], 253 vertices[ parseInt( result[ 10 ] ) - 1 ] 254 ); 255 256 geometry.faces.push( face3( 257 verticesCount ++, 258 verticesCount ++, 259 verticesCount ++, 260 [ 261 normals[ parseInt( result[ 4 ] ) - 1 ], 262 normals[ parseInt( result[ 8 ] ) - 1 ], 263 normals[ parseInt( result[ 12 ] ) - 1 ] 264 ] 265 ) ); 266 267 geometry.faceVertexUvs[ 0 ].push( [ 268 uvs[ parseInt( result[ 3 ] ) - 1 ], 269 uvs[ parseInt( result[ 7 ] ) - 1 ], 270 uvs[ parseInt( result[ 11 ] ) - 1 ] 271 ] ); 272 273 } else { 274 275 geometry.vertices.push( 276 vertices[ parseInt( result[ 2 ] ) - 1 ], 277 vertices[ parseInt( result[ 6 ] ) - 1 ], 278 vertices[ parseInt( result[ 10 ] ) - 1 ], 279 vertices[ parseInt( result[ 14 ] ) - 1 ] 280 ); 281 282 geometry.faces.push( face3( 283 verticesCount, 284 verticesCount + 1, 285 verticesCount + 3, 286 [ 287 normals[ parseInt( result[ 4 ] ) - 1 ], 288 normals[ parseInt( result[ 8 ] ) - 1 ], 289 normals[ parseInt( result[ 16 ] ) - 1 ] 290 ] 291 ) ); 292 293 geometry.faceVertexUvs[ 0 ].push( [ 294 uvs[ parseInt( result[ 3 ] ) - 1 ], 295 uvs[ parseInt( result[ 7 ] ) - 1 ], 296 uvs[ parseInt( result[ 15 ] ) - 1 ] 297 ] ); 298 299 geometry.faces.push( face3( 300 verticesCount + 1, 301 verticesCount + 2, 302 verticesCount + 3, 303 [ 304 normals[ parseInt( result[ 8 ] ) - 1 ], 305 normals[ parseInt( result[ 12 ] ) - 1 ], 306 normals[ parseInt( result[ 16 ] ) - 1 ] 307 ] 308 ) ); 309 310 geometry.faceVertexUvs[ 0 ].push( [ 311 uvs[ parseInt( result[ 7 ] ) - 1 ], 312 uvs[ parseInt( result[ 11 ] ) - 1 ], 313 uvs[ parseInt( result[ 15 ] ) - 1 ] 314 ] ); 315 316 verticesCount += 4; 317 318 } 319 320 } else if ( ( result = face_pattern4.exec( line ) ) !== null ) { 321 322 // ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined] 323 324 if ( result[ 10 ] === undefined ) { 325 326 geometry.vertices.push( 327 vertices[ parseInt( result[ 2 ] ) - 1 ], 328 vertices[ parseInt( result[ 5 ] ) - 1 ], 329 vertices[ parseInt( result[ 8 ] ) - 1 ] 330 ); 331 332 geometry.faces.push( face3( 333 verticesCount ++, 334 verticesCount ++, 335 verticesCount ++, 336 [ 337 normals[ parseInt( result[ 3 ] ) - 1 ], 338 normals[ parseInt( result[ 6 ] ) - 1 ], 339 normals[ parseInt( result[ 9 ] ) - 1 ] 340 ] 341 ) ); 342 343 } else { 344 345 geometry.vertices.push( 346 vertices[ parseInt( result[ 2 ] ) - 1 ], 347 vertices[ parseInt( result[ 5 ] ) - 1 ], 348 vertices[ parseInt( result[ 8 ] ) - 1 ], 349 vertices[ parseInt( result[ 11 ] ) - 1 ] 350 ); 351 352 geometry.faces.push( face3( 353 verticesCount, 354 verticesCount + 1, 355 verticesCount + 3, 356 [ 357 normals[ parseInt( result[ 3 ] ) - 1 ], 358 normals[ parseInt( result[ 6 ] ) - 1 ], 359 normals[ parseInt( result[ 12 ] ) - 1 ] 360 ] 361 ) ); 362 363 geometry.faces.push( face3( 364 verticesCount + 1, 365 verticesCount + 2, 366 verticesCount + 3, 367 [ 368 normals[ parseInt( result[ 6 ] ) - 1 ], 369 normals[ parseInt( result[ 9 ] ) - 1 ], 370 normals[ parseInt( result[ 12 ] ) - 1 ] 371 ] 372 ) ); 373 374 verticesCount += 4; 375 376 } 377 378 } else if ( /^o /.test( line ) ) { 379 380 // object 381 382 geometry = new THREE.Geometry(); 383 material = new THREE.MeshLambertMaterial(); 384 385 mesh = new THREE.Mesh( geometry, material ); 386 mesh.name = line.substring( 2 ).trim(); 387 object.add( mesh ); 388 389 verticesCount = 0; 390 391 } else if ( /^g /.test( line ) ) { 392 393 // group 394 395 } else if ( /^usemtl /.test( line ) ) { 396 397 // material 398 399 material.name = line.substring( 7 ).trim(); 400 401 } else if ( /^mtllib /.test( line ) ) { 402 403 // mtl file 404 405 } else if ( /^s /.test( line ) ) { 406 407 // smooth shading 408 409 } else { 410 411 // console.log( "THREE.OBJLoader: Unhandled line " + line ); 412 413 } 414 415 } 416 417 for ( var i = 0, l = object.children.length; i < l; i ++ ) { 418 419 var geometry = object.children[ i ].geometry; 420 421 geometry.computeCentroids(); 422 geometry.computeFaceNormals(); 423 geometry.computeBoundingSphere(); 424 425 } 426 427 return object; 428 429 } 430 431};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.