ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

Committer:
el17cd
Date:
Tue Apr 02 17:40:59 2019 +0000
Revision:
21:6b5d2d75e083
Parent:
20:3ca430241df0
Child:
22:236319885874
Fixed crashing caused by timer/ticker, faces only render when on screen (big performance boost), 18 cubes now in game

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