Revision: 37145
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37145
Author:   jwilkins
Date:     2011-06-03 20:49:55 +0000 (Fri, 03 Jun 2011)
Log Message:
-----------
Revision: 29388
Author: nicholasbishop
Date: 1:20:55 PM, Thursday, June 10, 2010
Message:
* Initial support for dynamically-sized Griddata from subsurf.

CCGSubsurf internally already fully supports vertdata of any size. This commit 
basically extends that support to all the code using the output of subsurf 
(with dm->getGridData).

For now, two types of grid data are set up: coords+normals with masks, and 
coords+normals without masks. More types to come.

For future reference, emacs find/replace regexps used to make some of the 
changes:

\(data\|subgrid\|grid\|edgeData\|faceGridData\)\[\(.*?\)\].\(co\|no\|mask\)
GRIDELEM_\,(upcase \3)_AT(\1, \2, gridkey)

&\(diffGrid\|gridA\|gridB\|faceGridData\|gridData\[i\]\|lowGridData\[i\]\)\[\(.*?\)\]
GRIDELEM_AT(\1, \2, gridkey)

\(vi\.grid\|vd\|a\|b\|vda\|vdb\)->\(co\|no\|mask\)
GRIDELEM_\,(upcase \2)(\1, gridkey)

** jwilkins:
** this one was a little tricky
** I had to split the changes to sculpt.c between sculpt.c and sculpt_undo.c
** there seem to be some dependencies between BKE_subsurf.h, BKE_DerivedMesh.h, 
and BLI_pbvh.h that should be resolved
** had to change some more recent code to use the new grid macros 
(multires_apply_smat)
** XXX: is it really ok for the 'subgrid' in multires_apply_smat to assume the 
same gridsize and gridoffset?  If so it can probably share a gridkey as well.

Modified Paths:
--------------
    branches/soc-2011-onion/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/soc-2011-onion/source/blender/blenkernel/BKE_subsurf.h
    branches/soc-2011-onion/source/blender/blenkernel/intern/CCGSubSurf.c
    branches/soc-2011-onion/source/blender/blenkernel/intern/CCGSubSurf.h
    branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c
    branches/soc-2011-onion/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/soc-2011-onion/source/blender/blenlib/BLI_pbvh.h
    branches/soc-2011-onion/source/blender/blenlib/intern/pbvh.c
    branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_mask.c
    branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_stroke.c
    branches/soc-2011-onion/source/blender/editors/sculpt_paint/sculpt.c
    branches/soc-2011-onion/source/blender/editors/sculpt_paint/sculpt_undo.c
    branches/soc-2011-onion/source/blender/gpu/GPU_buffers.h
    branches/soc-2011-onion/source/blender/gpu/intern/gpu_buffers.c

Property Changed:
----------------
    branches/soc-2011-onion/


Property changes on: branches/soc-2011-onion
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/soc-2010-jwilkins:28499-37009
/branches/soc-2010-nicolasbishop:28448-29352
/trunk/blender:36833-37054
   + /branches/soc-2010-jwilkins:28499-37009
/branches/soc-2010-nicolasbishop:28448-29352,29388
/trunk/blender:36833-37054

Modified: branches/soc-2011-onion/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/BKE_DerivedMesh.h 
2011-06-03 20:44:23 UTC (rev 37144)
+++ branches/soc-2011-onion/source/blender/blenkernel/BKE_DerivedMesh.h 
2011-06-03 20:49:55 UTC (rev 37145)
@@ -70,11 +70,7 @@
 #define SUB_ELEMS_EDGE 2
 #define SUB_ELEMS_FACE 4
 
-typedef struct DMGridData {
-       float co[3];
-       float mask;
-       float no[3];
-} DMGridData;
+typedef struct DMGridData DMGridData;
 
 typedef struct DMGridAdjacency {
        int index[4];
@@ -161,6 +157,7 @@
        DMGridData **(*getGridData)(DerivedMesh *dm);
        DMGridAdjacency *(*getGridAdjacency)(DerivedMesh *dm);
        int *(*getGridOffset)(DerivedMesh *dm);
+       int (*getGridKey)(DerivedMesh *dm);
 
        /* Iterate over each mapped vertex in the derived mesh, calling the
         * given function with the original vert and the mapped vert's new

Modified: branches/soc-2011-onion/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/BKE_subsurf.h     
2011-06-03 20:44:23 UTC (rev 37144)
+++ branches/soc-2011-onion/source/blender/blenkernel/BKE_subsurf.h     
2011-06-03 20:49:55 UTC (rev 37145)
@@ -50,6 +50,43 @@
 
 /**************************** External *****************************/
 
+/* Grids */
+
+/* Format of the data in a grid element */
+typedef enum {
+       GRID_ELEM_KEY_CO_NO = 0,
+       GRID_ELEM_KEY_CO_MASK_NO,
+       GRID_ELEM_KEY_TOTAL
+} DMGridElemKey;
+
+/* Information about the data stored by each type of key */
+typedef struct {
+       int size;
+       int has_mask;
+       int no_offset;
+       int mask_offset;
+       int interp_count;
+} DMGridElemKeyInfo;
+
+extern DMGridElemKeyInfo GridElemKeyInfo[GRID_ELEM_KEY_TOTAL];
+
+#define GRIDELEM_SIZE(_key) GridElemKeyInfo[_key].size
+#define GRIDELEM_HAS_MASK(_key) GridElemKeyInfo[_key].has_mask
+#define GRIDELEM_NO_OFFSET(_key) GridElemKeyInfo[_key].no_offset
+#define GRIDELEM_MASK_OFFSET(_key) GridElemKeyInfo[_key].mask_offset
+#define GRIDELEM_INTERP_COUNT(_key) GridElemKeyInfo[_key].interp_count
+
+#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-2011-onion/source/blender/blenkernel/intern/CCGSubSurf.c
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/intern/CCGSubSurf.c       
2011-06-03 20:44:23 UTC (rev 37144)
+++ branches/soc-2011-onion/source/blender/blenkernel/intern/CCGSubSurf.c       
2011-06-03 20:49:55 UTC (rev 37145)
@@ -2576,6 +2576,10 @@
        }
 }
 
