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 0867afc0fb28cb6ca4e976ca87a5d1fd570d1167..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 "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);
@@ -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.
+
+  use_face_origindex sets the tesselation faces' origindex layer
+  to point to the tesselation faces themselves, not the polys.
 
-  returns number of tesselation faces.*/
+  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;
@@ -1659,7 +1662,7 @@ int mesh_recalcTesselation(CustomData *fdata,
                        mf[k].v3 = f->v3->keyindex;
                        mf[k].mat_nr = mp->mat_nr;
                        mf[k].flag = mp->flag;
-                       origIndex[k] = f->v1->tmp.l;
+                       origIndex[k] = use_face_origindex ? k : f->v1->tmp.l;
 
                        k++;
                }