From a3815d7c4e410f453bfcf38a376ef3893dbbff15 Mon Sep 17 00:00:00 2001 From: Trammell hudson Date: Tue, 26 Sep 2017 22:59:09 -0400 Subject: [PATCH] enable backface culling --- camera.c | 14 +++++------ camera.h | 4 ++-- hiddenwire.c | 68 ++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 59 insertions(+), 27 deletions(-) diff --git a/camera.c b/camera.c index 1a6ed11..beb015a 100644 --- a/camera.c +++ b/camera.c @@ -12,14 +12,14 @@ struct _camera_t { float zoom; - float eye_z; + v3_t eye; float r[3][3]; }; camera_t * camera_new( - float eye_z, + v3_t eye, float phi, float theta, float psi @@ -29,8 +29,8 @@ camera_new( if (!c) return NULL; - c->zoom = 1024; - camera_setup(c, eye_z, phi, theta, psi); + c->zoom = 4096; + camera_setup(c, eye, phi, theta, psi); return c; } @@ -38,7 +38,7 @@ camera_new( void camera_setup( camera_t * const c, - float eye_z, + v3_t eye, float phi, float theta, float psi @@ -63,7 +63,7 @@ camera_setup( c->r[2][1] = sx * cy; c->r[2][2] = cx * cy; - c->eye_z = eye_z; + c->eye = eye; } @@ -78,7 +78,7 @@ camera_project( v3_t * const v_out ) { - v3_t p = { .p = { 0, 0, c->eye_z } }; + v3_t p = c->eye; for (int i = 0 ; i < 3 ; i++) for (int j = 0 ; j < 3 ; j++) diff --git a/camera.h b/camera.h index 042d079..9a5143c 100644 --- a/camera.h +++ b/camera.h @@ -6,7 +6,7 @@ typedef struct _camera_t camera_t; extern camera_t * camera_new( - float eye_z, + v3_t eye, float phi, float theta, float psi @@ -15,7 +15,7 @@ camera_new( extern void camera_setup( camera_t * const c, - float eye_z, + v3_t eye, float phi, float theta, float psi diff --git a/hiddenwire.c b/hiddenwire.c index d661288..ccb7dc1 100644 --- a/hiddenwire.c +++ b/hiddenwire.c @@ -17,8 +17,7 @@ #define M_PI 3.1415926535897932384 #endif -static int debug = 0; -static int draw_labels = 0; +static int debug = 1; typedef struct { @@ -111,7 +110,7 @@ svg_line( { if (!dash) { - printf("\n", + printf("\n", p1[0], p1[1], p2[0], @@ -716,11 +715,18 @@ stl2faces( #endif -int main(void) +int main( + int argc, + char ** argv +) { - const size_t max_len = 1 << 20; + const size_t max_len = 32 << 20; uint8_t * const buf = calloc(max_len, 1); + float phi = argc > 1 ? atof(argv[1]) * M_PI/180 : 0; + float theta = argc > 2 ? atof(argv[2]) * M_PI/180 : 0; + float psi = argc > 3 ? atof(argv[3]) * M_PI/180 : 0; + ssize_t rc = read(0, buf, max_len); if (rc == -1) return EXIT_FAILURE; @@ -729,39 +735,65 @@ int main(void) const stl_face_t * const stl_faces = (const void*)(hdr+1); const int num_triangles = hdr->num_triangles; - fprintf(stderr, "header: '%s'\n", hdr->header); - fprintf(stderr, "num: %d\n", num_triangles); + if(debug) + { + fprintf(stderr, "header: '%s'\n", hdr->header); + fprintf(stderr, "num: %d\n", num_triangles); + } // looking at (0,0,0) - const camera_t * const cam = camera_new(400, 0, M_PI/2, M_PI); + v3_t eye = { { 0, 0, 400 } }; + const camera_t * const cam = camera_new(eye, phi, theta, psi); - // translate each face into lines printf("\n"); - printf("\n"); - // convert the stl triangles into faces + float off_x = 500; + float off_y = 500; + printf("\n", off_x, off_y); + + int rejected = 0; + for (int i = 0 ; i < num_triangles ; i++) { const stl_face_t * const stl = &stl_faces[i]; + int reject = 0; v3_t s[3]; for(int j = 0 ; j < 3 ; j++) camera_project(cam, &stl->p[j], &s[j]); + // reject this face if any of them are behind us + for(int j = 0 ; j < 3 ; j++) + if (s[j].p[2] <= 0) + reject = 1; + + // do a back-face cull to determine if this triangle + // is not facing us. we have to determine the orientation + // from the winding of the new projection + v3_t normal = v3_cross( + v3_sub(s[1], s[0]), + v3_sub(s[2], s[1]) + ); + + if (normal.p[2] <= 0) + reject = 1; + + if (reject) + { + rejected++; + continue; + } + // draw each of the three lines for(int j = 0 ; j < 3 ; j++) - { - if (s[j].p[2] <= 0) - continue; - if (s[(j+1) % 3].p[2] <= 0) - continue; svg_line("#FF0000", s[j].p, s[(j+1) % 3].p, 0); - } - } + if (debug) + fprintf(stderr, "Rejected %d triangles\n", rejected); + #if 0 face_t * const faces = stl2faces(stl_faces, num_triangles);