merge with trunk at r27259 and commit of a patch by anthony jones to fix msvc (though...
[blender-staging.git] / source / blender / blenkernel / intern / mesh.c
index b595e5e5d664349e8fe54b3e4c20298a737ad2e0..c7b769417937b4f66b8cc19450e186b1fc7e297f 100644 (file)
@@ -19,7 +19,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
@@ -41,6 +41,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "DNA_ID.h"
+#include "DNA_anim_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_material_types.h"
@@ -51,6 +52,7 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_ipo_types.h"
 
+#include "BKE_animsys.h"
 #include "BKE_customdata.h"
 #include "BKE_depsgraph.h"
 #include "BKE_main.h"
 
 #include "BLI_blenlib.h"
 #include "BLI_editVert.h"
-#include "BLI_arithb.h"
+#include "BLI_math.h"
 #include "BLI_cellalloc.h"
 #include "BLI_array.h"
 #include "BLI_edgehash.h"
 
 #include "bmesh.h"
 
-EditMesh *BKE_mesh_get_editmesh(Mesh *me)
-{
-       return bmesh_to_editmesh(me->edit_btmesh->bm);
-}
-
-void free_editMesh(EditMesh *em);
-void BKE_mesh_end_editmesh(Mesh *me, EditMesh *em)
-{
-       BM_Free_Mesh(me->edit_btmesh->bm);
-       me->edit_btmesh->bm = editmesh_to_bmesh(em);
-       BMEdit_RecalcTesselation(me->edit_btmesh);
-       free_editMesh(em);
-       MEM_freeN(em);
-}
-
 static void mesh_ensure_tesselation_customdata(Mesh *me)
 {
        int tottex, totcol;
@@ -141,9 +128,9 @@ void mesh_update_linked_customdata(Mesh *me)
                CustomData_set_layer_clone(&me->ldata, CD_MLOOPUV, act);
                CustomData_set_layer_clone(&me->fdata, CD_MTFACE, act);
 
-               act = CustomData_get_mask_layer(&me->pdata, CD_MTEXPOLY);
-               CustomData_set_layer_mask(&me->ldata, CD_MLOOPUV, act);
-               CustomData_set_layer_mask(&me->fdata, CD_MTFACE, act);
+               act = CustomData_get_stencil_layer(&me->pdata, CD_MTEXPOLY);
+               CustomData_set_layer_stencil(&me->ldata, CD_MLOOPUV, act);
+               CustomData_set_layer_stencil(&me->fdata, CD_MTFACE, act);
        }
 
        if (CustomData_has_layer(&me->ldata, CD_MLOOPCOL)) {
@@ -156,8 +143,8 @@ void mesh_update_linked_customdata(Mesh *me)
                act = CustomData_get_clone_layer(&me->ldata, CD_MLOOPCOL);
                CustomData_set_layer_clone(&me->fdata, CD_MCOL, act);
 
-               act = CustomData_get_mask_layer(&me->ldata, CD_MLOOPCOL);
-               CustomData_set_layer_mask(&me->fdata, CD_MCOL, act);
+               act = CustomData_get_stencil_layer(&me->ldata, CD_MLOOPCOL);
+               CustomData_set_layer_stencil(&me->fdata, CD_MCOL, act);
        }
 }
 
@@ -233,6 +220,11 @@ void free_mesh(Mesh *me, int unlink)
        CustomData_free(&me->ldata, me->totloop);
        CustomData_free(&me->pdata, me->totpoly);
 
+       if(me->adt) {
+               BKE_free_animdata(&me->id);
+               me->adt= NULL;
+       }
+       
        if(me->mat) MEM_freeN(me->mat);
        
        if(me->bb) MEM_freeN(me->bb);
@@ -1220,7 +1212,7 @@ void mesh_to_curve(Scene *scene, Object *ob)
                                /* add points */
                                vl= polyline.first;
                                for (i=0, bp=nu->bp; i < totpoly; i++, bp++, vl=(VertLink *)vl->next) {
-                                       VecCopyf(bp->vec, mverts[vl->index].co);
+                                       copy_v3_v3(bp->vec, mverts[vl->index].co);
                                        bp->f1= SELECT;
                                        bp->radius = bp->weight = 1.0;
                                }
@@ -1280,23 +1272,23 @@ void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces,
                float *f_no= &fnors[i*3];
 
                if (mf->v4)
-                       CalcNormFloat4(mverts[mf->v1].co, mverts[mf->v2].co, mverts[mf->v3].co, mverts[mf->v4].co, f_no);
+                       normal_quad_v3( f_no,mverts[mf->v1].co, mverts[mf->v2].co, mverts[mf->v3].co, mverts[mf->v4].co);
                else
-                       CalcNormFloat(mverts[mf->v1].co, mverts[mf->v2].co, mverts[mf->v3].co, f_no);
+                       normal_tri_v3( f_no,mverts[mf->v1].co, mverts[mf->v2].co, mverts[mf->v3].co);
                
