View Javadoc
1   /*
2    * Created on 2005-01-12
3    *
4    * TODO To change the template for this generated file go to
5    * Window - Preferences - Java - Code Style - Code Templates
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 }