aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortaw27 <taw27@84d2e878-0bd5-11dd-ad15-13eda11d74c5>2008-07-26 22:10:20 +0000
committertaw27 <taw27@84d2e878-0bd5-11dd-ad15-13eda11d74c5>2008-07-26 22:10:20 +0000
commitabe68923dd00e7585914352fa5fe0cb32bda5697 (patch)
tree34bd6b1b9a54316ff70160b7cfcd8a25c3d4f227 /src
parent02e398005e6268b32cbd18e7102f9632fc08b61f (diff)
Camera position stuff
git-svn-id: svn://cook.msm.cam.ac.uk:745/thrust3d/thrust3d@174 84d2e878-0bd5-11dd-ad15-13eda11d74c5
Diffstat (limited to 'src')
-rw-r--r--src/main.c10
-rw-r--r--src/render.c51
2 files changed, 50 insertions, 11 deletions
diff --git a/src/main.c b/src/main.c
index 8f00f69..b096342 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);