[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46515] trunk/blender/source/blender: Replace hardcoded DMGridData structure with CCGElem/CCGKey.

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


Revision: 46515
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46515
Author:   nicholasbishop
Date:     2012-05-10 20:33:09 +0000 (Thu, 10 May 2012)
Log Message:
-----------
Replace hardcoded DMGridData structure with CCGElem/CCGKey.

* Changes to DerivedMesh interface: DMGridData has been removed,
  getGridData() now returns an array of CCGElem pointers. Also added
  getGridKey() to initialize a CCGKey (implemented only by
  CCGDerivedMesh.)

* PBVH: added BLI_pbvh_get_grid_key().

* A lot of code is affected, but mainly is just replacing
  DMGridData.co, DMGridData.no, and sizeof(DMGridData) with the
  CCG_*_elem functions, removing the reliance on grid elements of
  exactly six floats.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/BKE_subsurf.h
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    trunk/blender/source/blender/blenlib/BLI_pbvh.h
    trunk/blender/source/blender/blenlib/intern/pbvh.c
    trunk/blender/source/blender/editors/object/object_bake.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_hide.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt_undo.c
    trunk/blender/source/blender/gpu/GPU_buffers.h
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2012-05-10 20:32:51 UTC (rev 46514)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2012-05-10 20:33:09 UTC (rev 46515)
@@ -74,6 +74,8 @@
 #include "BKE_customdata.h"
 #include "BKE_bvhutils.h"
 
+struct CCGElem;
+struct CCGKey;
 struct MVert;
 struct MEdge;
 struct MFace;
@@ -102,11 +104,6 @@
  *       Also, the mface origindex layer indexes mpolys, not mfaces.
  */
 
-typedef struct DMGridData {
-	float co[3];
-	float no[3];
-} DMGridData;
-
 typedef struct DMGridAdjacency {
 	int index[4];
 	int rotation[4];
@@ -250,9 +247,10 @@
 	/* optional grid access for subsurf */
 	int (*getNumGrids)(DerivedMesh *dm);
 	int (*getGridSize)(DerivedMesh *dm);
-	DMGridData **(*getGridData)(DerivedMesh *dm);
+	struct CCGElem **(*getGridData)(DerivedMesh *dm);
 	DMGridAdjacency *(*getGridAdjacency)(DerivedMesh *dm);
 	int *(*getGridOffset)(DerivedMesh *dm);
+	void (*getGridKey)(DerivedMesh *dm, struct CCGKey *key);
 	DMFlagMat *(*getGridFlagMats)(DerivedMesh *dm);
 	unsigned int **(*getGridHidden)(DerivedMesh *dm);
 	

Modified: trunk/blender/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_subsurf.h	2012-05-10 20:32:51 UTC (rev 46514)
+++ trunk/blender/source/blender/blenkernel/BKE_subsurf.h	2012-05-10 20:33:09 UTC (rev 46515)
@@ -34,9 +34,9 @@
 /* struct DerivedMesh is used directly */
 #include "BKE_DerivedMesh.h"
 
+struct CCGElem;
 struct DMFlagMat;
 struct DMGridAdjacency;
-struct DMGridData;
 struct DerivedMesh;
 struct MeshElemMap;
 struct Mesh;
@@ -51,7 +51,6 @@
 struct CCGVert;
 struct EdgeHash;
 struct PBVH;
-struct DMGridData;
 struct DMGridAdjacency;
 
 /**************************** External *****************************/
@@ -115,7 +114,7 @@
 	struct MeshElemMap *pmap;
 	int *pmap_mem;
 
-	struct DMGridData **gridData;
+	struct CCGElem **gridData;
 	struct DMGridAdjacency *gridAdjacency;
 	int *gridOffset;
 	struct CCGFace **gridFaces;

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2012-05-10 20:32:51 UTC (rev 46514)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2012-05-10 20:33:09 UTC (rev 46515)
@@ -46,6 +46,7 @@
 #include "BLI_pbvh.h"
 #include "BLI_utildefines.h"
 
+#include "BKE_ccg.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
@@ -75,7 +76,7 @@
 } DispOp;
 
 static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert);
-static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, DMGridData **oldGridData, int totlvl);
+static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, CCGElem **oldGridData, int totlvl);
 
 /** Customdata **/
 
@@ -569,23 +570,27 @@
 	}
 }
 
