/* ============ idTraceModel::SetupPolygon ============ */ void idTraceModel::SetupPolygon( const idWinding &w ) { int i; idVec3 *verts; verts = (idVec3 *) _alloca16( w.GetNumPoints() * sizeof( idVec3 ) ); for ( i = 0; i < w.GetNumPoints(); i++ ) { verts[i] = w[i].ToVec3(); } SetupPolygon( verts, w.GetNumPoints() ); }
int Ray_PolygonFinish(Object *obj) { PolygonData *ply; assert(obj != NULL); assert(obj->data.polygon != NULL); ply = obj->data.polygon; if(ply->npts < 3) return 0; SetupPolygon(ply); return 1; }
Object *Ray_MakePolygon(float *pts, int npts) { Object *obj = NewObject(); if (obj != NULL) { PolygonData *polygon = (PolygonData *)Malloc(sizeof(PolygonData)); if (polygon != NULL) { if (npts >= 3) { polygon->npts = npts; if((polygon->pts = (float *)Calloc(npts * 3, sizeof(float))) != NULL) { if (pts != NULL) { // A point list was given. Copy the points into the // polygon point list and initialize it. // memcpy(polygon->pts, pts, npts * 3 * sizeof(float)); SetupPolygon(polygon); } } else { // Alloc failed. Ray_DeleteObject(obj); return NULL; } } else { // Start with an empty polygon. // Points will be added later. // polygon->pts = NULL; polygon->npts = 0; } obj->data.polygon = polygon; obj->procs = &polygon_procs; // Don't shadow test against self. // obj->flags |= OBJ_FLAG_NO_SELF_INTERSECT; } else // Alloc failed obj = Ray_DeleteObject(obj); } return obj; }
void MatrixTransformPolygon(PolygonData *p, Xform *T) { Vec3 V; int i; float *old_pts, *new_pts; old_pts = new_pts = p->pts; for(i = 0; i < p->npts; i++) { V.x = *old_pts++; V.y = *old_pts++; V.z = *old_pts++; PointToWorld(&V, T); *new_pts++ = (float)V.x; *new_pts++ = (float)V.y; *new_pts++ = (float)V.z; } SetupPolygon(p); }
void TransformPolygon(Object *obj, Vec3 *params, int type) { PolygonData *p = obj->data.polygon; Vec3 V; int i; float *old_pts, *new_pts; old_pts = new_pts = p->pts; for(i = 0; i < p->npts; i++) { V.x = *old_pts++; V.y = *old_pts++; V.z = *old_pts++; XformVector(&V, params, type); *new_pts++ = (float)V.x; *new_pts++ = (float)V.y; *new_pts++ = (float)V.z; } SetupPolygon(p); }