Exemple #1
0
void PartialAction :: deleteEdgeFace ( WingedMesh& mesh, WingedEdge& edge
                                     , AffectedFaces& affectedFaces) 
{
#ifndef NDEBUG
  const unsigned int numEdgesLeft  = edge.leftFaceRef  ().numEdges ();
  const unsigned int numEdgesRight = edge.rightFaceRef ().numEdges ();
#endif
  assert (numEdgesLeft  >= 2);
  assert (numEdgesRight >= 2);

  WingedFace& faceToDelete  = edge.rightFaceRef ();
  WingedFace& remainingFace = edge.leftFaceRef ();

  assert (faceToDelete != remainingFace);

  affectedFaces.remove (faceToDelete);
  affectedFaces.insert (remainingFace);

  dissolveEdgeFace (edge);

  mesh.deleteEdge (edge);
  mesh.deleteFace (faceToDelete); 

  assert (remainingFace.numEdges () >= 3);
  assert (remainingFace.numEdges () == numEdgesLeft + numEdgesRight - 2);
}
Exemple #2
0
 void insert (const AffectedFaces& faces) {
   for (WingedFace* f : faces.faces ()) {
     this->insert (*f);
   }
   for (WingedFace* f : faces.uncommitedFaces ()) {
     this->insert (*f);
   }
 }
Exemple #3
0
void Action :: sculpt (const SculptBrush& brush) { 
  AffectedFaces domain;

  brush.sculpt (domain);

  if (domain.isEmpty () == false) {
    postprocessEdges (brush, domain);
  }
  if (brush.meshRef ().isEmpty () == false) {
    Action::finalize (brush.meshRef (), domain);
  }
}
Exemple #4
0
void PartialAction :: relaxEdge (WingedMesh& mesh, WingedEdge& edge, AffectedFaces& affectedFaces) {
  if (relaxableEdge (edge)) {
    affectedFaces.insert (edge.leftFaceRef  ());
    affectedFaces.insert (edge.rightFaceRef ());
    PartialAction::flipEdge (mesh, edge);
  }
}
Exemple #5
0
void Action :: smoothMesh (WingedMesh& mesh) {
  if (mesh.isEmpty () == false) {
    AffectedFaces faces;

    mesh.forEachEdge ([&mesh, &faces] (WingedEdge& e) {
      faces.insert (e.leftFaceRef ());
      faces.insert (e.rightFaceRef ());

      PartialAction::relaxEdge (mesh, e, faces);

      faces.commit ();
    });

    PartialAction::smooth (mesh, faces.toVertexSet (), 1, faces);
    Action::finalize (mesh, faces);
  }
}
void PartialAction :: deleteValence3Vertex ( WingedMesh& mesh, WingedVertex& vertex
                                           , AffectedFaces& affectedFaces )
{
  assert (vertex.valence () == 3);

  for (const WingedVertex& v : vertex.adjacentVertices ()) {
    if (v.valence () == 3) {
      mesh         .reset ();
      affectedFaces.reset ();
      return;
    }
  }
  WingedFace& remainingFace = PartialAction::deleteVertex (mesh, vertex, affectedFaces);

  remainingFace.writeIndices (mesh);
}
void PartialAction :: triangulate6Gon ( WingedMesh& mesh, WingedFace& f
                                      , AffectedFaces& affectedFaces ) 
{
  assert (f.numEdges () == 6);
  /*     4
   *    /c\
   *   5---3
   *  /a\f/b\
   * 0---1---2
   */
  WingedEdge& e01  = f.edgeRef ();
  WingedEdge& e12  = f.edgeRef ().successorRef (f,0);
  WingedEdge& e23  = f.edgeRef ().successorRef (f,1);
  WingedEdge& e34  = f.edgeRef ().successorRef (f,2);
  WingedEdge& e45  = f.edgeRef ().successorRef (f,3);
  WingedEdge& e50  = f.edgeRef ().successorRef (f,4);

  WingedVertex& v0 = e01.firstVertexRef (f);
  WingedVertex& v1 = e12.firstVertexRef (f);
  WingedVertex& v2 = e23.firstVertexRef (f);
  WingedVertex& v3 = e34.firstVertexRef (f);
  WingedVertex& v4 = e45.firstVertexRef (f);
  WingedVertex& v5 = e50.firstVertexRef (f);

  WingedFace& a = mesh.addFace (PrimTriangle (mesh,v0,v1,v5));
  WingedFace& b = mesh.addFace (PrimTriangle (mesh,v1,v2,v3));
  WingedFace& c = mesh.addFace (PrimTriangle (mesh,v3,v4,v5));

  a.edge (&e01);
  b.edge (&e23);
  c.edge (&e45);

  WingedEdge& e13 = mesh.addEdge ();
  WingedEdge& e35 = mesh.addEdge ();
  WingedEdge& e51 = mesh.addEdge ();

  e13.setGeometry (&v1,&v3,&f,&b,&e51,&e35,&e23,&e12);
  e35.setGeometry (&v3,&v5,&f,&c,&e13,&e51,&e45,&e34);
  e51.setGeometry (&v5,&v1,&f,&a,&e35,&e13,&e01,&e50);

  e01.face        (f,&a);
  e01.predecessor (a,&e50);
  e01.successor   (a,&e51);

  e12.face        (f,&b);
  e12.predecessor (b,&e13);
  e12.successor   (b,&e23);

  e23.face        (f,&b);
  e23.predecessor (b,&e12);
  e23.successor   (b,&e13);

  e34.face        (f,&c);
  e34.predecessor (c,&e35);
  e34.successor   (c,&e45);

  e45.face        (f,&c);
  e45.predecessor (c,&e34);
  e45.successor   (c,&e35);

  e50.face        (f,&a);
  e50.predecessor (a,&e51);
  e50.successor   (a,&e01);

  f.edge (&e13);

  f.writeIndices (mesh);
  a.writeIndices (mesh);
  b.writeIndices (mesh);
  c.writeIndices (mesh);

  affectedFaces.insert (f);
  affectedFaces.insert (a);
  affectedFaces.insert (b);
  affectedFaces.insert (c);
}