View Javadoc

1   /*
2    * Created on 2005-01-15
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.FileNotFoundException;
11  import java.io.IOException;
12  import java.util.HashMap;
13  import java.util.Map;
14  
15  import javax.media.j3d.BranchGroup;
16  import javax.media.j3d.Transform3D;
17  import javax.media.j3d.TransformGroup;
18  import javax.vecmath.Vector3d;
19  import javax.vecmath.Vector3f;
20  import javax.xml.parsers.DocumentBuilderFactory;
21  import javax.xml.parsers.ParserConfigurationException;
22  
23  import org.w3c.dom.Document;
24  import org.w3c.dom.Element;
25  import org.w3c.dom.Node;
26  import org.w3c.dom.NodeList;
27  import org.xml.sax.SAXException;
28  
29  import com.jlindamood.MS3D.*;
30  import com.sun.j3d.loaders.Scene;
31  
32  /***
33   * @author Łukasz Krzyżak
34   * 
35   * klasa odpowiada za wczytywanie zewnętrznych obiektów na podstawie pliku konfiguracyjnego
36   */
37  public class ModelManager {
38  	class ModelInfo {
39  		Scene model = null;
40  
41  		String modelFile = null;
42  
43  		ModelInfo(String fileName) {
44  			modelFile = fileName;
45  		}
46  
47  		BranchGroup getModel() throws FileNotFoundException {
48  			model = modelLoader.load(modelFile);
49  
50  			return model.getSceneGroup();
51  		}
52  	}
53  
54  	class ObjectInfo {
55  		BranchGroup geometryInfo = null;
56  		
57  		Transform3D objectTransformation = new Transform3D();
58  
59  		ObjectInfo(Element rootNode) throws FileNotFoundException {
60  			Element elem = (Element) rootNode.getElementsByTagName("Geometry")
61  					.item(0);
62  			geometryInfo = models.get(elem.getAttribute("source")).getModel();
63  			
64  			if(elem.getAttribute("pickable") != null && elem.getAttribute("pickable").equals("false"))
65  				geometryInfo.setPickable(false);
66  
67  			NodeList nodes = rootNode.getChildNodes();
68  
69  			for (int i = 0; i < nodes.getLength(); i++) {
70  				Node elm = nodes.item(i);
71  
72  				if (elm instanceof Element) {
73  					Element el = (Element) elm;
74  
75  					if (el.getNodeName().equals("Translation"))
76  						objectTransformation.setTranslation(new Vector3f(Float
77  								.parseFloat(el.getAttribute("x")), Float
78  								.parseFloat(el.getAttribute("y")), Float
79  								.parseFloat(el.getAttribute("z"))));
80  					else if (el.getNodeName().equals("Scale"))
81  						objectTransformation.setScale(new Vector3d(Double
82  								.parseDouble(el.getAttribute("x")), Double
83  								.parseDouble(el.getAttribute("y")), Double
84  								.parseDouble(el.getAttribute("z"))));
85  					else if (el.getNodeName().equals("Rotation")) {
86  						double angle = Double.parseDouble(el
87  								.getAttribute("angle"));
88  
89  						if (el.getAttribute("axis").equals("x"))
90  							objectTransformation.rotX(angle);
91  						else if (el.getAttribute("axis").equals("y"))
92  							objectTransformation.rotY(angle);
93  						else if (el.getAttribute("axis").equals("z"))
94  							objectTransformation.rotZ(angle);
95  					}
96  				}
97  			}
98  		}
99  
100 		TransformGroup getObject() {
101 			TransformGroup group = new TransformGroup();
102 			group.setTransform(objectTransformation);
103 			group.addChild(geometryInfo);
104 
105 			return group;
106 		}
107 	}
108 
109 	protected static final MilkLoader modelLoader = new MilkLoader();
110 
111 	protected static ModelManager instance = new ModelManager();
112 
113 	protected static final String surfacesFile = "data/objects.xml";
114 
115 	protected Map<String, ModelInfo> models = new HashMap<String, ModelInfo>();
116 
117 	protected BranchGroup objects = null;
118 
119 	/***
120 	 * singleton - zwraca instancję
121 	 * @return instancja
122 	 */
123 	public static ModelManager getInstance() {
124 		return instance;
125 	}
126 
127 	protected ModelManager() {
128 		try {
129 			parseModelsData();
130 			parseObjectsData();
131 		} catch (Exception e) {
132 			e.printStackTrace();
133 		}
134 	}
135 
136 	protected void parseModelsData() throws SAXException, IOException,
137 			ParserConfigurationException {
138 		Document dataDocument = DocumentBuilderFactory.newInstance()
139 				.newDocumentBuilder().parse(new File(surfacesFile));
140 
141 		Element root = (Element) dataDocument.getElementsByTagName("Models")
142 				.item(0);
143 		NodeList modelList = root.getElementsByTagName("Model");
144 
145 		for (int i = 0; i < modelList.getLength(); i++) {
146 			Element model = (Element) modelList.item(i);
147 
148 			ModelInfo modelInfo = new ModelInfo(model.getAttribute("source"));
149 
150 			models.put(model.getAttribute("id"), modelInfo);
151 		}
152 	}
153 
154 	protected void parseObjectsData() throws SAXException, IOException,
155 			ParserConfigurationException {
156 		Document dataDocument = DocumentBuilderFactory.newInstance()
157 				.newDocumentBuilder().parse(new File(surfacesFile));
158 
159 		Element root = (Element) dataDocument.getElementsByTagName(
160 				"WorldObjects").item(0);
161 		NodeList modelList = root.getElementsByTagName("Object");
162 
163 		objects = new BranchGroup();
164 
165 		for (int i = 0; i < modelList.getLength(); i++) {
166 			ObjectInfo model = new ObjectInfo((Element) modelList.item(i));
167 
168 			objects.addChild(model.getObject());
169 		}
170 	}
171 
172 	/***
173 	 * zwraca wszystkie zewnętrzne obiekty które zostały wczytane
174 	 * @return grupa zawierająca wszystkie obiekty
175 	 */
176 	public BranchGroup getObjects() {
177 		return objects;
178 	}
179 }