1
2
3
4
5
6
7 package org.sourceforge.jvb3d.Loader;
8
9 import java.io.File;
10 import java.io.IOException;
11 import java.util.HashMap;
12 import java.util.Map;
13
14 import javax.media.j3d.Material;
15 import javax.vecmath.Color3f;
16 import javax.xml.parsers.DocumentBuilderFactory;
17 import javax.xml.parsers.ParserConfigurationException;
18
19 import org.w3c.dom.Document;
20 import org.w3c.dom.Element;
21 import org.w3c.dom.NamedNodeMap;
22 import org.w3c.dom.Node;
23 import org.w3c.dom.NodeList;
24 import org.xml.sax.SAXException;
25
26 /***
27 * @author Łukasz Krzyżak
28 *
29 * Klasa odpowiada za zarządzanie materiałami.
30 * Wczytanie parametrów z pliku konfiguracyjnego, a następnie tworzenie/zwracanie
31 * materiałów zgodnie z ich specyfikacją.
32 */
33 public class MaterialManager {
34 class MaterialInfo {
35 Color3f ambientColor = null;
36 Color3f diffuseColor = null;
37 Color3f emissiveColor = null;
38 Color3f specularColor = null;
39 int shininess = 64;
40 Material material = null;
41
42 Material getMaterial() {
43 if(material == null)
44 material = new Material(ambientColor, diffuseColor, emissiveColor, specularColor, shininess);
45
46 return material;
47 }
48 }
49
50 protected Map<String, MaterialInfo> materials = new HashMap<String, MaterialInfo>();
51
52 protected final static String materialsFile = "data/materials.xml";
53
54 protected static MaterialManager instance = new MaterialManager();
55
56 /***
57 * powoduje wczytanie konfiguracji z pliku
58 *
59 */
60 protected MaterialManager() {
61 try {
62 parseXmlData();
63 }
64 catch(Exception e) {
65 e.printStackTrace();
66 }
67 }
68
69 /***
70 * singleton - zwraca obiekt managera
71 * @return obiekt managera
72 */
73 public static MaterialManager getInstance() {
74 return instance;
75 }
76
77 /***
78 * zwraca obiekt materiału na podstawie podanego ID
79 * @param materialID ID materiału
80 * @return materiał
81 */
82 public Material getMateralById(String materialID) {
83 return materials.get(materialID).getMaterial();
84 }
85
86 protected void parseXmlData() throws SAXException, IOException, ParserConfigurationException {
87 Document dataDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(materialsFile));
88
89 Element root = (Element)dataDocument.getElementsByTagName("Materials").item(0);
90 NodeList materialList = root.getElementsByTagName("Material");
91
92 for(int i=0; i<materialList.getLength(); i++) {
93 Element material = (Element)materialList.item(i);
94 MaterialInfo materialInfo = new MaterialInfo();
95
96 materialInfo.ambientColor = parseColor(material.getElementsByTagName("AmbientColor").item(0));
97 materialInfo.diffuseColor = parseColor(material.getElementsByTagName("DiffuseColor").item(0));
98 materialInfo.emissiveColor = parseColor(material.getElementsByTagName("EmissiveColor").item(0));
99 materialInfo.specularColor = parseColor(material.getElementsByTagName("SpecularColor").item(0));
100 materialInfo.shininess = Integer.parseInt(material.getElementsByTagName("Shininess").item(0).getAttributes().getNamedItem("value").getNodeValue());
101
102 materials.put(material.getAttribute("id"), materialInfo);
103 }
104 }
105
106 /***
107 * funkcja parsuje wezeł xml'a w którym zapisany jest kolor
108 * @param colorNode węzeł z danymi
109 * @return kolor określony w węźle
110 */
111 private Color3f parseColor(Node colorNode) {
112 Color3f color = new Color3f();
113
114 NamedNodeMap attr = colorNode.getAttributes();
115 color.x = Float.parseFloat(attr.getNamedItem("red").getNodeValue());
116 color.y = Float.parseFloat(attr.getNamedItem("green").getNodeValue());
117 color.z = Float.parseFloat(attr.getNamedItem("blue").getNodeValue());
118
119 return color;
120 }
121 }