9 static int ginit(void);
10 static void gdestroy(void);
11 static int gstart(void);
12 static void gstop(void);
13 static void gdisplay(void);
14 static void greshape(int x, int y);
15 static void gkeyb(int key, int press);
16 static void gmouse(int bn, int press, int x, int y);
17 static void gmotion(int x, int y);
19 struct game_screen scr_game = {
24 gkeyb, gmouse, gmotion
27 static float cam_theta, cam_phi = 20, cam_dist = 10;
28 static float cam_pan[3];
30 static int ginit(void)
35 static void gdestroy(void)
39 static int gstart(void)
44 static void gstop(void)
48 static void gdisplay(void)
51 glMatrixMode(GL_MODELVIEW);
53 glTranslatef(0, 0, -cam_dist);
54 glRotatef(cam_phi, 1, 0, 0);
55 glRotatef(cam_theta, 0, 1, 0);
56 glTranslatef(cam_pan[0], cam_pan[1], cam_pan[2]);
61 dlist = glGenLists(1);
62 glNewList(dlist, GL_COMPILE);
70 static void greshape(int x, int y)
74 static void gkeyb(int key, int press)
78 static void gmouse(int bn, int press, int x, int y)
82 static void gmotion(int x, int y)
87 if(!(dx | dy)) return;
90 cam_theta += dx * 0.5;
92 if(cam_phi < -90) cam_phi = -90;
93 if(cam_phi > 90) cam_phi = 90;
96 float up[3], right[3];
97 float theta = cam_theta * M_PI / 180.0f;
98 float phi = cam_phi * M_PI / 180.0f;
100 up[0] = -sin(theta) * sin(phi);
102 up[2] = cos(theta) * sin(phi);
103 right[0] = cos(theta);
105 right[2] = sin(theta);
107 cam_pan[0] += (right[0] * dx + up[0] * dy) * 0.01;
108 cam_pan[1] += up[1] * dy * 0.01;
109 cam_pan[2] += (right[2] * dx + up[2] * dy) * 0.01;
112 cam_dist += dy * 0.1;
113 if(cam_dist < 0) cam_dist = 0;