grid axes
[gba_blender] / src / main.c
index f95428f..a519dc0 100644 (file)
@@ -36,7 +36,32 @@ static void handle_keys(void);
 extern struct { unsigned char r, g, b; } bgimg_cmap[];
 extern unsigned char bgimg_pixels[];
 
-static int32_t cam_theta, cam_phi;
+static int32_t cam_theta = 0x10000, cam_phi = -0x8000;
+
+static int show_obj = 1, show_del;
+
+#define AXIS0  0x10000
+#define AXIS1  0x80000
+
+static struct xvertex gridaxes[] = {
+       {AXIS0, 0, 0,   0, 0, 0, 92},
+       {AXIS1, 0, 0,   0, 0, 0, 92},
+       {-AXIS0, 0, 0,  0, 0, 0, 92},
+       {-AXIS1, 0, 0,  0, 0, 0, 92},
+       {0, 0, AXIS0,   0, 0, 0, 93},
+       {0, 0, AXIS1,   0, 0, 0, 93},
+       {0, 0, -AXIS0,  0, 0, 0, 93},
+       {0, 0, -AXIS1,  0, 0, 0, 93},
+
+       {0, 0, 0,               0, 0, 0, 92},
+       {AXIS1, 0, 0,   0, 0, 0, 92},
+       {0, 0, 0,               0, 0, 0, 92},
+       {-AXIS1, 0, 0,  0, 0, 0, 92},
+       {0, 0, 0,               0, 0, 0, 93},
+       {0, 0, AXIS1,   0, 0, 0, 93},
+       {0, 0, -0,              0, 0, 0, 93},
+       {0, 0, -AXIS1,  0, 0, 0, 93},
+};
 
 int main(void)
 {
@@ -66,16 +91,15 @@ int main(void)
                *cptr++ = r | (g << 5) | (b << 10);
        }
        for(i=0; i<128; i++) {
-               r = (rand() & 0xf) + 8;
-               g = (rand() & 0xf) + 8;
-               b = (rand() & 0xf) + 8;
-               *cptr++ = r | (g << 5) | (b << 10);
+               r = i / 5 + 6;
+               *cptr++ = r | (r << 5) | (r << 10);
        }
        memcpy(fbptr[0], bgimg_pixels, 240 * 160);
        memcpy(fbptr[1], bgimg_pixels, 240 * 160);
 
        xgl_init();
-       xgl_viewport(0, MENU_HEIGHT, 240, VP_HEIGHT);
+       xgl_viewport(0, 0, 240, VP_HEIGHT);
+       xgl_enable(XGL_LIGHTING);
 
        key_repeat(75, 75, KEY_LEFT | KEY_RIGHT | KEY_DOWN | KEY_UP);
 
@@ -89,10 +113,41 @@ int main(void)
                memset(fb, 14, 240 * VP_HEIGHT);
 
                xgl_load_identity();
-               xgl_translate(0, 0, 5 << 16);
+               xgl_translate(0, 0, 8 << 16);
                xgl_rotate_x(cam_phi);
                xgl_rotate_y(cam_theta);
-               xgl_draw(XGL_QUADS, cube, sizeof cube / sizeof *cube);
+
+               if(show_obj) {
+                       if(cam_theta < X_PI) {
+                               xgl_draw(XGL_LINES, gridaxes + 2, 2);   /* -X */
+                       } else {
+                               xgl_draw(XGL_LINES, gridaxes, 2);               /* +X */
+                       }
+                       if(cam_theta < X_HPI || cam_theta > (3 * X_HPI)) {
+                               xgl_draw(XGL_LINES, gridaxes + 4, 2);   /* +Z */
+                       } else {
+                               xgl_draw(XGL_LINES, gridaxes + 6, 2);   /* -Z */
+                       }
+
+                       if(show_obj == 1) {
+                               xgl_draw(XGL_QUADS, cube, sizeof cube / sizeof *cube);
+                       } else {
+                               xgl_draw(XGL_TRIANGLES, suzanne, sizeof suzanne / sizeof *suzanne);
+                       }
+
+                       if(cam_theta < X_PI) {
+                               xgl_draw(XGL_LINES, gridaxes, 2);               /* +X */
+                       } else {
+                               xgl_draw(XGL_LINES, gridaxes + 2, 2);   /* -X */
+                       }
+                       if(cam_theta < X_HPI || cam_theta > (3 * X_HPI)) {
+                               xgl_draw(XGL_LINES, gridaxes + 6, 2);   /* -Z */
+                       } else {
+                               xgl_draw(XGL_LINES, gridaxes + 4, 2);   /* +Z */
+                       }
+               } else {
+                       xgl_draw(XGL_LINES, gridaxes + 8, 8);
+               }
 
                wait_vblank();
                present(backbuf);
@@ -115,8 +170,26 @@ static void handle_keys(void)
        }
        if(KEYPRESS(KEY_LEFT)) {
                cam_theta += 0x2000;
+               if(cam_theta > X_2PI) cam_theta -= X_2PI;
        }
        if(KEYPRESS(KEY_RIGHT)) {
                cam_theta -= 0x2000;
+               if(cam_theta < 0) cam_theta += X_2PI;
+       }
+       if(KEYPRESS(KEY_RT)) {
+               if(++show_obj > 2) show_obj = 0;
+       }
+       if(KEYPRESS(KEY_LT)) {
+               if(--show_obj < 0) show_obj = 2;
+       }
+
+       if(KEYPRESS(KEY_A)) {
+               show_del ^= 1;
+       }
+       if(KEYPRESS(KEY_B)) {
+               if(show_del) {
+                       show_obj = 0;
+                       show_del = 0;
+               }
        }
 }