[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29832] branches/soc-2010-nicolasbishop/ source/blender: * Moved subsurf grid stuff into it's own header file

Nicholas Bishop nicholasbishop at gmail.com
Wed Jun 30 20:16:55 CEST 2010


Revision: 29832
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29832
Author:   nicholasbishop
Date:     2010-06-30 20:16:52 +0200 (Wed, 30 Jun 2010)

Log Message:
-----------
* Moved subsurf grid stuff into it's own header file
* Changed gridkey in CCGSubsurf to not be dynamically allocated
* Fixes at least one small memory leak

Modified Paths:
--------------
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_subsurf.h
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.c
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.h
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/multires.c
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/soc-2010-nicolasbishop/source/blender/blenlib/intern/pbvh.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_mask.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/sculpt.c
    branches/soc-2010-nicolasbishop/source/blender/gpu/gpu_buffers.h
    branches/soc-2010-nicolasbishop/source/blender/gpu/intern/gpu_buffers.c

Added Paths:
-----------
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_dmgrid.h

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_DerivedMesh.h	2010-06-30 18:14:33 UTC (rev 29831)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_DerivedMesh.h	2010-06-30 18:16:52 UTC (rev 29832)
@@ -69,7 +69,6 @@
 #define SUB_ELEMS_FACE 4
 
 typedef struct DMGridData DMGridData;
