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)
39 float *varr, *narr, *uvarr;
42 if(!(gscn = goat3d_create()) || goat3d_load(gscn, "data/level1.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(match_prefix(goat3d_get_node_name(node), "portal_")) {
54 if(goat3d_get_node_type(node) == GOAT3D_NODE_MESH) {
55 struct goat3d_mesh *mesh = goat3d_get_node_object(node);
57 goat3d_get_node_matrix(node, xform);
61 varr = goat3d_get_mesh_attribs(mesh, GOAT3D_MESH_ATTR_VERTEX);
62 narr = goat3d_get_mesh_attribs(mesh, GOAT3D_MESH_ATTR_NORMAL);
63 uvarr = goat3d_get_mesh_attribs(mesh, GOAT3D_MESH_ATTR_TEXCOORD);
65 glEnableClientState(GL_VERTEX_ARRAY);
66 glVertexPointer(3, GL_FLOAT, 0, varr);
69 glEnableClientState(GL_NORMAL_ARRAY);
70 glNormalPointer(GL_FLOAT, 0, narr);
73 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
74 glTexCoordPointer(2, GL_FLOAT, 0, uvarr);
77 nfaces = goat3d_get_mesh_face_count(mesh);
78 idxarr = goat3d_get_mesh_faces(mesh);
79 glDrawElements(GL_TRIANGLES, nfaces * 3, GL_UNSIGNED_INT, idxarr);
81 glDisableClientState(GL_VERTEX_ARRAY);
82 glDisableClientState(GL_NORMAL_ARRAY);
83 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
93 static void gdestroy(void)
98 static int gstart(void)
103 static void gstop(void)
107 static void gdisplay(void)
109 glMatrixMode(GL_MODELVIEW);
111 glTranslatef(0, 0, -cam_dist);
112 glRotatef(cam_phi, 1, 0, 0);
113 glRotatef(cam_theta, 0, 1, 0);
114 glTranslatef(cam_pan[0], cam_pan[1], cam_pan[2]);
119 static void greshape(int x, int y)
123 static void gkeyb(int key, int press)
127 static void gmouse(int bn, int press, int x, int y)
131 static void gmotion(int x, int y)
133 int dx = x - mouse_x;
134 int dy = y - mouse_y;
136 if(!(dx | dy)) return;
139 cam_theta += dx * 0.5;
141 if(cam_phi < -90) cam_phi = -90;
142 if(cam_phi > 90) cam_phi = 90;
145 float up[3], right[3];
146 float theta = cam_theta * M_PI / 180.0f;
147 float phi = cam_phi * M_PI / 180.0f;
149 up[0] = -sin(theta) * sin(phi);
151 up[2] = cos(theta) * sin(phi);
152 right[0] = cos(theta);
154 right[2] = sin(theta);
156 cam_pan[0] += (right[0] * dx + up[0] * dy) * 0.01;
157 cam_pan[1] += up[1] * dy * 0.01;
158 cam_pan[2] += (right[2] * dx + up[2] * dy) * 0.01;
161 cam_dist += dy * 0.1;
162 if(cam_dist < 0) cam_dist = 0;