ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

Committer:
el17cd
Date:
Thu Apr 04 19:03:06 2019 +0000
Revision:
26:8a85aede976d
Parent:
25:3995271e411c
Child:
27:e46af658c67a
Fixed bouncing issue with d pad buttons, implemented input processor function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17cd 1:044238f7bdda 1 #include "Rasturizer.h"
el17cd 2:a5bc7b3779f7 2
el17cd 4:759a5c34e239 3 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
el17cd 3:2e31dfcb712a 4
el17cd 4:759a5c34e239 5 Rasturizer::Rasturizer(){
el17cd 20:3ca430241df0 6 for(int i = 0; i < 6; i++){
el17cd 20:3ca430241df0 7 selectionCube.getFace(i).setVisible(true);
el17cd 20:3ca430241df0 8 }
el17cd 20:3ca430241df0 9 }
el17cd 15:8fbbdefbe720 10
el17cd 15:8fbbdefbe720 11 void Rasturizer::init(){
el17cd 15:8fbbdefbe720 12 lcd.init();
el17cd 15:8fbbdefbe720 13 fov = 50;
el17cd 15:8fbbdefbe720 14 }
el17cd 15:8fbbdefbe720 15
el17cd 17:3c9672c6e532 16 float Rasturizer::xTo2D(float x, float z){
el17cd 14:885915260e25 17 return x * (fov/z) + 42;
el17cd 14:885915260e25 18 }
el17cd 14:885915260e25 19
el17cd 17:3c9672c6e532 20 float Rasturizer::yTo2D(float y, float z){
el17cd 14:885915260e25 21 return y * (fov/z) + 21;
el17cd 4:759a5c34e239 22 }
el17cd 1:044238f7bdda 23
el17cd 17:3c9672c6e532 24 void Rasturizer::drawHorizon(float angle){
el17cd 11:2cd6341136ca 25 lcd.drawLine(0,
el17cd 25:3995271e411c 26 21-rint(-angle*40),
el17cd 11:2cd6341136ca 27 84,
el17cd 25:3995271e411c 28 21+rint(-angle*40),
el17cd 20:3ca430241df0 29 1);
el17cd 11:2cd6341136ca 30 }
el17cd 11:2cd6341136ca 31
el17cd 21:6b5d2d75e083 32 void Rasturizer::drawFace(Face *face, float angle){
el17cd 17:3c9672c6e532 33 float points[4][3];
el17cd 22:236319885874 34 float y, x;
el17cd 26:8a85aede976d 35
el17cd 21:6b5d2d75e083 36
el17cd 4:759a5c34e239 37 for(int vertex = 0; vertex < 4; vertex++){
el17cd 4:759a5c34e239 38 for(int axis = 0; axis < 3; axis++){
el17cd 21:6b5d2d75e083 39 points[vertex][axis] = face->getVertexValue(vertex, axis);
el17cd 4:759a5c34e239 40 }
el17cd 21:6b5d2d75e083 41 y = points[vertex][1];
el17cd 21:6b5d2d75e083 42 x = points[vertex][0];
el17cd 11:2cd6341136ca 43
el17cd 25:3995271e411c 44 points[vertex][0] = x*cos(-angle)-y*sin(-angle);
el17cd 25:3995271e411c 45 points[vertex][1] = y*cos(-angle)+x*sin(-angle);
el17cd 4:759a5c34e239 46 }
el17cd 26:8a85aede976d 47
el17cd 21:6b5d2d75e083 48 if (checkOnScreen(points)){
el17cd 26:8a85aede976d 49 rasterizeFace(points, face);
el17cd 26:8a85aede976d 50 drawFaceOutline(points);
el17cd 26:8a85aede976d 51 }
el17cd 26:8a85aede976d 52 }
el17cd 21:6b5d2d75e083 53
el17cd 26:8a85aede976d 54 void Rasturizer::rasterizeFace(float (&points)[4][3], Face *face){
el17cd 26:8a85aede976d 55 int diffX1, diffY1, diffX2, diffY2;
el17cd 26:8a85aede976d 56 float stepBottomY, stepTopX, stepTopY;
el17cd 26:8a85aede976d 57 diffX1 = xTo2D(points[0][0], points[0][2])-xTo2D(points[1][0], points[1][2]); //Calculate difference between top horizontal edge x coordnates
el17cd 26:8a85aede976d 58 diffY1 = yTo2D(points[0][1], points[0][2])-yTo2D(points[1][1], points[1][2]); //Calculate difference between right vertical edge y coordinates
el17cd 26:8a85aede976d 59 diffX2 = xTo2D(points[2][0], points[2][2])-xTo2D(points[3][0], points[3][2]); //Calculate difference between bottom horizontal edge x coordinates
el17cd 26:8a85aede976d 60 diffY2 = yTo2D(points[2][1], points[2][2])-yTo2D(points[3][1], points[3][2]); //Calculate difference between left horizontal edge y coordinates
el17cd 26:8a85aede976d 61 if(diffX2 != 0 && face->getVisible()){
el17cd 26:8a85aede976d 62 stepBottomY = (float)diffY2/(float)diffX2; //increment multiplier for Y axis on bottom edge of face
el17cd 26:8a85aede976d 63 stepTopX = (float)diffX1/(float)diffX2; //increment multiplier for X axis on top edge of face
el17cd 26:8a85aede976d 64 stepTopY = (float)diffY1/(float)diffX2; //increment multiplier for Y axis on top edge of face
el17cd 26:8a85aede976d 65
el17cd 26:8a85aede976d 66 drawFillLines(points, diffX2, stepBottomY, stepTopX, stepTopY); //fill the face with white lines
el17cd 1:044238f7bdda 67 }
el17cd 4:759a5c34e239 68 }
el17cd 26:8a85aede976d 69
el17cd 26:8a85aede976d 70 void Rasturizer::drawFillLines(float (&points)[4][3], int diffX2, int stepBottomY, int stepTopX, int stepTopY){
el17cd 26:8a85aede976d 71 for(int step = 0; step< abs(diffX2); step++){
el17cd 26:8a85aede976d 72 if(diffX2 > 0){
el17cd 26:8a85aede976d 73 lcd.drawLine(rint(xTo2D(points[0][0], points[0][2])-stepTopX*step),
el17cd 26:8a85aede976d 74 rint(yTo2D(points[0][1], points[0][2])-stepTopY*step),
el17cd 26:8a85aede976d 75 rint(xTo2D(points[3][0], points[3][2])+step),
el17cd 26:8a85aede976d 76 rint(yTo2D(points[3][1], points[3][2])+stepBottomY*step),
el17cd 26:8a85aede976d 77 0);
el17cd 26:8a85aede976d 78 }
el17cd 26:8a85aede976d 79 else{
el17cd 26:8a85aede976d 80 lcd.drawLine(rint(xTo2D(points[0][0], points[0][2])+stepTopX*step),
el17cd 26:8a85aede976d 81 rint(yTo2D(points[0][1], points[0][2])+stepTopY*step),
el17cd 26:8a85aede976d 82 rint(xTo2D(points[3][0], points[3][2])-step),
el17cd 26:8a85aede976d 83 rint(yTo2D(points[3][1], points[3][2])-stepBottomY*step),
el17cd 26:8a85aede976d 84 0);
el17cd 26:8a85aede976d 85 }
el17cd 26:8a85aede976d 86 }
el17cd 26:8a85aede976d 87 }
el17cd 26:8a85aede976d 88
el17cd 26:8a85aede976d 89 void Rasturizer::drawFaceOutline(float(&points)[4][3]){
el17cd 26:8a85aede976d 90 for (int i = 0; i < 3; i++){
el17cd 26:8a85aede976d 91 lcd.drawLine(rint(xTo2D(points[i][0], points[i][2])),
el17cd 26:8a85aede976d 92 rint(yTo2D(points[i][1], points[i][2])),
el17cd 26:8a85aede976d 93 rint(xTo2D(points[i+1][0], points[i+1][2])),
el17cd 26:8a85aede976d 94 rint(yTo2D(points[i+1][1], points[i+1][2])),
el17cd 26:8a85aede976d 95 1);
el17cd 26:8a85aede976d 96 }
el17cd 26:8a85aede976d 97 lcd.drawLine(rint(xTo2D(points[0][0], points[0][2])),
el17cd 26:8a85aede976d 98 rint(yTo2D(points[0][1], points[0][2])),
el17cd 26:8a85aede976d 99 rint(xTo2D(points[3][0], points[3][2])),
el17cd 26:8a85aede976d 100 rint(yTo2D(points[3][1], points[3][2])),
el17cd 26:8a85aede976d 101 1);
el17cd 26:8a85aede976d 102 }
el17cd 26:8a85aede976d 103
el17cd 21:6b5d2d75e083 104 void Rasturizer::drawAllFaces(Face *faceArray, int noOfCubes, float angle){
el17cd 21:6b5d2d75e083 105 Face temp;
el17cd 20:3ca430241df0 106 for (int f = 0; f< (noOfCubes*6)-1; f++){
el17cd 20:3ca430241df0 107 for (int f2 = 0; f2< (noOfCubes*6)-f-1; f2++){
el17cd 20:3ca430241df0 108 if(faceArray[f2].getAvgZ() < faceArray[f2+1].getAvgZ()){
el17cd 21:6b5d2d75e083 109 temp = faceArray[f2+1];
el17cd 20:3ca430241df0 110 faceArray[f2+1] = faceArray[f2];
el17cd 20:3ca430241df0 111 faceArray[f2] = temp;
el17cd 20:3ca430241df0 112 }
el17cd 20:3ca430241df0 113 }
el17cd 20:3ca430241df0 114 }
el17cd 20:3ca430241df0 115 for (int f = 0; f< noOfCubes*6 ; f++){
el17cd 21:6b5d2d75e083 116 drawFace(&faceArray[f], angle/15);
el17cd 20:3ca430241df0 117 }
el17cd 20:3ca430241df0 118 }
el17cd 9:5915fc800824 119
el17cd 19:ec4cb22accb0 120 bool Rasturizer::checkOnScreen(float (&points)[4][3]){
el17cd 21:6b5d2d75e083 121 if (points[0][2] < 6 || points[1][2] < 6 || points[2][2] < 6 || points[3][2] < 6){
el17cd 19:ec4cb22accb0 122 return false;
el17cd 19:ec4cb22accb0 123 }
el17cd 19:ec4cb22accb0 124 else if ((xTo2D(points[0][0], points[0][2]) < 0 || xTo2D(points[0][0], points[0][2]) > 84)
el17cd 19:ec4cb22accb0 125 && (xTo2D(points[1][0], points[1][2]) < 0 || xTo2D(points[1][0], points[1][2]) > 84)
el17cd 19:ec4cb22accb0 126 && (xTo2D(points[2][0], points[2][2]) < 0 || xTo2D(points[2][0], points[2][2]) > 84)
el17cd 19:ec4cb22accb0 127 && (xTo2D(points[3][0], points[3][2]) < 0 || xTo2D(points[3][0], points[3][2]) > 84)){
el17cd 19:ec4cb22accb0 128 return false;
el17cd 19:ec4cb22accb0 129 }
el17cd 19:ec4cb22accb0 130 return true;
el17cd 19:ec4cb22accb0 131 }
el17cd 19:ec4cb22accb0 132
el17cd 16:64cd7bc094f9 133 void Rasturizer::print(const char *text, int x, int y){
el17cd 16:64cd7bc094f9 134 lcd.printString(text, x, y);
el17cd 11:2cd6341136ca 135 }
el17cd 11:2cd6341136ca 136
el17cd 25:3995271e411c 137 void Rasturizer::printScore(int score){
el17cd 25:3995271e411c 138 char buffer[5];
el17cd 25:3995271e411c 139 sprintf(buffer, "%d", score/3);
el17cd 25:3995271e411c 140 print(buffer, 0, 0);
el17cd 25:3995271e411c 141 memset(buffer, 0, sizeof buffer);
el17cd 25:3995271e411c 142 }
el17cd 25:3995271e411c 143
el17cd 4:759a5c34e239 144 void Rasturizer::clear(){
el17cd 4:759a5c34e239 145 lcd.clear();
el17cd 4:759a5c34e239 146 }
el17cd 4:759a5c34e239 147
el17cd 4:759a5c34e239 148 void Rasturizer::refresh(){
el17cd 4:759a5c34e239 149 lcd.refresh();
el17cd 25:3995271e411c 150 wait_ms(1000/60);
el17cd 14:885915260e25 151 }
el17cd 14:885915260e25 152
el17cd 26:8a85aede976d 153 void Rasturizer::turnOff(){
el17cd 26:8a85aede976d 154 lcd.turnOff();
el17cd 26:8a85aede976d 155 }
el17cd 26:8a85aede976d 156
el17cd 16:64cd7bc094f9 157 void Rasturizer::drawDeathScreen(bool selection){
el17cd 20:3ca430241df0 158 Face faces[6];
el17cd 16:64cd7bc094f9 159 int x;
el17cd 16:64cd7bc094f9 160 int y;
el17cd 16:64cd7bc094f9 161 int z;
el17cd 16:64cd7bc094f9 162
el17cd 16:64cd7bc094f9 163 if(selection == true){
el17cd 16:64cd7bc094f9 164 x = -30;
el17cd 16:64cd7bc094f9 165 y = -3;
el17cd 16:64cd7bc094f9 166 z = 50;
el17cd 16:64cd7bc094f9 167 }
el17cd 16:64cd7bc094f9 168 else{
el17cd 16:64cd7bc094f9 169 x = -30;
el17cd 16:64cd7bc094f9 170 y = 15;
el17cd 16:64cd7bc094f9 171 z = 50;
el17cd 16:64cd7bc094f9 172 }
el17cd 16:64cd7bc094f9 173
el17cd 26:8a85aede976d 174 drawDeathButtons();
el17cd 26:8a85aede976d 175 drawSelectionCube(x, y, z, 2);
el17cd 26:8a85aede976d 176 }
el17cd 26:8a85aede976d 177
el17cd 26:8a85aede976d 178 void Rasturizer::drawDeathButtons(){
el17cd 16:64cd7bc094f9 179 lcd.drawRect(24, 14, 45, 11, FILL_WHITE);
el17cd 16:64cd7bc094f9 180 lcd.drawRect(24, 14, 45, 11, FILL_TRANSPARENT);
el17cd 16:64cd7bc094f9 181 lcd.printString("Restart",26,2);
el17cd 16:64cd7bc094f9 182 lcd.drawRect(24, 30, 45, 11, FILL_WHITE);
el17cd 16:64cd7bc094f9 183 lcd.drawRect(24, 30, 45, 11, FILL_TRANSPARENT);
el17cd 16:64cd7bc094f9 184 lcd.printString("Menu",35,4);
el17cd 18:8256546a3cbf 185 }
el17cd 18:8256546a3cbf 186
el17cd 18:8256546a3cbf 187 void Rasturizer::drawHomeScreen(int selection){
el17cd 26:8a85aede976d 188 int x, y, z;
el17cd 18:8256546a3cbf 189 if(selection == 0){
el17cd 18:8256546a3cbf 190 x = -30;
el17cd 18:8256546a3cbf 191 y = -12;
el17cd 18:8256546a3cbf 192 z = 50;
el17cd 18:8256546a3cbf 193 }
el17cd 18:8256546a3cbf 194 else if(selection == 1){
el17cd 18:8256546a3cbf 195 x = -30;
el17cd 18:8256546a3cbf 196 y = 5;
el17cd 18:8256546a3cbf 197 z = 50;
el17cd 18:8256546a3cbf 198 }
el17cd 18:8256546a3cbf 199 else{
el17cd 18:8256546a3cbf 200 x = -30;
el17cd 18:8256546a3cbf 201 y = 22;
el17cd 18:8256546a3cbf 202 z = 50;
el17cd 18:8256546a3cbf 203 }
el17cd 26:8a85aede976d 204 drawHomeButtons();
el17cd 26:8a85aede976d 205 drawSelectionCube(x, y, z, -1);
el17cd 26:8a85aede976d 206 }
el17cd 26:8a85aede976d 207
el17cd 26:8a85aede976d 208 void Rasturizer::drawHomeButtons(){
el17cd 18:8256546a3cbf 209 lcd.drawRect(24, 6, 45, 10, FILL_WHITE);
el17cd 18:8256546a3cbf 210 lcd.printString("Play",35,1);
el17cd 18:8256546a3cbf 211 lcd.drawRect(24, 6, 45, 10, FILL_TRANSPARENT);
el17cd 18:8256546a3cbf 212
el17cd 18:8256546a3cbf 213 lcd.drawRect(24, 22, 45, 10, FILL_WHITE);
el17cd 18:8256546a3cbf 214 lcd.printString("Help",35,3);
el17cd 18:8256546a3cbf 215 lcd.drawRect(24, 22, 45, 10, FILL_TRANSPARENT);
el17cd 18:8256546a3cbf 216
el17cd 18:8256546a3cbf 217 lcd.drawRect(24, 38, 45, 10, FILL_WHITE);
el17cd 18:8256546a3cbf 218 lcd.printString("Quit",35,5);
el17cd 18:8256546a3cbf 219 lcd.drawRect(24, 38, 45, 10, FILL_TRANSPARENT);
el17cd 26:8a85aede976d 220 }
el17cd 26:8a85aede976d 221
el17cd 26:8a85aede976d 222 void Rasturizer::drawSelectionCube(int x, int y, int z, int rotationSpeed){
el17cd 26:8a85aede976d 223 Face faces[6];
el17cd 18:8256546a3cbf 224 selectionCube.translate(x, y, z);
el17cd 18:8256546a3cbf 225
el17cd 18:8256546a3cbf 226 for(int i = 0; i < 6; i++){
el17cd 20:3ca430241df0 227 faces[i] = selectionCube.getFace(i);
el17cd 18:8256546a3cbf 228 }
el17cd 20:3ca430241df0 229 drawAllFaces(faces, 1, 0);
el17cd 26:8a85aede976d 230 selectionCube.rotateX(-0.05*rotationSpeed);
el17cd 26:8a85aede976d 231 selectionCube.rotateY(-0.025*rotationSpeed);
el17cd 26:8a85aede976d 232 selectionCube.rotateZ(0.04*rotationSpeed);
el17cd 18:8256546a3cbf 233 selectionCube.translate(-x, -y, -z);
el17cd 26:8a85aede976d 234 }
el17cd 26:8a85aede976d 235
el17cd 26:8a85aede976d 236 void Rasturizer::drawHelp(){
el17cd 26:8a85aede976d 237 clear();
el17cd 26:8a85aede976d 238 lcd.printString("Use the",17,1);
el17cd 26:8a85aede976d 239 refresh();
el17cd 26:8a85aede976d 240 wait(0.2);
el17cd 26:8a85aede976d 241 lcd.printString("joystick",15,2);
el17cd 26:8a85aede976d 242 refresh();
el17cd 26:8a85aede976d 243 wait(0.2);
el17cd 26:8a85aede976d 244 lcd.printString("to move",17,3);
el17cd 26:8a85aede976d 245 refresh();
el17cd 26:8a85aede976d 246 wait(0.2);
el17cd 26:8a85aede976d 247 lcd.printString("left and right",0,4);
el17cd 26:8a85aede976d 248 refresh();
el17cd 26:8a85aede976d 249 wait(3);
el17cd 26:8a85aede976d 250 clear();
el17cd 26:8a85aede976d 251 refresh();
el17cd 26:8a85aede976d 252 lcd.printString("Dodge all",15,1);
el17cd 26:8a85aede976d 253 wait(0.2);
el17cd 26:8a85aede976d 254 refresh();
el17cd 26:8a85aede976d 255 lcd.printString("the cubes!",15,2);
el17cd 26:8a85aede976d 256 refresh();
el17cd 26:8a85aede976d 257 wait(1);
el17cd 26:8a85aede976d 258 lcd.printString("Good Luck!",15,4);
el17cd 26:8a85aede976d 259 refresh();
el17cd 26:8a85aede976d 260 wait(3);
el17cd 26:8a85aede976d 261 clear();
el17cd 1:044238f7bdda 262 }