Commit: 7380166db2ca0a21511822c33b7751766a5165b1
Author: Sergey Sharybin
Date:   Wed Jul 29 18:41:05 2015 +0200
Branches: master
https://developer.blender.org/rB7380166db2ca0a21511822c33b7751766a5165b1

OpenSubdiv: Workaround for vertices which are adjacent to several manifold 
islands

===================================================================

M       intern/opensubdiv/opensubdiv_converter.cc

===================================================================

diff --git a/intern/opensubdiv/opensubdiv_converter.cc 
b/intern/opensubdiv/opensubdiv_converter.cc
index 76db28a..b818c84 100644
--- a/intern/opensubdiv/opensubdiv_converter.cc
+++ b/intern/opensubdiv/opensubdiv_converter.cc
@@ -141,6 +141,7 @@ inline bool 
TopologyRefinerFactory<OpenSubdiv_Converter>::assignComponentTopolog
                memset(face_used, 0, sizeof(bool) * num_faces);
                std::stack<StackElem> stack;
                int edge_count_ordered = 0, face_count_ordered = 0;
+               bool print = vert == 6;
                if (num_vert_edges == num_vert_faces) {
                        /* Manifold vertex, start with any face and perform 
traversal. */
                        int face_start = vert_faces[0];
@@ -183,6 +184,7 @@ inline bool 
TopologyRefinerFactory<OpenSubdiv_Converter>::assignComponentTopolog
                        if (append_start_edge) {
                                dst_vert_edges[edge_count_ordered++] = 
edge_start;
                        }
+                       face_used[face_start] = true;
 
                        while (edge_count_ordered < num_vert_edges) {
                                IndexArray face_verts = 
getBaseFaceVertices(refiner, face_start);
@@ -191,6 +193,24 @@ inline bool 
TopologyRefinerFactory<OpenSubdiv_Converter>::assignComponentTopolog
                                int face_edge_next = (face_edge_start > 0) ? 
(face_edge_start - 1) : (face_verts.size() - 1);
                                Index edge_next = face_edges[face_edge_next];
                                if (edge_next == edge_first) {
+                                       /* TODO(sergey): Find more generic 
solution so non-manifold
+                                        * edges combined with some manifold 
adjacent geometry is
+                                        * handled correct.
+                                        */
+                                       if (num_vert_edges == num_vert_faces &&
+                                           edge_count_ordered != 
num_vert_edges)
+                                       {
+                                               IndexArray edge_faces = 
getBaseEdgeFaces(refiner, edge_next);
+                                               for (int i = 0; i < 
num_vert_faces; ++i) {
+                                                       int face_start = 
edge_faces[i];
+                                                       if 
(!face_used[face_start]) {
+                                                               int edge_start 
= edge_next;
+                                                               int 
face_vert_start = findInArray(getBaseFaceVertices(refiner, face_start), vert);
+                                                               
stack.push(StackElem(face_start, edge_start, face_vert_start, false));
+                                                               break;
+                                                       }
+                                               }
+                                       }
                                        break;
                                }
                                dst_vert_edges[edge_count_ordered++] = 
edge_next;
@@ -209,7 +229,6 @@ inline bool 
TopologyRefinerFactory<OpenSubdiv_Converter>::assignComponentTopolog
                                                                        int 
edge_start = edge_next;
                                                                        int 
face_vert_start = findInArray(getBaseFaceVertices(refiner, face_start), vert);
                                                                        
stack.push(StackElem(face_start, edge_start, face_vert_start, false));
-                                                                       
face_used[face_start] = true;
                                                                }
                                                        }
                                                }
@@ -219,6 +238,7 @@ inline bool 
TopologyRefinerFactory<OpenSubdiv_Converter>::assignComponentTopolog
                                        face_start = edge_faces[(edge_faces[0] 
== face_start) ? 1 : 0];
                                        face_vert_start = 
findInArray(getBaseFaceEdges(refiner, face_start), edge_next);
                                        dst_vert_faces[face_count_ordered++] = 
face_start;
+                                       face_used[face_start] = true;
                                }
                                edge_start = edge_next;
                        }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to