clobbered bmesh code by accident from commit r38660, reverted and apply changes from trunk merge -r37500:37600
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user