CPU-Software-Renderer/CPU-Software-Renderer/RenderData/Triangle.h

56 lines
1.5 KiB
C++

#pragma once
#include "Vector2.h"
#include "BoundingBox.h"
#include <algorithm>
#include <cmath>
#include <cstdint>
namespace RenderData
{
struct Triangle2D
{
Math::Vector2 v0;
Math::Vector2 v1;
Math::Vector2 v2;
Triangle2D() : v0(), v1(), v2() {}
Triangle2D(const Math::Vector2 a, const Math::Vector2 b, const Math::Vector2 c) : v0(a), v1(b), v2(c) {}
BoundingBox2D get_boundingBox() const
{
using namespace Math;
int32_t minX = static_cast<int32_t>(std::floor(std::min({ v0.x, v1.x, v2.x })));
int32_t maxX = static_cast<int32_t>(std::ceil(std::max({ v0.x, v1.x, v2.x })));
int32_t minY = static_cast<int32_t>(std::floor(std::min({ v0.y, v1.y, v2.y })));
int32_t maxY = static_cast<int32_t>(std::ceil(std::max({ v0.y, v1.y, v2.y })));
Vector2Int min(minX, minY);
Vector2Int max(maxX, maxY);
return BoundingBox2D(min, max);
}
bool ContainsPixel(const Math::Vector2 point) const
{
using namespace Math;
auto cross = [](const Vector2& p1, const Vector2& p2, const Vector2& p3) -> float
{
const float x1 = p2.x - p1.x;
const float y1 = p2.y - p1.y;
const float x2 = p3.x - p1.x;
const float y2 = p3.y - p1.y;
return x1 * y2 - y1 * x2;
};
const float c0 = cross(v0, v1, point);
const float c1 = cross(v1, v2, point);
const float c2 = cross(v2, v0, point);
const bool hasNeg = (c0 < 0) || (c1 < 0) || (c2 < 0);
const bool hasPos = (c0 > 0) || (c1 > 0) || (c2 > 0);
return !(hasNeg && hasPos);
}
};
}