X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fgamescr.c;h=96620f3d1ac1d1897107c9dba777c2fa54c633ad;hb=097d03fa2406fca819b27b698ffb1cfc8ac445c2;hp=cacb40deafeafbe2ed837acb3a83222c07dae3ce;hpb=f57fab6afe62f2a476ef4afa1842c81722816451;p=gbajam22 diff --git a/src/gamescr.c b/src/gamescr.c index cacb40d..96620f3 100644 --- a/src/gamescr.c +++ b/src/gamescr.c @@ -6,27 +6,81 @@ #include "util.h" #include "intr.h" #include "input.h" +#include "player.h" #include "sprite.h" #include "debug.h" +#include "level.h" +#include "xgl.h" +#include "polyfill.h" +static void update(void); static void draw(void); static void vblank(void); static int nframes, num_vbl, backbuf; static uint16_t *vram[] = { (uint16_t*)VRAM_LFB_FB0_ADDR, (uint16_t*)VRAM_LFB_FB1_ADDR }; -static uint16_t bnstate; + +static const char *testlvl = + "################\n" + "################\n" + "################\n" + "################\n" + "################\n" + "####### s#####\n" + "####### ########\n" + "####### #####\n" + "###### #####\n" + "###### #####\n" + "###### #####\n" + "###### ### #####\n" + "###### ### #####\n" + "###### #####\n" + "######## #######\n" + "################\n" + "################\n" + "################\n" + "################\n" + "################\n"; + +static struct xvertex tm_floor[] __attribute__((section(".rodata"))) = { + {0x10000, -0x10000, 0x10000, 0, 0x10000, 0, 210}, + {-0x10000, -0x10000, 0x10000, 0, 0x10000, 0, 210}, + {-0x10000, -0x10000, -0x10000, 0, 0x10000, 0, 210}, + {0x10000, -0x10000, -0x10000, 0, 0x10000, 0, 210} +}; + + +static struct level *lvl; + +static struct player player; void gamescr(void) { int i; + unsigned char *fb; + uint16_t *cmap; REG_DISPCNT = 4 | DISPCNT_BG2 | DISPCNT_OBJ | DISPCNT_FB1; - vblperf_setcolor(0xff);//192); + vblperf_setcolor(1); + + lvl = init_level(testlvl); + + xgl_init(); + + init_player(&player, lvl); + player.phi = 0x100; + + cmap = (uint16_t*)CRAM_BG_ADDR; + *cmap++ = 0; + for(i=1; i<255; i++) { + *cmap++ = rand(); + } + *cmap = 0xffff; + - fillblock_16byte(vram[0], 0xffffffff, 240 * 160 / 16); - fillblock_16byte(vram[1], 0xffffffff, 240 * 160 / 16); + select_input(BN_DPAD | BN_A | BN_B); mask(INTR_VBLANK); screen_vblank = vblank; @@ -35,9 +89,12 @@ void gamescr(void) nframes = 0; for(;;) { backbuf = ++nframes & 1; + fb = (unsigned char*)vram[backbuf]; - bnstate = ~REG_KEYINPUT; + polyfill_framebuffer(fb, 240, 160); + fillblock_16byte(fb, 0, 240 * 160 / 16); + update(); draw(); vblperf_end(); @@ -47,18 +104,39 @@ void gamescr(void) } } +static void update(void) +{ + uint16_t bnstate; + + bnstate = get_input(); + + player_input(&player, bnstate); + + upd_vis(lvl, &player); +} + static void draw(void) { - int i, j; - uint16_t pix; - uint16_t *fb = vram[backbuf]; - - for(i=0; i<160; i++) { - for(j=0; j<240/2; j++) { - pix = ((i^j) << 1) & 0xff; - pix |= (i^j) << 9; - *fb++ = pix; - } + int i, x, y; + struct cell *cell; + + xgl_load_identity(); + /*xgl_translate(0, 0, 0x100000);*/ + xgl_rotate_x(player.phi); + xgl_rotate_y(player.theta); + xgl_translate(player.x, 0, player.y); + + for(i=0; inumvis; i++) { + cell = lvl->vis[i]; + + x = (int32_t)(cell->x - player.cx) << 17; + y = -(int32_t)(cell->y - player.cy) << 17; + + xgl_push_matrix(); + xgl_translate(x, 0, y); + xgl_index(i + 1); + xgl_draw(XGL_QUADS, tm_floor, sizeof tm_floor / sizeof *tm_floor); + xgl_pop_matrix(); } }