merge with trunk at r31523
[blender.git] / source / blender / editors / mesh / mesh_data.c
index 2d337558f56bcd6c61cb31c3ee1c037b4dc5a8f1..80dc5331cf8ac1bf6958b6328d0e341dd9cc891b 100644 (file)
@@ -46,6 +46,7 @@
 #include "BKE_material.h"
 #include "BKE_mesh.h"
 #include "BKE_report.h"
+#include "BKE_tessmesh.h"
 
 #include "BLI_math.h"
 #include "BLI_editVert.h"
 static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *layer)
 {
        Mesh *me = ob->data;
-       CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
+       CustomData *data= (me->edit_btmesh)? &me->edit_btmesh->bm->pdata: &me->pdata;
        void *actlayerdata, *rndlayerdata, *clonelayerdata, *stencillayerdata, *layerdata=layer->data;
        int type= layer->type;
        int index= CustomData_get_layer_index(data, type);
-       int i, actindex, rndindex, cloneindex, stencilindex;
+       int i, actindex, rndindex, cloneindex, stencilindex, tot = me->totpoly;
        
+       if (layer->type == CD_MLOOPCOL) {
+               data = (me->edit_btmesh)? &me->edit_btmesh->bm->ldata: &me->ldata;
+               tot = me->totloop;
+       }
+
        /* ok, deleting a non-active layer needs to preserve the active layer indices.
          to do this, we store a pointer to the .data member of both layer and the active layer,
          (to detect if we're deleting the active layer or not), then use the active
@@ -88,15 +94,15 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la
        stencillayerdata = data->layers[CustomData_get_stencil_layer_index(data, type)].data;
        CustomData_set_layer_active(data, type, layer - &data->layers[index]);
 
-       if(me->edit_mesh) {
-               EM_free_data_layer(me->edit_mesh, data, type);
+       if(me->edit_btmesh) {
+               BM_free_data_layer(me->edit_btmesh->bm, data, type);
        }
        else {
-               CustomData_free_layer_active(data, type, me->totface);
+               CustomData_free_layer_active(data, type, tot);
                mesh_update_customdata_pointers(me);
        }
 
-       if(!CustomData_has_layer(data, type) && (type == CD_MCOL && (ob->mode & OB_MODE_VERTEX_PAINT)))
+       if(!CustomData_has_layer(data, type) && (type == CD_MLOOPCOL && (ob->mode & OB_MODE_VERTEX_PAINT)))
                ED_object_toggle_modes(C, OB_MODE_VERTEX_PAINT);
 
        /* reconstruct active layer */
@@ -159,30 +165,30 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la
 
 int ED_mesh_uv_texture_add(bContext *C, Scene *scene, Object *ob, Mesh *me)
 {
-       EditMesh *em;
+       BMEditMesh *em;
        int layernum;
 
-       if(me->edit_mesh) {
-               em= me->edit_mesh;
+       if(me->edit_btmesh) {
+               em= me->edit_btmesh;
 
-               layernum= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
+               layernum= CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY);
                if(layernum >= MAX_MTFACE)
                        return OPERATOR_CANCELLED;
 
-               EM_add_data_layer(em, &em->fdata, CD_MTFACE);
-               CustomData_set_layer_active(&em->fdata, CD_MTFACE, layernum);
+               BM_add_data_layer(em->bm, &em->bm->pdata, MAX_MTFACE);
+               CustomData_set_layer_active(&em->bm->pdata, MAX_MTFACE, layernum);
        }
        else {
-               layernum= CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+               layernum= CustomData_number_of_layers(&me->pdata, MAX_MTFACE);
                if(layernum >= MAX_MTFACE)
                        return OPERATOR_CANCELLED;
 
                if(me->mtface)
-                       CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DUPLICATE, me->mtface, me->totface);
+                       CustomData_add_layer(&me->pdata, MAX_MTFACE, CD_DUPLICATE, me->mtpoly, me->totpoly);
                else
-                       CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface);
+                       CustomData_add_layer(&me->pdata, MAX_MTFACE, CD_DEFAULT, NULL, me->totpoly);
 
-               CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum);
+               CustomData_set_layer_active(&me->pdata, MAX_MTFACE, layernum);
                mesh_update_customdata_pointers(me);
        }
 
