X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=src%2Fpolyclip.c;h=67e1c8344554da17d75ab66c5e9c8eb5c5f98606;hp=f5ef9c79b2013eed40027fd9b762ea843f376a5f;hb=a5c65ceb155188c8acee31a475f8db9f5b58f4b6;hpb=1bd8af3c3c9ec41903590d6ad24ff6313a5cc19b diff --git a/src/polyclip.c b/src/polyclip.c index f5ef9c7..67e1c83 100644 --- a/src/polyclip.c +++ b/src/polyclip.c @@ -1,3 +1,4 @@ +#include #include #include #include "polyclip.h" @@ -14,17 +15,20 @@ static int clip_edge_frustum(struct g3d_vertex *poly, int *vnumptr, const struct g3d_vertex *v0, const struct g3d_vertex *v1, int fplane); static float distance_signed(float *pos, const struct cplane *plane); static int intersect(const struct ray *ray, const struct cplane *plane, float *t); +static int inside_frustum_plane(const struct g3d_vertex *v, int fplane); int clip_poly(struct g3d_vertex *vout, int *voutnum, const struct g3d_vertex *vin, int vnum, struct cplane *plane) { - int i; + int i, nextidx, res; int edges_clipped = 0; int out_vnum = 0; for(i=0; i= vnum) nextidx = 0; + res = clip_edge(vout, &out_vnum, vin + i, vin + nextidx, plane); if(res == 0) { ++edges_clipped; } @@ -43,12 +47,19 @@ int clip_poly(struct g3d_vertex *vout, int *voutnum, int clip_frustum(struct g3d_vertex *vout, int *voutnum, const struct g3d_vertex *vin, int vnum, int fplane) { - int i; + int i, nextidx, res; int edges_clipped = 0; int out_vnum = 0; + if(vnum == 1) { + /* special case: point clipping */ + return inside_frustum_plane(vin, fplane) ? 1 : -1; + } + for(i=0; i= vnum) nextidx = 0; + res = clip_edge_frustum(vout, &out_vnum, vin + i, vin + nextidx, fplane); if(res == 0) { ++edges_clipped; } @@ -132,9 +143,9 @@ static int clip_edge(struct g3d_vertex *poly, int *vnumptr, intersect(&ray, plane, &t); - vptr->x = ray.origin[0] + ray.dir[0] + t; - vptr->y = ray.origin[1] + ray.dir[1] + t; - vptr->z = ray.origin[2] + ray.dir[2] + t; + vptr->x = ray.origin[0] + ray.dir[0] * t; + vptr->y = ray.origin[1] + ray.dir[1] * t; + vptr->z = ray.origin[2] + ray.dir[2] * t; vptr->w = 1.0f; LERP_VATTR(vptr, v0, v1, t); @@ -166,7 +177,7 @@ static int intersect(const struct ray *ray, const struct cplane *plane, float *t float orig_pt_dir[3]; float ndotdir = plane->nx * ray->dir[0] + plane->ny * ray->dir[1] + plane->nz * ray->dir[2]; - if(fabs(ndotdir) < 1e-4) { + if(fabs(ndotdir) < 1e-6) { *t = 0.0f; return 0; }