render-area tool sticky, cancel/redraw with esc
[retroray] / src / app.c
index e3af5ab..92759f6 100644 (file)
--- a/src/app.c
+++ b/src/app.c
@@ -23,11 +23,21 @@ along with this program.  If not, see <https://www.gnu.org/licenses/>.
 #include <time.h>
 #include "gaw/gaw.h"
 #include "app.h"
+#include "timer.h"
+#include "rend.h"
 #include "options.h"
 #include "font.h"
 #include "util.h"
+#include "rtk.h"
 
-static void txdraw(struct dtx_vertex *v, int vcount, struct dtx_pixmap *pixmap, void *cls);
+#ifdef GFX_SW
+#include "gaw/gaw_sw.h"
+#endif
+
+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);
 
 int mouse_x, mouse_y, mouse_state[3];
 unsigned int modkeys;
@@ -41,6 +51,10 @@ struct app_screen *cur_scr;
 
 struct font *uifont;
 
+uint32_t *framebuf;
+
+struct scene *scn;
+
 /* available screens */
 #define MAX_SCREENS    8
 static struct app_screen *screens[MAX_SCREENS];
@@ -51,12 +65,18 @@ int app_init(void)
 {
        int i;
        char *start_scr_name;
+       static rtk_draw_ops guigfx = {gui_fill, gui_blit, gui_drawtext, gui_textrect};
 
 #if !defined(NDEBUG) && defined(DBG_FPEXCEPT)
-       printf("floating point exceptions enabled\n");
+       infomsg("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);
@@ -64,14 +84,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;
@@ -84,7 +112,7 @@ int app_init(void)
                }
        }
 
-       time_msec = app_getmsec();
+       time_msec = get_msec();
 
        for(i=0; i<num_screens; i++) {
                if(screens[i]->name && start_scr_name && strcmp(screens[i]->name, start_scr_name) == 0) {
@@ -115,19 +143,43 @@ void app_shutdown(void)
 
        destroy_font(uifont);
        free(uifont);
+
+#ifdef GFX_SW
+       gaw_sw_destroy();
+#endif
+
+       free_scene(scn);
+
+       cleanup_logger();
 }
 
 void app_display(void)
 {
-       time_msec = app_getmsec();
+       time_msec = get_msec();
 
        cur_scr->display();
-
-       app_swap_buffers();
 }
 
 void app_reshape(int x, int y)
 {
+       int numpix = x * y;
+       int prev_numpix = win_width * win_height;
+
+       dbgmsg("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);
+                       return;
+               }
+               framebuf = tmp;
+       }
+#ifdef GFX_SW
+       gaw_sw_framebuffer(x, y, framebuf);
+#endif
+       dtx_target_raster((unsigned char*)framebuf, x, y);
+
        win_width = x;
        win_height = y;
        win_aspect = (float)x / (float)y;
@@ -140,14 +192,29 @@ void app_reshape(int x, int y)
 
 void app_keyboard(int key, int press)
 {
+       long msec;
+       static long prev_esc;
+
        if(press) {
                switch(key) {
 #ifdef DBG_ESCQUIT
                case 27:
-                       app_quit();
-                       return;
+                       msec = get_msec();
+                       if(msec - prev_esc < 1000) {
+                               app_quit();
+                               return;
+                       }
+                       prev_esc = msec;
+                       break;
 #endif
 
+               case 'q':
+                       if(modkeys & KEY_MOD_CTRL) {
+                               app_quit();
+                               return;
+                       }
+                       break;
+
                case '\n':
                case '\r':
                        if(modkeys & KEY_MOD_ALT) {
@@ -226,57 +293,46 @@ void app_chscr(struct app_screen *scr)
        cur_scr = scr;
 }
 
-static void txdraw(struct dtx_vertex *v, int vcount, struct dtx_pixmap *pixmap, void *cls)
+static void gui_fill(rtk_rect *rect, uint32_t color)
 {
-       /*
-       int i, aref, npix;
-       unsigned char *src, *dest;
-       struct texture *tex = pixmap->udata;
-
-       if(!tex) {
-               struct img_pixmap *img = img_create();
-               img_set_pixels(img, pixmap->width, pixmap->height, IMG_FMT_RGBA32, 0);
-
-               npix = pixmap->width * pixmap->height;
-               src = pixmap->pixels;
-               dest = img->pixels;
-               for(i=0; i<npix; i++) {
-                       dest[0] = dest[1] = dest[2] = 0xff;
-                       dest[3] = *src++;
-                       dest += 4;
-               }
+       int i, j;
+       uint32_t *fb = framebuf + rect->y * win_width + rect->x;
 
-               if(!(tex = tex_image(img))) {
-                       return;
+       for(i=0; i<rect->height; i++) {
+               for(j=0; j<rect->width; j++) {
+                       fb[j] = color;
                }
-               pixmap->udata = tex;
+               fb += win_width;
        }
+}
 
-       gaw_save();
-       if(dtx_get(DTX_GL_BLEND)) {
-               gaw_enable(GAW_BLEND);
-               gaw_blend_func(GAW_SRC_ALPHA, GAW_ONE_MINUS_SRC_ALPHA);
-       } else {
-               gaw_disable(GAW_BLEND);
-       }
-       if((aref = dtx_get(DTX_GL_ALPHATEST))) {
-               gaw_enable(GAW_ALPHA_TEST);
-               gaw_alpha_func(GAW_GREATER, aref);
-       } else {
-               gaw_disable(GAW_ALPHA_TEST);
+static void gui_blit(int x, int y, rtk_icon *icon)
+{
+       int i, j;
+       uint32_t *dest, *src;
+
+       dest = framebuf + y * win_width + x;
+       src = icon->pixels;
+
+       for(i=0; i<icon->height; i++) {
+               for(j=0; j<icon->width; j++) {
+                       int r = src[j] & 0xff;
+                       int g = (src[j] >> 8) & 0xff;
+                       int b = (src[j] >> 16) & 0xff;
+                       dest[j] = 0xff000000 | (r << 16) | (g << 8) | b;
+               }
+               dest += win_width;
+               src += icon->scanlen;
        }
+}
 
-       gaw_set_tex2d(tex->texid);
-
-       gaw_begin(GAW_TRIANGLES);
-       for(i=0; i<vcount; i++) {
-               gaw_texcoord2f(v->s, v->t);
-               gaw_vertex2f(v->x, v->y);
-               v++;
-       }
-       gaw_end();
+static void gui_drawtext(int x, int y, const char *str)
+{
+}
 
-       gaw_restore();
-       gaw_set_tex2d(0);
-       */
+static void gui_textrect(const char *str, rtk_rect *rect)
+{
+       rect->x = rect->y = 0;
+       rect->width = 20;
+       rect->height = 10;/* TODO */
 }