368 lines
5.3 KiB
C++
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();
|
|
}
|