Revision: 41797
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41797
Author:   ender79
Date:     2011-11-13 15:13:59 +0000 (Sun, 13 Nov 2011)
Log Message:
-----------
Add CD_POLYINDEX layer to reduce need for retesselations

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
    branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/bmesh/blender/source/blender/blenloader/intern/readfile.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/editors/mesh/editface.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c
    branches/bmesh/blender/source/blender/editors/object/object_add.c
    branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_image.c
    branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_vertex.c
    branches/bmesh/blender/source/blender/editors/space_view3d/drawmesh.c
    branches/bmesh/blender/source/blender/makesdna/DNA_customdata_types.h
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_mirror.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h  
2011-11-13 15:10:54 UTC (rev 41796)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h  
2011-11-13 15:13:59 UTC (rev 41797)
@@ -129,11 +129,14 @@
        struct GPUDrawObject *drawObject;
        DerivedMeshType type;
 
-       /* Misc. Queries */
-       
-       /*recalculates mesh tesselation*/
+       /* calculate vert and face normals */
+       void (*calcNormals)(DerivedMesh *dm);
+
+       /* recalculates mesh tesselation */
        void (*recalcTesselation)(DerivedMesh *dm);
 
+       /* Misc. Queries */
+
        /* Also called in Editmode */
        int (*getNumVerts)(DerivedMesh *dm);
        int (*getNumEdges)(DerivedMesh *dm);
@@ -166,8 +169,8 @@
        void (*copyVertArray)(DerivedMesh *dm, struct MVert *vert_r);
        void (*copyEdgeArray)(DerivedMesh *dm, struct MEdge *edge_r);
        void (*copyTessFaceArray)(DerivedMesh *dm, struct MFace *face_r);
-               void (*copyLoopArray)(DerivedMesh *dm, struct MLoop *loop_r);
-               void (*copyPolyArray)(DerivedMesh *dm, struct MPoly *poly_r);
+       void (*copyLoopArray)(DerivedMesh *dm, struct MLoop *loop_r);
+       void (*copyPolyArray)(DerivedMesh *dm, struct MPoly *poly_r);
 
        /* return a copy of all verts/edges/faces from the derived mesh
         * it is the caller's responsibility to free the returned pointer
@@ -175,8 +178,8 @@
        struct MVert *(*dupVertArray)(DerivedMesh *dm);
        struct MEdge *(*dupEdgeArray)(DerivedMesh *dm);
        struct MFace *(*dupTessFaceArray)(DerivedMesh *dm);
-               struct MLoop *(*dupLoopArray)(DerivedMesh *dm);
-               struct MPoly *(*dupPolyArray)(DerivedMesh *dm);
+       struct MLoop *(*dupLoopArray)(DerivedMesh *dm);
+       struct MPoly *(*dupPolyArray)(DerivedMesh *dm);
 
        /* return a pointer to a single element of vert/edge/face custom data
         * from the derived mesh (this gives a pointer to the actual data, not

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h        
2011-11-13 15:10:54 UTC (rev 41796)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h        
2011-11-13 15:13:59 UTC (rev 41797)
@@ -111,11 +111,8 @@
    faces*/
 void CDDM_calc_edges_poly(struct DerivedMesh *dm);
 
