diff options
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_dmgrid.h | 35 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_subsurf.h | 34 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/CCGSubSurf.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/CCGSubSurf.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 17 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 29 | ||||
-rw-r--r-- | source/blender/blenlib/intern/pbvh.c | 2 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_mask.c | 2 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 2 | ||||
-rw-r--r-- | source/blender/gpu/gpu_buffers.h | 4 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_buffers.c | 2 |
12 files changed, 66 insertions, 70 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 0aa902a514e..beb28403256 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -69,7 +69,6 @@ struct PBVH; #define SUB_ELEMS_FACE 4 typedef struct DMGridData DMGridData; -typedef struct GridKey GridKey; typedef struct DMGridAdjacency { int index[4]; diff --git a/source/blender/blenkernel/BKE_dmgrid.h b/source/blender/blenkernel/BKE_dmgrid.h new file mode 100644 index 00000000000..e1419995676 --- /dev/null +++ b/source/blender/blenkernel/BKE_dmgrid.h @@ -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 diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h index 0bfcdbac874..5e581c86c08 100644 --- a/source/blender/blenkernel/BKE_subsurf.h +++ b/source/blender/blenkernel/BKE_subsurf.h @@ -32,6 +32,7 @@ struct DMGridAdjacency; struct DMGridData; struct DerivedMesh; struct EditMesh; +struct GridKey; struct IndexNode; struct ListBase; struct Mesh; @@ -46,39 +47,6 @@ struct _CCGVert; /**************************** 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, diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c index 4df9cde3739..c3ccde1625b 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.c +++ b/source/blender/blenkernel/intern/CCGSubSurf.c @@ -749,8 +749,6 @@ void ccgSubSurf_free(CCGSubSurf *ss) { _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 @@ int ccgSubSurf_getGridLevelSize(CCGSubSurf *ss, int level) { } struct GridKey *ccgSubSurf_getGridKey(CCGSubSurf *ss) { - return ss->meshIFC.gridkey; + return &ss->meshIFC.gridkey; } /* Vert accessors */ diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h index 75f2b4dd5c2..b1238849404 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.h +++ b/source/blender/blenkernel/intern/CCGSubSurf.h @@ -1,5 +1,7 @@ /* $Id$ */ +#include "BKE_dmgrid.h" + typedef void* CCGMeshHDL; typedef void* CCGVertHDL; typedef void* CCGEdgeHDL; @@ -19,7 +21,7 @@ struct _CCGMeshIFC { that would be (3+1) floats, so finterpCount would be 4. */ int finterpCount; - struct GridKey* gridkey; + struct GridKey gridkey; }; /***/ diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 3bd38680c89..c5ba159b9ab 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -458,18 +458,11 @@ static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lv 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 @@ static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl 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) diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 084533572ed..e2e427a1d66 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -117,7 +117,7 @@ static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, GridKey *gridkey, int subdivL } 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 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result, 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 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result, 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 @@ struct DerivedMesh *subsurf_make_derived_from_derived( 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); + gridkey = &default_gridkey; } if(editMode) { @@ -2759,12 +2758,8 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) float edge_sum[3], face_sum[3]; CCGVertIterator *vi; DerivedMesh *dm = CDDM_from_mesh(me, NULL); - GridKey *gridkey; - gridkey = MEM_callocN(sizeof(GridKey), "limit_positions.gridkey"); - GRIDELEM_KEY_INIT(gridkey, 1, 0, 1); - - ss = _getSubSurf(NULL, gridkey, 1, 0, 1, 0); + ss = _getSubSurf(NULL, NULL, 1, 0, 1, 0); ss_sync_from_derivedmesh(ss, dm, NULL, 0); vi = ccgSubSurf_getVertIterator(ss); diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c index 5aa45157cfe..52a5a9b121a 100644 --- a/source/blender/blenlib/intern/pbvh.c +++ b/source/blender/blenlib/intern/pbvh.c @@ -28,7 +28,7 @@ #include "BLI_pbvh.h" #include "BKE_DerivedMesh.h" -#include "BKE_subsurf.h" +#include "BKE_dmgrid.h" #include "BKE_mesh.h" /* for mesh_calc_normals */ #include "gpu_buffers.h" diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c index e2e5b91e55a..f52065e5af7 100644 --- a/source/blender/editors/sculpt_paint/paint_mask.c +++ b/source/blender/editors/sculpt_paint/paint_mask.c @@ -19,10 +19,10 @@ #include "BKE_customdata.h" #include "BKE_depsgraph.h" #include "BKE_DerivedMesh.h" +#include "BKE_dmgrid.h" #include "BKE_mesh.h" #include "BKE_multires.h" #include "BKE_paint.h" -#include "BKE_subsurf.h" #include "BLI_listbase.h" #include "BLI_pbvh.h" diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 966efd5bab4..7633895d3aa 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -51,6 +51,7 @@ #include "BKE_customdata.h" #include "BKE_DerivedMesh.h" #include "BKE_depsgraph.h" +#include "BKE_dmgrid.h" #include "BKE_global.h" #include "BKE_image.h" #include "BKE_key.h" @@ -61,7 +62,6 @@ #include "BKE_multires.h" #include "BKE_paint.h" #include "BKE_report.h" -#include "BKE_subsurf.h" #include "BKE_texture.h" #include "BKE_utildefines.h" #include "BKE_colortools.h" diff --git a/source/blender/gpu/gpu_buffers.h b/source/blender/gpu/gpu_buffers.h index 566a94737d3..fe06d472cc5 100644 --- a/source/blender/gpu/gpu_buffers.h +++ b/source/blender/gpu/gpu_buffers.h @@ -50,6 +50,7 @@ struct DerivedMesh; struct GHash; +struct GridKey; /* V - vertex, N - normal, T - uv, C - color F - float, UB - unsigned byte */ @@ -137,7 +138,8 @@ void GPU_update_mesh_buffers(void *buffers, struct MVert *mvert, void *GPU_build_grid_buffers(struct DMGridData **grids, int *grid_indices, int totgrid, int gridsize); void GPU_update_grid_buffers(void *buffers_v, struct DMGridData **grids, - int *grid_indices, int totgrid, int gridsize, GridKey *gridkey, int smooth); + int *grid_indices, int totgrid, int gridsize, + struct GridKey *gridkey, int smooth); void GPU_draw_buffers(void *buffers); void GPU_free_buffers(void *buffers); diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index d5a8709e87c..11cfe96a8f1 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -44,7 +44,7 @@ #include "DNA_meshdata_types.h" #include "BKE_DerivedMesh.h" -#include "BKE_subsurf.h" +#include "BKE_dmgrid.h" #include "BKE_utildefines.h" #include "DNA_userdef_types.h" |