SIDX_ICON_X,
SIDX_ICON_Y,
SIDX_ICON_Z,
- SIDX_DIRTY,
+ SIDX_DIRTY
};
#define SIDX_ICONS_BASE SIDX_ICON_ZOOM
SNAM_ICON_X = SNAM_START + 32 * 8 + 26,
SNAM_ICON_Y = SNAM_ICON_X + 2,
SNAM_ICON_Z = SNAM_ICON_Y + 2,
- SNAM_DIRTY = SNAM_ICON_ORBIT + 4
+ SNAM_DIRTY = SNAM_ICON_ORBIT + 4,
+ SNAM_TIME0 = SNAM_START + 32 * 8,
+ SNAM_TIME1 = SNAM_TIME0 + 32 * 2
};
#define MENU_HEIGHT 17
extern unsigned char bgimg_pixels[];
static int32_t cam_theta = 0x10000, cam_phi = -0x8000;
+static int32_t cam_pan_x, cam_pan_y;
static int show_obj = 1, show_del;
static int32_t rot_matrix[16];
+static int pan_mode;
+
+static int snam_time[26];
+static int spos_time[104];
#define AXIS0 0x10000
#define AXIS1 0x80000
int main(void)
{
int i;
- int x, y;
+ int x, y, anm;
unsigned int nframes = 0, backbuf;
uint16_t *cptr;
unsigned char r, g, b;
REG_BLDCNT = BLDCNT_ALPHA | BLDCNT_B_BG2;
REG_BLDALPHA = 0x040c;
+ for(i=0; i<13; i++) {
+ snam_time[i] = SNAM_TIME0 + (i << 1);
+ snam_time[i + 13] = SNAM_TIME1 + (i << 1);
+ }
+ for(i=0; i<104; i++) {
+ int t = (i << 16) / 103;
+ spos_time[i] = (t * 223) >> 16;
+ }
+
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);
upd_rotation();
- key_repeat(75, 75, KEY_LEFT | KEY_RIGHT | KEY_DOWN | KEY_UP);
+ key_repeat(75, 75, KEY_LEFT | KEY_RIGHT | KEY_DOWN | KEY_UP | KEY_LT | KEY_RT);
/* every vblank, copy the shadow OAM automatically */
/*dma_copy16(3, (void*)OAM_ADDR, oam, sizeof oam / 2, DMACNT_VBLANK |
xgl_viewport(0, 0, 240, VP_HEIGHT);
xgl_load_identity();
- xgl_translate(0, 0, 8 << 16);
+ xgl_translate(-cam_pan_x, -cam_pan_y, 8 << 16);
xgl_mult_matrix(rot_matrix);
if(show_obj) {
/* small axes */
xgl_viewport(176, 2, 64, 32);
+ xgl_xyzzy();
xgl_draw(XGL_LINES, small_axes, 6);
xgl_transform(small_axes + 5, &x, &y);
xgl_transform(small_axes + 3, &x, &y);
set_sprite(oam, SIDX_ICONS_BASE + 5, SNAM_ICON_Y, x - 8, y + 8, 2, SPR_SZ16);
+ anm = (timer_msec >> 5) % 104;
+ set_sprite(oam, SIDX_TIME, snam_time[anm >> 2], spos_time[anm], 144, 5, SPR_SZ16);
+
wait_vblank();
present(backbuf);
dma_copy16(3, (void*)OAM_ADDR, oam, sizeof oam / 2, 0);
return 0;
}
+#define PAN_SPEED 0x4000
+
static void handle_keys(void)
{
update_keyb();
if(KEYPRESS(KEY_UP)) {
- cam_phi += 0x2000;
- if(cam_phi > X_HPI) cam_phi = X_HPI;
- upd_rotation();
+ if(pan_mode) {
+ cam_pan_y += PAN_SPEED;
+ if(cam_pan_y > 0x1c000) cam_pan_y = 0x1c000;
+ } else {
+ 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(pan_mode) {
+ cam_pan_y -= PAN_SPEED;
+ if(cam_pan_y < -0x1c000) cam_pan_y = -0x1c000;
+ } else {
+ 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(pan_mode) {
+ cam_pan_x -= PAN_SPEED;
+ if(cam_pan_x < -0x50000) cam_pan_x = -0x50000;
+ } else {
+ 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(pan_mode) {
+ cam_pan_x += PAN_SPEED;
+ if(cam_pan_x > 0x50000) cam_pan_x = 0x50000;
+ } else {
+ cam_theta -= 0x2000;
+ if(cam_theta < 0) cam_theta += X_2PI;
+ upd_rotation();
+ }
+ }
+
+ if(KEYPRESS(KEY_START)) {
+ pan_mode ^= 1;
}
+ if(KEYPRESS(KEY_SELECT)) {
+ if(show_obj) {
+ show_obj = ((show_obj - 1) ^ 1) + 1;
+ } else {
+ show_obj = 1;
+ }
+ }
+
if(KEYPRESS(KEY_RT)) {
- if(++show_obj > 2) show_obj = 0;
+ cam_pan_x += PAN_SPEED;
}
if(KEYPRESS(KEY_LT)) {
- if(--show_obj < 0) show_obj = 2;
+ cam_pan_x -= PAN_SPEED;
}
if(KEYPRESS(KEY_A)) {