Bayley Wang
/
manworm_tv_raster
cube
Fork of manworm_tv_gpu by
main.cpp@0:7757ab3f7206, 2017-11-18 (annotated)
- Committer:
- dicarloj
- Date:
- Sat Nov 18 04:18:42 2017 +0000
- Revision:
- 0:7757ab3f7206
- Child:
- 1:24fd07a24094
asdf
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dicarloj | 0:7757ab3f7206 | 1 | #include "mbed.h" |
dicarloj | 0:7757ab3f7206 | 2 | #define V_RES 220 |
dicarloj | 0:7757ab3f7206 | 3 | #define H_RES 100 |
dicarloj | 0:7757ab3f7206 | 4 | #include <math.h> |
dicarloj | 0:7757ab3f7206 | 5 | #define X_MIN 24 |
dicarloj | 0:7757ab3f7206 | 6 | #define X_MAX (76+18) |
dicarloj | 0:7757ab3f7206 | 7 | #define Y_MIN 7 |
dicarloj | 0:7757ab3f7206 | 8 | #define Y_MAX (V_RES/4 - 15) |
dicarloj | 0:7757ab3f7206 | 9 | |
dicarloj | 0:7757ab3f7206 | 10 | #define Y_0 ( (Y_MIN + Y_MAX)/2 ) |
dicarloj | 0:7757ab3f7206 | 11 | #define X_0 ( (X_MIN + X_MAX)/2 ) |
dicarloj | 0:7757ab3f7206 | 12 | #define SIDE 8 |
dicarloj | 0:7757ab3f7206 | 13 | #define HSIDE 8 |
dicarloj | 0:7757ab3f7206 | 14 | #define SIN_V (0.03) |
dicarloj | 0:7757ab3f7206 | 15 | #define COS_V (0.99955f) |
dicarloj | 0:7757ab3f7206 | 16 | #define BX_0 30 |
dicarloj | 0:7757ab3f7206 | 17 | #define BY_0 (V_RES/4 - 15) |
dicarloj | 0:7757ab3f7206 | 18 | #define BX 42 |
dicarloj | 0:7757ab3f7206 | 19 | #define BY 15 |
dicarloj | 0:7757ab3f7206 | 20 | #define DEMO_LENGTH 600 |
dicarloj | 0:7757ab3f7206 | 21 | |
dicarloj | 0:7757ab3f7206 | 22 | |
dicarloj | 0:7757ab3f7206 | 23 | DigitalOut sout(D8); //sync |
dicarloj | 0:7757ab3f7206 | 24 | DigitalOut vout(D7); //video |
dicarloj | 0:7757ab3f7206 | 25 | Ticker t; |
dicarloj | 0:7757ab3f7206 | 26 | uint8_t draw_line_inv = 0; |
dicarloj | 0:7757ab3f7206 | 27 | //9x42 |
dicarloj | 0:7757ab3f7206 | 28 | uint8_t miters[] = { |
dicarloj | 0:7757ab3f7206 | 29 | 1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, |
dicarloj | 0:7757ab3f7206 | 30 | 1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, |
dicarloj | 0:7757ab3f7206 | 31 | 1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 32 | 1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1, |
dicarloj | 0:7757ab3f7206 | 33 | 1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1, |
dicarloj | 0:7757ab3f7206 | 34 | 1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0, |
dicarloj | 0:7757ab3f7206 | 35 | 1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0, |
dicarloj | 0:7757ab3f7206 | 36 | 1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1, |
dicarloj | 0:7757ab3f7206 | 37 | 1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1, |
dicarloj | 0:7757ab3f7206 | 38 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 39 | 0,0,0,0,0,0,0,1,1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 40 | 1,1,1,1,1,0,1,0,0,1,1,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,1,1,1,1,1, |
dicarloj | 0:7757ab3f7206 | 41 | 1,0,1,0,1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,1, |
dicarloj | 0:7757ab3f7206 | 42 | 1,0,1,0,1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,0,0,1,1,0,1,1,0,1,0,0,0,0,1,0,1,0,1, |
dicarloj | 0:7757ab3f7206 | 43 | 1,0,1,0,1,0,0,1,1,0,1,0,1,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0,1, |
dicarloj | 0:7757ab3f7206 | 44 | |
dicarloj | 0:7757ab3f7206 | 45 | }; |
dicarloj | 0:7757ab3f7206 | 46 | |
dicarloj | 0:7757ab3f7206 | 47 | uint8_t tv[] = { |
dicarloj | 0:7757ab3f7206 | 48 | 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 49 | 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 50 | 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 51 | 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 52 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 53 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 54 | 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 55 | 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 56 | 0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 57 | 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 58 | 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 59 | 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 60 | 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 61 | 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, |
dicarloj | 0:7757ab3f7206 | 62 | 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0}; |
dicarloj | 0:7757ab3f7206 | 63 | |
dicarloj | 0:7757ab3f7206 | 64 | |
dicarloj | 0:7757ab3f7206 | 65 | |
dicarloj | 0:7757ab3f7206 | 66 | uint16_t l=0; //current line of scan |
dicarloj | 0:7757ab3f7206 | 67 | |
dicarloj | 0:7757ab3f7206 | 68 | uint8_t im_line_s[H_RES]; //image sync buffer |
dicarloj | 0:7757ab3f7206 | 69 | |
dicarloj | 0:7757ab3f7206 | 70 | uint8_t bl_line_s[H_RES]; //lower 1/4 of screen sync buffer |
dicarloj | 0:7757ab3f7206 | 71 | uint8_t bl_line_v[H_RES]; //lower 1/4 of screen video buffer |
dicarloj | 0:7757ab3f7206 | 72 | uint8_t vb_line_s[H_RES]; //vertical sync, sync buffer |
dicarloj | 0:7757ab3f7206 | 73 | uint8_t vb_line_v[H_RES]; //vertical sync, video buffer |
dicarloj | 0:7757ab3f7206 | 74 | |
dicarloj | 0:7757ab3f7206 | 75 | float cube_a[3] = {15.f, 0.f, 0.f}; |
dicarloj | 0:7757ab3f7206 | 76 | |
dicarloj | 0:7757ab3f7206 | 77 | |
dicarloj | 0:7757ab3f7206 | 78 | float cube_pts[8][3] = { {SIDE,SIDE,HSIDE}, |
dicarloj | 0:7757ab3f7206 | 79 | {-SIDE,SIDE,HSIDE}, |
dicarloj | 0:7757ab3f7206 | 80 | {-SIDE,-SIDE,HSIDE}, |
dicarloj | 0:7757ab3f7206 | 81 | {SIDE,-SIDE,HSIDE}, |
dicarloj | 0:7757ab3f7206 | 82 | {SIDE,-SIDE,-HSIDE}, |
dicarloj | 0:7757ab3f7206 | 83 | {-SIDE,-SIDE,-HSIDE}, |
dicarloj | 0:7757ab3f7206 | 84 | {-SIDE,SIDE,-HSIDE}, |
dicarloj | 0:7757ab3f7206 | 85 | {SIDE,SIDE,-HSIDE} }; |
dicarloj | 0:7757ab3f7206 | 86 | |
dicarloj | 0:7757ab3f7206 | 87 | float x_rot[3][3] = { {1.f, 0.f, 0.f}, |
dicarloj | 0:7757ab3f7206 | 88 | {0.f, COS_V, -SIN_V}, |
dicarloj | 0:7757ab3f7206 | 89 | {0.f, SIN_V, COS_V} }; |
dicarloj | 0:7757ab3f7206 | 90 | |
dicarloj | 0:7757ab3f7206 | 91 | float y_rot[3][3] = { {COS_V, 0.f, SIN_V}, |
dicarloj | 0:7757ab3f7206 | 92 | {0.f, 1.f, 0.f}, |
dicarloj | 0:7757ab3f7206 | 93 | {-SIN_V, 0, COS_V} }; |
dicarloj | 0:7757ab3f7206 | 94 | |
dicarloj | 0:7757ab3f7206 | 95 | float z_rot[3][3] = { {COS_V, -SIN_V, 0.f}, |
dicarloj | 0:7757ab3f7206 | 96 | {SIN_V, COS_V, 0.f}, |
dicarloj | 0:7757ab3f7206 | 97 | {0.f, 0.f, 1.f} }; |
dicarloj | 0:7757ab3f7206 | 98 | |
dicarloj | 0:7757ab3f7206 | 99 | |
dicarloj | 0:7757ab3f7206 | 100 | uint8_t im_line_va[H_RES*V_RES]; //image buffer |
dicarloj | 0:7757ab3f7206 | 101 | |
dicarloj | 0:7757ab3f7206 | 102 | void make_checkerboard() |
dicarloj | 0:7757ab3f7206 | 103 | { |
dicarloj | 0:7757ab3f7206 | 104 | for(int i = 0; i < H_RES; i++) |
dicarloj | 0:7757ab3f7206 | 105 | for(int j = 0; j < V_RES; j++) |
dicarloj | 0:7757ab3f7206 | 106 | im_line_va[i+j*H_RES] = ((i > 20) && (i < 98)) && ((j%2) ^ (i%2)); //checkerboard |
dicarloj | 0:7757ab3f7206 | 107 | |
dicarloj | 0:7757ab3f7206 | 108 | } |
dicarloj | 0:7757ab3f7206 | 109 | |
dicarloj | 0:7757ab3f7206 | 110 | void init_buffers() |
dicarloj | 0:7757ab3f7206 | 111 | { |
dicarloj | 0:7757ab3f7206 | 112 | make_checkerboard(); |
dicarloj | 0:7757ab3f7206 | 113 | for(int i = 0; i < H_RES; i++) |
dicarloj | 0:7757ab3f7206 | 114 | { |
dicarloj | 0:7757ab3f7206 | 115 | im_line_s[i] = 1; |
dicarloj | 0:7757ab3f7206 | 116 | bl_line_s[i] = 1; |
dicarloj | 0:7757ab3f7206 | 117 | bl_line_v[i] = 0; |
dicarloj | 0:7757ab3f7206 | 118 | vb_line_s[i] = 0; |
dicarloj | 0:7757ab3f7206 | 119 | vb_line_v[i] = 0; |
dicarloj | 0:7757ab3f7206 | 120 | } |
dicarloj | 0:7757ab3f7206 | 121 | im_line_s[0] = 0; |
dicarloj | 0:7757ab3f7206 | 122 | im_line_s[1] = 0; |
dicarloj | 0:7757ab3f7206 | 123 | im_line_s[2] = 0; |
dicarloj | 0:7757ab3f7206 | 124 | bl_line_s[0] = 0; |
dicarloj | 0:7757ab3f7206 | 125 | vb_line_s[0] = 1; |
dicarloj | 0:7757ab3f7206 | 126 | bl_line_s[1] = 0; |
dicarloj | 0:7757ab3f7206 | 127 | vb_line_s[1] = 1; |
dicarloj | 0:7757ab3f7206 | 128 | |
dicarloj | 0:7757ab3f7206 | 129 | |
dicarloj | 0:7757ab3f7206 | 130 | |
dicarloj | 0:7757ab3f7206 | 131 | } |
dicarloj | 0:7757ab3f7206 | 132 | void isr() |
dicarloj | 0:7757ab3f7206 | 133 | { |
dicarloj | 0:7757ab3f7206 | 134 | uint8_t nop = 0; //use nops or use wait_us |
dicarloj | 0:7757ab3f7206 | 135 | uint8_t* sptr; //pointer to sync buffer for line |
dicarloj | 0:7757ab3f7206 | 136 | uint8_t* vptr; //pointer to video buffer for line |
dicarloj | 0:7757ab3f7206 | 137 | if(l < V_RES){ vptr = im_line_va + ((l/4)*H_RES); sptr = im_line_s; nop = 1; } //pick line buffers |
dicarloj | 0:7757ab3f7206 | 138 | else if(l < 254){ vptr = bl_line_v; sptr = bl_line_s; nop = 0; } |
dicarloj | 0:7757ab3f7206 | 139 | else{ vptr = vb_line_v; sptr = vb_line_s; nop = 1;} |
dicarloj | 0:7757ab3f7206 | 140 | uint8_t lmax = nop?H_RES:12; //number of columns |
dicarloj | 0:7757ab3f7206 | 141 | for(uint8_t i = 0; i < lmax; i++) //loop over each column |
dicarloj | 0:7757ab3f7206 | 142 | { |
dicarloj | 0:7757ab3f7206 | 143 | vout = vptr[i]; //set output pins |
dicarloj | 0:7757ab3f7206 | 144 | sout = sptr[i]; |
dicarloj | 0:7757ab3f7206 | 145 | if(nop) //nop delay |
dicarloj | 0:7757ab3f7206 | 146 | { |
dicarloj | 0:7757ab3f7206 | 147 | asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");//asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop"); |
dicarloj | 0:7757ab3f7206 | 148 | } |
dicarloj | 0:7757ab3f7206 | 149 | else {wait_us(1); if(i > 2) i++;} //wait delay |
dicarloj | 0:7757ab3f7206 | 150 | |
dicarloj | 0:7757ab3f7206 | 151 | |
dicarloj | 0:7757ab3f7206 | 152 | } |
dicarloj | 0:7757ab3f7206 | 153 | //move to next line |
dicarloj | 0:7757ab3f7206 | 154 | l++; |
dicarloj | 0:7757ab3f7206 | 155 | if(l > 255) l = 0; |
dicarloj | 0:7757ab3f7206 | 156 | } |
dicarloj | 0:7757ab3f7206 | 157 | |
dicarloj | 0:7757ab3f7206 | 158 | //coordinates for bouncing ball |
dicarloj | 0:7757ab3f7206 | 159 | |
dicarloj | 0:7757ab3f7206 | 160 | |
dicarloj | 0:7757ab3f7206 | 161 | |
dicarloj | 0:7757ab3f7206 | 162 | int k = 0; |
dicarloj | 0:7757ab3f7206 | 163 | uint16_t px = X_0*10; |
dicarloj | 0:7757ab3f7206 | 164 | uint16_t py = Y_0*10; |
dicarloj | 0:7757ab3f7206 | 165 | uint16_t vx = 10; |
dicarloj | 0:7757ab3f7206 | 166 | uint16_t vy = 10; |
dicarloj | 0:7757ab3f7206 | 167 | uint16_t px2 = X_0*10 + 80; |
dicarloj | 0:7757ab3f7206 | 168 | uint16_t py2 = Y_0*10 - 40; |
dicarloj | 0:7757ab3f7206 | 169 | uint16_t vx2 = 3; |
dicarloj | 0:7757ab3f7206 | 170 | uint16_t vy2 = -4; |
dicarloj | 0:7757ab3f7206 | 171 | |
dicarloj | 0:7757ab3f7206 | 172 | int16_t sign(int16_t a) |
dicarloj | 0:7757ab3f7206 | 173 | { |
dicarloj | 0:7757ab3f7206 | 174 | if(a > 0) return 1; |
dicarloj | 0:7757ab3f7206 | 175 | if(a < 0) return -1; |
dicarloj | 0:7757ab3f7206 | 176 | return 0; |
dicarloj | 0:7757ab3f7206 | 177 | } |
dicarloj | 0:7757ab3f7206 | 178 | |
dicarloj | 0:7757ab3f7206 | 179 | void draw_vert(int16_t y0, int16_t y1, int16_t x0) |
dicarloj | 0:7757ab3f7206 | 180 | { |
dicarloj | 0:7757ab3f7206 | 181 | for(int16_t i = y0; i < y1; i++) |
dicarloj | 0:7757ab3f7206 | 182 | im_line_va[H_RES*i + x0] = 1; |
dicarloj | 0:7757ab3f7206 | 183 | } |
dicarloj | 0:7757ab3f7206 | 184 | |
dicarloj | 0:7757ab3f7206 | 185 | void draw_horiz(int16_t x0, int16_t x1, int16_t y0) |
dicarloj | 0:7757ab3f7206 | 186 | { |
dicarloj | 0:7757ab3f7206 | 187 | for(int16_t i = x0; i < x1; i++) |
dicarloj | 0:7757ab3f7206 | 188 | im_line_va[H_RES*y0 + i] = 1; |
dicarloj | 0:7757ab3f7206 | 189 | } |
dicarloj | 0:7757ab3f7206 | 190 | |
dicarloj | 0:7757ab3f7206 | 191 | int16_t imin(int16_t a, int16_t b) |
dicarloj | 0:7757ab3f7206 | 192 | { |
dicarloj | 0:7757ab3f7206 | 193 | if(a<b) return a; |
dicarloj | 0:7757ab3f7206 | 194 | return b; |
dicarloj | 0:7757ab3f7206 | 195 | } |
dicarloj | 0:7757ab3f7206 | 196 | |
dicarloj | 0:7757ab3f7206 | 197 | int16_t imax(int16_t a, int16_t b) |
dicarloj | 0:7757ab3f7206 | 198 | { |
dicarloj | 0:7757ab3f7206 | 199 | if(a>b) return a; |
dicarloj | 0:7757ab3f7206 | 200 | return b; |
dicarloj | 0:7757ab3f7206 | 201 | } |
dicarloj | 0:7757ab3f7206 | 202 | |
dicarloj | 0:7757ab3f7206 | 203 | void draw_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1) |
dicarloj | 0:7757ab3f7206 | 204 | { |
dicarloj | 0:7757ab3f7206 | 205 | if(x0 > x1){ x0 = x0 ^ x1; x1 = x1^x0; x0 = x0^x1;y0 = y0 ^ y1; y1 = y1^y0; y0 = y0^y1; } |
dicarloj | 0:7757ab3f7206 | 206 | if(x0 == x1){draw_vert(y0,y1,x0);} |
dicarloj | 0:7757ab3f7206 | 207 | if(y0 == y1){draw_horiz(x0,x1,y0);} |
dicarloj | 0:7757ab3f7206 | 208 | int16_t dx = x1 - x0; |
dicarloj | 0:7757ab3f7206 | 209 | int16_t dy = y1 - y0; |
dicarloj | 0:7757ab3f7206 | 210 | float derr = fabs((float)(dy)/(float)(dx)); |
dicarloj | 0:7757ab3f7206 | 211 | float err = 0.f; |
dicarloj | 0:7757ab3f7206 | 212 | int16_t y = y0; |
dicarloj | 0:7757ab3f7206 | 213 | for(int16_t x = x0; x < x1; x++) |
dicarloj | 0:7757ab3f7206 | 214 | { |
dicarloj | 0:7757ab3f7206 | 215 | //plotxy |
dicarloj | 0:7757ab3f7206 | 216 | im_line_va[H_RES*y + x] = !draw_line_inv; |
dicarloj | 0:7757ab3f7206 | 217 | err += derr; |
dicarloj | 0:7757ab3f7206 | 218 | while(err >= 0.5f) |
dicarloj | 0:7757ab3f7206 | 219 | { |
dicarloj | 0:7757ab3f7206 | 220 | y += sign(dy); |
dicarloj | 0:7757ab3f7206 | 221 | im_line_va[H_RES*y + x] = !draw_line_inv; |
dicarloj | 0:7757ab3f7206 | 222 | err -= 1.f; |
dicarloj | 0:7757ab3f7206 | 223 | } |
dicarloj | 0:7757ab3f7206 | 224 | } |
dicarloj | 0:7757ab3f7206 | 225 | } |
dicarloj | 0:7757ab3f7206 | 226 | |
dicarloj | 0:7757ab3f7206 | 227 | void draw_cube(float cp[][3]) |
dicarloj | 0:7757ab3f7206 | 228 | { |
dicarloj | 0:7757ab3f7206 | 229 | for(uint8_t i = 0; i < 7; i++) |
dicarloj | 0:7757ab3f7206 | 230 | { |
dicarloj | 0:7757ab3f7206 | 231 | draw_line((int16_t)cp[i][0]+cube_a[0]+X_0,(int16_t)cp[i][1]+cube_a[1]+Y_0,(int16_t)cp[i+1][0]+cube_a[0]+X_0,(int16_t)cp[i+1][1]+cube_a[1]+Y_0); |
dicarloj | 0:7757ab3f7206 | 232 | } |
dicarloj | 0:7757ab3f7206 | 233 | draw_line((int16_t)cp[0][0]+cube_a[0]+X_0,(int16_t)cp[0][1]+cube_a[1]+Y_0,(int16_t)cp[3][0]+cube_a[0]+X_0,(int16_t)cp[3][1]+cube_a[1]+Y_0); |
dicarloj | 0:7757ab3f7206 | 234 | draw_line((int16_t)cp[4][0]+cube_a[0]+X_0,(int16_t)cp[4][1]+cube_a[1]+Y_0,(int16_t)cp[7][0]+cube_a[0]+X_0,(int16_t)cp[7][1]+cube_a[1]+Y_0); |
dicarloj | 0:7757ab3f7206 | 235 | draw_line((int16_t)cp[0][0]+cube_a[0]+X_0,(int16_t)cp[0][1]+cube_a[1]+Y_0,(int16_t)cp[7][0]+cube_a[0]+X_0,(int16_t)cp[7][1]+cube_a[1]+Y_0); |
dicarloj | 0:7757ab3f7206 | 236 | draw_line((int16_t)cp[1][0]+cube_a[0]+X_0,(int16_t)cp[1][1]+cube_a[1]+Y_0,(int16_t)cp[6][0]+cube_a[0]+X_0,(int16_t)cp[6][1]+cube_a[1]+Y_0); |
dicarloj | 0:7757ab3f7206 | 237 | draw_line((int16_t)cp[2][0]+cube_a[0]+X_0,(int16_t)cp[2][1]+cube_a[1]+Y_0,(int16_t)cp[5][0]+cube_a[0]+X_0,(int16_t)cp[5][1]+cube_a[1]+Y_0); |
dicarloj | 0:7757ab3f7206 | 238 | } |
dicarloj | 0:7757ab3f7206 | 239 | |
dicarloj | 0:7757ab3f7206 | 240 | void apply_rot(float cp[][3], float r[][3]) |
dicarloj | 0:7757ab3f7206 | 241 | { |
dicarloj | 0:7757ab3f7206 | 242 | for(uint8_t pti = 0; pti < 8; pti++) |
dicarloj | 0:7757ab3f7206 | 243 | { |
dicarloj | 0:7757ab3f7206 | 244 | float* cpt = cp[pti]; |
dicarloj | 0:7757ab3f7206 | 245 | float xn = r[0][0] * cpt[0] + r[0][1] * cpt[1] + r[0][2] * cpt[2]; |
dicarloj | 0:7757ab3f7206 | 246 | float yn = r[1][0] * cpt[0] + r[1][1] * cpt[1] + r[1][2] * cpt[2]; |
dicarloj | 0:7757ab3f7206 | 247 | float zn = r[2][0] * cpt[0] + r[2][1] * cpt[1] + r[2][2] * cpt[2]; |
dicarloj | 0:7757ab3f7206 | 248 | cpt[0] = xn; |
dicarloj | 0:7757ab3f7206 | 249 | cpt[1] = yn; |
dicarloj | 0:7757ab3f7206 | 250 | cpt[2] = zn; |
dicarloj | 0:7757ab3f7206 | 251 | } |
dicarloj | 0:7757ab3f7206 | 252 | } |
dicarloj | 0:7757ab3f7206 | 253 | |
dicarloj | 0:7757ab3f7206 | 254 | void apply_xf_rot(float cpt[], float r[][3]) |
dicarloj | 0:7757ab3f7206 | 255 | { |
dicarloj | 0:7757ab3f7206 | 256 | float xn = r[0][0] * cpt[0] + r[0][1] * cpt[1] + r[0][2] * cpt[2]; |
dicarloj | 0:7757ab3f7206 | 257 | float yn = r[1][0] * cpt[0] + r[1][1] * cpt[1] + r[1][2] * cpt[2]; |
dicarloj | 0:7757ab3f7206 | 258 | float zn = r[2][0] * cpt[0] + r[2][1] * cpt[1] + r[2][2] * cpt[2]; |
dicarloj | 0:7757ab3f7206 | 259 | cpt[0] = xn; |
dicarloj | 0:7757ab3f7206 | 260 | cpt[1] = yn; |
dicarloj | 0:7757ab3f7206 | 261 | cpt[2] = zn; |
dicarloj | 0:7757ab3f7206 | 262 | } |
dicarloj | 0:7757ab3f7206 | 263 | |
dicarloj | 0:7757ab3f7206 | 264 | void draw_v_check(int8_t r,uint8_t tt) |
dicarloj | 0:7757ab3f7206 | 265 | { |
dicarloj | 0:7757ab3f7206 | 266 | for(int i = 0; i < H_RES; i++) |
dicarloj | 0:7757ab3f7206 | 267 | for(int j = 0; j < V_RES; j++) |
dicarloj | 0:7757ab3f7206 | 268 | im_line_va[i+j*H_RES] = (((i > 20) && (i < 98)) && ( tt ^(((j%(r*2))>=r) ^ ((i%(r*2)))>=r))); //checkerboard |
dicarloj | 0:7757ab3f7206 | 269 | } |
dicarloj | 0:7757ab3f7206 | 270 | |
dicarloj | 0:7757ab3f7206 | 271 | |
dicarloj | 0:7757ab3f7206 | 272 | int jjj = 0; |
dicarloj | 0:7757ab3f7206 | 273 | int f_count = DEMO_LENGTH + 10; |
dicarloj | 0:7757ab3f7206 | 274 | void draw_cube_spin(int kkkk); |
dicarloj | 0:7757ab3f7206 | 275 | //update bouncing balls |
dicarloj | 0:7757ab3f7206 | 276 | |
dicarloj | 0:7757ab3f7206 | 277 | void draw_blank() |
dicarloj | 0:7757ab3f7206 | 278 | { |
dicarloj | 0:7757ab3f7206 | 279 | for(uint16_t h = X_MIN; h < X_MAX; h++) |
dicarloj | 0:7757ab3f7206 | 280 | { |
dicarloj | 0:7757ab3f7206 | 281 | for(uint16_t v = Y_MIN; v < Y_MAX+15; v++) |
dicarloj | 0:7757ab3f7206 | 282 | { |
dicarloj | 0:7757ab3f7206 | 283 | im_line_va[v*H_RES + h] = 0; |
dicarloj | 0:7757ab3f7206 | 284 | } |
dicarloj | 0:7757ab3f7206 | 285 | } |
dicarloj | 0:7757ab3f7206 | 286 | } |
dicarloj | 0:7757ab3f7206 | 287 | |
dicarloj | 0:7757ab3f7206 | 288 | void wipe(); |
dicarloj | 0:7757ab3f7206 | 289 | |
dicarloj | 0:7757ab3f7206 | 290 | void update_image() |
dicarloj | 0:7757ab3f7206 | 291 | { |
dicarloj | 0:7757ab3f7206 | 292 | //delay |
dicarloj | 0:7757ab3f7206 | 293 | k++; |
dicarloj | 0:7757ab3f7206 | 294 | if(k%4000) return; |
dicarloj | 0:7757ab3f7206 | 295 | f_count++; |
dicarloj | 0:7757ab3f7206 | 296 | if(f_count < DEMO_LENGTH/2) |
dicarloj | 0:7757ab3f7206 | 297 | { |
dicarloj | 0:7757ab3f7206 | 298 | draw_cube_spin(0); |
dicarloj | 0:7757ab3f7206 | 299 | } |
dicarloj | 0:7757ab3f7206 | 300 | else if(f_count < DEMO_LENGTH) |
dicarloj | 0:7757ab3f7206 | 301 | { |
dicarloj | 0:7757ab3f7206 | 302 | draw_cube_spin(1); |
dicarloj | 0:7757ab3f7206 | 303 | } |
dicarloj | 0:7757ab3f7206 | 304 | else if(f_count < DEMO_LENGTH * 2) |
dicarloj | 0:7757ab3f7206 | 305 | { |
dicarloj | 0:7757ab3f7206 | 306 | for(int k = 1; k < 10; k++) |
dicarloj | 0:7757ab3f7206 | 307 | for(int kk = 1; kk < 3; kk++) |
dicarloj | 0:7757ab3f7206 | 308 | { |
dicarloj | 0:7757ab3f7206 | 309 | draw_v_check(k,1); |
dicarloj | 0:7757ab3f7206 | 310 | draw_v_check(k,1); |
dicarloj | 0:7757ab3f7206 | 311 | draw_v_check(k,0); |
dicarloj | 0:7757ab3f7206 | 312 | draw_v_check(k,0); |
dicarloj | 0:7757ab3f7206 | 313 | } |
dicarloj | 0:7757ab3f7206 | 314 | |
dicarloj | 0:7757ab3f7206 | 315 | draw_v_check(1,0); |
dicarloj | 0:7757ab3f7206 | 316 | wipe(); |
dicarloj | 0:7757ab3f7206 | 317 | f_count = 0; |
dicarloj | 0:7757ab3f7206 | 318 | } |
dicarloj | 0:7757ab3f7206 | 319 | } |
dicarloj | 0:7757ab3f7206 | 320 | |
dicarloj | 0:7757ab3f7206 | 321 | void wipe() |
dicarloj | 0:7757ab3f7206 | 322 | { |
dicarloj | 0:7757ab3f7206 | 323 | for(int v = Y_MIN; v < Y_MAX+15; v++) |
dicarloj | 0:7757ab3f7206 | 324 | { |
dicarloj | 0:7757ab3f7206 | 325 | for(uint16_t h = X_MIN; h < X_MAX; h++) |
dicarloj | 0:7757ab3f7206 | 326 | { |
dicarloj | 0:7757ab3f7206 | 327 | im_line_va[v*H_RES+h] = 1; |
dicarloj | 0:7757ab3f7206 | 328 | } |
dicarloj | 0:7757ab3f7206 | 329 | wait(.03); |
dicarloj | 0:7757ab3f7206 | 330 | } |
dicarloj | 0:7757ab3f7206 | 331 | |
dicarloj | 0:7757ab3f7206 | 332 | for(int v = Y_MAX+15; v > Y_MIN; v--) |
dicarloj | 0:7757ab3f7206 | 333 | { |
dicarloj | 0:7757ab3f7206 | 334 | for(uint16_t h = X_MIN; h < X_MAX; h++) |
dicarloj | 0:7757ab3f7206 | 335 | { |
dicarloj | 0:7757ab3f7206 | 336 | im_line_va[v*H_RES+h] = 0; |
dicarloj | 0:7757ab3f7206 | 337 | } |
dicarloj | 0:7757ab3f7206 | 338 | wait(.03); |
dicarloj | 0:7757ab3f7206 | 339 | } |
dicarloj | 0:7757ab3f7206 | 340 | |
dicarloj | 0:7757ab3f7206 | 341 | for(uint16_t h = X_MIN; h < X_MAX; h++) |
dicarloj | 0:7757ab3f7206 | 342 | { |
dicarloj | 0:7757ab3f7206 | 343 | for(uint16_t v = Y_MIN; v < Y_MAX+15; v++) |
dicarloj | 0:7757ab3f7206 | 344 | { |
dicarloj | 0:7757ab3f7206 | 345 | im_line_va[v*H_RES + h] = 1; |
dicarloj | 0:7757ab3f7206 | 346 | } |
dicarloj | 0:7757ab3f7206 | 347 | wait(.03); |
dicarloj | 0:7757ab3f7206 | 348 | } |
dicarloj | 0:7757ab3f7206 | 349 | |
dicarloj | 0:7757ab3f7206 | 350 | for(uint16_t h = X_MIN; h < X_MAX; h++) |
dicarloj | 0:7757ab3f7206 | 351 | { |
dicarloj | 0:7757ab3f7206 | 352 | for(uint16_t v = Y_MIN; v < Y_MAX+15; v++) |
dicarloj | 0:7757ab3f7206 | 353 | { |
dicarloj | 0:7757ab3f7206 | 354 | im_line_va[v*H_RES + h] = 0; |
dicarloj | 0:7757ab3f7206 | 355 | } |
dicarloj | 0:7757ab3f7206 | 356 | wait(.03); |
dicarloj | 0:7757ab3f7206 | 357 | } |
dicarloj | 0:7757ab3f7206 | 358 | |
dicarloj | 0:7757ab3f7206 | 359 | for(int v = Y_MIN; v < Y_MAX+15; v++) |
dicarloj | 0:7757ab3f7206 | 360 | { |
dicarloj | 0:7757ab3f7206 | 361 | for(uint16_t h = X_MIN; h < X_MAX; h++) |
dicarloj | 0:7757ab3f7206 | 362 | { |
dicarloj | 0:7757ab3f7206 | 363 | im_line_va[v*H_RES+h] = 0; |
dicarloj | 0:7757ab3f7206 | 364 | } |
dicarloj | 0:7757ab3f7206 | 365 | } |
dicarloj | 0:7757ab3f7206 | 366 | } |
dicarloj | 0:7757ab3f7206 | 367 | |
dicarloj | 0:7757ab3f7206 | 368 | void draw_cube_spin(int kkkk) |
dicarloj | 0:7757ab3f7206 | 369 | { |
dicarloj | 0:7757ab3f7206 | 370 | draw_line_inv = kkkk; |
dicarloj | 0:7757ab3f7206 | 371 | //blank |
dicarloj | 0:7757ab3f7206 | 372 | for(uint16_t h = X_MIN; h < X_MAX; h++) |
dicarloj | 0:7757ab3f7206 | 373 | { |
dicarloj | 0:7757ab3f7206 | 374 | for(uint16_t v = Y_MIN; v < Y_MAX; v++) |
dicarloj | 0:7757ab3f7206 | 375 | { |
dicarloj | 0:7757ab3f7206 | 376 | if( (h > 22) && (h < 76+18)) |
dicarloj | 0:7757ab3f7206 | 377 | im_line_va[v*H_RES + h] = kkkk; |
dicarloj | 0:7757ab3f7206 | 378 | } |
dicarloj | 0:7757ab3f7206 | 379 | } |
dicarloj | 0:7757ab3f7206 | 380 | apply_xf_rot(cube_a,y_rot); |
dicarloj | 0:7757ab3f7206 | 381 | apply_xf_rot(cube_a,y_rot); |
dicarloj | 0:7757ab3f7206 | 382 | apply_rot(cube_pts,x_rot); |
dicarloj | 0:7757ab3f7206 | 383 | apply_rot(cube_pts,x_rot); |
dicarloj | 0:7757ab3f7206 | 384 | apply_rot(cube_pts,y_rot); |
dicarloj | 0:7757ab3f7206 | 385 | apply_rot(cube_pts,y_rot); |
dicarloj | 0:7757ab3f7206 | 386 | apply_rot(cube_pts,z_rot); |
dicarloj | 0:7757ab3f7206 | 387 | //draw ball |
dicarloj | 0:7757ab3f7206 | 388 | im_line_va[(py/10)*H_RES + (px/10)] = 1; |
dicarloj | 0:7757ab3f7206 | 389 | draw_line(X_0,Y_0,(px/10),(py/10)); |
dicarloj | 0:7757ab3f7206 | 390 | draw_cube(cube_pts); |
dicarloj | 0:7757ab3f7206 | 391 | |
dicarloj | 0:7757ab3f7206 | 392 | //update position/check for bounces |
dicarloj | 0:7757ab3f7206 | 393 | px += vx; |
dicarloj | 0:7757ab3f7206 | 394 | py += vy; |
dicarloj | 0:7757ab3f7206 | 395 | px2 += vx2; |
dicarloj | 0:7757ab3f7206 | 396 | py2 += vy2; |
dicarloj | 0:7757ab3f7206 | 397 | if(px/10 > (X_MAX-2) || px/10 < (X_MIN+1)) vx = -vx; |
dicarloj | 0:7757ab3f7206 | 398 | if(py/10 > (Y_MAX-2) || py/10 < (Y_MIN+1)) vy = -vy; |
dicarloj | 0:7757ab3f7206 | 399 | if(px2/10 > (X_MAX-2) || px2/10 < (X_MIN+1)) vx2 = -vx2; |
dicarloj | 0:7757ab3f7206 | 400 | if(py2/10 > (Y_MAX-2) || py2/10 < (Y_MIN+1)) vy2 = -vy2; |
dicarloj | 0:7757ab3f7206 | 401 | if(k%(8000*50)) return; |
dicarloj | 0:7757ab3f7206 | 402 | |
dicarloj | 0:7757ab3f7206 | 403 | jjj = !jjj; |
dicarloj | 0:7757ab3f7206 | 404 | int bmi = 0; |
dicarloj | 0:7757ab3f7206 | 405 | for(int y = BY_0; y < BY_0 + BY; y++) |
dicarloj | 0:7757ab3f7206 | 406 | { |
dicarloj | 0:7757ab3f7206 | 407 | for(int x = BX_0; x < BX_0 + BX; x++) |
dicarloj | 0:7757ab3f7206 | 408 | { |
dicarloj | 0:7757ab3f7206 | 409 | im_line_va[H_RES*y + x] = kkkk^(miters[bmi]*jjj + (!jjj)*tv[bmi]); |
dicarloj | 0:7757ab3f7206 | 410 | bmi++; |
dicarloj | 0:7757ab3f7206 | 411 | } |
dicarloj | 0:7757ab3f7206 | 412 | } |
dicarloj | 0:7757ab3f7206 | 413 | } |
dicarloj | 0:7757ab3f7206 | 414 | |
dicarloj | 0:7757ab3f7206 | 415 | int main() { |
dicarloj | 0:7757ab3f7206 | 416 | init_buffers(); |
dicarloj | 0:7757ab3f7206 | 417 | t.attach_us(&isr,63); |
dicarloj | 0:7757ab3f7206 | 418 | for(;;) |
dicarloj | 0:7757ab3f7206 | 419 | { |
dicarloj | 0:7757ab3f7206 | 420 | update_image(); |
dicarloj | 0:7757ab3f7206 | 421 | } |
dicarloj | 0:7757ab3f7206 | 422 | } |