17 #define MOUSE_TIMEOUT 1200
22 int fb_width, fb_height, fb_bpp, fb_scan_size;
24 long fb_size, fb_buf_size;
25 uint16_t *fb_pixels, *vmem;
28 unsigned long time_msec;
30 unsigned int mouse_bmask;
32 static struct au_module *mod;
34 float sball_matrix[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
36 static unsigned long last_mouse_move;
37 static int prev_mx, prev_my, mouse_dx, mouse_dy;
38 static unsigned int bmask_diff, prev_bmask;
40 static unsigned long nframes;
41 static int con_active;
43 extern uint16_t loading_pixels[]; /* data.asm */
45 int demo_init(int argc, char **argv)
47 if(demo_init1(argc, argv) == -1) {
50 if(demo_init2() == -1) {
56 static struct screen *scr;
58 int demo_init1(int argc, char **argv)
62 if(load_config("demo.cfg") == -1) {
65 if((env = getenv("START_SCR"))) {
68 if(parse_args(argc, argv) == -1) {
76 /* reuse the loading image as our back buffer.
77 * adjust fb_pixels to leave 4 pixels guard band top/bottom. We have enough
78 * space since the loading image is 8 pixels taller.
80 fb_pixels = loading_pixels + 320 * 4;
85 if(g3d_init() == -1) {
88 g3d_framebuffer(FB_WIDTH, FB_HEIGHT, fb_pixels);
91 if(!(mod = au_load_module("data/test.mod"))) {
96 if(scr_init() == -1) {
100 scr = scr_lookup(opt.start_scr);
105 if(!scr || scr_change(scr, 4000) == -1) {
106 fprintf(stderr, "screen %s not found\n", opt.start_scr ? opt.start_scr : "0");
110 /* clear the framebuffer at least once */
111 memset(fb_pixels, 0, FB_WIDTH * FB_HEIGHT * FB_BPP / CHAR_BIT);
119 void demo_cleanup(void)
128 float fps = (float)nframes / ((float)time_msec / 1000.0f);
129 printf("average framerate: %.1f\n", fps);
133 int demo_resizefb(int width, int height, int bpp)
135 int newsz, new_scansz;
137 if(!width || !height || !bpp) {
139 fb_buf = fb_pixels = 0;
140 fb_size = fb_buf_size = fb_scan_size = 0;
141 fb_width = fb_height = fb_bpp = 0;
145 new_scansz = ((width + GUARD_XPAD * 2) * bpp + 7) / 8;
146 newsz = (height + GUARD_YPAD * 2) * new_scansz;
148 if(!fb_buf || newsz > fb_buf_size) {
149 void *tmp = malloc(newsz);
157 fb_scan_size = new_scansz;
158 fb_pixels = (uint16_t*)((char*)fb_buf + GUARD_YPAD * fb_scan_size + (GUARD_XPAD * bpp + 7) / 8);
162 fb_size = fb_scan_size * fb_height;
164 fb_aspect = (float)fb_width / (float)fb_height;
173 mouse_dx = mouse_x - prev_mx;
174 mouse_dy = mouse_y - prev_my;
177 bmask_diff = mouse_bmask ^ prev_bmask;
178 prev_bmask = mouse_bmask;
179 if(mouse_dx | mouse_dy) {
180 last_mouse_move = time_msec;
193 /* called by swap_buffers just before the actual swap */
194 void demo_post_draw(void *pixels)
199 if(dbg_curscr_name) {
200 cs_dputs(pixels, dbg_curscr_name_pos, 240 - 16, dbg_curscr_name);
208 if(opt.mouse && time_msec - last_mouse_move < MOUSE_TIMEOUT) {
209 cs_mouseptr(pixels, mouse_x, mouse_y);
213 void cs_puts_font(cs_font_func csfont, int sz, void *fb, int x, int y, const char *str)
218 if(c > ' ' && c < 128) {
219 csfont(fb, x, y, c - ' ');
225 void change_screen(int idx)
227 printf("change screen %d\n", idx);
228 scr_change(scr_screen(idx), 4000);
231 void demo_keyboard(int key, int press)
251 con_active = !con_active;
262 con_active = con_input('/');
268 con_active = con_input(key);
272 if(key >= '1' && key <= '9' && key <= '1' + scr_num_screens()) {
273 change_screen(key - '1');
275 } else if(key == '0' && scr_num_screens() >= 10) {
286 void mouse_orbit_update(float *theta, float *phi, float *dist)
289 if(bmask_diff == 0) {
291 if(mouse_dx | mouse_dy) {
292 if(mouse_bmask & MOUSE_BN_LEFT) {
294 *theta += mouse_dx * 1.0;
301 if(mouse_bmask & MOUSE_BN_RIGHT) {
302 *dist += mouse_dy * 0.5;
304 if(*dist < 0) *dist = 0;