+int ccgSubSurf_getGridKey(CCGSubSurf *ss) {
+       return ss->meshIFC.gridkey;
+}
+
 /* Vert accessors */
 
 CCGVertHDL ccgSubSurf_getVertVertHandle(CCGVert *v) {

Modified: branches/soc-2011-onion/source/blender/blenkernel/intern/CCGSubSurf.h
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/intern/CCGSubSurf.h       
2011-06-03 20:44:23 UTC (rev 37144)
+++ branches/soc-2011-onion/source/blender/blenkernel/intern/CCGSubSurf.h       
2011-06-03 20:49:55 UTC (rev 37145)
@@ -21,6 +21,8 @@
           example: if interpolating coordinates and paint masks,
           that would be (3+1) floats, so finterpCount would be 4. */
        int                     finterpCount;
+
+       int                     gridkey;
 };
 
 /***/
@@ -97,6 +99,7 @@
 int                    ccgSubSurf_getEdgeLevelSize                     
(CCGSubSurf *ss, int level);
 int                    ccgSubSurf_getGridSize                          
(CCGSubSurf *ss);
 int                    ccgSubSurf_getGridLevelSize                     
(CCGSubSurf *ss, int level);
+int                    ccgSubSurf_getGridKey                           
(CCGSubSurf *ss);
 
 CCGVert*       ccgSubSurf_getVert                                      
(CCGSubSurf *ss, CCGVertHDL v);
 CCGVertHDL     ccgSubSurf_getVertVertHandle            (CCGVert *v);

Modified: branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c 
2011-06-03 20:44:23 UTC (rev 37144)
+++ branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c 
2011-06-03 20:49:55 UTC (rev 37145)
@@ -386,23 +386,24 @@
        }
 }
 
-static void multires_copy_dm_grid(DMGridData *gridA, DMGridData *gridB, int 
finterpCount, int sizeA, int sizeB)
+static void multires_copy_dm_grid(DMGridData *gridA, DMGridData *gridB, int 
gridkey, int sizeA, int sizeB)
 {
        int x, y, j, skip;
+       int size = sizeof(float)*GRIDELEM_INTERP_COUNT(gridkey);
 
        if(sizeA > sizeB) {
                skip = (sizeA-1)/(sizeB-1);
 
                for(j = 0, y = 0; y < sizeB; y++)
                        for(x = 0; x < sizeB; x++, j++)
-                               memcpy(&gridA[y*skip*sizeA + x*skip], 
&gridB[j], sizeof(float) * finterpCount);
+                               memcpy(GRIDELEM_AT(gridA, y*skip*sizeA + 
x*skip, gridkey), GRIDELEM_AT(gridB, j, gridkey), size);
        }
        else {
                skip = (sizeB-1)/(sizeA-1);
 
                for(j = 0, y = 0; y < sizeA; y++)
                        for(x = 0; x < sizeA; x++, j++)
-                               memcpy(&gridA[j], &gridB[y*skip*sizeB + 
x*skip], sizeof(float) * finterpCount);
+                               memcpy(GRIDELEM_AT(gridA, j, gridkey), 
GRIDELEM_AT(gridB, y*skip*sizeB + x*skip, gridkey), size);
        }
 }
 
@@ -627,14 +628,14 @@
        dispdm->release(dispdm);
 }
 
