ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

Committer:
el17cd
Date:
Mon Apr 01 14:43:18 2019 +0000
Revision:
19:ec4cb22accb0
Parent:
18:8256546a3cbf
Child:
20:3ca430241df0
Faces are no longer drawn when off screen

Who changed what in which revision?

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