VOID PolyDataNormalize(OBJECT *po, MATRIX normMat) { INT i; POINT coord; VEC3 *pv; /* Ptr to vertex list. */ POLY *pp; /* Ptr to polygon data. */ ELEMENT *pe; /* Ptr to polygon element. */ /* Normalize bounding box. */ pe = po->pelem; NormalizeBoundBox(&po->bv, normMat); /* Normalize vertex list. */ pp = (POLY *)pe->data; pv = pp->vptr; coord[0] = (*pv)[0]; coord[1] = (*pv)[1]; coord[2] = (*pv)[2]; coord[3] = 1.0; /* Transform coordinate by xform matrix. */ while (coord[0] != HUGE_REAL && coord[1] != HUGE_REAL && coord[2] != HUGE_REAL) { VecMatMult(coord, normMat, coord); (*pv)[0] = coord[0]; (*pv)[1] = coord[1]; (*pv)[2] = coord[2]; pv++; coord[0] = (*pv)[0]; coord[1] = (*pv)[1]; coord[2] = (*pv)[2]; coord[3] = 1.0; } /* Normalize bounding boxes of object elements. */ for (i = 0; i < po->numelements; i++) { pp = (POLY *)pe->data; NormalizeBoundBox(&pe->bv, normMat); /* Find new d of plane equation. */ pv = pp->vptr + (*(pp->vindex)); pp->d = -(pp->norm[0]*(*pv)[0] + pp->norm[1]*(*pv)[1] + pp->norm[2]*(*pv)[2]); pe++; } }
VOID SphDataNormalize(OBJECT *po, MATRIX normMat) { INT i; SPHERE *ps; /* Ptr to sphere data. */ ELEMENT *pe; /* Ptr to sphere element. */ POINT surf_point; /* Point on surface. */ POINT center_point; /* Center point. */ POINT rad_vector; /* Radius vector. */ NormalizeBoundBox(&po->bv, normMat); pe = po->pelem; for (i = 0; i < po->numelements; i++) { ps = (SPHERE *)pe->data; NormalizeBoundBox(&pe->bv, normMat); surf_point[0] = ps->center[0] + ps->rad; surf_point[1] = ps->center[1]; surf_point[2] = ps->center[2]; surf_point[3] = 1.0; center_point[0] = ps->center[0]; center_point[1] = ps->center[1]; center_point[2] = ps->center[2]; center_point[3] = 1.0; /* Transform center point. */ VecMatMult(center_point, normMat, center_point); VecMatMult(surf_point, normMat, surf_point); /* Find new radius. */ VecSub(rad_vector, surf_point, center_point); VecCopy(ps->center, center_point); ps->rad = VecLen(rad_vector); ps->rad2 = ps->rad * ps->rad; pe++; } }