mirror of
https://git.mirrors.martin98.com/https://github.com/google/draco
synced 2025-07-30 17:11:59 +08:00
90 lines
2.2 KiB
Markdown
90 lines
2.2 KiB
Markdown
|
|
## EdgeBreaker Traversal Valence Decoder
|
|
|
|
### EdgeBreakerTraversalValence_Start()
|
|
|
|
~~~~~
|
|
EdgeBreakerTraversalValence_Start(traversal_num_vertices) {
|
|
EdgebreakerTraversal_Start()
|
|
num_split_symbols varUI32
|
|
mode == 0 I8
|
|
traversal_num_vertices += num_split_symbols
|
|
vertex_valences_ init to 0
|
|
min_valence_ = 2;
|
|
max_valence_ = 7;
|
|
num_unique_valences = 6 (max_valence_ - min_valence_ + 1)
|
|
for (i = 0; i < num_unique_valences; ++i) {
|
|
num_symbols varUI32
|
|
if (num_symbols > 0) {
|
|
DecodeSymbols(num_symbols, context_symbols_[i])
|
|
}
|
|
context_counters_[i] = num_symbols
|
|
}
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax }
|
|
|
|
|
|
|
|
### TraversalValence_DecodeSymbol()
|
|
|
|
~~~~~
|
|
TraversalValence_DecodeSymbol() {
|
|
if (active_context_ != -1) {
|
|
symbol_id = context_symbols_[active_context_]
|
|
[--context_counters_[active_context_]]
|
|
last_symbol_ = edge_breaker_symbol_to_topology_id[symbol_id]
|
|
} else {
|
|
last_symbol_ = Traversal_DecodeSymbol()
|
|
}
|
|
return last_symbol_
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax }
|
|
|
|
|
|
|
|
### TraversalValence_NewActiveCornerReached()
|
|
|
|
~~~~~
|
|
TraversalValence_NewActiveCornerReached(corner) {
|
|
switch (last_symbol_) {
|
|
case TOPOLOGY_C:
|
|
case TOPOLOGY_S:
|
|
vertex_valences_[ct(next)] += 1;
|
|
vertex_valences_[ct(prev)] += 1;
|
|
break;
|
|
case TOPOLOGY_R:
|
|
vertex_valences_[corner] += 1;
|
|
vertex_valences_[ct(next)] += 1;
|
|
vertex_valences_[ct(prev)] += 2;
|
|
break;
|
|
case TOPOLOGY_L:
|
|
vertex_valences_[corner] += 1;
|
|
vertex_valences_[ct(next)] += 2;
|
|
vertex_valences_[ct(prev)] += 1;
|
|
break;
|
|
case TOPOLOGY_E:
|
|
vertex_valences_[corner] += 2;
|
|
vertex_valences_[ct(next)] += 2;
|
|
vertex_valences_[ct(prev)] += 2;
|
|
break;
|
|
}
|
|
valence = vertex_valences_[ct(next)]
|
|
valence = max(valence, min_valence_)
|
|
valence = min(valence, max_valence_)
|
|
active_context_ = (valence - min_valence_);
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax }
|
|
|
|
|
|
### TraversalValence_MergeVertices()
|
|
|
|
~~~~~
|
|
TraversalValence_MergeVertices(dest, source) {
|
|
vertex_valences_[dest] += vertex_valences_[source];
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax }
|