23
23
package processing .core ;
24
24
25
25
import java .io .BufferedReader ;
26
+ import java .io .File ;
26
27
import java .util .ArrayList ;
27
28
import java .util .HashMap ;
28
29
import java .util .Map ;
@@ -45,17 +46,20 @@ public class PShapeOBJ extends PShape {
45
46
* Initializes a new OBJ Object with the given filename.
46
47
*/
47
48
public PShapeOBJ (PApplet parent , String filename ) {
48
- this (parent , parent .createReader (filename ));
49
+ this (parent , parent .createReader (filename ), getBasePath ( parent , filename ) );
49
50
}
50
51
51
-
52
52
public PShapeOBJ (PApplet parent , BufferedReader reader ) {
53
+ this (parent , reader , "" );
54
+ }
55
+
56
+ public PShapeOBJ (PApplet parent , BufferedReader reader , String basePath ) {
53
57
ArrayList <OBJFace > faces = new ArrayList <OBJFace >();
54
58
ArrayList <OBJMaterial > materials = new ArrayList <OBJMaterial >();
55
59
ArrayList <PVector > coords = new ArrayList <PVector >();
56
60
ArrayList <PVector > normals = new ArrayList <PVector >();
57
61
ArrayList <PVector > texcoords = new ArrayList <PVector >();
58
- parseOBJ (parent , reader ,
62
+ parseOBJ (parent , basePath , reader ,
59
63
faces , materials , coords , normals , texcoords );
60
64
61
65
// The OBJ geometry is stored with each face in a separate child shape.
@@ -168,7 +172,7 @@ protected void addChildren(ArrayList<OBJFace> faces,
168
172
}
169
173
170
174
171
- static protected void parseOBJ (PApplet parent ,
175
+ static protected void parseOBJ (PApplet parent , String path ,
172
176
BufferedReader reader ,
173
177
ArrayList <OBJFace > faces ,
174
178
ArrayList <OBJMaterial > materials ,
@@ -238,12 +242,15 @@ static protected void parseOBJ(PApplet parent,
238
242
} else if (parts [0 ].equals ("o" )) {
239
243
// Object name is ignored, for now.
240
244
} else if (parts [0 ].equals ("mtllib" )) {
241
-
242
245
if (parts [1 ] != null ) {
243
246
String fn = parts [1 ];
247
+ if (fn .indexOf (File .separator ) == -1 && !path .equals ("" )) {
248
+ // Relative file name, adding the base path.
249
+ fn = path + File .separator + fn ;
250
+ }
244
251
BufferedReader mreader = parent .createReader (fn );
245
252
if (mreader != null ) {
246
- parseMTL (parent , fn , mreader , materials , mtlTable );
253
+ parseMTL (parent , fn , path , mreader , materials , mtlTable );
247
254
mreader .close ();
248
255
}
249
256
}
@@ -332,7 +339,7 @@ static protected void parseOBJ(PApplet parent,
332
339
}
333
340
334
341
335
- static protected void parseMTL (PApplet parent , String mtlfn ,
342
+ static protected void parseMTL (PApplet parent , String mtlfn , String path ,
336
343
BufferedReader reader ,
337
344
ArrayList <OBJMaterial > materials ,
338
345
Map <String , Integer > materialsHash ) {
@@ -357,8 +364,15 @@ static protected void parseMTL(PApplet parent, String mtlfn,
357
364
if (parts [0 ].equals ("map_Kd" ) && parts .length > 1 ) {
358
365
// Loading texture map.
359
366
String texname = parts [1 ];
360
- currentMtl .kdMap = parent .loadImage (texname );
361
- if (currentMtl .kdMap == null ) {
367
+ if (texname .indexOf (File .separator ) == -1 && !path .equals ("" )) {
368
+ // Relative file name, adding the base path.
369
+ texname = path + File .separator + texname ;
370
+ }
371
+
372
+ File file = new File (parent .dataPath (texname ));
373
+ if (file .exists ()) {
374
+ currentMtl .kdMap = parent .loadImage (texname );
375
+ } else {
362
376
System .err .println ("The texture map \" " + texname + "\" " +
363
377
"in the materials definition file \" " + mtlfn + "\" " +
364
378
"is missing or inaccessible, make sure " +
@@ -438,6 +452,18 @@ static protected class OBJFace {
438
452
}
439
453
440
454
455
+ static protected String getBasePath (PApplet parent , String filename ) {
456
+ // Obtaining the path
457
+ File file = new File (parent .dataPath (filename ));
458
+ if (!file .exists ()) {
459
+ file = parent .sketchFile (filename );
460
+ }
461
+ String absolutePath = file .getAbsolutePath ();
462
+ return absolutePath .substring (0 ,
463
+ absolutePath .lastIndexOf (File .separator ));
464
+ }
465
+
466
+
441
467
// Stores a material defined in an MTL file.
442
468
static protected class OBJMaterial {
443
469
String name ;
0 commit comments