8 #include <cgmath/cgmath.h>
13 static void recalc_sball_matrix(float *objmat, float *cammat);
15 static int console_active;
16 static int sball_update_pending;
18 static cgm_vec3 obj_pos, cam_pos;
19 static cgm_quat obj_rot = {0, 0, 0, 1};
20 static cgm_quat cam_rot = {0, 0, 0, 1};
22 int demo_init(int argc, char **argv)
27 if(load_config("demo.cfg") == -1) {
30 if((env = getenv("START_SCR"))) {
33 if(parse_args(argc, argv) == -1) {
37 glEnable(GL_DEPTH_TEST);
38 glEnable(GL_CULL_FACE);
40 sball_obj_matrix[0] = sball_obj_matrix[5] = sball_obj_matrix[10] = sball_obj_matrix[15] = 1.0f;
41 sball_cam_matrix[0] = sball_cam_matrix[5] = sball_cam_matrix[10] = sball_cam_matrix[15] = 1.0f;
43 if(scr_init() == -1) {
47 scr = scr_lookup(opt.start_scr);
52 if(!scr || scr_change(scr, 4000) == -1) {
53 fprintf(stderr, "screen %s not found\n", opt.start_scr ? opt.start_scr : "0");
60 void demo_cleanup(void)
67 if(sball_update_pending) {
68 recalc_sball_matrix(sball_obj_matrix, sball_cam_matrix);
69 sball_update_pending = 0;
76 void demo_reshape(int x, int y)
78 glViewport(0, 0, x, y);
80 glMatrixMode(GL_PROJECTION);
82 gluPerspective(50.0, win_aspect, 0.5, 500.0);
85 static void change_screen(int idx)
87 printf("change screen %d\n", idx);
88 scr_change(scr_screen(idx), 4000);
92 #define CBUF_MASK (CBUF_SIZE - 1)
93 void demo_keyboard(int key, int pressed)
95 static char cbuf[CBUF_SIZE];
97 char inp[CBUF_SIZE + 1], *dptr;
107 console_active = !console_active;
121 wr = (wr + CBUF_SIZE - 1) & CBUF_MASK;
133 rd = (rd + 1) & CBUF_MASK;
137 printf("\ntrying to match: %s\n", inp);
138 nscr = scr_num_screens();
139 for(i=0; i<nscr; i++) {
140 if(strstr(scr_screen(i)->name, inp)) {
152 if(key >= '1' && key <= '9' && key <= '1' + scr_num_screens()) {
153 change_screen(key - '1');
154 } else if(key == '0' && scr_num_screens() >= 10) {
159 if(key < 256 && isprint(key)) {
164 wr = (wr + 1) & CBUF_MASK;
165 if(wr == rd) { /* overflow */
166 rd = (rd + 1) & CBUF_MASK;
178 void demo_mbutton(int bn, int pressed, int x, int y)
182 void demo_mmotion(int x, int y)
186 void demo_sball_motion(int x, int y, int z)
189 dir.x = (float)x * 0.001;
190 dir.y = (float)y * 0.001;
191 dir.z = (float)-z * 0.001;
192 cgm_vadd(&obj_pos, &dir);
194 cgm_vrotate_quat(&dir, &cam_rot);
195 cgm_vadd(&cam_pos, &dir);
197 sball_update_pending = 1;
200 void demo_sball_rotate(int x, int y, int z)
205 float axis_len = sqrt(rx * rx + ry * ry + rz * rz);
208 cgm_qrotation(&q, -axis_len * 0.001, rx / axis_len, ry / axis_len, -rz / axis_len);
209 cgm_qmul(&obj_rot, &q);
211 cgm_qrotation(&q, axis_len * 0.001, rx / axis_len, ry / axis_len, -rz / axis_len);
212 cgm_qmul(&cam_rot, &q);
214 sball_update_pending = 1;
217 void demo_sball_button(int bn, int pressed)
223 cgm_vcons(&obj_pos, 0, 0, 0);
224 cgm_vcons(&cam_pos, 0, 0, 0);
225 cgm_qcons(&obj_rot, 0, 0, 0, 1);
226 cgm_qcons(&cam_rot, 0, 0, 0, 1);
227 sball_update_pending = 1;
236 static void recalc_sball_matrix(float *objmat, float *cammat)
238 float rmat[16], tmat[16];
240 cgm_mrotation_quat(rmat, &cam_rot);
241 cgm_mtranspose(rmat);
243 cgm_mtranslation(tmat, -cam_pos.x, -cam_pos.y, -cam_pos.z);
244 cgm_mcopy(cammat, tmat);
245 cgm_mmul(cammat, rmat);
247 cgm_mrotation_quat(rmat, &obj_rot);
248 cgm_mtranspose(rmat);
250 cgm_mtranslation(tmat, obj_pos.x, obj_pos.y, obj_pos.z);
251 cgm_mcopy(objmat, rmat);
252 cgm_mmul(objmat, tmat);