15#ifndef DRACO_MESH_CORNER_TABLE_ITERATORS_H_
16#define DRACO_MESH_CORNER_TABLE_ITERATORS_H_
25template <
class CornerTableT>
37 : corner_table_(nullptr),
38 start_corner_(kInvalidCornerIndex),
39 corner_(start_corner_),
40 left_traversal_(true) {}
44 : corner_table_(table),
45 start_corner_(table->LeftMostCorner(vert_id)),
46 corner_(start_corner_),
47 left_traversal_(true) {}
51 CornerIndex ring_corner = left_traversal_ ? corner_table_->Previous(corner_)
52 : corner_table_->Next(corner_);
53 return corner_table_->Vertex(ring_corner);
59 return left_traversal_ ? corner_table_->Next(corner_)
60 : corner_table_->Previous(corner_);
64 bool End()
const {
return corner_ == kInvalidCornerIndex; }
68 if (left_traversal_) {
69 corner_ = corner_table_->SwingLeft(corner_);
70 if (corner_ == kInvalidCornerIndex) {
72 corner_ = start_corner_;
73 left_traversal_ =
false;
74 }
else if (corner_ == start_corner_) {
76 corner_ = kInvalidCornerIndex;
81 corner_ = corner_table_->SwingRight(corner_);
97 return corner_ != other.corner_ || start_corner_ != other.start_corner_;
106 ret.corner_ = kInvalidCornerIndex;
111 const CornerTableT *corner_table_;
117 bool left_traversal_;
121template <
class CornerTableT>
133 : corner_table_(nullptr),
134 start_corner_(kInvalidCornerIndex),
135 corner_(start_corner_) {}
139 : corner_table_(table),
140 start_corner_(table->FirstCorner(face_id)),
141 corner_(start_corner_) {
144 if (corner_table_->Opposite(corner_) == kInvalidCornerIndex) {
145 FindNextFaceNeighbor();
151 return corner_table_->Face(corner_table_->Opposite(corner_));
155 bool End()
const {
return corner_ == kInvalidCornerIndex; }
158 void Next() { FindNextFaceNeighbor(); }
172 return corner_ != other.corner_ || start_corner_ != other.start_corner_;
181 ret.corner_ = kInvalidCornerIndex;
187 void FindNextFaceNeighbor() {
188 while (corner_ != kInvalidCornerIndex) {
189 corner_ = corner_table_->Next(corner_);
190 if (corner_ == start_corner_) {
191 corner_ = kInvalidCornerIndex;
194 if (corner_table_->Opposite(corner_) != kInvalidCornerIndex) {
201 const CornerTableT *corner_table_;
209template <
class CornerTableT = CornerTable>
221 : corner_table_(nullptr),
223 corner_(start_corner_),
224 left_traversal_(true) {}
228 : corner_table_(table),
229 start_corner_(table->LeftMostCorner(vert_id)),
230 corner_(start_corner_),
231 left_traversal_(true) {}
235 : corner_table_(table),
236 start_corner_(corner_id),
237 corner_(start_corner_),
238 left_traversal_(true) {}
244 bool End()
const {
return corner_ == kInvalidCornerIndex; }
248 if (left_traversal_) {
249 corner_ = corner_table_->SwingLeft(corner_);
250 if (corner_ == kInvalidCornerIndex) {
252 corner_ = corner_table_->SwingRight(start_corner_);
253 left_traversal_ =
false;
254 }
else if (corner_ == start_corner_) {
256 corner_ = kInvalidCornerIndex;
261 corner_ = corner_table_->SwingRight(corner_);
277 return corner_ != other.corner_ || start_corner_ != other.start_corner_;
286 ret.corner_ = kInvalidCornerIndex;
298 const CornerTableT *corner_table_;
304 bool left_traversal_;
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