Developer Documentation
StatusAttrib.cc
1/*===========================================================================*\
2 * *
3 * OpenVolumeMesh *
4 * Copyright (C) 2011 by Computer Graphics Group, RWTH Aachen *
5 * www.openvolumemesh.org *
6 * *
7 *---------------------------------------------------------------------------*
8 * This file is part of OpenVolumeMesh. *
9 * *
10 * OpenVolumeMesh is free software: you can redistribute it and/or modify *
11 * it under the terms of the GNU Lesser General Public License as *
12 * published by the Free Software Foundation, either version 3 of *
13 * the License, or (at your option) any later version with the *
14 * following exceptions: *
15 * *
16 * If other files instantiate templates or use macros *
17 * or inline functions from this file, or you compile this file and *
18 * link it with other files to produce an executable, this file does *
19 * not by itself cause the resulting executable to be covered by the *
20 * GNU Lesser General Public License. This exception does not however *
21 * invalidate any other reasons why the executable file might be *
22 * covered by the GNU Lesser General Public License. *
23 * *
24 * OpenVolumeMesh is distributed in the hope that it will be useful, *
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
27 * GNU Lesser General Public License for more details. *
28 * *
29 * You should have received a copy of the GNU LesserGeneral Public *
30 * License along with OpenVolumeMesh. If not, *
31 * see <http://www.gnu.org/licenses/>. *
32 * *
33\*===========================================================================*/
34
35
36#ifndef NDEBUG
37#include <iostream>
38#endif
39
40#include <OpenVolumeMesh/Core/TopologyKernel.hh>
41#include <OpenVolumeMesh/Attribs/StatusAttrib.hh>
42
43namespace OpenVolumeMesh {
44
45StatusAttrib::StatusAttrib(TopologyKernel& _kernel) :
46kernel_(&_kernel),
47v_status_(_kernel.request_vertex_property<OpenVolumeMeshStatus>("vertex_status")),
48e_status_(_kernel.request_edge_property<OpenVolumeMeshStatus>("edge_status")),
49he_status_(_kernel.request_halfedge_property<OpenVolumeMeshStatus>("halfedge_status")),
50f_status_(_kernel.request_face_property<OpenVolumeMeshStatus>("face_status")),
51hf_status_(_kernel.request_halfface_property<OpenVolumeMeshStatus>("halfface_status")),
52c_status_(_kernel.request_cell_property<OpenVolumeMeshStatus>("cell_status")),
53m_status_(_kernel.request_mesh_property<OpenVolumeMeshStatus>("mesh_status")) {
54
55}
56
57//========================================================================================
58
59StatusAttrib::~StatusAttrib() {
60
61}
62
63//========================================================================================
64
65void StatusAttrib::mark_higher_dim_entities() {
66
67 // Edges
68 if(kernel_->has_vertex_bottom_up_incidences()) {
69
70 for(VertexIter v_it = kernel_->vertices_begin(); v_it != kernel_->vertices_end(); ++v_it) {
71 if(v_status_[*v_it].deleted()) {
72 for(VertexOHalfEdgeIter voh_it = kernel_->voh_iter(*v_it);
73 voh_it.valid(); ++voh_it) {
74 e_status_[kernel_->edge_handle(*voh_it)].set_deleted(true);
75 }
76 }
77 }
78 } else {
79
80 for(EdgeIter e_it = kernel_->edges_begin(); e_it != kernel_->edges_end(); ++e_it) {
81 if(v_status_[kernel_->edge(*e_it).from_vertex()].deleted() ||
82 v_status_[kernel_->edge(*e_it).to_vertex()].deleted()) {
83 e_status_[*e_it].set_deleted(true);
84 }
85 }
86 }
87
88 // Faces
89 if(kernel_->has_edge_bottom_up_incidences()) {
90
91 for(EdgeIter e_it = kernel_->edges_begin(); e_it != kernel_->edges_end(); ++e_it) {
92 if(e_status_[*e_it].deleted()) {
93 for(HalfEdgeHalfFaceIter hehf_it = kernel_->hehf_iter(kernel_->halfedge_handle(*e_it, 0));
94 hehf_it.valid(); ++hehf_it) {
95 f_status_[kernel_->face_handle(*hehf_it)].set_deleted(true);
96 }
97 }
98 }
99 } else {
100
101 for(FaceIter f_it = kernel_->faces_begin(); f_it != kernel_->faces_end(); ++f_it) {
102
103 const std::vector<HalfEdgeHandle>& hes = kernel_->face(*f_it).halfedges();
104 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes.begin(),
105 he_end = hes.end(); he_it != he_end; ++he_it) {
106 if(e_status_[kernel_->edge_handle(*he_it)].deleted()) {
107 f_status_[*f_it].set_deleted(true);
108 break;
109 }
110 }
111 }
112 }
113
114 // Cells
115 if(kernel_->has_face_bottom_up_incidences()) {
116
117 for(FaceIter f_it = kernel_->faces_begin(); f_it != kernel_->faces_end(); ++f_it) {
118 if(f_status_[*f_it].deleted()) {
119 CellHandle c0 = kernel_->incident_cell(kernel_->halfface_handle(*f_it, 0));
120 CellHandle c1 = kernel_->incident_cell(kernel_->halfface_handle(*f_it, 1));
121 if(c0.is_valid()) {
122 c_status_[c0].set_deleted(true);
123 }
124 if(c1.is_valid()) {
125 c_status_[c1].set_deleted(true);
126 }
127 }
128 }
129 } else {
130
131 for(CellIter c_it = kernel_->cells_begin(); c_it != kernel_->cells_end(); ++c_it) {
132
133 const std::vector<HalfFaceHandle>& hfs = kernel_->cell(*c_it).halffaces();
134 for(std::vector<HalfFaceHandle>::const_iterator hf_it = hfs.begin(),
135 hf_end = hfs.end(); hf_it != hf_end; ++hf_it) {
136 if(f_status_[kernel_->face_handle(*hf_it)].deleted()) {
137 c_status_[*c_it].set_deleted(true);
138 break;
139 }
140 }
141 }
142 }
143}
144
145//========================================================================================
146
147void StatusAttrib::garbage_collection(bool _preserveManifoldness) {
148 std::vector<VertexHandle*> vh_empty;
149 std::vector<HalfEdgeHandle*> hh_empty;
150 std::vector<HalfFaceHandle*> hfh_empty;
151 std::vector<CellHandle*> ch_empty;
152
153 garbage_collection(vh_empty, hh_empty, hfh_empty, ch_empty, _preserveManifoldness);
154}
155
156
157} // Namespace OpenVolumeMesh