1
2
3
4
5
6 package org.sourceforge.jvb3d.Loader;
7
8 import javax.media.j3d.BranchGroup;
9 import javax.media.j3d.GeometryArray;
10 import javax.media.j3d.QuadArray;
11 import javax.vecmath.Point3d;
12
13 import org.w3c.dom.Node;
14 import org.w3c.dom.NodeList;
15
16 /***
17 * @author Łukasz Krzyżak
18 *
19 * Implementacja fabryki tworzącej obiekty BranchGroup na podstawie danych z
20 * pliku z mapą
21 */
22 public class GraphObjectFactory {
23 protected static final float wallDefaultWidth = 0.1f;
24
25 protected static final float sceneScale = 0.1f;
26
27 class BoxGeometry {
28 GeometryArray[] geometry = new QuadArray[6];
29 }
30
31 protected static GraphObjectFactory instance = new GraphObjectFactory();
32
33 protected static AppearanceFactory appearanceFactory = AppearanceFactory.getInstance();
34
35 /***
36 * singleton - zwraca instancje
37 * @return instancja
38 */
39 public static GraphObjectFactory getInstance() {
40 return instance;
41 }
42
43 protected GraphObjectFactory() {
44
45 }
46
47 /***
48 * na podstawie danych z pliku mapy tworzy poszczególne powierzchnie.
49 * Parsuje plik, na podstawie współrzędnych powoduje wygenerowanie geometrii,
50 * a następnie przypisuje odpowiednie atrybuty dla danej powierzchni.
51 *
52 * @param surfaceNode
53 * @return grupa zawierająca wszystkie powierzchnie z pliku
54 */
55 public BranchGroup newGraphObject(Node surfaceNode) {
56 NodeList surfParams = surfaceNode.getChildNodes();
57 BranchGroup surface = new BranchGroup();
58 String surfaceID = surfaceNode.getAttributes().getNamedItem("id").getNodeValue();
59 Surface surfaceData = null;
60 for (int i = 0; i < surfParams.getLength(); i++) {
61 if (surfParams.item(i).getNodeName() == "PlanarGeometry") {
62 surfaceData = new Surface(parsePlanarGeometry(surfParams.item(i)), surfaceID);
63 }
64 else if (surfParams.item(i).getNodeName() == "Opening" ) {
65 surfaceData.cutOpening(parseOpening(surfParams.item(i)));
66 }
67 }
68
69 surfaceData.createTextureCoords();
70 surface.addChild(surfaceData.createShape());
71
72 surface.compile();
73
74 return surface;
75 }
76
77 /***
78 * parsuje dane o pojedyńczej powierzchni i wywołuje utworzenie odpowiednich
79 * grup dla każdej ze ścian powierzchni,
80 *
81 * @param geometry węzeł z pliku xml opisującego współrzędne
82 * @return tablica odczytanych punktów
83 */
84 private Point3d[] parsePlanarGeometry(Node geometry) {
85 NodeList vertices = geometry.getFirstChild().getChildNodes();
86 Point3d[] coords = new Point3d[4];
87
88 for (int i = 0; i < vertices.getLength(); i++)
89 coords[i] = parseCoords(vertices.item(i));
90
91 return coords;
92 }
93
94 private Point3d[] parseOpening(Node geometry) {
95 NodeList elements = geometry.getChildNodes();
96
97 for(int i=0; i<elements.getLength(); i++) {
98 if(elements.item(i).getNodeName() == "PlanarGeometry")
99 return parsePlanarGeometry(elements.item(i));
100 }
101
102 return null;
103 }
104
105 private Point3d parseCoords(Node cartesianPoint) {
106 NodeList coords = cartesianPoint.getChildNodes();
107
108 float[] coordinates = new float[3];
109 for (int i = 0; i < 3; i++) {
110 coordinates[i] = new Float(coords.item(i).getChildNodes().item(0).getNodeValue())
111 .floatValue();
112 }
113
114 return new Point3d(-coordinates[0], coordinates[2], coordinates[1]);
115 }
116 }