1
2
3
4
5
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 }