Commit: cb7f7b9abd1a45e5fc80df60bb20c5f43e45ab5e
Author: Campbell Barton
Date:   Mon Aug 17 17:24:34 2015 +1000
Branches: master
https://developer.blender.org/rBcb7f7b9abd1a45e5fc80df60bb20c5f43e45ab5e

Subsurf: don't reserve MFace by default

Instead, the cache can be calculated only when its needed (fixes T45787).

===================================================================

M       source/blender/blenkernel/intern/subsurf_ccg.c

===================================================================

diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c 
b/source/blender/blenkernel/intern/subsurf_ccg.c
index 69483a4..bd5a2f7 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -903,13 +903,18 @@ static int ccgDM_getNumEdges(DerivedMesh *dm)
        return ccgSubSurf_getNumFinalEdges(ccgdm->ss);
 }
 
-static int ccgDM_getNumTessFaces(DerivedMesh *dm)
+static int ccgDM_getNumPolys(DerivedMesh *dm)
 {
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
 
        return ccgSubSurf_getNumFinalFaces(ccgdm->ss);
 }
 
+static int ccgDM_getNumTessFaces(DerivedMesh *dm)
+{
+       return dm->numTessFaceData;
+}
+
 static int ccgDM_getNumLoops(DerivedMesh *dm)
 {
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
@@ -1433,7 +1438,7 @@ static void ccgDM_copyFinalFaceArray(DerivedMesh *dm, 
MFace *mface)
        int i = 0;
        DMFlagMat *faceFlags = ccgdm->faceFlags;
 
-       totface = ccgSubSurf_getNumFaces(ss);
+       totface = dm->getNumTessFaces(dm);
        for (index = 0; index < totface; index++) {
                CCGFace *f = ccgdm->faceMap[index].face;
                int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
@@ -3568,58 +3573,6 @@ static void ccgDM_release(DerivedMesh *dm)
        }
 }
 
