enum {
SIDX_DEL0, SIDX_DEL1, SIDX_DEL2,
SIDX_TIME,
- SIDX_ICONS_BASE
+ SIDX_ICON_ZOOM,
+ SIDX_ICON_PAN,
+ SIDX_ICON_ORBIT,
+ SIDX_ICON_X,
+ SIDX_ICON_Y,
+ SIDX_ICON_Z,
+ SIDX_DIRTY,
};
+#define SIDX_ICONS_BASE SIDX_ICON_ZOOM
+
#define SNAM_START 512
enum {
SNAM_DEL0 = SNAM_START,
SNAM_ICON_ORBIT = SNAM_START + 32 * 4 + 24, /* for tiles down, 24 across */
SNAM_ICON_X = SNAM_START + 32 * 8 + 26,
SNAM_ICON_Y = SNAM_ICON_X + 2,
- SNAM_ICON_Z = SNAM_ICON_Y + 2
+ SNAM_ICON_Z = SNAM_ICON_Y + 2,
+ SNAM_DIRTY = SNAM_ICON_ORBIT + 4
};
#define MENU_HEIGHT 17
#define VP_HEIGHT (160 - MENU_HEIGHT - TRACK_HEIGHT)
static void handle_keys(void);
+static void upd_rotation(void);
static void show_msgbox(int en);
extern struct { unsigned char r, g, b; } bgimg_cmap[];
static int32_t cam_theta = 0x10000, cam_phi = -0x8000;
static int show_obj = 1, show_del;
+static int32_t rot_matrix[16];
#define AXIS0 0x10000
#define AXIS1 0x80000
+#define AXIS3 0x2c000
static struct xvertex gridaxes[] = {
{AXIS0, 0, 0, 0, 0, 0, 92},
{0, 0, -AXIS1, 0, 0, 0, 93},
};
-#define MAX_SIDX 8
+static struct xvertex small_axes[] = {
+ {0, 0, 0, 0, 0, 0, 92},
+ {AXIS3, 0, 0, 0, 0, 0, 92},
+ {0, 0, 0, 0, 0, 0, 93},
+ {0, 0, AXIS3, 0, 0, 0, 93},
+ {0, 0, 0, 0, 0, 0, 94},
+ {0, AXIS3, 0, 0, 0, 0, 94}
+};
+
+#define MAX_SIDX 16
static uint16_t oam[4 * MAX_SIDX];
int main(void)
{
int i;
+ int x, y;
unsigned int nframes = 0, backbuf;
uint16_t *cptr;
unsigned char r, g, b;
REG_BLDCNT = BLDCNT_ALPHA | BLDCNT_B_BG2;
REG_BLDALPHA = 0x040c;
- set_sprite(oam, SIDX_ICONS_BASE, SNAM_ICON_ZOOM, 213, 57, 4, SPR_SZ32);
- set_sprite(oam, SIDX_ICONS_BASE + 1, SNAM_ICON_PAN, 213, 81, 4, SPR_SZ32);
- set_sprite(oam, SIDX_ICONS_BASE + 2, SNAM_ICON_ORBIT, 213, 103, 4, SPR_SZ32);
+ set_sprite(oam, SIDX_ICONS_BASE, SNAM_ICON_ZOOM, 213, 57, 4, SPR_SZ32 | SPR_BLEND);
+ set_sprite(oam, SIDX_ICONS_BASE + 1, SNAM_ICON_PAN, 213, 81, 4, SPR_SZ32 | SPR_BLEND);
+ set_sprite(oam, SIDX_ICONS_BASE + 2, SNAM_ICON_ORBIT, 213, 103, 4, SPR_SZ32 | SPR_BLEND);
+ set_sprite(oam, SIDX_DIRTY, SNAM_DIRTY, 192, 9, 4, SPR_SZ16 | SPR_HRECT);
xgl_init();
- xgl_viewport(0, 0, 240, VP_HEIGHT);
xgl_enable(XGL_LIGHTING);
+ upd_rotation();
+
key_repeat(75, 75, KEY_LEFT | KEY_RIGHT | KEY_DOWN | KEY_UP);
/* every vblank, copy the shadow OAM automatically */
fb = fbptr[backbuf] + 240 * MENU_HEIGHT;
polyfill_framebuffer(fb, 240, VP_HEIGHT);
- //memset(fb, 14, 240 * VP_HEIGHT);
dma_fill16(3, fb, 0x0e0e, 240 * VP_HEIGHT / 2);
+ xgl_viewport(0, 0, 240, VP_HEIGHT);
xgl_load_identity();
xgl_translate(0, 0, 8 << 16);
- xgl_rotate_x(cam_phi);
- xgl_rotate_y(cam_theta);
+ xgl_mult_matrix(rot_matrix);
if(show_obj) {
if(cam_theta < X_PI) {
xgl_draw(XGL_LINES, gridaxes + 8, 8);
}
+ /* small axes */
+ xgl_viewport(176, 2, 64, 32);
+ xgl_draw(XGL_LINES, small_axes, 6);
+
+ xgl_transform(small_axes + 5, &x, &y);
+ set_sprite(oam, SIDX_ICONS_BASE + 3, SNAM_ICON_Z, x - 8, y + 8, 3, SPR_SZ16);
+ xgl_transform(small_axes + 1, &x, &y);
+ set_sprite(oam, SIDX_ICONS_BASE + 4, SNAM_ICON_X, x - 8, y + 8, 1, SPR_SZ16);
+ xgl_transform(small_axes + 3, &x, &y);
+ set_sprite(oam, SIDX_ICONS_BASE + 5, SNAM_ICON_Y, x - 8, y + 8, 2, SPR_SZ16);
+
wait_vblank();
present(backbuf);
dma_copy16(3, (void*)OAM_ADDR, oam, sizeof oam / 2, 0);
if(KEYPRESS(KEY_UP)) {
cam_phi += 0x2000;
if(cam_phi > X_HPI) cam_phi = X_HPI;
+ upd_rotation();
}
if(KEYPRESS(KEY_DOWN)) {
cam_phi -= 0x2000;
if(cam_phi < -X_HPI) cam_phi = -X_HPI;
+ upd_rotation();
}
if(KEYPRESS(KEY_LEFT)) {
cam_theta += 0x2000;
if(cam_theta > X_2PI) cam_theta -= X_2PI;
+ upd_rotation();
}
if(KEYPRESS(KEY_RIGHT)) {
cam_theta -= 0x2000;
if(cam_theta < 0) cam_theta += X_2PI;
+ upd_rotation();
}
if(KEYPRESS(KEY_RT)) {
if(++show_obj > 2) show_obj = 0;
}
}
+static void upd_rotation(void)
+{
+ xgl_load_identity();
+ xgl_rotate_x(cam_phi);
+ xgl_rotate_y(cam_theta);
+ xgl_get_matrix(rot_matrix);
+}
+
static void show_msgbox(int en)
{
int i;