[Bf-blender-cvs] [85aa868] opensubdiv-modifier: OpenSubdiv: Fix issues with normals in CPU side tessellator

Sergey Sharybin noreply at git.blender.org
Fri Jul 25 10:30:37 CEST 2014


Commit: 85aa868b26c9a2212f64274a1bd8f3ecbbd838a9
Author: Sergey Sharybin
Date:   Fri Jul 25 14:29:47 2014 +0600
Branches: opensubdiv-modifier
https://developer.blender.org/rB85aa868b26c9a2212f64274a1bd8f3ecbbd838a9

OpenSubdiv: Fix issues with normals in CPU side tessellator

There's still some issues with NGons, but those seems to be caused
by the OpenSubdiv's evaluator API.

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

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

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

diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index b942f36..cfc17c8 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -2832,21 +2832,25 @@ static void opensubdiv_evaluateQuadFaceGrids(CCGSubSurf *ss,
 
 				VertDataCopy(co, P, ss);
 				if (do_normals) {
-					cross_v3_v3v3(no, dPdu, dPdv);
+					cross_v3_v3v3(no, dPdv, dPdu);
 					normalize_v3(no);
 				}
 
 				if (x == gridSize - 1 && y == gridSize - 1) {
 					float *vert_co = VERT_getCo(FACE_getVerts(face)[S], subdivLevels);
-					float *vert_no = VERT_getNo(FACE_getVerts(face)[S], subdivLevels);
 					VertDataCopy(vert_co, co, ss);
 					if (do_normals) {
+						float *vert_no = VERT_getNo(FACE_getVerts(face)[S], subdivLevels);
 						VertDataCopy(vert_no, no, ss);
 					}
 				}
 				if (S == 0 && x == 0 && y == 0) {
 					float *center_co = (float *)FACE_getCenterData(face);
 					VertDataCopy(center_co, co, ss);
+					if (do_normals) {
+						float *center_no = (float *)((byte *)FACE_getCenterData(face) + normalDataOffset);
+						VertDataCopy(center_no, no, ss);
+					}
 				}
 			}
 		}
@@ -2854,6 +2858,10 @@ static void opensubdiv_evaluateQuadFaceGrids(CCGSubSurf *ss,
 		for (x = 0; x < gridSize; x++) {
 			VertDataCopy(FACE_getIECo(face, subdivLevels, S, x),
 			             FACE_getIFCo(face, subdivLevels, S, x, 0), ss);
+			if (do_normals){
+				VertDataCopy(FACE_getIENo(face, subdivLevels, S, x),
+				             FACE_getIFNo(face, subdivLevels, S, x, 0), ss);
+			}
 		}
 
 		for (k = 0; k < face->numVerts; k++) {
@@ -2892,8 +2900,10 @@ static void opensubdiv_evaluateQuadFaceGrids(CCGSubSurf *ss,
 			 */
 			openSubdiv_evaluateLimit(ss->osd_evaluator, osd_face_index, u, v, P, dPdu, dPdv);
 			VertDataCopy(co, P, ss);
-			cross_v3_v3v3(no, dPdu, dPdv);
-			normalize_v3(no);
+			if (do_normals) {
+				cross_v3_v3v3(no, dPdv, dPdu);
+				normalize_v3(no);
+			}
 		}
 	}
 }
@@ -2958,28 +2968,36 @@ static void opensubdiv_evaluateNGonFaceGrids(CCGSubSurf *ss,
 
 				VertDataCopy(co, P, ss);
 				if (do_normals) {
-					cross_v3_v3v3(no, dPdu, dPdv);
+					cross_v3_v3v3(no, dPdv, dPdu);
 					normalize_v3(no);
 				}
 
 				/* TODO(sergey): De-dpuplicate with the quad case. */
 				if (x == gridSize - 1 && y == gridSize - 1) {
 					float *vert_co = VERT_getCo(FACE_getVerts(face)[S], subdivLevels);
-					float *vert_no = VERT_getNo(FACE_getVerts(face)[S], subdivLevels);
 					VertDataCopy(vert_co, co, ss);
 					if (do_normals) {
+						float *vert_no = VERT_getNo(FACE_getVerts(face)[S], subdivLevels);
 						VertDataCopy(vert_no, no, ss);
 					}
 				}
 				if (S == 0 && x == 0 && y == 0) {
 					float *center_co = (float *)FACE_getCenterData(face);
 					VertDataCopy(center_co, co, ss);
+					if (do_normals) {
+						float *center_no = (float *)((byte *)FACE_getCenterData(face) + normalDataOffset);
+						VertDataCopy(center_no, no, ss);
+					}
 				}
 			}
 		}
 		for (x = 0; x < gridSize; x++) {
 			VertDataCopy(FACE_getIECo(face, subdivLevels, S, x),
 			             FACE_getIFCo(face, subdivLevels, S, x, 0), ss);
+			if (do_normals) {
+				VertDataCopy(FACE_getIENo(face, subdivLevels, S, x),
+				             FACE_getIFNo(face, subdivLevels, S, x, 0), ss);
+			}
 		}
 	}
 
@@ -3006,25 +3024,39 @@ static void opensubdiv_evaluateNGonFaceGrids(CCGSubSurf *ss,
 
 		for (x = 0; x <= edgeSize / 2; x++) {
 			float *edge_co = EDGE_getCo(edge, subdivLevels, x);
+			float *edge_no = EDGE_getNo(edge, subdivLevels, x);
 			float *face_edge_co;
+			float *face_edge_no;
 			if (flip) {
 				face_edge_co = FACE_getIFCo(face, subdivLevels, S0, gridSize - 1, gridSize - 1 - x);
+				face_edge_no = FACE_getIFNo(face, subdivLevels, S0, gridSize - 1, gridSize - 1 - x);
 			}
 			else {
 				face_edge_co = FACE_getIFCo(face, subdivLevels, S0, gridSize - 1 - x, gridSize - 1);
+				face_edge_no = FACE_getIFNo(face, subdivLevels, S0, gridSize - 1 - x, gridSize - 1);
 			}
 			VertDataCopy(edge_co, face_edge_co, ss);
+			if (do_normals) {
+				VertDataCopy(edge_no, face_edge_no, ss);
+			}
 		}
 		for (x = edgeSize / 2 + 1; x < edgeSize; x++) {
 			float *edge_co = EDGE_getCo(edge, subdivLevels, x);
+			float *edge_no = EDGE_getNo(edge, subdivLevels, x);
 			float *face_edge_co;
+			float *face_edge_no;
 			if (flip) {
 				face_edge_co = FACE_getIFCo(face, subdivLevels, S1, x - edgeSize / 2, gridSize - 1);
+				face_edge_no = FACE_getIFNo(face, subdivLevels, S1, x - edgeSize / 2, gridSize - 1);
 			}
 			else {
 				face_edge_co = FACE_getIFCo(face, subdivLevels, S1, gridSize - 1, x - edgeSize / 2);
+				face_edge_no = FACE_getIFNo(face, subdivLevels, S1, gridSize - 1, x - edgeSize / 2);
 			}
 			VertDataCopy(edge_co, face_edge_co, ss);
+			if (do_normals) {
+				VertDataCopy(edge_no, face_edge_no, ss);
+			}
 		}
 	}
 }




More information about the Bf-blender-cvs mailing list