summaryrefslogtreecommitdiffstats
path: root/src/video/visuals_2d.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/video/visuals_2d.c')
-rw-r--r--src/video/visuals_2d.c161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/video/visuals_2d.c b/src/video/visuals_2d.c
new file mode 100644
index 0000000..91b8cdc
--- /dev/null
+++ b/src/video/visuals_2d.c
@@ -0,0 +1,161 @@
+#include "video/video.h"
+#include "game/game.h"
+
+/* draw a 2d map */
+
+void draw2D( Visual *d ) {
+ float width, height;
+ float border_left, border_bottom;
+ int i;
+
+ float aspect = (float)d->vp_w / (float)d->vp_h;
+ if(d->vp_w / game2->grid.width < d->vp_h / game2->grid.height) {
+ // black borders top/bottom
+ width = game2->grid.width + 1.0f;
+ height = width / aspect;
+ border_bottom = (height - game2->grid.height) / 2;
+ border_left = 0;
+ } else {
+ // black borders left/right
+ height = game2->grid.height + 1.0f;
+ width = height * aspect;
+ border_left = (width - game2->grid.width) / 2;
+ border_bottom = 0;
+ }
+
+ /*
+ {
+ static int foo = 0;
+ if(!foo)
+ printf("w,h: (%f,%f), border l/b: (%f,%f)\n",
+ width, height, border_left, border_bottom);
+ foo = 1;
+ }
+ */
+
+ glViewport(d->vp_x, d->vp_y, d->vp_w, d->vp_h);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(0, width, 0, height, 0, 1);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(border_left, border_bottom, 0);
+
+ {
+ float w = game2->grid.width;
+ float h = game2->grid.height;
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glBegin(GL_QUADS);
+ glColor4f(0.7f, 0.7f, 0.7f, 0.3f);
+ glVertex2f(0, 0);
+ glVertex2f(w, 0);
+ glVertex2f(w, h);
+ glVertex2f(0, h);
+ glEnd();
+ }
+
+ glDisable(GL_LIGHTING);
+ // glDisable(GL_BLEND);
+ glEnable(GL_BLEND);
+ {
+ float w = game2->grid.width;
+ float h = game2->grid.height;
+ glColor3f(1, 1, 1);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f( 0, 0, 0 );
+ glVertex3f( w, 0, 0 );
+ glVertex3f( w, h, 0 );
+ glVertex3f( 0, h, 0 );
+ glEnd();
+ }
+ for(i = 0; i < game->players; i++) {
+ Player *p = &game->player[i];
+ PlayerVisual *pV = gPlayerVisuals + i;
+ segment2* trail;
+ float x, y;
+
+ getPositionFromData(&x, &y, p->data);
+
+ // fixme: check if trails vanish
+ if (p->data->trail_height <= 0) {
+ continue;
+ }
+
+ if (p->data->trail_height < TRAIL_HEIGHT) {
+ /*
+ if player crashed but the trail hasn't disappeared yet, fade
+ the trail on the 2d map as it disappears.
+ */
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+
+ glColor4f(pV->pColorAlpha[0], pV->pColorAlpha[1], pV->pColorAlpha[2],
+ p->data->trail_height / TRAIL_HEIGHT);
+ } else {
+ glBlendFunc(GL_ONE, GL_ONE);
+ glColor3fv(pV->pColorAlpha);
+ }
+
+ glPointSize(2);
+ glBegin(GL_POINTS);
+ glVertex2f( x, y );
+ glEnd();
+
+ glBegin(GL_LINES);
+ for(trail = p->data->trails; trail != p->data->trails + p->data->trailOffset; trail++)
+ {
+ glVertex2f(trail->vStart.v[0],
+ trail->vStart.v[1]
+ );
+ glVertex2f(trail->vStart.v[0] + trail->vDirection.v[0],
+ trail->vStart.v[1] + trail->vDirection.v[1]
+ );
+ }
+ if(trail != p->data->trails)
+ {
+ trail--;
+ glVertex2f(trail->vStart.v[0] + trail->vDirection.v[0],
+ trail->vStart.v[1] + trail->vDirection.v[1]
+ );
+ glVertex2f( floorf(x), floorf(y));
+ }
+ else
+ {
+ glVertex2f(trail->vStart.v[0],
+ trail->vStart.v[1]
+ );
+ glVertex2f( floorf(x), floorf(y));
+ }
+
+#if 0
+ // draw AI debug lines
+ glColor3f(1,1,1);
+ glVertex2f(p->ai->front.vStart.v[0],
+ p->ai->front.vStart.v[1]);
+ glVertex2f(p->ai->front.vStart.v[0] + p->ai->front.vDirection.v[0],
+ p->ai->front.vStart.v[1] + p->ai->front.vDirection.v[1]);
+ glColor3f(0,1,0);
+ glVertex2f(p->ai->left.vStart.v[0],
+ p->ai->left.vStart.v[1]);
+ glVertex2f(p->ai->left.vStart.v[0] + p->ai->left.vDirection.v[0],
+ p->ai->left.vStart.v[1] + p->ai->left.vDirection.v[1]);
+ glColor3f(0,0,1);
+ glVertex2f(p->ai->right.vStart.v[0],
+ p->ai->right.vStart.v[1]);
+ glVertex2f(p->ai->right.vStart.v[0] + p->ai->right.vDirection.v[0],
+ p->ai->right.vStart.v[1] + p->ai->right.vDirection.v[1]);
+ glColor3f(0,1,1);
+ glVertex2f(p->ai->backleft.vStart.v[0],
+ p->ai->backleft.vStart.v[1]);
+ glVertex2f(p->ai->backleft.vStart.v[0] +
+ p->ai->backleft.vDirection.v[0],
+ p->ai->backleft.vStart.v[1] +
+ p->ai->backleft.vDirection.v[1]);
+#endif
+ glEnd();
+ }
+ glDisable(GL_BLEND);
+}
+