-               VecAddf(tnorms[mf->v1], tnorms[mf->v1], f_no);
-               VecAddf(tnorms[mf->v2], tnorms[mf->v2], f_no);
-               VecAddf(tnorms[mf->v3], tnorms[mf->v3], f_no);
+               add_v3_v3v3(tnorms[mf->v1], tnorms[mf->v1], f_no);
+               add_v3_v3v3(tnorms[mf->v2], tnorms[mf->v2], f_no);
+               add_v3_v3v3(tnorms[mf->v3], tnorms[mf->v3], f_no);
                if (mf->v4)
-                       VecAddf(tnorms[mf->v4], tnorms[mf->v4], f_no);
+                       add_v3_v3v3(tnorms[mf->v4], tnorms[mf->v4], f_no);
        }
        for (i=0; i<numVerts; i++) {
                MVert *mv= &mverts[i];
                float *no= tnorms[i];
                
-               if (Normalize(no)==0.0) {
+               if (normalize_v3(no)==0.0) {
                        VECCOPY(no, mv->co);
-                       Normalize(no);
+                       normalize_v3(no);
                }
 
                mv->no[0]= (short)(no[0]*32767.0);
@@ -1396,7 +1388,7 @@ UvVertMap *make_uv_vert_map(struct MFace *mface, struct MTFace *tface, unsigned
                                next= iterv->next;
 
                                uv2= (tf+iterv->f)->uv[iterv->tfindex];
-                               Vec2Subf(uvdiff, uv2, uv);
+                               sub_v2_v2v2(uvdiff, uv2, uv);
 
 
                                if(fabs(uv[0]-uv2[0]) < limit[0] && fabs(uv[1]-uv2[1]) < limit[1]) {
@@ -1598,13 +1590,24 @@ static void mesh_loops_to_corners(CustomData *fdata, CustomData *ldata,
        }
 }
 
-/*this function recreates a tesselation.
+/*
+  this function recreates a tesselation.
+  returns number of tesselation faces.
+
+  use_poly_origindex sets whether or not the tesselation faces' origindex
+  layer should point to original poly indices or real poly indices.
 
-  returns number of tesselation faces.*/
+  use_face_origindex sets the tesselation faces' origindex layer
+  to point to the tesselation faces themselves, not the polys.
+
+  if both of the above are 0, it'll use the indices of the mpolys of the MPoly
+  data in pdata, and ignore the origindex layer altogether.
+ */
 int mesh_recalcTesselation(CustomData *fdata, 
                            CustomData *ldata, CustomData *pdata,
                            MVert *mvert, int totface, int totloop, 
-                           int totpoly, int use_poly_origindex)
+                           int totpoly, int use_poly_origindex, 
+                          int use_face_origindex)
 {
        MPoly *mp, *mpoly;
        MLoop *ml, *mloop;
@@ -1657,7 +1660,9 @@ int mesh_recalcTesselation(CustomData *fdata,
                        mf[k].v1 = f->v1->keyindex;
                        mf[k].v2 = f->v2->keyindex;
                        mf[k].v3 = f->v3->keyindex;
-                       origIndex[k] = f->v1->tmp.l;
+                       mf[k].mat_nr = mp->mat_nr;
+                       mf[k].flag = mp->flag;
+                       origIndex[k] = use_face_origindex ? k : f->v1->tmp.l;
 
                        k++;
                }
@@ -1695,9 +1700,6 @@ int mesh_recalcTesselation(CustomData *fdata,
                mf->v2 = mloop[mf->v2].v;
                mf->v3 = mloop[mf->v3].v;
 
-               mf->flag = mpoly[origIndex[i]].flag;
-               mf->mat_nr = mpoly[origIndex[i]].mat_nr;
-
                mesh_loops_to_corners(fdata, ldata, pdata,
                        lindex, i, origIndex[i], numTex, numCol);
        }
@@ -1788,7 +1790,7 @@ void mesh_calc_poly_normal(MPoly *mpoly, MLoop *loopstart,
                v1 = mvarray + (loopstart++)->v;
                v2 = mvarray + (loopstart++)->v;
                v3 = mvarray + loopstart->v;
-               CalcNormFloat(v1->co, v2->co, v3->co, no);
+               normal_tri_v3( no,v1->co, v2->co, v3->co);
        }
        else if(mpoly->totloop == 4){
                MVert *v1, *v2, *v3, *v4;
@@ -1797,7 +1799,7 @@ void mesh_calc_poly_normal(MPoly *mpoly, MLoop *loopstart,
                v2 = mvarray + (loopstart++)->v;
                v3 = mvarray + (loopstart++)->v;
                v4 = mvarray + loopstart->v;
-               CalcNormFloat4(v1->co, v2->co, v3->co, v4->co, no);
+               normal_quad_v3( no,v1->co, v2->co, v3->co, v4->co);
        }
        else{ /*horrible, two sided face!*/
                no[0] = 0.0;