ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

Committer:
el17cd
Date:
Fri Apr 05 13:54:34 2019 +0000
Revision:
30:91038c2afec7
Parent:
29:4a02f0bae202
Added highscore saving to sd card

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17cd 1:044238f7bdda 1 #include "Rasturizer.h"
el17cd 27:e46af658c67a 2 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
el17cd 2:a5bc7b3779f7 3
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 29:4a02f0bae202 137 void Rasturizer::printScore(int score, int x, int y){
el17cd 25:3995271e411c 138 char buffer[5];
el17cd 25:3995271e411c 139 sprintf(buffer, "%d", score/3);
el17cd 29:4a02f0bae202 140 print(buffer, x, y);
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 29:4a02f0bae202 157 void Rasturizer::drawDeathScreen(bool selection, int highScore){
el17cd 20:3ca430241df0 158 Face faces[6];
el17cd 30:91038c2afec7 159 int x, y, z;
el17cd 16:64cd7bc094f9 160 if(selection == true){
el17cd 16:64cd7bc094f9 161 x = -30;
el17cd 16:64cd7bc094f9 162 y = -3;
el17cd 16:64cd7bc094f9 163 z = 50;
el17cd 16:64cd7bc094f9 164 }
el17cd 16:64cd7bc094f9 165 else{
el17cd 16:64cd7bc094f9 166 x = -30;
el17cd 16:64cd7bc094f9 167 y = 15;
el17cd 16:64cd7bc094f9 168 z = 50;
el17cd 16:64cd7bc094f9 169 }
el17cd 16:64cd7bc094f9 170
el17cd 30:91038c2afec7 171 print("Best:", 30, 0);
el17cd 30:91038c2afec7 172 printScore(highScore, 60, 0);
el17cd 26:8a85aede976d 173 drawDeathButtons();
el17cd 26:8a85aede976d 174 drawSelectionCube(x, y, z, 2);
el17cd 26:8a85aede976d 175 }
el17cd 26:8a85aede976d 176
el17cd 26:8a85aede976d 177 void Rasturizer::drawDeathButtons(){
el17cd 16:64cd7bc094f9 178 lcd.drawRect(24, 14, 45, 11, FILL_WHITE);
el17cd 16:64cd7bc094f9 179 lcd.drawRect(24, 14, 45, 11, FILL_TRANSPARENT);
el17cd 16:64cd7bc094f9 180 lcd.printString("Restart",26,2);
el17cd 16:64cd7bc094f9 181 lcd.drawRect(24, 30, 45, 11, FILL_WHITE);
el17cd 16:64cd7bc094f9 182 lcd.drawRect(24, 30, 45, 11, FILL_TRANSPARENT);
el17cd 16:64cd7bc094f9 183 lcd.printString("Menu",35,4);
el17cd 18:8256546a3cbf 184 }
el17cd 18:8256546a3cbf 185
el17cd 18:8256546a3cbf 186 void Rasturizer::drawHomeScreen(int selection){
el17cd 26:8a85aede976d 187 int x, y, z;
el17cd 18:8256546a3cbf 188 if(selection == 0){
el17cd 18:8256546a3cbf 189 x = -30;
el17cd 18:8256546a3cbf 190 y = -12;
el17cd 18:8256546a3cbf 191 z = 50;
el17cd 18:8256546a3cbf 192 }
el17cd 18:8256546a3cbf 193 else if(selection == 1){
el17cd 18:8256546a3cbf 194 x = -30;
el17cd 18:8256546a3cbf 195 y = 5;
el17cd 18:8256546a3cbf 196 z = 50;
el17cd 18:8256546a3cbf 197 }
el17cd 18:8256546a3cbf 198 else{
el17cd 18:8256546a3cbf 199 x = -30;
el17cd 18:8256546a3cbf 200 y = 22;
el17cd 18:8256546a3cbf 201 z = 50;
el17cd 18:8256546a3cbf 202 }
el17cd 26:8a85aede976d 203 drawHomeButtons();
el17cd 26:8a85aede976d 204 drawSelectionCube(x, y, z, -1);
el17cd 26:8a85aede976d 205 }
el17cd 26:8a85aede976d 206
el17cd 26:8a85aede976d 207 void Rasturizer::drawHomeButtons(){
el17cd 18:8256546a3cbf 208 lcd.drawRect(24, 6, 45, 10, FILL_WHITE);
el17cd 18:8256546a3cbf 209 lcd.printString("Play",35,1);
el17cd 18:8256546a3cbf 210 lcd.drawRect(24, 6, 45, 10, FILL_TRANSPARENT);
el17cd 18:8256546a3cbf 211
el17cd 18:8256546a3cbf 212 lcd.drawRect(24, 22, 45, 10, FILL_WHITE);
el17cd 18:8256546a3cbf 213 lcd.printString("Help",35,3);
el17cd 18:8256546a3cbf 214 lcd.drawRect(24, 22, 45, 10, FILL_TRANSPARENT);
el17cd 18:8256546a3cbf 215
el17cd 18:8256546a3cbf 216 lcd.drawRect(24, 38, 45, 10, FILL_WHITE);
el17cd 18:8256546a3cbf 217 lcd.printString("Quit",35,5);
el17cd 18:8256546a3cbf 218 lcd.drawRect(24, 38, 45, 10, FILL_TRANSPARENT);
el17cd 26:8a85aede976d 219 }
el17cd 26:8a85aede976d 220
el17cd 26:8a85aede976d 221 void Rasturizer::drawSelectionCube(int x, int y, int z, int rotationSpeed){
el17cd 26:8a85aede976d 222 Face faces[6];
el17cd 18:8256546a3cbf 223 selectionCube.translate(x, y, z);
el17cd 18:8256546a3cbf 224
el17cd 18:8256546a3cbf 225 for(int i = 0; i < 6; i++){
el17cd 20:3ca430241df0 226 faces[i] = selectionCube.getFace(i);
el17cd 18:8256546a3cbf 227 }
el17cd 20:3ca430241df0 228 drawAllFaces(faces, 1, 0);
el17cd 26:8a85aede976d 229 selectionCube.rotateX(-0.05*rotationSpeed);
el17cd 26:8a85aede976d 230 selectionCube.rotateY(-0.025*rotationSpeed);
el17cd 26:8a85aede976d 231 selectionCube.rotateZ(0.04*rotationSpeed);
el17cd 18:8256546a3cbf 232 selectionCube.translate(-x, -y, -z);
el17cd 26:8a85aede976d 233 }
el17cd 26:8a85aede976d 234
el17cd 27:e46af658c67a 235 void Rasturizer::drawHelpScreen1(){
el17cd 27:e46af658c67a 236 lcd.printString("Use the",20,1);
el17cd 27:e46af658c67a 237 lcd.printString("joystick",17,2);
el17cd 27:e46af658c67a 238 lcd.printString("to move",20,3);
el17cd 26:8a85aede976d 239 lcd.printString("left and right",0,4);
el17cd 27:e46af658c67a 240 }
el17cd 27:e46af658c67a 241
el17cd 27:e46af658c67a 242 void Rasturizer::drawHelpScreen2(){
el17cd 27:e46af658c67a 243 lcd.printString("Dodge the",15,1);
el17cd 27:e46af658c67a 244 lcd.printString("cubes as they",3,2);
el17cd 27:e46af658c67a 245 lcd.printString("move closer",10,3);
el17cd 27:e46af658c67a 246 lcd.printString("to you",25,4);
el17cd 27:e46af658c67a 247 }
el17cd 27:e46af658c67a 248
el17cd 27:e46af658c67a 249 void Rasturizer::drawHelpScreen3(){
el17cd 27:e46af658c67a 250 lcd.printString("Good Luck!",15,2);
el17cd 1:044238f7bdda 251 }