-typedef struct GridKey GridKey;
 
 typedef struct DMGridAdjacency {
 	int index[4];

Added: branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_dmgrid.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_dmgrid.h	                        (rev 0)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_dmgrid.h	2010-06-30 18:16:52 UTC (rev 29832)
@@ -0,0 +1,35 @@
+#ifndef BKE_DMGRID_H
+#define BKE_DMGRID_H
+
+/* Each grid element can contain zero or more layers of coordinates,
+   paint masks, and normals; these numbers are stored in the GridKey
+
+   For now, co and no can have only zero or one layers, only mask is
+   really variable.
+*/
+typedef struct GridKey {
+	int co;
+	int mask;
+	int no;
+} GridKey;
+
+#define GRIDELEM_KEY_INIT(_gridkey, _totco, _totmask, _totno)	\
+	((_gridkey)->co = _totco, (_gridkey)->mask = _totmask, (_gridkey)->no = _totno)
+
+#define GRIDELEM_SIZE(_key) ((3*(_key)->co + (_key)->mask + 3*(_key)->no) * sizeof(float))
+#define GRIDELEM_MASK_OFFSET(_key) ((_key)->mask ? 3*(_key)->co*sizeof(float) : -1)
+#define GRIDELEM_NO_OFFSET(_key) ((_key)->no ? (3*(_key)->co + (_key)->mask) * sizeof(float) : -1)
+#define GRIDELEM_INTERP_COUNT(_key) (3*(_key)->co + (_key)->mask)
+
+#define GRIDELEM_AT(_grid, _elem, _key) ((struct DMGridData*)(((char*)(_grid)) + (_elem) * GRIDELEM_SIZE(_key)))
+#define GRIDELEM_INC(_grid, _inc, _key) ((_grid) = GRIDELEM_AT(_grid, _inc, _key))
+
+#define GRIDELEM_CO(_grid, _key) ((float*)(_grid))
+#define GRIDELEM_NO(_grid, _key) ((float*)((char*)(_grid) + GRIDELEM_NO_OFFSET(_key)))
+#define GRIDELEM_MASK(_grid, _key) ((float*)((char*)(_grid) + GRIDELEM_MASK_OFFSET(_key)))
+
+#define GRIDELEM_CO_AT(_grid, _elem, _key) GRIDELEM_CO(GRIDELEM_AT(_grid, _elem, _key), _key)
+#define GRIDELEM_NO_AT(_grid, _elem, _key) GRIDELEM_NO(GRIDELEM_AT(_grid, _elem, _key), _key)
+#define GRIDELEM_MASK_AT(_grid, _elem, _key) GRIDELEM_MASK(GRIDELEM_AT(_grid, _elem, _key), _key)
+
+#endif

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_subsurf.h	2010-06-30 18:14:33 UTC (rev 29831)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_subsurf.h	2010-06-30 18:16:52 UTC (rev 29832)
@@ -32,6 +32,7 @@
 struct DMGridData;
 struct DerivedMesh;
 struct EditMesh;
+struct GridKey;
 struct IndexNode;
 struct ListBase;
 struct Mesh;
@@ -46,39 +47,6 @@
 
 /**************************** External *****************************/
 
-/* Grids */
-
-/* Each grid element can contain zero or more layers of coordinates,
-   paint masks, and normals; these numbers are stored in the GridKey
-
-   For now, co and no can have only zero or one layers, only mask is
-   really variable.
-*/
-struct GridKey {
-	int co;
-	int mask;
-	int no;
-};
-
-#define GRIDELEM_KEY_INIT(_gridkey, _totco, _totmask, _totno)	\
-	(_gridkey->co = _totco, _gridkey->mask = _totmask, _gridkey->no = _totno)
-
-#define GRIDELEM_SIZE(_key) ((3*_key->co + _key->mask + 3*_key->no) * sizeof(float))
-#define GRIDELEM_MASK_OFFSET(_key) (_key->mask ? 3*_key->co*sizeof(float) : -1)
-#define GRIDELEM_NO_OFFSET(_key) (_key->no ? (3*_key->co + _key->mask) * sizeof(float) : -1)
-#define GRIDELEM_INTERP_COUNT(_key) (3*_key->co + _key->mask)
-
-#define GRIDELEM_AT(_grid, _elem, _key) ((struct DMGridData*)(((char*)(_grid)) + (_elem) * GRIDELEM_SIZE(_key)))
-#define GRIDELEM_INC(_grid, _inc, _key) ((_grid) = GRIDELEM_AT(_grid, _inc, _key))
-
-#define GRIDELEM_CO(_grid, _key) ((float*)(_grid))
-#define GRIDELEM_NO(_grid, _key) ((float*)((char*)(_grid) + GRIDELEM_NO_OFFSET(_key)))
-#define GRIDELEM_MASK(_grid, _key) ((float*)((char*)(_grid) + GRIDELEM_MASK_OFFSET(_key)))
-
-#define GRIDELEM_CO_AT(_grid, _elem, _key) GRIDELEM_CO(GRIDELEM_AT(_grid, _elem, _key), _key)
-#define GRIDELEM_NO_AT(_grid, _elem, _key) GRIDELEM_NO(GRIDELEM_AT(_grid, _elem, _key), _key)
-#define GRIDELEM_MASK_AT(_grid, _elem, _key) GRIDELEM_MASK(GRIDELEM_AT(_grid, _elem, _key), _key)
-
 struct DerivedMesh *subsurf_make_derived_from_derived(
 						struct DerivedMesh *dm,
 						struct SubsurfModifierData *smd,

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.c	2010-06-30 18:14:33 UTC (rev 29831)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.c	2010-06-30 18:16:52 UTC (rev 29832)
@@ -749,8 +749,6 @@
 	_ehash_free(ss->eMap, (EHEntryFreeFP) _edge_free, ss);
 	_ehash_free(ss->vMap, (EHEntryFreeFP) _vert_free, ss);
 
-	MEM_freeN(ss->meshIFC.gridkey);
-
 	CCGSUBSURF_free(ss, ss);
 
 	if (allocatorIFC.release) {
@@ -2558,7 +2556,7 @@
 }
 
 struct GridKey *ccgSubSurf_getGridKey(CCGSubSurf *ss) {
-	return ss->meshIFC.gridkey;
+	return &ss->meshIFC.gridkey;
 }
 
 /* Vert accessors */

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.h	2010-06-30 18:14:33 UTC (rev 29831)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.h	2010-06-30 18:16:52 UTC (rev 29832)
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+#include "BKE_dmgrid.h"
+
 typedef void* CCGMeshHDL;
 typedef void* CCGVertHDL;
 typedef void* CCGEdgeHDL;
@@ -19,7 +21,7 @@
 	   that would be (3+1) floats, so finterpCount would be 4. */
 	int			finterpCount;
 
-	struct GridKey*		gridkey;
+	struct GridKey		gridkey;
 };
 
 /***/

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/multires.c	2010-06-30 18:14:33 UTC (rev 29831)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/multires.c	2010-06-30 18:16:52 UTC (rev 29832)
@@ -458,18 +458,11 @@
 	return multires_dm_create_from_derived(&mmd, 1, dm, ob, 0, 0);
 }
 
