Void CGameProperty::SetAsVector4( const CVector4f& d ) { m_Tuple4fValue.x = d.GetX(); m_Tuple4fValue.y = d.GetY(); m_Tuple4fValue.z = d.GetZ(); m_Tuple4fValue.w = d.GetW(); }
Void CPlane::TransformProvidingInvert(const CMatrix4x4f& matrix) { CVector4f v = m_Coef; v.Transform( matrix ); Set( v.GetX(), v.GetY(), v.GetZ(), v.GetW() ); Normalize(); }
void TXDualEdge::Project(TXOctree *dualmesh, TXEdge* edge) { if(edge->m_triangles.size()!=2) { edge->m_isboundary = true; return; } TXTriangle* t1 = edge->m_triangles[0]; TXTriangle* t2 = edge->m_triangles[1]; CVector3f tn1 = t1->m_norm; CVector3f tn2 = t2->m_norm; float ff = tn1.Dot(tn2); bool fac = (ff > 0); CVector4f n1(tn1.GetX(),tn1.GetY(),tn1.GetZ(),-tn1.Dot(t1->m_v[0]->m_pos)); CVector4f N1; N1.Absolute(n1); CVector4f n2(tn2.GetX(),tn2.GetY(),tn2.GetZ(),-tn2.Dot(t2->m_v[0]->m_pos)); CVector4f N2; N2.Absolute(n2); CVector4f n; n.Sub(n2,n1); float t[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; // if the edge should be projected on two surfaces, it will intersect // the plane passing orig and the intersection line of the two surfaces // these are the 12 possible intersections if (n.GetX() - n.GetY() != 0) t[1] = - (n1.GetX() - n1.GetY()) / (n.GetX() - n.GetY()); if (n.GetX() - n.GetZ() != 0) t[2] = - (n1.GetX() - n1.GetZ()) / (n.GetX() - n.GetZ()); if (n.GetX() - n.GetW() != 0) t[3] = - (n1.GetX() - n1.GetW()) / (n.GetX() - n.GetW()); if (n.GetX() + n.GetY() != 0) t[4] = - (n1.GetX() + n1.GetY()) / (n.GetX() + n.GetY()); if (n.GetX() + n.GetZ() != 0) t[5] = - (n1.GetX() + n1.GetZ()) / (n.GetX() + n.GetZ()); if (n.GetX() + n.GetW() != 0) t[6] = - (n1.GetX() + n1.GetW()) / (n.GetX() + n.GetW()); if (n.GetY() - n.GetZ() != 0) t[7] = - (n1.GetY() - n1.GetZ()) / (n.GetY() - n.GetZ()); if (n.GetY() - n.GetW() != 0) t[8] = - (n1.GetY() - n1.GetW()) / (n.GetY() - n.GetW()); if (n.GetY() + n.GetZ() != 0) t[9] = - (n1.GetY() + n1.GetZ()) / (n.GetY() + n.GetZ()); if (n.GetY() + n.GetW() != 0)t[10] = - (n1.GetY() + n1.GetW()) / (n.GetY() + n.GetW()); if (n.GetZ() - n.GetW() != 0)t[11] = - (n1.GetZ() - n1.GetW()) / (n.GetZ() - n.GetW()); if (n.GetZ() + n.GetW() != 0)t[12] = - (n1.GetZ() + n1.GetW()) / (n.GetZ() + n.GetW()); int p1 = 0, p2; while (p1 < 13) { p2 = 13; for (int i=1; i<13; i++) { if (t[i] > t[p1] && t[i] < t[p2])p2 = i; } // the part that is projected on one of the surfaces CVector4f pos1, pos2; pos1.ScaleAdd(t[p1],n,n1); pos2.ScaleAdd(t[p2],n,n1); CVector4f mid; mid.Add(pos1,pos2); mid.ScaleInPlace(0.5); CVector4f MID; MID.Absolute(mid); p1 = p2; // the surface projected on int tp; if (MID.GetX() >= MID.GetY() && MID.GetX() >= MID.GetZ() && MID.GetX() >= MID.GetW()) tp = MID.GetX() > 0 ? PX : NX; else if (MID.GetY() >= MID.GetZ() && MID.GetY() >= MID.GetW()) tp = MID.GetY() > 0 ? PY : NY; else if (MID.GetZ() >= MID.GetW()) tp = MID.GetZ() > 0 ? PZ : NZ; else tp = MID.GetW() > 0 ? PW : NW; // project this part on the surface TXDualEdge *dualedge = new TXDualEdge(edge, fac,tp, pos1, pos2); dualmesh[tp].Insert(dualedge); } }
TXDualEdge::TXDualEdge(TXEdge* edge, bool fac, int tp, const CVector4f& pos1, const CVector4f& pos2) { m_e = edge; m_facing = fac; m_checked = false; m_triangles[0] = m_e->m_triangles[0]; m_triangles[1] = m_e->m_triangles[1]; m_eid[0] = m_e->GetIDInTriangle(m_triangles[0]); m_eid[1] = m_e->GetIDInTriangle(m_triangles[1]);; float d1, d2; float eps = float(DBL_EPSILON); switch (tp) { case PX: case NX: d1 = MAX(eps, fabs(pos1.GetX())); d2 = MAX(eps, fabs(pos2.GetX())); m_dp[0] = CVector3f(pos1.GetY()/d1, pos1.GetZ()/d1, pos1.GetW()/d1); m_dp[1] = CVector3f(pos2.GetY()/d2, pos2.GetZ()/d2, pos2.GetW()/d2); break; case PY: case NY: d1 = MAX(eps, fabs(pos1.GetY())); d2 = MAX(eps, fabs(pos2.GetY())); m_dp[0] = CVector3f(pos1.GetZ()/d1, pos1.GetW()/d1, pos1.GetX()/d1); m_dp[1] = CVector3f(pos2.GetZ()/d2, pos2.GetW()/d2, pos2.GetX()/d2); break; case PZ: case NZ: d1 = MAX(eps, fabs(pos1.GetZ())); d2 = MAX(eps, fabs(pos2.GetZ())); m_dp[0] = CVector3f(pos1.GetW()/d1, pos1.GetX()/d1, pos1.GetY()/d1); m_dp[1] = CVector3f(pos2.GetW()/d2, pos2.GetX()/d2, pos2.GetY()/d2); break; case PW: case NW: d1 = MAX(eps, fabs(pos1.GetW())); d2 = MAX(eps, fabs(pos2.GetW())); m_dp[0] = CVector3f(pos1.GetX()/d1, pos1.GetY()/d1, pos1.GetZ()/d1); m_dp[1] = CVector3f(pos2.GetX()/d2, pos2.GetY()/d2, pos2.GetZ()/d2); } }