Basic 3D graphics for the MBED application-shield on-board LCD (initial/incomplete).

Dependents:   co657_lcdplay

Committer:
co657_frmb
Date:
Sun Nov 29 00:03:41 2015 +0000
Revision:
9:db4ec6f7d8b2
Parent:
8:55ee7af49f47
Font updates.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
co657_frmb 0:215c9308dc52 1 /*
co657_frmb 0:215c9308dc52 2 * gfx3d.cpp -- 3D stuff for MBED (just playing!)
co657_frmb 0:215c9308dc52 3 * Copyright (C) 2015 Fred Barnes, University of Kent <frmb@kent.ac.uk>
co657_frmb 0:215c9308dc52 4 */
co657_frmb 0:215c9308dc52 5
co657_frmb 0:215c9308dc52 6
co657_frmb 0:215c9308dc52 7 #include "mbed.h"
co657_frmb 0:215c9308dc52 8 #include "C12832.h"
co657_frmb 0:215c9308dc52 9 #include "gfx3d.h"
co657_frmb 0:215c9308dc52 10
co657_frmb 3:2d8982c06eee 11 #define DISPLAY_WIDTH (128)
co657_frmb 3:2d8982c06eee 12 #define DISPLAY_HEIGHT (32)
co657_frmb 3:2d8982c06eee 13
co657_frmb 8:55ee7af49f47 14
co657_frmb 8:55ee7af49f47 15 static float g3d_z_depth = G3D_Z_DEPTH;
co657_frmb 8:55ee7af49f47 16 static float g3d_x_scale = G3D_X_SCALE;
co657_frmb 8:55ee7af49f47 17 static float g3d_y_scale = G3D_Y_SCALE;
co657_frmb 8:55ee7af49f47 18
co657_frmb 8:55ee7af49f47 19
co657_frmb 8:55ee7af49f47 20 /** Sets the Z depth */
co657_frmb 8:55ee7af49f47 21 void gfx3d_set_z_depth (const float zd)
co657_frmb 3:2d8982c06eee 22 {
co657_frmb 8:55ee7af49f47 23 g3d_z_depth = zd;
co657_frmb 3:2d8982c06eee 24 }
co657_frmb 3:2d8982c06eee 25
co657_frmb 0:215c9308dc52 26
co657_frmb 1:f346d04ccbad 27 /** rotates a base set of points into a new set (demoscene style)
co657_frmb 1:f346d04ccbad 28 *
co657_frmb 1:f346d04ccbad 29 * @param src Source points.
co657_frmb 1:f346d04ccbad 30 * @param dst Destination points.
co657_frmb 1:f346d04ccbad 31 * @param npnts Number of points.
co657_frmb 1:f346d04ccbad 32 * @param a Angle to rotate by (0-255).
co657_frmb 0:215c9308dc52 33 */
co657_frmb 0:215c9308dc52 34 void gfx3d_rotate_demo (const g3d_p3_t *src, g3d_p3_t *dst, const int npnts, const angle_t a)
co657_frmb 0:215c9308dc52 35 {
co657_frmb 0:215c9308dc52 36 float sinval = gfx3d_sin (a);
co657_frmb 0:215c9308dc52 37 float cosval = gfx3d_cos (a);
co657_frmb 0:215c9308dc52 38 int i;
co657_frmb 0:215c9308dc52 39
co657_frmb 0:215c9308dc52 40 for (i=0; i<npnts; i++) {
co657_frmb 0:215c9308dc52 41 float x1 = (src[i].x * cosval) + (src[i].y * sinval);
co657_frmb 0:215c9308dc52 42 float y1 = (src[i].y * cosval) - (src[i].x * sinval);
co657_frmb 0:215c9308dc52 43 float z1 = (src[i].z * cosval) - (x1 * sinval);
co657_frmb 0:215c9308dc52 44 float t;
co657_frmb 0:215c9308dc52 45
co657_frmb 0:215c9308dc52 46 dst[i].x = (x1 * cosval) + (src[i].z * sinval);
co657_frmb 0:215c9308dc52 47 t = (y1 * cosval) + (z1 * sinval);
co657_frmb 0:215c9308dc52 48 dst[i].z = (z1 * cosval) - (y1 * sinval);
co657_frmb 0:215c9308dc52 49 dst[i].y = t;
co657_frmb 0:215c9308dc52 50 }
co657_frmb 0:215c9308dc52 51
co657_frmb 0:215c9308dc52 52 }
co657_frmb 0:215c9308dc52 53
co657_frmb 8:55ee7af49f47 54
co657_frmb 8:55ee7af49f47 55 /** rotates a set of points around the X axis.
co657_frmb 8:55ee7af49f47 56 *
co657_frmb 8:55ee7af49f47 57 * @param src Source points.
co657_frmb 8:55ee7af49f47 58 * @param dst Destination points.
co657_frmb 8:55ee7af49f47 59 * @param npnts Number of points.
co657_frmb 8:55ee7af49f47 60 * @param a Angle to rotate by (0-255).
co657_frmb 8:55ee7af49f47 61 */
co657_frmb 5:2aaaf4e78a53 62 void gfx3d_rotate_x (const g3d_p3_t *src, g3d_p3_t *dst, const int npnts, const angle_t a)
co657_frmb 5:2aaaf4e78a53 63 {
co657_frmb 5:2aaaf4e78a53 64 float sinval = gfx3d_sin (a);
co657_frmb 5:2aaaf4e78a53 65 float cosval = gfx3d_cos (a);
co657_frmb 5:2aaaf4e78a53 66 int i;
co657_frmb 5:2aaaf4e78a53 67
co657_frmb 5:2aaaf4e78a53 68 for (i=0; i<npnts; i++) {
co657_frmb 5:2aaaf4e78a53 69 float t = src[i].y;
co657_frmb 5:2aaaf4e78a53 70
co657_frmb 5:2aaaf4e78a53 71 dst[i].x = src[i].x;
co657_frmb 5:2aaaf4e78a53 72 dst[i].y = (src[i].y * cosval) + (src[i].z * sinval);
co657_frmb 5:2aaaf4e78a53 73 dst[i].z = (src[i].z * cosval) - (t * sinval);
co657_frmb 5:2aaaf4e78a53 74 }
co657_frmb 5:2aaaf4e78a53 75
co657_frmb 5:2aaaf4e78a53 76 }
co657_frmb 5:2aaaf4e78a53 77
co657_frmb 5:2aaaf4e78a53 78
co657_frmb 5:2aaaf4e78a53 79 void gfx3d_rotate_y (const g3d_p3_t *src, g3d_p3_t *dst, const int npnts, const angle_t a)
co657_frmb 5:2aaaf4e78a53 80 {
co657_frmb 5:2aaaf4e78a53 81 float sinval = gfx3d_sin (a);
co657_frmb 5:2aaaf4e78a53 82 float cosval = gfx3d_cos (a);
co657_frmb 5:2aaaf4e78a53 83 int i;
co657_frmb 5:2aaaf4e78a53 84
co657_frmb 5:2aaaf4e78a53 85 for (i=0; i<npnts; i++) {
co657_frmb 5:2aaaf4e78a53 86 float t = src[i].x;
co657_frmb 5:2aaaf4e78a53 87
co657_frmb 5:2aaaf4e78a53 88 dst[i].x = (src[i].x * cosval) + (src[i].z * sinval);
co657_frmb 5:2aaaf4e78a53 89 dst[i].y = src[i].y;
co657_frmb 5:2aaaf4e78a53 90 dst[i].z = (src[i].z * cosval) - (t * sinval);
co657_frmb 5:2aaaf4e78a53 91 }
co657_frmb 5:2aaaf4e78a53 92
co657_frmb 5:2aaaf4e78a53 93 }
co657_frmb 5:2aaaf4e78a53 94
co657_frmb 5:2aaaf4e78a53 95
co657_frmb 5:2aaaf4e78a53 96 void gfx3d_rotate_z (const g3d_p3_t *src, g3d_p3_t *dst, const int npnts, const angle_t a)
co657_frmb 5:2aaaf4e78a53 97 {
co657_frmb 5:2aaaf4e78a53 98 float sinval = gfx3d_sin (a);
co657_frmb 5:2aaaf4e78a53 99 float cosval = gfx3d_cos (a);
co657_frmb 5:2aaaf4e78a53 100 int i;
co657_frmb 5:2aaaf4e78a53 101
co657_frmb 5:2aaaf4e78a53 102 for (i=0; i<npnts; i++) {
co657_frmb 5:2aaaf4e78a53 103 float t = src[i].x;
co657_frmb 5:2aaaf4e78a53 104
co657_frmb 5:2aaaf4e78a53 105 dst[i].x = (src[i].x * cosval) + (src[i].y * sinval);
co657_frmb 5:2aaaf4e78a53 106 dst[i].y = (src[i].y * cosval) - (t * sinval);
co657_frmb 5:2aaaf4e78a53 107 dst[i].z = src[i].z;
co657_frmb 5:2aaaf4e78a53 108 }
co657_frmb 5:2aaaf4e78a53 109
co657_frmb 5:2aaaf4e78a53 110 }
co657_frmb 5:2aaaf4e78a53 111
co657_frmb 0:215c9308dc52 112
co657_frmb 0:215c9308dc52 113 /*
co657_frmb 0:215c9308dc52 114 * translates a set of 3D points. 'src' and 'dst' can be the same
co657_frmb 0:215c9308dc52 115 */
co657_frmb 0:215c9308dc52 116 void gfx3d_translate (const g3d_p3_t *src, g3d_p3_t *dst, const int npnts, const g3d_p3_t tx)
co657_frmb 0:215c9308dc52 117 {
co657_frmb 0:215c9308dc52 118 int i;
co657_frmb 0:215c9308dc52 119
co657_frmb 0:215c9308dc52 120 if (tx.x != 0.0f) {
co657_frmb 0:215c9308dc52 121 for (i=0; i<npnts; i++) {
co657_frmb 0:215c9308dc52 122 dst[i].x = src[i].x + tx.x;
co657_frmb 0:215c9308dc52 123 }
co657_frmb 0:215c9308dc52 124 } else if (src != dst) {
co657_frmb 0:215c9308dc52 125 for (i=0; i<npnts; i++) {
co657_frmb 0:215c9308dc52 126 dst[i].x = src[i].x;
co657_frmb 0:215c9308dc52 127 }
co657_frmb 0:215c9308dc52 128 }
co657_frmb 0:215c9308dc52 129 if (tx.y != 0.0f) {
co657_frmb 0:215c9308dc52 130 for (i=0; i<npnts; i++) {
co657_frmb 0:215c9308dc52 131 dst[i].y = src[i].y + tx.y;
co657_frmb 0:215c9308dc52 132 }
co657_frmb 0:215c9308dc52 133 } else if (src != dst) {
co657_frmb 0:215c9308dc52 134 for (i=0; i<npnts; i++) {
co657_frmb 0:215c9308dc52 135 dst[i].y = src[i].y;
co657_frmb 0:215c9308dc52 136 }
co657_frmb 0:215c9308dc52 137 }
co657_frmb 0:215c9308dc52 138 if (tx.z != 0.0f) {
co657_frmb 0:215c9308dc52 139 for (i=0; i<npnts; i++) {
co657_frmb 0:215c9308dc52 140 dst[i].z = src[i].z + tx.z;
co657_frmb 0:215c9308dc52 141 }
co657_frmb 0:215c9308dc52 142 } else if (src != dst) {
co657_frmb 0:215c9308dc52 143 for (i=0; i<npnts; i++) {
co657_frmb 0:215c9308dc52 144 dst[i].z = src[i].z;
co657_frmb 0:215c9308dc52 145 }
co657_frmb 0:215c9308dc52 146 }
co657_frmb 0:215c9308dc52 147 }
co657_frmb 0:215c9308dc52 148
co657_frmb 0:215c9308dc52 149
co657_frmb 8:55ee7af49f47 150 /** Scales a set of points.
co657_frmb 8:55ee7af49f47 151 *
co657_frmb 8:55ee7af49f47 152 */
co657_frmb 5:2aaaf4e78a53 153 void gfx3d_scale (const g3d_p3_t *src, g3d_p3_t *dst, const int npnts, const g3d_p3_t scl)
co657_frmb 5:2aaaf4e78a53 154 {
co657_frmb 5:2aaaf4e78a53 155 int i;
co657_frmb 5:2aaaf4e78a53 156
co657_frmb 5:2aaaf4e78a53 157 if (scl.x != 1.0f) {
co657_frmb 5:2aaaf4e78a53 158 for (i=0; i<npnts; i++) {
co657_frmb 5:2aaaf4e78a53 159 dst[i].x = src[i].x * scl.x;
co657_frmb 5:2aaaf4e78a53 160 }
co657_frmb 5:2aaaf4e78a53 161 } else if (src != dst) {
co657_frmb 5:2aaaf4e78a53 162 for (i=0; i<npnts; i++) {
co657_frmb 5:2aaaf4e78a53 163 dst[i].x = src[i].x;
co657_frmb 5:2aaaf4e78a53 164 }
co657_frmb 5:2aaaf4e78a53 165 }
co657_frmb 5:2aaaf4e78a53 166 if (scl.y != 1.0f) {
co657_frmb 5:2aaaf4e78a53 167 for (i=0; i<npnts; i++) {
co657_frmb 5:2aaaf4e78a53 168 dst[i].y = src[i].y * scl.y;
co657_frmb 5:2aaaf4e78a53 169 }
co657_frmb 5:2aaaf4e78a53 170 } else if (src != dst) {
co657_frmb 5:2aaaf4e78a53 171 for (i=0; i<npnts; i++) {
co657_frmb 5:2aaaf4e78a53 172 dst[i].y = src[i].y;
co657_frmb 5:2aaaf4e78a53 173 }
co657_frmb 5:2aaaf4e78a53 174 }
co657_frmb 5:2aaaf4e78a53 175 if (scl.z != 1.0f) {
co657_frmb 5:2aaaf4e78a53 176 for (i=0; i<npnts; i++) {
co657_frmb 5:2aaaf4e78a53 177 dst[i].z = src[i].z * scl.z;
co657_frmb 5:2aaaf4e78a53 178 }
co657_frmb 5:2aaaf4e78a53 179 } else if (src != dst) {
co657_frmb 5:2aaaf4e78a53 180 for (i=0; i<npnts; i++) {
co657_frmb 5:2aaaf4e78a53 181 dst[i].z = src[i].z;
co657_frmb 5:2aaaf4e78a53 182 }
co657_frmb 5:2aaaf4e78a53 183 }
co657_frmb 5:2aaaf4e78a53 184 }
co657_frmb 5:2aaaf4e78a53 185
co657_frmb 5:2aaaf4e78a53 186
co657_frmb 5:2aaaf4e78a53 187
co657_frmb 3:2d8982c06eee 188 /**
co657_frmb 3:2d8982c06eee 189 * projects a set of 3D points into a 2D space (pretty crude)
co657_frmb 0:215c9308dc52 190 */
co657_frmb 0:215c9308dc52 191 void gfx3d_project (const g3d_p3_t *src, g3d_2p3_t *dst, const int npnts)
co657_frmb 0:215c9308dc52 192 {
co657_frmb 0:215c9308dc52 193 int i;
co657_frmb 0:215c9308dc52 194
co657_frmb 0:215c9308dc52 195 for (i=0; i<npnts; i++) {
co657_frmb 0:215c9308dc52 196 float ez = src[i].z;
co657_frmb 0:215c9308dc52 197
co657_frmb 4:7a9f0515d0a0 198 dst[i].z = (int16_t)((ez + G3D_ZBADD) * G3D_ZBSCALE);
co657_frmb 8:55ee7af49f47 199 ez += g3d_z_depth;
co657_frmb 8:55ee7af49f47 200 dst[i].x = (int16_t)((src[i].x * g3d_x_scale) / ez) + G3D_X2_SHIFT;
co657_frmb 8:55ee7af49f47 201 dst[i].y = (int16_t)((src[i].y * g3d_y_scale) / ez) + G3D_Y2_SHIFT;
co657_frmb 3:2d8982c06eee 202 }
co657_frmb 3:2d8982c06eee 203 }
co657_frmb 3:2d8982c06eee 204
co657_frmb 3:2d8982c06eee 205
co657_frmb 8:55ee7af49f47 206 /** Takes a set of 8 projected points and creates a set of <=12 triangular polygons representing the surface of a cube.
co657_frmb 8:55ee7af49f47 207 * Also attaches texture pointers if given.
co657_frmb 3:2d8982c06eee 208 */
co657_frmb 8:55ee7af49f47 209 void gfx3d_cubify_points (const g3d_2p3_t *src, g3d_poly_t *dst, int *npoly, const int backfaces, const uint8_t **txptrs)
co657_frmb 3:2d8982c06eee 210 {
co657_frmb 6:0bd002c936bb 211 static const int cubemap3[12][3] = {{3,0,1}, {1,2,3}, {2,1,5}, {5,6,2}, {6,5,4}, {4,7,6}, {7,4,0}, {0,3,7}, {1,0,4}, {4,5,1}, {7,3,2}, {2,6,7}};
co657_frmb 6:0bd002c936bb 212 static const uint16_t txmap[2][3] = {{0x1f00, 0x0000, 0x001f}, {0x001f, 0x1f1f, 0x1f00}}; /* 0xYYXX */
co657_frmb 3:2d8982c06eee 213
co657_frmb 3:2d8982c06eee 214 int i, pidx;
co657_frmb 3:2d8982c06eee 215 int norms[6];
co657_frmb 3:2d8982c06eee 216
co657_frmb 3:2d8982c06eee 217 *npoly = 12; /* assume all to start with */
co657_frmb 3:2d8982c06eee 218
co657_frmb 3:2d8982c06eee 219 /* compute normals */
co657_frmb 3:2d8982c06eee 220 for (i=0; i<6; i++) {
co657_frmb 6:0bd002c936bb 221 const int *face = cubemap3[i*2];
co657_frmb 3:2d8982c06eee 222
co657_frmb 6:0bd002c936bb 223 int norm = ((src[face[0]].y - src[face[1]].y) * (src[face[2]].x - src[face[1]].x)) -
co657_frmb 6:0bd002c936bb 224 ((src[face[2]].y - src[face[1]].y) * (src[face[0]].x - src[face[1]].x));
co657_frmb 6:0bd002c936bb 225 if (!backfaces && (norm < 0)) {
co657_frmb 3:2d8982c06eee 226 /* not showing this one */
co657_frmb 3:2d8982c06eee 227 *npoly = *npoly - 2;
co657_frmb 3:2d8982c06eee 228 }
co657_frmb 3:2d8982c06eee 229 norms[i] = norm;
co657_frmb 3:2d8982c06eee 230 }
co657_frmb 3:2d8982c06eee 231
co657_frmb 3:2d8982c06eee 232 /* wind polygons */
co657_frmb 3:2d8982c06eee 233 pidx = 0;
co657_frmb 3:2d8982c06eee 234 for (i=0; (i<12) && (pidx < *npoly); i++) {
co657_frmb 6:0bd002c936bb 235 if (!backfaces && (norms[i>>1] < 0)) {
co657_frmb 3:2d8982c06eee 236 /* not showing this one */
co657_frmb 3:2d8982c06eee 237 } else {
co657_frmb 3:2d8982c06eee 238 int p;
co657_frmb 3:2d8982c06eee 239
co657_frmb 3:2d8982c06eee 240 dst[pidx].norm = norms[i>>1];
co657_frmb 8:55ee7af49f47 241 dst[pidx].txptr = (txptrs == NULL) ? NULL : (uint8_t *)txptrs[i>>1];
co657_frmb 8:55ee7af49f47 242
co657_frmb 3:2d8982c06eee 243 for (p=0; p<3; p++) {
co657_frmb 3:2d8982c06eee 244 dst[pidx].pts[p].x = src[cubemap3[i][p]].x;
co657_frmb 3:2d8982c06eee 245 dst[pidx].pts[p].y = src[cubemap3[i][p]].y;
co657_frmb 3:2d8982c06eee 246 dst[pidx].pts[p].z = src[cubemap3[i][p]].z;
co657_frmb 5:2aaaf4e78a53 247 dst[pidx].tx_pts[p] = txmap[i&1][p];
co657_frmb 3:2d8982c06eee 248 }
co657_frmb 3:2d8982c06eee 249 pidx++;
co657_frmb 3:2d8982c06eee 250 }
co657_frmb 3:2d8982c06eee 251 }
co657_frmb 3:2d8982c06eee 252 }
co657_frmb 3:2d8982c06eee 253
co657_frmb 3:2d8982c06eee 254
co657_frmb 3:2d8982c06eee 255 /**
co657_frmb 5:2aaaf4e78a53 256 * takes a set of 4 projected points and creates a set of <=2 triangular polygons representing the square
co657_frmb 3:2d8982c06eee 257 */
co657_frmb 5:2aaaf4e78a53 258 void gfx3d_squarify_points (const g3d_2p3_t *src, g3d_poly_t *dst, int *npoly, const int backfaces)
co657_frmb 3:2d8982c06eee 259 {
co657_frmb 5:2aaaf4e78a53 260 static const int squaremap3[2][3] = {{3,0,1}, {1,2,3}};
co657_frmb 5:2aaaf4e78a53 261 static const uint16_t txmap[2][3] = {{0x1f00, 0x0000, 0x001f}, {0x001f, 0x1f1f, 0x1f00}}; /* 0xYYXX */
co657_frmb 3:2d8982c06eee 262
co657_frmb 5:2aaaf4e78a53 263 int i, pidx;
co657_frmb 5:2aaaf4e78a53 264 int norm = ((src[3].y - src[0].y) * (src[1].x - src[0].x)) -
co657_frmb 5:2aaaf4e78a53 265 ((src[1].y - src[0].y) * (src[3].x - src[0].x));
co657_frmb 3:2d8982c06eee 266
co657_frmb 5:2aaaf4e78a53 267 if (!backfaces && (norm < 0)) {
co657_frmb 5:2aaaf4e78a53 268 /* not showing anything */
co657_frmb 5:2aaaf4e78a53 269 *npoly = 0;
co657_frmb 3:2d8982c06eee 270 return;
co657_frmb 3:2d8982c06eee 271 }
co657_frmb 5:2aaaf4e78a53 272
co657_frmb 5:2aaaf4e78a53 273 *npoly = 2;
co657_frmb 3:2d8982c06eee 274
co657_frmb 5:2aaaf4e78a53 275 /* wind polygons */
co657_frmb 5:2aaaf4e78a53 276 for (i=0; i<2; i++) {
co657_frmb 5:2aaaf4e78a53 277 int p;
co657_frmb 3:2d8982c06eee 278
co657_frmb 5:2aaaf4e78a53 279 dst[i].norm = norm;
co657_frmb 5:2aaaf4e78a53 280 for (p=0; p<3; p++) {
co657_frmb 5:2aaaf4e78a53 281 dst[i].pts[p].x = src[squaremap3[i][p]].x;
co657_frmb 5:2aaaf4e78a53 282 dst[i].pts[p].y = src[squaremap3[i][p]].y;
co657_frmb 5:2aaaf4e78a53 283 dst[i].pts[p].z = src[squaremap3[i][p]].z;
co657_frmb 5:2aaaf4e78a53 284 dst[i].tx_pts[p] = txmap[i][p];
co657_frmb 3:2d8982c06eee 285 }
co657_frmb 3:2d8982c06eee 286 }
co657_frmb 5:2aaaf4e78a53 287 return;
co657_frmb 3:2d8982c06eee 288 }
co657_frmb 3:2d8982c06eee 289
co657_frmb 3:2d8982c06eee 290
co657_frmb 3:2d8982c06eee 291
co657_frmb 3:2d8982c06eee 292 /**
co657_frmb 3:2d8982c06eee 293 * takes a polygon and draws its wireframe on the given LCD.
co657_frmb 3:2d8982c06eee 294 */
co657_frmb 3:2d8982c06eee 295 void gfx3d_wirepoly (const g3d_poly_t *src, C12832 &lcd)
co657_frmb 3:2d8982c06eee 296 {
co657_frmb 3:2d8982c06eee 297 #if G3D_MAX_POLY_POINTS == 3
co657_frmb 3:2d8982c06eee 298 lcd.line (src->pts[0].x, src->pts[0].y, src->pts[1].x, src->pts[1].y, 1);
co657_frmb 3:2d8982c06eee 299 lcd.line (src->pts[1].x, src->pts[1].y, src->pts[2].x, src->pts[2].y, 1);
co657_frmb 3:2d8982c06eee 300 lcd.line (src->pts[2].x, src->pts[2].y, src->pts[0].x, src->pts[0].y, 1);
co657_frmb 3:2d8982c06eee 301 #endif
co657_frmb 3:2d8982c06eee 302 }
co657_frmb 3:2d8982c06eee 303
co657_frmb 3:2d8982c06eee 304
co657_frmb 3:2d8982c06eee 305 /**
co657_frmb 3:2d8982c06eee 306 * takes a polygon and draws its wireframe on the given LCD, taking Z buffering into consideration
co657_frmb 3:2d8982c06eee 307 */
co657_frmb 3:2d8982c06eee 308 void gfx3d_wirepoly_z (const g3d_poly_t *src, C12832 &lcd)
co657_frmb 3:2d8982c06eee 309 {
co657_frmb 3:2d8982c06eee 310 #if G3D_MAX_POLY_POINTS == 3
co657_frmb 3:2d8982c06eee 311 #endif
co657_frmb 3:2d8982c06eee 312 }
co657_frmb 3:2d8982c06eee 313
co657_frmb 3:2d8982c06eee 314
co657_frmb 3:2d8982c06eee 315
co657_frmb 3:2d8982c06eee 316 /**
co657_frmb 3:2d8982c06eee 317 * takes a set of 8 projected points and draws a wireframe cube on the given LCD.
co657_frmb 0:215c9308dc52 318 */
co657_frmb 0:215c9308dc52 319 void gfx3d_wirecube (const g3d_2p3_t *src, C12832 &lcd)
co657_frmb 0:215c9308dc52 320 {
co657_frmb 0:215c9308dc52 321 lcd.line (src[0].x, src[0].y, src[1].x, src[1].y, 1);
co657_frmb 0:215c9308dc52 322 lcd.line (src[1].x, src[1].y, src[2].x, src[2].y, 1);
co657_frmb 0:215c9308dc52 323 lcd.line (src[2].x, src[2].y, src[3].x, src[3].y, 1);
co657_frmb 0:215c9308dc52 324 lcd.line (src[3].x, src[3].y, src[0].x, src[0].y, 1);
co657_frmb 0:215c9308dc52 325
co657_frmb 0:215c9308dc52 326 lcd.line (src[4].x, src[4].y, src[5].x, src[5].y, 1);
co657_frmb 0:215c9308dc52 327 lcd.line (src[5].x, src[5].y, src[6].x, src[6].y, 1);
co657_frmb 0:215c9308dc52 328 lcd.line (src[6].x, src[6].y, src[7].x, src[7].y, 1);
co657_frmb 0:215c9308dc52 329 lcd.line (src[7].x, src[7].y, src[4].x, src[4].y, 1);
co657_frmb 0:215c9308dc52 330
co657_frmb 0:215c9308dc52 331 lcd.line (src[0].x, src[0].y, src[4].x, src[4].y, 1);
co657_frmb 0:215c9308dc52 332 lcd.line (src[1].x, src[1].y, src[5].x, src[5].y, 1);
co657_frmb 0:215c9308dc52 333 lcd.line (src[2].x, src[2].y, src[6].x, src[6].y, 1);
co657_frmb 0:215c9308dc52 334 lcd.line (src[3].x, src[3].y, src[7].x, src[7].y, 1);
co657_frmb 3:2d8982c06eee 335 }
co657_frmb 3:2d8982c06eee 336