View Javadoc
1   /*
2    * Created on 2004-12-31
3    *
4    * fabryka tworzaca obiekty BranchGroup na podstawie danych z pliku z mapą
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 }