GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
mesh_edgebreaker_traversal_valence_decoder.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_COMPRESSION_MESH_MESH_EDGEBREAKER_TRAVERSAL_VALENCE_DECODER_H_
16#define DRACO_COMPRESSION_MESH_MESH_EDGEBREAKER_TRAVERSAL_VALENCE_DECODER_H_
17
22
23namespace draco {
24
25// Decoder for traversal encoded with MeshEdgebreakerTraversalValenceEncoder.
26// The decoder maintains valences of the decoded portion of the traversed mesh
27// and it uses them to select entropy context used for decoding of the actual
28// symbols.
31 public:
33 : corner_table_(nullptr),
34 num_vertices_(0),
35 last_symbol_(-1),
36 active_context_(-1),
37 min_valence_(2),
38 max_valence_(7) {}
41 corner_table_ = decoder->GetCornerTable();
42 }
43 void SetNumEncodedVertices(int num_vertices) { num_vertices_ = num_vertices; }
44
45 bool Start(DecoderBuffer *out_buffer) {
46#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
49 return false;
50 }
51 }
52#endif
54 return false;
55 }
57 return false;
58 }
59 *out_buffer = *buffer();
60
61#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
63 uint32_t num_split_symbols;
65 if (!out_buffer->Decode(&num_split_symbols)) {
66 return false;
67 }
68 } else {
69 if (!DecodeVarint(&num_split_symbols, out_buffer)) {
70 return false;
71 }
72 }
73 if (num_split_symbols >= static_cast<uint32_t>(num_vertices_)) {
74 return false;
75 }
76
77 int8_t mode;
78 if (!out_buffer->Decode(&mode)) {
79 return false;
80 }
81 if (mode == EDGEBREAKER_VALENCE_MODE_2_7) {
82 min_valence_ = 2;
83 max_valence_ = 7;
84 } else {
85 // Unsupported mode.
86 return false;
87 }
88
89 } else
90#endif
91 {
92 min_valence_ = 2;
93 max_valence_ = 7;
94 }
95
96 if (num_vertices_ < 0) {
97 return false;
98 }
99 // Set the valences of all initial vertices to 0.
100 vertex_valences_.resize(num_vertices_, 0);
101
102 const int num_unique_valences = max_valence_ - min_valence_ + 1;
103
104 // Decode all symbols for all contexts.
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;
109 if (!DecodeVarint<uint32_t>(&num_symbols, out_buffer)) {
110 return false;
111 }
112 if (num_symbols > static_cast<uint32_t>(corner_table_->num_faces())) {
113 return false;
114 }
115 if (num_symbols > 0) {
116 context_symbols_[i].resize(num_symbols);
117 DecodeSymbols(num_symbols, 1, out_buffer, context_symbols_[i].data());
118 // All symbols are going to be processed from the back.
119 context_counters_[i] = num_symbols;
120 }
121 }
122 return true;
123 }
124
125 inline uint32_t DecodeSymbol() {
126 // First check if we have a valid context.
127 if (active_context_ != -1) {
128 const int context_counter = --context_counters_[active_context_];
129 if (context_counter < 0) {
130 return TOPOLOGY_INVALID;
131 }
132 const uint32_t symbol_id =
133 context_symbols_[active_context_][context_counter];
134 if (symbol_id > 4) {
135 return TOPOLOGY_INVALID;
136 }
137 last_symbol_ = edge_breaker_symbol_to_topology_id[symbol_id];
138 } else {
139#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
141 // We don't have a predicted symbol or the symbol was mis-predicted.
142 // Decode it directly.
144
145 } else
146#endif
147 {
148 // The first symbol must be E.
149 last_symbol_ = TOPOLOGY_E;
150 }
151 }
152 return last_symbol_;
153 }
154
156 const CornerIndex next = corner_table_->Next(corner);
157 const CornerIndex prev = corner_table_->Previous(corner);
158 // Update valences.
159 switch (last_symbol_) {
160 case TOPOLOGY_C:
161 case TOPOLOGY_S:
162 vertex_valences_[corner_table_->Vertex(next)] += 1;
163 vertex_valences_[corner_table_->Vertex(prev)] += 1;
164 break;
165 case TOPOLOGY_R:
166 vertex_valences_[corner_table_->Vertex(corner)] += 1;
167 vertex_valences_[corner_table_->Vertex(next)] += 1;
168 vertex_valences_[corner_table_->Vertex(prev)] += 2;
169 break;
170 case TOPOLOGY_L:
171 vertex_valences_[corner_table_->Vertex(corner)] += 1;
172 vertex_valences_[corner_table_->Vertex(next)] += 2;
173 vertex_valences_[corner_table_->Vertex(prev)] += 1;
174 break;
175 case TOPOLOGY_E:
176 vertex_valences_[corner_table_->Vertex(corner)] += 2;
177 vertex_valences_[corner_table_->Vertex(next)] += 2;
178 vertex_valences_[corner_table_->Vertex(prev)] += 2;
179 break;
180 default:
181 break;
182 }
183 // Compute the new context that is going to be used to decode the next
184 // symbol.
185 const int active_valence = vertex_valences_[corner_table_->Vertex(next)];
186 int clamped_valence;
187 if (active_valence < min_valence_) {
188 clamped_valence = min_valence_;
189 } else if (active_valence > max_valence_) {
190 clamped_valence = max_valence_;
191 } else {
192 clamped_valence = active_valence;
193 }
194
195 active_context_ = (clamped_valence - min_valence_);
196 }
197
198 inline void MergeVertices(VertexIndex dest, VertexIndex source) {
199 // Update valences on the merged vertices.
200 vertex_valences_[dest] += vertex_valences_[source];
201 }
202
203 private:
204 const CornerTable *corner_table_;
205 int num_vertices_;
206 IndexTypeVector<VertexIndex, int> vertex_valences_;
207 int last_symbol_;
208 int active_context_;
209
210 int min_valence_;
211 int max_valence_;
212 std::vector<std::vector<uint32_t>> context_symbols_;
213 // Points to the active symbol in each context.
214 std::vector<int> context_counters_;
215};
216
217} // namespace draco
218
219#endif // DRACO_COMPRESSION_MESH_MESH_EDGEBREAKER_TRAVERSAL_VALENCE_DECODER_H_
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