#include "3dgfx.h"
#include "music.h"
#include "cfgopt.h"
+#include "console.h"
#include "tinyfps.h"
#include "util.h"
int fb_width = FB_WIDTH;
int fb_height = FB_HEIGHT;
int fb_bpp = 16;
-uint16_t *fb_pixels, *vmem_back, *vmem_front;
+uint16_t *fb_pixels, *vmem;
unsigned long time_msec;
int mouse_x, mouse_y;
unsigned int mouse_bmask;
float sball_matrix[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
static unsigned long nframes;
-static int console_active;
+static int con_active;
+
+extern uint16_t loading_pixels[]; /* data.asm */
+
int demo_init(int argc, char **argv)
{
return -1;
}
+ /* reuse the loading image as our back buffer.
+ * adjust fb_pixels to leave 4 pixels guard band top/bottom. We have enough
+ * space since the loading image is 8 pixels taller.
+ */
+ fb_pixels = loading_pixels + 320 * 4;
+
+ con_init();
initFpsFonts();
if(g3d_init() == -1) {
scr_update();
scr_draw();
- draw_mouse_pointer(vmem_front);
-
++nframes;
}
+/* called by swap_buffers just before the actual swap */
+void demo_post_draw(void *pixels)
+{
+ if(opt.dbginfo) {
+ drawFps(pixels);
+ if(dbg_curscr_name) {
+ cs_dputs(pixels, dbg_curscr_name_pos, 240 - 16, dbg_curscr_name);
+ }
+ }
+ if(con_active) {
+ con_draw(pixels);
+ }
+
+ draw_mouse_pointer(pixels);
+}
#define DEST(x, y) dest[(y) * FB_WIDTH + (x)]
void draw_mouse_pointer(uint16_t *fb)
}
}
-static void change_screen(int idx)
+void cs_puts_font(cs_font_func csfont, int sz, void *fb, int x, int y, const char *str)
+{
+ while(*str) {
+ int c = *str++;
+
+ if(c > ' ' && c < 128) {
+ csfont(fb, x, y, c - ' ');
+ }
+ x += sz;
+ }
+}
+
+void change_screen(int idx)
{
printf("change screen %d\n", idx);
scr_change(scr_screen(idx), 4000);
}
-#define CBUF_SIZE 64
-#define CBUF_MASK (CBUF_SIZE - 1)
void demo_keyboard(int key, int press)
{
- static char cbuf[CBUF_SIZE];
- static int rd, wr;
- char inp[CBUF_SIZE + 1], *dptr;
- int i, nscr;
+ int nscr;
if(press) {
switch(key) {
case 27:
- demo_quit();
+ if(con_active) {
+ con_stop();
+ con_active = 0;
+ } else {
+ demo_quit();
+ }
return;
case 127:
return;
case '`':
- console_active = !console_active;
- if(console_active) {
- printf("> ");
- fflush(stdout);
+ con_active = !con_active;
+ if(con_active) {
+ con_start();
} else {
- putchar('\n');
+ con_stop();
}
return;
- case '\b':
- if(console_active) {
- if(wr != rd) {
- printf("\b \b");
- fflush(stdout);
- wr = (wr + CBUF_SIZE - 1) & CBUF_MASK;
- }
+ case '/':
+ if(!con_active) {
+ con_start();
+ con_active = con_input('/');
return;
}
- break;
-
- case '\n':
- case '\r':
- if(console_active) {
- dptr = inp;
- while(rd != wr) {
- *dptr++ = cbuf[rd];
- rd = (rd + 1) & CBUF_MASK;
- }
- *dptr = 0;
- if(inp[0]) {
- printf("\ntrying to match: %s\n", inp);
- nscr = scr_num_screens();
- for(i=0; i<nscr; i++) {
- if(strstr(scr_screen(i)->name, inp)) {
- change_screen(i);
- break;
- }
- }
- }
- console_active = 0;
+
+ default:
+ if(con_active) {
+ con_active = con_input(key);
return;
}
- break;
- default:
if(key >= '1' && key <= '9' && key <= '1' + scr_num_screens()) {
change_screen(key - '1');
+ return;
} else if(key == '0' && scr_num_screens() >= 10) {
change_screen(9);
- }
-
- if(console_active) {
- if(key < 256 && isprint(key)) {
- putchar(key);
- fflush(stdout);
-
- cbuf[wr] = key;
- wr = (wr + 1) & CBUF_MASK;
- if(wr == rd) { /* overflow */
- rd = (rd + 1) & CBUF_MASK;
- }
- }
return;
}
- break;
}
scr_keypress(key);