X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fapp.c;h=d62ef606fb9946735dc374b40dd0737eea7540d3;hb=3c3612761bcf77a5c4ec6810aa47e0e3f0131bf1;hp=e3af5abb65559f0ce3d2fa7a85836c3a16165a96;hpb=60ca0807c066028fb144aea33da8e1f9cc94338e;p=retroray
diff --git a/src/app.c b/src/app.c
index e3af5ab..d62ef60 100644
--- a/src/app.c
+++ b/src/app.c
@@ -23,11 +23,21 @@ along with this program. If not, see .
#include
#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,27 +65,39 @@ 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
- load_options("retroray.cfg");
- app_resize(opt.xres, opt.yres);
+#ifdef GFX_SW
+ gaw_sw_init();
+#endif
+ rend_init();
+
app_vsync(opt.vsync);
if(opt.fullscreen) {
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 +110,7 @@ int app_init(void)
}
}
- time_msec = app_getmsec();
+ time_msec = get_msec();
for(i=0; iname && start_scr_name && strcmp(screens[i]->name, start_scr_name) == 0) {
@@ -115,19 +141,41 @@ 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;
+
+ 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;
@@ -136,18 +184,35 @@ void app_reshape(int x, int y)
if(cur_scr && cur_scr->reshape) {
cur_scr->reshape(x, y);
}
+
+ app_redisplay(0, 0, 0, 0);
}
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 +291,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; iy * win_width + rect->x;
- if(!(tex = tex_image(img))) {
- return;
+ for(i=0; iheight; i++) {
+ for(j=0; jwidth; 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; iheight; i++) {
+ for(j=0; jwidth; 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; is, 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 */
}