Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/mesh/editmesh.c')
-rw-r--r--source/blender/editors/mesh/editmesh.c96
1 files changed, 56 insertions, 40 deletions
diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c
index 76f7748839f..af7801bc95c 100644
--- a/source/blender/editors/mesh/editmesh.c
+++ b/source/blender/editors/mesh/editmesh.c
@@ -802,13 +802,14 @@ static int editmesh_pointcache_edit(Scene *scene, Object *ob, int totvert, PTCac
}
/* turns Mesh into editmesh */
-void make_editMesh(Scene *scene, EditMesh *em)
+void make_editMesh(Scene *scene, Object *ob)
{
- Mesh *me= G.obedit->data;
+ Mesh *me= ob->data;
MFace *mface;
MVert *mvert;
MSelect *mselect;
KeyBlock *actkey;
+ EditMesh *em;
EditVert *eve, **evlist, *eve1, *eve2, *eve3, *eve4;
EditFace *efa;
EditEdge *eed;
@@ -819,9 +820,15 @@ void make_editMesh(Scene *scene, EditMesh *em)
float cacheco[3], cachemat[4][4], *co;
int tot, a, cacheedit= 0, eekadoodle= 0;
- /* because of reload */
- free_editMesh(em);
+ if(me->edit_mesh==NULL)
+ me->edit_mesh= MEM_callocN(sizeof(EditMesh), "editmesh");
+ else
+ /* because of reload */
+ free_editMesh(me->edit_mesh);
+
+ em= me->edit_mesh;
+ em->selectmode= scene->selectmode; // warning needs to be synced
em->act_face = NULL;
G.totvert= tot= me->totvert;
G.totedge= me->totedge;
@@ -834,9 +841,9 @@ void make_editMesh(Scene *scene, EditMesh *em)
/* initialize fastmalloc for editmesh */
init_editmesh_fastmalloc(em, me->totvert, me->totedge, me->totface);
- actkey = ob_get_keyblock(G.obedit);
+ actkey = ob_get_keyblock(ob);
if(actkey) {
- strcpy(G.editModeTitleExtra, "(Key) ");
+ // XXX strcpy(G.editModeTitleExtra, "(Key) ");
key_to_mesh(actkey, me);
tot= actkey->totelem;
/* undo-ing in past for previous editmode sessions gives corrupt 'keyindex' values */
@@ -848,7 +855,7 @@ void make_editMesh(Scene *scene, EditMesh *em)
CustomData_copy(&me->vdata, &em->vdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
mvert= me->mvert;
- cacheedit= editmesh_pointcache_edit(scene, G.obedit, tot, &pid, cachemat, 0);
+ cacheedit= editmesh_pointcache_edit(scene, ob, tot, &pid, cachemat, 0);
evlist= (EditVert **)MEM_mallocN(tot*sizeof(void *),"evlist");
for(a=0; a<tot; a++, mvert++) {
@@ -1000,13 +1007,14 @@ void make_editMesh(Scene *scene, EditMesh *em)
}
/* makes Mesh out of editmesh */
-void load_editMesh(Scene *scene, EditMesh *em)
+void load_editMesh(Scene *scene, Object *ob)
{
- Mesh *me= G.obedit->data;
+ Mesh *me= ob->data;
MVert *mvert, *oldverts;
MEdge *medge;
MFace *mface;
MSelect *mselect;
+ EditMesh *em= me->edit_mesh;
EditVert *eve;
EditFace *efa, *efa_act;
EditEdge *eed;
@@ -1075,7 +1083,7 @@ void load_editMesh(Scene *scene, EditMesh *em)
a= 0;
/* check for point cache editing */
- cacheedit= editmesh_pointcache_edit(scene, G.obedit, G.totvert, &pid, cachemat, 1);
+ cacheedit= editmesh_pointcache_edit(scene, ob, G.totvert, &pid, cachemat, 1);
while(eve) {
if(cacheedit) {
@@ -1143,9 +1151,9 @@ void load_editMesh(Scene *scene, EditMesh *em)
/* write changes to cache */
if(cacheedit) {
if(pid.type == PTCACHE_TYPE_CLOTH)
- cloth_write_cache(G.obedit, pid.data, pid.cache->editframe);
+ cloth_write_cache(ob, pid.data, pid.cache->editframe);
else if(pid.type == PTCACHE_TYPE_SOFTBODY)
- sbWriteCache(G.obedit, pid.cache->editframe);
+ sbWriteCache(ob, pid.cache->editframe);
}
/* the edges */
@@ -1250,7 +1258,7 @@ void load_editMesh(Scene *scene, EditMesh *em)
int i,j;
for (ob=G.main->object.first; ob; ob=ob->id.next) {
- if (ob->parent==G.obedit && ELEM(ob->partype, PARVERT1,PARVERT3)) {
+ if (ob->parent==ob && ELEM(ob->partype, PARVERT1,PARVERT3)) {
/* duplicate code from below, make it function later...? */
if (!vertMap) {
@@ -1311,7 +1319,7 @@ void load_editMesh(Scene *scene, EditMesh *em)
/* are there keys? */
if(me->key) {
- KeyBlock *currkey, *actkey = ob_get_keyblock(G.obedit);
+ KeyBlock *currkey, *actkey = ob_get_keyblock(ob);
/* Lets reorder the key data so that things line up roughly
* with the way things were before editmode */
@@ -1409,12 +1417,12 @@ void load_editMesh(Scene *scene, EditMesh *em)
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
}
-void remake_editMesh(Scene *scene, EditMesh *em)
+void remake_editMesh(Scene *scene, Object *ob)
{
- make_editMesh(scene, em);
+ make_editMesh(scene, ob);
// allqueue(REDRAWVIEW3D, 0);
// allqueue(REDRAWBUTSOBJECT, 0); /* needed to have nice cloth panels */
- DAG_object_flush_update(scene, G.obedit, OB_RECALC_DATA);
+ DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
BIF_undo_push("Undo all changes");
}
@@ -1423,9 +1431,9 @@ void remake_editMesh(Scene *scene, EditMesh *em)
-void separate_mesh(Scene *scene, EditMesh *em)
+void separate_mesh(Scene *scene, Object *ob)
{
- EditMesh emcopy;
+ EditMesh *em, emcopy;
EditVert *eve, *v1;
EditEdge *eed, *e1;
EditFace *efa, *vl1;
@@ -1439,7 +1447,8 @@ void separate_mesh(Scene *scene, EditMesh *em)
waitcursor(1);
- me= get_mesh(G.obedit);
+ me= G.obedit->data;
+ em= me->edit_mesh;
if(me->key) {
error("Can't separate with vertex keys");
return;
@@ -1524,7 +1533,7 @@ void separate_mesh(Scene *scene, EditMesh *em)
/* because new mesh is a copy: reduce user count */
men->id.us--;
- load_editMesh(scene, em);
+ load_editMesh(scene, G.obedit);
BASACT->flag &= ~SELECT;
@@ -1557,14 +1566,16 @@ void separate_mesh(Scene *scene, EditMesh *em)
}
-void separate_material(Scene *scene, EditMesh *em)
+void separate_material(Scene *scene, Object *ob)
{
- unsigned char curr_mat;
Mesh *me;
+ EditMesh *em;
+ unsigned char curr_mat;
if(multires_test()) return;
- me= get_mesh(G.obedit);
+ me= G.obedit->data;
+ em= me->edit_mesh;
if(me->key) {
error("Can't separate with vertex keys");
return;
@@ -1578,7 +1589,7 @@ void separate_material(Scene *scene, EditMesh *em)
/* select the material */
editmesh_select_by_material(em, curr_mat);
/* and now separate */
- separate_mesh(scene, em);
+ separate_mesh(scene, ob);
}
}
}
@@ -1589,9 +1600,9 @@ void separate_material(Scene *scene, EditMesh *em)
}
-void separate_mesh_loose(Scene *scene, EditMesh *em)
+void separate_mesh_loose(Scene *scene, Object *ob)
{
- EditMesh emcopy;
+ EditMesh *em, emcopy;
EditVert *eve, *v1;
EditEdge *eed, *e1;
EditFace *efa, *vl1;
@@ -1602,7 +1613,8 @@ void separate_mesh_loose(Scene *scene, EditMesh *em)
int vertsep=0;
short done=0, check=1;
- me= get_mesh(G.obedit);
+ me= G.obedit->data;
+ em= me->edit_mesh;
if(me->key) {
error("Can't separate a mesh with vertex keys");
return;
@@ -1718,7 +1730,7 @@ void separate_mesh_loose(Scene *scene, EditMesh *em)
/* because new mesh is a copy: reduce user count */
men->id.us--;
- load_editMesh(scene, em);
+ load_editMesh(scene, G.obedit);
BASACT->flag &= ~SELECT;
@@ -1754,11 +1766,12 @@ void separate_mesh_loose(Scene *scene, EditMesh *em)
DAG_object_flush_update(scene, G.obedit, OB_RECALC_DATA);
}
-void separatemenu(Scene *scene, EditMesh *em)
+void separatemenu(Scene *scene, Object *ob)
{
+ Mesh *me= ob->data;
short event;
- if(em->verts.first==NULL) return;
+ if(me->edit_mesh->verts.first==NULL) return;
event = pupmenu("Separate %t|Selected%x1|All Loose Parts%x2|By Material%x3");
@@ -1767,13 +1780,13 @@ void separatemenu(Scene *scene, EditMesh *em)
switch (event) {
case 1:
- separate_mesh(scene, em);
+ separate_mesh(scene, ob);
break;
case 2:
- separate_mesh_loose(scene, em);
+ separate_mesh_loose(scene, ob);
break;
case 3:
- separate_material(scene, em);
+ separate_material(scene, ob);
break;
}
waitcursor(0);
@@ -1875,10 +1888,10 @@ static void *editMesh_to_undoMesh(void)
EditFaceC *efac=NULL;
EditSelectionC *esec=NULL;
int a;
-
+ return NULL; // XXX
um= MEM_callocN(sizeof(UndoMesh), "undomesh");
- um->selectmode = scene->selectmode;
+ um->selectmode = em->selectmode;
for(eve=em->verts.first; eve; eve= eve->next) um->totvert++;
for(eed=em->edges.first; eed; eed= eed->next) um->totedge++;
@@ -1993,7 +2006,7 @@ static void undoMesh_to_editMesh(void *umv)
EditFaceC *efac;
EditSelectionC *esec;
int a=0;
-
+ return; // XXX
em->selectmode = um->selectmode;
free_editMesh(em);
@@ -2196,8 +2209,11 @@ void em_setup_viewcontext(bContext *C, ViewContext *vc)
vc->ar= CTX_wm_region(C);
vc->scene= CTX_data_scene(C);
vc->v3d= (View3D *)CTX_wm_space_data(C);
- vc->obact= vc->scene->basact?vc->scene->basact->object:NULL;
- vc->obedit= G.obedit; // XXX
- vc->em= NULL; // XXX
+ vc->obact= CTX_data_active_object(C);
+ vc->obedit= CTX_data_edit_object(C);
+ if(vc->obedit) {
+ Mesh *me= vc->obedit->data;
+ vc->em= me->edit_mesh;
+ }
}