-static void ccg_loops_to_corners(CustomData *fdata, CustomData *ldata, 
-                                 CustomData *pdata, int loopstart, int findex, 
 int polyindex,
-                                 const int numTex, const int numCol, const int 
hasPCol, const int hasOrigSpace)
-{
-       MTFace *texface;
-       MTexPoly *texpoly;
-       MCol *mcol;
-       MLoopCol *mloopcol;
-       MLoopUV *mloopuv;
-       int i, j;
-
-       for (i = 0; i < numTex; i++) {
-               texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
-               texpoly = CustomData_get_n(pdata, CD_MTEXPOLY, polyindex, i);
-               
-               ME_MTEXFACE_CPY(texface, texpoly);
-
-               mloopuv = CustomData_get_n(ldata, CD_MLOOPUV, loopstart, i);
-               for (j = 0; j < 4; j++, mloopuv++) {
-                       copy_v2_v2(texface->uv[j], mloopuv->uv);
-               }
-       }
-
-       for (i = 0; i < numCol; i++) {
-               mloopcol = CustomData_get_n(ldata, CD_MLOOPCOL, loopstart, i);
-               mcol = CustomData_get_n(fdata, CD_MCOL, findex, i);
-
-               for (j = 0; j < 4; j++, mloopcol++) {
-                       MESH_MLOOPCOL_TO_MCOL(mloopcol, &mcol[j]);
-               }
-       }
-       
-       if (hasPCol) {
-               mloopcol = CustomData_get(ldata, loopstart, 
CD_PREVIEW_MLOOPCOL);
-               mcol = CustomData_get(fdata, findex, CD_PREVIEW_MCOL);
-
-               for (j = 0; j < 4; j++, mloopcol++) {
-                       MESH_MLOOPCOL_TO_MCOL(mloopcol, &mcol[j]);
-               }
-       }
-
-       if (hasOrigSpace) {
-               OrigSpaceFace *of = CustomData_get(fdata, findex, CD_ORIGSPACE);
-               OrigSpaceLoop *lof;
-
-               lof = CustomData_get(ldata, loopstart, CD_ORIGSPACE_MLOOP);
-               for (j = 0; j < 4; j++, lof++) {
-                       copy_v2_v2(of->uv[j], lof->uv);
-               }
-       }
-}
-
 static void *ccgDM_get_vert_data_layer(DerivedMesh *dm, int type)
 {
        if (type == CD_ORIGINDEX) {
@@ -4102,10 +4055,10 @@ static void set_default_ccgdm_callbacks(CCGDerivedMesh 
*ccgdm)
        ccgdm->dm.getMinMax = ccgDM_getMinMax;
        ccgdm->dm.getNumVerts = ccgDM_getNumVerts;
        ccgdm->dm.getNumEdges = ccgDM_getNumEdges;
-       ccgdm->dm.getNumTessFaces = ccgDM_getNumTessFaces;
        ccgdm->dm.getNumLoops = ccgDM_getNumLoops;
        /* reuse of ccgDM_getNumTessFaces is intentional here: subsurf polys 
are just created from tessfaces */
-       ccgdm->dm.getNumPolys = ccgDM_getNumTessFaces;
+       ccgdm->dm.getNumPolys = ccgDM_getNumPolys;
+       ccgdm->dm.getNumTessFaces = ccgDM_getNumTessFaces;
 
        ccgdm->dm.getLoopTriArray = ccgDM_getLoopTriArray;
 
@@ -4255,10 +4208,6 @@ static void set_ccgdm_all_geometry(CCGDerivedMesh *ccgdm,
        hasPCol = CustomData_has_layer(&ccgdm->dm.loopData, 
CD_PREVIEW_MLOOPCOL);
        hasOrigSpace = CustomData_has_layer(&ccgdm->dm.loopData, 
CD_ORIGSPACE_MLOOP);
 
-       /* We absolutely need that layer, else it's no valid tessellated data! 
*/
-       polyidx = CustomData_add_layer(&ccgdm->dm.faceData, CD_ORIGINDEX, 
CD_CALLOC,
-                                      NULL, ccgSubSurf_getNumFinalFaces(ss));
-
        edgeSize = ccgSubSurf_getEdgeSize(ss);
        gridSize = ccgSubSurf_getGridSize(ss);
        gridFaces = gridSize - 1;
@@ -4410,11 +4359,6 @@ static void set_ccgdm_all_geometry(CCGDerivedMesh *ccgdm,
                                        /*copy over poly data, e.g. mtexpoly*/
                                        CustomData_copy_data(&dm->polyData, 
&ccgdm->dm.polyData, origIndex, faceNum, 1);
 
-                                       /*generate tessellated face data used 
for drawing*/
-                                       
ccg_loops_to_corners(&ccgdm->dm.faceData, &ccgdm->dm.loopData,
-                                                            
&ccgdm->dm.polyData, loopindex2 - 4, faceNum, faceNum,
-                                                            numTex, numCol, 
hasPCol, hasOrigSpace);
-
                                        /*set original index data*/
                                        if (faceOrigIndex) {
                                                /* reference the index in 
'polyOrigIndex' */
@@ -4429,7 +4373,9 @@ static void set_ccgdm_all_geometry(CCGDerivedMesh *ccgdm,
                                        ccgdm->reverseFaceMap[faceNum] = index;
 
                                        /* This is a simple one to one mapping, 
here... */
-                                       polyidx[faceNum] = faceNum;
+                                       if (polyidx) {
+                                               polyidx[faceNum] = faceNum;
+                                       }
 
                                        faceNum++;
                                }
@@ -4566,8 +4512,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
        const int totface = ccgSubSurf_getNumFaces(ss);
 #endif
        CCGDerivedMesh *ccgdm = MEM_callocN(sizeof(*ccgdm), "ccgdm");
-       int numTex, numCol;
-       int hasPCol, hasOrigSpace;
 
        if (use_gpu_backend == false) {
                BLI_assert(totedge == ccgSubSurf_getNumEdges(ss));
@@ -4575,35 +4519,10 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
                DM_from_template(&ccgdm->dm, dm, DM_TYPE_CCGDM,
                                 ccgSubSurf_getNumFinalVerts(ss),
                                 ccgSubSurf_getNumFinalEdges(ss),
-                                ccgSubSurf_getNumFinalFaces(ss),
+                                0,
                                 ccgSubSurf_getNumFinalFaces(ss) * 4,
                                 ccgSubSurf_getNumFinalFaces(ss));
 
-               numTex = CustomData_number_of_layers(&ccgdm->dm.loopData,
-                                                    CD_MLOOPUV);
-               numCol = CustomData_number_of_layers(&ccgdm->dm.loopData,
-                                                    CD_MLOOPCOL);
-               hasPCol = CustomData_has_layer(&ccgdm->dm.loopData,
-                                              CD_PREVIEW_MLOOPCOL);
-               hasOrigSpace = CustomData_has_layer(&ccgdm->dm.loopData,
-                                                   CD_ORIGSPACE_MLOOP);
-
-               if (
-                   (numTex && CustomData_number_of_layers(&ccgdm->dm.faceData,
-                                                          CD_MTFACE) != 
numTex)  ||
-                   (numCol && CustomData_number_of_layers(&ccgdm->dm.faceData,
-                                                          CD_MCOL) != numCol)  
  ||
-                   (hasPCol && !CustomData_has_layer(&ccgdm->dm.faceData,
-                                                     CD_PREVIEW_MCOL))         
  ||
-                   (hasOrigSpace && !CustomData_has_layer(&ccgdm->dm.faceData,
-                                                          CD_ORIGSPACE)) )
-               {
-                       CustomData_from_bmeshpoly(&ccgdm->dm.faceData,
-                                                 &ccgdm->dm.polyData,
-                                                 &ccgdm->dm.loopData,
-                                                 
ccgSubSurf_getNumFinalFaces(ss));
-               }
-
                CustomData_free_layer_active(&ccgdm->dm.polyData, CD_NORMAL,
                                             ccgdm->dm.numPolyData);
 
@@ -4641,12 +4560,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 
        ccgdm->dm.numVertData = ccgSubSurf_getNumFinalVerts(ss);
        ccgdm->dm.numEdgeData = ccgSubSurf_getNumFinalEdges(ss);
-       ccgdm->dm.numTessFaceData = ccgSubSurf_getNumFinalFaces(ss);
-       ccgdm->dm.numLoopData = ccgdm->dm.numTessFaceData * 4;
-       ccgdm->dm.numPolyData = ccgdm->dm.numTessFaceData;
-
-       /* All tessellated CD layers were updated! */
-       ccgdm->dm.dirty &= ~DM_DIRTY_TESS_CDLAYERS;
+       ccgdm->dm.numPolyData = ccgSubSurf_getNumFinalFaces(ss);
+       ccgdm->dm.numLoopData = ccgdm->dm.numPolyData * 4;
+       ccgdm->dm.numTessFaceData = 0;
 
        return ccgdm;
 }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to