+#include <stdio.h>
#include <math.h>
#include <assert.h>
#include "polyclip.h"
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; i++) {
- int res = clip_edge(vout, &out_vnum, vin + i, vin + (i + 1) % vnum, plane);
+ nextidx = i + 1;
+ if(nextidx >= vnum) nextidx = 0;
+ res = clip_edge(vout, &out_vnum, vin + i, vin + nextidx, plane);
if(res == 0) {
++edges_clipped;
}
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;
}
for(i=0; i<vnum; i++) {
- int res = clip_edge_frustum(vout, &out_vnum, vin + i, vin + (i + 1) % vnum, fplane);
+ nextidx = i + 1;
+ if(nextidx >= vnum) nextidx = 0;
+ res = clip_edge_frustum(vout, &out_vnum, vin + i, vin + nextidx, fplane);
if(res == 0) {
++edges_clipped;
}
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);
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;
}