[65] | 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 | }
|
---|