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@3:23a93f2f8cac, 2015-11-29 (annotated)
- Committer:
- co657_frmb
- Date:
- Sun Nov 29 00:04:35 2015 +0000
- Revision:
- 3:23a93f2f8cac
- Parent:
- 2:297b43e931d0
- Child:
- 4:2828d6a81907
Various updates for demonstration purposes. Turned off benchmarking for now.
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 | 3:23a93f2f8cac | 98 | static char *scrolly_message = " ... Welcome to the wonderful world of MBED and CO657 ... "; |
co657_frmb | 3:23a93f2f8cac | 99 | |
co657_frmb | 3:23a93f2f8cac | 100 | |
co657_frmb | 3:23a93f2f8cac | 101 | /* |
co657_frmb | 3:23a93f2f8cac | 102 | * some grot for handling scrolling text |
co657_frmb | 3:23a93f2f8cac | 103 | */ |
co657_frmb | 3:23a93f2f8cac | 104 | static void scroll_text_update (int *firstch, int *xdelta, const char *str) |
co657_frmb | 3:23a93f2f8cac | 105 | { |
co657_frmb | 3:23a93f2f8cac | 106 | int xoff = *xdelta; |
co657_frmb | 3:23a93f2f8cac | 107 | int fch = *firstch; |
co657_frmb | 3:23a93f2f8cac | 108 | int hcnt, ccnt, lxoff, hxoff; |
co657_frmb | 3:23a93f2f8cac | 109 | |
co657_frmb | 3:23a93f2f8cac | 110 | /* see how many characters starting with fch will fit into the buffer (allow overrun) */ |
co657_frmb | 3:23a93f2f8cac | 111 | for (hcnt=0; (str[fch + hcnt] != '\0') && (xoff < (TXBUF_WIDTH >> 1)); hcnt++) { |
co657_frmb | 3:23a93f2f8cac | 112 | xoff += gfx3d_font04b_char_dpw (str[fch + hcnt]); |
co657_frmb | 3:23a93f2f8cac | 113 | } |
co657_frmb | 3:23a93f2f8cac | 114 | hxoff = xoff; |
co657_frmb | 3:23a93f2f8cac | 115 | for (ccnt=hcnt; (str[fch + ccnt] != '\0') && (xoff < TXBUF_WIDTH); ccnt++) { |
co657_frmb | 3:23a93f2f8cac | 116 | xoff += gfx3d_font04b_char_dpw (str[fch + ccnt]); |
co657_frmb | 3:23a93f2f8cac | 117 | } |
co657_frmb | 3:23a93f2f8cac | 118 | |
co657_frmb | 3:23a93f2f8cac | 119 | /* clear and render */ |
co657_frmb | 3:23a93f2f8cac | 120 | memset (ltxbuf, 0xff, TXBUF_WIDTH * 4); |
co657_frmb | 3:23a93f2f8cac | 121 | lxoff = *xdelta; |
co657_frmb | 3:23a93f2f8cac | 122 | gfx3d_font04b_tx_putstrn (ltxbuf, TXBUF_WIDTH, &lxoff, 8, str + fch, ccnt, true); |
co657_frmb | 3:23a93f2f8cac | 123 | |
co657_frmb | 3:23a93f2f8cac | 124 | if (hxoff == (TXBUF_WIDTH >> 1)) { |
co657_frmb | 3:23a93f2f8cac | 125 | /* hit exactly */ |
co657_frmb | 3:23a93f2f8cac | 126 | *xdelta = 0; |
co657_frmb | 3:23a93f2f8cac | 127 | *firstch = fch + hcnt; |
co657_frmb | 3:23a93f2f8cac | 128 | } else if (hxoff > (TXBUF_WIDTH >> 1)) { |
co657_frmb | 3:23a93f2f8cac | 129 | /* last character overshoots middle, include it next time */ |
co657_frmb | 3:23a93f2f8cac | 130 | *firstch = fch + (hcnt - 1); |
co657_frmb | 3:23a93f2f8cac | 131 | *xdelta = (TXBUF_WIDTH >> 1) - hxoff; |
co657_frmb | 3:23a93f2f8cac | 132 | } else { |
co657_frmb | 3:23a93f2f8cac | 133 | /* ran out of string, redo from start */ |
co657_frmb | 3:23a93f2f8cac | 134 | *firstch = 0; |
co657_frmb | 3:23a93f2f8cac | 135 | *xdelta = 0; |
co657_frmb | 3:23a93f2f8cac | 136 | } |
co657_frmb | 3:23a93f2f8cac | 137 | } |
co657_frmb | 3:23a93f2f8cac | 138 | |
co657_frmb | 0:fe1c42b7b490 | 139 | |
co657_frmb | 0:fe1c42b7b490 | 140 | /* |
co657_frmb | 0:fe1c42b7b490 | 141 | * start here |
co657_frmb | 0:fe1c42b7b490 | 142 | */ |
co657_frmb | 0:fe1c42b7b490 | 143 | int main (void) |
co657_frmb | 0:fe1c42b7b490 | 144 | { |
co657_frmb | 0:fe1c42b7b490 | 145 | angle_t a; |
co657_frmb | 1:3810f9d9c775 | 146 | #ifdef BENCHMARK |
co657_frmb | 2:297b43e931d0 | 147 | int bt_start, bt_now, bt_update = 0, bt_trans = 0, bt_render = 0; |
co657_frmb | 1:3810f9d9c775 | 148 | #endif |
co657_frmb | 2:297b43e931d0 | 149 | angle_t x_rot = 0; |
co657_frmb | 2:297b43e931d0 | 150 | angle_t y_rot = 0; |
co657_frmb | 2:297b43e931d0 | 151 | FXOSData_t fxos_data; |
co657_frmb | 2:297b43e931d0 | 152 | uint8_t ljoybits = 0x00; /* local joystick bits (JOY_...) */ |
co657_frmb | 3:23a93f2f8cac | 153 | const uint8_t *std_cube_txmap[6] = {g3d_texture_face, g3d_texture_hlife, g3d_texture_ccube, g3d_texture_hlife, g3d_texture_face, g3d_texture_ccube}; |
co657_frmb | 3:23a93f2f8cac | 154 | const uint8_t *wcube_txmap[6] = {g3d_texture_wcube, g3d_texture_wcube, g3d_texture_wcube, g3d_texture_wcube, g3d_texture_wcube, g3d_texture_wcube}; |
co657_frmb | 3:23a93f2f8cac | 155 | int ltxoffs = 0; |
co657_frmb | 3:23a93f2f8cac | 156 | int sc_fch = 0; |
co657_frmb | 3:23a93f2f8cac | 157 | int sc_xdt = 0; |
co657_frmb | 2:297b43e931d0 | 158 | |
co657_frmb | 2:297b43e931d0 | 159 | uint16_t pot1val, pot2val; |
co657_frmb | 0:fe1c42b7b490 | 160 | |
co657_frmb | 0:fe1c42b7b490 | 161 | /* initialise */ |
co657_frmb | 0:fe1c42b7b490 | 162 | host.baud (38400); |
co657_frmb | 0:fe1c42b7b490 | 163 | |
co657_frmb | 0:fe1c42b7b490 | 164 | shld_lcd.set_auto_up (0); /* we'll do it ourselves */ |
co657_frmb | 0:fe1c42b7b490 | 165 | shld_lcd.cls (); |
co657_frmb | 0:fe1c42b7b490 | 166 | shld_lcd.copy_to_lcd (); |
co657_frmb | 0:fe1c42b7b490 | 167 | |
co657_frmb | 0:fe1c42b7b490 | 168 | fxos_int2.fall (trigger_fxos_int2); /* level triggered interrupt */ |
co657_frmb | 0:fe1c42b7b490 | 169 | fxos.enable(); /* enable device */ |
co657_frmb | 0:fe1c42b7b490 | 170 | |
co657_frmb | 2:297b43e931d0 | 171 | /* Interrupt for SW2/SW3 button-down state */ |
co657_frmb | 2:297b43e931d0 | 172 | sw2_int.mode (PullUp); |
co657_frmb | 2:297b43e931d0 | 173 | sw2_int.fall (trigger_sw2_int); |
co657_frmb | 2:297b43e931d0 | 174 | |
co657_frmb | 0:fe1c42b7b490 | 175 | sw3_int.fall (trigger_sw3_int); |
co657_frmb | 0:fe1c42b7b490 | 176 | |
co657_frmb | 2:297b43e931d0 | 177 | /* sort out joystick interrupts */ |
co657_frmb | 2:297b43e931d0 | 178 | joy_up.rise (trigger_joy_up_rise); |
co657_frmb | 2:297b43e931d0 | 179 | joy_up.fall (trigger_joy_up_fall); |
co657_frmb | 2:297b43e931d0 | 180 | joy_down.rise (trigger_joy_down_rise); |
co657_frmb | 2:297b43e931d0 | 181 | joy_down.fall (trigger_joy_down_fall); |
co657_frmb | 2:297b43e931d0 | 182 | joy_left.rise (trigger_joy_left_rise); |
co657_frmb | 2:297b43e931d0 | 183 | joy_left.fall (trigger_joy_left_fall); |
co657_frmb | 2:297b43e931d0 | 184 | joy_right.rise (trigger_joy_right_rise); |
co657_frmb | 2:297b43e931d0 | 185 | joy_right.fall (trigger_joy_right_fall); |
co657_frmb | 2:297b43e931d0 | 186 | joy_fire.rise (trigger_joy_fire_rise); |
co657_frmb | 2:297b43e931d0 | 187 | joy_fire.fall (trigger_joy_fire_fall); |
co657_frmb | 2:297b43e931d0 | 188 | |
co657_frmb | 2:297b43e931d0 | 189 | /* read the two potentiometers */ |
co657_frmb | 2:297b43e931d0 | 190 | pot1val = shld_pot1.read_u16 (); |
co657_frmb | 2:297b43e931d0 | 191 | pot2val = shld_pot2.read_u16 (); |
co657_frmb | 2:297b43e931d0 | 192 | |
co657_frmb | 2:297b43e931d0 | 193 | float pot1f = G3D_Z_DEPTH_MIN + (((G3D_Z_DEPTH_MAX - G3D_Z_DEPTH_MIN) * (float)pot1val) / 65535.0f); |
co657_frmb | 2:297b43e931d0 | 194 | |
co657_frmb | 2:297b43e931d0 | 195 | gfx3d_set_z_depth (pot1f); |
co657_frmb | 2:297b43e931d0 | 196 | |
co657_frmb | 0:fe1c42b7b490 | 197 | /* setup frame timer */ |
co657_frmb | 2:297b43e931d0 | 198 | frametimer.attach_us (trigger_frametimer, FRAME_RATE_US); |
co657_frmb | 0:fe1c42b7b490 | 199 | |
co657_frmb | 0:fe1c42b7b490 | 200 | /* Example data printing */ |
co657_frmb | 2:297b43e931d0 | 201 | fxos.get_data (&fxos_data); |
co657_frmb | 2:297b43e931d0 | 202 | print_reading (&fxos_data); |
co657_frmb | 3:23a93f2f8cac | 203 | |
co657_frmb | 3:23a93f2f8cac | 204 | /* clear texture buffer */ |
co657_frmb | 3:23a93f2f8cac | 205 | scroll_text_update (&sc_fch, &sc_xdt, scrolly_message); |
co657_frmb | 0:fe1c42b7b490 | 206 | |
co657_frmb | 1:3810f9d9c775 | 207 | #ifdef BENCHMARK |
co657_frmb | 1:3810f9d9c775 | 208 | perftimer.reset (); |
co657_frmb | 1:3810f9d9c775 | 209 | perftimer.start (); |
co657_frmb | 1:3810f9d9c775 | 210 | #endif |
co657_frmb | 1:3810f9d9c775 | 211 | |
co657_frmb | 0:fe1c42b7b490 | 212 | a = 0; |
co657_frmb | 0:fe1c42b7b490 | 213 | for (;;) { |
co657_frmb | 2:297b43e931d0 | 214 | uint8_t cflags; |
co657_frmb | 0:fe1c42b7b490 | 215 | |
co657_frmb | 2:297b43e931d0 | 216 | __disable_irq (); |
co657_frmb | 2:297b43e931d0 | 217 | cflags = pflags; |
co657_frmb | 2:297b43e931d0 | 218 | pflags = 0x00; |
co657_frmb | 2:297b43e931d0 | 219 | __enable_irq (); |
co657_frmb | 2:297b43e931d0 | 220 | |
co657_frmb | 2:297b43e931d0 | 221 | if (cflags & PFLAG_TIMER) { |
co657_frmb | 0:fe1c42b7b490 | 222 | g3d_p3_t pts1[8]; /* points for rotates/translated cubes */ |
co657_frmb | 0:fe1c42b7b490 | 223 | g3d_2p3_t pts2[8]; /* points for projected cube */ |
co657_frmb | 2:297b43e931d0 | 224 | g3d_poly_t poly[12]; /* polygons for cube */ |
co657_frmb | 2:297b43e931d0 | 225 | g3d_edgebuf_t pedge[12]; /* edge-buffers for polygons */ |
co657_frmb | 2:297b43e931d0 | 226 | int npolys = 0; /* number of polygons that are meaningful */ |
co657_frmb | 0:fe1c42b7b490 | 227 | int i; |
co657_frmb | 2:297b43e931d0 | 228 | uint16_t n_pot1, n_pot2; |
co657_frmb | 3:23a93f2f8cac | 229 | const uint8_t *wrapmap[6] = {&(ltxbuf[ltxoffs + 0]), &(ltxbuf[ltxoffs + 128]), &(ltxbuf[ltxoffs + 256]), &(ltxbuf[ltxoffs + 384]), g3d_texture_check, g3d_texture_check}; |
co657_frmb | 0:fe1c42b7b490 | 230 | |
co657_frmb | 2:297b43e931d0 | 231 | #ifdef BENCHMARK |
co657_frmb | 2:297b43e931d0 | 232 | bt_start = perftimer.read_us (); |
co657_frmb | 2:297b43e931d0 | 233 | bt_update = 0; |
co657_frmb | 2:297b43e931d0 | 234 | bt_trans = 0; |
co657_frmb | 2:297b43e931d0 | 235 | bt_render = 0; |
co657_frmb | 2:297b43e931d0 | 236 | #endif |
co657_frmb | 2:297b43e931d0 | 237 | |
co657_frmb | 0:fe1c42b7b490 | 238 | /* push last frame first */ |
co657_frmb | 0:fe1c42b7b490 | 239 | shld_lcd.copy_to_lcd (); |
co657_frmb | 0:fe1c42b7b490 | 240 | shld_lcd.cls (); |
co657_frmb | 1:3810f9d9c775 | 241 | |
co657_frmb | 1:3810f9d9c775 | 242 | #ifdef BENCHMARK |
co657_frmb | 2:297b43e931d0 | 243 | bt_now = perftimer.read_us (); |
co657_frmb | 2:297b43e931d0 | 244 | bt_update += (bt_now - bt_start); |
co657_frmb | 2:297b43e931d0 | 245 | bt_start = bt_now; |
co657_frmb | 1:3810f9d9c775 | 246 | #endif |
co657_frmb | 2:297b43e931d0 | 247 | |
co657_frmb | 2:297b43e931d0 | 248 | /* read potentiometers */ |
co657_frmb | 2:297b43e931d0 | 249 | n_pot1 = shld_pot1.read_u16 (); |
co657_frmb | 2:297b43e931d0 | 250 | n_pot2 = shld_pot2.read_u16 (); |
co657_frmb | 2:297b43e931d0 | 251 | if (pot1val != n_pot1) { |
co657_frmb | 2:297b43e931d0 | 252 | /* FIXME: ... */ |
co657_frmb | 2:297b43e931d0 | 253 | pot1val = n_pot1; |
co657_frmb | 2:297b43e931d0 | 254 | pot1f = G3D_Z_DEPTH_MIN + (((G3D_Z_DEPTH_MAX - G3D_Z_DEPTH_MIN) * (float)pot1val) / 65535.0f); |
co657_frmb | 2:297b43e931d0 | 255 | |
co657_frmb | 2:297b43e931d0 | 256 | gfx3d_set_z_depth (pot1f); |
co657_frmb | 2:297b43e931d0 | 257 | } |
co657_frmb | 2:297b43e931d0 | 258 | if (pot2val != n_pot2) { |
co657_frmb | 2:297b43e931d0 | 259 | /* FIXME: ... */ |
co657_frmb | 2:297b43e931d0 | 260 | pot2val = n_pot2; |
co657_frmb | 2:297b43e931d0 | 261 | } |
co657_frmb | 2:297b43e931d0 | 262 | gfx3d_clear_zb (); |
co657_frmb | 2:297b43e931d0 | 263 | |
co657_frmb | 2:297b43e931d0 | 264 | #if 0 |
co657_frmb | 2:297b43e931d0 | 265 | /* DEBUG: for texture mapping, simple rotating square (2 polys) */ |
co657_frmb | 2:297b43e931d0 | 266 | { |
co657_frmb | 2:297b43e931d0 | 267 | int j; |
co657_frmb | 2:297b43e931d0 | 268 | g3d_p3_t scale = {2.0, 2.0, 1.0}; |
co657_frmb | 2:297b43e931d0 | 269 | g3d_p3_t trans = {0.0, 0.0, -10.0 + ((20.0f * (float)a) / 256.0f)}; |
co657_frmb | 2:297b43e931d0 | 270 | |
co657_frmb | 2:297b43e931d0 | 271 | gfx3d_scale (g3d_xyfacepnts, pts1, 4, scale); |
co657_frmb | 2:297b43e931d0 | 272 | gfx3d_rotate_x (pts1, pts1, 4, a); |
co657_frmb | 2:297b43e931d0 | 273 | gfx3d_translate (pts1, pts1, 4, trans); |
co657_frmb | 2:297b43e931d0 | 274 | gfx3d_rotate_z (pts1, pts1, 4, a * 2); |
co657_frmb | 2:297b43e931d0 | 275 | gfx3d_project (pts1, pts2, 4); |
co657_frmb | 2:297b43e931d0 | 276 | gfx3d_squarify_points (pts2, poly, &npolys, 0); /* hide backfaces */ |
co657_frmb | 2:297b43e931d0 | 277 | for (j=0; j<npolys; j++) { |
co657_frmb | 2:297b43e931d0 | 278 | gfx3d_sort_poly (&poly[j]); |
co657_frmb | 0:fe1c42b7b490 | 279 | } |
co657_frmb | 1:3810f9d9c775 | 280 | #ifdef BENCHMARK |
co657_frmb | 1:3810f9d9c775 | 281 | bt_now = perftimer.read_us (); |
co657_frmb | 1:3810f9d9c775 | 282 | bt_trans += (bt_now - bt_start); |
co657_frmb | 1:3810f9d9c775 | 283 | bt_start = bt_now; |
co657_frmb | 1:3810f9d9c775 | 284 | #endif |
co657_frmb | 2:297b43e931d0 | 285 | for (j=0; j<npolys; j++) { |
co657_frmb | 2:297b43e931d0 | 286 | gfx3d_polytxmap (&poly[j], g3d_texture_face, shld_lcd); |
co657_frmb | 2:297b43e931d0 | 287 | } |
co657_frmb | 1:3810f9d9c775 | 288 | |
co657_frmb | 1:3810f9d9c775 | 289 | #ifdef BENCHMARK |
co657_frmb | 1:3810f9d9c775 | 290 | bt_now = perftimer.read_us (); |
co657_frmb | 1:3810f9d9c775 | 291 | bt_render += (bt_now - bt_start); |
co657_frmb | 1:3810f9d9c775 | 292 | bt_start = bt_now; |
co657_frmb | 1:3810f9d9c775 | 293 | #endif |
co657_frmb | 1:3810f9d9c775 | 294 | |
co657_frmb | 0:fe1c42b7b490 | 295 | } |
co657_frmb | 2:297b43e931d0 | 296 | #else |
co657_frmb | 2:297b43e931d0 | 297 | for (i=0; i<4; i++) { |
co657_frmb | 2:297b43e931d0 | 298 | g3d_p3_t trans = {3.0f * gfx3d_sin (a + (i * 64)), 0.0f, 5.0f * gfx3d_cos (a + (i * 64))}; |
co657_frmb | 2:297b43e931d0 | 299 | int j; |
co657_frmb | 2:297b43e931d0 | 300 | |
co657_frmb | 2:297b43e931d0 | 301 | /* rotate, translate and render! */ |
co657_frmb | 2:297b43e931d0 | 302 | if (i == 0) { |
co657_frmb | 2:297b43e931d0 | 303 | gfx3d_rotate_y (g3d_cubepnts, pts1, 8, x_rot); |
co657_frmb | 2:297b43e931d0 | 304 | gfx3d_rotate_x (pts1, pts1, 8, y_rot); |
co657_frmb | 2:297b43e931d0 | 305 | gfx3d_translate (pts1, pts1, 8, trans); |
co657_frmb | 2:297b43e931d0 | 306 | } else { |
co657_frmb | 2:297b43e931d0 | 307 | gfx3d_rotate_demo (g3d_cubepnts, pts1, 8, (a * i) & 0xff); |
co657_frmb | 2:297b43e931d0 | 308 | gfx3d_translate (pts1, pts1, 8, trans); |
co657_frmb | 2:297b43e931d0 | 309 | } |
co657_frmb | 2:297b43e931d0 | 310 | |
co657_frmb | 2:297b43e931d0 | 311 | gfx3d_project (pts1, pts2, 8); |
co657_frmb | 3:23a93f2f8cac | 312 | if (i == 0) { |
co657_frmb | 3:23a93f2f8cac | 313 | gfx3d_cubify_points (pts2, poly, &npolys, 0, wrapmap); /* hide backfaces */ |
co657_frmb | 3:23a93f2f8cac | 314 | } else if (i == 3) { |
co657_frmb | 3:23a93f2f8cac | 315 | gfx3d_cubify_points (pts2, poly, &npolys, 0, wcube_txmap); /* hide backfaces */ |
co657_frmb | 3:23a93f2f8cac | 316 | } else { |
co657_frmb | 3:23a93f2f8cac | 317 | gfx3d_cubify_points (pts2, poly, &npolys, 0, std_cube_txmap); /* hide backfaces */ |
co657_frmb | 3:23a93f2f8cac | 318 | } |
co657_frmb | 2:297b43e931d0 | 319 | for (j=0; j<npolys; j++) { |
co657_frmb | 2:297b43e931d0 | 320 | gfx3d_sort_poly (&poly[j]); |
co657_frmb | 2:297b43e931d0 | 321 | } |
co657_frmb | 2:297b43e931d0 | 322 | |
co657_frmb | 2:297b43e931d0 | 323 | #if 0 |
co657_frmb | 2:297b43e931d0 | 324 | if (i == 2) { |
co657_frmb | 2:297b43e931d0 | 325 | if ((a & 0x0f) == 0) { |
co657_frmb | 2:297b43e931d0 | 326 | 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 | 327 | } |
co657_frmb | 2:297b43e931d0 | 328 | } |
co657_frmb | 2:297b43e931d0 | 329 | #endif |
co657_frmb | 2:297b43e931d0 | 330 | |
co657_frmb | 2:297b43e931d0 | 331 | #ifdef BENCHMARK |
co657_frmb | 2:297b43e931d0 | 332 | bt_now = perftimer.read_us (); |
co657_frmb | 2:297b43e931d0 | 333 | bt_trans += (bt_now - bt_start); |
co657_frmb | 2:297b43e931d0 | 334 | bt_start = bt_now; |
co657_frmb | 2:297b43e931d0 | 335 | #endif |
co657_frmb | 2:297b43e931d0 | 336 | |
co657_frmb | 2:297b43e931d0 | 337 | for (j=0; j<npolys; j++) { |
co657_frmb | 3:23a93f2f8cac | 338 | if (i == 2) { |
co657_frmb | 2:297b43e931d0 | 339 | gfx3d_polynormmap (&poly[j], shld_lcd); |
co657_frmb | 2:297b43e931d0 | 340 | } else { |
co657_frmb | 3:23a93f2f8cac | 341 | gfx3d_polytxmap (&poly[j], shld_lcd); |
co657_frmb | 2:297b43e931d0 | 342 | } |
co657_frmb | 2:297b43e931d0 | 343 | } |
co657_frmb | 2:297b43e931d0 | 344 | |
co657_frmb | 2:297b43e931d0 | 345 | #ifdef BENCHMARK |
co657_frmb | 2:297b43e931d0 | 346 | bt_now = perftimer.read_us (); |
co657_frmb | 2:297b43e931d0 | 347 | bt_render += (bt_now - bt_start); |
co657_frmb | 2:297b43e931d0 | 348 | bt_start = bt_now; |
co657_frmb | 2:297b43e931d0 | 349 | #endif |
co657_frmb | 2:297b43e931d0 | 350 | |
co657_frmb | 2:297b43e931d0 | 351 | } |
co657_frmb | 2:297b43e931d0 | 352 | #endif /* (debugging what polygons to use) */ |
co657_frmb | 0:fe1c42b7b490 | 353 | |
co657_frmb | 3:23a93f2f8cac | 354 | /* filled up the frame-buffer, setup things for next time */ |
co657_frmb | 0:fe1c42b7b490 | 355 | a++; |
co657_frmb | 3:23a93f2f8cac | 356 | |
co657_frmb | 2:297b43e931d0 | 357 | if (ljoybits & JOY_UP) { |
co657_frmb | 2:297b43e931d0 | 358 | y_rot += JOY_ANGLE_ADVANCE; |
co657_frmb | 2:297b43e931d0 | 359 | } else if (ljoybits & JOY_DOWN) { |
co657_frmb | 2:297b43e931d0 | 360 | y_rot -= JOY_ANGLE_ADVANCE; |
co657_frmb | 2:297b43e931d0 | 361 | } |
co657_frmb | 3:23a93f2f8cac | 362 | |
co657_frmb | 2:297b43e931d0 | 363 | if (ljoybits & JOY_LEFT) { |
co657_frmb | 2:297b43e931d0 | 364 | x_rot += JOY_ANGLE_ADVANCE; |
co657_frmb | 2:297b43e931d0 | 365 | } else if (ljoybits & JOY_RIGHT) { |
co657_frmb | 2:297b43e931d0 | 366 | x_rot -= JOY_ANGLE_ADVANCE; |
co657_frmb | 2:297b43e931d0 | 367 | } |
co657_frmb | 3:23a93f2f8cac | 368 | |
co657_frmb | 3:23a93f2f8cac | 369 | ltxoffs += 4; |
co657_frmb | 3:23a93f2f8cac | 370 | if (ltxoffs >= 512) { |
co657_frmb | 3:23a93f2f8cac | 371 | /* update scrolly text */ |
co657_frmb | 3:23a93f2f8cac | 372 | scroll_text_update (&sc_fch, &sc_xdt, scrolly_message); |
co657_frmb | 3:23a93f2f8cac | 373 | ltxoffs -= 512; |
co657_frmb | 3:23a93f2f8cac | 374 | } |
co657_frmb | 1:3810f9d9c775 | 375 | |
co657_frmb | 1:3810f9d9c775 | 376 | #ifdef BENCHMARK |
co657_frmb | 1:3810f9d9c775 | 377 | /* write bt_trans and bt_render into the display */ |
co657_frmb | 1:3810f9d9c775 | 378 | shld_lcd.locate (0, 24); |
co657_frmb | 2:297b43e931d0 | 379 | shld_lcd.printf ("U:%d T:%d R:%d", bt_update, bt_trans, bt_render); |
co657_frmb | 1:3810f9d9c775 | 380 | #endif |
co657_frmb | 2:297b43e931d0 | 381 | } |
co657_frmb | 2:297b43e931d0 | 382 | if (cflags & PFLAG_FXOS) { |
co657_frmb | 2:297b43e931d0 | 383 | fxos.get_data (&fxos_data); |
co657_frmb | 0:fe1c42b7b490 | 384 | } |
co657_frmb | 2:297b43e931d0 | 385 | if (cflags & PFLAG_JOY) { |
co657_frmb | 2:297b43e931d0 | 386 | /* just update our local version of the variable (might not see changes in A-B-A situations) */ |
co657_frmb | 2:297b43e931d0 | 387 | ljoybits = joybits; |
co657_frmb | 0:fe1c42b7b490 | 388 | } |
co657_frmb | 2:297b43e931d0 | 389 | |
co657_frmb | 0:fe1c42b7b490 | 390 | |
co657_frmb | 0:fe1c42b7b490 | 391 | __disable_irq (); |
co657_frmb | 0:fe1c42b7b490 | 392 | if (!pflags) { |
co657_frmb | 0:fe1c42b7b490 | 393 | sleep (); |
co657_frmb | 0:fe1c42b7b490 | 394 | } |
co657_frmb | 0:fe1c42b7b490 | 395 | __enable_irq (); |
co657_frmb | 0:fe1c42b7b490 | 396 | } |
co657_frmb | 0:fe1c42b7b490 | 397 | |
co657_frmb | 0:fe1c42b7b490 | 398 | } |
co657_frmb | 0:fe1c42b7b490 | 399 |