32 package eu.mihosoft.vrl.v3d.ext.openjfx.importers.obj;
34 import static eu.mihosoft.vrl.v3d.ext.openjfx.importers.obj.ObjImporter.log;
35 import java.io.BufferedReader;
36 import java.io.FileNotFoundException;
37 import java.io.IOException;
38 import java.io.InputStream;
39 import java.io.InputStreamReader;
41 import java.util.Collections;
42 import java.util.HashMap;
44 import java.util.logging.Level;
45 import java.util.logging.Logger;
46 import javafx.scene.image.Image;
47 import javafx.scene.paint.Color;
48 import javafx.scene.paint.Material;
49 import javafx.scene.paint.PhongMaterial;
65 public MtlReader(String filename, String parentUrl) {
66 baseUrl = parentUrl.substring(0,parentUrl.lastIndexOf(
'/')+1);
67 String fileUrl =
baseUrl + filename;
69 URL mtlUrl =
new URL(fileUrl);
70 log(
"Reading material from filename = " + mtlUrl);
71 read(mtlUrl.openStream());
72 }
catch (FileNotFoundException ex) {
73 System.err.println(
"No material file found for obj. ["+fileUrl+
"]");
74 }
catch (IOException ex) {
87 log(
"Reading material from stream");
89 }
catch (FileNotFoundException ex) {
90 System.err.println(
"No material file found for obj. [stream]");
91 }
catch (IOException ex) {
97 private Map<String, Material>
materials =
new HashMap<>();
100 private PhongMaterial
material =
new PhongMaterial();
111 private void read(InputStream inputStream)
throws IOException {
112 BufferedReader br =
new BufferedReader(
new InputStreamReader(inputStream));
114 String name =
"default";
115 while ((line = br.readLine()) !=
null) {
117 if (line.isEmpty() || line.startsWith(
"#")) {
119 }
else if (line.startsWith(
"newmtl ")) {
121 name = line.substring(
"newmtl ".length());
122 }
else if (line.startsWith(
"Kd ")) {
125 }
else if (line.startsWith(
"Ks ")) {
128 }
else if (line.startsWith(
"Ns ")) {
129 material.setSpecularPower(Double.parseDouble(line.substring(3)));
131 }
else if (line.startsWith(
"map_Kd ")) {
132 material.setDiffuseColor(Color.WHITE);
157 log(
"material line ignored for " + name +
": " + line);
159 }
catch (Exception ex) {
160 Logger.getLogger(
MtlReader.class.getName()).log(Level.SEVERE,
"Failed to parse line:" + line, ex);
176 log(
"This material is already added. Ignoring " + name);
178 material =
new PhongMaterial(Color.WHITE);
189 String[] split = line.trim().split(
" +");
190 float red = Float.parseFloat(split[0]);
191 float green = Float.parseFloat(split[1]);
192 float blue = Float.parseFloat(split[2]);
193 return Color.color(red, green, blue);
204 log(
"Loading image from " + filename);
205 Image image =
new Image(filename);
206 return new Image(filename);
215 return Collections.unmodifiableMap(
materials);
Color readColor(String line)
void addMaterial(String name)
Image loadImage(String filename)
MtlReader(InputStream stream)
Map< String, Material > materials
Map< String, Material > getMaterials()
void read(InputStream inputStream)
MtlReader(String filename, String parentUrl)