[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46513] trunk/blender/source/blender/ blenkernel/intern: Modify CCGSubsurf to subdivide an arbitrary number of ( float) layers.

Nicholas Bishop nicholasbishop at gmail.com
Thu May 10 22:32:41 CEST 2012


Revision: 46513
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46513
Author:   nicholasbishop
Date:     2012-05-10 20:32:41 +0000 (Thu, 10 May 2012)
Log Message:
-----------
Modify CCGSubsurf to subdivide an arbitrary number of (float) layers.

The layout of vert data in CCGSubSurf is almost the same; previously
it was three floats (for xyz coordinate) optionally followed by three
floats for the normal. The only change is that the first three floats
can now be any number of floats.

* _getSubSurf takes a numLayers parameter to set the number of layers,
  stored in CCGMeshIFC.numLayers.

* All calls to _getSubSurf currently have numLayers set to 3, except
  for UV subsurf, where it is reduced to 2 (with a corresponding
  change when reading the results out to use float (*)[2] rather than
  float (*)[3].)

* The various VertData* macros in CCGSubSurf.c are now functions that
  take a CCGSubSurf pointer, which provides access to CCGMeshIFC,
  which has numLayers.

* Add ccgSubSurf_setNumLayers() to the API. Only changes the number of
  layers that get subdivided, doesn't change the amount of memory
  allocated. So if space for N layers is allocated, it's safe to set
  the number of layers to less than N, but not more.

* The rest of the changes are just adding the 'ss' parameter.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c
    trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.h
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c

Modified: trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c	2012-05-10 20:32:31 UTC (rev 46512)
+++ trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c	2012-05-10 20:32:41 UTC (rev 46513)
@@ -274,22 +274,6 @@
 
 /***/
 
-static int VertDataEqual(const float *a, const float *b)
-{
-	return a[0] == b[0] && a[1] == b[1] && a[2] == b[2];
-}
-#define VertDataZero(av)     { float *_a = (float *)av; _a[0] = _a[1] = _a[2] = 0.0f; }
-#define VertDataCopy(av, bv) { float *_a = (float *)av, *_b = (float *) bv; _a[0]  = _b[0]; _a[1]  = _b[1]; _a[2]  = _b[2]; }
-#define VertDataAdd(av, bv)  { float *_a = (float *)av, *_b = (float *) bv; _a[0] += _b[0]; _a[1] += _b[1]; _a[2] += _b[2]; }
-#define VertDataSub(av, bv)  { float *_a = (float *)av, *_b = (float *) bv; _a[0] -= _b[0]; _a[1] -= _b[1]; _a[2] -= _b[2]; }
-#define VertDataMulN(av, n)  { float *_a = (float *)av; float _n = n; _a[0] *= _n; _a[1] *= _n; _a[2] *= _n; }
-#define VertDataAvg4(tv, av, bv, cv, dv) \
-	{ \
-		float *_t = (float *) tv, *_a = (float *) av, *_b = (float *) bv, *_c = (float *) cv, *_d = (float *) dv; \
-		_t[0] = (_a[0] + _b[0] + _c[0] + _d[0]) * 0.25f; \
-		_t[1] = (_a[1] + _b[1] + _c[1] + _d[1]) * 0.25f; \
-		_t[2] = (_a[2] + _b[2] + _c[2] + _d[2]) * 0.25f; \
-	}
 #define NormZero(av)     { float *_a = (float *) av; _a[0] = _a[1] = _a[2] = 0.0f; }
 #define NormCopy(av, bv) { float *_a = (float *) av, *_b = (float *) bv; _a[0]  = _b[0]; _a[1]  = _b[1]; _a[2]  = _b[2]; }
 #define NormAdd(av, bv)  { float *_a = (float *) av, *_b = (float *) bv; _a[0] += _b[0]; _a[1] += _b[1]; _a[2] += _b[2]; }
@@ -424,6 +408,61 @@
 
 /***/
 
