From a862768b65062376cb5396a2a49b699494dd9d33 Mon Sep 17 00:00:00 2001 From: Frank Galligan Date: Mon, 16 Oct 2017 11:57:49 -0700 Subject: [PATCH 1/2] Spec: Add ProcessInteriorEdges function - This addresses a comment in KhronosGroup/glTF#1114 --- docs/spec/edgebreaker.decoder.md | 44 ++++++++++++++++++++++++++++++ docs/spec/variable.descriptions.md | 2 ++ 2 files changed, 46 insertions(+) diff --git a/docs/spec/edgebreaker.decoder.md b/docs/spec/edgebreaker.decoder.md index ed4c223..2877cc2 100644 --- a/docs/spec/edgebreaker.decoder.md +++ b/docs/spec/edgebreaker.decoder.md @@ -360,3 +360,47 @@ void DecodeEdgeBreakerConnectivity() { } ~~~~~ {:.draco-syntax } + + +### ProcessInteriorEdges() + +~~~~~ +void ProcessInteriorEdges() { + while (active_corner_stack.size() > 0) { + corner_a = active_corner_stack.pop_back(); + interior_face = eb_start_face_buffer.ReadBits32(1); + if (interior_face) { + corner_b = Previous(corner_a); + while (PosOpposite(corner_b) >= 0) { + b_opp = PosOpposite(corner_b); + corner_b = Previous(b_opp); + } + corner_c = Next(corner_a); + while (PosOpposite(corner_c) >= 0) { + c_opp = PosOpposite(corner_c); + corner_c = Next(c_opp); + } + new_corner = face_to_vertex[0].size() * 3; + SetOppositeCorners(new_corner, corner_a); + SetOppositeCorners(new_corner + 1, corner_b); + SetOppositeCorners(new_corner + 2, corner_c); + + CornerToVerts(0, corner_a, &temp_v, &next_a, &temp_p); + CornerToVerts(0, corner_b, &temp_v, &next_b, &temp_p); + CornerToVerts(0, corner_c, &temp_v, &next_c, &temp_p); + MapCornerToVertex(new_corner, next_b); + MapCornerToVertex(new_corner + 1, next_c); + MapCornerToVertex(new_corner + 2, next_a); + face_to_vertex[0].push_back(next_b); + face_to_vertex[1].push_back(next_c); + face_to_vertex[2].push_back(next_a); + + // Mark all three vertices as interior. + is_vert_hole_[next_b] = false; + is_vert_hole_[next_c] = false; + is_vert_hole_[next_a] = false; + } + } +} +~~~~~ +{:.draco-syntax } diff --git a/docs/spec/variable.descriptions.md b/docs/spec/variable.descriptions.md index 43e0b7f..279da78 100644 --- a/docs/spec/variable.descriptions.md +++ b/docs/spec/variable.descriptions.md @@ -139,6 +139,8 @@ * Id of the last vertex decoded * bit_symbol_buffer * Standard EdgeBreaker encoded symbol buffer +* active_corner_stack + * Array of current working corners used during EdgeBreaker decoding #### EdgeBreaker Traversal * eb_symbol_buffer_size From 23494dbdbc80a272a295422bec44f50bba68236d Mon Sep 17 00:00:00 2001 From: Frank Galligan Date: Mon, 16 Oct 2017 12:49:57 -0700 Subject: [PATCH 2/2] Fix ReadBits call --- docs/spec/edgebreaker.decoder.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/spec/edgebreaker.decoder.md b/docs/spec/edgebreaker.decoder.md index 2877cc2..3c16d0f 100644 --- a/docs/spec/edgebreaker.decoder.md +++ b/docs/spec/edgebreaker.decoder.md @@ -368,7 +368,7 @@ void DecodeEdgeBreakerConnectivity() { void ProcessInteriorEdges() { while (active_corner_stack.size() > 0) { corner_a = active_corner_stack.pop_back(); - interior_face = eb_start_face_buffer.ReadBits32(1); + interior_face = eb_start_face_buffer.ReadBits(1); if (interior_face) { corner_b = Previous(corner_a); while (PosOpposite(corner_b) >= 0) {