clobbered bmesh code by accident from commit r38660, reverted and apply changes from trunk merge -r37500:37600

This commit is contained in:
2011-07-25 09:53:36 +00:00
parent b709b52f46
commit e392ee3319

View File

@@ -43,6 +43,7 @@
#include "DNA_scene_types.h"
#include "DNA_view3d_types.h"
#include "BLI_utildefines.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_edgehash.h"
@@ -56,6 +57,7 @@
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_report.h"
#include "BKE_tessmesh.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -72,15 +74,27 @@
#include "mesh_intern.h"
#define GET_CD_DATA(me, data) (me->edit_btmesh ? &me->edit_btmesh->bm->data : &me->data)
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;
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 index;
int i, actindex, rndindex, cloneindex, stencilindex, tot;
if (layer->type == CD_MLOOPCOL || layer->type == CD_MLOOPUV) {
data = (me->edit_btmesh)? &me->edit_btmesh->bm->ldata: &me->ldata;
tot = me->totloop;
} else {
data = (me->edit_btmesh)? &me->edit_btmesh->bm->pdata: &me->pdata;
tot = me->totpoly;
}
index = CustomData_get_layer_index(data, type);
/* 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
@@ -94,15 +108,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 */
@@ -163,8 +177,13 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la
}
}
static void copy_editface_active_customdata(EditMesh *em, int type, int index)
static void copy_editface_active_customdata(BMEditMesh *em, int type, int index)
{
#if 1 /*BMESH_TODO*/
(void)em;
(void)type;
(void)index;
#else
EditFace *efa;
int n= CustomData_get_active_layer(&em->fdata, type);
@@ -172,41 +191,56 @@ static void copy_editface_active_customdata(EditMesh *em, int type, int index)
void *data= CustomData_em_get_n(&em->fdata, efa->data, type, n);
CustomData_em_set_n(&em->fdata, efa->data, type, index, data);
}
#endif
}
int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set)
{
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 0;
EM_add_data_layer(em, &em->fdata, CD_MTFACE, name);
BM_add_data_layer(em->bm, &em->bm->pdata, CD_MTEXPOLY);
CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum);
CustomData_set_layer_name(&em->bm->pdata, CD_MTEXPOLY, layernum, name);
if(layernum) /* copy data from active UV */
copy_editface_active_customdata(em, CD_MTFACE, layernum);
if(active_set || layernum==0)
CustomData_set_layer_active(&em->fdata, CD_MTFACE, layernum);
CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum);
BM_add_data_layer(em->bm, &em->bm->ldata, CD_MLOOPUV);
CustomData_set_layer_name(&em->bm->ldata, CD_MLOOPUV, layernum, name);
CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum);
if(active_set || layernum==0)
CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum);
}
else {
layernum= CustomData_number_of_layers(&me->fdata, CD_MTFACE);
layernum= CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
if(layernum >= MAX_MTFACE)
return 0;
if(me->mtface)
CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DUPLICATE, me->mtface, me->totface, name);
else
CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface, name);
if(active_set || layernum==0)
CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum);
if(me->mtpoly) {
CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DUPLICATE, me->mtpoly, me->totpoly, name);
CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_DUPLICATE, me->mloopuv, me->totloop, name);
} else {
CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DEFAULT, NULL, me->totpoly, name);
CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_DEFAULT, NULL, me->totloop, name);
}
if(active_set || layernum==0) {
CustomData_set_layer_active(&me->pdata, CD_MTEXPOLY, layernum);
CustomData_set_layer_active(&me->ldata, CD_MLOOPUV, layernum);
}
mesh_update_customdata_pointers(me);
}
@@ -218,17 +252,22 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s
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;
CustomData *pdata = GET_CD_DATA(me, pdata), *ldata = GET_CD_DATA(me, ldata);
CustomDataLayer *cdlp, *cdlu;
int index;
index= CustomData_get_active_layer_index(data, CD_MTFACE);
cdl= (index == -1) ? NULL: &data->layers[index];
index= CustomData_get_active_layer_index(pdata, CD_MTEXPOLY);
cdlp= (index == -1)? NULL: &pdata->layers[index];
if(!cdl)
index= CustomData_get_active_layer_index(ldata, CD_MLOOPUV);
cdlu= (index == -1)? NULL: &ldata->layers[index];
if (!cdlp || !cdlu)
return 0;
delete_customdata_layer(C, ob, cdl);
delete_customdata_layer(C, ob, cdlp);
delete_customdata_layer(C, ob, cdlu);
DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
@@ -237,39 +276,42 @@ int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mesh *me, const char *name, int active_set)
{
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, name);
BM_add_data_layer(em->bm, &em->bm->pdata, CD_MLOOPCOL);
CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPCOL, layernum);
if(layernum) /* copy data from active vertex color layer */
copy_editface_active_customdata(em, CD_MCOL, layernum);
if(active_set || layernum==0)
CustomData_set_layer_active(&em->fdata, CD_MCOL, layernum);
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_named(&me->fdata, CD_MCOL, CD_DUPLICATE, me->mcol, me->totface, name);
if(me->mloopcol)
CustomData_add_layer_named(&me->ldata, CD_MLOOPCOL, CD_DUPLICATE, me->mloopcol, me->totloop, name);
else
CustomData_add_layer_named(&me->fdata, CD_MCOL, CD_DEFAULT, NULL, me->totface, name);
CustomData_add_layer_named(&me->ldata, CD_MLOOPCOL, CD_DEFAULT, NULL, me->totloop, name);
if(active_set || layernum==0)
CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum);
CustomData_set_layer_active(&me->ldata, CD_MLOOPCOL, layernum);
mesh_update_customdata_pointers(me);
}
@@ -282,12 +324,11 @@ int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mes
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->ldata, CD_MLOOPCOL);
cdl= (index == -1)? NULL: &me->ldata.layers[index];
if(!cdl)
return 0;
@@ -368,25 +409,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;
}
/* dummie drop support; ensure view shows a result :) */
@@ -572,7 +613,7 @@ void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges)
if(calc_edges || (mesh->totface && mesh->totedge == 0))
BKE_mesh_calc_edges(mesh, calc_edges);
mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL);
mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL);
DAG_id_tag_update(&mesh->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mesh);
@@ -608,15 +649,15 @@ static void mesh_add_verts(Mesh *mesh, int len)
mesh->totvert= totvert;
}
void ED_mesh_transform(Mesh *me, float *mat)
void ED_mesh_transform(Mesh *mesh, float *mat)
{
int i;
MVert *mvert= me->mvert;
MVert *mvert= mesh->mvert;
for(i= 0; i < me->totvert; i++, mvert++)
for(i= 0; i < mesh->totvert; i++, mvert++)
mul_m4_v3((float (*)[4])mat, mvert->co);
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL);
}
static void mesh_add_edges(Mesh *mesh, int len)
@@ -682,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;
}
@@ -698,19 +739,18 @@ void ED_mesh_geometry_add(Mesh *mesh, ReportList *reports, int verts, int edges,
void ED_mesh_faces_add(Mesh *mesh, ReportList *reports, int count)
{
if(mesh->edit_mesh) {
if(mesh->edit_btmesh) {
BKE_report(reports, RPT_ERROR, "Can't add faces in edit mode.");
return;
}
mesh_add_faces(mesh, count);
}
void ED_mesh_edges_add(Mesh *mesh, ReportList *reports, int count)
{
if(mesh->edit_mesh) {
if(mesh->edit_btmesh) {
BKE_report(reports, RPT_ERROR, "Can't add edges in edit mode.");
return;
return;
}
mesh_add_edges(mesh, count);
@@ -718,7 +758,7 @@ void ED_mesh_edges_add(Mesh *mesh, ReportList *reports, int count)
void ED_mesh_vertices_add(Mesh *mesh, ReportList *reports, int count)
{
if(mesh->edit_mesh) {
if(mesh->edit_btmesh) {
BKE_report(reports, RPT_ERROR, "Can't add vertices in edit mode.");
return;
}
@@ -726,7 +766,7 @@ void ED_mesh_vertices_add(Mesh *mesh, ReportList *reports, int count)
mesh_add_verts(mesh, count);
}
void ED_mesh_calc_normals(Mesh *me)
void ED_mesh_calc_normals(Mesh *mesh)
{
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL);
}