Commit: fad537563fcc446a599d1a735a5d08343a583cbd
Author: Sergey Sharybin
Date:   Mon Jul 7 21:08:36 2014 +0600
https://developer.blender.org/rBfad537563fcc446a599d1a735a5d08343a583cbd

OpenSubdiv: Split getCCGDerivedMesh into a smaller functions

This way it's much easier to control what's happening for which backend.

Also made it so face flags are set for all low-res faces, meaning we now
can do proper materials loops.

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

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 77099aa..0e81680 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -3428,75 +3428,8 @@ static void ccgDM_calcNormals(DerivedMesh *dm)
        dm->dirty &= ~DM_DIRTY_NORMALS;
 }
 
-static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
-                                         int drawInteriorEdges,
-                                         int useSubsurfUv,
-                                         DerivedMesh *dm,
-                                         bool use_gpu_backend)
+static void set_default_ccgdm_callbacks(CCGDerivedMesh *ccgdm)
 {
-       CCGDerivedMesh *ccgdm = MEM_callocN(sizeof(*ccgdm), "ccgdm");
-       CCGVertIterator *vi;
-       CCGEdgeIterator *ei;
-       CCGFaceIterator *fi;
-       int index, totvert, totedge, totface;
-       int i;
-       int vertNum, edgeNum, faceNum;
-       int *vertOrigIndex, *faceOrigIndex, *polyOrigIndex, 
*base_polyOrigIndex, *edgeOrigIndex;
-       short *edgeFlags;
-       DMFlagMat *faceFlags;
-       int *polyidx = NULL;
-#ifndef USE_DYNSIZE
-       int *loopidx = NULL, *vertidx = NULL;
-       BLI_array_declare(loopidx);
-       BLI_array_declare(vertidx);
-#endif
-       int loopindex, loopindex2;
-       int edgeSize;
-       int gridSize;
-       int gridFaces, gridCuts;
-       /*int gridSideVerts;*/
-       int gridSideEdges;
-       int numTex, numCol;
-       int hasPCol, hasOrigSpace;
-       int gridInternalEdges;
-       WeightTable wtable = {NULL};
-       /* MCol *mcol; */ /* UNUSED */
-       MEdge *medge = NULL;
-       /* MFace *mface = NULL; */
-       MPoly *mpoly = NULL;
-       bool has_edge_cd;
-
-       DM_from_template(&ccgdm->dm, dm, DM_TYPE_CCGDM,
-                        ccgSubSurf_getNumFinalVerts(ss),
-                        ccgSubSurf_getNumFinalEdges(ss),
-                        ccgSubSurf_getNumFinalFaces(ss),
-                        ccgSubSurf_getNumFinalFaces(ss) * 4,
-                        ccgSubSurf_getNumFinalFaces(ss));
-
-       CustomData_free_layer_active(&ccgdm->dm.polyData, CD_NORMAL,
-                                    ccgdm->dm.numPolyData);
-       
-       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));
-       }
-
-       /* 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));
-
        ccgdm->dm.getMinMax = ccgDM_getMinMax;
        ccgdm->dm.getNumVerts = ccgDM_getNumVerts;
        ccgdm->dm.getNumEdges = ccgDM_getNumEdges;
@@ -3546,7 +3479,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
        ccgdm->dm.foreachMappedEdge = ccgDM_foreachMappedEdge;
        ccgdm->dm.foreachMappedLoop = ccgDM_foreachMappedLoop;
        ccgdm->dm.foreachMappedFaceCenter = ccgDM_foreachMappedFaceCenter;
-       
+
        ccgdm->dm.drawVerts = ccgDM_drawVerts;
        ccgdm->dm.drawEdges = ccgDM_drawEdges;
        ccgdm->dm.drawLooseEdges = ccgDM_drawLooseEdges;
@@ -3561,16 +3494,24 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 
        ccgdm->dm.drawMappedEdgesInterp = ccgDM_drawMappedEdgesInterp;
        ccgdm->dm.drawMappedEdges = ccgDM_drawMappedEdges;
-       
+
        ccgdm->dm.release = ccgDM_release;
-       
-       ccgdm->ss = ss;
-       ccgdm->drawInteriorEdges = drawInteriorEdges;
-       ccgdm->useSubsurfUv = useSubsurfUv;
+}
+
+static void create_ccgdm_maps(CCGDerivedMesh *ccgdm,
+                              CCGSubSurf *ss)
+{
+       CCGVertIterator *vi;
+       CCGEdgeIterator *ei;
+       CCGFaceIterator *fi;
+       int totvert, totedge, totface;
 
        totvert = ccgSubSurf_getNumVerts(ss);
        ccgdm->vertMap = MEM_mallocN(totvert * sizeof(*ccgdm->vertMap), 
"vertMap");
-       for (vi = ccgSubSurf_getVertIterator(ss); 
!ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
+       for (vi = ccgSubSurf_getVertIterator(ss);
+            !ccgVertIterator_isStopped(vi);
+            ccgVertIterator_next(vi))
+       {
                CCGVert *v = ccgVertIterator_getCurrent(vi);
 
                
ccgdm->vertMap[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))].vert = v;
@@ -3579,7 +3520,10 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 
        totedge = ccgSubSurf_getNumEdges(ss);
        ccgdm->edgeMap = MEM_mallocN(totedge * sizeof(*ccgdm->edgeMap), 
"edgeMap");
-       for (ei = ccgSubSurf_getEdgeIterator(ss); 
!ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
+       for (ei = ccgSubSurf_getEdgeIterator(ss);
+            !ccgEdgeIterator_isStopped(ei);
+            ccgEdgeIterator_next(ei))
+       {
                CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
 
                
ccgdm->edgeMap[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))].edge = e;
@@ -3588,14 +3532,61 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 
        totface = ccgSubSurf_getNumFaces(ss);
        ccgdm->faceMap = MEM_mallocN(totface * sizeof(*ccgdm->faceMap), 
"faceMap");
-       for (fi = ccgSubSurf_getFaceIterator(ss); 
!ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
+       for (fi = ccgSubSurf_getFaceIterator(ss);
+            !ccgFaceIterator_isStopped(fi);
+            ccgFaceIterator_next(fi))
+       {
                CCGFace *f = ccgFaceIterator_getCurrent(fi);
 
                
ccgdm->faceMap[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f))].face = f;
        }
        ccgFaceIterator_free(fi);
+}
 
-       ccgdm->reverseFaceMap = MEM_callocN(sizeof(int) * 
ccgSubSurf_getNumFinalFaces(ss), "reverseFaceMap");
+/* Fill in all geometry arrays making it possible to access any
+ * hires data from the CPU.
+ */
+static void set_ccgdm_all_geometry(CCGDerivedMesh *ccgdm,
+                                   CCGSubSurf *ss,
+                                   DerivedMesh *dm,
+                                   bool useSubsurfUv)
+{
+       const int totvert = ccgSubSurf_getNumVerts(ss);
+       const int totedge = ccgSubSurf_getNumEdges(ss);
+       const int totface = ccgSubSurf_getNumFaces(ss);
+       int index;
+       int i;
+       int vertNum = 0, edgeNum = 0, faceNum = 0;
+       int *vertOrigIndex, *faceOrigIndex, *polyOrigIndex, 
*base_polyOrigIndex, *edgeOrigIndex;
+       short *edgeFlags = ccgdm->edgeFlags;
+       DMFlagMat *faceFlags = ccgdm->faceFlags;
+       int *polyidx = NULL;
+#ifndef USE_DYNSIZE
+       int *loopidx = NULL, *vertidx = NULL;
+       BLI_array_declare(loopidx);
+       BLI_array_declare(vertidx);
+#endif
+       int loopindex, loopindex2;
+       int edgeSize;
+       int gridSize;
+       int gridFaces, gridCuts;
+       int gridSideEdges;
+       int numTex, numCol;
+       int hasPCol, hasOrigSpace;
+       int gridInternalEdges;
+       WeightTable wtable = {NULL};
+       MEdge *medge = NULL;
+       MPoly *mpoly = NULL;
+       bool has_edge_cd;
+
+       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);
+
+       /* 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);
@@ -3603,11 +3594,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
        gridCuts = gridSize - 2;
        /*gridInternalVerts = gridSideVerts * gridSideVerts; - as yet, unused */
        gridSideEdges = gridSize - 1;
