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
main.cpp@2:297b43e931d0, 2015-11-28 (annotated)
- 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?
User | Revision | Line number | New 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 |