1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package cz.cuni.amis.pogamut.ut2004.agent.navigation.navmesh;
18
19 import java.io.File;
20 import java.io.FileInputStream;
21 import java.io.FileOutputStream;
22 import java.io.ObjectInputStream;
23 import java.io.ObjectOutputStream;
24 import java.util.Random;
25 import java.util.logging.Logger;
26
27 import cz.cuni.amis.pogamut.base.communication.worldview.IWorldView;
28 import cz.cuni.amis.pogamut.base.communication.worldview.object.IWorldObjectEvent;
29 import cz.cuni.amis.pogamut.base.communication.worldview.object.IWorldObjectEventListener;
30 import cz.cuni.amis.pogamut.base.communication.worldview.object.event.WorldObjectFirstEncounteredEvent;
31 import cz.cuni.amis.pogamut.base.utils.logging.IAgentLogger;
32 import cz.cuni.amis.pogamut.base.utils.logging.LogCategory;
33 import cz.cuni.amis.pogamut.ut2004.agent.navigation.navmesh.drawing.IUT2004ServerProvider;
34 import cz.cuni.amis.pogamut.ut2004.agent.navigation.navmesh.drawing.LevelGeometryDraw;
35 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo;
36 import cz.cuni.amis.utils.ExceptionToString;
37
38
39
40
41
42
43
44 public class LevelGeometryModule {
45
46 private IWorldView worldView;
47 private Logger log;
48
49 private Random random;
50
51
52
53
54
55 private boolean loaded = false;
56 private GameInfo loadedForMap = null;
57
58
59
60
61
62 private LevelGeometry levelGeometry;
63 private LevelGeometryDraw draw;
64
65 private IWorldObjectEventListener<GameInfo, IWorldObjectEvent<GameInfo>> gameInfoListener = new IWorldObjectEventListener<GameInfo, IWorldObjectEvent<GameInfo>>() {
66 @Override
67 public void notify(IWorldObjectEvent<GameInfo> event) {
68 load(event.getObject());
69 }
70 };
71
72 public LevelGeometryModule(IUT2004ServerProvider serverProvider, IWorldView worldView, IAgentLogger logger) {
73 if (logger == null) {
74 log = new LogCategory("LevelGeometry");
75 } else {
76 log = logger.getCategory("LevelGeometry");
77 }
78 random = new Random();
79
80 worldView.addObjectListener(GameInfo.class, WorldObjectFirstEncounteredEvent.class, gameInfoListener);
81
82 GameInfo info = worldView.getSingle(GameInfo.class);
83 if (info != null) {
84 load(info);
85 }
86
87 draw = new LevelGeometryDraw(null, log, serverProvider);
88 }
89
90 private void clear() {
91 log.warning("LevelGeometry has been cleared...");
92
93 levelGeometry = null;
94
95 loaded = false;
96 loadedForMap = null;
97 }
98
99 private boolean loadLevelGeometry(String mapName) {
100
101 String levelGeometryFileName = NavMeshConstants.processedLevelGeometryDir + "\\" + mapName + ".processed";
102 File levelGeometryFile = new File(levelGeometryFileName);
103
104 try {
105 if (!levelGeometryFile.exists()) {
106 log.warning("Processed LevelGeometry does not exist at: " + levelGeometryFile.getAbsolutePath());
107 } else {
108 log.info("Loading previously stored LevelGeometry from binary file: " + levelGeometryFile.getAbsolutePath());
109 ObjectInputStream in = new ObjectInputStream(new FileInputStream(levelGeometryFile));
110 levelGeometry = (LevelGeometry) in.readObject();
111 log.info("LevelGeometry LOADED SUCCESSFULLY.");
112 return true;
113 }
114 } catch (Exception e) {
115 log.severe(ExceptionToString.process("Previously saved level geometry file could not have been restored.", e));
116 }
117
118 try {
119 levelGeometry = new LevelGeometry(log);
120 if (levelGeometry.load(mapName)) {
121 log.info("LevelGeometry LOADED SUCCESSFULLY.");
122
123
124 try {
125 log.warning("Writing level geometry to a file at: " + levelGeometryFile.getAbsolutePath());
126 levelGeometryFile.getParentFile().mkdirs();
127 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(levelGeometryFile));
128 out.writeObject(levelGeometry);
129 log.info("Level geometry written ok.");
130 } catch (Exception e) {
131 log.severe(ExceptionToString.process("Exception during writing level geom to a file.", e));
132 }
133
134 return true;
135 }
136 log.severe("COULD NOT INITIALIZE FOR MAP: " + mapName);
137 levelGeometry = null;
138 return false;
139 } catch(Exception e) {
140 log.severe(ExceptionToString.process("Unable to load level geometry files.", e));
141 levelGeometry = null;
142 return false;
143 }
144 }
145
146 private void load(GameInfo info) {
147 if (info == null) {
148 log.severe("Could not load for 'null' GameInfo!");
149 return;
150 }
151 if (loaded) {
152 if (loadedForMap == null) {
153
154
155 clear();
156
157 } else {
158 if (loadedForMap.getLevel().equals(info.getLevel())) {
159
160 return;
161 }
162 }
163 }
164
165
166 String mapName = info.getLevel();
167 log.warning("Initializing LevelGeometry for: " + mapName);
168
169 if (loadLevelGeometry(mapName)) {
170 draw.setLevelGeometry(levelGeometry);
171 loaded = true;
172 loadedForMap = info;
173 return;
174 }
175
176 loaded = false;
177 loadedForMap = null;
178 }
179
180
181
182
183
184 public boolean isInitialized() {
185 return this.levelGeometry != null && this.levelGeometry.isLoaded();
186 }
187
188
189
190
191
192
193
194
195 public LevelGeometry getLevelGeometry() {
196 return this.levelGeometry;
197 }
198
199
200
201
202
203 public LevelGeometryDraw getDraw() {
204 return this.draw;
205 }
206
207 }