+static int VertDataEqual(const float a[], const float b[], const CCGSubSurf *ss)
+{
+	int i;
+	for(i = 0; i < ss->meshIFC.numLayers; i++) {
+		if(a[i] != b[i])
+			return 0;
+ 	}
+	return 1;
+}
+
+static void VertDataZero(float v[], const CCGSubSurf *ss)
+{
+	memset(v, 0, sizeof(float) * ss->meshIFC.numLayers);
+}
+
+static void VertDataCopy(float dst[], const float src[], const CCGSubSurf *ss)
+{
+	int i;
+	for(i = 0; i < ss->meshIFC.numLayers; i++)
+		dst[i] = src[i];
+}
+
+static void VertDataAdd(float a[], const float b[], const CCGSubSurf *ss)
+{
+	int i;
+	for(i = 0; i < ss->meshIFC.numLayers; i++)
+		a[i] += b[i];
+}
+
+static void VertDataSub(float a[], const float b[], const CCGSubSurf *ss)
+{
+	int i;
+	for(i = 0; i < ss->meshIFC.numLayers; i++)
+		a[i] -= b[i];
+}
+
+static void VertDataMulN(float v[], float f, const CCGSubSurf *ss)
+{
+	int i;
+	for(i = 0; i < ss->meshIFC.numLayers; i++)
+		v[i] *= f;
+}
+
+static void VertDataAvg4(float v[],
+						 const float a[], const float b[],
+						 const float c[], const float d[],
+						 const CCGSubSurf *ss)
+{
+	int i;
+	for(i = 0; i < ss->meshIFC.numLayers; i++)
+		v[i] = (a[i] + b[i] + c[i] + d[i]) * 0.25f;
+}
+
+/***/
+
 static CCGVert *_vert_new(CCGVertHDL vHDL, CCGSubSurf *ss)
 {
 	int num_vert_data = ss->subdivLevels + 1;
@@ -956,6 +995,11 @@
 	return eCCGError_None;
 }
 
+void ccgSubSurf_setNumLayers(CCGSubSurf *ss, int numLayers)
+{
+	ss->meshIFC.numLayers = numLayers;
+}
+
 /***/
 
 CCGError ccgSubSurf_initFullSync(CCGSubSurf *ss)
@@ -1071,14 +1115,15 @@
 		v = _ehash_lookupWithPrev(ss->vMap, vHDL, &prevp);
 		if (!v) {
 			v = _vert_new(vHDL, ss);
-			VertDataCopy(_vert_getCo(v, 0, ss->meshIFC.vertDataSize), vertData);
+			VertDataCopy(_vert_getCo(v, 0, ss->meshIFC.vertDataSize), vertData, ss);
 			_ehash_insert(ss->vMap, (EHEntry *) v);
 			v->flags = Vert_eEffected | seamflag;
 		}
