summaryrefslogtreecommitdiff
path: root/src/core/rasterizer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/rasterizer.c')
-rw-r--r--src/core/rasterizer.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/core/rasterizer.c b/src/core/rasterizer.c
index 28ae639..c5745ba 100644
--- a/src/core/rasterizer.c
+++ b/src/core/rasterizer.c
@@ -86,19 +86,31 @@ void ssrR_triangle(
Vec4* CA, Vec4* CB, Vec4* CC,
uint IA, uint IB, uint IC,
Program* program,
- UniformCollection* uniforms
+ UniformCollection* uniforms,
+ bool early_culled
) {
ssr_assert(CA && CB && CC && program);
+ /*late back face culling*/
+ if (!early_culled && ssr_isenable(ENABLE_BACKFACECULL)) {
+ float w0 = 1 / CA->w, w1 = 1 / CB->w, w2 = 1 / CC->w;
+ Vec2 ab, ac;
+ ab.x = CB->x * w1 - CA->x * w0;
+ ab.y = CB->y * w1 - CA->y * w0;
+ ac.x = CC->x * w2 - CA->x * w0;
+ ac.y = CC->y * w2 - CA->y * w0;
+ if (ab.x * ac.y - ab.y * ac.x <= 0) {
+ return;
+ }
+ }
+
Vec4 SA, SB, SC;
internal_vec4_dividewnoz(CA, &SA); ssrU_viewport(&SA, &SA);
internal_vec4_dividewnoz(CB, &SB); ssrU_viewport(&SB, &SB);
internal_vec4_dividewnoz(CC, &SC); ssrU_viewport(&SC, &SC);
-/*
- puttriangle(&SA, &SB, &SC, 0xffff0000);
- return;
-*/
+ //puttriangle(&SA, &SB, &SC, 0xffff0000);
+ //return;
Vec4 *sa = &SA, *sb = &SB, *sc = &SC, *tmp;
Vec4 *v4tmp;