View Javadoc
1   /*
2    * Created on 2004-12-10
3    *
4    * TODO To change the template for this generated file go to
5    * Window - Preferences - Java - Code Style - Code Templates
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  		//chat.id="chat";
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  		//trans.set(new Vector3f(0,0,1));
77  		simpleUniverse.getViewer().getView().setVpcToEc(trans);
78  		
79  		trans.perspective(Math.PI/2,8d/6d,0.1,50);
80  		//trans.lookAt(new Point3d(0,0,0),new Point3d(0,0,1),new Vector3d(0,1,0));
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  		//simpleUniverse.getViewer().getView().setFrontClipDistance(0.00001);
86  		System.out.println(simpleUniverse.getViewer().getView().getFrontClipDistance());
87  		System.out.println(simpleUniverse.getViewer().getView().getBackClipDistance());
88  		//System.out.println(simpleUniverse.getViewer().getView().getFieldOfView());
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  		//simpleUniverse.getViewingPlatform().setNominalViewingTransform();
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 		//player.isServer=this.isServer;
145 		player.isServer=true;
146 		player.setWorld(this.staticTree);
147 		//player.name=name;
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 		// TODO Auto-generated method stub
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 		//mo.isServer=this.isServer;
185 		mo.isServer=false;
186 		mo.setWorld(this.staticTree);
187 		//mo.id=id;
188 		return mo;
189 	}
190 	
191 	/***
192 	 * @see org.sourceforge.jvb3d.Model.IModelNetwork#removeObject(int)
193 	 */
194 	public synchronized void removeObject(String id) {
195 		// TODO Auto-generated method stub
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 		// TODO Auto-generated method stub
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 		//this.serializationType=type;
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 }