6e69c21758508aa47a8d72f77e6b1dba183d7177
[vrtris] / src / gamescr.c
1 #include "opengl.h"
2 #include "screen.h"
3 #include "cmesh.h"
4
5 static int init(void);
6 static void cleanup(void);
7 static void start(void);
8 static void stop(void);
9 static void update(float dt);
10 static void draw(void);
11 static void reshape(int x, int y);
12 static void keyboard(int key, int pressed);
13 static void mouse(int bn, int pressed, int x, int y);
14 static void motion(int x, int y);
15 static void wheel(int dir);
16
17 struct game_screen game_screen = {
18         "game",
19         1,      /* opaque */
20         0,      /* next */
21         init,
22         cleanup,
23         start,
24         stop,
25         update,
26         draw,
27         reshape,
28         keyboard,
29         mouse,
30         motion,
31         wheel
32 };
33
34 static struct cmesh *blkmesh;
35 static float cam_theta, cam_phi, cam_dist = 6;
36 static int bnstate[16];
37 static int prev_mx, prev_my;
38
39 static int init(void)
40 {
41         if(!(blkmesh = cmesh_alloc())) {
42                 return -1;
43         }
44         if(cmesh_load(blkmesh, "data/noisecube.obj") == -1) {
45                 fprintf(stderr, "failed to load block model\n");
46                 return -1;
47         }
48         return 0;
49 }
50
51 static void cleanup(void)
52 {
53         cmesh_free(blkmesh);
54 }
55
56 static void start(void)
57 {
58 }
59
60 static void stop(void)
61 {
62 }
63
64 static void update(float dt)
65 {
66 }
67
68 static void draw(void)
69 {
70         glTranslatef(0, 0, -cam_dist);
71         glRotatef(cam_phi, 1, 0, 0);
72         glRotatef(cam_theta, 0, 1, 0);
73
74         cmesh_draw(blkmesh);
75 }
76
77 static void reshape(int x, int y)
78 {
79 }
80
81 static void keyboard(int key, int pressed)
82 {
83 }
84
85 static void mouse(int bn, int pressed, int x, int y)
86 {
87         bnstate[bn] = pressed;
88         prev_mx = x;
89         prev_my = y;
90 }
91
92 static void motion(int x, int y)
93 {
94         float dx = x - prev_mx;
95         float dy = y - prev_my;
96         prev_mx = x;
97         prev_my = y;
98
99         if(bnstate[0]) {
100                 cam_theta += dx * 0.5;
101                 cam_phi += dy * 0.5;
102
103                 if(cam_phi < -90) cam_phi = -90;
104                 if(cam_phi > 90) cam_phi = 90;
105         }
106         if(bnstate[2]) {
107                 cam_dist += dy * 0.1;
108                 if(cam_dist < 0) cam_dist = 0;
109         }
110 }
111
112 static void wheel(int dir)
113 {
114 }