PageSourceSearch

https://techgeniusinstitute.netlify.app/js/OBJLoader.js

js techgeniusinstitute.netlify.app collected 2026-10-03 11:29:40 UTC 9,993 bytes, 431 lines download raw bytes

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.