Files
Graphics-Rasterizer/Vertex.cpp
2025-07-04 17:32:39 +01:00

368 lines
5.3 KiB
C++

#include "Vertex.h"
Vertex::Vertex()
{
_x = 0.0f;
_y = 0.0f;
_z = 0.0f;
_w = 0.0f;
_contributeCount = 0;
_normal = Vector3D(0, 0, 0);
_r = 0;
_g = 0;
_b = 0;
_uvIndex = -1;
_zOriginal = 0;
_uOverZ = 0;
_vOverZ = 0;
_zRecip = 0;
}
Vertex::Vertex(const float x, const float y, const float z)
{
_x = x;
_y = y;
_z = z;
_w = 1.0f;
_contributeCount = 0;
_normal = Vector3D(0, 0, 0);
_r = 0;
_g = 0;
_b = 0;
_uvIndex = -1;
_zOriginal = 0;
_uOverZ = 0;
_vOverZ = 0;
_zRecip = 0;
}
Vertex::Vertex(const float x, const float y, const float z, const float w)
{
_x = x;
_y = y;
_z = z;
_w = w;
_contributeCount = 0;
_normal = Vector3D(0, 0, 0);
_r = 0;
_g = 0;
_b = 0;
_uvIndex = -1;
_zOriginal = 0;
_uOverZ = 0;
_vOverZ = 0;
_zRecip = 0;
}
Vertex::Vertex(const Vertex & other)
{
Copy(other);
}
float Vertex::GetX() const
{
return _x;
}
void Vertex::SetX(const float x)
{
_x = x;
}
float Vertex::GetY() const
{
return _y;
}
void Vertex::SetY(const float y)
{
_y = y;
}
float Vertex::GetZ() const
{
return _z;
}
void Vertex::SetZ(const float z)
{
_z = z;
}
float Vertex::GetW() const
{
return _w;
}
void Vertex::SetW(const float w)
{
_w = w;
}
const int Vertex::GetContributeCount() const
{
return _contributeCount;
}
void Vertex::IncrementContributeCount()
{
_contributeCount++;
}
void Vertex::ResetContributeCount()
{
_contributeCount = 0;
}
const Vector3D& Vertex::GetNormal() const
{
return _normal;
}
void Vertex::SetNormal(float x, float y, float z)
{
_normal.SetX(x);
_normal.SetY(y);
_normal.SetZ(z);
}
void Vertex::SetNormal(const Vector3D& normal)
{
SetNormal(normal.GetX(), normal.GetY(), normal.GetZ());
}
void Vertex::NormalizeNormal()
{
_normal.Normalize();
}
void Vertex::ResetNormal(bool resetCount)
{
SetNormal(0, 0, 0);
if (resetCount)
{
ResetContributeCount();
}
}
const COLORREF Vertex::GetColor() const
{
return RGB(_r, _g, _b);
}
int Vertex::GetR() const
{
return _r;
}
void Vertex::SetR(const int r)
{
_r = r;
}
int Vertex::GetG() const
{
return _g;
}
void Vertex::SetG(const int g)
{
_g = g;
}
int Vertex::GetB() const
{
return _b;
}
void Vertex::SetB(const int b)
{
_b = b;
}
void Vertex::SetColor(int r, int g, int b)
{
_r = r;
_g = g;
_b = b;
}
void Vertex::SetColor(const COLORREF colorIn)
{
SetColor((int)GetRValue(colorIn), (int)GetGValue(colorIn), (int)GetBValue(colorIn));
}
int Vertex::GetUVIndex() const
{
return _uvIndex;
}
void Vertex::SetUVIndex(const int index)
{
_uvIndex = index;
}
float Vertex::GetZOriginal() const
{
return _zOriginal;
}
void Vertex::SetZOriginal(const float value)
{
_zOriginal = value;
}
float Vertex::GetUOverZ() const
{
return _uOverZ;
}
void Vertex::SetUOverZ(const float value)
{
_uOverZ = value;
}
float Vertex::GetVOverZ() const
{
return _vOverZ;
}
void Vertex::SetVOverZ(const float value)
{
_vOverZ = value;
}
float Vertex::GetZRecip() const
{
return _zRecip;
}
void Vertex::SetZRecip(const float value)
{
_zRecip = value;
}
void Vertex::UVCorrect(float u, float v, bool calcZRecip)
{
SetUOverZ(u / _zOriginal);
SetVOverZ(v / _zOriginal);
if (calcZRecip)
{
SetZRecip(1 / _zOriginal);
}
}
int Vertex::GetXInt(bool forceRoundUp) const
{
if (forceRoundUp)
{
return (int)ceil(GetX());
}
else
{
return (int)floor(GetX());
}
;}
int Vertex::GetYInt(bool forceRoundUp) const
{
if (forceRoundUp)
{
return (int)ceil(GetY());
}
else
{
return (int)floor(GetY());
}
}
int Vertex::GetZInt(bool forceRoundUp) const
{
if (forceRoundUp)
{
return (int)ceil(GetZ());
}
else
{
return (int)floor(GetZ());
}
}
int Vertex::GetWInt(bool forceRoundUp) const
{
if (forceRoundUp)
{
return (int)ceil(GetW());
}
else
{
return (int)floor(GetW());
}
}
void Vertex::Dehomogenize()
{
_zOriginal = _w;
_x = _x / _w;
_y = _y / _w;
_z = _z / _w;
_w = _w / _w;
}
Vertex& Vertex::operator=(const Vertex& rhs)
{
// Only do the assignment if we are not assigning
// to ourselves
if (this != &rhs)
{
Copy(rhs);
}
return *this;
}
const Vector3D Vertex::operator-(const Vertex& rhs) const
{
return Vector3D(rhs.GetX() - _x, rhs.GetY() - _y, rhs.GetZ() - _z);
}
// The const at the end of the declaraion for '==" indicates that this operation does not change
// any of the member variables in this class.
bool Vertex::operator==(const Vertex& rhs) const
{
return (_x == rhs.GetX() && _y == rhs.GetY() && _z == rhs.GetZ() && _w == rhs.GetW());
}
// You can see three different uses of 'const' here:
//
// The first const indicates that the method changes the return value, but it is not moved in memory
// The second const indicates that the parameter is passed by reference, but it is not modified
// The third const indicates that the operator does not change any of the memory variables in the class.
const Vertex Vertex::operator+(const Vertex& rhs) const
{
return Vertex(_x + rhs.GetX(), _y + rhs.GetY(), _z + rhs.GetZ(), _w + rhs.GetW());
}
void Vertex::Copy(const Vertex& other)
{
_x = other.GetX();
_y = other.GetY();
_z = other.GetZ();
_w = other.GetW();
_contributeCount = other.GetContributeCount();
_normal = other.GetNormal();
_r = other.GetR();
_g = other.GetG();
_b = other.GetB();
_uvIndex = other.GetUVIndex();
_zOriginal = other.GetZOriginal();
_uOverZ = other.GetUOverZ();
_vOverZ = other.GetVOverZ();
_zRecip = other.GetZRecip();
}