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:
Sun Nov 29 00:27:44 2015 +0000
Revision:
4:2828d6a81907
Parent:
3:23a93f2f8cac
don't print initial accelerometer readings (broken anyway).

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 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 4:2828d6a81907 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