15#ifndef DRACO_COMPRESSION_MESH_MESH_EDGEBREAKER_TRAVERSAL_VALENCE_DECODER_H_
16#define DRACO_COMPRESSION_MESH_MESH_EDGEBREAKER_TRAVERSAL_VALENCE_DECODER_H_
33 : corner_table_(nullptr),
46#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
61#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
63 uint32_t num_split_symbols;
65 if (!out_buffer->
Decode(&num_split_symbols)) {
73 if (num_split_symbols >=
static_cast<uint32_t
>(num_vertices_)) {
78 if (!out_buffer->
Decode(&mode)) {
96 if (num_vertices_ < 0) {
100 vertex_valences_.resize(num_vertices_, 0);
102 const int num_unique_valences = max_valence_ - min_valence_ + 1;
105 context_symbols_.resize(num_unique_valences);
106 context_counters_.resize(context_symbols_.size());
107 for (
int i = 0; i < context_symbols_.size(); ++i) {
108 uint32_t num_symbols;
112 if (num_symbols >
static_cast<uint32_t
>(corner_table_->num_faces())) {
115 if (num_symbols > 0) {
116 context_symbols_[i].resize(num_symbols);
119 context_counters_[i] = num_symbols;
127 if (active_context_ != -1) {
128 const int context_counter = --context_counters_[active_context_];
129 if (context_counter < 0) {
132 const uint32_t symbol_id =
133 context_symbols_[active_context_][context_counter];
139#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
156 const CornerIndex next = corner_table_->Next(corner);
157 const CornerIndex prev = corner_table_->Previous(corner);
159 switch (last_symbol_) {
162 vertex_valences_[corner_table_->Vertex(next)] += 1;
163 vertex_valences_[corner_table_->Vertex(prev)] += 1;
166 vertex_valences_[corner_table_->Vertex(corner)] += 1;
167 vertex_valences_[corner_table_->Vertex(next)] += 1;
168 vertex_valences_[corner_table_->Vertex(prev)] += 2;
171 vertex_valences_[corner_table_->Vertex(corner)] += 1;
172 vertex_valences_[corner_table_->Vertex(next)] += 2;
173 vertex_valences_[corner_table_->Vertex(prev)] += 1;
176 vertex_valences_[corner_table_->Vertex(corner)] += 2;
177 vertex_valences_[corner_table_->Vertex(next)] += 2;
178 vertex_valences_[corner_table_->Vertex(prev)] += 2;
185 const int active_valence = vertex_valences_[corner_table_->Vertex(next)];
187 if (active_valence < min_valence_) {
188 clamped_valence = min_valence_;
189 }
else if (active_valence > max_valence_) {
190 clamped_valence = max_valence_;
192 clamped_valence = active_valence;
195 active_context_ = (clamped_valence - min_valence_);
200 vertex_valences_[dest] += vertex_valences_[source];
212 std::vector<std::vector<uint32_t>> context_symbols_;
214 std::vector<int> context_counters_;
Definition corner_table.h:53
Definition decoder_buffer.h:30
bool Decode(T *out_val)
Definition decoder_buffer.h:68
Definition draco_index_type_vector.h:32
Definition mesh_edgebreaker_decoder_impl_interface.h:28
virtual const CornerTable * GetCornerTable() const =0
MeshEdgebreakerTraversalDecoder()
Definition mesh_edgebreaker_traversal_decoder.h:32
uint32_t DecodeSymbol()
Definition mesh_edgebreaker_traversal_decoder.h:93
void Init(MeshEdgebreakerDecoderImplInterface *decoder)
Definition mesh_edgebreaker_traversal_decoder.h:36
bool DecodeAttributeSeams()
Definition mesh_edgebreaker_traversal_decoder.h:174
bool DecodeTraversalSymbols()
Definition mesh_edgebreaker_traversal_decoder.h:140
DecoderBuffer * buffer()
Definition mesh_edgebreaker_traversal_decoder.h:138
uint16_t BitstreamVersion() const
Definition mesh_edgebreaker_traversal_decoder.h:44
bool DecodeStartFaces()
Definition mesh_edgebreaker_traversal_decoder.h:154
uint32_t DecodeSymbol()
Definition mesh_edgebreaker_traversal_valence_decoder.h:125
void MergeVertices(VertexIndex dest, VertexIndex source)
Definition mesh_edgebreaker_traversal_valence_decoder.h:198
MeshEdgebreakerTraversalValenceDecoder()
Definition mesh_edgebreaker_traversal_valence_decoder.h:32
void NewActiveCornerReached(CornerIndex corner)
Definition mesh_edgebreaker_traversal_valence_decoder.h:155
void SetNumEncodedVertices(int num_vertices)
Definition mesh_edgebreaker_traversal_valence_decoder.h:43
void Init(MeshEdgebreakerDecoderImplInterface *decoder)
Definition mesh_edgebreaker_traversal_valence_decoder.h:39
bool Start(DecoderBuffer *out_buffer)
Definition mesh_edgebreaker_traversal_valence_decoder.h:45
#define DRACO_BITSTREAM_VERSION(MAJOR, MINOR)
Definition macros.h:114
lazy data
Definition meshpage.php:1583
Definition attribute_octahedron_transform.cc:21
VertexIndex VertexIndex
Definition mesh_edgebreaker_encoder_impl.cc:37
bool DecodeVarint(IntTypeT *out_val, DecoderBuffer *buffer)
Definition varint_decoding.h:63
@ EDGEBREAKER_VALENCE_MODE_2_7
Definition mesh_edgebreaker_shared.h:124
bool DecodeSymbols(uint32_t num_values, int num_components, DecoderBuffer *src_buffer, uint32_t *out_values)
Definition symbol_decoding.cc:34
constexpr EdgebreakerTopologyBitPattern edge_breaker_symbol_to_topology_id[]
Definition mesh_edgebreaker_shared.h:89
CornerIndex CornerIndex
Definition mesh_edgebreaker_encoder_impl.cc:35
@ TOPOLOGY_INVALID
Definition mesh_edgebreaker_shared.h:64
@ 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