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.c80
1 files changed, 36 insertions, 44 deletions
diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c
index ff2fad3f551..9376a21b23d 100644
--- a/source/blender/editors/mesh/editmesh.c
+++ b/source/blender/editors/mesh/editmesh.c
@@ -43,6 +43,7 @@
#include "BLI_editVert.h"
#include "BLI_dynstr.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_context.h"
@@ -53,10 +54,11 @@
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_paint.h"
+#include "BKE_report.h"
+#include "BKE_multires.h"
#include "ED_mesh.h"
#include "ED_object.h"
-#include "ED_retopo.h"
#include "ED_screen.h"
#include "ED_util.h"
#include "ED_view3d.h"
@@ -78,8 +80,8 @@ editmesh.c:
*/
/* XXX */
-static void BIF_undo_push(const char *dummy) {}
-static void error(const char *dummy) {}
+static void BIF_undo_push(const char *UNUSED(arg)) {}
+static void error(const char *UNUSED(arg)) {}
/* ***************** HASH ********************* */
@@ -91,7 +93,7 @@ static void error(const char *dummy) {}
/* ************ ADD / REMOVE / FIND ****************** */
-static void *calloc_em(EditMesh *em, size_t size, size_t nr)
+static void *calloc_em(EditMesh *UNUSED(em), size_t size, size_t nr)
{
return calloc(size, nr);
}
@@ -257,7 +259,7 @@ EditEdge *addedgelist(EditMesh *em, EditVert *v1, EditVert *v2, EditEdge *exampl
eed->h |= (example->h & EM_FGON);
}
}
-
+
return eed;
}
@@ -378,6 +380,7 @@ EditFace *addfacelist(EditMesh *em, EditVert *v1, EditVert *v2, EditVert *v3, Ed
efa->mat_nr= example->mat_nr;
efa->flag= example->flag;
CustomData_em_copy_data(&em->fdata, &em->fdata, example->data, &efa->data);
+ CustomData_em_validate_data(&em->fdata, efa->data, efa->v4 ? 4 : 3);
}
else {
efa->mat_nr= em->mat_nr;
@@ -447,19 +450,19 @@ int editface_containsEdge(EditFace *efa, EditEdge *eed)
/* ************************ stuct EditMesh manipulation ***************************** */
/* fake callocs for fastmalloc below */
-static void *calloc_fastvert(EditMesh *em, size_t size, size_t nr)
+static void *calloc_fastvert(EditMesh *em, size_t UNUSED(size), size_t UNUSED(nr))
{
EditVert *eve= em->curvert++;
eve->fast= 1;
return eve;
}
-static void *calloc_fastedge(EditMesh *em, size_t size, size_t nr)
+static void *calloc_fastedge(EditMesh *em, size_t UNUSED(size), size_t UNUSED(nr))
{
EditEdge *eed= em->curedge++;
eed->fast= 1;
return eed;
}
-static void *calloc_fastface(EditMesh *em, size_t size, size_t nr)
+static void *calloc_fastface(EditMesh *em, size_t UNUSED(size), size_t UNUSED(nr))
{
EditFace *efa= em->curface++;
efa->fast= 1;
@@ -737,6 +740,7 @@ void make_editMesh(Scene *scene, Object *ob)
EditSelection *ese;
float *co, (*keyco)[3]= NULL;
int tot, a, eekadoodle= 0;
+ const short is_paint_sel= paint_facesel_test(ob);
if(me->edit_mesh==NULL)
me->edit_mesh= MEM_callocN(sizeof(EditMesh), "editmesh");
@@ -787,7 +791,7 @@ void make_editMesh(Scene *scene, Object *ob)
evlist[a]= eve;
/* face select sets selection in next loop */
- if(!paint_facesel_test(ob))
+ if(!is_paint_sel)
eve->f |= (mvert->flag & 1);
if (mvert->flag & ME_HIDE) eve->h= 1;
@@ -862,7 +866,7 @@ void make_editMesh(Scene *scene, Object *ob)
if(mface->flag & ME_FACE_SEL) {
efa->f |= SELECT;
- if(paint_facesel_test(ob)) {
+ if(is_paint_sel) {
EM_select_face(efa, 1); /* flush down */
}
@@ -915,9 +919,9 @@ void make_editMesh(Scene *scene, Object *ob)
}
/* makes Mesh out of editmesh */
-void load_editMesh(Scene *scene, Object *ob)
+void load_editMesh(Scene *scene, Object *obedit)
{
- Mesh *me= ob->data;
+ Mesh *me= obedit->data;
MVert *mvert, *oldverts;
MEdge *medge;
MFace *mface;
@@ -985,8 +989,6 @@ void load_editMesh(Scene *scene, Object *ob)
while(eve) {
VECCOPY(mvert->co, eve->co);
- mvert->mat_nr= 32767; /* what was this for, halos? */
-
/* vertex normal */
VECCOPY(nor, eve->no);
mul_v3_fl(nor, 32767.0);
@@ -1059,20 +1061,6 @@ void load_editMesh(Scene *scene, Object *ob)
if(efa->f & 1) mface->flag |= ME_FACE_SEL;
else mface->flag &= ~ME_FACE_SEL;
}
-
- /* mat_nr in vertex */
- if(me->totcol>1) {
- mvert= me->mvert+mface->v1;
- if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
- mvert= me->mvert+mface->v2;
- if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
- mvert= me->mvert+mface->v3;
- if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
- if(mface->v4) {
- mvert= me->mvert+mface->v4;
- if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
- }
- }
/* watch: efa->e1->f2==0 means loose edge */
@@ -1107,7 +1095,7 @@ void load_editMesh(Scene *scene, Object *ob)
Object *ob;
ModifierData *md;
EditVert **vertMap = NULL;
- int i,j;
+ int j;
for (ob=G.main->object.first; ob; ob=ob->id.next) {
if (ob->parent==ob && ELEM(ob->partype, PARVERT1,PARVERT3)) {
@@ -1193,7 +1181,9 @@ void load_editMesh(Scene *scene, Object *ob)
eve= em->verts.first;
mvert = me->mvert;
while(eve) {
- VECSUB(ofs[i], mvert->co, oldverts[eve->keyindex].co);
+ if(eve->keyindex>=0)
+ VECSUB(ofs[i], mvert->co, oldverts[eve->keyindex].co);
+
eve= eve->next;
i++;
mvert++;
@@ -1305,12 +1295,15 @@ void load_editMesh(Scene *scene, Object *ob)
}
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+
+ /* topology could be changed, ensure mdisps are ok */
+ multires_topology_changed(scene, obedit);
}
void remake_editMesh(Scene *scene, Object *ob)
{
make_editMesh(scene, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
BIF_undo_push("Undo all changes");
}
@@ -1324,7 +1317,7 @@ static EnumPropertyItem prop_separate_types[] = {
};
/* return 1: success */
-static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase)
+static int mesh_separate_selected(wmOperator *op, Main *bmain, Scene *scene, Base *editbase)
{
EditMesh *em, *emnew;
EditVert *eve, *v1;
@@ -1340,7 +1333,7 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase)
me= obedit->data;
em= BKE_mesh_get_editmesh(me);
if(me->key) {
- error("Can't separate with vertex keys");
+ BKE_report(op->reports, RPT_WARNING, "Can't separate mesh with shape keys.");
BKE_mesh_end_editmesh(me, em);
return 0;
}
@@ -1426,8 +1419,8 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase)
/* hashedges are invalid now, make new! */
editMesh_set_hash(em);
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
- DAG_id_flush_update(&basenew->object->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&basenew->object->id, OB_RECALC_DATA);
BKE_mesh_end_editmesh(me, em);
@@ -1435,7 +1428,7 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase)
}
/* return 1: success */
-static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase)
+static int mesh_separate_material(wmOperator *op, Main *bmain, Scene *scene, Base *editbase)
{
Mesh *me= editbase->object->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
@@ -1447,7 +1440,7 @@ static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase)
/* select the material */
EM_select_by_material(em, curr_mat);
/* and now separate */
- if(0==mesh_separate_selected(bmain, scene, editbase)) {
+ if(0==mesh_separate_selected(op, bmain, scene, editbase)) {
BKE_mesh_end_editmesh(me, em);
return 0;
}
@@ -1458,7 +1451,7 @@ static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase)
}
/* return 1: success */
-static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase)
+static int mesh_separate_loose(wmOperator *op, Main *bmain, Scene *scene, Base *editbase)
{
Mesh *me;
EditMesh *em;
@@ -1498,7 +1491,7 @@ static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase)
tot= BLI_countlist(&em->verts);
/* and now separate */
- doit= mesh_separate_selected(bmain, scene, editbase);
+ doit= mesh_separate_selected(op, bmain, scene, editbase);
/* with hidden verts this can happen */
if(tot == BLI_countlist(&em->verts))
@@ -1518,11 +1511,11 @@ static int mesh_separate_exec(bContext *C, wmOperator *op)
int retval= 0, type= RNA_enum_get(op->ptr, "type");
if(type == 0)
- retval= mesh_separate_selected(bmain, scene, base);
+ retval= mesh_separate_selected(op, bmain, scene, base);
else if(type == 1)
- retval= mesh_separate_material(bmain, scene, base);
+ retval= mesh_separate_material(op, bmain, scene, base);
else if(type == 2)
- retval= mesh_separate_loose(bmain, scene, base);
+ retval= mesh_separate_loose(op, bmain, scene, base);
if(retval) {
WM_event_add_notifier(C, NC_GEOM|ND_DATA, base->object->data);
@@ -1600,7 +1593,6 @@ typedef struct UndoMesh {
EditSelectionC *selected;
int totvert, totedge, totface, totsel;
int selectmode, shapenr;
- RetopoPaintData *retopo_paint_data;
char retopo_mode;
CustomData vdata, edata, fdata;
} UndoMesh;
@@ -1847,7 +1839,7 @@ static void *getEditMesh(bContext *C)
}
/* and this is all the undo system needs to know */
-void undo_push_mesh(bContext *C, char *name)
+void undo_push_mesh(bContext *C, const char *name)
{
undo_editmode_push(C, name, getEditMesh, free_undoMesh, undoMesh_to_editMesh, editMesh_to_undoMesh, NULL);
}