ref: 82888bed1931e83ed1401485033cb9f7acdadc94
parent: 04d50b8bbe324fdb7a8a1e724fbc59c4050862f0
author: rodri <rgl@antares-labs.eu>
date: Sat Jul 13 11:18:19 EDT 2024
enable culling and add a camera knob for it.
--- a/graphics.h
+++ b/graphics.h
@@ -6,24 +6,27 @@
} Projection;
enum {
- PPoint,
+ /* culling modes */
+ CullNone,
+ CullFront,
+ CullBack,
+
+ /* primitive types */
+ PPoint = 0,
PLine,
PTriangle,
-};
-enum {
- LIGHT_POINT,
+ /* light types */
+ LIGHT_POINT = 0,
LIGHT_DIRECTIONAL,
LIGHT_SPOT,
-};
-enum {
- RAWTexture, /* unmanaged */
+ /* texture formats */
+ RAWTexture = 0, /* unmanaged */
sRGBTexture,
-};
-enum {
- VAPoint,
+ /* vertex attribute types */
+ VAPoint = 0,
VANumber,
};
@@ -282,12 +285,12 @@
} clip;
Matrix3 proj; /* VCS to clip space xform */
Projection projtype;
+ int cullmode;
struct {
uvlong min, avg, max, acc, n, v;
uvlong nframes;
} stats;
-
struct {
Rendertime R[100], E[100], Tn[100], Rn[100];
int cur;
--- a/render.c
+++ b/render.c
@@ -377,7 +377,6 @@
for(; np--; p++){
p->v[0].p = clip2ndc(p->v[0].p);
p->v[1].p = clip2ndc(p->v[1].p);
-
p->v[0].p = ndc2viewport(params->fb, p->v[0].p);
p->v[1].p = ndc2viewport(params->fb, p->v[1].p);
@@ -425,8 +424,10 @@
p->v[2].p = clip2ndc(p->v[2].p);
/* culling */
-// if(isfacingback(*p))
-// goto skiptri;
+ switch(params->camera->cullmode){
+ case CullFront: if(!isfacingback(p)) goto skiptri; break;
+ case CullBack: if(isfacingback(p)) goto skiptri; break;
+ }
p->v[0].p = ndc2viewport(params->fb, p->v[0].p);
p->v[1].p = ndc2viewport(params->fb, p->v[1].p);
@@ -450,7 +451,7 @@
task->p.v[2] = dupvertex(&p->v[2]);
sendp(taskchans[i], task);
}
-//skiptri:
+skiptri:
delvattrs(&p->v[0]);
delvattrs(&p->v[1]);
delvattrs(&p->v[2]);