15#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
16#ifndef DRACO_COMPRESSION_MESH_MESH_EDGEBREAKER_TRAVERSAL_PREDICTIVE_DECODER_H_
17#define DRACO_COMPRESSION_MESH_MESH_EDGEBREAKER_TRAVERSAL_PREDICTIVE_DECODER_H_
28class MeshEdgebreakerTraversalPredictiveDecoder
31 MeshEdgebreakerTraversalPredictiveDecoder()
32 : corner_table_(nullptr),
35 predicted_symbol_(-1) {}
36 void Init(MeshEdgebreakerDecoderImplInterface *decoder) {
37 MeshEdgebreakerTraversalDecoder::Init(decoder);
38 corner_table_ = decoder->GetCornerTable();
40 void SetNumEncodedVertices(
int num_vertices) { num_vertices_ = num_vertices; }
42 bool Start(DecoderBuffer *out_buffer) {
43 if (!MeshEdgebreakerTraversalDecoder::Start(out_buffer)) {
46 int32_t num_split_symbols;
47 if (!out_buffer->Decode(&num_split_symbols) || num_split_symbols < 0)
49 if (num_split_symbols >= num_vertices_) {
53 vertex_valences_.resize(num_vertices_, 0);
54 if (!prediction_decoder_.StartDecoding(out_buffer)) {
60 inline uint32_t DecodeSymbol() {
62 if (predicted_symbol_ != -1) {
64 if (prediction_decoder_.DecodeNextBit()) {
65 last_symbol_ = predicted_symbol_;
66 return predicted_symbol_;
71 last_symbol_ = MeshEdgebreakerTraversalDecoder::DecodeSymbol();
75 inline void NewActiveCornerReached(CornerIndex corner) {
76 const CornerIndex next = corner_table_->Next(corner);
77 const CornerIndex prev = corner_table_->Previous(corner);
79 switch (last_symbol_) {
82 vertex_valences_[corner_table_->Vertex(next).value()] += 1;
83 vertex_valences_[corner_table_->Vertex(prev).value()] += 1;
86 vertex_valences_[corner_table_->Vertex(corner).value()] += 1;
87 vertex_valences_[corner_table_->Vertex(next).value()] += 1;
88 vertex_valences_[corner_table_->Vertex(prev).value()] += 2;
91 vertex_valences_[corner_table_->Vertex(corner).value()] += 1;
92 vertex_valences_[corner_table_->Vertex(next).value()] += 2;
93 vertex_valences_[corner_table_->Vertex(prev).value()] += 1;
96 vertex_valences_[corner_table_->Vertex(corner).value()] += 2;
97 vertex_valences_[corner_table_->Vertex(next).value()] += 2;
98 vertex_valences_[corner_table_->Vertex(prev).value()] += 2;
104 if (last_symbol_ == TOPOLOGY_C || last_symbol_ == TOPOLOGY_R) {
106 corner_table_->Vertex(corner_table_->Next(corner));
107 if (vertex_valences_[pivot.value()] < 6) {
113 predicted_symbol_ = -1;
117 inline void MergeVertices(VertexIndex dest, VertexIndex source) {
119 vertex_valences_[dest.value()] += vertex_valences_[source.value()];
123 const CornerTable *corner_table_;
125 std::vector<int> vertex_valences_;
128 int predicted_symbol_;
Definition mesh_edgebreaker_traversal_decoder.h:30
Definition attribute_octahedron_transform.cc:21
VertexIndex VertexIndex
Definition mesh_edgebreaker_encoder_impl.cc:37
RAnsBitDecoder BinaryDecoder
Definition mesh_edgebreaker_traversal_decoder.h:26
CornerIndex CornerIndex
Definition mesh_edgebreaker_encoder_impl.cc:35
@ 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