-       gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2; 
-
-       vertNum = 0;
-       edgeNum = 0;
-       faceNum = 0;
+       gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2;
 
        /* mvert = dm->getVertArray(dm); */ /* UNUSED */
        medge = dm->getEdgeArray(dm);
@@ -3615,10 +3602,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 
        mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
        base_polyOrigIndex = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
-       
-       /*CDDM hack*/
-       edgeFlags = ccgdm->edgeFlags = MEM_callocN(sizeof(short) * totedge, 
"edgeFlags");
-       faceFlags = ccgdm->faceFlags = MEM_callocN(sizeof(DMFlagMat) * totface, 
"faceFlags");
 
        vertOrigIndex = DM_get_vert_data_layer(&ccgdm->dm, CD_ORIGINDEX);
        edgeOrigIndex = DM_get_edge_data_layer(&ccgdm->dm, CD_ORIGINDEX);
@@ -3637,65 +3620,79 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 #endif
 
        loopindex = loopindex2 = 0; /* current loop index */
-       /* TODO(sergey): This is only for purposes of test. */
-       if (use_gpu_backend == false) {
-               for (index = 0; index < totface; index++) {
-                       CCGFace *f = ccgdm->faceMap[index].face;
-                       int numVerts = ccgSubSurf_getFaceNumVerts(f);
-                       int numFinalEdges = numVerts * (gridSideEdges + 
gridInternalEdges);
-                       int origIndex = 
GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
-                       int g2_wid = gridCuts + 2;
-                       float *w, *w2;
-                       int s, x, y;
+       for (index = 0; index < totface; index++) {
+               CCGFace *f = ccgdm->faceMap[index].face;
+               int numVerts = ccgSubSurf_getFaceNumVerts(f);
+               int numFinalEdges = numVerts * (gridSideEdges + 
gridInternalEdges);
+               int origIndex = 
GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
+               int g2_wid = gridCuts + 2;
+               float *w, *w2;
+               int s, x, y;
 #ifdef USE_DYNSIZE
-                       int loopidx[numVerts], vertidx[numVerts];
+               int loopidx[numVerts], vertidx[numVerts];
 #endif
+               w = get_ss_weights(&wtable, gridCuts, numVerts);
 
-                       w = get_ss_weights(&wtable, gridCuts, numVerts);
-
-                       ccgdm->faceMap[index].startVert = vertNum;
-                       ccgdm->faceMap[index].startEdge = edgeNum;
-                       ccgdm->faceMap[index].startFace = faceNum;
+               ccgdm->faceMap[index].startVert = vertNum;
+               ccgdm->faceMap[index].startEdge = edgeNum;
+               ccgdm->faceMap[index].startFace = faceNum;
 
-                       faceFlags->flag = 

@@ 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