17 static int gamescr_start(void);
18 static void gamescr_stop(void);
19 static void gamescr_frame(void);
21 static void update(void);
22 static void draw(void);
24 static struct screen gamescr = {
32 static int nframes, num_vbl, backbuf;
33 static uint16_t *vram[] = { gba_vram_lfb0, gba_vram_lfb1 };
35 static int32_t pos[2], angle;
36 static struct voxscape *vox;
38 #define COLOR_HORIZON 0x7dd9
39 #define COLOR_ZENITH 0x662a
43 struct screen *init_game_screen(void)
48 static int gamescr_start(void)
50 gba_setmode(5, DISPCNT_BG2 | DISPCNT_OBJ | DISPCNT_FB1);
54 pos[0] = pos[1] = VOX_SZ << 15;
56 if(!(vox = vox_create(VOX_SZ, VOX_SZ, height_pixels, color_pixels))) {
57 panic(get_pc(), "vox_create");
59 vox_proj(vox, 45, 2, VOX_SZ / 5);
65 static void gamescr_stop(void)
69 static void gamescr_frame(void)
73 backbuf = ++nframes & 1;
74 fb = (unsigned char*)vram[backbuf];
76 vox_framebuf(vox, 160, 128, fb, -1);
86 emuprint("vbl: %d", vblperf_count);
95 #define WALK_SPEED 0x40000
96 #define TURN_SPEED 0x200
98 static void update(void)
100 int32_t fwd[2], right[2];
103 if((input = read_input())) {
105 if(input & BN_LT) angle += TURN_SPEED;
106 if(input & BN_RT) angle -= TURN_SPEED;
108 fwd[0] = -SIN(angle);
117 if(input & BN_DOWN) {
121 if(input & BN_RIGHT) {
125 if(input & BN_LEFT) {
130 vox_view(vox, pos[0], pos[1], -30, angle);
134 static void draw(void)
137 vox_sky_grad(vox, COLOR_HORIZON, COLOR_ZENITH);
138 //vox_sky_solid(vox, COLOR_ZENITH);