2022-05-21 19:58:09 +02:00

165 lines
4.1 KiB
C++

#include "stdafx.h"
#include "Vertex.h"
namespace Assets
{
Vertex::Vertex(uint8_t* Address, uint8_t MaxInfluence, uint8_t UVLayers)
: _Offset(Address), _MaxInfluence(MaxInfluence), _UVLayers(UVLayers)
{
}
Vector3& Vertex::Position()
{
return *((Vector3*)this->_Offset);
}
const Vector3& Vertex::Position() const
{
return *((Vector3*)this->_Offset);
}
void Vertex::SetPosition(Vector3 Value)
{
std::memcpy(this->_Offset, &Value, sizeof(Vector3));
}
Vector3& Vertex::Normal()
{
return *((Vector3*)(this->_Offset + sizeof(Vector3)));
}
const Vector3& Vertex::Normal() const
{
return *((Vector3*)(this->_Offset + sizeof(Vector3)));
}
void Vertex::SetNormal(Vector3 Value)
{
std::memcpy(this->_Offset + sizeof(Vector3), &Value, sizeof(Vector3));
}
VertexColor& Vertex::Color()
{
return *((VertexColor*)(this->_Offset + (sizeof(Vector3) * 2)));
}
const VertexColor& Vertex::Color() const
{
return *((VertexColor*)(this->_Offset + (sizeof(Vector3) * 2)));
}
void Vertex::SetColor(VertexColor Value)
{
std::memcpy(this->_Offset + (sizeof(Vector3) * 2), &Value, sizeof(VertexColor));
}
Vector2& Vertex::UVLayers(uint8_t Index)
{
return *((Vector2*)(this->_Offset + (sizeof(Vector3) * 2) + sizeof(VertexColor) + (sizeof(Vector2) * Index)));
}
const Vector2& Vertex::UVLayers(uint8_t Index) const
{
return *((Vector2*)(this->_Offset + (sizeof(Vector3) * 2) + sizeof(VertexColor) + (sizeof(Vector2) * Index)));
}
void Vertex::SetUVLayer(Vector2 Value, uint8_t Index)
{
std::memcpy(this->_Offset + (sizeof(Vector3) * 2) + sizeof(VertexColor) + (sizeof(Vector2) * Index), &Value, sizeof(Vector2));
}
const uint8_t Vertex::UVLayerCount() const
{
return this->_UVLayers;
}
VertexWeight& Vertex::Weights(uint8_t Index)
{
return *((VertexWeight*)(this->_Offset + (sizeof(Vector3) * 2) + sizeof(VertexColor) + (sizeof(Vector2) * this->_UVLayers) + (sizeof(VertexWeight) * Index)));
}
const VertexWeight& Vertex::Weights(uint8_t Index) const
{
return *((VertexWeight*)(this->_Offset + (sizeof(Vector3) * 2) + sizeof(VertexColor) + (sizeof(Vector2) * this->_UVLayers) + (sizeof(VertexWeight) * Index)));
}
void Vertex::SetWeight(VertexWeight Value, uint8_t Index)
{
// When we set the weight, adjust the internal max count...
if ((Index + 1) > WeightCount())
*((uint8_t*)(this->_Offset + (sizeof(Vector3) * 2) + sizeof(VertexColor) + (sizeof(Vector2) * this->_UVLayers) + (sizeof(VertexWeight) * this->_MaxInfluence))) = Index + 1;
// Copy the weight to the buffer offset
std::memcpy(this->_Offset + (sizeof(Vector3) * 2) + sizeof(VertexColor) + (sizeof(Vector2) * this->_UVLayers) + (sizeof(VertexWeight) * Index), &Value, sizeof(VertexWeight));
}
const uint8_t Vertex::WeightCount() const
{
// This is the total used weight count, as in, maximum index used by SetWeight();
return *((uint8_t*)(this->_Offset + (sizeof(Vector3) * 2) + sizeof(VertexColor) + (sizeof(Vector2) * this->_UVLayers) + (sizeof(VertexWeight) * this->_MaxInfluence)));
}
Vertex& Vertex::operator++()
{
this->_Offset += this->VertexSize();
return *this;
}
Vertex Vertex::operator++(int)
{
auto Result = (*this);
++(*this);
return Result;
}
Vertex::operator Vertex*(void) const
{
return (Vertex*)this;
}
bool Vertex::operator==(const Vertex& Rhs) const
{
return (this->_Offset == Rhs._Offset);
}
bool Vertex::operator!=(const Vertex& Rhs) const
{
return !(*this == Rhs);
}
uint32_t Vertex::VertexSize() const
{
return (sizeof(Vector3) * 2) + (sizeof(Vector2) * this->_UVLayers) + (sizeof(VertexWeight) * this->_MaxInfluence) + sizeof(VertexColor) + sizeof(uint8_t);
}
VertexColor::VertexColor()
: _Colors{ 255, 255, 255, 255 }
{
}
VertexColor::VertexColor(uint8_t R, uint8_t G, uint8_t B, uint8_t A)
: _Colors{ R, G, B, A }
{
}
uint8_t& VertexColor::operator[](uint8_t Index)
{
return this->_Colors[Index];
}
const uint8_t& VertexColor::operator[](uint8_t Index) const
{
return this->_Colors[Index];
}
VertexWeight::VertexWeight()
: Bone(0), Value(1)
{
}
VertexWeight::VertexWeight(uint32_t Bone, float Value)
: Bone(Bone), Value(Value)
{
}
}