#include "Face.h" using namespace CCS; Vector calcCcwNormal(EdgeUse &e1, EdgeUse &e2) { if(e1.getUseEnd() != e2.getUseStart()) { __ERROR__("calcCcwNormal called with two edges that don't connect, or connect in t he wrong order"); exit(1); } Point a = e1.getUseStart()->p; Point b = e1.getUseEnd()->p; Point c = e2.getUseEnd()->p; Vector d1 = b-a; d1[3] = 0.0; d1.Normalize(); Vector d2 = c-b; d2[3] = 0.0; d2.Normalize(); Vector n = d1 * d2; n[3] = 0.0; n.Normalize(); return n; } Vector Face::calcNormalAt(Vertex* v) { // Iterate through each edge use until we find // the one that starts at v list::iterator eu_iter; list::iterator endsV = this->edgeUses.end(); for(eu_iter = this->edgeUses.begin(); eu_iter != this->edgeUses.end(); ++eu_iter) { EdgeUse eu = *eu_iter; if(eu.getUseEnd() == v) { // found it endsV = eu_iter; break; } } if(endsV == this->edgeUses.end()) { __ERROR__("getNormalAt called for a vertex that wasn't on this face!"); exit(1); } // *endsV is the edge use that starts a v // find the next one, which starts at V // make sure to loop around if necessary list::iterator startsV = endsV; ++startsV; if(startsV == this->edgeUses.end()) { startsV = this->edgeUses.begin(); } // go! return calcCcwNormal(*endsV, *startsV); } TXS::NormRGB Face::getColorAt(Vertex *v) { // iterate in parallel through edge use list and UV list list::iterator eu_iter = edgeUses.begin(); list::iterator uv_iter = uvs.begin(); for(; eu_iter != edgeUses.end(); ++eu_iter, ++uv_iter) { EdgeUse eu = *eu_iter; if(eu.getUseStart() == v) { TXS::UVs uv = *uv_iter; // NOTE: We are using no wrap for this, because we assume all vertex UVs are in [0,1] return this->txtr->getRgbAtUVNoWrap(uv); } } __ERROR__("CCS::Face::getColorAt called with non-incident vertex!!"); exit(1); return TXS::NormRGB(); } list::iterator Face::getUvIterAtVert(Vertex *v) { // iterate in parallel through edge use list and UV list list::iterator eu_iter = edgeUses.begin(); list::iterator uv_iter = uvs.begin(); for(; eu_iter != edgeUses.end(); ++eu_iter, ++uv_iter) { EdgeUse eu = *eu_iter; if(eu.getUseStart() == v) { // got it! return uv_iter; } } __ERROR__("CCS::Face::getUvIterAtVert called with non-incident vertex!!"); exit(1); return uvs.end(); } void Face::getItersForVert(Vertex *v, list::iterator &eu_out, list::iterator &uv_out) { eu_out = edgeUses.begin(); uv_out = uvs.begin(); for(; eu_out != edgeUses.end(); ++eu_out, ++uv_out) { EdgeUse eu = *eu_out; if(eu.getUseStart() == v) { // found it! // we're done. leave the iters as is return; } } __ERROR__("CCS::Face::getItersForVert called with non-incident vertex!!"); exit(1); }