Program Listing for File Plane.cpp¶
↰ Return to documentation for file (Source\Math\Src\Plane.cpp
)
#include "Math/Plane.h"
namespace Azura {
namespace Math {
namespace {
const RawStorageFormat VERTEX_FORMAT = RawStorageFormat::R32G32B32A32_FLOAT;
const RawStorageFormat NORMAL_FORMAT = RawStorageFormat::R32G32B32_FLOAT;
const RawStorageFormat UV_FORMAT = RawStorageFormat::R32G32_FLOAT;
const RawStorageFormat INDEX_FORMAT = RawStorageFormat::R32_UINT;
} // namespace
Plane::Plane(const Vector2f& boundMin, const Vector2f& boundMax)
: Plane(boundMin, boundMax, Vector2u(1, 1), Vector2u(1, 1)) {
}
Plane::Plane(const Vector2f& boundMin, const Vector2f& boundMax, const Vector2u& subDivisions, const Vector2u& uvScale) {
const float stepX = float(boundMax[0] - boundMin[0]) / subDivisions[0];
const float stepY = float(boundMax[1] - boundMin[1]) / subDivisions[1];
m_vertices.reserve((subDivisions[0] + 1) * (subDivisions[1] + 1));
m_normals.reserve(m_vertices.size());
m_uv.reserve(m_vertices.size());
U32 xCount = 0;
for (float xCoord = boundMin[0]; xCoord <= boundMax[0] + EPSILON;) {
U32 yCount = 0;
for (float yCoord = boundMin[1]; yCoord <= boundMax[1] + EPSILON;) {
m_vertices.emplace_back(xCoord, 0.0f, yCoord, 1.0f);
m_normals.emplace_back(0.0f, 1.0f, 0.0f);
yCoord += stepY;
m_uv.emplace_back(uvScale[0] * float(xCount) / subDivisions[0], uvScale[1] * float(yCount) / subDivisions[1]);
++yCount;
}
++xCount;
xCoord += stepX;
}
for (U32 idx = 0; idx < subDivisions[0]; ++idx) {
for (U32 idy = 0; idy < subDivisions[1]; ++idy) {
const U32 i1 = ((subDivisions[1] + 1) * idx) + idy;
const U32 i2 = ((subDivisions[1] + 1) * (idx + 1)) + idy;
const U32 i21 = i2 + 1;
const U32 i11 = i1 + 1;
m_triangles.emplace_back(Vector3u(i1, i2, i21));
m_triangles.emplace_back(Vector3u(i1, i21, i11));
}
}
}
U32 Plane::VertexDataSize() const {
return U32(m_vertices.size() * GetFormatSize(VERTEX_FORMAT));
}
U32 Plane::IndexDataSize() const {
return U32(m_triangles.size() * GetFormatSize(INDEX_FORMAT) * 3);
}
U32 Plane::UVDataSize() const {
return U32(m_uv.size() * GetFormatSize(UV_FORMAT));
}
U32 Plane::NormalDataSize() const {
return U32(m_normals.size() * GetFormatSize(NORMAL_FORMAT));
}
const U8* Plane::VertexData() const {
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return reinterpret_cast<const U8*>(m_vertices.data());
}
const U8* Plane::IndexData() const {
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return reinterpret_cast<const U8*>(m_triangles.data());
}
const U8* Plane::UVData() const {
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return reinterpret_cast<const U8*>(m_uv.data());
}
const U8* Plane::NormalData() const {
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
return reinterpret_cast<const U8*>(m_normals.data());
}
RawStorageFormat Plane::GetVertexFormat() const {
return VERTEX_FORMAT;
}
RawStorageFormat Plane::GetIndexFormat() const {
return INDEX_FORMAT;
}
RawStorageFormat Plane::GetNormalFormat() const {
return NORMAL_FORMAT;
}
RawStorageFormat Plane::GetUVFormat() const {
return UV_FORMAT;
}
U32 Plane::GetVertexCount() const {
return U32(m_vertices.size());
}
U32 Plane::GetIndexCount() const {
return U32(m_triangles.size() * 3);
}
U32 Plane::TotalDataSize() const {
return VertexDataSize() + IndexDataSize() + NormalDataSize() + UVDataSize();
}
const std::vector<Vector4f>& Plane::GetVertices() const {
return m_vertices;
}
std::vector<Vector4f>& Plane::GetVertices() {
return m_vertices;
}
const std::vector<Vector3f>& Plane::GetNormals() const {
return m_normals;
}
std::vector<Vector3f>& Plane::GetNormals() {
return m_normals;
}
} // namespace Math
} // namespace Azura