-		else if (!VertDataEqual(vertData, _vert_getCo(v, 0, ss->meshIFC.vertDataSize)) || ((v->flags & Vert_eSeam) != seamflag)) {
+		else if (!VertDataEqual(vertData, _vert_getCo(v, 0, ss->meshIFC.vertDataSize), ss) ||
+				 ((v->flags & Vert_eSeam) != seamflag)) {
 			int i, j;
 
-			VertDataCopy(_vert_getCo(v, 0, ss->meshIFC.vertDataSize), vertData);
+			VertDataCopy(_vert_getCo(v, 0, ss->meshIFC.vertDataSize), vertData, ss);
 			v->flags = Vert_eEffected | seamflag;
 
 			for (i = 0; i < v->numEdges; i++) {
@@ -1102,14 +1147,15 @@
 		v = _ehash_lookupWithPrev(ss->oldVMap, vHDL, &prevp);
 		if (!v) {
 			v = _vert_new(vHDL, ss);
-			VertDataCopy(_vert_getCo(v, 0, ss->meshIFC.vertDataSize), vertData);
+			VertDataCopy(_vert_getCo(v, 0, ss->meshIFC.vertDataSize), vertData, ss);
 			_ehash_insert(ss->vMap, (EHEntry *) v);
 			v->flags = Vert_eEffected | seamflag;
 		}
-		else if (!VertDataEqual(vertData, _vert_getCo(v, 0, ss->meshIFC.vertDataSize)) || ((v->flags & Vert_eSeam) != seamflag)) {
+		else if (!VertDataEqual(vertData, _vert_getCo(v, 0, ss->meshIFC.vertDataSize), ss) ||
+				 ((v->flags & Vert_eSeam) != seamflag)) {
 			*prevp = v->next;
 			_ehash_insert(ss->vMap, (EHEntry *) v);
-			VertDataCopy(_vert_getCo(v, 0, ss->meshIFC.vertDataSize), vertData);
+			VertDataCopy(_vert_getCo(v, 0, ss->meshIFC.vertDataSize), vertData, ss);
 			v->flags = Vert_eEffected | Vert_eChanged | seamflag;
 		}
 		else {
@@ -1516,7 +1562,7 @@
 			}
 
 			VertDataCopy((float *)((byte *)FACE_getCenterData(f) + normalDataOffset),
-			             FACE_getIFNo(f, lvl, S, 0, 0));
+			             FACE_getIFNo(f, lvl, S, 0, 0), ss);
 
 			for (x = 1; x < gridSize - 1; x++)
 				NormCopy(FACE_getIENo(f, lvl, S, x),
@@ -1587,7 +1633,7 @@
 					void *co3 = FACE_getIFCo(f, curLvl, S, x + 0, y + 1);
 					void *co = FACE_getIFCo(f, nextLvl, S, fx, fy);
 
-					VertDataAvg4(co, co0, co1, co2, co3);
+					VertDataAvg4(co, co0, co1, co2, co3, ss);
 				}
 			}
 		}
@@ -1605,7 +1651,7 @@
 				void *co3 = FACE_getIFCo(f, nextLvl, S, fx, 1);
 				void *co  = FACE_getIECo(f, nextLvl, S, fx);
 				
-				VertDataAvg4(co, co0, co1, co2, co3);
+				VertDataAvg4(co, co0, co1, co2, co3, ss);
 			}
 
 			/* interior face interior edge midpoints
@@ -1624,7 +1670,7 @@
 					void *co3 = FACE_getIFCo(f, nextLvl, S, fx + 1, fy);
 					void *co  = FACE_getIFCo(f, nextLvl, S, fx, fy);
 
-					VertDataAvg4(co, co0, co1, co2, co3);
+					VertDataAvg4(co, co0, co1, co2, co3, ss);
 				}
 			}
 
@@ -1639,7 +1685,7 @@
 					void *co3 = FACE_getIFCo(f, nextLvl, S, fx, fy + 1);
 					void *co  = FACE_getIFCo(f, nextLvl, S, fx, fy);
 
-					VertDataAvg4(co, co0, co1, co2, co3);
+					VertDataAvg4(co, co0, co1, co2, co3, ss);
 				}
 			}
 		}
@@ -1661,9 +1707,9 @@
 				void *co1 = EDGE_getCo(e, curLvl, x + 1);
 				void *co  = EDGE_getCo(e, nextLvl, fx);
 
-				VertDataCopy(co, co0);
-				VertDataAdd(co, co1);
-				VertDataMulN(co, 0.5f);
+				VertDataCopy(co, co0, ss);
+				VertDataAdd(co, co1, ss);
+				VertDataMulN(co, 0.5f, ss);
 			}
 		}
 		else {
@@ -1674,26 +1720,26 @@
 				void *co  = EDGE_getCo(e, nextLvl, fx);
 				int numFaces = 0;
 
-				VertDataCopy(q, co0);
-				VertDataAdd(q, co1);
+				VertDataCopy(q, co0, ss);
+				VertDataAdd(q, co1, ss);
 
 				for (j = 0; j < e->numFaces; j++) {
 					CCGFace *f = e->faces[j];
 					const int f_ed_idx = _face_getEdgeIndex(f, e);
-					VertDataAdd(q, _face_getIFCoEdge(f, e, f_ed_idx, nextLvl, fx, 1, subdivLevels, vertDataSize));
+					VertDataAdd(q, _face_getIFCoEdge(f, e, f_ed_idx, nextLvl, fx, 1, subdivLevels, vertDataSize), ss);
 					numFaces++;
 				}
 
-				VertDataMulN(q, 1.0f / (2.0f + numFaces));
+				VertDataMulN(q, 1.0f / (2.0f + numFaces), ss);
 
-				VertDataCopy(r, co0);
-				VertDataAdd(r, co1);
-				VertDataMulN(r, 0.5f);
+				VertDataCopy(r, co0, ss);
+				VertDataAdd(r, co1, ss);
+				VertDataMulN(r, 0.5f, ss);
 
-				VertDataCopy(co, q);
-				VertDataSub(r, q);
-				VertDataMulN(r, sharpness);
-				VertDataAdd(co, r);
+				VertDataCopy(co, q, ss);
+				VertDataSub(r, q, ss);
+				VertDataMulN(r, sharpness, ss);
+				VertDataAdd(co, r, ss);
 			}
 		}
 	}
@@ -1738,53 +1784,53 @@
 			seam = 0;
 
 		if (!v->numEdges) {
-			VertDataCopy(nCo, co);
+			VertDataCopy(nCo, co, ss);
 		}
 		else if (_vert_isBoundary(v)) {
 			int numBoundary = 0;
 
-			VertDataZero(r);
+			VertDataZero(r, ss);
 			for (j = 0; j < v->numEdges; j++) {
 				CCGEdge *e = v->edges[j];
 				if (_edge_isBoundary(e)) {
-					VertDataAdd(r, _edge_getCoVert(e, v, curLvl, 1, vertDataSize));
+					VertDataAdd(r, _edge_getCoVert(e, v, curLvl, 1, vertDataSize), ss);
 					numBoundary++;
 				}
 			}
 
-			VertDataCopy(nCo, co);
-			VertDataMulN(nCo, 0.75f);
-			VertDataMulN(r, 0.25f / numBoundary);
-			VertDataAdd(nCo, r);
+			VertDataCopy(nCo, co, ss);
+			VertDataMulN(nCo, 0.75f, ss);
+			VertDataMulN(r, 0.25f / numBoundary, ss);
+			VertDataAdd(nCo, r, ss);
 		}
 		else {
 			int cornerIdx = (1 + (1 << (curLvl))) - 2;
 			int numEdges = 0, numFaces = 0;
 
-			VertDataZero(q);
+			VertDataZero(q, ss);
 			for (j = 0; j < v->numFaces; j++) {
 				CCGFace *f = v->faces[j];
-				VertDataAdd(q, FACE_getIFCo(f, nextLvl, _face_getVertIndex(f, v), cornerIdx, cornerIdx));
+				VertDataAdd(q, FACE_getIFCo(f, nextLvl, _face_getVertIndex(f, v), cornerIdx, cornerIdx), ss);
 				numFaces++;
 			}
-			VertDataMulN(q, 1.0f / numFaces);
-			VertDataZero(r);
+			VertDataMulN(q, 1.0f / numFaces, ss);
+			VertDataZero(r, ss);
 			for (j = 0; j < v->numEdges; j++) {
 				CCGEdge *e = v->edges[j];
-				VertDataAdd(r, _edge_getCoVert(e, v, curLvl, 1, vertDataSize));
+				VertDataAdd(r, _edge_getCoVert(e, v, curLvl, 1, vertDataSize), ss);
 				numEdges++;
 			}
-			VertDataMulN(r, 1.0f / numEdges);
+			VertDataMulN(r, 1.0f / numEdges, ss);
 
-			VertDataCopy(nCo, co);
-			VertDataMulN(nCo, numEdges - 2.0f);
-			VertDataAdd(nCo, q);
-			VertDataAdd(nCo, r);
-			VertDataMulN(nCo, 1.0f / numEdges);
+			VertDataCopy(nCo, co, ss);
+			VertDataMulN(nCo, numEdges - 2.0f, ss);
+			VertDataAdd(nCo, q, ss);
+			VertDataAdd(nCo, r, ss);
+			VertDataMulN(nCo, 1.0f / numEdges, ss);
 		}
 
 		if ((sharpCount > 1 && v->numFaces) || seam) {
-			VertDataZero(q);
+			VertDataZero(q, ss);
 
 			if (seam) {
 				avgSharpness = 1.0f;
@@ -1798,33 +1844,33 @@
 
 				if (seam) {
 					if (_edge_isBoundary(e))
-						VertDataAdd(q, _edge_getCoVert(e, v, curLvl, 1, vertDataSize));
+						VertDataAdd(q, _edge_getCoVert(e, v, curLvl, 1, vertDataSize), ss);
 				}
 				else if (sharpness != 0.0f) {
-					VertDataAdd(q, _edge_getCoVert(e, v, curLvl, 1, vertDataSize));
+					VertDataAdd(q, _edge_getCoVert(e, v, curLvl, 1, vertDataSize), ss);
 				}
 			}
 
-			VertDataMulN(q, (float) 1 / sharpCount);
+			VertDataMulN(q, (float) 1 / sharpCount, ss);
 
 			if (sharpCount != 2 || allSharp) {
 				/* q = q + (co - q) * avgSharpness */
-				VertDataCopy(r, co);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list