-/*reconstitute face triangulation.  if orig_use_polyorig is nonzero, sets
-  the mface origindex layer to copy to the origindex values of the 
-  parent mpolys; otherwise the mface origindex will point to the index of
-  the parent mpoly*/
-void CDDM_recalc_tesselation(struct DerivedMesh *dm, int orig_use_polyorig);
+/* reconstitute face triangulation */
+void CDDM_recalc_tesselation(struct DerivedMesh *dm);
 
 /* lowers the number of vertices/edges/faces in a CDDerivedMesh
  * the layer data stays the same size

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2011-11-13 
15:10:54 UTC (rev 41796)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2011-11-13 
15:13:59 UTC (rev 41797)
@@ -75,7 +75,7 @@
  */
 int mesh_recalcTesselation(struct CustomData *fdata, struct CustomData *ldata, 
        struct CustomData *pdata, struct MVert *mvert, int totface, 
-       int totloop, int totpoly, int use_poly_origindex, int 
use_face_origindex);
+       int totloop, int totpoly);
 
 /*calculates a face normal.*/
 void mesh_calc_poly_normal(struct MPoly *mpoly, struct MLoop *loopstart, 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c       
2011-11-13 15:10:54 UTC (rev 41796)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c       
2011-11-13 15:13:59 UTC (rev 41797)
@@ -365,13 +365,11 @@
 
        totvert = tmp.totvert = dm->getNumVerts(dm);
        totedge = tmp.totedge = dm->getNumEdges(dm);
-       totface = tmp.totface = dm->getNumTessFaces(dm);
        totpoly = tmp.totpoly = dm->getNumFaces(dm);
        totloop = tmp.totloop = dm->numLoopData;
 
        CustomData_copy(&dm->vertData, &tmp.vdata, CD_MASK_MESH, CD_DUPLICATE, 
totvert);
        CustomData_copy(&dm->edgeData, &tmp.edata, CD_MASK_MESH, CD_DUPLICATE, 
totedge);
-       CustomData_copy(&dm->faceData, &tmp.fdata, CD_MASK_MESH, CD_DUPLICATE, 
totface);
        CustomData_copy(&dm->loopData, &tmp.ldata, CD_MASK_MESH, CD_DUPLICATE, 
totloop);
        CustomData_copy(&dm->polyData, &tmp.pdata, CD_MASK_MESH, CD_DUPLICATE, 
totpoly);
 
@@ -406,8 +404,6 @@
                CustomData_add_layer(&tmp.vdata, CD_MVERT, CD_ASSIGN, 
dm->dupVertArray(dm), totvert);
        if(!CustomData_has_layer(&tmp.edata, CD_MEDGE))
                CustomData_add_layer(&tmp.edata, CD_MEDGE, CD_ASSIGN, 
dm->dupEdgeArray(dm), totedge);
-       if(!CustomData_has_layer(&tmp.fdata, CD_MFACE))
-               CustomData_add_layer(&tmp.fdata, CD_MFACE, CD_ASSIGN, 
dm->dupTessFaceArray(dm), totface);
        if(!CustomData_has_layer(&tmp.pdata, CD_MPOLY)) {
                tmp.mloop = dm->dupLoopArray(dm);
                tmp.mpoly = dm->dupPolyArray(dm);
@@ -425,6 +421,7 @@
                }
        }
 
+       tmp.totface = mesh_recalcTesselation(&tmp.fdata, &tmp.ldata, 
&tmp.pdata, tmp.mvert, tmp.totface, tmp.totloop, tmp.totpoly);
        mesh_update_customdata_pointers(&tmp);
 
        CustomData_free(&me->vdata, me->totvert);
@@ -530,7 +527,7 @@
 
 void *DM_get_tessface_data_layer(DerivedMesh *dm, int type)
 {
-       if(type == CD_MFACE)
+       if (type == CD_MFACE)
                return dm->getTessFaceArray(dm);
 
        return CustomData_get_layer(&dm->faceData, type);
@@ -1457,6 +1454,8 @@
        }
 #endif /* WITH_GAMEENGINE */
 
+       finaldm->calcNormals(finaldm);
+
        *final_r = finaldm;
 
        if(orcodm)
@@ -1508,7 +1507,7 @@
        ModifierData *md;
        float (*deformedVerts)[3] = NULL;
        CustomDataMask mask;
-       DerivedMesh *dm = NULL, *orcodm = NULL;
+       DerivedMesh *dm = NULL, *orcodm = NULL, *finaldm = NULL;
        int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, 
NULL, 1);
        LinkNode *datamasks, *curr;
        int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
@@ -1660,21 +1659,24 @@
         * then we need to build one.
         */
        if(dm && deformedVerts) {
-               *final_r = CDDM_copy(dm, 0);
+               finaldm = CDDM_copy(dm, 0);
 
                if(!(cage_r && dm == *cage_r)) dm->release(dm);
 
                CDDM_apply_vert_coords(*final_r, deformedVerts);
-               CDDM_calc_normals(*final_r);
        } else if (dm) {
-               *final_r = dm;
+               finaldm = dm;
        } else if (!deformedVerts && cage_r && *cage_r) {
-               *final_r = *cage_r;
+               finaldm = *cage_r;
        } else {
-               *final_r = getEditDerivedBMesh(em, ob, deformedVerts);
+               finaldm = getEditDerivedBMesh(em, ob, deformedVerts);
                deformedVerts = NULL;
        }
 
