Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2015-07-29 19:41:05 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-07-29 19:41:05 +0300
commit7380166db2ca0a21511822c33b7751766a5165b1 (patch)
treebdc781e3a45a544d4769518ea5df8cc05a832d1b /intern/opensubdiv
parent26c1ae81be1542ebcf45671016cb56e11bb9be81 (diff)
OpenSubdiv: Workaround for vertices which are adjacent to several manifold islands
Diffstat (limited to 'intern/opensubdiv')
-rw-r--r--intern/opensubdiv/opensubdiv_converter.cc22
1 files changed, 21 insertions, 1 deletions
diff --git a/intern/opensubdiv/opensubdiv_converter.cc b/intern/opensubdiv/opensubdiv_converter.cc
index 76db28ab68e..b818c849cce 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;
}