add relative mouse handling in mouse.asm
[retroray] / src / app.c
index fdcbe11..87f3a10 100644 (file)
--- a/src/app.c
+++ b/src/app.c
@@ -23,6 +23,7 @@ along with this program.  If not, see <https://www.gnu.org/licenses/>.
 #include <time.h>
 #include "gaw/gaw.h"
 #include "app.h"
+#include "rend.h"
 #include "options.h"
 #include "font.h"
 #include "util.h"
@@ -36,7 +37,6 @@ static void gui_fill(rtk_rect *rect, uint32_t color);
 static void gui_blit(int x, int y, rtk_icon *icon);
 static void gui_drawtext(int x, int y, const char *str);
 static void gui_textrect(const char *str, rtk_rect *rect);
-static void txdraw(struct dtx_vertex *v, int vcount, struct dtx_pixmap *pixmap, void *cls);
 
 int mouse_x, mouse_y, mouse_state[3];
 unsigned int modkeys;
@@ -52,6 +52,7 @@ struct font *uifont;
 
 uint32_t *framebuf;
 
+struct scene *scn;
 
 /* available screens */
 #define MAX_SCREENS    8
@@ -65,13 +66,16 @@ int app_init(void)
        char *start_scr_name;
        static rtk_draw_ops guigfx = {gui_fill, gui_blit, gui_drawtext, gui_textrect};
 
-       init_logger();
-
 #if !defined(NDEBUG) && defined(DBG_FPEXCEPT)
        printf("floating point exceptions enabled\n");
        enable_fpexcept();
 #endif
 
+#ifdef GFX_SW
+       gaw_sw_init();
+#endif
+       rend_init();
+
        load_options("retroray.cfg");
        app_resize(opt.xres, opt.yres);
        app_vsync(opt.vsync);
@@ -79,16 +83,22 @@ int app_init(void)
                app_fullscreen(1);
        }
 
-       dtx_target_user(txdraw, 0);
+       /*dtx_target_user(txdraw, 0);*/
+       dtx_target_raster((unsigned char*)framebuf, win_width, win_height);
+       dtx_set(DTX_RASTER_THRESHOLD, 127);
 
        uifont = malloc_nf(sizeof *uifont);
-       if(load_font(uifont, "data/uifont12.gmp") == -1) {
+       if(load_font(uifont, "data/uifont14.gmp") == -1) {
                free(uifont);
                return -1;
        }
 
        rtk_setup(&guigfx);
 
+       if(!(scn = create_scene())) {
+               return -1;
+       }
+
        /* initialize screens */
        screens[num_screens++] = &scr_model;
        screens[num_screens++] = &scr_rend;
@@ -133,6 +143,12 @@ void app_shutdown(void)
        destroy_font(uifont);
        free(uifont);
 
+#ifdef GFX_SW
+       gaw_sw_destroy();
+#endif
+
+       free_scene(scn);
+
        cleanup_logger();
 }
 
@@ -141,8 +157,6 @@ void app_display(void)
        time_msec = app_getmsec();
 
        cur_scr->display();
-
-       app_swap_buffers();
 }
 
 void app_reshape(int x, int y)
@@ -150,7 +164,9 @@ void app_reshape(int x, int y)
        int numpix = x * y;
        int prev_numpix = win_width * win_height;
 
-       if(numpix > prev_numpix) {
+       printf("reshape(%d, %d)\n", x, y);
+
+       if(!framebuf || numpix > prev_numpix) {
                void *tmp;
                if(!(tmp = realloc(framebuf, numpix * sizeof *framebuf))) {
                        errormsg("failed to resize framebuffer to %dx%d\n", x, y);
@@ -161,6 +177,7 @@ void app_reshape(int x, int y)
 #ifdef GFX_SW
        gaw_sw_framebuffer(x, y, framebuf);
 #endif
+       dtx_target_raster((unsigned char*)framebuf, x, y);
 
        win_width = x;
        win_height = y;
@@ -182,6 +199,13 @@ void app_keyboard(int key, int press)
                        return;
 #endif
 
+               case 'q':
+                       if(modkeys & KEY_MOD_CTRL) {
+                               app_quit();
+                               return;
+                       }
+                       break;
+
                case '\n':
                case '\r':
                        if(modkeys & KEY_MOD_ALT) {
@@ -303,7 +327,3 @@ static void gui_textrect(const char *str, rtk_rect *rect)
        rect->width = 20;
        rect->height = 10;/* TODO */
 }
-
-static void txdraw(struct dtx_vertex *v, int vcount, struct dtx_pixmap *pixmap, void *cls)
-{
-}