ELEC2645 (2018/19) / Mbed 2 deprecated el17cd

Dependencies:   mbed

Rasturizer/Rasturizer.cpp

Committer:
el17cd
Date:
2019-03-31
Revision:
16:64cd7bc094f9
Parent:
15:8fbbdefbe720
Child:
17:3c9672c6e532

File content as of revision 16:64cd7bc094f9:

#include "Rasturizer.h"


N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);

Rasturizer::Rasturizer(){

    /*double tempPoints[4][3] = {{43, 2.5, 30}, {43, 2.5, 200}, {43, -2.5, 200}, {43, -2.5, 30}};
    for(int vertex = 0; vertex < 8; vertex++){
        for(int axis = 0; axis < 3; axis++){
            edgePoints[vertex][axis] = tempPoints[vertex][axis];
        }
    }
    edge.setVerticies(edgePoints);
    edge.setVisible(true);*/
}

void Rasturizer::init(){
    lcd.init();
    fov = 50;
}

double Rasturizer::xTo2D(double x, double z){
    return x * (fov/z) + 42;
}

double Rasturizer::yTo2D(double y, double z){
    return y * (fov/z) + 21;
}

void Rasturizer::drawHorizon(double angle){
    lcd.drawLine(0,
             21-rint(angle*50),
             84,
             21+rint(angle*50),
             1);/*
    for( int i = 0; i<4; i++){
        edgePoints[i][0] -= angle*50;
    }
    edge.setVerticies(edgePoints);
    drawFace(edge, angle);*/
}

void Rasturizer::drawFace(Face face, double angle){
    double points[4][3];
    for(int vertex = 0; vertex < 4; vertex++){
        for(int axis = 0; axis < 3; axis++){
            points[vertex][axis] = face.getVertexValue(vertex, axis);
        }
        double y = points[vertex][1];
        double x = points[vertex][0];
        
        points[vertex][0] = x*cos(angle)-y*sin(angle);
        points[vertex][1] = y*cos(angle)+x*sin(angle);
    }
    
    if ((points[0][2] > 12 || points[1][2] > 12 || points[2][2] > 12|| points[3][2] > 12) && face.getVisible()){
        int diffX1 = xTo2D(points[0][0], points[0][2])-xTo2D(points[1][0], points[1][2]);
        int diffY1 = yTo2D(points[0][1], points[0][2])-yTo2D(points[1][1], points[1][2]);
        int diffX2 = xTo2D(points[2][0], points[2][2])-xTo2D(points[3][0], points[3][2]);
        int diffY2 = yTo2D(points[2][1], points[2][2])-yTo2D(points[3][1], points[3][2]);
        
        double step = (double)diffY2/(double)diffX2;
        double stepSmall1 = (double)diffX1/(double)diffX2;
        double stepSmall2 = (double)diffY1/(double)diffX2;
        
        for(int s = 0; s< abs(diffX2); s++){
            if(diffX2 > 0){
                lcd.drawLine(rint(xTo2D(points[0][0], points[0][2])-stepSmall1*s),//rint((points[0][0])*(40/points[0][2])-stepSmall1*s)+42,
                    rint(yTo2D(points[0][1], points[0][2])-stepSmall2*s),
                    rint(xTo2D(points[3][0], points[3][2])+s), 
                    rint(yTo2D(points[3][1], points[3][2])+step*s),
                    0);
            }
            else{
                lcd.drawLine(rint(xTo2D(points[0][0], points[0][2])+stepSmall1*s),//rint((points[0][0])*(40/points[0][2])-stepSmall1*s)+42,
                    rint(yTo2D(points[0][1], points[0][2])+stepSmall2*s),
                    rint(xTo2D(points[3][0], points[3][2])-s), 
                    rint(yTo2D(points[3][1], points[3][2])-step*s),
                    0);
            }
        }
    }
    if((points[0][2] > 10 || points[1][2] > 10 || points[2][2] > 10|| points[3][2] > 10)){
        for (int i = 0; i < 3; i++){     
            lcd.drawLine(rint(xTo2D(points[i][0], points[i][2])),
                rint(yTo2D(points[i][1], points[i][2])),
                rint(xTo2D(points[i+1][0], points[i+1][2])),
                rint(yTo2D(points[i+1][1], points[i+1][2])),
                1);
        }
        lcd.drawLine(rint(xTo2D(points[0][0], points[0][2])),
            rint(yTo2D(points[0][1], points[0][2])),
            rint(xTo2D(points[3][0], points[3][2])),
            rint(yTo2D(points[3][1], points[3][2])),
            1);
    }
}

void Rasturizer::print(const char *text, int x, int y){
    lcd.printString(text, x, y);
}

void Rasturizer::clear(){
    lcd.clear();
}

void Rasturizer::refresh(){
    lcd.refresh();
}

void Rasturizer::drawDeathScreen(bool selection){
    int x;
    int y;
    int z;
    
    if(selection == true){
        x = -30;
        y = -3;
        z = 50;
    }
    else{
        x = -30;
        y = 15;
        z = 50;
    }
    
    lcd.drawRect(24, 14, 45, 11, FILL_WHITE);
    lcd.drawRect(24, 14, 45, 11, FILL_TRANSPARENT);
    lcd.printString("Restart",26,2);
    lcd.drawRect(24, 30, 45, 11, FILL_WHITE);
    lcd.drawRect(24, 30, 45, 11, FILL_TRANSPARENT);
    lcd.printString("Menu",35,4);
    selectionCube.translate(x, y, z);
    for(int i = 0; i < 6; i++){
        drawFace(selectionCube.getFace(i), 0);
    }
    selectionCube.rotateX(0.1);
    selectionCube.rotateY(0.05);
    selectionCube.rotateZ(-0.08);
    selectionCube.translate(-x, -y, -z);
}