diff options
Diffstat (limited to 'src/video/visuals_2d.c')
-rw-r--r-- | src/video/visuals_2d.c | 161 |
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); +} + |