15 static int gamescr_start(void);
16 static void gamescr_stop(void);
17 static void gamescr_frame(void);
18 static void gamescr_vblank(void);
20 static void update(void);
21 static void draw(void);
23 static struct screen gamescr = {
31 static int nframes, num_vbl, backbuf;
32 static uint16_t *vram[] = { gba_vram_lfb0, gba_vram_lfb1 };
34 static int32_t pos[2], angle;
35 static struct voxscape *vox;
37 #define COLOR_HORIZON 0xcc77ff
38 #define COLOR_ZENITH 0x5588cc
42 struct screen *init_game_screen(void)
47 static int gamescr_start(void)
49 gba_setmode(4, DISPCNT_BG2 | DISPCNT_OBJ | DISPCNT_FB1);
53 if(!(vox = vox_create(512, 512))) {
54 panic(get_pc(), "vox_create");
56 vox_proj(vox, 45, 1, 250);
58 /*select_input(BN_DPAD | BN_LT | BN_RT);*/
64 static void gamescr_stop(void)
68 static void gamescr_frame(void)
72 backbuf = ++nframes & 1;
73 fb = (unsigned char*)vram[backbuf];
75 vox_framebuf(vox, 240, 160, fb, -1);
86 #define WALK_SPEED 0x40000
87 #define TURN_SPEED 0x100
89 static void update(void)
91 int32_t fwd[2], right[2];
94 input = ~REG_KEYINPUT;
96 if(input & BN_LT) angle += TURN_SPEED;
97 if(input & BN_RT) angle -= TURN_SPEED;
108 if(input & BN_DOWN) {
112 if(input & BN_RIGHT) {
116 if(input & BN_LEFT) {
121 vox_view(vox, pos[0], pos[1], -30, angle);
124 static void draw(void)
127 vox_sky_grad(vox, COLOR_HORIZON, COLOR_ZENITH);
131 __attribute__((noinline, target("arm"), section(".iwram")))
133 static void gamescr_vblank(void)