code cleanup: typos and set gcc attributes for string formatting.
[blender.git] / source / blender / blenkernel / intern / mesh.c
index 476fcff9220bdc315573bd9f9b44bb3d65fece67..514380dc980f3aa05031cfb84d46c51fdf516e50 100644 (file)
@@ -325,13 +325,16 @@ static void mesh_ensure_tessellation_customdata(Mesh *me)
 
                        CustomData_from_bmeshpoly(&me->fdata, &me->pdata, &me->ldata, me->totface);
 
-                       /* note: this warning may be un-called for if we are inirializing the mesh for the
-                        * first time from bmesh, rather then giving a warning about this we could be smarter
-                        * and check if there was any data to begin with, for now just print the warning with
-                        * some info to help troubleshoot whats going on - campbell */
-                       printf("%s: warning! Tessellation uvs or vcol data got out of sync, "
-                              "had to reset!\n    CD_MTFACE: %d != CD_MTEXPOLY: %d || CD_MCOL: %d != CD_MLOOPCOL: %d\n",
-                              __func__, tottex_tessface, tottex_original, totcol_tessface, totcol_original);
+                       /* TODO - add some --debug-mesh option */
+                       if (G.debug & G_DEBUG) {
+                               /* note: this warning may be un-called for if we are initializing the mesh for the
+                                * first time from bmesh, rather then giving a warning about this we could be smarter
+                                * and check if there was any data to begin with, for now just print the warning with
+                                * some info to help troubleshoot whats going on - campbell */
+                               printf("%s: warning! Tessellation uvs or vcol data got out of sync, "
+                                          "had to reset!\n    CD_MTFACE: %d != CD_MTEXPOLY: %d || CD_MCOL: %d != CD_MLOOPCOL: %d\n",
+                                          __func__, tottex_tessface, tottex_original, totcol_tessface, totcol_original);
+                       }
                }
        }
 }
@@ -556,7 +559,7 @@ BMesh *BKE_mesh_to_bmesh(Mesh *me, Object *ob)
 
        bm = BM_mesh_create(&bm_mesh_allocsize_default);
 
-       BMO_op_callf(bm, "mesh_to_bmesh mesh=%p object=%p set_shapekey=%b", me, ob, TRUE);
+       BM_mesh_bm_from_me(bm, me, TRUE, ob->shapenr);
 
        return bm;
 }
@@ -1055,7 +1058,7 @@ void mesh_strip_loose_polysloops(Mesh *me)
        MLoop *l;
        int a, b;
        /* New loops idx! */
-       int *new_idx = MEM_mallocN(sizeof(int) * me->totloop, "strip_loose_polysloops old2new idx mapping for polys.");
+       int *new_idx = MEM_mallocN(sizeof(int) * me->totloop, __func__);
 
        for (a = b = 0, p = me->mpoly; a < me->totpoly; a++, p++) {
                int invalid = FALSE;
@@ -1101,7 +1104,7 @@ void mesh_strip_loose_polysloops(Mesh *me)
                        b++;
                }
                else {
-                       /* XXX Theorically, we should be able to not do this, as no remaining poly
+                       /* XXX Theoretically, we should be able to not do this, as no remaining poly
                         *     should use any stripped loop. But for security's sake... */
                        new_idx[a] = -a;
                }
@@ -1116,6 +1119,8 @@ void mesh_strip_loose_polysloops(Mesh *me)
        for (a = 0, p = me->mpoly; a < me->totpoly; a++, p++) {
                p->loopstart = new_idx[p->loopstart];
        }
+
+       MEM_freeN(new_idx);
 }
 
 void mesh_strip_loose_edges(Mesh *me)
@@ -1221,7 +1226,10 @@ int nurbs_to_mdata(Object *ob, MVert **allvert, int *totvert,
        int *totloop, int *totpoly)
 {
        return nurbs_to_mdata_customdb(ob, &ob->disp,
-               allvert, totvert, alledge, totedge, allloop, allpoly, totloop, totpoly);
+                                      allvert, totvert,
+                                      alledge, totedge,
+                                      allloop, allpoly,
+                                      totloop, totpoly);
 }
 
 /* BMESH: this doesn't calculate all edges from polygons,
@@ -1229,9 +1237,11 @@ int nurbs_to_mdata(Object *ob, MVert **allvert, int *totvert,
 
 /* Initialize mverts, medges and, faces for converting nurbs to mesh and derived mesh */
 /* use specified dispbase  */
