enable backface culling
This commit is contained in:
parent
6c13b35255
commit
a3815d7c4e
14
camera.c
14
camera.c
@ -12,14 +12,14 @@
|
|||||||
struct _camera_t
|
struct _camera_t
|
||||||
{
|
{
|
||||||
float zoom;
|
float zoom;
|
||||||
float eye_z;
|
v3_t eye;
|
||||||
float r[3][3];
|
float r[3][3];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
camera_t *
|
camera_t *
|
||||||
camera_new(
|
camera_new(
|
||||||
float eye_z,
|
v3_t eye,
|
||||||
float phi,
|
float phi,
|
||||||
float theta,
|
float theta,
|
||||||
float psi
|
float psi
|
||||||
@ -29,8 +29,8 @@ camera_new(
|
|||||||
if (!c)
|
if (!c)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
c->zoom = 1024;
|
c->zoom = 4096;
|
||||||
camera_setup(c, eye_z, phi, theta, psi);
|
camera_setup(c, eye, phi, theta, psi);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ camera_new(
|
|||||||
void
|
void
|
||||||
camera_setup(
|
camera_setup(
|
||||||
camera_t * const c,
|
camera_t * const c,
|
||||||
float eye_z,
|
v3_t eye,
|
||||||
float phi,
|
float phi,
|
||||||
float theta,
|
float theta,
|
||||||
float psi
|
float psi
|
||||||
@ -63,7 +63,7 @@ camera_setup(
|
|||||||
c->r[2][1] = sx * cy;
|
c->r[2][1] = sx * cy;
|
||||||
c->r[2][2] = cx * 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 * 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 i = 0 ; i < 3 ; i++)
|
||||||
for (int j = 0 ; j < 3 ; j++)
|
for (int j = 0 ; j < 3 ; j++)
|
||||||
|
4
camera.h
4
camera.h
@ -6,7 +6,7 @@ typedef struct _camera_t camera_t;
|
|||||||
|
|
||||||
extern camera_t *
|
extern camera_t *
|
||||||
camera_new(
|
camera_new(
|
||||||
float eye_z,
|
v3_t eye,
|
||||||
float phi,
|
float phi,
|
||||||
float theta,
|
float theta,
|
||||||
float psi
|
float psi
|
||||||
@ -15,7 +15,7 @@ camera_new(
|
|||||||
extern void
|
extern void
|
||||||
camera_setup(
|
camera_setup(
|
||||||
camera_t * const c,
|
camera_t * const c,
|
||||||
float eye_z,
|
v3_t eye,
|
||||||
float phi,
|
float phi,
|
||||||
float theta,
|
float theta,
|
||||||
float psi
|
float psi
|
||||||
|
62
hiddenwire.c
62
hiddenwire.c
@ -17,8 +17,7 @@
|
|||||||
#define M_PI 3.1415926535897932384
|
#define M_PI 3.1415926535897932384
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int debug = 0;
|
static int debug = 1;
|
||||||
static int draw_labels = 0;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@ -111,7 +110,7 @@ svg_line(
|
|||||||
{
|
{
|
||||||
if (!dash)
|
if (!dash)
|
||||||
{
|
{
|
||||||
printf("<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"%s\" stroke-width=\"0.1px\"/>\n",
|
printf("<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"%s\" stroke-width=\"0.5px\"/>\n",
|
||||||
p1[0],
|
p1[0],
|
||||||
p1[1],
|
p1[1],
|
||||||
p2[0],
|
p2[0],
|
||||||
@ -716,11 +715,18 @@ stl2faces(
|
|||||||
#endif
|
#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);
|
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);
|
ssize_t rc = read(0, buf, max_len);
|
||||||
if (rc == -1)
|
if (rc == -1)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
@ -729,38 +735,64 @@ int main(void)
|
|||||||
const stl_face_t * const stl_faces = (const void*)(hdr+1);
|
const stl_face_t * const stl_faces = (const void*)(hdr+1);
|
||||||
const int num_triangles = hdr->num_triangles;
|
const int num_triangles = hdr->num_triangles;
|
||||||
|
|
||||||
|
if(debug)
|
||||||
|
{
|
||||||
fprintf(stderr, "header: '%s'\n", hdr->header);
|
fprintf(stderr, "header: '%s'\n", hdr->header);
|
||||||
fprintf(stderr, "num: %d\n", num_triangles);
|
fprintf(stderr, "num: %d\n", num_triangles);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// looking at (0,0,0)
|
// 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("<svg xmlns=\"http://www.w3.org/2000/svg\">\n");
|
printf("<svg xmlns=\"http://www.w3.org/2000/svg\">\n");
|
||||||
printf("<g>\n");
|
|
||||||
|
|
||||||
// convert the stl triangles into faces
|
float off_x = 500;
|
||||||
|
float off_y = 500;
|
||||||
|
printf("<g transform=\"translate(%f %f)\">\n", off_x, off_y);
|
||||||
|
|
||||||
|
int rejected = 0;
|
||||||
|
|
||||||
for (int i = 0 ; i < num_triangles ; i++)
|
for (int i = 0 ; i < num_triangles ; i++)
|
||||||
{
|
{
|
||||||
const stl_face_t * const stl = &stl_faces[i];
|
const stl_face_t * const stl = &stl_faces[i];
|
||||||
|
int reject = 0;
|
||||||
|
|
||||||
v3_t s[3];
|
v3_t s[3];
|
||||||
|
|
||||||
for(int j = 0 ; j < 3 ; j++)
|
for(int j = 0 ; j < 3 ; j++)
|
||||||
camera_project(cam, &stl->p[j], &s[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
|
// draw each of the three lines
|
||||||
for(int j = 0 ; j < 3 ; j++)
|
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);
|
svg_line("#FF0000", s[j].p, s[(j+1) % 3].p, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
if (debug)
|
||||||
|
fprintf(stderr, "Rejected %d triangles\n", rejected);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
face_t * const faces = stl2faces(stl_faces, num_triangles);
|
face_t * const faces = stl2faces(stl_faces, num_triangles);
|
||||||
|
Loading…
Reference in New Issue
Block a user