-static void multires_copy_dm_grid(DMGridData *gridA, DMGridData *gridB, int sizeA, int sizeB)
+static void multires_copy_dm_grid(CCGElem *gridA, CCGElem *gridB, CCGKey *keyA, CCGKey *keyB)
 {
 	int x, y, j, skip;
 
-	if (sizeA > sizeB) {
-		skip = (sizeA - 1) / (sizeB - 1);
+	if (keyA->grid_size > keyB->grid_size) {
+		skip = (keyA->grid_size - 1) / (keyB->grid_size - 1);
 
-		for (j = 0, y = 0; y < sizeB; y++)
-			for (x = 0; x < sizeB; x++, j++)
-				copy_v3_v3(gridA[y * skip * sizeA + x * skip].co, gridB[j].co);
+		for (j = 0, y = 0; y < keyB->grid_size; y++)
+			for (x = 0; x < keyB->grid_size; x++, j++)
+				memcpy(CCG_elem_offset_co(keyA, gridA, y * skip * keyA->grid_size + x * skip),
+					   CCG_elem_offset_co(keyB, gridB, j),
+					   sizeof(float) * keyA->num_layers);
 	}
 	else {
-		skip = (sizeB - 1) / (sizeA - 1);
+		skip = (keyB->grid_size - 1) / (keyA->grid_size - 1);
 
-		for (j = 0, y = 0; y < sizeA; y++)
-			for (x = 0; x < sizeA; x++, j++)
-				copy_v3_v3(gridA[j].co, gridB[y * skip * sizeB + x * skip].co);
+		for (j = 0, y = 0; y < keyA->grid_size; y++)
+			for (x = 0; x < keyA->grid_size; x++, j++)
+				memcpy(CCG_elem_offset_co(keyA, gridA, j),
+					   CCG_elem_offset_co(keyB, gridB, y * skip * keyB->grid_size + x*skip),
+					   sizeof(float) * keyA->num_layers);
 	}
 }
 
@@ -850,9 +855,10 @@
 	if (mdisps->disps && !updateblock && totlvl > 1) {
 		/* upsample */
 		DerivedMesh *lowdm, *cddm, *highdm;
-		DMGridData **highGridData, **lowGridData, **subGridData;
+		CCGElem **highGridData, **lowGridData, **subGridData;
+		CCGKey highGridKey, lowGridKey;
 		CCGSubSurf *ss;
-		int i, numGrids, highGridSize, lowGridSize;
+		int i, numGrids, highGridSize;
 
 		/* create subsurf DM from original mesh at high level */
 		cddm = CDDM_from_mesh(me, NULL);
@@ -867,18 +873,19 @@
 		numGrids = highdm->getNumGrids(highdm);
 		highGridSize = highdm->getGridSize(highdm);
 		highGridData = highdm->getGridData(highdm);
-		lowGridSize = lowdm->getGridSize(lowdm);
+		highdm->getGridKey(highdm, &highGridKey);
 		lowGridData = lowdm->getGridData(lowdm);
+		lowdm->getGridKey(lowdm, &lowGridKey);
 
 		subGridData = MEM_callocN(sizeof(float *) * numGrids, "subGridData*");
 
 		for (i = 0; i < numGrids; ++i) {
 			/* backup subsurf grids */
-			subGridData[i] = MEM_callocN(sizeof(DMGridData) * highGridSize * highGridSize, "subGridData");
-			memcpy(subGridData[i], highGridData[i], sizeof(DMGridData) * highGridSize * highGridSize);
+			subGridData[i] = MEM_callocN(highGridKey.elem_size * highGridSize * highGridSize, "subGridData");
+			memcpy(subGridData[i], highGridData[i], highGridKey.elem_size*highGridSize * highGridSize);
 
 			/* overwrite with current displaced grids */
-			multires_copy_dm_grid(highGridData[i], lowGridData[i], highGridSize, lowGridSize);
+			multires_copy_dm_grid(highGridData[i], lowGridData[i], &highGridKey, &lowGridKey);
 		}
 
 		/* low lower level dm no longer needed at this point */
@@ -914,34 +921,35 @@
 	multires_subdivide(mmd, ob, mmd->totlvl + 1, updateblock, simple);
 }
 
-void grid_tangent(int gridSize, int index, int x, int y, int axis, DMGridData **gridData, float t[3])
+void grid_tangent(const CCGKey *key, int x, int y, int axis, CCGElem *grid, float t[3])
 {
 	if (axis == 0) {
-		if (x == gridSize - 1) {
-			if (y == gridSize - 1)
-				sub_v3_v3v3(t, gridData[index][x + gridSize * (y - 1)].co, gridData[index][x - 1 + gridSize * (y - 1)].co);
+		if (x == key->grid_size - 1) {
+			if (y == key->grid_size - 1)
+				sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y - 1), CCG_grid_elem_co(key, grid, x - 1, y - 1));
 			else
-				sub_v3_v3v3(t, gridData[index][x + gridSize * y].co, gridData[index][x - 1 + gridSize * y].co);
+				sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y), CCG_grid_elem_co(key, grid, x - 1, y));
 		}
 		else
