From a2ec68f960ddd853d01226c50ed35f76b05d64ba Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Tue, 6 Apr 2021 13:09:40 +0100 Subject: [PATCH] Start implementing triangle rasterizer --- GL/platforms/software/edge_equation.c | 20 ++++++++++++++++++++ GL/platforms/software/edge_equation.h | 17 +++++++++++++++++ GL/platforms/software/parameter_equation.c | 16 ++++++++++++++++ GL/platforms/software/parameter_equation.h | 16 ++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 GL/platforms/software/edge_equation.c create mode 100644 GL/platforms/software/edge_equation.h create mode 100644 GL/platforms/software/parameter_equation.c create mode 100644 GL/platforms/software/parameter_equation.h diff --git a/GL/platforms/software/edge_equation.c b/GL/platforms/software/edge_equation.c new file mode 100644 index 0000000..6a6c7cb --- /dev/null +++ b/GL/platforms/software/edge_equation.c @@ -0,0 +1,20 @@ +#include "edge_equation.h" + +void EdgeEquationInit(EdgeEquation* edge, const float* v0, const float* v1) { + edge->a = v0[1] - v1[1]; + edge->b = v1[0] - v0[0]; + edge->c = -(edge->a * (v0[0] + v1[0]) + edge->b * (v0[1] + v1[1])) / 2; + edge->tie = edge->a != 0 ? edge->a > 0 : edge->b > 0; +} + +float EdgeEquationEvaluate(const EdgeEquation* edge, float x, float y) { + return edge->a * x + edge->b * y + edge->c; +} + +bool EdgeEquationTestValue(const EdgeEquation* edge, float value) { + return (value >= 0 || (value == 0 && edge->tie)); +} + +bool EdgeEquationTestPoint(const EdgeEquation* edge, float x, float y) { + return EdgeEquationTestValue(edge, EdgeEquationEvaluate(edge, x, y)); +} diff --git a/GL/platforms/software/edge_equation.h b/GL/platforms/software/edge_equation.h new file mode 100644 index 0000000..2bd1bde --- /dev/null +++ b/GL/platforms/software/edge_equation.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +typedef struct EdgeEquation { + float a; + float b; + float c; + bool tie; +} EdgeEquation; + +void EdgeEquationInit(EdgeEquation* edge, const float* v0, const float* v1); +float EdgeEquationEvaluate(const EdgeEquation* edge, float x, float y); +bool EdgeEquationTestValue(const EdgeEquation* edge, float value); +bool EdgeEquationTestPoint(const EdgeEquation* edge, float x, float y); + diff --git a/GL/platforms/software/parameter_equation.c b/GL/platforms/software/parameter_equation.c new file mode 100644 index 0000000..cf46299 --- /dev/null +++ b/GL/platforms/software/parameter_equation.c @@ -0,0 +1,16 @@ +#include "parameter_equation.h" +#include "edge_equation.h" + +void ParameterEquationInit(ParameterEquation* equation, float p0, float p1, float p2, const EdgeEquation* e0, const EdgeEquation* e1, const EdgeEquation* e2, float area) { + + float factor = 1.0f / (2.0f * area); + + equation->a = factor * (p0 * e0->a + p1 * e1->a + p2 * e2->a); + equation->b = factor * (p0 * e0->b + p1 * e1->b + p2 * e2->b); + equation->c = factor * (p0 * e0->c + p1 * e1->c + p2 * e2->c); +} + + +float ParameterEquationEvaluate(const ParameterEquation* equation, float x, float y) { + return equation->a * x + equation->b * y + equation->c; +} diff --git a/GL/platforms/software/parameter_equation.h b/GL/platforms/software/parameter_equation.h new file mode 100644 index 0000000..7aea832 --- /dev/null +++ b/GL/platforms/software/parameter_equation.h @@ -0,0 +1,16 @@ +#pragma once + +typedef struct ParameterEquation { + float a; + float b; + float c; +} ParameterEquation; + +struct EdgeEquation; + +void ParameterEquationInit( + ParameterEquation* equation, + float p0, float p1, float p2, + const EdgeEquation* e0, const EdgeEquation* e1, const EdgeEquation* e2, float area); + +float ParameterEquationEvaluate(const ParameterEquation* equation, float x, float y);