shithub: libgraphics

Download patch

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]);