1
2
3
4
5
6
7 package org.sourceforge.jvb3d.Model;
8
9
10 import javax.media.j3d.*;
11
12 import com.sun.j3d.utils.universe.*;
13 import javax.vecmath.*;
14
15 import java.util.Hashtable;
16 import java.util.*;
17 import java.io.*;
18 import java.awt.Font;
19
20
21 /***
22 * @author spootnick
23 *
24 * Klasa spajająca całą część logiki. Zawiera w sobie graf java 3D
25 */
26 public class Model implements IModelNetwork, IModelInput, IMakesTurn {
27
28 protected SimpleUniverse simpleUniverse;
29 protected Hashtable<String, DynamicObject> dynamicObjects= new Hashtable<String, DynamicObject>();
30 protected BranchGroup movableTree = new BranchGroup();
31 protected BranchGroup usableTree = new BranchGroup();
32 protected BranchGroup staticTree = new BranchGroup();
33 protected ControlableObject player;
34 protected HudObject chat;
35 protected String serializeID;
36 protected boolean serializeAll;
37 protected int nextID=0;
38 protected boolean isServer;
39 private String idToRemove;
40
41 /***
42 * Liczy następną turę dla modelu na podstawie czasu który minął od ostatniej
43 * @param time czas w nanosekundach
44 */
45 public synchronized void nextTurn(long time){
46 idToRemove=null;
47 for(Map.Entry<String, DynamicObject> ent:dynamicObjects.entrySet()){
48 if(ent.getValue().isAlive())
49 ent.getValue().nextTurn(time);
50 else
51 idToRemove=ent.getKey();
52 }
53 if(idToRemove!=null)
54 removeObject(idToRemove);
55 }
56
57 /***
58 * Konstruktor tworzy obiekt modelu
59 * @param canvas3D obiekt kanwas na podstawie którego zostanie stworzony SimpleUniverse
60 * @param isServer określa czy model jest modelem serwera czy klienta
61 */
62 public Model(Canvas3D canvas3D,boolean isServer){
63 this.isServer=isServer;
64 simpleUniverse = new SimpleUniverse(canvas3D);
65
66 PlatformGeometry p=new PlatformGeometry();
67 chat= new HudObject();
68 chat.isServer=this.isServer;
69
70 dynamicObjects.put("chat",chat);
71
72 simpleUniverse.getViewer().getView().setCompatibilityModeEnable(true);
73 simpleUniverse.getViewer().getView().setFieldOfView(Math.PI/2);
74 Transform3D trans = new Transform3D();
75 trans.setIdentity();
76
77 simpleUniverse.getViewer().getView().setVpcToEc(trans);
78
79 trans.perspective(Math.PI/2,8d/6d,0.1,50);
80
81 simpleUniverse.getViewer().getView().setLeftProjection(trans);
82 simpleUniverse.getViewer().getView().setRightProjection(trans);
83 System.out.println(simpleUniverse.getViewer().getView().getCompatibilityModeEnable());
84 System.out.println(simpleUniverse.getViewer().getView().getFieldOfView());
85
86 System.out.println(simpleUniverse.getViewer().getView().getFrontClipDistance());
87 System.out.println(simpleUniverse.getViewer().getView().getBackClipDistance());
88
89 TransformGroup tg=new TransformGroup();
90 Transform3D t= new Transform3D();
91 t.set(new Vector3f(-0.2f,0.15f-chat.getCharacterHeight(),-0.2f));
92 tg.setTransform(t);
93 tg.addChild(chat);
94 p.addChild(tg);
95 simpleUniverse.getViewingPlatform().setPlatformGeometry(p);
96
97
98 staticTree.setCapability(Group.ALLOW_CHILDREN_EXTEND);
99 usableTree.setCapability(Group.ALLOW_CHILDREN_EXTEND);
100 movableTree.setCapability(Group.ALLOW_CHILDREN_EXTEND);
101 movableTree.setCapability(Group.ALLOW_CHILDREN_WRITE);
102
103 LogicBehavior lb= new LogicBehavior(this);
104 lb.setSchedulingBounds(new BoundingSphere());
105 BranchGroup bg=new BranchGroup();
106 bg.addChild(lb);
107
108 PointLight lightA = new PointLight();
109 lightA.setInfluencingBounds(new BoundingBox(new Point3d(-10, -10, -10), new Point3d(10, 10, 10)));
110 Color3f lightColor = new Color3f(1.0f, 1.0f, 1.0f);
111 lightA.setColor(lightColor);
112 bg.addChild(lightA);
113
114 simpleUniverse.getViewingPlatform().getViewPlatformTransform().addChild(bg);
115
116 simpleUniverse.addBranchGraph(staticTree);
117 simpleUniverse.addBranchGraph(usableTree);
118 simpleUniverse.addBranchGraph(movableTree);
119 }
120
121 /***
122 * Tworzy lokalnego gracza z id generowanym automatycznie
123 * (używana po stronie serwera)
124 * @return identyfikator
125 */
126 public synchronized String createLocalPlayer(){
127 createControlable();
128 String id=String.valueOf(nextID++);
129 dynamicObjects.put(id,player);
130 return id;
131 }
132 /***
133 * Tworzy lokalnego gracza o zadanym id
134 * @param id identyfikator dla gracza
135 * @return identyfikator
136 */
137 public synchronized String createLocalPlayer(String id){
138 createControlable();
139 dynamicObjects.put(id,player);
140 return id;
141 }
142 private synchronized void createControlable(){
143 player = new ControlableObject();
144
145 player.isServer=true;
146 player.setWorld(this.staticTree);
147
148 player.setViewTransform(simpleUniverse.getViewingPlatform().getViewPlatformTransform());
149 }
150
151 /***
152 * Ustawia poddrzewo obiektów statycznych dla sceny.
153 * Ta grupa obiektów w największym stopniu tworzy wygląd sceny.
154 * Z punktu widzenia logiki te obiekty będą jedynie pełnić funkcje przeszkód.
155 * @param scene poddrzewo grafu java3d
156 */
157 public void setStaticScene(BranchGroup scene){
158 staticTree.removeAllChildren();
159 staticTree.addChild(scene);
160
161 }
162 /***
163 * Ustawia poddrzewo obiektów używalnych dla sceny.
164 * Na razie nie używana
165 */
166 public void setUsableScene(){
167
168 }
169
170 /***
171 * @see org.sourceforge.jvb3d.Model.IModelNetwork#createPlayer()
172 */
173 public synchronized String createPlayer() {
174
175 addObject(String.valueOf(nextID));
176 return String.valueOf(nextID++);
177 }
178
179
180 private synchronized DynamicObject addObject(String id){
181 MovableObject mo= new MovableObject();
182 movableTree.addChild(mo);
183 dynamicObjects.put(id,mo);
184
185 mo.isServer=false;
186 mo.setWorld(this.staticTree);
187
188 return mo;
189 }
190
191 /***
192 * @see org.sourceforge.jvb3d.Model.IModelNetwork#removeObject(int)
193 */
194 public synchronized void removeObject(String id) {
195
196 Node n = (Node)dynamicObjects.get(id);
197 if(n==null)
198 return;
199 movableTree.removeChild(n);
200 dynamicObjects.remove(id);
201 }
202
203 /***
204 * @see org.sourceforge.jvb3d.Model.IPlayerControl#turnLeftRight(float)
205 */
206 public synchronized void turnLeftRight(float angle){
207 player.turnLeftRight(angle);
208 }
209 /***
210 * @see org.sourceforge.jvb3d.Model.IPlayerControl#moveForwardBackward(float)
211 */
212 public synchronized void moveForwardBackward(float speed){
213 player.moveForwardBackward(speed);
214 }
215
216 /***
217 * @see org.sourceforge.jvb3d.Model.IPlayerControl#moveLeftRight(float)
218 */
219 public synchronized void moveLeftRight(float speed){
220 player.moveLeftRight(speed);
221 }
222
223 /***
224 * @see org.sourceforge.jvb3d.ModelIPlayerControl#turnUpDown(float)
225 */
226 public synchronized void turnUpDown(float angle){
227 player.turnUpDown(angle);
228 }
229
230 /***
231 * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput)
232 */
233 public synchronized void writeExternal(ObjectOutput arg0) throws IOException {
234
235 if(serializeAll){
236 for(Map.Entry<String, DynamicObject> ent:dynamicObjects.entrySet()){
237 arg0.writeObject(ent.getKey());
238 ent.getValue().writeExternal(arg0);
239 }
240 }else{
241 DynamicObject dyn=dynamicObjects.get(serializeID);
242 arg0.writeObject(serializeID);
243 dyn.writeExternal(arg0);
244 }
245 arg0.writeObject("koniec");
246
247 }
248
249 /***
250 * @see java.io.Externalizable#readExternal(java.io.ObjectInput)
251 */
252 public synchronized void readExternal(ObjectInput arg0) throws IOException,
253 ClassNotFoundException {
254
255 String id=(String)arg0.readObject();
256 while(!id.equals("koniec")){
257 Object obj=dynamicObjects.get(id);
258 if(obj==null){
259 int newID=Integer.parseInt(id);
260 if(newID>=nextID)
261 nextID=newID+1;
262 DynamicObject dyn=addObject(id);
263 dyn.readExternal(arg0);
264 }else{
265 DynamicObject dyn=(DynamicObject)obj;
266 dyn.readExternal(arg0);
267 }
268 id=(String)arg0.readObject();
269 }
270 }
271 /***
272 * @see org.sourceforge.jvb3d.Model.IModelNetwork#setSerializeAll()
273 */
274 public synchronized void setSerializeAll(){
275 serializeAll=true;
276
277 }
278 /***
279 * @see org.sourceforge.jvb3d.Model.IModelNetwork#setSerialize(java.lang.String)
280 */
281 public synchronized void setSerialize(String id){
282 serializeAll=false;
283 serializeID=id;
284
285 }
286 /***
287 * @see org.sourceforge.jvb3d.Model.IChatControl#submitLine(java.lang.String)
288 */
289 public synchronized void submitLine(String sourceName){
290 chat.submitLine(sourceName);
291 }
292 /***
293 * @see org.sourceforge.jvb3d.Model.IChatControl#append(java.lang.String)
294 */
295 public synchronized void append(String s){
296 chat.append(s);
297 }
298 /***
299 * @see org.sourceforge.jvb3d.Model.IChatControl#delete(int)
300 */
301 public synchronized void delete(int nChars){
302 chat.delete(nChars);
303 }
304 /***
305 * @see org.sourceforge.jvb3d.Model.IChatControl#beginEdit(java.lang.String)
306 */
307 public synchronized void beginEdit(String inputMark){
308 chat.beginEdit(inputMark);
309 }
310
311 }