@@ -64,7 +64,7 @@ THREE.PLYLoader.prototype = {
64
64
function isASCII ( data ) {
65
65
66
66
var header = parseHeader ( bin2str ( data ) ) ;
67
- return header . format === " ascii" ;
67
+ return header . format === ' ascii' ;
68
68
69
69
}
70
70
@@ -86,7 +86,7 @@ THREE.PLYLoader.prototype = {
86
86
function parseHeader ( data ) {
87
87
88
88
var patternHeader = / p l y ( [ \s \S ] * ) e n d _ h e a d e r \s / ;
89
- var headerText = "" ;
89
+ var headerText = '' ;
90
90
var headerLength = 0 ;
91
91
var result = patternHeader . exec ( data ) ;
92
92
@@ -138,28 +138,28 @@ THREE.PLYLoader.prototype = {
138
138
var line = lines [ i ] ;
139
139
line = line . trim ( ) ;
140
140
141
- if ( line === "" ) continue ;
141
+ if ( line === '' ) continue ;
142
142
143
143
lineValues = line . split ( / \s + / ) ;
144
144
lineType = lineValues . shift ( ) ;
145
- line = lineValues . join ( " " ) ;
145
+ line = lineValues . join ( ' ' ) ;
146
146
147
147
switch ( lineType ) {
148
148
149
- case " format" :
149
+ case ' format' :
150
150
151
151
header . format = lineValues [ 0 ] ;
152
152
header . version = lineValues [ 1 ] ;
153
153
154
154
break ;
155
155
156
- case " comment" :
156
+ case ' comment' :
157
157
158
158
header . comments . push ( line ) ;
159
159
160
160
break ;
161
161
162
- case " element" :
162
+ case ' element' :
163
163
164
164
if ( currentElement !== undefined ) {
165
165
@@ -174,7 +174,7 @@ THREE.PLYLoader.prototype = {
174
174
175
175
break ;
176
176
177
- case " property" :
177
+ case ' property' :
178
178
179
179
currentElement . properties . push ( make_ply_element_property ( lineValues , scope . propertyNameMapping ) ) ;
180
180
@@ -183,7 +183,7 @@ THREE.PLYLoader.prototype = {
183
183
184
184
default :
185
185
186
- console . log ( " unhandled" , lineType , lineValues ) ;
186
+ console . log ( ' unhandled' , lineType , lineValues ) ;
187
187
188
188
}
189
189
@@ -224,7 +224,7 @@ THREE.PLYLoader.prototype = {
224
224
225
225
for ( var i = 0 ; i < properties . length ; i ++ ) {
226
226
227
- if ( properties [ i ] . type === " list" ) {
227
+ if ( properties [ i ] . type === ' list' ) {
228
228
229
229
var list = [ ] ;
230
230
var n = parseASCIINumber ( values . shift ( ) , properties [ i ] . countType ) ;
@@ -253,14 +253,20 @@ THREE.PLYLoader.prototype = {
253
253
254
254
// PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)
255
255
256
- var geometry = new THREE . Geometry ( ) ;
256
+ var buffer = {
257
+ indices : [ ] ,
258
+ vertices : [ ] ,
259
+ normals : [ ] ,
260
+ uvs : [ ] ,
261
+ colors : [ ]
262
+ } ;
257
263
258
264
var result ;
259
265
260
266
var header = parseHeader ( data ) ;
261
267
262
268
var patternBody = / e n d _ h e a d e r \s ( [ \s \S ] * ) $ / ;
263
- var body = "" ;
269
+ var body = '' ;
264
270
if ( ( result = patternBody . exec ( data ) ) !== null ) {
265
271
266
272
body = result [ 1 ] ;
@@ -270,13 +276,12 @@ THREE.PLYLoader.prototype = {
270
276
var lines = body . split ( '\n' ) ;
271
277
var currentElement = 0 ;
272
278
var currentElementCount = 0 ;
273
- geometry . useColor = false ;
274
279
275
280
for ( var i = 0 ; i < lines . length ; i ++ ) {
276
281
277
282
var line = lines [ i ] ;
278
283
line = line . trim ( ) ;
279
- if ( line === "" ) {
284
+ if ( line === '' ) {
280
285
281
286
continue ;
282
287
@@ -291,31 +296,42 @@ THREE.PLYLoader.prototype = {
291
296
292
297
var element = parseASCIIElement ( header . elements [ currentElement ] . properties , line ) ;
293
298
294
- handleElement ( geometry , header . elements [ currentElement ] . name , element ) ;
299
+ handleElement ( buffer , header . elements [ currentElement ] . name , element ) ;
295
300
296
301
currentElementCount ++ ;
297
302
298
303
}
299
304
300
- return postProcess ( geometry ) ;
305
+ return postProcess ( buffer ) ;
301
306
302
307
}
303
308
304
- function postProcess ( geometry ) {
309
+ function postProcess ( buffer ) {
305
310
306
- if ( geometry . useColor ) {
311
+ var geometry = new THREE . BufferGeometry ( ) ;
307
312
308
- for ( var i = 0 ; i < geometry . faces . length ; i ++ ) {
313
+ // mandatory buffer data
309
314
310
- geometry . faces [ i ] . vertexColors = [
311
- geometry . colors [ geometry . faces [ i ] . a ] ,
312
- geometry . colors [ geometry . faces [ i ] . b ] ,
313
- geometry . colors [ geometry . faces [ i ] . c ]
314
- ] ;
315
+ geometry . setIndex ( ( buffer . indices . length > 65535 ? THREE . Uint32Attribute : THREE . Uint16Attribute ) ( buffer . indices , 1 ) ) ;
316
+ geometry . addAttribute ( 'position' , THREE . Float32Attribute ( buffer . vertices , 3 ) ) ;
315
317
316
- }
318
+ // optional buffer data
319
+
320
+ if ( buffer . normals . length > 0 ) {
321
+
322
+ geometry . addAttribute ( 'normal' , THREE . Float32Attribute ( buffer . normals , 3 ) ) ;
323
+
324
+ }
325
+
326
+ if ( buffer . uvs . length > 0 ) {
317
327
318
- geometry . elementsNeedUpdate = true ;
328
+ geometry . addAttribute ( 'uv' , THREE . Float32Attribute ( buffer . uvs , 2 ) ) ;
329
+
330
+ }
331
+
332
+ if ( buffer . colors . length > 0 ) {
333
+
334
+ geometry . addAttribute ( 'color' , THREE . Float32Attribute ( buffer . colors , 3 ) ) ;
319
335
320
336
}
321
337
@@ -325,61 +341,42 @@ THREE.PLYLoader.prototype = {
325
341
326
342
}
327
343
328
- function handleElement ( geometry , elementName , element ) {
344
+ function handleElement ( buffer , elementName , element ) {
329
345
330
- if ( elementName === " vertex" ) {
346
+ if ( elementName === ' vertex' ) {
331
347
332
- geometry . vertices . push (
333
- new THREE . Vector3 ( element . x , element . y , element . z )
334
- ) ;
348
+ buffer . vertices . push ( element . x , element . y , element . z ) ;
335
349
336
- if ( 'red' in element && 'green' in element && 'blue' in element ) {
350
+ if ( 'nx' in element && 'ny' in element && 'nz' in element ) {
351
+
352
+ buffer . normals . push ( element . nx , element . ny , element . nz ) ;
337
353
338
- geometry . useColor = true ;
354
+ }
355
+
356
+ if ( 's' in element && 't' in element ) {
339
357
340
- var color = new THREE . Color ( ) ;
341
- color . setRGB ( element . red / 255.0 , element . green / 255.0 , element . blue / 255.0 ) ;
342
- geometry . colors . push ( color ) ;
358
+ buffer . uvs . push ( element . s , element . t ) ;
343
359
344
360
}
345
361
346
- } else if ( elementName === "face" ) {
362
+ if ( 'red' in element && 'green' in element && 'blue' in element ) {
347
363
348
- var vertex_indices = element . vertex_indices ;
349
- var texcoord = element . texcoord ;
364
+ buffer . colors . push ( element . red / 255.0 , element . green / 255.0 , element . blue / 255.0 ) ;
350
365
351
- if ( vertex_indices . length === 3 ) {
366
+ }
352
367
353
- geometry . faces . push (
354
- new THREE . Face3 ( vertex_indices [ 0 ] , vertex_indices [ 1 ] , vertex_indices [ 2 ] )
355
- ) ;
368
+ } else if ( elementName === 'face' ) {
356
369
357
- if ( texcoord ) {
358
- geometry . faceVertexUvs [ 0 ] . push ( [
359
- new THREE . Vector2 ( texcoord [ 0 ] , texcoord [ 1 ] ) ,
360
- new THREE . Vector2 ( texcoord [ 2 ] , texcoord [ 3 ] ) ,
361
- new THREE . Vector2 ( texcoord [ 4 ] , texcoord [ 5 ] )
362
- ] ) ;
363
- }
370
+ var vertex_indices = element . vertex_indices || element . vertex_index ; // issue #9338
371
+
372
+ if ( vertex_indices . length === 3 ) {
373
+
374
+ buffer . indices . push ( vertex_indices [ 0 ] , vertex_indices [ 1 ] , vertex_indices [ 2 ] ) ;
364
375
365
376
} else if ( vertex_indices . length === 4 ) {
366
377
367
- geometry . faces . push (
368
- new THREE . Face3 ( vertex_indices [ 0 ] , vertex_indices [ 1 ] , vertex_indices [ 3 ] ) ,
369
- new THREE . Face3 ( vertex_indices [ 1 ] , vertex_indices [ 2 ] , vertex_indices [ 3 ] )
370
- ) ;
371
-
372
- if ( texcoord ) {
373
- geometry . faceVertexUvs [ 0 ] . push ( [
374
- new THREE . Vector2 ( texcoord [ 0 ] , texcoord [ 1 ] ) ,
375
- new THREE . Vector2 ( texcoord [ 2 ] , texcoord [ 3 ] ) ,
376
- new THREE . Vector2 ( texcoord [ 6 ] , texcoord [ 7 ] )
377
- ] , [
378
- new THREE . Vector2 ( texcoord [ 2 ] , texcoord [ 3 ] ) ,
379
- new THREE . Vector2 ( texcoord [ 4 ] , texcoord [ 5 ] ) ,
380
- new THREE . Vector2 ( texcoord [ 6 ] , texcoord [ 7 ] )
381
- ] ) ;
382
- }
378
+ buffer . indices . push ( vertex_indices [ 0 ] , vertex_indices [ 1 ] , vertex_indices [ 3 ] ) ;
379
+ buffer . indices . push ( vertex_indices [ 1 ] , vertex_indices [ 2 ] , vertex_indices [ 3 ] ) ;
383
380
384
381
}
385
382
@@ -412,7 +409,7 @@ THREE.PLYLoader.prototype = {
412
409
413
410
for ( var i = 0 ; i < properties . length ; i ++ ) {
414
411
415
- if ( properties [ i ] . type === " list" ) {
412
+ if ( properties [ i ] . type === ' list' ) {
416
413
417
414
var list = [ ] ;
418
415
@@ -446,10 +443,16 @@ THREE.PLYLoader.prototype = {
446
443
447
444
function parseBinary ( data ) {
448
445
449
- var geometry = new THREE . Geometry ( ) ;
446
+ var buffer = {
447
+ indices : [ ] ,
448
+ vertices : [ ] ,
449
+ normals : [ ] ,
450
+ uvs : [ ] ,
451
+ colors : [ ]
452
+ } ;
450
453
451
454
var header = parseHeader ( bin2str ( data ) ) ;
452
- var little_endian = ( header . format === " binary_little_endian" ) ;
455
+ var little_endian = ( header . format === ' binary_little_endian' ) ;
453
456
var body = new DataView ( data , header . headerLength ) ;
454
457
var result , loc = 0 ;
455
458
@@ -461,20 +464,18 @@ THREE.PLYLoader.prototype = {
461
464
loc += result [ 1 ] ;
462
465
var element = result [ 0 ] ;
463
466
464
- handleElement ( geometry , header . elements [ currentElement ] . name , element ) ;
467
+ handleElement ( buffer , header . elements [ currentElement ] . name , element ) ;
465
468
466
469
}
467
470
468
471
}
469
472
470
- return postProcess ( geometry ) ;
473
+ return postProcess ( buffer ) ;
471
474
472
475
}
473
476
474
477
//
475
478
476
- console . time ( 'PLYLoader' ) ;
477
-
478
479
var geometry ;
479
480
var scope = this ;
480
481
@@ -488,8 +489,6 @@ THREE.PLYLoader.prototype = {
488
489
489
490
}
490
491
491
- console . timeEnd ( 'PLYLoader' ) ;
492
-
493
492
return geometry ;
494
493
495
494
}
0 commit comments