-int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int *_totvert,
-       MEdge **alledge, int *_totedge, MLoop **allloop, MPoly **allpoly,
-       int *_totloop, int *_totpoly)
+int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase,
+                            MVert **allvert, int *_totvert,
+                            MEdge **alledge, int *_totedge,
+                            MLoop **allloop, MPoly **allpoly,
+                            int *_totloop, int *_totpoly)
 {
        DispList *dl;
        Curve *cu;
@@ -1313,7 +1323,7 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
                                for (b=1; b<dl->nr; b++) {
                                        medge->v1= startvert+ofs+b-1;
                                        medge->v2= startvert+ofs+b;
-                                       medge->flag = ME_LOOSEEDGE|ME_EDGERENDER;
+                                       medge->flag = ME_LOOSEEDGE | ME_EDGERENDER | ME_EDGEDRAW;
 
                                        medge++;
                                }
@@ -1338,7 +1348,7 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
                                                medge->v1= startvert+ofs+b;
                                                if (b==dl->nr-1) medge->v2= startvert+ofs;
                                                else medge->v2= startvert+ofs+b+1;
-                                               medge->flag = ME_LOOSEEDGE|ME_EDGERENDER;
+                                               medge->flag = ME_LOOSEEDGE | ME_EDGERENDER | ME_EDGEDRAW;
                                                medge++;
                                        }
                                }
@@ -1463,7 +1473,7 @@ void nurbs_to_mesh(Object *ob)
        cu= ob->data;
 
        if (dm == NULL) {
-               if (nurbs_to_mdata (ob, &allvert, &totvert, &alledge, &totedge, &allloop, &allpoly, &totloop, &totpoly) != 0) {
+               if (nurbs_to_mdata(ob, &allvert, &totvert, &alledge, &totedge, &allloop, &allpoly, &totloop, &totpoly) != 0) {
                        /* Error initializing */
                        return;
                }
@@ -1483,7 +1493,8 @@ void nurbs_to_mesh(Object *ob)
                mesh_calc_normals(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL);
 
                BKE_mesh_calc_edges(me, TRUE);
-       } else {
+       }
+       else {
                me= add_mesh("Mesh");
                DM_to_mesh(dm, me, ob);
        }
@@ -1573,7 +1584,8 @@ void mesh_to_curve(Scene *scene, Object *ob)
                                BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
                        if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
                                BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
-               } else {
+               }
+               else {
                        if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
                                BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
                }
@@ -1737,7 +1749,8 @@ void mesh_set_smooth_flag(Object *meshOb, int enableSmooth)
 
                if (enableSmooth) {
                        mp->flag |= ME_SMOOTH;
-               } else {
+               }
+               else {
                        mp->flag &= ~ME_SMOOTH;
                }
        }
@@ -1747,7 +1760,8 @@ void mesh_set_smooth_flag(Object *meshOb, int enableSmooth)
 
                if (enableSmooth) {
                        mf->flag |= ME_SMOOTH;
-               } else {
+               }
+               else {
                        mf->flag &= ~ME_SMOOTH;
                }
        }
@@ -1971,6 +1985,11 @@ static void bm_corners_to_loops(Mesh *me, int findex, int loopstart, int numTex,
                float (*disps)[3] = fd->disps;
                int i, tot = mf->v4 ? 4 : 3;
                int side, corners;
+
+               if (CustomData_external_test(&me->fdata, CD_MDISPS)) {
+                       CustomData_external_add(&me->ldata, &me->id, CD_MDISPS,
+                                                                       me->totloop, me->fdata.external->filename);
+               }
                
                corners = multires_mdisp_corners(fd);
                
@@ -1999,7 +2018,7 @@ static void bm_corners_to_loops(Mesh *me, int findex, int loopstart, int numTex,
        }
 }
 