-static GridKey *create_gridkey(CustomData *cd)
-{
-	GridKey *gridkey = MEM_callocN(sizeof(GridKey), "create_gridkey");
-
-	GRIDELEM_KEY_INIT(gridkey, 1, CustomData_number_of_layers(cd, CD_PAINTMASK), 1);
-
-	return gridkey;
-}
-
 static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal)
 {
 	SubsurfModifierData smd;
+	GridKey gridkey;
+	int pmask_totlayer;
 
 	memset(&smd, 0, sizeof(SubsurfModifierData));
 	smd.levels = smd.renderLevels = lvl;
@@ -479,7 +472,11 @@
 	if(optimal)
 		smd.flags |= eSubsurfModifierFlag_ControlEdges;
 
-	return subsurf_make_derived_from_derived(dm, &smd, create_gridkey(&get_mesh(ob)->vdata), 0, NULL, 0, 0);
+	pmask_totlayer = CustomData_number_of_layers(&get_mesh(ob)->vdata,
+						     CD_PAINTMASK);
+	GRIDELEM_KEY_INIT(&gridkey, 1, pmask_totlayer, 1);
+			  
+	return subsurf_make_derived_from_derived(dm, &smd, &gridkey, 0, NULL, 0, 0);
 }
 
 static DMGridData **copy_grids(DMGridData **grids, int totgrid, int gridsize, GridKey *gridkey)

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c	2010-06-30 18:14:33 UTC (rev 29831)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c	2010-06-30 18:16:52 UTC (rev 29832)
@@ -117,7 +117,7 @@
 	}
 	ifc.vertDataSize = GRIDELEM_SIZE(gridkey);
 	ifc.finterpCount = GRIDELEM_INTERP_COUNT(gridkey);
-	ifc.gridkey = gridkey;
+	ifc.gridkey = *gridkey;
 
 	if (useArena) {
 		CCGAllocatorIFC allocatorIFC;
@@ -317,16 +317,15 @@
 	int index, gridSize, gridFaces, edgeSize, totface, x, y, S;
 	MTFace *dmtface = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, n);
 	MTFace *tface = CustomData_get_layer_n(&result->faceData, CD_MTFACE, n);
-	GridKey *gridkey;
+	GridKey gridkey;
 
 	if(!dmtface || !tface)
 		return;
 
-	gridkey = MEM_callocN(sizeof(GridKey), "Subsurf UV GridKey");
-	GRIDELEM_KEY_INIT(gridkey, 1, 0, 0); /* TODO */
+	GRIDELEM_KEY_INIT(&gridkey, 1, 0, 0); /* TODO */
 
 	/* create a CCGSubSurf from uv's */
-	uvss = _getSubSurf(NULL, gridkey, ccgSubSurf_getSubdivisionLevels(ss), 0, 1, 0);
+	uvss = _getSubSurf(NULL, &gridkey, ccgSubSurf_getSubdivisionLevels(ss), 0, 1, 0);
 
 	if(!ss_sync_from_uv(uvss, ss, dm, dmtface)) {
 		ccgSubSurf_free(uvss);
@@ -361,10 +360,10 @@
 
 			for(y = 0; y < gridFaces; y++) {
 				for(x = 0; x < gridFaces; x++) {
-					float *a = GRIDELEM_CO_AT(faceGridData, (y + 0)*gridSize + x + 0, gridkey);
-					float *b = GRIDELEM_CO_AT(faceGridData, (y + 0)*gridSize + x + 1, gridkey);
-					float *c = GRIDELEM_CO_AT(faceGridData, (y + 1)*gridSize + x + 1, gridkey);
-					float *d = GRIDELEM_CO_AT(faceGridData, (y + 1)*gridSize + x + 0, gridkey);
+					float *a = GRIDELEM_CO_AT(faceGridData, (y + 0)*gridSize + x + 0, &gridkey);
+					float *b = GRIDELEM_CO_AT(faceGridData, (y + 0)*gridSize + x + 1, &gridkey);
+					float *c = GRIDELEM_CO_AT(faceGridData, (y + 1)*gridSize + x + 1, &gridkey);
+					float *d = GRIDELEM_CO_AT(faceGridData, (y + 1)*gridSize + x + 0, &gridkey);
 
 					tf->uv[0][0] = a[0]; tf->uv[0][1] = a[1];
 					tf->uv[1][0] = d[0]; tf->uv[1][1] = d[1];
@@ -2666,11 +2665,11 @@
 	int useSubsurfUv = smd->flags & eSubsurfModifierFlag_SubsurfUv;
 	int drawInteriorEdges = !(smd->flags & eSubsurfModifierFlag_ControlEdges);
 	CCGDerivedMesh *result;
+	GridKey default_gridkey;
 
 	if(!gridkey) {
-		/* create default gridkey */
-		gridkey = MEM_callocN(sizeof(GridKey), "subsurf_make_derived_from_derived.GridKey");
-		GRIDELEM_KEY_INIT(gridkey, 1, 0, 1);
+		GRIDELEM_KEY_INIT(&default_gridkey, 1, 0, 1);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list