19 int fb_width = FB_WIDTH;
20 int fb_height = FB_HEIGHT;
22 uint16_t *fb_pixels, *vmem;
23 unsigned long time_msec;
25 unsigned int mouse_bmask;
27 float sball_matrix[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
29 static unsigned long nframes;
30 static int console_active;
32 int demo_init(int argc, char **argv)
37 if(load_config("demo.cfg") == -1) {
40 if((env = getenv("START_SCR"))) {
43 if(parse_args(argc, argv) == -1) {
49 if(g3d_init() == -1) {
52 g3d_framebuffer(fb_width, fb_height, fb_pixels);
55 if(music_open("data/test.mod") == -1) {
60 if(scr_init() == -1) {
64 scr = scr_lookup(opt.start_scr);
69 if(!scr || scr_change(scr, 4000) == -1) {
70 fprintf(stderr, "screen %s not found\n", opt.start_scr ? opt.start_scr : "0");
74 /* clear the framebuffer at least once */
75 memset(fb_pixels, 0, fb_width * fb_height * fb_bpp / CHAR_BIT);
83 void demo_cleanup(void)
92 float fps = (float)nframes / ((float)time_msec / 1000.0f);
93 printf("average framerate: %.1f\n", fps);
105 draw_mouse_pointer(vmem);
112 #define DEST(x, y) dest[(y) * FB_WIDTH + (x)]
113 void draw_mouse_pointer(uint16_t *fb)
115 uint16_t *dest = fb + mouse_y * FB_WIDTH + mouse_x;
116 int ylines = FB_HEIGHT - mouse_y;
167 void cs_puts(void *fb, int x, int y, const char *str)
172 if(c > ' ' && c < 128) {
173 cs_font(fb, x, y, c - ' ');
179 static void change_screen(int idx)
181 printf("change screen %d\n", idx);
182 scr_change(scr_screen(idx), 4000);
186 #define CBUF_MASK (CBUF_SIZE - 1)
187 void demo_keyboard(int key, int press)
189 static char cbuf[CBUF_SIZE];
191 char inp[CBUF_SIZE + 1], *dptr;
205 console_active = !console_active;
219 wr = (wr + CBUF_SIZE - 1) & CBUF_MASK;
231 rd = (rd + 1) & CBUF_MASK;
235 printf("\ntrying to match: %s\n", inp);
236 nscr = scr_num_screens();
237 for(i=0; i<nscr; i++) {
238 if(strstr(scr_screen(i)->name, inp)) {
250 if(key >= '1' && key <= '9' && key <= '1' + scr_num_screens()) {
251 change_screen(key - '1');
252 } else if(key == '0' && scr_num_screens() >= 10) {
257 if(key < 256 && isprint(key)) {
262 wr = (wr + 1) & CBUF_MASK;
263 if(wr == rd) { /* overflow */
264 rd = (rd + 1) & CBUF_MASK;
277 void mouse_orbit_update(float *theta, float *phi, float *dist)
279 static int prev_mx, prev_my;
280 static unsigned int prev_bmask;
283 if((mouse_bmask ^ prev_bmask) == 0) {
284 int dx = mouse_x - prev_mx;
285 int dy = mouse_y - prev_my;
288 if(mouse_bmask & MOUSE_BN_LEFT) {
297 if(mouse_bmask & MOUSE_BN_RIGHT) {
300 if(*dist < 0) *dist = 0;
308 prev_bmask = mouse_bmask;