-void convert_mfaces_to_mpolys(Mesh *mesh)
+void BKE_mesh_convert_mfaces_to_mpolys(Mesh *mesh)
 {
        MFace *mf;
        MLoop *ml;
@@ -2035,12 +2054,18 @@ void convert_mfaces_to_mpolys(Mesh *mesh)
        CustomData_to_bmeshpoly(&mesh->fdata, &mesh->pdata, &mesh->ldata,
                mesh->totloop, mesh->totpoly);
 
+       /* ensure external data is transferred */
+       CustomData_external_read(&mesh->fdata, &mesh->id, CD_MASK_MDISPS, mesh->totface);
+
        eh = BLI_edgehash_new();
 
        /*build edge hash*/
        me = mesh->medge;
-       for (i=0; i<mesh->totedge; i++, me++) {
+       for (i = 0; i < mesh->totedge; i++, me++) {
                BLI_edgehash_insert(eh, me->v1, me->v2, SET_INT_IN_POINTER(i));
+
+               /* unrelated but avoid having the FGON flag enabled, so we can reuse it later for something else */
+               me->flag &= ~ME_FGON;
        }
 
        j = 0; /*current loop index*/
@@ -2055,18 +2080,19 @@ void convert_mfaces_to_mpolys(Mesh *mesh)
                mp->mat_nr = mf->mat_nr;
                mp->flag = mf->flag;
                
-               #define ML(v1, v2) {ml->v = mf->v1; ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, mf->v1, mf->v2)); ml++; j++;}
+#              define ML(v1, v2) {ml->v = mf->v1; ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, mf->v1, mf->v2)); ml++; j++;}
                
                ML(v1, v2);
                ML(v2, v3);
                if (mf->v4) {
                        ML(v3, v4);
                        ML(v4, v1);
-               } else {
+               }
+               else {
                        ML(v3, v1);
                }
                
-               #undef ML
+#              undef ML
 
                bm_corners_to_loops(mesh, i, mp->loopstart, numTex, numCol);
        }
@@ -2092,7 +2118,7 @@ float (*mesh_getVertexCos(Mesh *me, int *numVerts_r))[3]
 }
 
 
-/* ngon version wip, based on EDBM_make_uv_vert_map */
+/* ngon version wip, based on EDBM_uv_vert_map_create */
 /* this replaces the non bmesh function (in trunk) which takes MTFace's, if we ever need it back we could
  * but for now this replaces it because its unused. */
 
@@ -2274,7 +2300,7 @@ void mesh_loops_to_mface_corners(CustomData *fdata, CustomData *ldata,
                                  /* cache values to avoid lookups every time */
                                  const int numTex, /* CustomData_number_of_layers(pdata, CD_MTEXPOLY) */
                                  const int numCol, /* CustomData_number_of_layers(ldata, CD_MLOOPCOL) */
-                                 const int hasWCol, /* CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL) */
+                                 const int hasPCol, /* CustomData_has_layer(ldata, CD_PREVIEW_MLOOPCOL) */
                                  const int hasOrigSpace /* CustomData_has_layer(ldata, CD_ORIGSPACE_MLOOP) */
                                  )
 {
@@ -2306,11 +2332,11 @@ void mesh_loops_to_mface_corners(CustomData *fdata, CustomData *ldata,
                }
        }
 