-			sub_v3_v3v3(t, gridData[index][x + 1 + gridSize * y].co, gridData[index][x + gridSize * y].co);
+			sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x + 1, y), CCG_grid_elem_co(key, grid, x, y));
 	}
 	else if (axis == 1) {
-		if (y == gridSize - 1) {
-			if (x == gridSize - 1)
-				sub_v3_v3v3(t, gridData[index][x - 1 + gridSize * y].co, gridData[index][x - 1 + gridSize * (y - 1)].co);
+		if (y == key->grid_size - 1) {
+			if (x == key->grid_size - 1)
+				sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x - 1, y), CCG_grid_elem_co(key, grid, x - 1, (y - 1)));
 			else
-				sub_v3_v3v3(t, gridData[index][x + gridSize * y].co, gridData[index][x + gridSize * (y - 1)].co);
+				sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y), CCG_grid_elem_co(key, grid, x, (y - 1)));
 		}
 		else
-			sub_v3_v3v3(t, gridData[index][x + gridSize * (y + 1)].co, gridData[index][x + gridSize * y].co);
+			sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, (y + 1)), CCG_grid_elem_co(key, grid, x, y));
 	}
 }
 
-static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, DMGridData **oldGridData, int totlvl)
+static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, CCGElem **oldGridData, int totlvl)
 {
 	CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
-	DMGridData **gridData, **subGridData;
+	CCGElem **gridData, **subGridData;
+	CCGKey key;
 	MPoly *mpoly = me->mpoly;
 	MDisps *mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
 	int *gridOffset;
@@ -971,7 +979,8 @@
 	gridSize = dm->getGridSize(dm);
 	gridData = dm->getGridData(dm);
 	gridOffset = dm->getGridOffset(dm);
-	subGridData = (oldGridData) ? oldGridData : gridData;
+	dm->getGridKey(dm, &key);
+	subGridData = (oldGridData) ? oldGridData: gridData;
 
 	dGridSize = multires_side_tot[totlvl];
 	dSkip = (dGridSize - 1) / (gridSize - 1);
@@ -986,8 +995,8 @@
 
 		for (S = 0; S < numVerts; ++S, ++gIndex, ++k) {
 			MDisps *mdisp = &mdisps[mpoly[i].loopstart + S];
-			DMGridData *grid = gridData[gIndex];
-			DMGridData *subgrid = subGridData[gIndex];
+			CCGElem *grid = gridData[gIndex];
+			CCGElem *subgrid = subGridData[gIndex];
 			float (*dispgrid)[3] = NULL;
 
 			/* when adding new faces in edit mode, need to allocate disps */
@@ -1001,17 +1010,17 @@
 
 			for (y = 0; y < gridSize; y++) {
 				for (x = 0; x < gridSize; x++) {
-					float *co = grid[x + y * gridSize].co;
-					float *sco = subgrid[x + y * gridSize].co;
-					float *no = subgrid[x + y * gridSize].no;
+					float *co = CCG_grid_elem_co(&key, grid, x, y);
+					float *sco = CCG_grid_elem_co(&key, subgrid, x, y);
+					float *no = CCG_grid_elem_no(&key, subgrid, x, y);
 					float *data = dispgrid[dGridSize * y * dSkip + x * dSkip];
 					float mat[3][3], tx[3], ty[3], disp[3], d[3];
 
 					/* construct tangent space matrix */
-					grid_tangent(gridSize, gIndex, x, y, 0, subGridData, tx);
+					grid_tangent(&key, x, y, 0, subGridData[gIndex], tx);
 					normalize_v3(tx);
 
-					grid_tangent(gridSize, gIndex, x, y, 1, subGridData, ty);
+					grid_tangent(&key, x, y, 1, subGridData[gIndex], ty);
 					normalize_v3(ty);
 
 					//mul_v3_fl(tx, 1.0f/(gridSize-1));
@@ -1075,7 +1084,8 @@
 		if (lvl < totlvl) {
 			Mesh *me = ob->data;
 			DerivedMesh *lowdm, *cddm, *highdm;
-			DMGridData **highGridData, **lowGridData, **subGridData, **gridData, *diffGrid;
+			CCGElem **highGridData, **lowGridData, **subGridData, **gridData, *diffGrid;
+			CCGKey highGridKey, lowGridKey;
 			CCGSubSurf *ss;
 			int i, j, numGrids, highGridSize, lowGridSize;
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list