10 static int ginit(void);
11 static void gdestroy(void);
12 static int gstart(void);
13 static void gstop(void);
14 static void gdisplay(void);
15 static void greshape(int x, int y);
16 static void gkeyb(int key, int press);
17 static void gmouse(int bn, int press, int x, int y);
18 static void gmotion(int x, int y);
20 struct game_screen scr_game = {
25 gkeyb, gmouse, gmotion
28 static float cam_theta, cam_phi = 20, cam_dist = 10;
29 static float cam_pan[3];
31 static struct goat3d *gscn;
35 static int ginit(void)
37 int i, j, num, nfaces;
39 float *varr, *narr, *uvarr;
42 if(!(gscn = goat3d_create()) || goat3d_load(gscn, "data/track1.g3d")) {
46 dlist = glGenLists(1);
47 glNewList(dlist, GL_COMPILE);
48 num = goat3d_get_node_count(gscn);
49 for(i=0; i<num; i++) {
50 struct goat3d_node *node = goat3d_get_node(gscn, i);
51 if(goat3d_get_node_type(node) == GOAT3D_NODE_MESH) {
52 struct goat3d_mesh *mesh = goat3d_get_node_object(node);
54 goat3d_get_node_matrix(node, xform);
58 varr = goat3d_get_mesh_attribs(mesh, GOAT3D_MESH_ATTR_VERTEX);
59 narr = goat3d_get_mesh_attribs(mesh, GOAT3D_MESH_ATTR_NORMAL);
60 uvarr = goat3d_get_mesh_attribs(mesh, GOAT3D_MESH_ATTR_TEXCOORD);
62 glEnableClientState(GL_VERTEX_ARRAY);
63 glVertexPointer(3, GL_FLOAT, 0, varr);
66 glEnableClientState(GL_NORMAL_ARRAY);
67 glNormalPointer(GL_FLOAT, 0, narr);
70 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
71 glTexCoordPointer(2, GL_FLOAT, 0, uvarr);
74 nfaces = goat3d_get_mesh_face_count(mesh);
75 idxarr = goat3d_get_mesh_faces(mesh);
76 glDrawElements(GL_TRIANGLES, nfaces * 3, GL_UNSIGNED_INT, idxarr);
78 glDisableClientState(GL_VERTEX_ARRAY);
79 glDisableClientState(GL_NORMAL_ARRAY);
80 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
90 static void gdestroy(void)
95 static int gstart(void)
100 static void gstop(void)
104 static void gdisplay(void)
106 glMatrixMode(GL_MODELVIEW);
108 glTranslatef(0, 0, -cam_dist);
109 glRotatef(cam_phi, 1, 0, 0);
110 glRotatef(cam_theta, 0, 1, 0);
111 glTranslatef(cam_pan[0], cam_pan[1], cam_pan[2]);
116 static void greshape(int x, int y)
120 static void gkeyb(int key, int press)
124 static void gmouse(int bn, int press, int x, int y)
128 static void gmotion(int x, int y)
130 int dx = x - mouse_x;
131 int dy = y - mouse_y;
133 if(!(dx | dy)) return;
136 cam_theta += dx * 0.5;
138 if(cam_phi < -90) cam_phi = -90;
139 if(cam_phi > 90) cam_phi = 90;
142 float up[3], right[3];
143 float theta = cam_theta * M_PI / 180.0f;
144 float phi = cam_phi * M_PI / 180.0f;
146 up[0] = -sin(theta) * sin(phi);
148 up[2] = cos(theta) * sin(phi);
149 right[0] = cos(theta);
151 right[2] = sin(theta);
153 cam_pan[0] += (right[0] * dx + up[0] * dy) * 0.01;
154 cam_pan[1] += up[1] * dy * 0.01;
155 cam_pan[2] += (right[2] * dx + up[2] * dy) * 0.01;
158 cam_dist += dy * 0.1;
159 if(cam_dist < 0) cam_dist = 0;