void MeshManipulator::smoothSurface(const Ray * r) { VertexAdjacency adj = m_topo->getAdjacency(m_intersect->m_componentIdx); Vector3F *p = &m_mesh->vertices()[m_intersect->m_componentIdx]; Vector3F d = adj.center() - *p; *p += d * .7f; Plane pl(m_intersect->m_hitN, m_intersect->m_hitP); Vector3F hit; float t; if(!pl.rayIntersect(*r, hit, t, 1)) return; d = hit - *p; float minD = d.length(); float curD; VertexAdjacency::VertexNeighbor *neighbor; for(neighbor = adj.firstNeighbor(); !adj.isLastNeighbor(); neighbor = adj.nextNeighbor()) { d = hit - *(neighbor->v->m_v); curD = d.length(); if(curD < minD) { minD = curD; m_intersect->m_componentIdx = neighbor->v->getIndex(); } } }
char VertexPath::recursiveFindClosestNeighbor(unsigned vert, unsigned endVert, const Vector3F & endPoint) { VertexAdjacency adj = m_topology->getAdjacency(vert); Vector3F vertP = *(adj.m_v); unsigned closestNei; float minDist = 10e8; for(VertexAdjacency::VertexNeighbor * nei = adj.firstNeighbor(); !adj.isLastNeighbor(); nei = adj.nextNeighbor()) { if(nei->v->getIndex() == endVert) { m_vertices.push_back(endVert); return 1; } Vector3F p = *(nei->v->m_v); float dist = p.distanceTo(endPoint) + vertP.distanceTo(p); if(dist < minDist) { minDist = dist; closestNei = nei->v->getIndex(); } } m_vertices.push_back(closestNei); if(m_vertices.size() > 64) return 1; return recursiveFindClosestNeighbor(closestNei, endVert, endPoint); }