
Added the Z Access to the Matrix class Added the Identity Matrix Method to the Matrix Class Added MD2Loader Class Added Model Class Added Polygon Class Added Clear Viewport Method to Rasterizer Added Z Axis to the Vertex Class Updated Transformation Matrices to pass a matrix back so that we can do the multiplication at once
115 lines
3.6 KiB
C++
115 lines
3.6 KiB
C++
#include "Rasteriser.h"
|
|
#include <cmath>
|
|
|
|
using namespace std;
|
|
|
|
Rasteriser app;
|
|
|
|
bool Rasteriser::Initialise()
|
|
{
|
|
//_initialVertexArray.push_back(Vertex(175, 175, 0, 1));
|
|
//_initialVertexArray.push_back(Vertex(225, 175, 0, 1));
|
|
//_initialVertexArray.push_back(Vertex(225, 225, 0, 1));
|
|
//_initialVertexArray.push_back(Vertex(175, 225, 0, 1));
|
|
|
|
_initialVertexArray.push_back(Vertex(150, 200, 1));
|
|
_initialVertexArray.push_back(Vertex(187.5f, 187.5f, 1));
|
|
_initialVertexArray.push_back(Vertex(200, 150, 1));
|
|
_initialVertexArray.push_back(Vertex(212.5f, 187.5f, 1));
|
|
_initialVertexArray.push_back(Vertex(250, 200, 1));
|
|
_initialVertexArray.push_back(Vertex(212.5f, 212.5f, 1));
|
|
_initialVertexArray.push_back(Vertex(200, 250, 1));
|
|
_initialVertexArray.push_back(Vertex(187.5, 212.5f, 1));
|
|
|
|
_currentVertexArray = _initialVertexArray;
|
|
|
|
return true;
|
|
}
|
|
|
|
void Rasteriser::Update(const Bitmap& bitmap)
|
|
{
|
|
int currentRot = (_rotation % 360);
|
|
for (int i = 0; i < _initialVertexArray.size(); i++) {
|
|
Matrix currentTransfomation = GetRotationMatrixFromPoint(Axis::Z, (float) currentRot, _initialVertexArray[0].GetX(), _initialVertexArray[0].GetY(), 0);
|
|
_currentVertexArray[i] = currentTransfomation * _initialVertexArray[i];
|
|
}
|
|
_rotation += 1;
|
|
}
|
|
|
|
void Rasteriser::Render(const Bitmap& bitmap)
|
|
{
|
|
ClearViewport(bitmap);
|
|
SelectObject(bitmap.GetDC(), GetStockObject(DC_BRUSH));
|
|
//DrawSquare(bitmap.GetDC(), _initialVertexArray);
|
|
DrawShape(bitmap.GetDC(), _currentVertexArray);
|
|
}
|
|
|
|
void Rasteriser::ClearViewport(const Bitmap& bitmap)
|
|
{
|
|
bitmap.Clear(RGB(255, 255, 255));
|
|
}
|
|
|
|
Matrix Rasteriser::GetTranslateMatrix(const float x, const float y, const float z)
|
|
{
|
|
return Matrix({ 1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1 });
|
|
}
|
|
|
|
Matrix Rasteriser::GetScaleMatrix(const float x, const float y, const float z)
|
|
{
|
|
return Matrix({ x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1 });
|
|
}
|
|
|
|
Matrix Rasteriser::GetRotationMatrix(const Axis rotAxis, const float rotDegrees)
|
|
{
|
|
float rotationRadian = DegreesToRadians(rotDegrees);
|
|
switch (rotAxis)
|
|
{
|
|
case (Axis::X):
|
|
return Matrix({ 1, 0, 0, 0, 0, cos(rotationRadian), -sin(rotationRadian), 0, 0, sin(rotationRadian), cos(rotationRadian), 0, 0, 0, 0, 1 });
|
|
case (Axis::Y):
|
|
return Matrix({ cos(rotationRadian), 0, sin(rotationRadian), 0, 0, 1, 0, 0, -sin(rotationRadian), 0, cos(rotationRadian), 0, 0, 0, 0, 1 });
|
|
default:
|
|
case (Axis::Z):
|
|
return Matrix({ cos(rotationRadian), -sin(rotationRadian), 0, 0, sin(rotationRadian), cos(rotationRadian), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 });
|
|
}
|
|
}
|
|
|
|
Matrix Rasteriser::GetRotationMatrixFromPoint(const Axis rotAxis, const float rotDegrees, const float x, const float y, const float z)
|
|
{
|
|
return GetTranslateMatrix(x, y, z) * GetRotationMatrix(rotAxis, rotDegrees) * GetTranslateMatrix(-x, -y, -z);
|
|
}
|
|
|
|
float Rasteriser::DegreesToRadians(const float degrees)
|
|
{
|
|
return (degrees * _PI) / 180;
|
|
}
|
|
|
|
void Rasteriser::DrawSquare(HDC hDc, const vector<Vertex> verticies)
|
|
{
|
|
POINT pointArray[4];
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
pointArray[i].x = (long) verticies[i].GetX();
|
|
pointArray[i].y = (long) verticies[i].GetY();
|
|
}
|
|
|
|
SetDCBrushColor(hDc, RGB(255, 0, 255));
|
|
SetDCPenColor(hDc, RGB(0, 0, 255));
|
|
Polygon(hDc, pointArray, 4);
|
|
}
|
|
|
|
void Rasteriser::DrawShape(HDC hDc, const vector<Vertex> verticies)
|
|
{
|
|
vector<POINT> pointArray;
|
|
for (int i = 0; i < verticies.size(); i++)
|
|
{
|
|
POINT newPoint;
|
|
newPoint.x = (long)verticies[i].GetX();
|
|
newPoint.y = (long)verticies[i].GetY();
|
|
pointArray.push_back(newPoint);
|
|
}
|
|
|
|
SetDCBrushColor(hDc, RGB(rand() % 256, rand() % 256, rand() % 256));
|
|
SetDCPenColor(hDc, RGB(rand() % 256, rand() % 256, rand() % 256));
|
|
Polygon(hDc, pointArray.data(), (int) verticies.size());
|
|
} |