#include #include #include #include #include #include "vertex.h" /* read a vertext from a string. * fText says whether the vertex is textured or not */ int vtx_sscan(const char *s, pvertex pv, int fTex) { int n; n = sscanf(s, "%f %f %f %d %d %d %d %f %f %f %f", &pv->x,&pv->y,&pv->z,&pv->a,&pv->r,&pv->g,&pv->b, &pv->u,&pv->v,&pv->d,&pv->w); return (((n == 11) && fTex) || ((n == 7) && !fTex)); } /* assumes triangle in XY plane! */ double vtx_area(const vertex v[3]) { /* area tri ABC = 1/2 || (B-A) x (C-A) || */ return fabs(((double)v[1].x - (double)v[0].x)* ((double)v[2].y - (double)v[0].y) - ((double)v[1].y - (double)v[0].y)* ((double)v[2].x - (double)v[0].x)) / 2.0; } /* assumes triangle in XY plane! */ /* always returns a number >= 1 */ double vtx_bbaspect(const vertex v[3]) { double x, y; x=vtx_bbhoriz(v); y=vtx_bbvert(v); if (x == 0 || y == 0) return 0; assert(x > 0 && y > 0); if (y > x) { float tmp = x; x = y; y = tmp; } return x/y; } double vtx_wratio(const vertex v[3]) { double minW, maxW; int i; for(i=0;i<3;i++) { if(i==0) minW=maxW=v[i].w; if(v[i].w>maxW) maxW=v[i].w; if(v[i].w maxx) maxx = v[1].x; if (v[2].x > maxx) maxx = v[2].x; x = maxx-minx; return x; } double vtx_bbvert(const vertex v[3]) { register float miny, maxy; double y; miny = maxy = v[0].y; if (v[1].y < miny) miny = v[1].y; if (v[2].y < miny) miny = v[2].y; if (v[1].y > maxy) maxy = v[1].y; if (v[2].y > maxy) maxy = v[2].y; y = maxy-miny; return y; } double vtx_wave(const vertex v[3]) { double minW, maxW; int i; for(i=0;i<3;i++) { if(i==0) minW=maxW=v[i].w; if(v[i].w>maxW) maxW=v[i].w; if(v[i].w