GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
corner_table_iterators.h
Go to the documentation of this file.
1// Copyright 2016 The Draco Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15#ifndef DRACO_MESH_CORNER_TABLE_ITERATORS_H_
16#define DRACO_MESH_CORNER_TABLE_ITERATORS_H_
17
18#include <iterator>
19
21
22namespace draco {
23
24// Class for iterating over vertices in a 1-ring around the specified vertex.
25template <class CornerTableT>
27 public:
28 // Iterator traits expected by std libraries.
29 using iterator_category = std::forward_iterator_tag;
31 using difference_type = std::ptrdiff_t;
34
35 // std::iterator interface requires a default constructor.
37 : corner_table_(nullptr),
38 start_corner_(kInvalidCornerIndex),
39 corner_(start_corner_),
40 left_traversal_(true) {}
41
42 // Create the iterator from the provided corner table and the central vertex.
43 VertexRingIterator(const CornerTableT *table, VertexIndex vert_id)
44 : corner_table_(table),
45 start_corner_(table->LeftMostCorner(vert_id)),
46 corner_(start_corner_),
47 left_traversal_(true) {}
48
49 // Gets the last visited ring vertex.
51 CornerIndex ring_corner = left_traversal_ ? corner_table_->Previous(corner_)
52 : corner_table_->Next(corner_);
53 return corner_table_->Vertex(ring_corner);
54 }
55
56 // Returns one of the corners opposite to the edge connecting the currently
57 // iterated ring vertex with the central vertex.
59 return left_traversal_ ? corner_table_->Next(corner_)
60 : corner_table_->Previous(corner_);
61 }
62
63 // Returns true when all ring vertices have been visited.
64 bool End() const { return corner_ == kInvalidCornerIndex; }
65
66 // Proceeds to the next ring vertex if possible.
67 void Next() {
68 if (left_traversal_) {
69 corner_ = corner_table_->SwingLeft(corner_);
70 if (corner_ == kInvalidCornerIndex) {
71 // Open boundary reached.
72 corner_ = start_corner_;
73 left_traversal_ = false;
74 } else if (corner_ == start_corner_) {
75 // End reached.
76 corner_ = kInvalidCornerIndex;
77 }
78 } else {
79 // Go to the right until we reach a boundary there (no explicit check
80 // is needed in this case).
81 corner_ = corner_table_->SwingRight(corner_);
82 }
83 }
84
85 // std::iterator interface.
86 value_type operator*() const { return Vertex(); }
88 Next();
89 return *this;
90 }
92 const VertexRingIterator result = *this;
93 ++(*this);
94 return result;
95 }
96 bool operator!=(const VertexRingIterator &other) const {
97 return corner_ != other.corner_ || start_corner_ != other.start_corner_;
98 }
99 bool operator==(const VertexRingIterator &other) const {
100 return !this->operator!=(other);
101 }
102
103 // Helper function for getting a valid end iterator.
105 VertexRingIterator ret = other;
106 ret.corner_ = kInvalidCornerIndex;
107 return ret;
108 }
109
110 private:
111 const CornerTableT *corner_table_;
112 // The first processed corner.
113 CornerIndex start_corner_;
114 // The last processed corner.
115 CornerIndex corner_;
116 // Traversal direction.
117 bool left_traversal_;
118};
119
120// Class for iterating over faces adjacent to the specified input face.
121template <class CornerTableT>
123 public:
124 // Iterator traits expected by std libraries.
125 using iterator_category = std::forward_iterator_tag;
127 using difference_type = std::ptrdiff_t;
130
131 // std::iterator interface requires a default constructor.
133 : corner_table_(nullptr),
134 start_corner_(kInvalidCornerIndex),
135 corner_(start_corner_) {}
136
137 // Create the iterator from the provided corner table and the central vertex.
138 FaceAdjacencyIterator(const CornerTableT *table, FaceIndex face_id)
139 : corner_table_(table),
140 start_corner_(table->FirstCorner(face_id)),
141 corner_(start_corner_) {
142 // We need to start with a corner that has a valid opposite face (if
143 // there is any such corner).
144 if (corner_table_->Opposite(corner_) == kInvalidCornerIndex) {
145 FindNextFaceNeighbor();
146 }
147 }
148
149 // Gets the last visited adjacent face.
150 FaceIndex Face() const {
151 return corner_table_->Face(corner_table_->Opposite(corner_));
152 }
153
154 // Returns true when all adjacent faces have been visited.
155 bool End() const { return corner_ == kInvalidCornerIndex; }
156
157 // Proceeds to the next adjacent face if possible.
158 void Next() { FindNextFaceNeighbor(); }
159
160 // std::iterator interface.
161 value_type operator*() const { return Face(); }
163 Next();
164 return *this;
165 }
167 const FaceAdjacencyIterator result = *this;
168 ++(*this);
169 return result;
170 }
171 bool operator!=(const FaceAdjacencyIterator &other) const {
172 return corner_ != other.corner_ || start_corner_ != other.start_corner_;
173 }
174 bool operator==(const FaceAdjacencyIterator &other) const {
175 return !this->operator!=(other);
176 }
177
178 // Helper function for getting a valid end iterator.
181 ret.corner_ = kInvalidCornerIndex;
182 return ret;
183 }
184
185 private:
186 // Finds the next corner with a valid opposite face.
187 void FindNextFaceNeighbor() {
188 while (corner_ != kInvalidCornerIndex) {
189 corner_ = corner_table_->Next(corner_);
190 if (corner_ == start_corner_) {
191 corner_ = kInvalidCornerIndex;
192 return;
193 }
194 if (corner_table_->Opposite(corner_) != kInvalidCornerIndex) {
195 // Valid opposite face.
196 return;
197 }
198 }
199 }
200
201 const CornerTableT *corner_table_;
202 // The first processed corner.
203 CornerIndex start_corner_;
204 // The last processed corner.
205 CornerIndex corner_;
206};
207
208// Class for iterating over corners attached to a specified vertex.
209template <class CornerTableT = CornerTable>
211 public:
212 // Iterator traits expected by std libraries.
213 using iterator_category = std::forward_iterator_tag;
215 using difference_type = std::ptrdiff_t;
218
219 // std::iterator interface requires a default constructor.
221 : corner_table_(nullptr),
222 start_corner_(-1),
223 corner_(start_corner_),
224 left_traversal_(true) {}
225
226 // Create the iterator from the provided corner table and the central vertex.
227 VertexCornersIterator(const CornerTableT *table, VertexIndex vert_id)
228 : corner_table_(table),
229 start_corner_(table->LeftMostCorner(vert_id)),
230 corner_(start_corner_),
231 left_traversal_(true) {}
232
233 // Create the iterator from the provided corner table and the first corner.
234 VertexCornersIterator(const CornerTableT *table, CornerIndex corner_id)
235 : corner_table_(table),
236 start_corner_(corner_id),
237 corner_(start_corner_),
238 left_traversal_(true) {}
239
240 // Gets the last visited corner.
241 CornerIndex Corner() const { return corner_; }
242
243 // Returns true when all ring vertices have been visited.
244 bool End() const { return corner_ == kInvalidCornerIndex; }
245
246 // Proceeds to the next corner if possible.
247 void Next() {
248 if (left_traversal_) {
249 corner_ = corner_table_->SwingLeft(corner_);
250 if (corner_ == kInvalidCornerIndex) {
251 // Open boundary reached.
252 corner_ = corner_table_->SwingRight(start_corner_);
253 left_traversal_ = false;
254 } else if (corner_ == start_corner_) {
255 // End reached.
256 corner_ = kInvalidCornerIndex;
257 }
258 } else {
259 // Go to the right until we reach a boundary there (no explicit check
260 // is needed in this case).
261 corner_ = corner_table_->SwingRight(corner_);
262 }
263 }
264
265 // std::iterator interface.
266 CornerIndex operator*() const { return Corner(); }
268 Next();
269 return *this;
270 }
272 const VertexCornersIterator result = *this;
273 ++(*this);
274 return result;
275 }
276 bool operator!=(const VertexCornersIterator &other) const {
277 return corner_ != other.corner_ || start_corner_ != other.start_corner_;
278 }
279 bool operator==(const VertexCornersIterator &other) const {
280 return !this->operator!=(other);
281 }
282
283 // Helper function for getting a valid end iterator.
286 ret.corner_ = kInvalidCornerIndex;
287 return ret;
288 }
289
290 protected:
291 const CornerTableT *corner_table() const { return corner_table_; }
292 CornerIndex start_corner() const { return start_corner_; }
293 CornerIndex &corner() { return corner_; }
294 bool is_left_traversal() const { return left_traversal_; }
295 void swap_traversal() { left_traversal_ = !left_traversal_; }
296
297 private:
298 const CornerTableT *corner_table_;
299 // The first processed corner.
300 CornerIndex start_corner_;
301 // The last processed corner.
302 CornerIndex corner_;
303 // Traversal direction.
304 bool left_traversal_;
305};
306
307} // namespace draco
308
309#endif // DRACO_MESH_CORNER_TABLE_ITERATORS_H_
static FaceAdjacencyIterator EndIterator(FaceAdjacencyIterator other)
Definition corner_table_iterators.h:179
value_type operator*() const
Definition corner_table_iterators.h:161
FaceIndex Face() const
Definition corner_table_iterators.h:150
bool operator==(const FaceAdjacencyIterator &other) const
Definition corner_table_iterators.h:174
FaceAdjacencyIterator & operator++()
Definition corner_table_iterators.h:162
std::ptrdiff_t difference_type
Definition corner_table_iterators.h:127
FaceIndex value_type
Definition corner_table_iterators.h:126
std::forward_iterator_tag iterator_category
Definition corner_table_iterators.h:125
FaceAdjacencyIterator()
Definition corner_table_iterators.h:132
FaceIndex & reference
Definition corner_table_iterators.h:129
bool End() const
Definition corner_table_iterators.h:155
FaceIndex * pointer
Definition corner_table_iterators.h:128
bool operator!=(const FaceAdjacencyIterator &other) const
Definition corner_table_iterators.h:171
void Next()
Definition corner_table_iterators.h:158
FaceAdjacencyIterator operator++(int)
Definition corner_table_iterators.h:166
FaceAdjacencyIterator(const CornerTableT *table, FaceIndex face_id)
Definition corner_table_iterators.h:138
bool End() const
Definition corner_table_iterators.h:244
bool operator==(const VertexCornersIterator &other) const
Definition corner_table_iterators.h:279
VertexCornersIterator()
Definition corner_table_iterators.h:220
VertexCornersIterator & operator++()
Definition corner_table_iterators.h:267
VertexCornersIterator(const CornerTableT *table, CornerIndex corner_id)
Definition corner_table_iterators.h:234
bool is_left_traversal() const
Definition corner_table_iterators.h:294
std::forward_iterator_tag iterator_category
Definition corner_table_iterators.h:213
CornerIndex start_corner() const
Definition corner_table_iterators.h:292
CornerIndex & corner()
Definition corner_table_iterators.h:293
VertexCornersIterator(const CornerTableT *table, VertexIndex vert_id)
Definition corner_table_iterators.h:227
CornerIndex Corner() const
Definition corner_table_iterators.h:241
void swap_traversal()
Definition corner_table_iterators.h:295
CornerIndex & reference
Definition corner_table_iterators.h:217
VertexCornersIterator operator++(int)
Definition corner_table_iterators.h:271
bool operator!=(const VertexCornersIterator &other) const
Definition corner_table_iterators.h:276
std::ptrdiff_t difference_type
Definition corner_table_iterators.h:215
CornerIndex operator*() const
Definition corner_table_iterators.h:266
CornerIndex value_type
Definition corner_table_iterators.h:214
const CornerTableT * corner_table() const
Definition corner_table_iterators.h:291
static VertexCornersIterator EndIterator(VertexCornersIterator other)
Definition corner_table_iterators.h:284
void Next()
Definition corner_table_iterators.h:247
CornerIndex * pointer
Definition corner_table_iterators.h:216
VertexRingIterator & operator++()
Definition corner_table_iterators.h:87
bool operator!=(const VertexRingIterator &other) const
Definition corner_table_iterators.h:96
value_type operator*() const
Definition corner_table_iterators.h:86
bool operator==(const VertexRingIterator &other) const
Definition corner_table_iterators.h:99
VertexIndex & reference
Definition corner_table_iterators.h:33
VertexIndex * pointer
Definition corner_table_iterators.h:32
void Next()
Definition corner_table_iterators.h:67
std::forward_iterator_tag iterator_category
Definition corner_table_iterators.h:29
VertexIndex Vertex() const
Definition corner_table_iterators.h:50
VertexIndex value_type
Definition corner_table_iterators.h:30
std::ptrdiff_t difference_type
Definition corner_table_iterators.h:31
static VertexRingIterator EndIterator(VertexRingIterator other)
Definition corner_table_iterators.h:104
bool End() const
Definition corner_table_iterators.h:64
VertexRingIterator()
Definition corner_table_iterators.h:36
VertexRingIterator operator++(int)
Definition corner_table_iterators.h:91
VertexRingIterator(const CornerTableT *table, VertexIndex vert_id)
Definition corner_table_iterators.h:43
CornerIndex EdgeCorner() const
Definition corner_table_iterators.h:58
ret($return)
Definition mesh_login_result.php:5
Definition attribute_octahedron_transform.cc:21
VertexIndex VertexIndex
Definition mesh_edgebreaker_encoder_impl.cc:37
CornerIndex CornerIndex
Definition mesh_edgebreaker_encoder_impl.cc:35
FaceIndex FaceIndex
Definition mesh_edgebreaker_encoder_impl.cc:36