[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