@@ -193,7 +193,7 @@ else if (line.startsWith("vt ")) {
193
193
}
194
194
commitCurrentMesh ();
195
195
Logger .info ("OBJ file parsed: {} vertices, {} uvs, {} faces, {} smoothing groups" ,
196
- data .vertexArray .size () / 3 , data .uvArray .size () / 2 , data .faceList .size () / 6 , data .smoothingGroupList .size ());
196
+ data .vertexArray .size () / 3 , data .uvArray .size () / 2 , data .facesList .size () / 6 , data .smoothingGroupList .size ());
197
197
}
198
198
199
199
/**
@@ -258,7 +258,7 @@ private void parseFace(String argText) {
258
258
n2 = data .normalIndex (triplets [i ][2 ]);
259
259
n3 = data .normalIndex (triplets [i + 1 ][2 ]);
260
260
}
261
- data .faceList .addAll (List .of (v1 , uv1 , v2 , uv2 , v3 , uv3 ));
261
+ data .facesList .addAll (List .of (v1 , uv1 , v2 , uv2 , v3 , uv3 ));
262
262
data .faceNormalsList .addAll (List .of (n1 , n2 , n3 ));
263
263
data .smoothingGroupList .add (currentSmoothingGroup );
264
264
}
@@ -331,91 +331,82 @@ private void parseVertexNormal(String argsText) {
331
331
}
332
332
333
333
private void commitCurrentMesh () {
334
- if (facesStart >= data .faceList .size ()) {
334
+ if (facesStart >= data .facesList .size ()) {
335
335
// we're only interested in faces
336
336
smoothingGroupsStart = data .smoothingGroupList .size ();
337
337
return ;
338
338
}
339
339
var vertexMap = new HashMap <Integer , Integer >(data .vertexArray .size () / 2 );
340
340
var uvMap = new HashMap <Integer , Integer >(data .uvArray .size () / 2 );
341
- var normalMap = new HashMap <Integer , Integer >(data .normalsArray .size () / 2 );
341
+ var normalsMap = new HashMap <Integer , Integer >(data .normalsArray .size () / 2 );
342
342
343
- var newVertexArray = FXCollections .observableFloatArray ();
344
- var newUVArray = FXCollections .observableFloatArray ();
345
- var newNormalArray = FXCollections .observableFloatArray ();
343
+ var verticesArray = FXCollections .observableFloatArray ();
344
+ var texCoordsArray = FXCollections .observableFloatArray ();
345
+ var normalsArray = FXCollections .observableFloatArray ();
346
346
347
347
boolean useNormals = true ;
348
348
349
- for (int i = facesStart ; i < data .faceList .size (); i += 2 ) {
350
- int vi = data . faceList . get ( i );
351
- Integer nvi = vertexMap . get ( vi );
352
- if ( nvi == null ) {
353
- nvi = newVertexArray . size () / 3 ;
354
- vertexMap .put (vi , nvi );
355
- newVertexArray .addAll (
356
- data .vertexArray .get (vi * 3 ),
357
- data .vertexArray .get (vi * 3 + 1 ),
358
- data .vertexArray .get (vi * 3 + 2 )
349
+ for (int facesIndex = facesStart ; facesIndex < data .facesList .size (); facesIndex += 2 ) {
350
+
351
+ // First comes vertex index
352
+ final int vertexIndex = data . facesList . get ( facesIndex );
353
+ if (! vertexMap . containsKey ( vertexIndex )) {
354
+ vertexMap .put (vertexIndex , verticesArray . size () / 3 );
355
+ verticesArray .addAll (
356
+ data .vertexArray .get (vertexIndex * 3 ),
357
+ data .vertexArray .get (vertexIndex * 3 + 1 ),
358
+ data .vertexArray .get (vertexIndex * 3 + 2 )
359
359
);
360
360
}
361
- data .faceList .set (i , nvi );
362
-
363
- int uvi = data .faceList .get (i + 1 );
364
- Integer nuvi = uvMap .get (uvi );
365
- if (nuvi == null ) {
366
- nuvi = newUVArray .size () / 2 ;
367
- uvMap .put (uvi , nuvi );
368
- if (uvi >= 0 ) {
369
- newUVArray .addAll (
370
- data .uvArray .get (uvi * 2 ),
371
- data .uvArray .get (uvi * 2 + 1 )
361
+ data .facesList .set (facesIndex , vertexMap .get (vertexIndex ));
362
+
363
+ // Second comes texture coordinate index
364
+ final int texCoordIndex = data .facesList .get (facesIndex + 1 );
365
+ if (!uvMap .containsKey (texCoordIndex )) {
366
+ uvMap .put (texCoordIndex , texCoordsArray .size () / 2 );
367
+ if (texCoordIndex >= 0 ) {
368
+ texCoordsArray .addAll (
369
+ data .uvArray .get (texCoordIndex * 2 ),
370
+ data .uvArray .get (texCoordIndex * 2 + 1 )
372
371
);
373
372
} else {
374
- newUVArray .addAll (0f , 0f );
373
+ texCoordsArray .addAll (0f , 0f );
375
374
}
376
375
}
377
- data .faceList .set (i + 1 , nuvi );
376
+ data .facesList .set (facesIndex + 1 , uvMap . get ( texCoordIndex ) );
378
377
379
378
if (useNormals ) {
380
- int ni = data .faceNormalsList .get (i / 2 );
381
- Integer nni = normalMap .get (ni );
382
- if (nni == null ) {
383
- nni = newNormalArray .size () / 3 ;
384
- normalMap .put (ni , nni );
385
- if (ni >= 0 && data .normalsArray .size () >= (ni + 1 ) * 3 ) {
386
- newNormalArray .addAll (
387
- data .normalsArray .get (ni * 3 ),
388
- data .normalsArray .get (ni * 3 + 1 ),
389
- data .normalsArray .get (ni * 3 + 2 )
379
+ int normalsIndex = data .faceNormalsList .get (facesIndex / 2 );
380
+ if (!normalsMap .containsKey (normalsIndex )) {
381
+ normalsMap .put (normalsIndex , normalsArray .size () / 3 );
382
+ if (normalsIndex >= 0 && data .normalsArray .size () >= (normalsIndex + 1 ) * 3 ) {
383
+ normalsArray .addAll (
384
+ data .normalsArray .get (normalsIndex * 3 ),
385
+ data .normalsArray .get (normalsIndex * 3 + 1 ),
386
+ data .normalsArray .get (normalsIndex * 3 + 2 )
390
387
);
391
388
} else {
392
389
useNormals = false ;
393
- newNormalArray .addAll (0f , 0f , 0f );
390
+ normalsArray .addAll (0f , 0f , 0f );
394
391
}
395
392
}
396
- data .faceNormalsList .set (i / 2 , nni );
393
+ data .faceNormalsList .set (facesIndex / 2 , normalsMap . get ( normalsIndex ) );
397
394
}
398
395
}
399
396
397
+ // Now build the triangle mesh from the parsed data:
398
+
400
399
final var mesh = new TriangleMesh ();
401
- mesh .getPoints ().setAll (newVertexArray );
402
- mesh .getTexCoords ().setAll (newUVArray );
403
-
404
- int [] facesRest = toIntArray (restOf (data .faceList , facesStart ));
405
- mesh .getFaces ().setAll (facesRest );
406
- // Use normals if they are provided
407
- if (useNormals ) {
408
- int [] smoothingGroups = computeSmoothingGroups (
409
- mesh ,
410
- facesRest ,
411
- toIntArray (restOf (data .faceNormalsList , facesNormalStart )),
412
- toFloatArray (newNormalArray )
413
- );
414
- mesh .getFaceSmoothingGroups ().setAll (smoothingGroups );
415
- } else {
416
- int [] smoothingGroupsRest = toIntArray (restOf (data .smoothingGroupList , smoothingGroupsStart ));
417
- mesh .getFaceSmoothingGroups ().setAll (smoothingGroupsRest );
418
- }
400
+ mesh .getPoints ().setAll (verticesArray );
401
+ mesh .getTexCoords ().setAll (texCoordsArray );
402
+
403
+ int [] faces = toIntArray (restOf (data .facesList , facesStart ));
404
+ mesh .getFaces ().setAll (faces );
405
+
406
+ int [] smoothingGroups = useNormals
407
+ ? computeSmoothingGroups (mesh , faces , toIntArray (restOf (data .faceNormalsList , facesNormalStart )), toFloatArray (normalsArray ))
408
+ : toIntArray (restOf (data .smoothingGroupList , smoothingGroupsStart ));
409
+ mesh .getFaceSmoothingGroups ().setAll (smoothingGroups );
419
410
420
411
// try specified name, if already used, make unique name using serial number e.g. "my_mesh (3)"
421
412
int serialNumber = 2 ;
@@ -434,7 +425,7 @@ private void commitCurrentMesh() {
434
425
mesh .getFaces ().size () / mesh .getFaceElementSize (),
435
426
mesh .getFaceSmoothingGroups ().size ());
436
427
437
- facesStart = data .faceList .size ();
428
+ facesStart = data .facesList .size ();
438
429
facesNormalStart = data .faceNormalsList .size ();
439
430
smoothingGroupsStart = data .smoothingGroupList .size ();
440
431
}
0 commit comments