GfVec4f GfHomogeneousCross(const GfVec4f &a, const GfVec4f &b) { GfVec4f ah(GfGetHomogenized(a)); GfVec4f bh(GfGetHomogenized(b)); GfVec3f prod = GfCross(GfVec3f(ah[0], ah[1], ah[2]), GfVec3f(bh[0], bh[1], bh[2])); return GfVec4f(prod[0], prod[1], prod[2], 1); }
GfVec4d GfHomogeneousCross(const GfVec4d &a, const GfVec4d &b) { GfVec4d ah(GfGetHomogenized(a)); GfVec4d bh(GfGetHomogenized(b)); GfVec3d prod = GfCross(GfVec3d(ah[0], ah[1], ah[2]), GfVec3d(bh[0], bh[1], bh[2])); return GfVec4d(prod[0], prod[1], prod[2], 1); }
void Compute(size_t begin, size_t end) { for(size_t i = begin; i < end; ++i) { int offsetIdx = i * 2; int offset = _adjacencyTable[offsetIdx]; int valence = _adjacencyTable[offsetIdx + 1]; int const * e = &_adjacencyTable[offset]; SrcVec3Type normal(0); SrcVec3Type const & curr = _pointsPtr[i]; for (int j=0; j<valence; ++j) { SrcVec3Type const & prev = _pointsPtr[*e++]; SrcVec3Type const & next = _pointsPtr[*e++]; // All meshes have all been converted to rightHanded normal += GfCross(next-curr, prev-curr); } if (true) { // Could defer normalization to shader code normal.Normalize(); } _normals[i] = normal; } }
void GfPlane::Set(const GfVec3d &p0, const GfVec3d &p1, const GfVec3d &p2) { _normal = GfCross(p1 - p0, p2 - p0).GetNormalized(); _distance = GfDot(_normal, p0); }