15#ifndef DRACO_COMPRESSION_MESH_MESH_EDGEBREAKER_TRAVERSAL_VALENCE_ENCODER_H_
16#define DRACO_COMPRESSION_MESH_MESH_EDGEBREAKER_TRAVERSAL_VALENCE_ENCODER_H_
38 : corner_table_(nullptr),
40 last_corner_(kInvalidCornerIndex),
54 vertex_valences_.resize(corner_table_->num_vertices());
55 for (
VertexIndex i(0); i < static_cast<uint32_t>(vertex_valences_.size());
57 vertex_valences_[i] = corner_table_->Valence(
VertexIndex(i));
63 corner_to_vertex_map_.resize(corner_table_->num_corners());
64 for (
CornerIndex i(0); i < corner_table_->num_corners(); ++i) {
65 corner_to_vertex_map_[i] = corner_table_->Vertex(i);
67 const int32_t num_unique_valences = max_valence_ - min_valence_ + 1;
69 context_symbols_.resize(num_unique_valences);
83 const CornerIndex next = corner_table_->Next(last_corner_);
84 const CornerIndex prev = corner_table_->Previous(last_corner_);
89 const int active_valence = vertex_valences_[corner_to_vertex_map_[next]];
96 vertex_valences_[corner_to_vertex_map_[next]] -= 1;
97 vertex_valences_[corner_to_vertex_map_[prev]] -= 1;
118 int num_left_faces = 0;
120 while (act_c != kInvalidCornerIndex) {
121 if (
encoder_impl()->IsFaceEncoded(corner_table_->Face(act_c))) {
125 act_c = corner_table_->Opposite(corner_table_->Next(act_c));
127 vertex_valences_[corner_to_vertex_map_[last_corner_]] =
132 const int new_vert_id =
static_cast<int>(vertex_valences_.size());
133 int num_right_faces = 0;
135 act_c = corner_table_->Opposite(next);
136 while (act_c != kInvalidCornerIndex) {
137 if (
encoder_impl()->IsFaceEncoded(corner_table_->Face(act_c))) {
142 corner_to_vertex_map_[corner_table_->Next(act_c)] = new_vert_id;
143 act_c = corner_table_->Opposite(corner_table_->Previous(act_c));
145 vertex_valences_.push_back(num_right_faces + 1);
150 vertex_valences_[corner_to_vertex_map_[last_corner_]] -= 1;
151 vertex_valences_[corner_to_vertex_map_[next]] -= 1;
152 vertex_valences_[corner_to_vertex_map_[prev]] -= 2;
156 vertex_valences_[corner_to_vertex_map_[last_corner_]] -= 1;
157 vertex_valences_[corner_to_vertex_map_[next]] -= 2;
158 vertex_valences_[corner_to_vertex_map_[prev]] -= 1;
161 vertex_valences_[corner_to_vertex_map_[last_corner_]] -= 2;
162 vertex_valences_[corner_to_vertex_map_[next]] -= 2;
163 vertex_valences_[corner_to_vertex_map_[prev]] -= 2;
169 if (prev_symbol_ != -1) {
171 if (active_valence < min_valence_) {
172 clamped_valence = min_valence_;
173 }
else if (active_valence > max_valence_) {
174 clamped_valence = max_valence_;
176 clamped_valence = active_valence;
179 const int context = clamped_valence - min_valence_;
180 context_symbols_[context].push_back(
184 prev_symbol_ = symbol;
193 for (
int i = 0; i < context_symbols_.size(); ++i) {
196 if (context_symbols_[i].
size() > 0) {
198 static_cast<int>(context_symbols_[i].
size()), 1,
nullptr,
214 int32_t prev_symbol_;
221 std::vector<std::vector<uint32_t>> context_symbols_;
Definition corner_table.h:53
Definition draco_index_type_vector.h:32
Definition mesh_edgebreaker_encoder_impl_interface.h:33
virtual const CornerTable * GetCornerTable() const =0
EncoderBuffer * GetOutputBuffer()
Definition mesh_edgebreaker_traversal_encoder.h:120
const MeshEdgebreakerEncoderImplInterface * encoder_impl() const
Definition mesh_edgebreaker_traversal_encoder.h:121
MeshEdgebreakerTraversalEncoder()
Definition mesh_edgebreaker_traversal_encoder.h:33
void EncodeStartFaces()
Definition mesh_edgebreaker_traversal_encoder.h:108
bool Init(MeshEdgebreakerEncoderImplInterface *encoder)
Definition mesh_edgebreaker_traversal_encoder.h:37
void EncodeAttributeSeams()
Definition mesh_edgebreaker_traversal_encoder.h:112
void NewCornerReached(CornerIndex corner)
Definition mesh_edgebreaker_traversal_valence_encoder.h:73
bool Init(MeshEdgebreakerEncoderImplInterface *encoder)
Definition mesh_edgebreaker_traversal_valence_encoder.h:45
int NumEncodedSymbols() const
Definition mesh_edgebreaker_traversal_valence_encoder.h:204
void EncodeSymbol(EdgebreakerTopologyBitPattern symbol)
Definition mesh_edgebreaker_traversal_valence_encoder.h:75
MeshEdgebreakerTraversalValenceEncoder()
Definition mesh_edgebreaker_traversal_valence_encoder.h:37
void Done()
Definition mesh_edgebreaker_traversal_valence_encoder.h:187
#define FALLTHROUGH_INTENDED
Definition macros.h:54
lazy data
Definition meshpage.php:1583
n< br > font size
Definition meshpage.php:3536
Definition attribute_octahedron_transform.cc:21
VertexIndex VertexIndex
Definition mesh_edgebreaker_encoder_impl.cc:37
bool EncodeSymbols(const uint32_t *symbols, int num_values, int num_components, const Options *options, EncoderBuffer *target_buffer)
Definition symbol_encoding.cc:118
CornerIndex CornerIndex
Definition mesh_edgebreaker_encoder_impl.cc:35
bool EncodeVarint(IntTypeT val, EncoderBuffer *out_buffer)
Definition varint_encoding.h:28
EdgebreakerTopologyBitPattern
Definition mesh_edgebreaker_shared.h:53
@ TOPOLOGY_R
Definition mesh_edgebreaker_shared.h:57
@ TOPOLOGY_S
Definition mesh_edgebreaker_shared.h:55
@ TOPOLOGY_L
Definition mesh_edgebreaker_shared.h:56
@ TOPOLOGY_E
Definition mesh_edgebreaker_shared.h:58
@ TOPOLOGY_C
Definition mesh_edgebreaker_shared.h:54
constexpr EdgebreakerSymbol edge_breaker_topology_to_symbol_id[]
Definition mesh_edgebreaker_shared.h:82