#include <collision_mesh_build.h>
Nevrax France
Definition at line 107 of file collision_mesh_build.h.
Public Member Functions | |
NLMISC::CVector | computeTrivialTranslation () const |
void | link (bool linkInterior, std::vector< std::string > &errors) |
void | serial (NLMISC::IStream &f) |
void | transform (const NLMISC::CMatrix &tranfo) |
void | translate (const NLMISC::CVector &translation) |
Data Fields | |
std::vector< CCollisionFace > | Faces |
The faces of the mesh. | |
std::vector< NLMISC::CVector > | Vertices |
The vertices of the mesh. | |
Private Types | |
typedef TLinkRelloc::iterator | ItTLinkRelloc |
typedef std::map< CEdgeKey, CEdgeInfo, CEdgeKey > | TLinkRelloc |
|
Definition at line 135 of file collision_mesh_build.h. Referenced by link(). |
|
Definition at line 134 of file collision_mesh_build.h. Referenced by link(). |
|
Definition at line 169 of file collision_mesh_build.h. References NLMISC::CAABBox::extend(), NLMISC::CAABBox::getCenter(), NLMISC::CAABBox::setCenter(), and uint. Referenced by NLPACS::computeRetriever().
|
|
Definition at line 185 of file collision_mesh_build.h. References ItTLinkRelloc, NLPACS::CCollisionFace::Material, sint32, NLPACS::CCollisionFace::Surface, TLinkRelloc, uint, uint32, NLPACS::CCollisionFace::V, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by NLPACS::computeRetriever().
00186 { 00187 uint i, j; 00188 TLinkRelloc relloc; 00189 00190 00191 // check each edge of each face 00192 for (i=0; i<Faces.size(); ++i) 00193 { 00194 if (Faces[i].Surface == CCollisionFace::ExteriorSurface && linkInterior || 00195 Faces[i].Surface >= CCollisionFace::InteriorSurfaceFirst && !linkInterior) 00196 continue; 00197 00198 for (j=0; j<3; ++j) 00199 { 00200 Faces[i].Edge[j] = -1; 00201 00202 uint edge = (j+2)%3; 00203 uint32 va = Faces[i].V[j], 00204 vb = Faces[i].V[(j+1)%3]; 00205 00206 ItTLinkRelloc it; 00207 if ((it = relloc.find(CEdgeKey(va, vb))) != relloc.end()) 00208 { 00209 CCollisionFace &left0 = Faces[(*it).second.Left]; 00210 CCollisionFace &left1 = Faces[i]; 00211 // in this case, the left triangle of the edge has already been found. 00212 // should throw an error 00213 NLMISC::CVector eva = Vertices[va], evb = Vertices[vb]; 00214 static char buf[512]; 00215 sprintf(buf, "Edge issue: (%.2f,%.2f,%.2f)-(%.2f,%.2f,%.2f) [left face already found]\n" 00216 "left.0:%d: v0:(%.2f,%.2f) v1:(%.2f,%.2f), v2:(%.2f,%.2f) surf=%d material=%d\n" 00217 "left.1:%d: v0:(%.2f,%.2f) v1:(%.2f,%.2f), v2:(%.2f,%.2f) surf=%d material=%d", 00218 eva.x, eva.y, eva.z, evb.x, evb.y, evb.z, 00219 (*it).second.Left, Vertices[left0.V[0]].x, Vertices[left0.V[0]].y, Vertices[left0.V[1]].x, Vertices[left0.V[1]].y, Vertices[left0.V[2]].x, Vertices[left0.V[2]].y, Faces[(*it).second.Left].Surface, Faces[(*it).second.Left].Material, 00220 i, Vertices[left1.V[0]].x, Vertices[left1.V[0]].y, Vertices[left1.V[1]].x, Vertices[left1.V[1]].y, Vertices[left1.V[2]].x, Vertices[left1.V[2]].y, Faces[i].Surface, Faces[i].Material); 00221 errors.push_back(std::string(buf)); 00222 continue; 00223 /* nlerror("On face %d, edge %d: left side of edge (%d,%d) already linked to face %d", 00224 i, edge, va, vb, (*it).second.Left);*/ 00225 } 00226 else if ((it = relloc.find(CEdgeKey(vb, va))) != relloc.end()) 00227 { 00228 // in this case, we must check the right face has been set yet 00229 if ((*it).second.Right != -1) 00230 { 00231 CCollisionFace &right0 = Faces[(*it).second.Right]; 00232 CCollisionFace &right1 = Faces[i]; 00233 NLMISC::CVector eva = Vertices[va], evb = Vertices[vb]; 00234 static char buf[512]; 00235 sprintf(buf, "Edge issue: (%.2f,%.2f,%.2f)-(%.2f,%.2f,%.2f) [right face already found]\n" 00236 "right.0:%d: v0:(%.2f,%.2f) v1:(%.2f,%.2f), v2:(%.2f,%.2f)\n" 00237 "right.1:%d: v0:(%.2f,%.2f) v1:(%.2f,%.2f), v2:(%.2f,%.2f)", 00238 eva.x, eva.y, eva.z, evb.x, evb.y, evb.z, 00239 (*it).second.Right, Vertices[right0.V[0]].x, Vertices[right0.V[0]].y, Vertices[right0.V[1]].x, Vertices[right0.V[1]].y, Vertices[right0.V[2]].x, Vertices[right0.V[2]].y, 00240 i, Vertices[right1.V[0]].x, Vertices[right1.V[0]].y, Vertices[right1.V[1]].x, Vertices[right1.V[1]].y, Vertices[right1.V[2]].x, Vertices[right1.V[2]].y); 00241 errors.push_back(std::string(buf)); 00242 continue; 00243 /* nlerror("On face %d, edge %d: right side of edge (%d,%d) already linked to face %d", 00244 i, edge, vb, va, (*it).second.Right);*/ 00245 } 00246 00247 (*it).second.Right = i; 00248 (*it).second.RightEdge = edge; 00249 } 00250 else 00251 { 00252 // if the edge wasn't present yet, create it and set it up. 00253 relloc.insert(std::make_pair(CEdgeKey(va, vb), CEdgeInfo(i, edge, -1, -1))); 00254 } 00255 } 00256 } 00257 00258 // for each checked edge, update the edge info inside the faces 00259 ItTLinkRelloc it; 00260 for (it=relloc.begin(); it!=relloc.end(); ++it) 00261 { 00262 sint32 left, leftEdge; 00263 sint32 right, rightEdge; 00264 00265 // get the link info on the edge 00266 left = (*it).second.Left; 00267 leftEdge = (*it).second.LeftEdge; 00268 right = (*it).second.Right; 00269 rightEdge = (*it).second.RightEdge; 00270 00271 // update both faces 00272 if (left != -1) 00273 Faces[left].Edge[leftEdge] = right; 00274 if (right != -1) 00275 Faces[right].Edge[rightEdge] = left; 00276 } 00277 } |
|
Definition at line 149 of file collision_mesh_build.h. References NLMISC::IStream::serialCont().
00150 { 00151 f.serialCont(Vertices); 00152 f.serialCont(Faces); 00153 } |
|
Definition at line 162 of file collision_mesh_build.h. References uint.
|
|
Definition at line 155 of file collision_mesh_build.h. References uint. Referenced by NLPACS::computeRetriever().
|
|
The faces of the mesh.
Definition at line 145 of file collision_mesh_build.h. Referenced by NLPACS::buildExteriorMesh(), NLPACS::buildSnapping(), NLPACS::computeSurfaceBorders(), NLPACS::computeSurfaceQuadTree(), NLPACS::floodFillSurfaces(), NLPACS::followBorder(), NLPACS::CInteriorSurface::getFace(), NLPACS::CInteriorSurface::getNeighbor(), and NLPACS::resetEdgeFlags(). |
|
The vertices of the mesh.
Definition at line 142 of file collision_mesh_build.h. Referenced by NLPACS::buildExteriorMesh(), NLPACS::buildSnapping(), NLPACS::computeSurfaceCenter(), NLPACS::computeSurfaceQuadTree(), and NLPACS::followBorder(). |