Graphical demo for the LPC4088 Experiment Base Board with one of the Display Expansion Kits. This demo shows a rotating 3D cube with and without textures.

Dependencies:   EALib mbed

Committer:
embeddedartists
Date:
Fri Oct 03 12:48:37 2014 +0000
Revision:
0:c828045bbe69
First version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
embeddedartists 0:c828045bbe69 1 /******************************************************************************
embeddedartists 0:c828045bbe69 2 * Includes
embeddedartists 0:c828045bbe69 3 *****************************************************************************/
embeddedartists 0:c828045bbe69 4
embeddedartists 0:c828045bbe69 5 #include "mbed.h"
embeddedartists 0:c828045bbe69 6
embeddedartists 0:c828045bbe69 7 #include "LcdController.h"
embeddedartists 0:c828045bbe69 8 #include "EaLcdBoard.h"
embeddedartists 0:c828045bbe69 9 #include "CubeDemo.h"
embeddedartists 0:c828045bbe69 10
embeddedartists 0:c828045bbe69 11 #include "Image.h"
embeddedartists 0:c828045bbe69 12
embeddedartists 0:c828045bbe69 13 //#include "wchar.h"
embeddedartists 0:c828045bbe69 14 #include <math.h>
embeddedartists 0:c828045bbe69 15
embeddedartists 0:c828045bbe69 16
embeddedartists 0:c828045bbe69 17 extern const unsigned char cube_image1[];
embeddedartists 0:c828045bbe69 18 extern int cube_image1_sz;
embeddedartists 0:c828045bbe69 19 extern const unsigned char cube_image2[];
embeddedartists 0:c828045bbe69 20 extern int cube_image2_sz;
embeddedartists 0:c828045bbe69 21
embeddedartists 0:c828045bbe69 22
embeddedartists 0:c828045bbe69 23 /******************************************************************************
embeddedartists 0:c828045bbe69 24 * Typedefs and defines
embeddedartists 0:c828045bbe69 25 *****************************************************************************/
embeddedartists 0:c828045bbe69 26
embeddedartists 0:c828045bbe69 27 /******************************************************************************
embeddedartists 0:c828045bbe69 28 * Local variables
embeddedartists 0:c828045bbe69 29 *****************************************************************************/
embeddedartists 0:c828045bbe69 30
embeddedartists 0:c828045bbe69 31
embeddedartists 0:c828045bbe69 32 /******************************************************************************
embeddedartists 0:c828045bbe69 33 * External variables
embeddedartists 0:c828045bbe69 34 *****************************************************************************/
embeddedartists 0:c828045bbe69 35
embeddedartists 0:c828045bbe69 36
embeddedartists 0:c828045bbe69 37 /******************************************************************************
embeddedartists 0:c828045bbe69 38 * Local functions
embeddedartists 0:c828045bbe69 39 *****************************************************************************/
embeddedartists 0:c828045bbe69 40
embeddedartists 0:c828045bbe69 41
embeddedartists 0:c828045bbe69 42
embeddedartists 0:c828045bbe69 43
embeddedartists 0:c828045bbe69 44 /* (c) 2008 by Denis Markovic
embeddedartists 0:c828045bbe69 45 I give hereby permission to Anders Rosvall of Embedded Artists to use this function in his ARM7 board
embeddedartists 0:c828045bbe69 46 demo program, as long as I'm not hold responsible for bugs in the code and I take not responsibility
embeddedartists 0:c828045bbe69 47 for any damage used by that code :-) */
embeddedartists 0:c828045bbe69 48
embeddedartists 0:c828045bbe69 49 #define TRIANG_PROJ_SFT 16
embeddedartists 0:c828045bbe69 50
embeddedartists 0:c828045bbe69 51 static unsigned short DivTab[] =
embeddedartists 0:c828045bbe69 52 {0xffff, 0x7fff, 0x5554, 0x3fff, 0x3332, 0x2aa9, 0x2491,
embeddedartists 0:c828045bbe69 53 0x1fff, 0x1c70, 0x1998, 0x1744, 0x1554, 0x13b0, 0x1248, 0x1110,
embeddedartists 0:c828045bbe69 54 0x0fff, 0x0f0e, 0x0e37, 0x0d78, 0x0ccb, 0x0c2f, 0x0ba1, 0x0b20,
embeddedartists 0:c828045bbe69 55 0x0aa9, 0x0a3c, 0x09d7, 0x097a, 0x0923, 0x08d2, 0x0887, 0x0841,
embeddedartists 0:c828045bbe69 56 0x07ff, 0x07c0, 0x0786, 0x074f, 0x071b, 0x06ea, 0x06bb, 0x068f,
embeddedartists 0:c828045bbe69 57 0x0665, 0x063d, 0x0617, 0x05f3, 0x05d0, 0x05af, 0x058f, 0x0571,
embeddedartists 0:c828045bbe69 58 0x0554, 0x0538, 0x051d, 0x0504, 0x04eb, 0x04d3, 0x04bc, 0x04a6,
embeddedartists 0:c828045bbe69 59 0x0491, 0x047c, 0x0468, 0x0455, 0x0443, 0x0431, 0x0420, 0x040f,
embeddedartists 0:c828045bbe69 60 0x03ff, 0x03ef, 0x03df, 0x03d1, 0x03c2, 0x03b4, 0x03a7, 0x039a,
embeddedartists 0:c828045bbe69 61 0x038d, 0x0380, 0x0374, 0x0368, 0x035d, 0x0352, 0x0347, 0x033c,
embeddedartists 0:c828045bbe69 62 0x0332, 0x0328, 0x031e, 0x0314, 0x030b, 0x0302, 0x02f9, 0x02f0,
embeddedartists 0:c828045bbe69 63 0x02e7, 0x02df, 0x02d7, 0x02cf, 0x02c7, 0x02bf, 0x02b8, 0x02b0,
embeddedartists 0:c828045bbe69 64 0x02a9, 0x02a2, 0x029b, 0x0294, 0x028e, 0x0287, 0x0281, 0x027b,
embeddedartists 0:c828045bbe69 65 0x0275, 0x026f, 0x0269, 0x0263, 0x025d, 0x0258, 0x0252, 0x024d,
embeddedartists 0:c828045bbe69 66 0x0248, 0x0242, 0x023d, 0x0238, 0x0233, 0x022f, 0x022a, 0x0225,
embeddedartists 0:c828045bbe69 67 0x0221, 0x021c, 0x0218, 0x0213, 0x020f, 0x020b, 0x0207, 0x0203,
embeddedartists 0:c828045bbe69 68 0x01ff, 0x01fb, 0x01f7, 0x01f3, 0x01ef, 0x01eb, 0x01e8, 0x01e4,
embeddedartists 0:c828045bbe69 69 0x01e0, 0x01dd, 0x01d9, 0x01d6, 0x01d3, 0x01cf, 0x01cc, 0x01c9,
embeddedartists 0:c828045bbe69 70 0x01c6, 0x01c2, 0x01bf, 0x01bc, 0x01b9, 0x01b6, 0x01b3, 0x01b1,
embeddedartists 0:c828045bbe69 71 0x01ae, 0x01ab, 0x01a8, 0x01a5, 0x01a3, 0x01a0, 0x019d, 0x019b,
embeddedartists 0:c828045bbe69 72 0x0198, 0x0196, 0x0193, 0x0191, 0x018e, 0x018c, 0x0189, 0x0187,
embeddedartists 0:c828045bbe69 73 0x0185, 0x0182, 0x0180, 0x017e, 0x017c, 0x0179, 0x0177, 0x0175,
embeddedartists 0:c828045bbe69 74 0x0173, 0x0171, 0x016f, 0x016d, 0x016b, 0x0169, 0x0167, 0x0165,
embeddedartists 0:c828045bbe69 75 0x0163, 0x0161, 0x015f, 0x015d, 0x015b, 0x0159, 0x0157, 0x0156,
embeddedartists 0:c828045bbe69 76 0x0154, 0x0152, 0x0150, 0x014f, 0x014d, 0x014b, 0x0149, 0x0148,
embeddedartists 0:c828045bbe69 77 0x0146, 0x0145, 0x0143, 0x0141, 0x0140, 0x013e, 0x013d, 0x013b,
embeddedartists 0:c828045bbe69 78 0x013a, 0x0138, 0x0137, 0x0135, 0x0134, 0x0132, 0x0131, 0x012f,
embeddedartists 0:c828045bbe69 79 0x012e, 0x012d, 0x012b, 0x012a, 0x0128, 0x0127, 0x0126, 0x0124,
embeddedartists 0:c828045bbe69 80 0x0123, 0x0122, 0x0120, 0x011f, 0x011e, 0x011d, 0x011b, 0x011a,
embeddedartists 0:c828045bbe69 81 0x0119, 0x0118, 0x0117, 0x0115, 0x0114, 0x0113, 0x0112, 0x0111,
embeddedartists 0:c828045bbe69 82 0x0110, 0x010e, 0x010d, 0x010c, 0x010b, 0x010a, 0x0109, 0x0108,
embeddedartists 0:c828045bbe69 83 0x0107, 0x0106, 0x0105, 0x0104, 0x0103, 0x0102, 0x0101, 0x0100,
embeddedartists 0:c828045bbe69 84 0x00ff, 0x00fe, 0x00fd, 0x00fc, 0x00fb, 0x00fa, 0x00f9, 0x00f8,
embeddedartists 0:c828045bbe69 85 0x00f7, 0x00f6, 0x00f5, 0x00f4, 0x00f3, 0x00f2, 0x00f1, 0x00f0,
embeddedartists 0:c828045bbe69 86 0x00ef, 0x00ef, 0x00ee, 0x00ed, 0x00ec, 0x00eb, 0x00ea, 0x00e9,
embeddedartists 0:c828045bbe69 87 0x00e9, 0x00e8, 0x00e7, 0x00e6, 0x00e5, 0x00e4, 0x00e4, 0x00e3,
embeddedartists 0:c828045bbe69 88 0x00e2, 0x00e1, 0x00e0, 0x00e0, 0x00df, 0x00de, 0x00dd, 0x00dd,
embeddedartists 0:c828045bbe69 89 0x00dc, 0x00db, 0x00da, 0x00da, 0x00d9, 0x00d8, 0x00d8, 0x00d7,
embeddedartists 0:c828045bbe69 90 0x00d6, 0x00d5, 0x00d5, 0x00d4, 0x00d3, 0x00d3, 0x00d2, 0x00d1,
embeddedartists 0:c828045bbe69 91 0x00d1, 0x00d0, 0x00cf, 0x00cf, 0x00ce, 0x00cd, 0x00cd, 0x00cc,
embeddedartists 0:c828045bbe69 92 0x00cb, 0x00cb, 0x00ca, 0x00c9, 0x00c9, 0x00c8, 0x00c8, 0x00c7,
embeddedartists 0:c828045bbe69 93 0x00c6, 0x00c6, 0x00c5, 0x00c4, 0x00c4, 0x00c3, 0x00c3, 0x00c2,
embeddedartists 0:c828045bbe69 94 0x00c2, 0x00c1, 0x00c0, 0x00c0, 0x00bf, 0x00bf, 0x00be, 0x00be,
embeddedartists 0:c828045bbe69 95 0x00bd, 0x00bc, 0x00bc, 0x00bb, 0x00bb, 0x00ba, 0x00ba, 0x00b9,
embeddedartists 0:c828045bbe69 96 0x00b9, 0x00b8, 0x00b8, 0x00b7, 0x00b7, 0x00b6, 0x00b6, 0x00b5,
embeddedartists 0:c828045bbe69 97 0x00b5, 0x00b4, 0x00b4, 0x00b3, 0x00b3, 0x00b2, 0x00b2, 0x00b1,
embeddedartists 0:c828045bbe69 98 0x00b1, 0x00b0, 0x00b0, 0x00af, 0x00af, 0x00ae, 0x00ae, 0x00ad,
embeddedartists 0:c828045bbe69 99 0x00ad, 0x00ac, 0x00ac, 0x00ab, 0x00ab, 0x00ab, 0x00aa, 0x00aa,
embeddedartists 0:c828045bbe69 100 0x00a9, 0x00a9, 0x00a8, 0x00a8, 0x00a7, 0x00a7, 0x00a7, 0x00a6,
embeddedartists 0:c828045bbe69 101 0x00a6, 0x00a5, 0x00a5, 0x00a4, 0x00a4, 0x00a4, 0x00a3, 0x00a3,
embeddedartists 0:c828045bbe69 102 0x00a2, 0x00a2, 0x00a2, 0x00a1, 0x00a1, 0x00a0, 0x00a0, 0x00a0,
embeddedartists 0:c828045bbe69 103 0x009f, 0x009f, 0x009e, 0x009e, 0x009e, 0x009d, 0x009d, 0x009c,
embeddedartists 0:c828045bbe69 104 0x009c, 0x009c, 0x009b, 0x009b, 0x009b, 0x009a, 0x009a, 0x0099,
embeddedartists 0:c828045bbe69 105 0x0099, 0x0099, 0x0098, 0x0098, 0x0098, 0x0097, 0x0097, 0x0097,
embeddedartists 0:c828045bbe69 106 0x0096, 0x0096, 0x0096, 0x0095, 0x0095, 0x0094, 0x0094, 0x0094,
embeddedartists 0:c828045bbe69 107 0x0093, 0x0093, 0x0093, 0x0092, 0x0092, 0x0092, 0x0091, 0x0091,
embeddedartists 0:c828045bbe69 108 0x0091, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f,
embeddedartists 0:c828045bbe69 109 0x008e, 0x008e, 0x008e, 0x008d, 0x008d, 0x008d, 0x008c, 0x008c,
embeddedartists 0:c828045bbe69 110 0x008c, 0x008b, 0x008b, 0x008b, 0x008b, 0x008a, 0x008a, 0x008a,
embeddedartists 0:c828045bbe69 111 0x0089, 0x0089, 0x0089, 0x0088, 0x0088, 0x0088, 0x0088, 0x0087,
embeddedartists 0:c828045bbe69 112 0x0087, 0x0087, 0x0086, 0x0086, 0x0086, 0x0086, 0x0085, 0x0085,
embeddedartists 0:c828045bbe69 113 0x0085, 0x0085, 0x0084, 0x0084, 0x0084, 0x0083, 0x0083, 0x0083,
embeddedartists 0:c828045bbe69 114 0x0083, 0x0082, 0x0082, 0x0082, 0x0082, 0x0081, 0x0081, 0x0081,
embeddedartists 0:c828045bbe69 115 0x0081, 0x0080, 0x0080, 0x0080, 0x0080, 0x007f, 0x007f, 0x007f,
embeddedartists 0:c828045bbe69 116 };
embeddedartists 0:c828045bbe69 117
embeddedartists 0:c828045bbe69 118 /* (c) 2008 by Denis Markovic
embeddedartists 0:c828045bbe69 119 I give hereby permission to Anders Rosvall of Embedded Artists to use this function in his ARM7 board
embeddedartists 0:c828045bbe69 120 demo program, as long as I'm not hold responsible for bugs in the code and I take not responsibility
embeddedartists 0:c828045bbe69 121 for any damage used by that code :-) */
embeddedartists 0:c828045bbe69 122 void CubeDemo::CpPixel16Fast(int xSrc, int ySrc, int x, int y, Surface_t *SrcRP_p, Surface_t *DstRP_p)
embeddedartists 0:c828045bbe69 123 {
embeddedartists 0:c828045bbe69 124 unsigned short *src_p, *dst_p;
embeddedartists 0:c828045bbe69 125
embeddedartists 0:c828045bbe69 126 src_p = (unsigned short *) SrcRP_p->pixels;
embeddedartists 0:c828045bbe69 127 dst_p = (unsigned short *) DstRP_p->pixels;
embeddedartists 0:c828045bbe69 128
embeddedartists 0:c828045bbe69 129 dst_p[y * DstRP_p->w + x] = src_p[ySrc * SrcRP_p->w + xSrc];
embeddedartists 0:c828045bbe69 130
embeddedartists 0:c828045bbe69 131 return;
embeddedartists 0:c828045bbe69 132 }
embeddedartists 0:c828045bbe69 133
embeddedartists 0:c828045bbe69 134 /* (c) 2008 by Denis Markovic
embeddedartists 0:c828045bbe69 135 I give hereby permission to Anders Rosvall of Embedded Artists to use this function in his ARM7 board
embeddedartists 0:c828045bbe69 136 demo program, as long as I'm not hold responsible for bugs in the code and I take not responsibility
embeddedartists 0:c828045bbe69 137 for any damage used by that code :-)
embeddedartists 0:c828045bbe69 138
embeddedartists 0:c828045bbe69 139 Input: SrcRP_p: pointer to type holding width and height and ptr to source pixel data
embeddedartists 0:c828045bbe69 140 DstRP_p: pointer to type holding width and height and ptr to destination pixel data (i.e. gfx memory to draw to)
embeddedartists 0:c828045bbe69 141 SrcCoords_p: pointer to array holding 3 source coordinates into triangle source accessed through SrcRP_p
embeddedartists 0:c828045bbe69 142 DstCoords_p: pointer to array holding 3 destination triangle coordinates in draw buffer which is accessed through DstRP_p
embeddedartists 0:c828045bbe69 143
embeddedartists 0:c828045bbe69 144 Description: take triangle from source rectangular picture (raw data, 16 bit) and project it into a triangle
embeddedartists 0:c828045bbe69 145 in the destination picture (also 16 bit)
embeddedartists 0:c828045bbe69 146 */
embeddedartists 0:c828045bbe69 147 void CubeDemo::TriangleProjectFast(Surface_t *SrcRP_p, Surface_t *DstRP_p, Coord2D_t *SrcCoords_p, Coord2D_t *DstCoords_p)
embeddedartists 0:c828045bbe69 148 {
embeddedartists 0:c828045bbe69 149 int TopCoord = 0, MiddleCoord = 1, BottomCoord = 2;
embeddedartists 0:c828045bbe69 150 int /*SrcStartX, SrcStartY,*/ x, y, Direction, i, j;
embeddedartists 0:c828045bbe69 151 long dxDstBig, dxDstSmall, dxSrcBig, dxSrcSmall, dySrcBig, dySrcSmall, DeltaY;
embeddedartists 0:c828045bbe69 152 int DivMultVal;
embeddedartists 0:c828045bbe69 153
embeddedartists 0:c828045bbe69 154 /* 1. step: sort dst triangle points */
embeddedartists 0:c828045bbe69 155 if(DstCoords_p[1].y < DstCoords_p[TopCoord].y)
embeddedartists 0:c828045bbe69 156 {
embeddedartists 0:c828045bbe69 157 TopCoord = 1;
embeddedartists 0:c828045bbe69 158 MiddleCoord = 0;
embeddedartists 0:c828045bbe69 159 }
embeddedartists 0:c828045bbe69 160
embeddedartists 0:c828045bbe69 161 if(DstCoords_p[2].y < DstCoords_p[TopCoord].y)
embeddedartists 0:c828045bbe69 162 {
embeddedartists 0:c828045bbe69 163 TopCoord = 2;
embeddedartists 0:c828045bbe69 164 BottomCoord = 1;
embeddedartists 0:c828045bbe69 165 MiddleCoord = 0;
embeddedartists 0:c828045bbe69 166 }
embeddedartists 0:c828045bbe69 167
embeddedartists 0:c828045bbe69 168 if(DstCoords_p[BottomCoord].y < DstCoords_p[MiddleCoord].y)
embeddedartists 0:c828045bbe69 169 {
embeddedartists 0:c828045bbe69 170 int tmp;
embeddedartists 0:c828045bbe69 171 tmp = MiddleCoord;
embeddedartists 0:c828045bbe69 172 MiddleCoord = BottomCoord;
embeddedartists 0:c828045bbe69 173 BottomCoord = tmp;
embeddedartists 0:c828045bbe69 174 }
embeddedartists 0:c828045bbe69 175
embeddedartists 0:c828045bbe69 176 /* so now we have the 3 sorted dst triangle points in TopCoord, MiddleCoord and BottomCoord
embeddedartists 0:c828045bbe69 177 (can be done much more efficient with arithmetics instead of if or use pos/neg direction
embeddedartists 0:c828045bbe69 178 vectors later?) */
embeddedartists 0:c828045bbe69 179
embeddedartists 0:c828045bbe69 180 /* 2. step: find start and end points for this line in src and dst triangle for each
embeddedartists 0:c828045bbe69 181 line; start pt always on a line that originates from middle point; later replace
embeddedartists 0:c828045bbe69 182 all div by mult with 1/DeltaY, i.e. only one division, maybe even save 1/... in
embeddedartists 0:c828045bbe69 183 Tab as there are not so many possible DeltaY */
embeddedartists 0:c828045bbe69 184 DeltaY = (long) DstCoords_p[BottomCoord].y - DstCoords_p[TopCoord].y + 1;
embeddedartists 0:c828045bbe69 185
embeddedartists 0:c828045bbe69 186 DivMultVal = ((int) DivTab[DeltaY-1] + 1);
embeddedartists 0:c828045bbe69 187
embeddedartists 0:c828045bbe69 188 dxDstBig = ((long) DstCoords_p[BottomCoord].x - DstCoords_p[TopCoord].x + 1) * DivMultVal;
embeddedartists 0:c828045bbe69 189 dySrcBig = ((long) SrcCoords_p[BottomCoord].y - SrcCoords_p[TopCoord].y + 1) * DivMultVal;
embeddedartists 0:c828045bbe69 190 dxSrcBig = ((long) SrcCoords_p[BottomCoord].x - SrcCoords_p[TopCoord].x + 1) * DivMultVal;
embeddedartists 0:c828045bbe69 191
embeddedartists 0:c828045bbe69 192 DeltaY = (long) DstCoords_p[MiddleCoord].y - DstCoords_p[TopCoord].y + 1;
embeddedartists 0:c828045bbe69 193
embeddedartists 0:c828045bbe69 194 DivMultVal = ((int) DivTab[DeltaY-1] + 1);
embeddedartists 0:c828045bbe69 195
embeddedartists 0:c828045bbe69 196 dxDstSmall = ((long) DstCoords_p[MiddleCoord].x - DstCoords_p[TopCoord].x + 1) * DivMultVal;
embeddedartists 0:c828045bbe69 197 dySrcSmall = ((long) SrcCoords_p[MiddleCoord].y - SrcCoords_p[TopCoord].y + 1) * DivMultVal;
embeddedartists 0:c828045bbe69 198 dxSrcSmall = ((long) SrcCoords_p[MiddleCoord].x - SrcCoords_p[TopCoord].x + 1) * DivMultVal;
embeddedartists 0:c828045bbe69 199
embeddedartists 0:c828045bbe69 200 Direction = 1;
embeddedartists 0:c828045bbe69 201 if(dxDstSmall > dxDstBig)
embeddedartists 0:c828045bbe69 202 Direction = -1;
embeddedartists 0:c828045bbe69 203
embeddedartists 0:c828045bbe69 204 for(y = DstCoords_p[TopCoord].y, i=0; y <= DstCoords_p[MiddleCoord].y; y++, i++)
embeddedartists 0:c828045bbe69 205 { /* for each row/line */
embeddedartists 0:c828045bbe69 206 long MoveSrcX, MoveSrcY, P1x, P2x, P1y, P2y, SrcDeltaSteps;
embeddedartists 0:c828045bbe69 207
embeddedartists 0:c828045bbe69 208 //SrcStartX = SrcCoords_p[TopCoord].x;
embeddedartists 0:c828045bbe69 209
embeddedartists 0:c828045bbe69 210 P1x = SrcCoords_p[TopCoord].x + ((i * dxSrcSmall)>>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 211 P1y = SrcCoords_p[TopCoord].y + ((i * dySrcSmall)>>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 212 P2x = SrcCoords_p[TopCoord].x + ((i * dxSrcBig)>>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 213 P2y = SrcCoords_p[TopCoord].y + ((i * dySrcBig)>>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 214
embeddedartists 0:c828045bbe69 215 {
embeddedartists 0:c828045bbe69 216 int xx;
embeddedartists 0:c828045bbe69 217
embeddedartists 0:c828045bbe69 218 x = DstCoords_p[TopCoord].x + ((i * dxDstSmall)>>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 219 xx = DstCoords_p[TopCoord].x + ((i * dxDstBig) >>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 220
embeddedartists 0:c828045bbe69 221 SrcDeltaSteps = xx - x;
embeddedartists 0:c828045bbe69 222 if(SrcDeltaSteps < 0)
embeddedartists 0:c828045bbe69 223 SrcDeltaSteps = -SrcDeltaSteps;
embeddedartists 0:c828045bbe69 224
embeddedartists 0:c828045bbe69 225 SrcDeltaSteps++;
embeddedartists 0:c828045bbe69 226
embeddedartists 0:c828045bbe69 227 DivMultVal = ((int) DivTab[SrcDeltaSteps-1] + 1);
embeddedartists 0:c828045bbe69 228
embeddedartists 0:c828045bbe69 229 MoveSrcX = (P2x - P1x) * DivMultVal;
embeddedartists 0:c828045bbe69 230 MoveSrcY = (P2y - P1y) * DivMultVal;
embeddedartists 0:c828045bbe69 231
embeddedartists 0:c828045bbe69 232 x-= Direction;
embeddedartists 0:c828045bbe69 233
embeddedartists 0:c828045bbe69 234 P1x <<= TRIANG_PROJ_SFT;
embeddedartists 0:c828045bbe69 235 P1y <<= TRIANG_PROJ_SFT;
embeddedartists 0:c828045bbe69 236
embeddedartists 0:c828045bbe69 237 do
embeddedartists 0:c828045bbe69 238 {
embeddedartists 0:c828045bbe69 239 x+= Direction;
embeddedartists 0:c828045bbe69 240
embeddedartists 0:c828045bbe69 241 CpPixel16Fast(P1x >>TRIANG_PROJ_SFT, P1y >>TRIANG_PROJ_SFT, x, y, SrcRP_p, DstRP_p);
embeddedartists 0:c828045bbe69 242
embeddedartists 0:c828045bbe69 243 P1x += MoveSrcX;
embeddedartists 0:c828045bbe69 244 P1y += MoveSrcY;
embeddedartists 0:c828045bbe69 245
embeddedartists 0:c828045bbe69 246 } while(x!=xx);
embeddedartists 0:c828045bbe69 247 }
embeddedartists 0:c828045bbe69 248 }
embeddedartists 0:c828045bbe69 249
embeddedartists 0:c828045bbe69 250 /* second part of triangle from middle to bottom */
embeddedartists 0:c828045bbe69 251 DeltaY = (long) DstCoords_p[BottomCoord].y - DstCoords_p[MiddleCoord].y+1;
embeddedartists 0:c828045bbe69 252
embeddedartists 0:c828045bbe69 253 DivMultVal = ((int) DivTab[DeltaY-1] + 1);
embeddedartists 0:c828045bbe69 254
embeddedartists 0:c828045bbe69 255 dxDstSmall = ((long) DstCoords_p[BottomCoord].x - DstCoords_p[MiddleCoord].x + 1) * DivMultVal;
embeddedartists 0:c828045bbe69 256 dySrcSmall = ((long) SrcCoords_p[BottomCoord].y - SrcCoords_p[MiddleCoord].y + 1) * DivMultVal;
embeddedartists 0:c828045bbe69 257 dxSrcSmall = ((long) SrcCoords_p[BottomCoord].x - SrcCoords_p[MiddleCoord].x + 1) * DivMultVal;
embeddedartists 0:c828045bbe69 258
embeddedartists 0:c828045bbe69 259 y--;
embeddedartists 0:c828045bbe69 260 i--;
embeddedartists 0:c828045bbe69 261
embeddedartists 0:c828045bbe69 262 for(j=0; y <= DstCoords_p[BottomCoord].y; y++, i++, j++)
embeddedartists 0:c828045bbe69 263 { /* for each row/line */
embeddedartists 0:c828045bbe69 264 long MoveSrcX, MoveSrcY, P1x, P2x, P1y, P2y, SrcDeltaSteps;
embeddedartists 0:c828045bbe69 265
embeddedartists 0:c828045bbe69 266 //SrcStartX = SrcCoords_p[MiddleCoord].x;
embeddedartists 0:c828045bbe69 267
embeddedartists 0:c828045bbe69 268 P1x = SrcCoords_p[MiddleCoord].x + ((j * dxSrcSmall)>>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 269 P1y = SrcCoords_p[MiddleCoord].y + ((j * dySrcSmall)>>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 270 P2x = SrcCoords_p[TopCoord].x + ((i * dxSrcBig)>>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 271 P2y = SrcCoords_p[TopCoord].y + ((i * dySrcBig)>>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 272
embeddedartists 0:c828045bbe69 273 {
embeddedartists 0:c828045bbe69 274 int xx;
embeddedartists 0:c828045bbe69 275
embeddedartists 0:c828045bbe69 276 x = DstCoords_p[MiddleCoord].x + ((j * dxDstSmall)>>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 277 xx = DstCoords_p[TopCoord].x + ((i * dxDstBig) >>TRIANG_PROJ_SFT);
embeddedartists 0:c828045bbe69 278
embeddedartists 0:c828045bbe69 279 SrcDeltaSteps = xx - x;
embeddedartists 0:c828045bbe69 280
embeddedartists 0:c828045bbe69 281 /* todo, fixme: direction should not have to be set here but if we do not
embeddedartists 0:c828045bbe69 282 do it here, sometimes calc fails, investigate (problem case: dst coords
embeddedartists 0:c828045bbe69 283 250/299, 321/302, 472/308 and src coord 0/0, bike w-1, 0, bike w-1/bike h-1 */
embeddedartists 0:c828045bbe69 284 if(SrcDeltaSteps < 0)
embeddedartists 0:c828045bbe69 285 {
embeddedartists 0:c828045bbe69 286 SrcDeltaSteps = -SrcDeltaSteps;
embeddedartists 0:c828045bbe69 287 Direction = -1;
embeddedartists 0:c828045bbe69 288 }
embeddedartists 0:c828045bbe69 289 else
embeddedartists 0:c828045bbe69 290 Direction = 1;
embeddedartists 0:c828045bbe69 291
embeddedartists 0:c828045bbe69 292 SrcDeltaSteps++;
embeddedartists 0:c828045bbe69 293
embeddedartists 0:c828045bbe69 294 DivMultVal = ((int) DivTab[SrcDeltaSteps-1] + 1);
embeddedartists 0:c828045bbe69 295
embeddedartists 0:c828045bbe69 296 MoveSrcX = (P2x - P1x) * DivMultVal;
embeddedartists 0:c828045bbe69 297 MoveSrcY = (P2y - P1y) * DivMultVal;
embeddedartists 0:c828045bbe69 298
embeddedartists 0:c828045bbe69 299 x-= Direction;
embeddedartists 0:c828045bbe69 300
embeddedartists 0:c828045bbe69 301 P1x <<= TRIANG_PROJ_SFT;
embeddedartists 0:c828045bbe69 302 P1y <<= TRIANG_PROJ_SFT;
embeddedartists 0:c828045bbe69 303
embeddedartists 0:c828045bbe69 304 do
embeddedartists 0:c828045bbe69 305 {
embeddedartists 0:c828045bbe69 306 x+= Direction;
embeddedartists 0:c828045bbe69 307
embeddedartists 0:c828045bbe69 308 CpPixel16Fast(P1x >>TRIANG_PROJ_SFT, P1y >>TRIANG_PROJ_SFT, x, y, SrcRP_p, DstRP_p);
embeddedartists 0:c828045bbe69 309
embeddedartists 0:c828045bbe69 310 P1x += MoveSrcX;
embeddedartists 0:c828045bbe69 311 P1y += MoveSrcY;
embeddedartists 0:c828045bbe69 312
embeddedartists 0:c828045bbe69 313 } while(x!=xx);
embeddedartists 0:c828045bbe69 314 }
embeddedartists 0:c828045bbe69 315 }
embeddedartists 0:c828045bbe69 316
embeddedartists 0:c828045bbe69 317 return;
embeddedartists 0:c828045bbe69 318 }
embeddedartists 0:c828045bbe69 319
embeddedartists 0:c828045bbe69 320
embeddedartists 0:c828045bbe69 321 short CubeDemo::_sin(short y) const {
embeddedartists 0:c828045bbe69 322 static short s1 = 0x6487;
embeddedartists 0:c828045bbe69 323 static short s3 = 0x2951;
embeddedartists 0:c828045bbe69 324 static short s5 = 0x4f6;
embeddedartists 0:c828045bbe69 325 long z, prod, sum;
embeddedartists 0:c828045bbe69 326
embeddedartists 0:c828045bbe69 327 z = ((long)y * y) >> 12;
embeddedartists 0:c828045bbe69 328 prod = (z * s5) >> 16;
embeddedartists 0:c828045bbe69 329 sum = s3 - prod;
embeddedartists 0:c828045bbe69 330 prod = (z * sum) >> 16;
embeddedartists 0:c828045bbe69 331 sum = s1 - prod;
embeddedartists 0:c828045bbe69 332
embeddedartists 0:c828045bbe69 333 // for better accuracy, round here
embeddedartists 0:c828045bbe69 334 return (short)((y * sum) >> 13);
embeddedartists 0:c828045bbe69 335 }
embeddedartists 0:c828045bbe69 336
embeddedartists 0:c828045bbe69 337 short CubeDemo::_cos(short y) const {
embeddedartists 0:c828045bbe69 338 static short c0 = 0x7fff;
embeddedartists 0:c828045bbe69 339 static short c2 = 0x4eea;
embeddedartists 0:c828045bbe69 340 static short c4 = 0x0fc4;
embeddedartists 0:c828045bbe69 341 long z, prod, sum;
embeddedartists 0:c828045bbe69 342 z = ((long)y * y) >> 12;
embeddedartists 0:c828045bbe69 343 prod = (z * c4) >> 16;
embeddedartists 0:c828045bbe69 344 sum = c2 - prod;
embeddedartists 0:c828045bbe69 345
embeddedartists 0:c828045bbe69 346 // for better accuracy, round here
embeddedartists 0:c828045bbe69 347 prod = (z * sum) >> 15;
embeddedartists 0:c828045bbe69 348 return (short)(c0 - prod);
embeddedartists 0:c828045bbe69 349 }
embeddedartists 0:c828045bbe69 350
embeddedartists 0:c828045bbe69 351 short CubeDemo::isine(short x) const {
embeddedartists 0:c828045bbe69 352 unsigned short n = (((unsigned short)x + 0x2000) >> 14) & 0x3;
embeddedartists 0:c828045bbe69 353 x -= n * 0x4000;
embeddedartists 0:c828045bbe69 354 switch(n){
embeddedartists 0:c828045bbe69 355 case 0:
embeddedartists 0:c828045bbe69 356 return _sin(x);
embeddedartists 0:c828045bbe69 357 case 1:
embeddedartists 0:c828045bbe69 358 return _cos(x);
embeddedartists 0:c828045bbe69 359 case 2:
embeddedartists 0:c828045bbe69 360 return - _sin(x);
embeddedartists 0:c828045bbe69 361 case 3:
embeddedartists 0:c828045bbe69 362 return - _cos(x);
embeddedartists 0:c828045bbe69 363 }
embeddedartists 0:c828045bbe69 364 return 0;
embeddedartists 0:c828045bbe69 365 }
embeddedartists 0:c828045bbe69 366
embeddedartists 0:c828045bbe69 367
embeddedartists 0:c828045bbe69 368 short CubeDemo::icosine(short x) const {
embeddedartists 0:c828045bbe69 369 return isine(x + 0x4000);
embeddedartists 0:c828045bbe69 370 }
embeddedartists 0:c828045bbe69 371
embeddedartists 0:c828045bbe69 372 int32_t CubeDemo::sgn(int32_t val) const
embeddedartists 0:c828045bbe69 373 {
embeddedartists 0:c828045bbe69 374 if (val > 0) return 1;
embeddedartists 0:c828045bbe69 375 else if (val < 0) return -1;
embeddedartists 0:c828045bbe69 376 else return 0;
embeddedartists 0:c828045bbe69 377 }
embeddedartists 0:c828045bbe69 378
embeddedartists 0:c828045bbe69 379 void CubeDemo::createCubeModel(uint32_t radius)
embeddedartists 0:c828045bbe69 380 {
embeddedartists 0:c828045bbe69 381 uint32_t i,j;
embeddedartists 0:c828045bbe69 382 uint32_t theta, dTheta;
embeddedartists 0:c828045bbe69 383 static uint8_t cubeConnect[24] = {
embeddedartists 0:c828045bbe69 384 0, 1, 2, 3,
embeddedartists 0:c828045bbe69 385 1, 5, 6, 2,
embeddedartists 0:c828045bbe69 386 5, 4, 7, 6,
embeddedartists 0:c828045bbe69 387 4, 0, 3, 7,
embeddedartists 0:c828045bbe69 388 4, 5, 1, 0,
embeddedartists 0:c828045bbe69 389 3, 2, 6, 7};
embeddedartists 0:c828045bbe69 390
embeddedartists 0:c828045bbe69 391 theta = 0x2000; //PI/4
embeddedartists 0:c828045bbe69 392 dTheta = 0x4000; //PI/2
embeddedartists 0:c828045bbe69 393
embeddedartists 0:c828045bbe69 394 for(i=0; i<8; i++)
embeddedartists 0:c828045bbe69 395 {
embeddedartists 0:c828045bbe69 396 cubeModel[i].x = radius * sgn(icosine(theta));
embeddedartists 0:c828045bbe69 397 cubeModel[i].y = radius * sgn(isine(theta));
embeddedartists 0:c828045bbe69 398 cubeModel[i].z = radius - (2 * radius) * (i / 4);
embeddedartists 0:c828045bbe69 399 theta += dTheta;
embeddedartists 0:c828045bbe69 400 }
embeddedartists 0:c828045bbe69 401
embeddedartists 0:c828045bbe69 402 j=0;
embeddedartists 0:c828045bbe69 403 for(i=0; i<6; i++)
embeddedartists 0:c828045bbe69 404 {
embeddedartists 0:c828045bbe69 405 cubePoly[j].p1 = cubeConnect[i*4 + 3];
embeddedartists 0:c828045bbe69 406 cubePoly[j].p2 = cubeConnect[i*4 + 1];
embeddedartists 0:c828045bbe69 407 cubePoly[j].p3 = cubeConnect[i*4 + 0];
embeddedartists 0:c828045bbe69 408 j++;
embeddedartists 0:c828045bbe69 409 cubePoly[j].p1 = cubeConnect[i*4 + 3];
embeddedartists 0:c828045bbe69 410 cubePoly[j].p2 = cubeConnect[i*4 + 2];
embeddedartists 0:c828045bbe69 411 cubePoly[j].p3 = cubeConnect[i*4 + 1];
embeddedartists 0:c828045bbe69 412 j++;
embeddedartists 0:c828045bbe69 413 }
embeddedartists 0:c828045bbe69 414 }
embeddedartists 0:c828045bbe69 415
embeddedartists 0:c828045bbe69 416 void CubeDemo::rotateAndProject(uint16_t rotX, uint16_t rotY, uint16_t rotZ)
embeddedartists 0:c828045bbe69 417 {
embeddedartists 0:c828045bbe69 418 uint32_t i;
embeddedartists 0:c828045bbe69 419 long crx,srx,cry,sry,crz,srz;
embeddedartists 0:c828045bbe69 420 long x,y,z,tx,ty,tz;
embeddedartists 0:c828045bbe69 421 long distance;
embeddedartists 0:c828045bbe69 422
embeddedartists 0:c828045bbe69 423 crx = icosine(rotX);
embeddedartists 0:c828045bbe69 424 srx = isine(rotX);
embeddedartists 0:c828045bbe69 425 cry = icosine(rotY);
embeddedartists 0:c828045bbe69 426 sry = isine(rotY);
embeddedartists 0:c828045bbe69 427 crz = icosine(rotZ);
embeddedartists 0:c828045bbe69 428 srz = isine(rotZ);
embeddedartists 0:c828045bbe69 429
embeddedartists 0:c828045bbe69 430 for (i=0;i<8;i++)
embeddedartists 0:c828045bbe69 431 {
embeddedartists 0:c828045bbe69 432 //--> rotate around y-axis
embeddedartists 0:c828045bbe69 433 // var tempX = (this.x * Math.cos(rY)) - (this.z * Math.sin(rY));
embeddedartists 0:c828045bbe69 434 // var tempZ = (this.x * Math.sin(rY)) + (this.z * Math.cos(rY));
embeddedartists 0:c828045bbe69 435
embeddedartists 0:c828045bbe69 436 //--> rotate around x-axis
embeddedartists 0:c828045bbe69 437 // this.dz = (tempZ * Math.cos(rX)) - (this.y * Math.sin(rX));
embeddedartists 0:c828045bbe69 438 // var tempY = (tempZ * Math.sin(rX)) + (this.y * Math.cos(rX));
embeddedartists 0:c828045bbe69 439
embeddedartists 0:c828045bbe69 440 //--> rotate around z-axis
embeddedartists 0:c828045bbe69 441 // this.dx = (tempX * Math.cos(rZ)) + (tempY * Math.sin(rZ));
embeddedartists 0:c828045bbe69 442 // this.dy = (tempY * Math.cos(rZ)) - (tempX * Math.sin(rZ));
embeddedartists 0:c828045bbe69 443
embeddedartists 0:c828045bbe69 444
embeddedartists 0:c828045bbe69 445 x = cubeModel[i].x;
embeddedartists 0:c828045bbe69 446 y = cubeModel[i].y;
embeddedartists 0:c828045bbe69 447 z = cubeModel[i].z;
embeddedartists 0:c828045bbe69 448
embeddedartists 0:c828045bbe69 449 //--> rotate around y-axis
embeddedartists 0:c828045bbe69 450 tx = (z*sry + x*cry) / 0x7fff;
embeddedartists 0:c828045bbe69 451 tz = (z*cry - x*sry) / 0x7fff;
embeddedartists 0:c828045bbe69 452
embeddedartists 0:c828045bbe69 453 //--> rotate around x-axis
embeddedartists 0:c828045bbe69 454 cubeModel[i].zr = (y*srx + tz*crx) / 0x7fff;
embeddedartists 0:c828045bbe69 455 ty = (y*crx - tz*srx) / 0x7fff;
embeddedartists 0:c828045bbe69 456
embeddedartists 0:c828045bbe69 457 //--> rotate around z-axis
embeddedartists 0:c828045bbe69 458 cubeModel[i].xr = (tx*crz - ty*srz) / 0x7fff;
embeddedartists 0:c828045bbe69 459 cubeModel[i].yr = (tx*srz + ty*crz) / 0x7fff;
embeddedartists 0:c828045bbe69 460
embeddedartists 0:c828045bbe69 461 cubeModel[i].xr -= camX;
embeddedartists 0:c828045bbe69 462 cubeModel[i].yr -= camY;
embeddedartists 0:c828045bbe69 463 cubeModel[i].zr -= camZ;
embeddedartists 0:c828045bbe69 464
embeddedartists 0:c828045bbe69 465 distance = LENS - cubeModel[i].zr;
embeddedartists 0:c828045bbe69 466 if (distance > 0)
embeddedartists 0:c828045bbe69 467 {
embeddedartists 0:c828045bbe69 468 cubeModel[i].scrx = X_OFFSET + (LENS * cubeModel[i].xr) / distance;
embeddedartists 0:c828045bbe69 469 cubeModel[i].scry = Y_OFFSET + (LENS * cubeModel[i].yr) / distance;
embeddedartists 0:c828045bbe69 470 }
embeddedartists 0:c828045bbe69 471 }
embeddedartists 0:c828045bbe69 472 }
embeddedartists 0:c828045bbe69 473
embeddedartists 0:c828045bbe69 474 void CubeDemo::drawCubeZ(Surface_t *pSourcePicture, uint8_t shades)
embeddedartists 0:c828045bbe69 475 {
embeddedartists 0:c828045bbe69 476 uint32_t i;
embeddedartists 0:c828045bbe69 477 int32_t x1,x2,x3,y1,y2,y3,/*u1,u2,u3,v1,v2,v3,*/znormal;
embeddedartists 0:c828045bbe69 478
embeddedartists 0:c828045bbe69 479 activeFrame.w = this->windowX;
embeddedartists 0:c828045bbe69 480 activeFrame.h = this->windowY;
embeddedartists 0:c828045bbe69 481 activeFrame.pixels = (uint16_t*)this->pFrmBuf;
embeddedartists 0:c828045bbe69 482
embeddedartists 0:c828045bbe69 483 for(i=0; i<12; i++)
embeddedartists 0:c828045bbe69 484 {
embeddedartists 0:c828045bbe69 485 x1 = cubeModel[cubePoly[i].p1].scrx; //Get triangles from "projected"
embeddedartists 0:c828045bbe69 486 x2 = cubeModel[cubePoly[i].p2].scrx; //X and Y coords since Znormal
embeddedartists 0:c828045bbe69 487 x3 = cubeModel[cubePoly[i].p3].scrx; //Does not require a Z coord
embeddedartists 0:c828045bbe69 488 y1 = cubeModel[cubePoly[i].p1].scry; //V1= Point1 connected to V2 then
embeddedartists 0:c828045bbe69 489 y2 = cubeModel[cubePoly[i].p2].scry; //V2 to V3 and so on...
embeddedartists 0:c828045bbe69 490 y3 = cubeModel[cubePoly[i].p3].scry;
embeddedartists 0:c828045bbe69 491
embeddedartists 0:c828045bbe69 492 znormal = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3);
embeddedartists 0:c828045bbe69 493 if (znormal > 0)
embeddedartists 0:c828045bbe69 494 {
embeddedartists 0:c828045bbe69 495 //no texture?
embeddedartists 0:c828045bbe69 496 if (pSourcePicture == NULL)
embeddedartists 0:c828045bbe69 497 {
embeddedartists 0:c828045bbe69 498 if (shades == 0)
embeddedartists 0:c828045bbe69 499 {
embeddedartists 0:c828045bbe69 500 if ((cubePoly[i].p1 == 0) && (cubePoly[i].p2 == 1))
embeddedartists 0:c828045bbe69 501 graphics.put_line( cubeModel[cubePoly[i].p1].scrx, cubeModel[cubePoly[i].p1].scry, cubeModel[cubePoly[i].p2].scrx, cubeModel[cubePoly[i].p2].scry, RED);
embeddedartists 0:c828045bbe69 502 else
embeddedartists 0:c828045bbe69 503 graphics.put_line( cubeModel[cubePoly[i].p1].scrx, cubeModel[cubePoly[i].p1].scry, cubeModel[cubePoly[i].p2].scrx, cubeModel[cubePoly[i].p2].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 504 graphics.put_line( cubeModel[cubePoly[i].p2].scrx, cubeModel[cubePoly[i].p2].scry, cubeModel[cubePoly[i].p3].scrx, cubeModel[cubePoly[i].p3].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 505 graphics.put_line( cubeModel[cubePoly[i].p3].scrx, cubeModel[cubePoly[i].p3].scry, cubeModel[cubePoly[i].p1].scrx, cubeModel[cubePoly[i].p1].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 506 }
embeddedartists 0:c828045bbe69 507 else
embeddedartists 0:c828045bbe69 508 {
embeddedartists 0:c828045bbe69 509 Coord2D_t SrcCoords[3], DstCoords[3];
embeddedartists 0:c828045bbe69 510 Surface_t a;
embeddedartists 0:c828045bbe69 511 static uint16_t pix;
embeddedartists 0:c828045bbe69 512
embeddedartists 0:c828045bbe69 513 a.w = this->windowX;
embeddedartists 0:c828045bbe69 514 a.h = this->windowY;
embeddedartists 0:c828045bbe69 515 a.pixels = &pix;
embeddedartists 0:c828045bbe69 516 if ((i&1) == 0)
embeddedartists 0:c828045bbe69 517 {
embeddedartists 0:c828045bbe69 518 if ((znormal / 400) > 31)
embeddedartists 0:c828045bbe69 519 pix = 0x1f << 11;
embeddedartists 0:c828045bbe69 520 else
embeddedartists 0:c828045bbe69 521 pix = (znormal / 400 & 0x1f) << 11;
embeddedartists 0:c828045bbe69 522 }
embeddedartists 0:c828045bbe69 523 SrcCoords[0].x = 0;
embeddedartists 0:c828045bbe69 524 SrcCoords[0].y = 0;
embeddedartists 0:c828045bbe69 525 SrcCoords[1].x = 0;
embeddedartists 0:c828045bbe69 526 SrcCoords[1].y = 0;
embeddedartists 0:c828045bbe69 527 SrcCoords[2].x = 0;
embeddedartists 0:c828045bbe69 528 SrcCoords[2].y = 0;
embeddedartists 0:c828045bbe69 529 DstCoords[0].x = cubeModel[cubePoly[i].p1].scrx;
embeddedartists 0:c828045bbe69 530 DstCoords[0].y = cubeModel[cubePoly[i].p1].scry;
embeddedartists 0:c828045bbe69 531 DstCoords[1].x = cubeModel[cubePoly[i].p2].scrx;
embeddedartists 0:c828045bbe69 532 DstCoords[1].y = cubeModel[cubePoly[i].p2].scry;
embeddedartists 0:c828045bbe69 533 DstCoords[2].x = cubeModel[cubePoly[i].p3].scrx;
embeddedartists 0:c828045bbe69 534 DstCoords[2].y = cubeModel[cubePoly[i].p3].scry;
embeddedartists 0:c828045bbe69 535 TriangleProjectFast(&a, &activeFrame, SrcCoords, DstCoords);
embeddedartists 0:c828045bbe69 536 }
embeddedartists 0:c828045bbe69 537 }
embeddedartists 0:c828045bbe69 538
embeddedartists 0:c828045bbe69 539 //Render with texture
embeddedartists 0:c828045bbe69 540 else
embeddedartists 0:c828045bbe69 541 {
embeddedartists 0:c828045bbe69 542 Coord2D_t SrcCoords[3], DstCoords[3];
embeddedartists 0:c828045bbe69 543 #if 1
embeddedartists 0:c828045bbe69 544 /*
embeddedartists 0:c828045bbe69 545 * Image in the file
embeddedartists 0:c828045bbe69 546 * 0,0_______ _______ _______
embeddedartists 0:c828045bbe69 547 * | | | *|
embeddedartists 0:c828045bbe69 548 * | | | | Image as it is used
embeddedartists 0:c828045bbe69 549 * |_______|_______|_______| _______ _______ _______ _______
embeddedartists 0:c828045bbe69 550 * | | | | \ |* | | | |
embeddedartists 0:c828045bbe69 551 * | | | | \ | | top | | |
embeddedartists 0:c828045bbe69 552 * |_______|_______|_______| ====== |_______|_______|_______|_______|
embeddedartists 0:c828045bbe69 553 * | | | | / | | | | |
embeddedartists 0:c828045bbe69 554 * | | | | / | side1 | side2 | side3 | side4 |
embeddedartists 0:c828045bbe69 555 * |_______|_______|_______| |_______|_______|_______|_______|
embeddedartists 0:c828045bbe69 556 * | | | | | | | | |
embeddedartists 0:c828045bbe69 557 * | | | | | | bottom| | |
embeddedartists 0:c828045bbe69 558 * |_______|_______|_______| |_______|_______|_______|_______|
embeddedartists 0:c828045bbe69 559 * 150,200
embeddedartists 0:c828045bbe69 560 * All coordinates below are in the left image above and with coordinates 0,0 in the
embeddedartists 0:c828045bbe69 561 * upper left corner and 150,200 in the lower right corner.
embeddedartists 0:c828045bbe69 562 *
embeddedartists 0:c828045bbe69 563 */
embeddedartists 0:c828045bbe69 564 #define XYZ {49,0},{0,0},{0,50},{50,50}
embeddedartists 0:c828045bbe69 565 static Coord2D_t a[24] = {{49,50}, {0,50}, {0,99}, {49,99}, //bottom 6
embeddedartists 0:c828045bbe69 566 {99,50}, {50,50}, {50,99}, {99,99}, //side2 2
embeddedartists 0:c828045bbe69 567 {149,50},{100,50},{100,99},{149,99}, //top 5
embeddedartists 0:c828045bbe69 568 {50,150},{99,150},{99,199},{50,199}, //side4 4
embeddedartists 0:c828045bbe69 569 {99,49}, {99,0}, {50,0}, {50,49}, //side1 1
embeddedartists 0:c828045bbe69 570 {99,100},{99,149},{50,149},{50,100}}; //side3 3
embeddedartists 0:c828045bbe69 571 #elif 0
embeddedartists 0:c828045bbe69 572 static Coord2D_t a[24] = {{49,50}, {0,50}, {0,99}, {49,99}, //bottom 6
embeddedartists 0:c828045bbe69 573 {99,50}, {50,50}, {50,99}, {99,99}, //side2 2
embeddedartists 0:c828045bbe69 574 {149,50},{100,50},{100,99},{149,99}, //top 5
embeddedartists 0:c828045bbe69 575 {99,150},{50,150},{50,199},{99,199}, //side4 4
embeddedartists 0:c828045bbe69 576 {99,49}, {99,0}, {50,0}, {50,49}, //side1 1
embeddedartists 0:c828045bbe69 577 {99,149},{99,100},{50,100},{50,149}}; //side3 3
embeddedartists 0:c828045bbe69 578 #else
embeddedartists 0:c828045bbe69 579 static Coord2D_t a[24] = {{49,50}, {0,50}, {0,99}, {49,99},
embeddedartists 0:c828045bbe69 580 {99,50}, {50,50}, {50,99}, {99,99},
embeddedartists 0:c828045bbe69 581 {149,50},{100,50},{100,99},{149,99},
embeddedartists 0:c828045bbe69 582 {99,199},{50,199},{50,150},{99,150},
embeddedartists 0:c828045bbe69 583 {50,0}, {99,0}, {99,49}, {50,49}, //top
embeddedartists 0:c828045bbe69 584 {50,100},{99,100},{99,149},{50,149}};//bottom
embeddedartists 0:c828045bbe69 585 #endif
embeddedartists 0:c828045bbe69 586
embeddedartists 0:c828045bbe69 587 if (i&1)
embeddedartists 0:c828045bbe69 588 {
embeddedartists 0:c828045bbe69 589 SrcCoords[0].x = a[(i/2)*4+2].x;
embeddedartists 0:c828045bbe69 590 SrcCoords[0].y = a[(i/2)*4+2].y;
embeddedartists 0:c828045bbe69 591 SrcCoords[1].x = a[(i/2)*4+3].x;
embeddedartists 0:c828045bbe69 592 SrcCoords[1].y = a[(i/2)*4+3].y;
embeddedartists 0:c828045bbe69 593 SrcCoords[2].x = a[(i/2)*4+0].x;
embeddedartists 0:c828045bbe69 594 SrcCoords[2].y = a[(i/2)*4+0].y;
embeddedartists 0:c828045bbe69 595 DstCoords[0].x = cubeModel[cubePoly[i].p1].scrx;
embeddedartists 0:c828045bbe69 596 DstCoords[0].y = cubeModel[cubePoly[i].p1].scry;
embeddedartists 0:c828045bbe69 597 DstCoords[1].x = cubeModel[cubePoly[i].p2].scrx;
embeddedartists 0:c828045bbe69 598 DstCoords[1].y = cubeModel[cubePoly[i].p2].scry;
embeddedartists 0:c828045bbe69 599 DstCoords[2].x = cubeModel[cubePoly[i].p3].scrx;
embeddedartists 0:c828045bbe69 600 DstCoords[2].y = cubeModel[cubePoly[i].p3].scry;
embeddedartists 0:c828045bbe69 601 TriangleProjectFast(pSourcePicture, &activeFrame, SrcCoords, DstCoords);
embeddedartists 0:c828045bbe69 602 }
embeddedartists 0:c828045bbe69 603 else
embeddedartists 0:c828045bbe69 604 {
embeddedartists 0:c828045bbe69 605 SrcCoords[0].x = a[(i/2)*4+0].x; //0
embeddedartists 0:c828045bbe69 606 SrcCoords[0].y = a[(i/2)*4+0].y; //0
embeddedartists 0:c828045bbe69 607 SrcCoords[1].x = a[(i/2)*4+1].x; //31;
embeddedartists 0:c828045bbe69 608 SrcCoords[1].y = a[(i/2)*4+1].y; //0;
embeddedartists 0:c828045bbe69 609 SrcCoords[2].x = a[(i/2)*4+2].x; //31;
embeddedartists 0:c828045bbe69 610 SrcCoords[2].y = a[(i/2)*4+2].y; //31;
embeddedartists 0:c828045bbe69 611 DstCoords[0].x = cubeModel[cubePoly[i].p2].scrx;
embeddedartists 0:c828045bbe69 612 DstCoords[0].y = cubeModel[cubePoly[i].p2].scry;
embeddedartists 0:c828045bbe69 613 DstCoords[1].x = cubeModel[cubePoly[i].p3].scrx;
embeddedartists 0:c828045bbe69 614 DstCoords[1].y = cubeModel[cubePoly[i].p3].scry;
embeddedartists 0:c828045bbe69 615 DstCoords[2].x = cubeModel[cubePoly[i].p1].scrx;
embeddedartists 0:c828045bbe69 616 DstCoords[2].y = cubeModel[cubePoly[i].p1].scry;
embeddedartists 0:c828045bbe69 617 TriangleProjectFast(pSourcePicture, &activeFrame, SrcCoords, DstCoords);
embeddedartists 0:c828045bbe69 618 }
embeddedartists 0:c828045bbe69 619 }
embeddedartists 0:c828045bbe69 620 }
embeddedartists 0:c828045bbe69 621 }
embeddedartists 0:c828045bbe69 622 }
embeddedartists 0:c828045bbe69 623
embeddedartists 0:c828045bbe69 624 void CubeDemo::render(uint32_t idx)
embeddedartists 0:c828045bbe69 625 {
embeddedartists 0:c828045bbe69 626 static uint8_t cnt=0;
embeddedartists 0:c828045bbe69 627
embeddedartists 0:c828045bbe69 628 if (cnt == 0)
embeddedartists 0:c828045bbe69 629 {
embeddedartists 0:c828045bbe69 630 cnt = 1;
embeddedartists 0:c828045bbe69 631 pFrmBuf = pFrmBuf1;
embeddedartists 0:c828045bbe69 632 }
embeddedartists 0:c828045bbe69 633 else if (cnt == 1)
embeddedartists 0:c828045bbe69 634 {
embeddedartists 0:c828045bbe69 635 cnt = 2;
embeddedartists 0:c828045bbe69 636 pFrmBuf = pFrmBuf2;
embeddedartists 0:c828045bbe69 637 }
embeddedartists 0:c828045bbe69 638 else
embeddedartists 0:c828045bbe69 639 {
embeddedartists 0:c828045bbe69 640 cnt = 0;
embeddedartists 0:c828045bbe69 641 pFrmBuf = pFrmBuf3;
embeddedartists 0:c828045bbe69 642 }
embeddedartists 0:c828045bbe69 643
embeddedartists 0:c828045bbe69 644 graphics.setFrameBuffer(pFrmBuf);
embeddedartists 0:c828045bbe69 645
embeddedartists 0:c828045bbe69 646 // rendering here
embeddedartists 0:c828045bbe69 647 memset((void*)(pFrmBuf), BACKGROUND_COLOR, this->windowX * this->windowY * 2);
embeddedartists 0:c828045bbe69 648
embeddedartists 0:c828045bbe69 649 rotateAndProject(rx, ry, 0);
embeddedartists 0:c828045bbe69 650
embeddedartists 0:c828045bbe69 651 switch(mode)
embeddedartists 0:c828045bbe69 652 {
embeddedartists 0:c828045bbe69 653 case 0: //draw just points
embeddedartists 0:c828045bbe69 654 graphics.put_circle( cubeModel[0].scrx, cubeModel[0].scry, RED, 2, 1);
embeddedartists 0:c828045bbe69 655 graphics.put_circle( cubeModel[1].scrx, cubeModel[1].scry, SMALL_CIRCLE_FRONT_COLOR, 2, 1);
embeddedartists 0:c828045bbe69 656 graphics.put_circle( cubeModel[2].scrx, cubeModel[2].scry, GREEN, 2, 1);
embeddedartists 0:c828045bbe69 657 graphics.put_circle( cubeModel[3].scrx, cubeModel[3].scry, SMALL_CIRCLE_FRONT_COLOR, 2, 1);
embeddedartists 0:c828045bbe69 658 graphics.put_circle( cubeModel[4].scrx, cubeModel[4].scry, SMALL_CIRCLE_FRONT_COLOR, 2, 1);
embeddedartists 0:c828045bbe69 659 graphics.put_circle( cubeModel[5].scrx, cubeModel[5].scry, SMALL_CIRCLE_FRONT_COLOR, 2, 1);
embeddedartists 0:c828045bbe69 660 graphics.put_circle( cubeModel[6].scrx, cubeModel[6].scry, SMALL_CIRCLE_FRONT_COLOR, 2, 1);
embeddedartists 0:c828045bbe69 661 graphics.put_circle( cubeModel[7].scrx, cubeModel[7].scry, SMALL_CIRCLE_FRONT_COLOR, 2, 1);
embeddedartists 0:c828045bbe69 662 break;
embeddedartists 0:c828045bbe69 663 case 1: //draw lines points
embeddedartists 0:c828045bbe69 664 graphics.put_line( cubeModel[0].scrx, cubeModel[0].scry, cubeModel[1].scrx, cubeModel[1].scry, RED);
embeddedartists 0:c828045bbe69 665 graphics.put_line( cubeModel[1].scrx, cubeModel[1].scry, cubeModel[2].scrx, cubeModel[2].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 666 graphics.put_line( cubeModel[2].scrx, cubeModel[2].scry, cubeModel[3].scrx, cubeModel[3].scry, GREEN);
embeddedartists 0:c828045bbe69 667 graphics.put_line( cubeModel[3].scrx, cubeModel[3].scry, cubeModel[0].scrx, cubeModel[0].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 668
embeddedartists 0:c828045bbe69 669 graphics.put_line( cubeModel[5].scrx, cubeModel[5].scry, cubeModel[4].scrx, cubeModel[4].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 670 graphics.put_line( cubeModel[4].scrx, cubeModel[4].scry, cubeModel[7].scrx, cubeModel[7].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 671 graphics.put_line( cubeModel[7].scrx, cubeModel[7].scry, cubeModel[6].scrx, cubeModel[6].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 672 graphics.put_line( cubeModel[6].scrx, cubeModel[6].scry, cubeModel[5].scrx, cubeModel[5].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 673
embeddedartists 0:c828045bbe69 674 graphics.put_line( cubeModel[0].scrx, cubeModel[0].scry, cubeModel[4].scrx, cubeModel[4].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 675 graphics.put_line( cubeModel[1].scrx, cubeModel[1].scry, cubeModel[5].scrx, cubeModel[5].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 676 graphics.put_line( cubeModel[2].scrx, cubeModel[2].scry, cubeModel[6].scrx, cubeModel[6].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 677 graphics.put_line( cubeModel[3].scrx, cubeModel[3].scry, cubeModel[7].scrx, cubeModel[7].scry, SMALL_CIRCLE_FRONT_COLOR);
embeddedartists 0:c828045bbe69 678 break;
embeddedartists 0:c828045bbe69 679 case 2: //draw cube with texture
embeddedartists 0:c828045bbe69 680 if (sourcePicture1.pixels == NULL)
embeddedartists 0:c828045bbe69 681 {
embeddedartists 0:c828045bbe69 682 drawCubeZ( NULL, false);
embeddedartists 0:c828045bbe69 683 }
embeddedartists 0:c828045bbe69 684 else
embeddedartists 0:c828045bbe69 685 {
embeddedartists 0:c828045bbe69 686 drawCubeZ( &sourcePicture1, false);
embeddedartists 0:c828045bbe69 687 }
embeddedartists 0:c828045bbe69 688 break;
embeddedartists 0:c828045bbe69 689 case 3: //draw cube with texture
embeddedartists 0:c828045bbe69 690 drawCubeZ( NULL, true);
embeddedartists 0:c828045bbe69 691 break;
embeddedartists 0:c828045bbe69 692 case 4: //draw cube with texture
embeddedartists 0:c828045bbe69 693 if (sourcePicture2.pixels == NULL)
embeddedartists 0:c828045bbe69 694 {
embeddedartists 0:c828045bbe69 695 drawCubeZ( NULL, false);
embeddedartists 0:c828045bbe69 696 }
embeddedartists 0:c828045bbe69 697 else
embeddedartists 0:c828045bbe69 698 {
embeddedartists 0:c828045bbe69 699 drawCubeZ( &sourcePicture2, false);
embeddedartists 0:c828045bbe69 700 }
embeddedartists 0:c828045bbe69 701 break;
embeddedartists 0:c828045bbe69 702 case 5: //draw sorted lines
embeddedartists 0:c828045bbe69 703 drawCubeZ( NULL, false);
embeddedartists 0:c828045bbe69 704 break;
embeddedartists 0:c828045bbe69 705 default:
embeddedartists 0:c828045bbe69 706 mode = 0;
embeddedartists 0:c828045bbe69 707 break;
embeddedartists 0:c828045bbe69 708 }
embeddedartists 0:c828045bbe69 709 ry += ry_;
embeddedartists 0:c828045bbe69 710 rx += rx_;
embeddedartists 0:c828045bbe69 711 }
embeddedartists 0:c828045bbe69 712
embeddedartists 0:c828045bbe69 713 /***********************************************************************
embeddedartists 0:c828045bbe69 714 * Private functions
embeddedartists 0:c828045bbe69 715 **********************************************************************/
embeddedartists 0:c828045bbe69 716
embeddedartists 0:c828045bbe69 717 void CubeDemo::initialize()
embeddedartists 0:c828045bbe69 718 {
embeddedartists 0:c828045bbe69 719 mode = 3;
embeddedartists 0:c828045bbe69 720 rx = 0x9000;
embeddedartists 0:c828045bbe69 721 ry = 0;
embeddedartists 0:c828045bbe69 722 ry_ = 350;
embeddedartists 0:c828045bbe69 723 rx_ = -25; //-3
embeddedartists 0:c828045bbe69 724 camX = 0;
embeddedartists 0:c828045bbe69 725 camY = 0;
embeddedartists 0:c828045bbe69 726 camZ = 128;
embeddedartists 0:c828045bbe69 727
embeddedartists 0:c828045bbe69 728 createCubeModel(70);
embeddedartists 0:c828045bbe69 729
embeddedartists 0:c828045bbe69 730 Image::ImageData_t d;
embeddedartists 0:c828045bbe69 731 if (Image::decode(cube_image1, cube_image1_sz, &d) == 0) {
embeddedartists 0:c828045bbe69 732 sourcePicture1.w = d.width;
embeddedartists 0:c828045bbe69 733 sourcePicture1.h = d.height;
embeddedartists 0:c828045bbe69 734 sourcePicture1.pixels = d.pixels;
embeddedartists 0:c828045bbe69 735 }
embeddedartists 0:c828045bbe69 736 if (Image::decode(cube_image2, cube_image2_sz, &d) == 0) {
embeddedartists 0:c828045bbe69 737 sourcePicture2.w = d.width;
embeddedartists 0:c828045bbe69 738 sourcePicture2.h = d.height;
embeddedartists 0:c828045bbe69 739 sourcePicture2.pixels = d.pixels;
embeddedartists 0:c828045bbe69 740 }
embeddedartists 0:c828045bbe69 741 }
embeddedartists 0:c828045bbe69 742
embeddedartists 0:c828045bbe69 743
embeddedartists 0:c828045bbe69 744 /******************************************************************************
embeddedartists 0:c828045bbe69 745 * Public functions
embeddedartists 0:c828045bbe69 746 *****************************************************************************/
embeddedartists 0:c828045bbe69 747 CubeDemo::CubeDemo(uint8_t *pFrameBuf, uint16_t dispWidth, uint16_t dispHeight)
embeddedartists 0:c828045bbe69 748 : graphics((uint16_t *)pFrameBuf, dispWidth, dispHeight) {
embeddedartists 0:c828045bbe69 749
embeddedartists 0:c828045bbe69 750 this->windowX = dispWidth;
embeddedartists 0:c828045bbe69 751 this->windowY = dispHeight;
embeddedartists 0:c828045bbe69 752 this->pFrmBuf = (uint16_t *)pFrameBuf;
embeddedartists 0:c828045bbe69 753 this->pFrmBuf1 = (uint16_t *)pFrameBuf;
embeddedartists 0:c828045bbe69 754 this->pFrmBuf2 = (uint16_t *)((uint32_t)pFrameBuf + dispWidth*dispHeight*2);
embeddedartists 0:c828045bbe69 755 this->pFrmBuf3 = (uint16_t *)((uint32_t)pFrameBuf + dispWidth*dispHeight*4);
embeddedartists 0:c828045bbe69 756
embeddedartists 0:c828045bbe69 757 sourcePicture1.w = 0;
embeddedartists 0:c828045bbe69 758 sourcePicture1.h = 0;
embeddedartists 0:c828045bbe69 759 sourcePicture1.pixels = NULL;
embeddedartists 0:c828045bbe69 760 sourcePicture2.w = 0;
embeddedartists 0:c828045bbe69 761 sourcePicture2.h = 0;
embeddedartists 0:c828045bbe69 762 sourcePicture2.pixels = NULL;
embeddedartists 0:c828045bbe69 763
embeddedartists 0:c828045bbe69 764 initialize();
embeddedartists 0:c828045bbe69 765 }
embeddedartists 0:c828045bbe69 766
embeddedartists 0:c828045bbe69 767 CubeDemo::~CubeDemo()
embeddedartists 0:c828045bbe69 768 {
embeddedartists 0:c828045bbe69 769 if (sourcePicture1.pixels != NULL) {
embeddedartists 0:c828045bbe69 770 free(sourcePicture1.pixels);
embeddedartists 0:c828045bbe69 771 }
embeddedartists 0:c828045bbe69 772 if (sourcePicture2.pixels != NULL) {
embeddedartists 0:c828045bbe69 773 free(sourcePicture2.pixels);
embeddedartists 0:c828045bbe69 774 }
embeddedartists 0:c828045bbe69 775 }
embeddedartists 0:c828045bbe69 776 void CubeDemo::run(EaLcdBoardGPIO& lcdBoard, uint32_t loops, uint32_t delayMs) {
embeddedartists 0:c828045bbe69 777
embeddedartists 0:c828045bbe69 778 printf("CubeDemo, %d loops, %dms delay\n", loops, delayMs);
embeddedartists 0:c828045bbe69 779
embeddedartists 0:c828045bbe69 780 for(int32_t n=0;n<loops;n++) {
embeddedartists 0:c828045bbe69 781
embeddedartists 0:c828045bbe69 782 mode = ((n/128) % 5);
embeddedartists 0:c828045bbe69 783 //mode = 4;
embeddedartists 0:c828045bbe69 784
embeddedartists 0:c828045bbe69 785 //render globe
embeddedartists 0:c828045bbe69 786 render(n);
embeddedartists 0:c828045bbe69 787
embeddedartists 0:c828045bbe69 788 //update framebuffer
embeddedartists 0:c828045bbe69 789 lcdBoard.setFrameBuffer((uint32_t)this->pFrmBuf);
embeddedartists 0:c828045bbe69 790
embeddedartists 0:c828045bbe69 791 if (mode == 3)
embeddedartists 0:c828045bbe69 792 wait_ms(delayMs-7);
embeddedartists 0:c828045bbe69 793 else
embeddedartists 0:c828045bbe69 794 wait_ms(delayMs);
embeddedartists 0:c828045bbe69 795 }
embeddedartists 0:c828045bbe69 796 }
embeddedartists 0:c828045bbe69 797