1 | package com.framsticks.net.client3D; |
---|
2 | |
---|
3 | import javax.media.opengl.GL; |
---|
4 | import javax.media.opengl.GLAutoDrawable; |
---|
5 | import javax.media.opengl.GLEventListener; |
---|
6 | import javax.media.opengl.glu.GLU; |
---|
7 | |
---|
8 | import pl.vorg.mowa.core.graphics.BoundingBox; |
---|
9 | import pl.vorg.mowa.core.graphics.SkyBox; |
---|
10 | import pl.vorg.mowa.core.graphics.Vec3; |
---|
11 | |
---|
12 | import com.sun.opengl.util.FPSAnimator; |
---|
13 | |
---|
14 | /** |
---|
15 | * Class responsible for rendering of framsticks and the world. |
---|
16 | * |
---|
17 | * @author vorg |
---|
18 | */ |
---|
19 | public class Renderer implements GLEventListener { |
---|
20 | public static final float AUTO_ROTATION_STEP = 0.5f; |
---|
21 | private float rotationY = 0; |
---|
22 | private float rotationX = 0; |
---|
23 | private float translation = -1.0f; |
---|
24 | private FPSAnimator animator; |
---|
25 | private World world; |
---|
26 | private Creature[] creatures; |
---|
27 | private Creature.ModelType modelType = Creature.ModelType.MechParts; |
---|
28 | private cgfxEffect style; |
---|
29 | private SkyBox skyBox; |
---|
30 | |
---|
31 | public SkyBox getSkyBox() { |
---|
32 | return skyBox; |
---|
33 | } |
---|
34 | |
---|
35 | public void setSkyBox(SkyBox box) { |
---|
36 | skyBox = box; |
---|
37 | } |
---|
38 | |
---|
39 | public cgfxEffect getStyle() { |
---|
40 | return style; |
---|
41 | } |
---|
42 | |
---|
43 | /** |
---|
44 | * Sets the currently used framstick rendering style. |
---|
45 | * |
---|
46 | * @param style |
---|
47 | */ |
---|
48 | public void setStyle(cgfxEffect style) { |
---|
49 | this.style = style; |
---|
50 | } |
---|
51 | |
---|
52 | public Creature[] getCreatures() { |
---|
53 | return creatures; |
---|
54 | } |
---|
55 | |
---|
56 | /** |
---|
57 | * Sets the number of creatures to display. To display a single creature in |
---|
58 | * a zoomed view pass a single element array and set the modelType to |
---|
59 | * Creature.ModelType.Parts. |
---|
60 | * |
---|
61 | * @param creatures |
---|
62 | */ |
---|
63 | public void setCreatures(Creature[] creatures) { |
---|
64 | this.creatures = creatures; |
---|
65 | } |
---|
66 | |
---|
67 | public World getWorld() { |
---|
68 | return world; |
---|
69 | } |
---|
70 | |
---|
71 | /** |
---|
72 | * Sets the world to be displayed. |
---|
73 | * |
---|
74 | * @param world |
---|
75 | */ |
---|
76 | public void setWorld(World world) { |
---|
77 | this.world = world; |
---|
78 | } |
---|
79 | |
---|
80 | public Creature.ModelType getModelType() { |
---|
81 | return modelType; |
---|
82 | } |
---|
83 | |
---|
84 | /** |
---|
85 | * Sets how the framsticks should be rendered. |
---|
86 | * |
---|
87 | * @param modelType |
---|
88 | * Creature.ModelType.Parts - the way they were created, |
---|
89 | * Creature.ModelType.MechParts - the way they currently look in |
---|
90 | * their world (in accordance with physics) |
---|
91 | */ |
---|
92 | public void setModelType(Creature.ModelType modelType) { |
---|
93 | this.modelType = modelType; |
---|
94 | } |
---|
95 | |
---|
96 | public float getTranslation() { |
---|
97 | return translation; |
---|
98 | } |
---|
99 | |
---|
100 | public void setTranslation(float t) { |
---|
101 | translation = t; |
---|
102 | if (translation < 0.1) |
---|
103 | translation = 0.1f; |
---|
104 | } |
---|
105 | |
---|
106 | public void resetTranslation() { |
---|
107 | translation = -1.0f; |
---|
108 | } |
---|
109 | |
---|
110 | public float getRotationX() { |
---|
111 | return rotationX; |
---|
112 | } |
---|
113 | |
---|
114 | public float getRotationY() { |
---|
115 | return rotationY; |
---|
116 | } |
---|
117 | |
---|
118 | public void setRotationX(float rotation) { |
---|
119 | this.rotationX = rotation; |
---|
120 | if (this.rotationX > 85.0) |
---|
121 | this.rotationX = 85.0f; |
---|
122 | else if (this.rotationX < 0) |
---|
123 | this.rotationX = 0.0f; |
---|
124 | } |
---|
125 | |
---|
126 | public void setRotationY(float rotation) { |
---|
127 | this.rotationY = rotation; |
---|
128 | } |
---|
129 | |
---|
130 | public void display(GLAutoDrawable drawable) { |
---|
131 | style.setSkyBox(skyBox); |
---|
132 | GL gl = drawable.getGL(); |
---|
133 | |
---|
134 | gl.glLoadIdentity(); |
---|
135 | gl.glClear(GL.GL_DEPTH_BUFFER_BIT | GL.GL_COLOR_BUFFER_BIT); |
---|
136 | |
---|
137 | if ((creatures != null) && (creatures.length == 1) |
---|
138 | && (modelType == Creature.ModelType.Parts)) { |
---|
139 | // renderowanie pojedynczego framsticka |
---|
140 | |
---|
141 | drawCreature(gl); |
---|
142 | } else { |
---|
143 | // renderowanie calaego swiata wraz z framstickami z nim zyjacymi |
---|
144 | drawWorld(gl); |
---|
145 | } |
---|
146 | gl.glFlush(); |
---|
147 | } |
---|
148 | |
---|
149 | public void drawWorld(GL gl) { |
---|
150 | |
---|
151 | // szescian otaczajacy swiat |
---|
152 | // wyliczamy go po to aby ustawic kamere tak aby byla w stanie objac |
---|
153 | // wszystko |
---|
154 | BoundingBox bbox; |
---|
155 | if ((world != null) && (world.getGeometry() != null)) { |
---|
156 | bbox = world.getGeometry().getBoundingBox(); |
---|
157 | |
---|
158 | } else { |
---|
159 | bbox = new BoundingBox(); |
---|
160 | if (creatures != null) { |
---|
161 | for (Creature c : creatures) { |
---|
162 | bbox.add(c.getBoundingBox(Creature.ModelType.MechParts)); |
---|
163 | } |
---|
164 | } |
---|
165 | } |
---|
166 | |
---|
167 | Vec3 bboxSize = bbox.getSize(); |
---|
168 | Vec3 bboxCenter = Vec3 |
---|
169 | .mul(0.5f, Vec3.add(bbox.getMax(), bbox.getMin())); |
---|
170 | |
---|
171 | if (translation < 0 || translation > 100000000.0f) { |
---|
172 | translation = (float) Math.sqrt(bboxSize.getX() * bboxSize.getX() |
---|
173 | / 4 + bboxSize.getZ() * bboxSize.getZ() / 4) * 1.5f; |
---|
174 | } |
---|
175 | |
---|
176 | gl.glTranslatef(0, 0, -1.0f * translation); |
---|
177 | // gl.glRotatef(30, 1, 0, 0); |
---|
178 | |
---|
179 | gl.glRotatef(rotationX, 1, 0, 0); |
---|
180 | gl.glRotatef(rotationY, 0, 1, 0); |
---|
181 | gl.glTranslatef(-bboxCenter.getX(), -bboxCenter.getY() - 2, -bboxCenter |
---|
182 | .getZ()); |
---|
183 | if (skyBox != null) |
---|
184 | skyBox.Draw(gl, 1000.0f, new Vec3(rotationX, rotationY, 0)); |
---|
185 | // renderowanie swiata |
---|
186 | if ((world != null) && (world.getGeometry() != null) |
---|
187 | && !world.getGeometry().getBoundingBox().isEmpty()) { |
---|
188 | BoundingBox wrldBox = world.getGeometry().getBoundingBox(); |
---|
189 | Vec3 wmin = wrldBox.getMin(); |
---|
190 | Vec3 wmax = wrldBox.getMax(); |
---|
191 | |
---|
192 | drawWorldGeometry(gl); |
---|
193 | drawWater(gl, wmin, wmax); |
---|
194 | if (world.getBoundaries() == 0) { |
---|
195 | drawWorldNoBounduaries(gl, wmin, wmax); |
---|
196 | } else if (world.getBoundaries() == 1) { |
---|
197 | drawWorldFence(gl, wmin, wmax); |
---|
198 | } else if (world.getBoundaries() == 2) { |
---|
199 | drawWorldTeleports(gl, wmin, wmax); |
---|
200 | } |
---|
201 | |
---|
202 | } |
---|
203 | |
---|
204 | // renderowanie stworow |
---|
205 | if ((creatures != null) && (style != null)) { |
---|
206 | if (!style.isInitialized()) { |
---|
207 | style.Init(); |
---|
208 | if (!style.isInitialized()) { |
---|
209 | setStyle(null); |
---|
210 | return; |
---|
211 | } |
---|
212 | } |
---|
213 | style.render(gl, creatures, Creature.ModelType.MechParts); |
---|
214 | } |
---|
215 | } |
---|
216 | |
---|
217 | /** |
---|
218 | * Rendering of the world surface. |
---|
219 | * |
---|
220 | * @param gl |
---|
221 | */ |
---|
222 | private void drawWorldGeometry(GL gl) { |
---|
223 | gl.glEnable(GL.GL_LIGHTING); |
---|
224 | gl.glEnable(GL.GL_LIGHT0); |
---|
225 | gl.glColor4f(0.9f, 0.8f, 0.2f, 0.0f); |
---|
226 | gl.glEnable(GL.GL_COLOR_MATERIAL); |
---|
227 | gl.glDisable(GL.GL_BLEND); |
---|
228 | world.getGeometry().display(gl); |
---|
229 | gl.glDisable(GL.GL_COLOR_MATERIAL); |
---|
230 | gl.glDisable(GL.GL_LIGHTING); |
---|
231 | // gl.glEnable(GL.GL_CULL_FACE); |
---|
232 | |
---|
233 | gl.glColor4f(0.7f, 0.7f, 0.7f, 0.1f); |
---|
234 | gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE); |
---|
235 | gl.glEnable(GL.GL_LINE_SMOOTH); |
---|
236 | gl.glEnable(GL.GL_BLEND); |
---|
237 | |
---|
238 | // gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); |
---|
239 | gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_DST_COLOR); |
---|
240 | gl.glHint(GL.GL_LINE_SMOOTH_HINT, GL.GL_DONT_CARE); |
---|
241 | gl.glLineWidth(2.5f); |
---|
242 | world.getGeometry().display(gl); |
---|
243 | gl.glDisable(GL.GL_BLEND); |
---|
244 | gl.glDisable(GL.GL_LINE_SMOOTH); |
---|
245 | gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL); |
---|
246 | } |
---|
247 | |
---|
248 | /** |
---|
249 | * Rendering of the world boundaries which consist of teleports (you get in |
---|
250 | * on one side of the world and get out on the opposite side). |
---|
251 | * |
---|
252 | * @param gl |
---|
253 | * @param wmin |
---|
254 | * @param wmax |
---|
255 | */ |
---|
256 | private void drawWorldTeleports(GL gl, Vec3 wmin, Vec3 wmax) { |
---|
257 | gl.glEnable(GL.GL_BLEND); |
---|
258 | gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); |
---|
259 | gl.glColor4f(0.0f, 0.4f, 0.9f, 0.5f); |
---|
260 | gl.glBegin(GL.GL_TRIANGLES); |
---|
261 | for (float z = -wmin.getZ(); z < wmax.getZ(); z += 1) { |
---|
262 | gl.glVertex3f(wmin.getX(), 0, z); |
---|
263 | gl.glVertex3f(wmin.getX(), 0, z + 1); |
---|
264 | gl.glVertex3f(wmin.getX(), 1, z + 0.5f); |
---|
265 | } |
---|
266 | for (float z = -wmin.getZ(); z < wmax.getZ(); z += 1) { |
---|
267 | gl.glVertex3f(wmax.getX(), 0, z); |
---|
268 | gl.glVertex3f(wmax.getX(), 0, z + 1); |
---|
269 | gl.glVertex3f(wmax.getX(), 1, z + 0.5f); |
---|
270 | } |
---|
271 | for (float x = -wmin.getX(); x < wmax.getX(); x += 1) { |
---|
272 | gl.glVertex3f(x, 0, wmin.getZ()); |
---|
273 | gl.glVertex3f(x + 1, 0, wmin.getZ()); |
---|
274 | gl.glVertex3f(x + 0.5f, 1, wmin.getZ()); |
---|
275 | } |
---|
276 | for (float x = -wmin.getX(); x < wmax.getX(); x += 1) { |
---|
277 | gl.glVertex3f(x, 0, wmax.getZ()); |
---|
278 | gl.glVertex3f(x + 1, 0, wmax.getZ()); |
---|
279 | gl.glVertex3f(x + 0.5f, 1, wmax.getZ()); |
---|
280 | } |
---|
281 | gl.glEnd(); |
---|
282 | gl.glDisable(GL.GL_BLEND); |
---|
283 | } |
---|
284 | |
---|
285 | /** |
---|
286 | * Rendering of the world boundaries which consist of a fence. |
---|
287 | * |
---|
288 | * @param gl |
---|
289 | * @param wmin |
---|
290 | * @param wmax |
---|
291 | */ |
---|
292 | private void drawWorldFence(GL gl, Vec3 wmin, Vec3 wmax) { |
---|
293 | gl.glEnable(GL.GL_BLEND); |
---|
294 | gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); |
---|
295 | gl.glColor4f(1.0f, 0.2f, 0.0f, 0.5f); |
---|
296 | gl.glBegin(GL.GL_QUADS); |
---|
297 | for (float z = -wmin.getZ(); z < wmax.getZ(); z += 1) { |
---|
298 | gl.glVertex3f(wmin.getX(), 0, z); |
---|
299 | gl.glVertex3f(wmin.getX(), 0, z + 1); |
---|
300 | gl.glVertex3f(wmin.getX(), 1, z + 1); |
---|
301 | gl.glVertex3f(wmin.getX(), 1, z); |
---|
302 | } |
---|
303 | for (float z = -wmin.getZ(); z < wmax.getZ(); z += 1) { |
---|
304 | gl.glVertex3f(wmax.getX(), 0, z); |
---|
305 | gl.glVertex3f(wmax.getX(), 0, z + 1); |
---|
306 | gl.glVertex3f(wmax.getX(), 1, z + 1); |
---|
307 | gl.glVertex3f(wmax.getX(), 1, z); |
---|
308 | } |
---|
309 | for (float x = -wmin.getX(); x < wmax.getX(); x += 1) { |
---|
310 | gl.glVertex3f(x, 0, wmin.getZ()); |
---|
311 | gl.glVertex3f(x + 1, 0, wmin.getZ()); |
---|
312 | gl.glVertex3f(x + 1, 1, wmin.getZ()); |
---|
313 | gl.glVertex3f(x, 1, wmin.getZ()); |
---|
314 | } |
---|
315 | for (float x = -wmin.getX(); x < wmax.getX(); x += 1) { |
---|
316 | gl.glVertex3f(x, 0, wmax.getZ()); |
---|
317 | gl.glVertex3f(x + 1, 0, wmax.getZ()); |
---|
318 | gl.glVertex3f(x + 1, 1, wmax.getZ()); |
---|
319 | gl.glVertex3f(x, 1, wmax.getZ()); |
---|
320 | } |
---|
321 | gl.glEnd(); |
---|
322 | gl.glDisable(GL.GL_BLEND); |
---|
323 | } |
---|
324 | |
---|
325 | /** |
---|
326 | * Rendering of the unbounded world boundaries. |
---|
327 | * |
---|
328 | * @param gl |
---|
329 | * @param wmin |
---|
330 | * @param wmax |
---|
331 | */ |
---|
332 | private void drawWorldNoBounduaries(GL gl, Vec3 wmin, Vec3 wmax) { |
---|
333 | gl.glEnable(GL.GL_BLEND); |
---|
334 | gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); |
---|
335 | gl.glBegin(GL.GL_QUADS); |
---|
336 | for (float z = -wmin.getZ(); z < wmax.getZ(); z += 1) { |
---|
337 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.5f); |
---|
338 | gl.glVertex3f(wmin.getX(), 0, z); |
---|
339 | gl.glVertex3f(wmin.getX(), 0, z + 1); |
---|
340 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.0f); |
---|
341 | gl.glVertex3f(wmin.getX() - 2, 0, z + 1); |
---|
342 | gl.glVertex3f(wmin.getX() - 2, 0, z); |
---|
343 | } |
---|
344 | for (float z = -wmin.getZ(); z < wmax.getZ(); z += 1) { |
---|
345 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.5f); |
---|
346 | gl.glVertex3f(wmax.getX(), 0, z); |
---|
347 | gl.glVertex3f(wmax.getX(), 0, z + 1); |
---|
348 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.0f); |
---|
349 | gl.glVertex3f(wmax.getX() + 2, 0, z + 1); |
---|
350 | gl.glVertex3f(wmax.getX() + 2, 0, z); |
---|
351 | } |
---|
352 | for (float x = -wmin.getX(); x < wmax.getX(); x += 1) { |
---|
353 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.5f); |
---|
354 | gl.glVertex3f(x, 0, wmin.getZ()); |
---|
355 | gl.glVertex3f(x + 1, 0, wmin.getZ()); |
---|
356 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.0f); |
---|
357 | gl.glVertex3f(x + 1, 0, wmin.getZ() - 2); |
---|
358 | gl.glVertex3f(x, 0, wmin.getZ() - 2); |
---|
359 | } |
---|
360 | for (float x = -wmin.getX(); x < wmax.getX(); x += 1) { |
---|
361 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.5f); |
---|
362 | gl.glVertex3f(x, 0, wmax.getZ()); |
---|
363 | gl.glVertex3f(x + 1, 0, wmax.getZ()); |
---|
364 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.0f); |
---|
365 | gl.glVertex3f(x + 1, 0, wmax.getZ() + 2); |
---|
366 | gl.glVertex3f(x, 0, wmax.getZ() + 2); |
---|
367 | } |
---|
368 | gl.glEnd(); |
---|
369 | |
---|
370 | gl.glBegin(GL.GL_TRIANGLES); |
---|
371 | |
---|
372 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.5f); |
---|
373 | gl.glVertex3f(wmin.getX(), 0, wmin.getX()); |
---|
374 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.0f); |
---|
375 | gl.glVertex3f(wmin.getX(), 0, wmin.getX() - 2); |
---|
376 | gl.glVertex3f(wmin.getX() - 2, 0, wmin.getX()); |
---|
377 | |
---|
378 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.5f); |
---|
379 | gl.glVertex3f(wmax.getX(), 0, wmin.getX()); |
---|
380 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.0f); |
---|
381 | gl.glVertex3f(wmax.getX(), 0, wmin.getX() - 2); |
---|
382 | gl.glVertex3f(wmax.getX() + 2, 0, wmin.getX()); |
---|
383 | |
---|
384 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.5f); |
---|
385 | gl.glVertex3f(wmax.getX(), 0, wmax.getX()); |
---|
386 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.0f); |
---|
387 | gl.glVertex3f(wmax.getX(), 0, wmax.getX() + 2); |
---|
388 | gl.glVertex3f(wmax.getX() + 2, 0, wmax.getX()); |
---|
389 | |
---|
390 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.5f); |
---|
391 | gl.glVertex3f(wmin.getX(), 0, wmax.getX()); |
---|
392 | gl.glColor4f(1.0f, 0.8f, 0.0f, 0.0f); |
---|
393 | gl.glVertex3f(wmin.getX(), 0, wmax.getX() + 2); |
---|
394 | gl.glVertex3f(wmin.getX() - 2, 0, wmax.getX()); |
---|
395 | |
---|
396 | gl.glEnd(); |
---|
397 | gl.glDisable(GL.GL_BLEND); |
---|
398 | } |
---|
399 | |
---|
400 | /** |
---|
401 | * Rendering of the water surface. |
---|
402 | * |
---|
403 | * @param gl |
---|
404 | * @param wmin |
---|
405 | * @param wmax |
---|
406 | */ |
---|
407 | private void drawWater(GL gl, Vec3 wmin, Vec3 wmax) { |
---|
408 | float wlev = world.getWaterLevel(); |
---|
409 | gl.glEnable(GL.GL_BLEND); |
---|
410 | gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); |
---|
411 | gl.glBegin(GL.GL_QUADS); |
---|
412 | gl.glColor4f(0.1f, 0.5f, 0.9f, 0.3f); |
---|
413 | gl.glVertex3f(wmin.getX() - 5, wlev - 0.02f, wmin.getZ() - 5); |
---|
414 | gl.glColor4f(0.1f, 0.8f, 0.9f, 0.3f); |
---|
415 | gl.glVertex3f(wmin.getX() - 5, wlev - 0.02f, wmax.getZ() + 5); |
---|
416 | gl.glColor4f(0.1f, 0.5f, 0.9f, 0.3f); |
---|
417 | gl.glVertex3f(wmax.getX() + 5, wlev - 0.02f, wmax.getZ() + 5); |
---|
418 | gl.glColor4f(0.1f, 0.8f, 0.9f, 0.3f); |
---|
419 | gl.glVertex3f(wmax.getX() + 5, wlev - 0.02f, wmin.getZ() - 5); |
---|
420 | |
---|
421 | gl.glColor4f(0.0f, 0.0f, 0.0f, 0.2f); |
---|
422 | gl.glVertex3f(wmin.getX() - 0.5f, wlev - 0.01f, wmin.getZ() - 0.5f); |
---|
423 | gl.glVertex3f(wmin.getX() - 0.5f, wlev - 0.01f, wmax.getZ() + 0.5f); |
---|
424 | gl.glVertex3f(wmax.getX() + 0.5f, wlev - 0.01f, wmax.getZ() + 0.5f); |
---|
425 | gl.glVertex3f(wmax.getX() + 0.5f, wlev - 0.01f, wmin.getZ() - 0.5f); |
---|
426 | gl.glEnd(); |
---|
427 | gl.glDisable(GL.GL_BLEND); |
---|
428 | } |
---|
429 | |
---|
430 | /** |
---|
431 | * Rendering of a single creature. |
---|
432 | * |
---|
433 | * @param gl |
---|
434 | */ |
---|
435 | private void drawCreature(GL gl) { |
---|
436 | BoundingBox bbox = creatures[0] |
---|
437 | .getBoundingBox(Creature.ModelType.Parts); |
---|
438 | |
---|
439 | Vec3 bboxSize = bbox.getSize(); |
---|
440 | Vec3 bboxCenter = Vec3 |
---|
441 | .mul(0.5f, Vec3.add(bbox.getMax(), bbox.getMin())); |
---|
442 | |
---|
443 | if (translation < 0) { |
---|
444 | translation = (float) Math.sqrt(bboxSize.getX() * bboxSize.getX() |
---|
445 | / 4 + bboxSize.getZ() * bboxSize.getZ() / 4); |
---|
446 | } |
---|
447 | |
---|
448 | gl.glTranslatef(0, 0, -1.0f * translation - 1); |
---|
449 | // gl.glRotatef(30, 1, 0, 0); |
---|
450 | gl.glRotatef(rotationX, 1, 0, 0); |
---|
451 | gl.glRotatef(rotationY, 0, 1, 0); |
---|
452 | gl.glTranslatef(-bboxCenter.getX(), -bboxCenter.getY(), -bboxCenter |
---|
453 | .getZ()); |
---|
454 | if (skyBox != null) |
---|
455 | skyBox.Draw(gl, 1000.0f, new Vec3(rotationX, rotationY, 0)); |
---|
456 | |
---|
457 | if (style != null) { |
---|
458 | if (!style.isInitialized()) { |
---|
459 | style.Init(); |
---|
460 | if (!style.isInitialized()) { |
---|
461 | setStyle(null); |
---|
462 | return; |
---|
463 | } |
---|
464 | } |
---|
465 | |
---|
466 | // effect.render(gl, creatures, Creature.ModelType.Parts); |
---|
467 | style.render(gl, creatures, Creature.ModelType.Parts); |
---|
468 | } |
---|
469 | } |
---|
470 | |
---|
471 | public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, |
---|
472 | boolean deviceChanged) { |
---|
473 | } |
---|
474 | |
---|
475 | public void init(GLAutoDrawable drawable) { |
---|
476 | Log.getInstance().log("dbg", "Renderer.init"); |
---|
477 | Log.getInstance().log("dbg", "Renderer.init creating animator"); |
---|
478 | animator = new FPSAnimator(30); |
---|
479 | animator.add(drawable); |
---|
480 | animator.start(); |
---|
481 | animator.setRunAsFastAsPossible(false); |
---|
482 | rotationX = 30.0f; |
---|
483 | rotationY = 0.0f; |
---|
484 | Log.getInstance().log("dbg", "Renderer.init initializing opengl"); |
---|
485 | GL gl = drawable.getGL(); |
---|
486 | gl.glLoadIdentity(); |
---|
487 | gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); |
---|
488 | gl.glColor3f(1.0f, 1.0f, 1.0f); |
---|
489 | gl.glClearDepth(1.0); |
---|
490 | gl.glEnable(GL.GL_DEPTH_TEST); |
---|
491 | gl.glDepthFunc(GL.GL_LEQUAL); |
---|
492 | skyBox = new SkyBox(); |
---|
493 | skyBox.Init(gl); |
---|
494 | // style.Init(); |
---|
495 | Log.getInstance().log("dbg", "Renderer.init done"); |
---|
496 | } |
---|
497 | |
---|
498 | /** |
---|
499 | * Adjust the view to the application's window size. |
---|
500 | */ |
---|
501 | public void reshape(GLAutoDrawable drawable, int x, int y, int width, |
---|
502 | int height) { |
---|
503 | GL gl = drawable.getGL(); |
---|
504 | GLU glu = new GLU(); |
---|
505 | gl.glMatrixMode(GL.GL_PROJECTION); |
---|
506 | gl.glLoadIdentity(); |
---|
507 | glu.gluPerspective(90, (float) width / (float) height, 0.015, 1000); |
---|
508 | gl.glMatrixMode(GL.GL_MODELVIEW); |
---|
509 | } |
---|
510 | } |
---|