-       if (hasWCol) {
-               mcol = CustomData_get(fdata,  findex, CD_WEIGHT_MCOL);
+       if (hasPCol) {
+               mcol = CustomData_get(fdata,  findex, CD_PREVIEW_MCOL);
 
                for (j=0; j < mf_len; j++) {
-                       mloopcol = CustomData_get(ldata, lindex[j], CD_WEIGHT_MLOOPCOL);
+                       mloopcol = CustomData_get(ldata, lindex[j], CD_PREVIEW_MLOOPCOL);
                        MESH_MLOOPCOL_TO_MCOL(mloopcol, &mcol[j]);
                }
        }
@@ -2338,7 +2364,6 @@ int mesh_recalcTessellation(CustomData *fdata,
                             * we can skip copying here */
                            const int do_face_nor_cpy)
 {
-
        /* use this to avoid locking pthread for _every_ polygon
         * and calling the fill function */
 
@@ -2352,6 +2377,7 @@ int mesh_recalcTessellation(CustomData *fdata,
        MLoop *ml, *mloop;
        MFace *mface = NULL, *mf;
        BLI_array_declare(mface);
+       ScanFillContext sf_ctx;
        ScanFillVert *v, *lastv, *firstv;
        ScanFillFace *f;
        int *mface_orig_index = NULL;
@@ -2364,7 +2390,7 @@ int mesh_recalcTessellation(CustomData *fdata,
 
        const int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
        const int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
-       const int hasWCol = CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL);
+       const int hasPCol = CustomData_has_layer(ldata, CD_PREVIEW_MLOOPCOL);
        const int hasOrigSpace = CustomData_has_layer(ldata, CD_ORIGSPACE_MLOOP);
 
        mpoly = CustomData_get_layer(pdata, CD_MPOLY);
@@ -2401,6 +2427,7 @@ int mesh_recalcTessellation(CustomData *fdata,
                        BLI_array_append(mface_orig_index,                                \
                                     poly_orig_index[poly_index]);                    \
                }                                                                     \
+               (void)0
 
 /* ALMOST IDENTICAL TO DEFINE ABOVE (see EXCEPTION) */
 #define ML_TO_MF_QUAD()                                                       \
@@ -2420,20 +2447,21 @@ int mesh_recalcTessellation(CustomData *fdata,
                                     poly_orig_index[poly_index]);                    \
                }                                                                     \
                mf->edcode |= TESSFACE_IS_QUAD; /* EXCEPTION */                       \
+               (void)0
 
 
                else if (mp->totloop == 3) {
-                       ML_TO_MF(0, 1, 2)
+                       ML_TO_MF(0, 1, 2);
                        mface_index++;
                }
                else if (mp->totloop == 4) {
 #ifdef USE_TESSFACE_QUADS
-                       ML_TO_MF_QUAD()
+                       ML_TO_MF_QUAD();
                        mface_index++;
 #else
-                       ML_TO_MF(0, 1, 2)
+                       ML_TO_MF(0, 1, 2);
                        mface_index++;
-                       ML_TO_MF(0, 2, 3)
+                       ML_TO_MF(0, 2, 3);
                        mface_index++;
 #endif
                }
@@ -2443,24 +2471,24 @@ int mesh_recalcTessellation(CustomData *fdata,
 
                        ml = mloop + mp->loopstart;
                        
-                       BLI_begin_edgefill();
+                       BLI_begin_edgefill(&sf_ctx);
                        firstv = NULL;
                        lastv = NULL;
                        for (j=0; j<mp->totloop; j++, ml++) {
-                               v = BLI_addfillvert(mvert[ml->v].co);
+                               v = BLI_addfillvert(&sf_ctx, mvert[ml->v].co);
        
                                v->keyindex = mp->loopstart + j;
        
                                if (lastv)
-                                       BLI_addfilledge(lastv, v);
+                                       BLI_addfilledge(&sf_ctx, lastv, v);
        
                                if (!firstv)
                                        firstv = v;
                                lastv = v;
                        }
-                       BLI_addfilledge(lastv, firstv);
+                       BLI_addfilledge(&sf_ctx, lastv, firstv);
                        
-                       totfilltri = BLI_edgefill(2);
+                       totfilltri = BLI_edgefill(&sf_ctx, FALSE);
                        if (totfilltri) {
                                BLI_array_growitems(mface_to_poly_map, totfilltri);
                                BLI_array_growitems(mface, totfilltri);
@@ -2468,7 +2496,7 @@ int mesh_recalcTessellation(CustomData *fdata,
                                        BLI_array_growitems(mface_orig_index, totfilltri);
                                }
 
-                               for (f = fillfacebase.first; f; f = f->next, mf++) {
+                               for (f = sf_ctx.fillfacebase.first; f; f = f->next, mf++) {
                                        mface_to_poly_map[mface_index] = poly_index;
                                        mf= &mface[mface_index];
 
@@ -2493,7 +2521,7 @@ int mesh_recalcTessellation(CustomData *fdata,
                                }
                        }
        
-                       BLI_end_edgefill();
+                       BLI_end_edgefill(&sf_ctx);
                }
        }
 
@@ -2587,7 +2615,7 @@ int mesh_recalcTessellation(CustomData *fdata,
 #else
                                            3,
 #endif
-                                           numTex, numCol, hasWCol, hasOrigSpace);
+                                           numTex, numCol, hasPCol, hasOrigSpace);
 
 
 #ifdef USE_TESSFACE_QUADS
@@ -2624,7 +2652,7 @@ int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
 
        const int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
        const int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
-       const int hasWCol = CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL);
+       const int hasPCol = CustomData_has_layer(ldata, CD_PREVIEW_MLOOPCOL);
        const int hasOrigSpace = CustomData_has_layer(ldata, CD_ORIGSPACE_MLOOP);
 
        mpoly = CustomData_get_layer(pdata, CD_MPOLY);
@@ -2683,7 +2711,7 @@ int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
 
                                mesh_loops_to_mface_corners(fdata, ldata, pdata,
                                                            lindex, k, i, 3,
-                                                           numTex, numCol, hasWCol, hasOrigSpace);
+                                                           numTex, numCol, hasPCol, hasOrigSpace);
                                test_index_face(mf, fdata, k, 3);
                        }
                        else {
@@ -2703,7 +2731,7 @@ int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
 
                                mesh_loops_to_mface_corners(fdata, ldata, pdata,
                                                            lindex, k, i, 4,
-                                                           numTex, numCol, hasWCol, hasOrigSpace);
+                                                           numTex, numCol, hasPCol, hasOrigSpace);
                                test_index_face(mf, fdata, k, 4);
                        }
 
