Demo code for basic 3D graphics on the MBED application shield's LCD (K64F). Left pot changes Z depth, joystick rotates one of the cubes.

Dependencies:   C12832 FXOS8700CQ gfx3d mbed

Committer:
co657_frmb
Date:
Sat Nov 28 01:42:18 2015 +0000
Revision:
2:297b43e931d0
Parent:
1:3810f9d9c775
Child:
3:23a93f2f8cac
More updates / debugging.  Joystick rotates 1 cube, left-pot Z depth (some stuff will crash at edges currently).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
co657_frmb 0:fe1c42b7b490 1 /*
co657_frmb 0:fe1c42b7b490 2 * co657_lcdplay (main.cpp): playing with the MBED shield's LCD
co657_frmb 0:fe1c42b7b490 3 * Copyright (C) 2015 Fred Barnes, University of Kent <frmb@kent.ac.uk>
co657_frmb 0:fe1c42b7b490 4 */
co657_frmb 0:fe1c42b7b490 5
co657_frmb 0:fe1c42b7b490 6 #include "mbed.h"
co657_frmb 0:fe1c42b7b490 7 #include "C12832.h"
co657_frmb 0:fe1c42b7b490 8 #include "FXOS8700CQ.h"
co657_frmb 0:fe1c42b7b490 9
co657_frmb 0:fe1c42b7b490 10 #include "gfx3d.h"
co657_frmb 2:297b43e931d0 11 #include "g3d_textures.h"
co657_frmb 0:fe1c42b7b490 12
co657_frmb 2:297b43e931d0 13 // #define BENCHMARK
co657_frmb 0:fe1c42b7b490 14
co657_frmb 0:fe1c42b7b490 15 /* some global objects */
co657_frmb 0:fe1c42b7b490 16 Serial host (USBTX, USBRX);
co657_frmb 0:fe1c42b7b490 17
co657_frmb 0:fe1c42b7b490 18 C12832 shld_lcd (D11, D13, D12, D7, D10); /* LCD on the shield (128x32) */
co657_frmb 0:fe1c42b7b490 19
co657_frmb 0:fe1c42b7b490 20 FXOS8700CQ fxos (PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); /* On-board accelerometer: SDA, SCL, (addr << 1) */
co657_frmb 0:fe1c42b7b490 21
co657_frmb 2:297b43e931d0 22 InterruptIn sw2_int (PTC6); /* SW2 (also unused interrupt for FXOS8700CQ) */
co657_frmb 0:fe1c42b7b490 23 InterruptIn fxos_int2 (PTC13); /* should just be the Data-Ready interrupt */
co657_frmb 0:fe1c42b7b490 24 InterruptIn sw3_int (PTA4); /* switch SW3 */
co657_frmb 0:fe1c42b7b490 25
co657_frmb 2:297b43e931d0 26 InterruptIn joy_up (PTB10);
co657_frmb 2:297b43e931d0 27 InterruptIn joy_down (PTB11);
co657_frmb 2:297b43e931d0 28 InterruptIn joy_left (PTC11);
co657_frmb 2:297b43e931d0 29 InterruptIn joy_right (PTC10);
co657_frmb 2:297b43e931d0 30 InterruptIn joy_fire (PTB23);
co657_frmb 0:fe1c42b7b490 31
co657_frmb 2:297b43e931d0 32 #define FRAME_RATE_FPS (40) /* how fast we want it to go */
co657_frmb 2:297b43e931d0 33 #define FRAME_RATE_US (1000000 / FRAME_RATE_FPS)
co657_frmb 0:fe1c42b7b490 34 Ticker frametimer; /* timer that will be used to update frames and whatnot */
co657_frmb 0:fe1c42b7b490 35
co657_frmb 2:297b43e931d0 36 AnalogIn shld_pot1 (A0);
co657_frmb 2:297b43e931d0 37 AnalogIn shld_pot2 (A1);
co657_frmb 2:297b43e931d0 38
co657_frmb 2:297b43e931d0 39
co657_frmb 0:fe1c42b7b490 40 #ifdef BENCHMARK
co657_frmb 0:fe1c42b7b490 41 Timer perftimer;
co657_frmb 0:fe1c42b7b490 42 #endif
co657_frmb 0:fe1c42b7b490 43
co657_frmb 0:fe1c42b7b490 44 #define PFLAG_TIMER (0x01) /* next frame please */
co657_frmb 0:fe1c42b7b490 45 #define PFLAG_FXOS (0x02) /* accel/magno data ready */
co657_frmb 2:297b43e931d0 46 #define PFLAG_JOY (0x04) /* joystick activity */
co657_frmb 2:297b43e931d0 47
co657_frmb 2:297b43e931d0 48 #define JOY_NONE (0x00)
co657_frmb 2:297b43e931d0 49 #define JOY_UP (0x01)
co657_frmb 2:297b43e931d0 50 #define JOY_DOWN (0x02)
co657_frmb 2:297b43e931d0 51 #define JOY_LEFT (0x04)
co657_frmb 2:297b43e931d0 52 #define JOY_RIGHT (0x08)
co657_frmb 2:297b43e931d0 53 #define JOY_FIRE (0x10)
co657_frmb 2:297b43e931d0 54
co657_frmb 2:297b43e931d0 55 #define JOY_ANGLE_ADVANCE (2) /* how many 8-bit-degrees */
co657_frmb 0:fe1c42b7b490 56
co657_frmb 0:fe1c42b7b490 57 static volatile uint8_t pflags = 0x00; /* program flags */
co657_frmb 2:297b43e931d0 58 static volatile uint8_t joybits = 0x00; /* joystick bits */
co657_frmb 0:fe1c42b7b490 59
co657_frmb 2:297b43e931d0 60 #define TXBUF_WIDTH (256)
co657_frmb 2:297b43e931d0 61 static uint8_t ltxbuf[TXBUF_WIDTH * 4]; /* a 256x32 buffer that holds 8 32x32 textures, organised as 4-byte strips L-to-R */
co657_frmb 0:fe1c42b7b490 62
co657_frmb 0:fe1c42b7b490 63
co657_frmb 0:fe1c42b7b490 64 /*
co657_frmb 2:297b43e931d0 65 * assorted interrupt handlers, mostly just setting/clearing bits.
co657_frmb 2:297b43e931d0 66 * FXOS read-ready interrupt, button triggers (pulled high but not SW2 on my board).
co657_frmb 2:297b43e931d0 67 * Interrupt handler for frame-timeout (bang out frame, compute next).
co657_frmb 2:297b43e931d0 68 * Interrupt handlers for joystick up/down/etc. (pulled to ground).
co657_frmb 2:297b43e931d0 69 * Crushed up because MBED's editor doesn't fold yet.
co657_frmb 0:fe1c42b7b490 70 */
co657_frmb 2:297b43e931d0 71 static void trigger_fxos_int2 (void) { pflags |= PFLAG_FXOS; }
co657_frmb 2:297b43e931d0 72 static void trigger_sw2_int (void) { return; }
co657_frmb 2:297b43e931d0 73 static void trigger_sw3_int (void) { return; }
co657_frmb 2:297b43e931d0 74 static void trigger_frametimer (void) { pflags |= PFLAG_TIMER; }
co657_frmb 2:297b43e931d0 75 static void trigger_joy_up_rise (void) { joybits |= JOY_UP; pflags |= PFLAG_JOY; }
co657_frmb 2:297b43e931d0 76 static void trigger_joy_up_fall (void) { joybits &= ~JOY_UP; pflags |= PFLAG_JOY; }
co657_frmb 2:297b43e931d0 77 static void trigger_joy_down_rise (void) { joybits |= JOY_DOWN; pflags |= PFLAG_JOY; }
co657_frmb 2:297b43e931d0 78 static void trigger_joy_down_fall (void) { joybits &= ~JOY_DOWN; pflags |= PFLAG_JOY; }
co657_frmb 2:297b43e931d0 79 static void trigger_joy_left_rise (void) { joybits |= JOY_LEFT; pflags |= PFLAG_JOY; }
co657_frmb 2:297b43e931d0 80 static void trigger_joy_left_fall (void) { joybits &= ~JOY_LEFT; pflags |= PFLAG_JOY; }
co657_frmb 2:297b43e931d0 81 static void trigger_joy_right_rise (void) { joybits |= JOY_RIGHT; pflags |= PFLAG_JOY; }
co657_frmb 2:297b43e931d0 82 static void trigger_joy_right_fall (void) { joybits &= ~JOY_RIGHT;pflags |= PFLAG_JOY; }
co657_frmb 2:297b43e931d0 83 static void trigger_joy_fire_rise (void) { joybits |= JOY_FIRE; pflags |= PFLAG_JOY; }
co657_frmb 2:297b43e931d0 84 static void trigger_joy_fire_fall (void) { joybits &= ~JOY_FIRE; pflags |= PFLAG_JOY; }
co657_frmb 0:fe1c42b7b490 85
co657_frmb 0:fe1c42b7b490 86
co657_frmb 0:fe1c42b7b490 87
co657_frmb 0:fe1c42b7b490 88 /*
co657_frmb 0:fe1c42b7b490 89 * dumps the global accelerometer/magnetomer reading to the serial-port "host"
co657_frmb 0:fe1c42b7b490 90 */
co657_frmb 2:297b43e931d0 91 void print_reading (FXOSData_t *p)
co657_frmb 0:fe1c42b7b490 92 {
co657_frmb 0:fe1c42b7b490 93 host.printf ("A X:%5d Y:%5d Z:%5d M X:%5d Y:%5d Z:%5d\r\n",
co657_frmb 2:297b43e931d0 94 p->s.acc_x, p->s.acc_y, p->s.acc_z, p->s.mag_x, p->s.mag_y, p->s.mag_z);
co657_frmb 0:fe1c42b7b490 95 }
co657_frmb 0:fe1c42b7b490 96
co657_frmb 0:fe1c42b7b490 97
co657_frmb 0:fe1c42b7b490 98
co657_frmb 0:fe1c42b7b490 99 /*
co657_frmb 0:fe1c42b7b490 100 * start here
co657_frmb 0:fe1c42b7b490 101 */
co657_frmb 0:fe1c42b7b490 102 int main (void)
co657_frmb 0:fe1c42b7b490 103 {
co657_frmb 0:fe1c42b7b490 104 angle_t a;
co657_frmb 1:3810f9d9c775 105 #ifdef BENCHMARK
co657_frmb 2:297b43e931d0 106 int bt_start, bt_now, bt_update = 0, bt_trans = 0, bt_render = 0;
co657_frmb 1:3810f9d9c775 107 #endif
co657_frmb 2:297b43e931d0 108 angle_t x_rot = 0;
co657_frmb 2:297b43e931d0 109 angle_t y_rot = 0;
co657_frmb 2:297b43e931d0 110 FXOSData_t fxos_data;
co657_frmb 2:297b43e931d0 111 uint8_t ljoybits = 0x00; /* local joystick bits (JOY_...) */
co657_frmb 2:297b43e931d0 112 static const uint8_t *std_cube_txmap[6] = {g3d_texture_face, g3d_texture_hlife, g3d_texture_ccube, g3d_texture_face, g3d_texture_hlife, g3d_texture_ccube};
co657_frmb 2:297b43e931d0 113
co657_frmb 2:297b43e931d0 114 uint16_t pot1val, pot2val;
co657_frmb 0:fe1c42b7b490 115
co657_frmb 0:fe1c42b7b490 116 /* initialise */
co657_frmb 0:fe1c42b7b490 117 host.baud (38400);
co657_frmb 0:fe1c42b7b490 118
co657_frmb 0:fe1c42b7b490 119 shld_lcd.set_auto_up (0); /* we'll do it ourselves */
co657_frmb 0:fe1c42b7b490 120 shld_lcd.cls ();
co657_frmb 0:fe1c42b7b490 121 shld_lcd.copy_to_lcd ();
co657_frmb 0:fe1c42b7b490 122
co657_frmb 0:fe1c42b7b490 123 fxos_int2.fall (trigger_fxos_int2); /* level triggered interrupt */
co657_frmb 0:fe1c42b7b490 124 fxos.enable(); /* enable device */
co657_frmb 0:fe1c42b7b490 125
co657_frmb 2:297b43e931d0 126 /* Interrupt for SW2/SW3 button-down state */
co657_frmb 2:297b43e931d0 127 sw2_int.mode (PullUp);
co657_frmb 2:297b43e931d0 128 sw2_int.fall (trigger_sw2_int);
co657_frmb 2:297b43e931d0 129
co657_frmb 0:fe1c42b7b490 130 sw3_int.fall (trigger_sw3_int);
co657_frmb 0:fe1c42b7b490 131
co657_frmb 2:297b43e931d0 132 /* sort out joystick interrupts */
co657_frmb 2:297b43e931d0 133 joy_up.rise (trigger_joy_up_rise);
co657_frmb 2:297b43e931d0 134 joy_up.fall (trigger_joy_up_fall);
co657_frmb 2:297b43e931d0 135 joy_down.rise (trigger_joy_down_rise);
co657_frmb 2:297b43e931d0 136 joy_down.fall (trigger_joy_down_fall);
co657_frmb 2:297b43e931d0 137 joy_left.rise (trigger_joy_left_rise);
co657_frmb 2:297b43e931d0 138 joy_left.fall (trigger_joy_left_fall);
co657_frmb 2:297b43e931d0 139 joy_right.rise (trigger_joy_right_rise);
co657_frmb 2:297b43e931d0 140 joy_right.fall (trigger_joy_right_fall);
co657_frmb 2:297b43e931d0 141 joy_fire.rise (trigger_joy_fire_rise);
co657_frmb 2:297b43e931d0 142 joy_fire.fall (trigger_joy_fire_fall);
co657_frmb 2:297b43e931d0 143
co657_frmb 2:297b43e931d0 144 /* read the two potentiometers */
co657_frmb 2:297b43e931d0 145 pot1val = shld_pot1.read_u16 ();
co657_frmb 2:297b43e931d0 146 pot2val = shld_pot2.read_u16 ();
co657_frmb 2:297b43e931d0 147
co657_frmb 2:297b43e931d0 148 float pot1f = G3D_Z_DEPTH_MIN + (((G3D_Z_DEPTH_MAX - G3D_Z_DEPTH_MIN) * (float)pot1val) / 65535.0f);
co657_frmb 2:297b43e931d0 149
co657_frmb 2:297b43e931d0 150 gfx3d_set_z_depth (pot1f);
co657_frmb 2:297b43e931d0 151
co657_frmb 0:fe1c42b7b490 152 /* setup frame timer */
co657_frmb 2:297b43e931d0 153 frametimer.attach_us (trigger_frametimer, FRAME_RATE_US);
co657_frmb 0:fe1c42b7b490 154
co657_frmb 0:fe1c42b7b490 155 /* Example data printing */
co657_frmb 2:297b43e931d0 156 fxos.get_data (&fxos_data);
co657_frmb 2:297b43e931d0 157 print_reading (&fxos_data);
co657_frmb 0:fe1c42b7b490 158
co657_frmb 1:3810f9d9c775 159 #ifdef BENCHMARK
co657_frmb 1:3810f9d9c775 160 perftimer.reset ();
co657_frmb 1:3810f9d9c775 161 perftimer.start ();
co657_frmb 1:3810f9d9c775 162 #endif
co657_frmb 1:3810f9d9c775 163
co657_frmb 0:fe1c42b7b490 164 a = 0;
co657_frmb 0:fe1c42b7b490 165 for (;;) {
co657_frmb 2:297b43e931d0 166 uint8_t cflags;
co657_frmb 0:fe1c42b7b490 167
co657_frmb 2:297b43e931d0 168 __disable_irq ();
co657_frmb 2:297b43e931d0 169 cflags = pflags;
co657_frmb 2:297b43e931d0 170 pflags = 0x00;
co657_frmb 2:297b43e931d0 171 __enable_irq ();
co657_frmb 2:297b43e931d0 172
co657_frmb 2:297b43e931d0 173 if (cflags & PFLAG_TIMER) {
co657_frmb 0:fe1c42b7b490 174 g3d_p3_t pts1[8]; /* points for rotates/translated cubes */
co657_frmb 0:fe1c42b7b490 175 g3d_2p3_t pts2[8]; /* points for projected cube */
co657_frmb 2:297b43e931d0 176 g3d_poly_t poly[12]; /* polygons for cube */
co657_frmb 2:297b43e931d0 177 g3d_edgebuf_t pedge[12]; /* edge-buffers for polygons */
co657_frmb 2:297b43e931d0 178 int npolys = 0; /* number of polygons that are meaningful */
co657_frmb 0:fe1c42b7b490 179 int i;
co657_frmb 2:297b43e931d0 180 uint16_t n_pot1, n_pot2;
co657_frmb 0:fe1c42b7b490 181
co657_frmb 2:297b43e931d0 182 #ifdef BENCHMARK
co657_frmb 2:297b43e931d0 183 bt_start = perftimer.read_us ();
co657_frmb 2:297b43e931d0 184 bt_update = 0;
co657_frmb 2:297b43e931d0 185 bt_trans = 0;
co657_frmb 2:297b43e931d0 186 bt_render = 0;
co657_frmb 2:297b43e931d0 187 #endif
co657_frmb 2:297b43e931d0 188
co657_frmb 0:fe1c42b7b490 189 /* push last frame first */
co657_frmb 0:fe1c42b7b490 190 shld_lcd.copy_to_lcd ();
co657_frmb 0:fe1c42b7b490 191 shld_lcd.cls ();
co657_frmb 1:3810f9d9c775 192
co657_frmb 1:3810f9d9c775 193 #ifdef BENCHMARK
co657_frmb 2:297b43e931d0 194 bt_now = perftimer.read_us ();
co657_frmb 2:297b43e931d0 195 bt_update += (bt_now - bt_start);
co657_frmb 2:297b43e931d0 196 bt_start = bt_now;
co657_frmb 1:3810f9d9c775 197 #endif
co657_frmb 2:297b43e931d0 198
co657_frmb 2:297b43e931d0 199 /* read potentiometers */
co657_frmb 2:297b43e931d0 200 n_pot1 = shld_pot1.read_u16 ();
co657_frmb 2:297b43e931d0 201 n_pot2 = shld_pot2.read_u16 ();
co657_frmb 2:297b43e931d0 202 if (pot1val != n_pot1) {
co657_frmb 2:297b43e931d0 203 /* FIXME: ... */
co657_frmb 2:297b43e931d0 204 pot1val = n_pot1;
co657_frmb 2:297b43e931d0 205 pot1f = G3D_Z_DEPTH_MIN + (((G3D_Z_DEPTH_MAX - G3D_Z_DEPTH_MIN) * (float)pot1val) / 65535.0f);
co657_frmb 2:297b43e931d0 206
co657_frmb 2:297b43e931d0 207 gfx3d_set_z_depth (pot1f);
co657_frmb 2:297b43e931d0 208 }
co657_frmb 2:297b43e931d0 209 if (pot2val != n_pot2) {
co657_frmb 2:297b43e931d0 210 /* FIXME: ... */
co657_frmb 2:297b43e931d0 211 pot2val = n_pot2;
co657_frmb 2:297b43e931d0 212 }
co657_frmb 2:297b43e931d0 213 gfx3d_clear_zb ();
co657_frmb 2:297b43e931d0 214
co657_frmb 2:297b43e931d0 215 #if 0
co657_frmb 2:297b43e931d0 216 /* DEBUG: for texture mapping, simple rotating square (2 polys) */
co657_frmb 2:297b43e931d0 217 {
co657_frmb 2:297b43e931d0 218 int j;
co657_frmb 2:297b43e931d0 219 g3d_p3_t scale = {2.0, 2.0, 1.0};
co657_frmb 2:297b43e931d0 220 g3d_p3_t trans = {0.0, 0.0, -10.0 + ((20.0f * (float)a) / 256.0f)};
co657_frmb 2:297b43e931d0 221
co657_frmb 2:297b43e931d0 222 gfx3d_scale (g3d_xyfacepnts, pts1, 4, scale);
co657_frmb 2:297b43e931d0 223 gfx3d_rotate_x (pts1, pts1, 4, a);
co657_frmb 2:297b43e931d0 224 gfx3d_translate (pts1, pts1, 4, trans);
co657_frmb 2:297b43e931d0 225 gfx3d_rotate_z (pts1, pts1, 4, a * 2);
co657_frmb 2:297b43e931d0 226 gfx3d_project (pts1, pts2, 4);
co657_frmb 2:297b43e931d0 227 gfx3d_squarify_points (pts2, poly, &npolys, 0); /* hide backfaces */
co657_frmb 2:297b43e931d0 228 for (j=0; j<npolys; j++) {
co657_frmb 2:297b43e931d0 229 gfx3d_sort_poly (&poly[j]);
co657_frmb 0:fe1c42b7b490 230 }
co657_frmb 1:3810f9d9c775 231 #ifdef BENCHMARK
co657_frmb 1:3810f9d9c775 232 bt_now = perftimer.read_us ();
co657_frmb 1:3810f9d9c775 233 bt_trans += (bt_now - bt_start);
co657_frmb 1:3810f9d9c775 234 bt_start = bt_now;
co657_frmb 1:3810f9d9c775 235 #endif
co657_frmb 2:297b43e931d0 236 for (j=0; j<npolys; j++) {
co657_frmb 2:297b43e931d0 237 gfx3d_polytxmap (&poly[j], g3d_texture_face, shld_lcd);
co657_frmb 2:297b43e931d0 238 }
co657_frmb 1:3810f9d9c775 239
co657_frmb 1:3810f9d9c775 240 #ifdef BENCHMARK
co657_frmb 1:3810f9d9c775 241 bt_now = perftimer.read_us ();
co657_frmb 1:3810f9d9c775 242 bt_render += (bt_now - bt_start);
co657_frmb 1:3810f9d9c775 243 bt_start = bt_now;
co657_frmb 1:3810f9d9c775 244 #endif
co657_frmb 1:3810f9d9c775 245
co657_frmb 0:fe1c42b7b490 246 }
co657_frmb 2:297b43e931d0 247 #else
co657_frmb 2:297b43e931d0 248 for (i=0; i<4; i++) {
co657_frmb 2:297b43e931d0 249 g3d_p3_t trans = {3.0f * gfx3d_sin (a + (i * 64)), 0.0f, 5.0f * gfx3d_cos (a + (i * 64))};
co657_frmb 2:297b43e931d0 250 int j;
co657_frmb 2:297b43e931d0 251
co657_frmb 2:297b43e931d0 252 /* rotate, translate and render! */
co657_frmb 2:297b43e931d0 253 if (i == 0) {
co657_frmb 2:297b43e931d0 254 gfx3d_rotate_y (g3d_cubepnts, pts1, 8, x_rot);
co657_frmb 2:297b43e931d0 255 gfx3d_rotate_x (pts1, pts1, 8, y_rot);
co657_frmb 2:297b43e931d0 256 gfx3d_translate (pts1, pts1, 8, trans);
co657_frmb 2:297b43e931d0 257 } else {
co657_frmb 2:297b43e931d0 258 gfx3d_rotate_demo (g3d_cubepnts, pts1, 8, (a * i) & 0xff);
co657_frmb 2:297b43e931d0 259 gfx3d_translate (pts1, pts1, 8, trans);
co657_frmb 2:297b43e931d0 260 }
co657_frmb 2:297b43e931d0 261
co657_frmb 2:297b43e931d0 262 gfx3d_project (pts1, pts2, 8);
co657_frmb 2:297b43e931d0 263 gfx3d_cubify_points (pts2, poly, &npolys, 0, std_cube_txmap); /* hide backfaces */
co657_frmb 2:297b43e931d0 264 for (j=0; j<npolys; j++) {
co657_frmb 2:297b43e931d0 265 gfx3d_sort_poly (&poly[j]);
co657_frmb 2:297b43e931d0 266 if (i < 3) {
co657_frmb 2:297b43e931d0 267 /* nothing here for this one */
co657_frmb 2:297b43e931d0 268 } else {
co657_frmb 2:297b43e931d0 269 gfx3d_edgebuf_z (&poly[j], &pedge[j]);
co657_frmb 2:297b43e931d0 270 }
co657_frmb 2:297b43e931d0 271 }
co657_frmb 2:297b43e931d0 272
co657_frmb 2:297b43e931d0 273 #if 0
co657_frmb 2:297b43e931d0 274 if (i == 2) {
co657_frmb 2:297b43e931d0 275 if ((a & 0x0f) == 0) {
co657_frmb 2:297b43e931d0 276 host.printf ("poly[0].tx_pts[0]=%4.4x, [1]=%4.4x, [2]=%4.4x, norm=%8.8x\r\n", poly[0].tx_pts[0], poly[0].tx_pts[1], poly[0].tx_pts[2], poly[0].norm);
co657_frmb 2:297b43e931d0 277 }
co657_frmb 2:297b43e931d0 278 }
co657_frmb 2:297b43e931d0 279 #endif
co657_frmb 2:297b43e931d0 280
co657_frmb 2:297b43e931d0 281 #ifdef BENCHMARK
co657_frmb 2:297b43e931d0 282 bt_now = perftimer.read_us ();
co657_frmb 2:297b43e931d0 283 bt_trans += (bt_now - bt_start);
co657_frmb 2:297b43e931d0 284 bt_start = bt_now;
co657_frmb 2:297b43e931d0 285 #endif
co657_frmb 2:297b43e931d0 286
co657_frmb 2:297b43e931d0 287 // gfx3d_wirecube (pts2, shld_lcd);
co657_frmb 2:297b43e931d0 288 for (j=0; j<npolys; j++) {
co657_frmb 2:297b43e931d0 289 // gfx3d_wirepoly (&poly[j], shld_lcd);
co657_frmb 2:297b43e931d0 290 if (i < 2) {
co657_frmb 2:297b43e931d0 291 gfx3d_polytxmap (&poly[j], shld_lcd);
co657_frmb 2:297b43e931d0 292 } else if (i == 2) {
co657_frmb 2:297b43e931d0 293 gfx3d_polynormmap (&poly[j], shld_lcd);
co657_frmb 2:297b43e931d0 294 } else {
co657_frmb 2:297b43e931d0 295 gfx3d_wireedge (&pedge[j], shld_lcd);
co657_frmb 2:297b43e931d0 296 }
co657_frmb 2:297b43e931d0 297 }
co657_frmb 2:297b43e931d0 298
co657_frmb 2:297b43e931d0 299 #ifdef BENCHMARK
co657_frmb 2:297b43e931d0 300 bt_now = perftimer.read_us ();
co657_frmb 2:297b43e931d0 301 bt_render += (bt_now - bt_start);
co657_frmb 2:297b43e931d0 302 bt_start = bt_now;
co657_frmb 2:297b43e931d0 303 #endif
co657_frmb 2:297b43e931d0 304
co657_frmb 2:297b43e931d0 305 }
co657_frmb 2:297b43e931d0 306 #endif /* (debugging what polygons to use) */
co657_frmb 0:fe1c42b7b490 307
co657_frmb 0:fe1c42b7b490 308 a++;
co657_frmb 2:297b43e931d0 309 if (ljoybits & JOY_UP) {
co657_frmb 2:297b43e931d0 310 y_rot += JOY_ANGLE_ADVANCE;
co657_frmb 2:297b43e931d0 311 } else if (ljoybits & JOY_DOWN) {
co657_frmb 2:297b43e931d0 312 y_rot -= JOY_ANGLE_ADVANCE;
co657_frmb 2:297b43e931d0 313 }
co657_frmb 2:297b43e931d0 314 if (ljoybits & JOY_LEFT) {
co657_frmb 2:297b43e931d0 315 x_rot += JOY_ANGLE_ADVANCE;
co657_frmb 2:297b43e931d0 316 } else if (ljoybits & JOY_RIGHT) {
co657_frmb 2:297b43e931d0 317 x_rot -= JOY_ANGLE_ADVANCE;
co657_frmb 2:297b43e931d0 318 }
co657_frmb 1:3810f9d9c775 319
co657_frmb 1:3810f9d9c775 320 #ifdef BENCHMARK
co657_frmb 1:3810f9d9c775 321 /* write bt_trans and bt_render into the display */
co657_frmb 1:3810f9d9c775 322 shld_lcd.locate (0, 24);
co657_frmb 2:297b43e931d0 323 shld_lcd.printf ("U:%d T:%d R:%d", bt_update, bt_trans, bt_render);
co657_frmb 1:3810f9d9c775 324 #endif
co657_frmb 2:297b43e931d0 325 }
co657_frmb 2:297b43e931d0 326 if (cflags & PFLAG_FXOS) {
co657_frmb 2:297b43e931d0 327 fxos.get_data (&fxos_data);
co657_frmb 0:fe1c42b7b490 328 }
co657_frmb 2:297b43e931d0 329 if (cflags & PFLAG_JOY) {
co657_frmb 2:297b43e931d0 330 /* just update our local version of the variable (might not see changes in A-B-A situations) */
co657_frmb 2:297b43e931d0 331 ljoybits = joybits;
co657_frmb 0:fe1c42b7b490 332 }
co657_frmb 2:297b43e931d0 333
co657_frmb 0:fe1c42b7b490 334
co657_frmb 0:fe1c42b7b490 335 __disable_irq ();
co657_frmb 0:fe1c42b7b490 336 if (!pflags) {
co657_frmb 0:fe1c42b7b490 337 sleep ();
co657_frmb 0:fe1c42b7b490 338 }
co657_frmb 0:fe1c42b7b490 339 __enable_irq ();
co657_frmb 0:fe1c42b7b490 340 }
co657_frmb 0:fe1c42b7b490 341
co657_frmb 0:fe1c42b7b490 342 }
co657_frmb 0:fe1c42b7b490 343