Start implementing triangle rasterizer
This commit is contained in:
parent
f02b1ee894
commit
a2ec68f960
20
GL/platforms/software/edge_equation.c
Normal file
20
GL/platforms/software/edge_equation.c
Normal file
|
@ -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));
|
||||||
|
}
|
17
GL/platforms/software/edge_equation.h
Normal file
17
GL/platforms/software/edge_equation.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
16
GL/platforms/software/parameter_equation.c
Normal file
16
GL/platforms/software/parameter_equation.c
Normal file
|
@ -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;
|
||||||
|
}
|
16
GL/platforms/software/parameter_equation.h
Normal file
16
GL/platforms/software/parameter_equation.h
Normal file
|
@ -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);
|
Loading…
Reference in New Issue
Block a user