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