[Bf-blender-cvs] [282c7ae] opensubdiv-modifier: Added some magic to support NGons

Sergey Sharybin noreply at git.blender.org
Fri May 2 11:11:03 CEST 2014


Commit: 282c7ae5dee863989816191cc56aee9a30d930c1
Author: Sergey Sharybin
Date:   Fri May 2 04:41:35 2014 +0600
https://developer.blender.org/rB282c7ae5dee863989816191cc56aee9a30d930c1

Added some magic to support NGons

Seems tris and ngons are working now, however need
some much more intense testing.

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

M	source/blender/blenkernel/intern/CCGSubSurf.c

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

diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 126f4ed..aefbf97 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -2669,6 +2669,7 @@ static void opensubdiv_evaluateNGonFaceGrids(CCGSubSurf *ss,
 	for (S = 0; S < face->numVerts; S++) {
 		CCGEdge *edge = FACE_getEdges(face)[S];
 		int x, S0, S1;
+		bool flip;
 
 		for (x = 0; x < face->numVerts; ++x) {
 			if (all_verts[x] == edge->v0) {
@@ -2678,15 +2679,33 @@ static void opensubdiv_evaluateNGonFaceGrids(CCGSubSurf *ss,
 				S1 = x;
 			}
 		}
+		if (S == face->numVerts - 1) {
+			flip = S0 > S1;
+		}
+		else {
+			flip = S0 < S1;
+		}
 
 		for (x = 0; x <= edgeSize / 2; x++) {
 			float *edge_co = EDGE_getCo(edge, subdivLevels, x);
-			float *face_edge_co = FACE_getIFCo(face, subdivLevels, S0, gridSize - 1, gridSize - 1 - x);
+			float *face_edge_co;
+			if (flip) {
+				face_edge_co = FACE_getIFCo(face, subdivLevels, S0, gridSize - 1, gridSize - 1 - x);
+			}
+			else {
+				face_edge_co = FACE_getIFCo(face, subdivLevels, S0, gridSize - 1 - x, gridSize - 1);
+			}
 			VertDataCopy(edge_co, face_edge_co, ss);
 		}
 		for (x = edgeSize / 2 + 1; x < edgeSize; x++) {
 			float *edge_co = EDGE_getCo(edge, subdivLevels, x);
-			float *face_edge_co = FACE_getIFCo(face, subdivLevels, S1, x - edgeSize / 2, gridSize - 1);
+			float *face_edge_co;
+			if (flip) {
+				face_edge_co = FACE_getIFCo(face, subdivLevels, S1, x - edgeSize / 2, gridSize - 1);
+			}
+			else {
+				face_edge_co = FACE_getIFCo(face, subdivLevels, S1, gridSize - 1, x - edgeSize / 2);
+			}
 			VertDataCopy(edge_co, face_edge_co, ss);
 		}
 	}




More information about the Bf-blender-cvs mailing list