# HG changeset patch # User John Tsiombikas # Date 1379905104 -10800 # Node ID c6406e4aa0fb09cf97f29a9e4060306af9b17fca # Parent 03a0b307706a5b4f47027759d1d35fa30691e704 better input, fixed emulated code to work again diff -r 03a0b307706a -r c6406e4aa0fb dosemu/dosemu.c --- a/dosemu/dosemu.c Mon Sep 23 04:34:43 2013 +0300 +++ b/dosemu/dosemu.c Mon Sep 23 05:58:24 2013 +0300 @@ -8,10 +8,18 @@ #include "wvga.h" #include "conio.h" #include "mouse.h" +#include "keyb.h" #include "timer.h" static void proc_events(void); +static void init_sdl() +{ + if(!SDL_WasInit(SDL_INIT_EVERYTHING)) { + SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER); + } +} + /* ----- graphics (wvga.c implementation) ----- */ static SDL_Surface *fbsurf; static int scale = 1; @@ -39,16 +47,17 @@ sdl_flags |= SDL_FULLSCREEN; } + init_sdl(); + switch(mode) { case 0x13: - SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER); if(!(fbsurf = SDL_SetVideoMode(resx, resy, 8, sdl_flags))) { fprintf(stderr, "failed to set video mode\n"); abort(); } SDL_WM_SetCaption("Deepstone", 0); /*SDL_ShowCursor(0);*/ - SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + /*SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);*/ break; case 3: @@ -114,6 +123,25 @@ SDL_UnlockSurface(fbsurf); } SDL_Flip(fbsurf); + + + /* also print fps every second ... */ + { + static long prev_fps, num_frames; + long msec, dt; + + msec = get_msec(); + dt = msec - prev_fps; + if(dt >= 1000) { + float fps = (float)num_frames / ((float)dt / 1000.0f); + printf("framerate: %.1f \r", fps); + fflush(stdout); + num_frames = 0; + prev_fps = msec; + } else { + num_frames++; + } + } } void wait_vsync(void) @@ -124,6 +152,9 @@ static SDL_Event *keybev; static int mousex, mousey, bnmask; +static int keystate[256]; +static int num_pressed; + int kbhit(void) { if(!keybev) { @@ -147,12 +178,57 @@ return res; } +/* ----- improved event handling (keyb.h) ---- */ + +int kb_init(int bufsz) +{ + init_sdl(); + + return 0; +} + +void kb_shutdown(void) +{ +} + +int kb_getkey(void) +{ + int res = -1; + + proc_events(); + if(keybev) { + res = keybev->key.keysym.sym; + keybev = 0; + } + return res; +} + +int kb_isdown(int key) +{ + if(key == KB_ANY) { + return num_pressed; + } + return keystate[key]; +} + /* mouse handling (mouse.c implementation) */ +static unsigned long last_mouse_hide_time; + int have_mouse(void) { return 1; } +void set_mouse(int x, int y) +{ + SDL_ShowCursor(0); + last_mouse_hide_time = get_msec(); + + SDL_WarpMouse(x * scale, y * scale); + mousex = x; + mousey = y; +} + int read_mouse(int *xp, int *yp) { if(xp) *xp = mousex; @@ -164,11 +240,40 @@ { static SDL_Event ev; + if(last_mouse_hide_time > 0 && get_msec() - last_mouse_hide_time > 3000) { + last_mouse_hide_time = 0; + SDL_ShowCursor(1); + } + while(SDL_PollEvent(&ev)) { switch(ev.type) { case SDL_KEYDOWN: - keybev = &ev; - return; + { + int key = ev.key.keysym.sym; + + if(!keybev) { + keybev = &ev; + } + + if(!keystate[key]) { + keystate[key] = 1; + num_pressed++; + } + } + break; + + case SDL_KEYUP: + { + int key = ev.key.keysym.sym; + + if(keystate[key]) { + keystate[key] = 0; + if(--num_pressed < 0) { + num_pressed = 0; + } + } + } + break; case SDL_MOUSEMOTION: mousex = ev.motion.x / scale; @@ -214,15 +319,18 @@ void init_timer(int res_hz) { + init_sdl(); reset_timer(); } void reset_timer(void) { start_time = SDL_GetTicks(); + printf("resetting timer: %u, %lu\n", start_time, get_msec()); } unsigned long get_msec(void) { - return (unsigned long)(SDL_GetTicks() - start_time); + Uint32 ticks = SDL_GetTicks(); + return (unsigned long)(ticks - start_time); } diff -r 03a0b307706a -r c6406e4aa0fb src/main.c --- a/src/main.c Mon Sep 23 04:34:43 2013 +0300 +++ b/src/main.c Mon Sep 23 05:58:24 2013 +0300 @@ -16,9 +16,9 @@ static int init(void); static void shutdown(void); +static void update(unsigned long dtmsec); static void redraw(void); static int proc_events(void); -static int proc_keyb_input(void); static void mouse_button(int bn, int x, int y); static void mouse_motion(int x, int y); static void sighandler(int s); @@ -27,14 +27,10 @@ static float cam_x, cam_y, cam_z; static float cam_theta, cam_phi; -static float walk_speed = 0.5; +static float walk_speed = 6.0; static float look_speed = 1.0; -#ifdef __DOS__ static int mouse_look = 1; -#else -static int mouse_look = 0; -#endif static void *fbuf; static struct scene scn; @@ -42,11 +38,22 @@ int main(void) { + unsigned long prev_msec = 0; + if(init() == -1) { return 1; } - while(proc_events()) { + for(;;) { + unsigned long msec = get_msec(); + unsigned long dt = msec - prev_msec; + prev_msec = msec; + + if(!proc_events()) { + break; + } + + update(dt); redraw(); } @@ -57,11 +64,10 @@ static int init(void) { - float vfov, hfov, aspect; + float vfov, aspect; aspect = 320.0 / 200.0; vfov = 60.0; - hfov = vfov * aspect; init_timer(100); kb_init(16); /* 16 characters input buffer */ @@ -129,6 +135,33 @@ kb_shutdown(); } + +#define DEG_TO_RAD(x) (M_PI * (x) / 180.0) +void cam_move(float dx, float dy) +{ + float angle = DEG_TO_RAD(cam_theta); + cam_x += cos(angle) * dx + sin(angle) * dy; + cam_z -= -sin(angle) * dx + cos(angle) * dy; +} + +static void update(unsigned long dtmsec) +{ + float dt = (float)dtmsec / 1000.0f; + float offs = walk_speed * dt; + + if(kb_isdown('w') || kb_isdown('W')) + cam_move(0, offs); + + if(kb_isdown('s') || kb_isdown('S')) + cam_move(0, -offs); + + if(kb_isdown('a') || kb_isdown('A')) + cam_move(-offs, 0); + + if(kb_isdown('d') || kb_isdown('D')) + cam_move(offs, 0); +} + static void redraw(void) { mgl_clear(0); @@ -150,39 +183,11 @@ copy_frame(fbuf); } -#define DEG_TO_RAD(x) (M_PI * (x) / 180.0) -void cam_move(float dx, float dy) -{ - float angle = DEG_TO_RAD(cam_theta); - cam_x += cos(angle) * dx + sin(angle) * dy; - cam_z -= -sin(angle) * dx + cos(angle) * dy; -} - static int proc_events(void) { static int prev_mx, prev_my, prev_bnmask; - int mx, my, bnmask, key; + int mx, my, bnmask; - if(!proc_keyb_input()) { - return 0; - } - - bnmask = read_mouse(&mx, &my); - if(bnmask != prev_bnmask) { - mouse_button(bnmask, mx, my); - prev_bnmask = bnmask; - } - if(mx != prev_mx || my != prev_my) { - mouse_motion(mx, my); - prev_mx = mx; - prev_my = my; - } - return 1; -} - -static int proc_keyb_input(void) -{ - /* first examine all keypresses and handle non-movement keys */ int key; while((key = kb_getkey()) != -1) { switch(key) { @@ -198,19 +203,16 @@ } } - /* for the movement keys we just care if they are pressed at the moment */ - if(kb_isdown('w') || kb_isdown('W')) - cam_move(0, walk_speed); - - if(kb_isdown('s') || kb_isdown('S')) - cam_move(0, -walk_speed); - - if(kb_isdown('a') || kb_isdown('A')) - cam_move(-walk_speed, 0); - - if(kb_isdown('d') || kb_isdown('D')) - cam_move(walk_speed, 0); - + bnmask = read_mouse(&mx, &my); + if(bnmask != prev_bnmask) { + mouse_button(bnmask, mx, my); + prev_bnmask = bnmask; + } + if(mx != prev_mx || my != prev_my) { + mouse_motion(mx, my); + prev_mx = mx; + prev_my = my; + } return 1; }