-static DMGridData **copy_grids(DMGridData **grids, int totgrid, int gridsize)
+static DMGridData **copy_grids(DMGridData **grids, int totgrid, int gridsize, 
int gridkey)
 {
        DMGridData **grids_copy = MEM_callocN(sizeof(DMGridData*) * totgrid, 
"subgrids");
        int i;
 
        for(i = 0; i < totgrid; ++i) {
-               grids_copy[i] = 
MEM_callocN(sizeof(DMGridData)*gridsize*gridsize, "subgrid");
-               memcpy(grids_copy[i], grids[i], 
sizeof(DMGridData)*gridsize*gridsize);
+               grids_copy[i] = 
MEM_callocN(GRIDELEM_SIZE(gridkey)*gridsize*gridsize, "subgrid");
+               memcpy(grids_copy[i], grids[i], 
GRIDELEM_SIZE(gridkey)*gridsize*gridsize);
        }
 
        return grids_copy;
@@ -660,12 +661,13 @@
                DerivedMesh *lowdm, *cddm, *highdm;
                DMGridData **highGridData, **lowGridData, **subGridData;
                CCGSubSurf *ss;
-               int i, numGrids, highGridSize, lowGridSize;
+               int i, numGrids, highGridSize, lowGridSize, gridkey;
 
                /* create subsurf DM from original mesh at high level */
                cddm = CDDM_from_mesh(me, NULL);
                DM_set_only_copy(cddm, CD_MASK_BAREMESH);
                highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0);
+               gridkey = highdm->getGridKey(highdm);
 
                /* create multires DM from original mesh at low level */
                lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple);
@@ -679,11 +681,11 @@
                lowGridData = lowdm->getGridData(lowdm);
 
                /* backup subsurf grids */
-               subGridData = copy_grids(highGridData, numGrids, highGridSize);
+               subGridData = copy_grids(highGridData, numGrids, highGridSize, 
gridkey);
 
                /* overwrite with current displaced grids */
                for(i = 0; i < numGrids; ++i)
-                       multires_copy_dm_grid(highGridData[i], lowGridData[i], 
4 /* TODO */, highGridSize, lowGridSize);
+                       multires_copy_dm_grid(highGridData[i], lowGridData[i], 
gridkey, highGridSize, lowGridSize);
 
                /* low lower level dm no longer needed at this point */
                lowdm->release(lowdm);
@@ -718,27 +720,29 @@
        multires_subdivide(mmd, ob, mmd->totlvl+1, updateblock, simple);
 }
 
-static void grid_tangent(int gridSize, int index, int x, int y, int axis, 
DMGridData **gridData, float t[3])
+static void grid_tangent(int gridSize, int index, int x, int y, int axis, 
DMGridData **gridData, int gridkey, float t[3])
 {
+       DMGridData *grid = gridData[index];
+
        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);
+                               sub_v3_v3v3(t, GRIDELEM_CO_AT(grid, x + 
gridSize*(y - 1), gridkey), GRIDELEM_CO_AT(grid, x - 1 + gridSize*(y - 1), 
gridkey));
                        else
-                               sub_v3_v3v3(t, gridData[index][x + 
gridSize*y].co, gridData[index][x - 1 + gridSize*y].co);
+                               sub_v3_v3v3(t, GRIDELEM_CO_AT(grid, x + 
gridSize*y, gridkey), GRIDELEM_CO_AT(grid, x - 1 + gridSize*y, gridkey));
                }
                else
-                       sub_v3_v3v3(t, gridData[index][x + 1 + gridSize*y].co, 
gridData[index][x + gridSize*y].co);
+                       sub_v3_v3v3(t, GRIDELEM_CO_AT(grid, x + 1 + gridSize*y, 
gridkey), GRIDELEM_CO_AT(grid, x + gridSize*y, gridkey));
        }
        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);
+                               sub_v3_v3v3(t, GRIDELEM_CO_AT(grid, x - 1 + 
gridSize*y, gridkey), GRIDELEM_CO_AT(grid, x - 1 + gridSize*(y - 1), gridkey));
                        else
-                               sub_v3_v3v3(t, gridData[index][x + 
gridSize*y].co, gridData[index][x + gridSize*(y - 1)].co);
+                               sub_v3_v3v3(t, GRIDELEM_CO_AT(grid, x + 
gridSize*y, gridkey), GRIDELEM_CO_AT(grid, x + gridSize*(y - 1), gridkey));
                }
                else
-                       sub_v3_v3v3(t, gridData[index][x + gridSize*(y + 
1)].co, gridData[index][x + gridSize*y].co);
+                       sub_v3_v3v3(t, GRIDELEM_CO_AT(grid, x + gridSize*(y + 
1), gridkey), GRIDELEM_CO_AT(grid, x + gridSize*y, gridkey));
        }
 }
 
@@ -768,7 +772,7 @@
        MFace *mface = me->mface;
        MDisps *mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
        CustomData *stored_grids;
-       int *gridOffset;
+       int *gridOffset, gridkey;
        int i, /*numGrids,*/ gridSize, dGridSize, dSkip;
 
        if(!mdisps) {
@@ -783,6 +787,7 @@
        gridData = dm->getGridData(dm);
        gridOffset = dm->getGridOffset(dm);
        subGridData = (oldGridData)? oldGridData: gridData;

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to