@@ -194,12 +200,11 @@ int ED_mesh_uv_texture_add(bContext *C, Scene *scene, Object *ob, Mesh *me)
 
 int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
 {
-       CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
        CustomDataLayer *cdl;
        int index;
 
-        index= CustomData_get_active_layer_index(data, CD_MTFACE);
-       cdl= (index == -1) ? NULL: &data->layers[index];
+       index= CustomData_get_active_layer_index(&me->pdata, CD_MTEXPOLY);
+       cdl= (index == -1)? NULL: &me->pdata.layers[index];
 
        if(!cdl)
                return 0;
@@ -213,37 +218,39 @@ int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
 
 int ED_mesh_color_add(bContext *C, Scene *scene, Object *ob, Mesh *me)
 {
-       EditMesh *em;
-       MCol *mcol;
+       BMEditMesh *em;
+       MLoopCol *mcol;
        int layernum;
 
-       if(me->edit_mesh) {
-               em= me->edit_mesh;
+       if(me->edit_btmesh) {
+               em= me->edit_btmesh;
 
-               layernum= CustomData_number_of_layers(&em->fdata, CD_MCOL);
+               layernum= CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPCOL);
                if(layernum >= MAX_MCOL)
                        return 0;
 
-               EM_add_data_layer(em, &em->fdata, CD_MCOL);
-               CustomData_set_layer_active(&em->fdata, CD_MCOL, layernum);
+               BM_add_data_layer(em->bm, &em->bm->pdata, CD_MLOOPCOL);
+               CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPCOL, layernum);
        }
        else {
-               layernum= CustomData_number_of_layers(&me->fdata, CD_MCOL);
-               if(layernum >= MAX_MCOL)
+               layernum= CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL);
+               if(layernum >= CD_MLOOPCOL)
                        return 0;
 
-               mcol= me->mcol;
+               mcol= me->mloopcol;
 
-               if(me->mcol)
-                       CustomData_add_layer(&me->fdata, CD_MCOL, CD_DUPLICATE, me->mcol, me->totface);
+               if(me->mloopcol)
+                       CustomData_add_layer(&me->ldata, CD_MLOOPCOL, CD_DUPLICATE, me->mloopcol, me->totloop);
                else
-                       CustomData_add_layer(&me->fdata, CD_MCOL, CD_DEFAULT, NULL, me->totface);
+                       CustomData_add_layer(&me->ldata, CD_MLOOPCOL, CD_DEFAULT, NULL, me->totloop);
 
-               CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum);
+               CustomData_set_layer_active(&me->ldata, CD_MLOOPCOL, layernum);
                mesh_update_customdata_pointers(me);
 
+               /*BMESH_TODO
                if(!mcol)
                        shadeMeshMCol(scene, ob, me);
+               */
        }
 
        DAG_id_flush_update(&me->id, OB_RECALC_DATA);
@@ -254,12 +261,11 @@ int ED_mesh_color_add(bContext *C, Scene *scene, Object *ob, Mesh *me)
 
 int ED_mesh_color_remove(bContext *C, Object *ob, Mesh *me)
 {
-       CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
        CustomDataLayer *cdl;
        int index;
 
-        index= CustomData_get_active_layer_index(data, CD_MCOL);
-       cdl= (index == -1)? NULL: &data->layers[index];
+       index= CustomData_get_active_layer_index(&me->pdata, CD_MLOOPCOL);
+       cdl= (index == -1)? NULL: &me->pdata.layers[index];
 
        if(!cdl)
                return 0;
@@ -341,25 +347,25 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
                return OPERATOR_CANCELLED;
        }
        
-       /* turn mesh in editmode */
-       /* BKE_mesh_get/end_editmesh: ED_uvedit_assign_image also calls this */
+       /* put mesh in editmode */
 
        obedit= base->object;
        me= obedit->data;
-       if(me->edit_mesh==NULL) {
-               make_editMesh(scene, obedit);
+       if(me->edit_btmesh==NULL) {
+               EDBM_MakeEditBMesh(scene->toolsettings, scene, obedit);
                exitmode= 1;
        }
-       if(me->edit_mesh==NULL)
+
+       if(me->edit_btmesh==NULL)
                return OPERATOR_CANCELLED;
        
        ED_uvedit_assign_image(scene, obedit, ima, NULL);
 
        if(exitmode) {
-               load_editMesh(scene, obedit);
-               free_editMesh(me->edit_mesh);
-               MEM_freeN(me->edit_mesh);
-               me->edit_mesh= NULL;
+               EDBM_LoadEditBMesh(scene, obedit);
+               EDBM_FreeEditBMesh(me->edit_btmesh);
+               MEM_freeN(me->edit_btmesh);
+               me->edit_btmesh= NULL;
        }
 
        WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -543,7 +549,7 @@ static void mesh_calc_edges(Mesh *mesh, int update)
        MFace *mf = mesh->mface;
        MEdge *med, *med_orig;
        EdgeHash *eh = BLI_edgehash_new();
-       int i, totedge, totface = mesh->totface;
+       int i, *index, totedge, totface = mesh->totface;
 
        if(mesh->totedge==0)
                update= 0;
@@ -582,14 +588,14 @@ static void mesh_calc_edges(Mesh *mesh, int update)
        ehi = BLI_edgehashIterator_new(eh);
        med = CustomData_get_layer(&edata, CD_MEDGE);
        for(i = 0; !BLI_edgehashIterator_isDone(ehi);
-               BLI_edgehashIterator_step(ehi), ++i, ++med) {
+           BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) {
 
                if(update && (med_orig=BLI_edgehashIterator_getValue(ehi))) {
                        *med= *med_orig; /* copy from the original */
                } else {
-                       BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
-                       med->flag = ME_EDGEDRAW|ME_EDGERENDER;
-               }
+               BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
+               med->flag = ME_EDGEDRAW|ME_EDGERENDER;
+       }
        }
        BLI_edgehashIterator_free(ehi);
 
@@ -717,7 +723,7 @@ static void mesh_add_faces(Mesh *mesh, int len)
 
 void ED_mesh_geometry_add(Mesh *mesh, ReportList *reports, int verts, int edges, int faces)
 {
-       if(mesh->edit_mesh) {
+       if(mesh->edit_btmesh) {
                BKE_report(reports, RPT_ERROR, "Can't add geometry in edit mode.");
                return;
        }