mirror of
https://git.mirrors.martin98.com/https://github.com/google/draco
synced 2025-07-30 01:22:02 +08:00
2.2 KiB
2.2 KiB
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 }