@@ -2776,7 +2804,8 @@ static void mesh_calc_ngon_normal(MPoly *mpoly, MLoop *loopstart,
                normal[2] = 1.0f;
 
                return;
-       } else l = 1.0f / l;
+       }
+       else l = 1.0f / l;
 
        n[0] *= l;
        n[1] *= l;
@@ -2854,7 +2883,10 @@ static void mesh_calc_ngon_normal_coords(MPoly *mpoly, MLoop *loopstart,
                normal[2] = 1.0f;
 
                return;
-       } else l = 1.0f / l;
+       }
+       else {
+               l = 1.0f / l;
+       }
 
        n[0] *= l;
        n[1] *= l;
@@ -2996,7 +3028,7 @@ int poly_get_adj_loops_from_vert(unsigned adj_r[3], const MPoly *poly,
                                                                                  &mloop[poly->loopstart],
                                                                                  vert);
                
-       if(corner != -1) {
+       if (corner != -1) {
                const MLoop *ml = &mloop[poly->loopstart + corner];
 
                /* vertex was found */
@@ -3009,7 +3041,7 @@ int poly_get_adj_loops_from_vert(unsigned adj_r[3], const MPoly *poly,
 }
 
 /* update the hide flag for edges and faces from the corresponding
  flag in verts */
* flag in verts */
 void mesh_flush_hidden_from_verts(const MVert *mvert,
                                                                  const MLoop *mloop,
                                                                  MEdge *medge, int totedge,
@@ -3017,19 +3049,19 @@ void mesh_flush_hidden_from_verts(const MVert *mvert,
 {
        int i, j;
        
-       for(i = 0; i < totedge; i++) {
+       for (i = 0; i < totedge; i++) {
                MEdge *e = &medge[i];
-               if(mvert[e->v1].flag & ME_HIDE ||
+               if (mvert[e->v1].flag & ME_HIDE ||
                   mvert[e->v2].flag & ME_HIDE)
                        e->flag |= ME_HIDE;
                else
                        e->flag &= ~ME_HIDE;
        }
-       for(i = 0; i < totpoly; i++) {
+       for (i = 0; i < totpoly; i++) {
                MPoly *p = &mpoly[i];
                p->flag &= ~ME_HIDE;
-               for(j = 0; j < p->totloop; j++) {
-                       if(mvert[mloop[p->loopstart + j].v].flag & ME_HIDE)
+               for (j = 0; j < p->totloop; j++) {
+                       if (mvert[mloop[p->loopstart + j].v].flag & ME_HIDE)
                                p->flag |= ME_HIDE;
                }
        }
@@ -3100,7 +3132,7 @@ void BKE_mesh_ensure_navmesh(Mesh *me)
        if (!CustomData_has_layer(&me->pdata, CD_RECAST)) {
                int i;
                int numFaces = me->totpoly;
-               intrecastData;
+               int *recastData;
                CustomData_add_layer_named(&me->pdata, CD_RECAST, CD_CALLOC, NULL, numFaces, "recastData");
                recastData = (int*)CustomData_get_layer(&me->pdata, CD_RECAST);
                for (i=0; i<numFaces; i++) {