diff options
author | taw27 <taw27@84d2e878-0bd5-11dd-ad15-13eda11d74c5> | 2008-07-26 22:10:20 +0000 |
---|---|---|
committer | taw27 <taw27@84d2e878-0bd5-11dd-ad15-13eda11d74c5> | 2008-07-26 22:10:20 +0000 |
commit | abe68923dd00e7585914352fa5fe0cb32bda5697 (patch) | |
tree | 34bd6b1b9a54316ff70160b7cfcd8a25c3d4f227 | |
parent | 02e398005e6268b32cbd18e7102f9632fc08b61f (diff) |
Camera position stuff
git-svn-id: svn://cook.msm.cam.ac.uk:745/thrust3d/thrust3d@174 84d2e878-0bd5-11dd-ad15-13eda11d74c5
-rw-r--r-- | src/main.c | 10 | ||||
-rw-r--r-- | src/render.c | 51 |
2 files changed, 50 insertions, 11 deletions
@@ -87,6 +87,7 @@ int main(int argc, char *argv[]) { ScreenResolution res; Uint32 t = 0; GameOptions gameopts; + Uint16 cx, cy; gameopts.disable_vbos = 0; gameopts.disable_fbos = 0; @@ -196,6 +197,8 @@ int main(int argc, char *argv[]) { SDL_ShowCursor(SDL_DISABLE); //SDL_WM_GrabInput(SDL_GRAB_ON); SDL_SetEventFilter(main_event_filter); + cx = width/2; cy = height/2; + SDL_WarpMouse(cx, cy); /* World setup */ Game *game; @@ -228,6 +231,7 @@ int main(int argc, char *argv[]) { if ( event.key.keysym.sym == SDLK_p ) game_pause(game); if ( event.key.keysym.sym == SDLK_q ) finished = 1; if ( event.key.keysym.sym == SDLK_ESCAPE ) finished = 1; + if ( event.key.keysym.sym == SDLK_r ) SDL_WarpMouse(cx, cy); break; case SDL_KEYUP : /* Process key releases even when paused */ @@ -248,8 +252,10 @@ int main(int argc, char *argv[]) { } SDL_GetMouseState(&mx, &my); - game->view_yaw = mx*0.005; - game->view_angle = my*0.005; + game->view_yaw = -(mx-cx)*0.005; + game->view_angle = deg2rad(-20.0) + (my-cy)*0.005; + if ( game->view_angle > deg2rad(89.0) ) game->view_angle = deg2rad(89.0); + if ( game->view_angle < deg2rad(-89.0) ) game->view_angle = deg2rad(-89.0); if ( !game->paused ) { physics_step(game, t); diff --git a/src/render.c b/src/render.c index 95ac6ef..b3a32cb 100644 --- a/src/render.c +++ b/src/render.c @@ -443,10 +443,10 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC static void render_draw_line(GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2) { - GLfloat col[] = {0.0, 0.3, 0.0, 1.0}; + GLfloat col[] = {0.0, 1.0, 0.0, 1.0}; glMaterialfv(GL_FRONT, GL_EMISSION, col); - glColor3f(0.0, 0.0, 0.0); + glColor3f(0.0, 1.0, 0.0); glBegin(GL_LINES); glVertex3f(x1, y1, z1); @@ -656,6 +656,9 @@ void render_draw(Game *game, Uint32 t) { RenderContext *r; GLfloat amb[] = { 0.0, 0.0, 0.0, 1.0 }; + GLfloat fx, fy, fz, ux, uy, uz; + GLfloat fxt, fyt, fzt; + GLfloat uxt, uyt, uzt; r = game->render; @@ -700,6 +703,7 @@ void render_draw(Game *game, Uint32 t) { glEnd(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + if ( r->shaders ) glUseProgram(0); } @@ -711,13 +715,42 @@ void render_draw(Game *game, Uint32 t) { gluPerspective(50.0, (GLfloat)r->width/(GLfloat)r->height, 0.1, 100.0); /* Depth buffer 10cm to 100m */ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt(game->lander->x-(game->view_dist*sinf(game->lander->yaw)), - game->lander->y-(game->view_dist*cosf(game->lander->yaw)), - game->lander->z, /* Look from */ - game->lander->x, game->lander->y, game->lander->z, /* Look at */ - 0.0, 0.0, 1.0); /* Up */ - //glRotatef(rad2deg(game->view_yaw), 0.0, 0.0, 1.0); - glRotatef(rad2deg(-game->view_angle), 1.0, 0.0, 0.0); + + fx = 0.0; + fy = -game->view_dist; + fz = 0.0; + ux = 0.0; + uy = 0.0; + uz = 1.0; + + fxt = fx; fyt = fy; fzt = fz; + uxt = ux; uyt = uy; uzt = uz; + fx = fxt; + fy = fyt*cos(game->view_angle) + fzt*sin(game->view_angle); + fz = fyt*sin(game->view_angle) + fzt*cos(game->view_angle); + ux = uxt; + uy = uyt*cos(game->view_angle) - uzt*sin(game->view_angle); + uz = -uyt*sin(game->view_angle) + uzt*cos(game->view_angle); + + fxt = fx; fyt = fy; fzt = fz; + uxt = ux; uyt = uy; uzt = uz; + fx = fxt*cos(game->view_yaw+game->lander->yaw) + fyt*sin(game->view_yaw+game->lander->yaw); + fy = -fxt*sin(game->view_yaw+game->lander->yaw) + fyt*cos(game->view_yaw+game->lander->yaw); + fz = fzt; + ux = uxt*cos(game->view_yaw+game->lander->yaw) - uyt*sin(game->view_yaw+game->lander->yaw); + uy = -uxt*sin(game->view_yaw+game->lander->yaw) + uyt*cos(game->view_yaw+game->lander->yaw); + uz = uzt; + + ux = 0.0; + uy = 0.0; + uz = 1.0; + fx += game->lander->x; + fy += game->lander->y; + fz += game->lander->z; + + gluLookAt(fx, fy, fz, game->lander->x, game->lander->y, game->lander->z, ux, uy, uz); + //gluLookAt(0.0, 0.0, -0.0, 0.0, 0.0, -5.0, 0.0, 1.0, 0.0); + if ( r->shaders ) glUseProgram(r->lighting_program); if ( r->shaders ) render_setuni(game->render->lighting_program, "texture", 0); /* GL_TEXTURE0 */ if ( r->shaders ) render_setuni(game->render->lighting_program, "texture_only", 0); |