ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

Committer:
el17cd
Date:
Wed Apr 03 15:11:12 2019 +0000
Revision:
22:236319885874
Parent:
21:6b5d2d75e083
Child:
25:3995271e411c
Game now runs at a target fps of 60

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17cd 1:044238f7bdda 1 #include "Rasturizer.h"
el17cd 2:a5bc7b3779f7 2
el17cd 21:6b5d2d75e083 3 Serial pc(USBTX, USBRX); // tx, rx
el17cd 16:64cd7bc094f9 4
el17cd 4:759a5c34e239 5 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
el17cd 3:2e31dfcb712a 6
el17cd 4:759a5c34e239 7 Rasturizer::Rasturizer(){
el17cd 20:3ca430241df0 8 for(int i = 0; i < 6; i++){
el17cd 20:3ca430241df0 9 selectionCube.getFace(i).setVisible(true);
el17cd 20:3ca430241df0 10 }
el17cd 20:3ca430241df0 11 }
el17cd 15:8fbbdefbe720 12
el17cd 15:8fbbdefbe720 13 void Rasturizer::init(){
el17cd 15:8fbbdefbe720 14 lcd.init();
el17cd 15:8fbbdefbe720 15 fov = 50;
el17cd 15:8fbbdefbe720 16 }
el17cd 15:8fbbdefbe720 17
el17cd 17:3c9672c6e532 18 float Rasturizer::xTo2D(float x, float z){
el17cd 14:885915260e25 19 return x * (fov/z) + 42;
el17cd 14:885915260e25 20 }
el17cd 14:885915260e25 21
el17cd 17:3c9672c6e532 22 float Rasturizer::yTo2D(float y, float z){
el17cd 14:885915260e25 23 return y * (fov/z) + 21;
el17cd 4:759a5c34e239 24 }
el17cd 1:044238f7bdda 25
el17cd 17:3c9672c6e532 26 void Rasturizer::drawHorizon(float angle){
el17cd 11:2cd6341136ca 27 lcd.drawLine(0,
el17cd 21:6b5d2d75e083 28 21-rint(angle*40),
el17cd 11:2cd6341136ca 29 84,
el17cd 21:6b5d2d75e083 30 21+rint(angle*40),
el17cd 20:3ca430241df0 31 1);
el17cd 11:2cd6341136ca 32 }
el17cd 11:2cd6341136ca 33
el17cd 21:6b5d2d75e083 34 void Rasturizer::drawFace(Face *face, float angle){
el17cd 17:3c9672c6e532 35 float points[4][3];
el17cd 22:236319885874 36 float y, x;
el17cd 22:236319885874 37 int diffX1, diffY1, diffX2, diffY2;
el17cd 22:236319885874 38 float step, stepSmall1, stepSmall2;
el17cd 21:6b5d2d75e083 39
el17cd 4:759a5c34e239 40 for(int vertex = 0; vertex < 4; vertex++){
el17cd 4:759a5c34e239 41 for(int axis = 0; axis < 3; axis++){
el17cd 21:6b5d2d75e083 42 points[vertex][axis] = face->getVertexValue(vertex, axis);
el17cd 4:759a5c34e239 43 }
el17cd 21:6b5d2d75e083 44 y = points[vertex][1];
el17cd 21:6b5d2d75e083 45 x = points[vertex][0];
el17cd 11:2cd6341136ca 46
el17cd 11:2cd6341136ca 47 points[vertex][0] = x*cos(angle)-y*sin(angle);
el17cd 11:2cd6341136ca 48 points[vertex][1] = y*cos(angle)+x*sin(angle);
el17cd 4:759a5c34e239 49 }
el17cd 21:6b5d2d75e083 50
el17cd 21:6b5d2d75e083 51 if (checkOnScreen(points)){
el17cd 21:6b5d2d75e083 52 diffX1 = xTo2D(points[0][0], points[0][2])-xTo2D(points[1][0], points[1][2]);
el17cd 21:6b5d2d75e083 53 diffY1 = yTo2D(points[0][1], points[0][2])-yTo2D(points[1][1], points[1][2]);
el17cd 21:6b5d2d75e083 54 diffX2 = xTo2D(points[2][0], points[2][2])-xTo2D(points[3][0], points[3][2]);
el17cd 21:6b5d2d75e083 55 diffY2 = yTo2D(points[2][1], points[2][2])-yTo2D(points[3][1], points[3][2]);
el17cd 21:6b5d2d75e083 56 if(diffX2 != 0 && face->getVisible()){
el17cd 21:6b5d2d75e083 57 step = (float)diffY2/(float)diffX2;
el17cd 21:6b5d2d75e083 58 stepSmall1 = (float)diffX1/(float)diffX2;
el17cd 21:6b5d2d75e083 59 stepSmall2 = (float)diffY1/(float)diffX2;
el17cd 21:6b5d2d75e083 60
el17cd 21:6b5d2d75e083 61 for(int s = 0; s< abs(diffX2); s++){
el17cd 21:6b5d2d75e083 62 if(diffX2 > 0){
el17cd 21:6b5d2d75e083 63 lcd.drawLine(rint(xTo2D(points[0][0], points[0][2])-stepSmall1*s),//rint((points[0][0])*(40/points[0][2])-stepSmall1*s)+42,
el17cd 21:6b5d2d75e083 64 rint(yTo2D(points[0][1], points[0][2])-stepSmall2*s),
el17cd 21:6b5d2d75e083 65 rint(xTo2D(points[3][0], points[3][2])+s),
el17cd 21:6b5d2d75e083 66 rint(yTo2D(points[3][1], points[3][2])+step*s),
el17cd 21:6b5d2d75e083 67 0);
el17cd 21:6b5d2d75e083 68 }
el17cd 21:6b5d2d75e083 69 else{
el17cd 21:6b5d2d75e083 70 lcd.drawLine(rint(xTo2D(points[0][0], points[0][2])+stepSmall1*s),//rint((points[0][0])*(40/points[0][2])-stepSmall1*s)+42,
el17cd 21:6b5d2d75e083 71 rint(yTo2D(points[0][1], points[0][2])+stepSmall2*s),
el17cd 21:6b5d2d75e083 72 rint(xTo2D(points[3][0], points[3][2])-s),
el17cd 21:6b5d2d75e083 73 rint(yTo2D(points[3][1], points[3][2])-step*s),
el17cd 21:6b5d2d75e083 74 0);
el17cd 21:6b5d2d75e083 75 }
el17cd 14:885915260e25 76 }
el17cd 7:15543cb10a14 77 }
el17cd 14:885915260e25 78 for (int i = 0; i < 3; i++){
el17cd 14:885915260e25 79 lcd.drawLine(rint(xTo2D(points[i][0], points[i][2])),
el17cd 14:885915260e25 80 rint(yTo2D(points[i][1], points[i][2])),
el17cd 14:885915260e25 81 rint(xTo2D(points[i+1][0], points[i+1][2])),
el17cd 14:885915260e25 82 rint(yTo2D(points[i+1][1], points[i+1][2])),
el17cd 14:885915260e25 83 1);
el17cd 1:044238f7bdda 84 }
el17cd 14:885915260e25 85 lcd.drawLine(rint(xTo2D(points[0][0], points[0][2])),
el17cd 14:885915260e25 86 rint(yTo2D(points[0][1], points[0][2])),
el17cd 14:885915260e25 87 rint(xTo2D(points[3][0], points[3][2])),
el17cd 14:885915260e25 88 rint(yTo2D(points[3][1], points[3][2])),
el17cd 14:885915260e25 89 1);
el17cd 21:6b5d2d75e083 90
el17cd 1:044238f7bdda 91 }
el17cd 4:759a5c34e239 92 }
el17cd 21:6b5d2d75e083 93 void Rasturizer::drawAllFaces(Face *faceArray, int noOfCubes, float angle){
el17cd 21:6b5d2d75e083 94 Face temp;
el17cd 20:3ca430241df0 95 for (int f = 0; f< (noOfCubes*6)-1; f++){
el17cd 20:3ca430241df0 96 for (int f2 = 0; f2< (noOfCubes*6)-f-1; f2++){
el17cd 20:3ca430241df0 97 if(faceArray[f2].getAvgZ() < faceArray[f2+1].getAvgZ()){
el17cd 21:6b5d2d75e083 98 temp = faceArray[f2+1];
el17cd 20:3ca430241df0 99 faceArray[f2+1] = faceArray[f2];
el17cd 20:3ca430241df0 100 faceArray[f2] = temp;
el17cd 20:3ca430241df0 101 }
el17cd 20:3ca430241df0 102 }
el17cd 20:3ca430241df0 103 }
el17cd 20:3ca430241df0 104 for (int f = 0; f< noOfCubes*6 ; f++){
el17cd 21:6b5d2d75e083 105 drawFace(&faceArray[f], angle/15);
el17cd 20:3ca430241df0 106 }
el17cd 20:3ca430241df0 107 }
el17cd 9:5915fc800824 108
el17cd 19:ec4cb22accb0 109 bool Rasturizer::checkOnScreen(float (&points)[4][3]){
el17cd 21:6b5d2d75e083 110 if (points[0][2] < 6 || points[1][2] < 6 || points[2][2] < 6 || points[3][2] < 6){
el17cd 19:ec4cb22accb0 111 return false;
el17cd 19:ec4cb22accb0 112 }
el17cd 19:ec4cb22accb0 113 else if ((xTo2D(points[0][0], points[0][2]) < 0 || xTo2D(points[0][0], points[0][2]) > 84)
el17cd 19:ec4cb22accb0 114 && (xTo2D(points[1][0], points[1][2]) < 0 || xTo2D(points[1][0], points[1][2]) > 84)
el17cd 19:ec4cb22accb0 115 && (xTo2D(points[2][0], points[2][2]) < 0 || xTo2D(points[2][0], points[2][2]) > 84)
el17cd 19:ec4cb22accb0 116 && (xTo2D(points[3][0], points[3][2]) < 0 || xTo2D(points[3][0], points[3][2]) > 84)){
el17cd 19:ec4cb22accb0 117 return false;
el17cd 19:ec4cb22accb0 118 }
el17cd 19:ec4cb22accb0 119 return true;
el17cd 19:ec4cb22accb0 120 }
el17cd 19:ec4cb22accb0 121
el17cd 16:64cd7bc094f9 122 void Rasturizer::print(const char *text, int x, int y){
el17cd 16:64cd7bc094f9 123 lcd.printString(text, x, y);
el17cd 11:2cd6341136ca 124 }
el17cd 11:2cd6341136ca 125
el17cd 4:759a5c34e239 126 void Rasturizer::clear(){
el17cd 4:759a5c34e239 127 lcd.clear();
el17cd 4:759a5c34e239 128 }
el17cd 4:759a5c34e239 129
el17cd 4:759a5c34e239 130 void Rasturizer::refresh(){
el17cd 4:759a5c34e239 131 lcd.refresh();
el17cd 14:885915260e25 132 }
el17cd 14:885915260e25 133
el17cd 16:64cd7bc094f9 134 void Rasturizer::drawDeathScreen(bool selection){
el17cd 20:3ca430241df0 135 Face faces[6];
el17cd 16:64cd7bc094f9 136 int x;
el17cd 16:64cd7bc094f9 137 int y;
el17cd 16:64cd7bc094f9 138 int z;
el17cd 16:64cd7bc094f9 139
el17cd 16:64cd7bc094f9 140 if(selection == true){
el17cd 16:64cd7bc094f9 141 x = -30;
el17cd 16:64cd7bc094f9 142 y = -3;
el17cd 16:64cd7bc094f9 143 z = 50;
el17cd 16:64cd7bc094f9 144 }
el17cd 16:64cd7bc094f9 145 else{
el17cd 16:64cd7bc094f9 146 x = -30;
el17cd 16:64cd7bc094f9 147 y = 15;
el17cd 16:64cd7bc094f9 148 z = 50;
el17cd 16:64cd7bc094f9 149 }
el17cd 16:64cd7bc094f9 150
el17cd 16:64cd7bc094f9 151 lcd.drawRect(24, 14, 45, 11, FILL_WHITE);
el17cd 16:64cd7bc094f9 152 lcd.drawRect(24, 14, 45, 11, FILL_TRANSPARENT);
el17cd 16:64cd7bc094f9 153 lcd.printString("Restart",26,2);
el17cd 16:64cd7bc094f9 154 lcd.drawRect(24, 30, 45, 11, FILL_WHITE);
el17cd 16:64cd7bc094f9 155 lcd.drawRect(24, 30, 45, 11, FILL_TRANSPARENT);
el17cd 16:64cd7bc094f9 156 lcd.printString("Menu",35,4);
el17cd 16:64cd7bc094f9 157 selectionCube.translate(x, y, z);
el17cd 16:64cd7bc094f9 158 for(int i = 0; i < 6; i++){
el17cd 20:3ca430241df0 159 faces[i] = selectionCube.getFace(i);
el17cd 16:64cd7bc094f9 160 }
el17cd 20:3ca430241df0 161 drawAllFaces(faces, 1, 0);
el17cd 16:64cd7bc094f9 162 selectionCube.rotateX(0.1);
el17cd 16:64cd7bc094f9 163 selectionCube.rotateY(0.05);
el17cd 16:64cd7bc094f9 164 selectionCube.rotateZ(-0.08);
el17cd 16:64cd7bc094f9 165 selectionCube.translate(-x, -y, -z);
el17cd 18:8256546a3cbf 166 }
el17cd 18:8256546a3cbf 167
el17cd 18:8256546a3cbf 168 void Rasturizer::drawHomeScreen(int selection){
el17cd 20:3ca430241df0 169 Face faces[6];
el17cd 18:8256546a3cbf 170 int x;
el17cd 18:8256546a3cbf 171 int y;
el17cd 18:8256546a3cbf 172 int z;
el17cd 18:8256546a3cbf 173
el17cd 18:8256546a3cbf 174 if(selection == 0){
el17cd 18:8256546a3cbf 175 x = -30;
el17cd 18:8256546a3cbf 176 y = -12;
el17cd 18:8256546a3cbf 177 z = 50;
el17cd 18:8256546a3cbf 178 }
el17cd 18:8256546a3cbf 179 else if(selection == 1){
el17cd 18:8256546a3cbf 180 x = -30;
el17cd 18:8256546a3cbf 181 y = 5;
el17cd 18:8256546a3cbf 182 z = 50;
el17cd 18:8256546a3cbf 183 }
el17cd 18:8256546a3cbf 184 else{
el17cd 18:8256546a3cbf 185 x = -30;
el17cd 18:8256546a3cbf 186 y = 22;
el17cd 18:8256546a3cbf 187 z = 50;
el17cd 18:8256546a3cbf 188 }
el17cd 18:8256546a3cbf 189
el17cd 18:8256546a3cbf 190 lcd.drawRect(24, 6, 45, 10, FILL_WHITE);
el17cd 18:8256546a3cbf 191 lcd.printString("Play",35,1);
el17cd 18:8256546a3cbf 192 lcd.drawRect(24, 6, 45, 10, FILL_TRANSPARENT);
el17cd 18:8256546a3cbf 193
el17cd 18:8256546a3cbf 194 lcd.drawRect(24, 22, 45, 10, FILL_WHITE);
el17cd 18:8256546a3cbf 195 lcd.printString("Help",35,3);
el17cd 18:8256546a3cbf 196 lcd.drawRect(24, 22, 45, 10, FILL_TRANSPARENT);
el17cd 18:8256546a3cbf 197
el17cd 18:8256546a3cbf 198 lcd.drawRect(24, 38, 45, 10, FILL_WHITE);
el17cd 18:8256546a3cbf 199 lcd.printString("Quit",35,5);
el17cd 18:8256546a3cbf 200 lcd.drawRect(24, 38, 45, 10, FILL_TRANSPARENT);
el17cd 18:8256546a3cbf 201 selectionCube.translate(x, y, z);
el17cd 18:8256546a3cbf 202
el17cd 18:8256546a3cbf 203 for(int i = 0; i < 6; i++){
el17cd 20:3ca430241df0 204 faces[i] = selectionCube.getFace(i);
el17cd 18:8256546a3cbf 205 }
el17cd 20:3ca430241df0 206 drawAllFaces(faces, 1, 0);
el17cd 22:236319885874 207 selectionCube.rotateX(-0.05);
el17cd 22:236319885874 208 selectionCube.rotateY(-0.025);
el17cd 22:236319885874 209 selectionCube.rotateZ(0.04);
el17cd 18:8256546a3cbf 210 selectionCube.translate(-x, -y, -z);
el17cd 1:044238f7bdda 211 }