diff options
-rw-r--r-- | src/game.c | 5 | ||||
-rw-r--r-- | src/game.h | 2 | ||||
-rw-r--r-- | src/main.c | 16 | ||||
-rw-r--r-- | src/render.c | 24 | ||||
-rw-r--r-- | src/render.h | 2 | ||||
-rw-r--r-- | src/types.h | 1 |
6 files changed, 40 insertions, 10 deletions
@@ -218,7 +218,7 @@ static void game_load_all_connected(Game *game) { } /* Create a new "game" structure */ -Game *game_new() { +Game *game_new(int width, int height) { Game *g; @@ -236,11 +236,12 @@ Game *game_new() { g->cur_room_z = 0; g->num_rooms = 0; g->view_angle = deg2rad(+20.0); + g->view_dist = 5.0; g->paused = 0; g->pause_rel = 1; /* Renderer setup */ - g->render = render_setup(); + g->render = render_setup(width, height); if ( g->render == NULL ) { fprintf(stderr, "Couldn't initialise renderer\n"); free(g); @@ -21,7 +21,7 @@ #include "types.h" extern void game_check_handoff(Game *game); -extern Game *game_new(void); +extern Game *game_new(int width, int height); extern Room *game_find_room(Game *game, int rx, int ry, int rz); extern void game_pause(Game *game); @@ -14,6 +14,7 @@ #endif #include <stdlib.h> +#include <unistd.h> #include <SDL.h> #include <gl.h> #include <glu.h> @@ -29,6 +30,7 @@ int main(int argc, char *argv[]) { SDL_Event event; int finished; SDL_Surface *screen; + int width, height; /* SDL initial setup */ if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0 ) { @@ -36,17 +38,22 @@ int main(int argc, char *argv[]) { return 1; } atexit(SDL_Quit); + + width = 1600;//1024; + height = 1050;//768; + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - screen = SDL_SetVideoMode(640, 480, 16, SDL_OPENGL); + screen = SDL_SetVideoMode(width, height, 16, SDL_OPENGL | SDL_FULLSCREEN); if (screen == NULL) { fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError()); return 1; } SDL_WM_SetCaption("Thrust3D", "Thrust3D"); + SDL_ShowCursor(SDL_DISABLE); /* World setup */ Game *game; - game = game_new(); + game = game_new(width, height); /* Main loop */ finished = 0; @@ -62,6 +69,7 @@ int main(int argc, char *argv[]) { if ( event.key.keysym.sym == SDLK_DOWN ) game->reverse = 1; } if ( event.key.keysym.sym == SDLK_p ) game_pause(game); + if ( event.key.keysym.sym == SDLK_q ) finished = 1; break; case SDL_KEYUP : if ( !game->paused ) { @@ -85,6 +93,10 @@ int main(int argc, char *argv[]) { physics_step(game); render_draw(game); } + + /* Sleep for around 8ms to avoid hogging the CPU. This value gives about 100fps on my (rather modest) machine. */ + usleep(8000); + } render_shutdown(game->render); diff --git a/src/render.c b/src/render.c index b45634d..81d5ba3 100644 --- a/src/render.c +++ b/src/render.c @@ -79,7 +79,7 @@ static void render_delete_shaders(RenderContext *ctx) { } /* OpenGL initial setup */ -RenderContext *render_setup() { +RenderContext *render_setup(width, height) { RenderContext *ctx; @@ -87,7 +87,7 @@ RenderContext *render_setup() { if ( ctx == NULL ) return NULL; glClearColor(0.0, 0.0, 0.0, 1.0); - glViewport(0, 0, 640, 480); + glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -268,6 +268,20 @@ static void render_setup_lighting(Game *game, Room *room_current) { } #endif +static void render_draw_line(GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2) { + + GLfloat red[] = {1.0, 0.0, 0.0, 1.0}; + + glMaterialfv(GL_FRONT, GL_EMISSION, red); + glColor3f(0.0, 0.0, 0.0); + + glBegin(GL_LINES); + glVertex3f(x1, y1, z1); + glVertex3f(x2, y2, z2); + glEnd(); + +} + void render_draw(Game *game) { int i; @@ -279,8 +293,9 @@ void render_draw(Game *game) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt(game->lander->x-(1.5*sinf(game->lander->yaw)*cosf(game->view_angle)), - game->lander->y-(1.5*cosf(game->lander->yaw)*cosf(game->view_angle)), game->lander->z+(1.5*sinf(game->view_angle)), + gluLookAt(game->lander->x-(game->view_dist*sinf(game->lander->yaw)*cosf(game->view_angle)), + game->lander->y-(game->view_dist*cosf(game->lander->yaw)*cosf(game->view_angle)), + game->lander->z+(game->view_dist*sinf(game->view_angle)), game->lander->x, game->lander->y, game->lander->z, sqrtf(2.0)*sinf(game->lander->yaw)*sinf(game->view_angle), sqrtf(2.0)*cosf(game->lander->yaw)*sinf(game->view_angle), sqrtf(2.0)*cosf(game->view_angle)); @@ -331,6 +346,7 @@ void render_draw(Game *game) { } /* Finally, the lander */ render_model_instance_draw(game->lander, t, game->render); + render_draw_line(game->lander->x, game->lander->y, game->lander->z, game->lander->x, game->lander->y, game->lander->z-200.0); //glUseProgramObjectARB(0); SDL_GL_SwapBuffers(); diff --git a/src/render.h b/src/render.h index 96fe690..8b89374 100644 --- a/src/render.h +++ b/src/render.h @@ -18,7 +18,7 @@ #include "types.h" -extern RenderContext *render_setup(void); +extern RenderContext *render_setup(int width, int height); extern void render_shutdown(RenderContext *ctx); extern void render_draw(Game *game); diff --git a/src/types.h b/src/types.h index 78864a9..deb083a 100644 --- a/src/types.h +++ b/src/types.h @@ -165,6 +165,7 @@ typedef struct { int num_rooms; float view_angle; + float view_dist; int paused; int pause_rel; |