+       finaldm->calcNormals(finaldm);
+
+       *final_r = finaldm;
+
        /* add an orco layer if needed */
        if(dataMask & CD_MASK_ORCO)
                add_orco_dm(ob, em, *final_r, orcodm, CD_ORCO);

Modified: 
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c     
2011-11-13 15:10:54 UTC (rev 41796)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c     
2011-11-13 15:13:59 UTC (rev 41797)
@@ -1580,37 +1580,17 @@
 
 }
 
-static void cdDM_recalcTesselation(DerivedMesh *dm)
+void CDDM_recalc_tesselation(DerivedMesh *dm)
 {
        CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
 
        dm->numFaceData = mesh_recalcTesselation(&dm->faceData, &dm->loopData, 
                &dm->polyData, cddm->mvert, dm->numFaceData, dm->numLoopData, 
-               dm->numPolyData, 1, 0);
+               dm->numPolyData);
        
        cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
 }
 
-/*ignores original poly origindex layer*/
-static void cdDM_recalcTesselation2(DerivedMesh *dm)
-{
-       CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
-
-       dm->numFaceData = mesh_recalcTesselation(&dm->faceData, &dm->loopData, 
-               &dm->polyData, cddm->mvert, dm->numFaceData, dm->numLoopData, 
-               dm->numPolyData, 0, 0);
-       
-       cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
-}
-
-void CDDM_recalc_tesselation(DerivedMesh *dm, int orig_use_polyorig)
-{
-       if (orig_use_polyorig)
-               cdDM_recalcTesselation(dm);
-       else
-               cdDM_recalcTesselation2(dm);
-}
-
 static void cdDM_free_internal(CDDerivedMesh *cddm)
 {
        if(cddm->fmap) MEM_freeN(cddm->fmap);
@@ -1662,9 +1642,10 @@
        dm->getVertDataArray = DM_get_vert_data_layer;
        dm->getEdgeDataArray = DM_get_edge_data_layer;
        dm->getTessFaceDataArray = DM_get_tessface_data_layer;
-       
+
+       dm->calcNormals = CDDM_calc_normals;
        //doesn't work yet for all cases
-       //dm->recalcTesselation = cdDM_recalcTesselation;
+       //dm->recalcTesselation = CDDM_recalc_tesselation;
 
        dm->getVertCos = cdDM_getVertCos;
        dm->getVertCo = cdDM_getVertCo;
@@ -1708,6 +1689,7 @@
        CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, 
numVerts);
        CustomData_add_layer(&dm->edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, 
numEdges);
        CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, NULL, 
numFaces);
+       CustomData_add_layer(&dm->faceData, CD_POLYINDEX, CD_CALLOC, NULL, 
numFaces);
        CustomData_add_layer(&dm->polyData, CD_ORIGINDEX, CD_CALLOC, NULL, 
numPolys);
 
        CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, 
numVerts);
@@ -1731,6 +1713,7 @@
        DerivedMesh *dm = &cddm->dm;
        CustomDataMask mask = CD_MASK_MESH & (~CD_MASK_MDISPS);
        int alloctype;
+       int *polyindex = NULL;
 
        /* this does a referenced copy, with an exception for fluidsim */
 
@@ -1745,7 +1728,7 @@
                                         mesh->totvert);
        CustomData_merge(&mesh->edata, &dm->edgeData, mask, alloctype,
                                         mesh->totedge);
-       CustomData_merge(&mesh->fdata, &dm->faceData, mask|CD_MASK_ORIGINDEX, 
alloctype,
+       CustomData_merge(&mesh->fdata, &dm->faceData, mask|CD_MASK_POLYINDEX, 
alloctype,
                                         mesh->totface);
        CustomData_merge(&mesh->ldata, &dm->loopData, mask, alloctype,
                         mesh->totloop);
@@ -1758,9 +1741,13 @@
        cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
        cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
 
-       if (!CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX))
-               CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, 
NULL, mesh->totface);
+       BLI_assert(CustomData_has_layer(&cddm->dm.faceData, CD_POLYINDEX));
 
+       polyindex = CustomData_get_layer(&dm->faceData, CD_POLYINDEX);
+       if (!CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX)) {

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