mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
165 lines
4.1 KiB
C++
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)
|
|
{
|
|
}
|
|
}
|