Basic 3D graphics for the MBED application-shield on-board LCD (initial/incomplete).
gfx3d.cpp@9:db4ec6f7d8b2, 2015-11-29 (annotated)
- 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?
User | Revision | Line number | New 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 |