2.5: Mesh and Various Fixes

* 3D view Mesh menu works again, but incomplete.
* Add Properties and Toolbar to 3D View menu.
* Added "specials" menus back, vertex/edge/face and general.
* Various fixes in existing mesh operators, some were not working.
* Add MESH_OT_merge.
* Merge all subdivide ops into MESH_OT_subdivide, subdivide code
  changes to make smooth + multi give good results.
* Rename all select inverse ops to *_OT_select_inverse.
* Fix "search for unknown operator" prints at startup, and some
  warnings in py code.
* Don't run .pyc files on startup.
* Remove unused image window header C code.
This commit is contained in:
Brecht Van Lommel 2009-07-08 21:31:28 +00:00
parent 288bfeea1e
commit 51ae88aa3b
36 changed files with 749 additions and 1808 deletions

@ -13,7 +13,7 @@ class IMAGE_MT_view(bpy.types.Menu):
show_uvedit = sima.show_uvedit show_uvedit = sima.show_uvedit
layout.itemO("IMAGE_OT_properties") # icon layout.itemO("IMAGE_OT_properties", icon="ICON_MENU_PANEL")
layout.itemS() layout.itemS()
@ -55,7 +55,7 @@ class IMAGE_MT_select(bpy.types.Menu):
layout.itemS() layout.itemS()
layout.itemO("UV_OT_select_all_toggle") layout.itemO("UV_OT_select_all_toggle")
layout.itemO("UV_OT_select_invert") layout.itemO("UV_OT_select_inverse")
layout.itemO("UV_OT_unlink_selection") layout.itemO("UV_OT_unlink_selection")
layout.itemS() layout.itemS()

@ -119,7 +119,7 @@ class SEQUENCER_MT_select(bpy.types.Menu):
layout.itemS() layout.itemS()
layout.itemO("SEQUENCER_OT_select_linked") layout.itemO("SEQUENCER_OT_select_linked")
layout.itemO("SEQUENCER_OT_select_all_toggle") layout.itemO("SEQUENCER_OT_select_all_toggle")
layout.itemO("SEQUENCER_OT_select_invert") layout.itemO("SEQUENCER_OT_select_inverse")
class SEQUENCER_MT_marker(bpy.types.Menu): class SEQUENCER_MT_marker(bpy.types.Menu):
__space_type__ = "SEQUENCE_EDITOR" __space_type__ = "SEQUENCE_EDITOR"

@ -42,7 +42,7 @@ void ARMATURE_OT_subdivide_multi(struct wmOperatorType *ot);
void ARMATURE_OT_parent_set(struct wmOperatorType *ot); void ARMATURE_OT_parent_set(struct wmOperatorType *ot);
void ARMATURE_OT_parent_clear(struct wmOperatorType *ot); void ARMATURE_OT_parent_clear(struct wmOperatorType *ot);
void ARMATURE_OT_select_all_toggle(struct wmOperatorType *ot); void ARMATURE_OT_select_all_toggle(struct wmOperatorType *ot);
void ARMATURE_OT_select_invert(struct wmOperatorType *ot); void ARMATURE_OT_select_inverse(struct wmOperatorType *ot);
void ARMATURE_OT_select_hierarchy(struct wmOperatorType *ot); void ARMATURE_OT_select_hierarchy(struct wmOperatorType *ot);
void ARMATURE_OT_select_linked(struct wmOperatorType *ot); void ARMATURE_OT_select_linked(struct wmOperatorType *ot);
void ARMATURE_OT_delete(struct wmOperatorType *ot); void ARMATURE_OT_delete(struct wmOperatorType *ot);
@ -56,7 +56,7 @@ void POSE_OT_rot_clear(struct wmOperatorType *ot);
void POSE_OT_loc_clear(struct wmOperatorType *ot); void POSE_OT_loc_clear(struct wmOperatorType *ot);
void POSE_OT_scale_clear(struct wmOperatorType *ot); void POSE_OT_scale_clear(struct wmOperatorType *ot);
void POSE_OT_select_all_toggle(struct wmOperatorType *ot); void POSE_OT_select_all_toggle(struct wmOperatorType *ot);
void POSE_OT_select_invert(struct wmOperatorType *ot); void POSE_OT_select_inverse(struct wmOperatorType *ot);
void POSE_OT_select_parent(struct wmOperatorType *ot); void POSE_OT_select_parent(struct wmOperatorType *ot);
void POSE_OT_select_hierarchy(struct wmOperatorType *ot); void POSE_OT_select_hierarchy(struct wmOperatorType *ot);
void POSE_OT_select_linked(struct wmOperatorType *ot); void POSE_OT_select_linked(struct wmOperatorType *ot);

@ -121,7 +121,7 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(ARMATURE_OT_parent_clear); WM_operatortype_append(ARMATURE_OT_parent_clear);
WM_operatortype_append(ARMATURE_OT_select_all_toggle); WM_operatortype_append(ARMATURE_OT_select_all_toggle);
WM_operatortype_append(ARMATURE_OT_select_invert); WM_operatortype_append(ARMATURE_OT_select_inverse);
WM_operatortype_append(ARMATURE_OT_select_hierarchy); WM_operatortype_append(ARMATURE_OT_select_hierarchy);
WM_operatortype_append(ARMATURE_OT_select_linked); WM_operatortype_append(ARMATURE_OT_select_linked);
@ -148,7 +148,7 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(POSE_OT_scale_clear); WM_operatortype_append(POSE_OT_scale_clear);
WM_operatortype_append(POSE_OT_select_all_toggle); WM_operatortype_append(POSE_OT_select_all_toggle);
WM_operatortype_append(POSE_OT_select_invert); WM_operatortype_append(POSE_OT_select_inverse);
WM_operatortype_append(POSE_OT_select_parent); WM_operatortype_append(POSE_OT_select_parent);
WM_operatortype_append(POSE_OT_select_hierarchy); WM_operatortype_append(POSE_OT_select_hierarchy);
@ -189,7 +189,7 @@ void ED_keymap_armature(wmWindowManager *wm)
WM_keymap_add_item(keymap, "ARMATURE_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_test", TKEY, KM_PRESS, 0, 0); // XXX temp test for context iterators... to be removed WM_keymap_add_item(keymap, "ARMATURE_OT_test", TKEY, KM_PRESS, 0, 0); // XXX temp test for context iterators... to be removed
@ -233,7 +233,7 @@ void ED_keymap_armature(wmWindowManager *wm)
WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "POSE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "POSE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "POSE_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "POSE_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "POSE_OT_select_parent", PKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "POSE_OT_select_parent", PKEY, KM_PRESS, KM_SHIFT, 0);

@ -3839,7 +3839,7 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot)
/* **************** Selections ******************/ /* **************** Selections ******************/
static int armature_select_invert_exec(bContext *C, wmOperator *op) static int armature_select_inverse_exec(bContext *C, wmOperator *op)
{ {
/* Set the flags */ /* Set the flags */
CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) { CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) {
@ -3854,15 +3854,15 @@ static int armature_select_invert_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void ARMATURE_OT_select_invert(wmOperatorType *ot) void ARMATURE_OT_select_inverse(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Invert Selection"; ot->name= "Select Inverse";
ot->idname= "ARMATURE_OT_select_invert"; ot->idname= "ARMATURE_OT_select_inverse";
/* api callbacks */ /* api callbacks */
ot->exec= armature_select_invert_exec; ot->exec= armature_select_inverse_exec;
ot->poll= ED_operator_editarmature; ot->poll= ED_operator_editarmature;
/* flags */ /* flags */
@ -4823,7 +4823,7 @@ void POSE_OT_rot_clear(wmOperatorType *ot)
/* ***************** selections ********************** */ /* ***************** selections ********************** */
static int pose_select_invert_exec(bContext *C, wmOperator *op) static int pose_select_inverse_exec(bContext *C, wmOperator *op)
{ {
/* Set the flags */ /* Set the flags */
@ -4838,15 +4838,15 @@ static int pose_select_invert_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void POSE_OT_select_invert(wmOperatorType *ot) void POSE_OT_select_inverse(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Invert Selection"; ot->name= "Select Inverse";
ot->idname= "POSE_OT_select_invert"; ot->idname= "POSE_OT_select_inverse";
/* api callbacks */ /* api callbacks */
ot->exec= pose_select_invert_exec; ot->exec= pose_select_inverse_exec;
ot->poll= ED_operator_posemode; ot->poll= ED_operator_posemode;
/* flags */ /* flags */

@ -84,7 +84,7 @@ void CURVE_OT_smooth_radius(struct wmOperatorType *ot);
void CURVE_OT_de_select_first(struct wmOperatorType *ot); void CURVE_OT_de_select_first(struct wmOperatorType *ot);
void CURVE_OT_de_select_last(struct wmOperatorType *ot); void CURVE_OT_de_select_last(struct wmOperatorType *ot);
void CURVE_OT_select_all_toggle(struct wmOperatorType *ot); void CURVE_OT_select_all_toggle(struct wmOperatorType *ot);
void CURVE_OT_select_invert(struct wmOperatorType *ot); void CURVE_OT_select_inverse(struct wmOperatorType *ot);
void CURVE_OT_select_linked(struct wmOperatorType *ot); void CURVE_OT_select_linked(struct wmOperatorType *ot);
void CURVE_OT_select_row(struct wmOperatorType *ot); void CURVE_OT_select_row(struct wmOperatorType *ot);
void CURVE_OT_select_next(struct wmOperatorType *ot); void CURVE_OT_select_next(struct wmOperatorType *ot);

@ -139,7 +139,7 @@ void ED_operatortypes_curve(void)
WM_operatortype_append(CURVE_OT_de_select_first); WM_operatortype_append(CURVE_OT_de_select_first);
WM_operatortype_append(CURVE_OT_de_select_last); WM_operatortype_append(CURVE_OT_de_select_last);
WM_operatortype_append(CURVE_OT_select_all_toggle); WM_operatortype_append(CURVE_OT_select_all_toggle);
WM_operatortype_append(CURVE_OT_select_invert); WM_operatortype_append(CURVE_OT_select_inverse);
WM_operatortype_append(CURVE_OT_select_linked); WM_operatortype_append(CURVE_OT_select_linked);
WM_operatortype_append(CURVE_OT_select_row); WM_operatortype_append(CURVE_OT_select_row);
WM_operatortype_append(CURVE_OT_select_next); WM_operatortype_append(CURVE_OT_select_next);

@ -1736,7 +1736,7 @@ void CURVE_OT_reveal(wmOperatorType *ot)
/********************** select invert operator *********************/ /********************** select invert operator *********************/
static int select_invert_exec(bContext *C, wmOperator *op) static int select_inverse_exec(bContext *C, wmOperator *op)
{ {
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit); ListBase *editnurb= curve_get_editcurve(obedit);
@ -1775,14 +1775,14 @@ static int select_invert_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void CURVE_OT_select_invert(wmOperatorType *ot) void CURVE_OT_select_inverse(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Select Invert"; ot->name= "Select Inverse";
ot->idname= "CURVE_OT_select_invert"; ot->idname= "CURVE_OT_select_inverse";
/* api callbacks */ /* api callbacks */
ot->exec= select_invert_exec; ot->exec= select_inverse_exec;
ot->poll= ED_operator_editsurfcurve; ot->poll= ED_operator_editsurfcurve;
/* flags */ /* flags */

@ -49,26 +49,25 @@ struct UvVertMap;
struct UvMapVert; struct UvMapVert;
struct CustomData; struct CustomData;
// edge and face flag both #define EM_FGON_DRAW 1 // face flag
#define EM_FGON 2 #define EM_FGON 2 // edge and face flag both
// face flag
#define EM_FGON_DRAW 1
/* editbutflag */ /* editbutflag */
#define B_CLOCKWISE 1 #define B_CLOCKWISE 1
#define B_KEEPORIG 2 #define B_KEEPORIG 2
#define B_BEAUTY 4 #define B_BEAUTY 4
#define B_SMOOTH 8 #define B_SMOOTH 8
#define B_BEAUTY_SHORT 16 #define B_BEAUTY_SHORT 0x10
#define B_AUTOFGON 32 #define B_AUTOFGON 0x20
#define B_KNIFE 0x80 #define B_KNIFE 0x80
#define B_PERCENTSUBD 0x40 #define B_PERCENTSUBD 0x40
#define B_MESH_X_MIRROR 0x100 #define B_MESH_X_MIRROR 0x100
#define B_JOINTRIA_UV 0x200 #define B_JOINTRIA_UV 0x200
#define B_JOINTRIA_VCOL 0X400 #define B_JOINTRIA_VCOL 0X400
#define B_JOINTRIA_SHARP 0X800 #define B_JOINTRIA_SHARP 0X800
#define B_JOINTRIA_MAT 0X1000 #define B_JOINTRIA_MAT 0X1000
#define B_FRACTAL 0x2000
#define B_SPHERE 0x4000
/* meshtools.c */ /* meshtools.c */

@ -1093,9 +1093,11 @@ void uiItemM(uiLayout *layout, bContext *C, char *name, int icon, char *menuname
if(layout->root->type == UI_LAYOUT_MENU && !icon) if(layout->root->type == UI_LAYOUT_MENU && !icon)
icon= ICON_BLANK1; icon= ICON_BLANK1;
ui_item_menu(layout, name, icon, ui_item_menutype_func, mt, NULL); ui_item_menu(layout, name, icon, ui_item_menutype_func, mt, NULL);
break; return;
} }
} }
printf("uiItemM: not found %s\n", menuname);
} }
/* label item */ /* label item */

@ -1625,7 +1625,7 @@ static int mesh_separate_exec(bContext *C, wmOperator *op)
void MESH_OT_separate(wmOperatorType *ot) void MESH_OT_separate(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Mesh Separate"; ot->name= "Separate";
ot->idname= "MESH_OT_separate"; ot->idname= "MESH_OT_separate";
/* api callbacks */ /* api callbacks */

@ -1104,7 +1104,7 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
} }
dia*=200; dia*=200;
for(a=1; a<subdiv; a++) esubdivideflag(obedit, em, 2, dia, 0,1,0); for(a=1; a<subdiv; a++) esubdivideflag(obedit, em, 2, dia, 0, B_SPHERE,1,0);
/* and now do imat */ /* and now do imat */
eve= em->verts.first; eve= em->verts.first;
while(eve) { while(eve) {
@ -1661,7 +1661,7 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot)
/****************** add duplicate operator ***************/ /****************** add duplicate operator ***************/
static int mesh_add_duplicate_exec(bContext *C, wmOperator *op) static int mesh_duplicate_exec(bContext *C, wmOperator *op)
{ {
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_edit_object(C); Object *ob= CTX_data_edit_object(C);
@ -1677,10 +1677,10 @@ static int mesh_add_duplicate_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
static int mesh_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event) static int mesh_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
{ {
WM_cursor_wait(1); WM_cursor_wait(1);
mesh_add_duplicate_exec(C, op); mesh_duplicate_exec(C, op);
WM_cursor_wait(0); WM_cursor_wait(0);
RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
@ -1689,16 +1689,15 @@ static int mesh_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void MESH_OT_duplicate_add(wmOperatorType *ot) void MESH_OT_duplicate(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Add Duplicate"; ot->name= "Duplicate";
ot->idname= "MESH_OT_duplicate_add"; ot->idname= "MESH_OT_duplicate";
/* api callbacks */ /* api callbacks */
ot->invoke= mesh_add_duplicate_invoke; ot->invoke= mesh_duplicate_invoke;
ot->exec= mesh_add_duplicate_exec; ot->exec= mesh_duplicate_exec;
ot->poll= ED_operator_editmesh; ot->poll= ED_operator_editmesh;

@ -369,9 +369,9 @@ void CutEdgeloop(Object *obedit, wmOperator *op, EditMesh *em, int numcuts)
fac= 1.0f; fac= 1.0f;
// XXX if(fbutton(&fac, 0.0f, 5.0f, 10, 10, "Smooth:")==0) return; // XXX if(fbutton(&fac, 0.0f, 5.0f, 10, 10, "Smooth:")==0) return;
fac= 0.292f*fac; fac= 0.292f*fac;
esubdivideflag(obedit, em, SELECT,fac,B_SMOOTH,numcuts,SUBDIV_SELECT_LOOPCUT); esubdivideflag(obedit, em, SELECT,fac,0,B_SMOOTH,numcuts,SUBDIV_SELECT_LOOPCUT);
} else { } else {
esubdivideflag(obedit, em, SELECT,0,0,numcuts,SUBDIV_SELECT_LOOPCUT); esubdivideflag(obedit, em, SELECT,0,0,0,numcuts,SUBDIV_SELECT_LOOPCUT);
} }
/* if this was a single cut, enter edgeslide mode */ /* if this was a single cut, enter edgeslide mode */
if(numcuts == 1 && hasHidden == 0){ if(numcuts == 1 && hasHidden == 0){
@ -690,9 +690,9 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
eed= eed->next; eed= eed->next;
} }
if (mode==KNIFE_MIDPOINT) esubdivideflag(obedit, em, SELECT, 0, B_KNIFE, 1, SUBDIV_SELECT_ORIG); if (mode==KNIFE_MIDPOINT) esubdivideflag(obedit, em, SELECT, 0, 0, B_KNIFE, 1, SUBDIV_SELECT_ORIG);
else if (mode==KNIFE_MULTICUT) esubdivideflag(obedit, em, SELECT, 0, B_KNIFE, numcuts, SUBDIV_SELECT_ORIG); else if (mode==KNIFE_MULTICUT) esubdivideflag(obedit, em, SELECT, 0, 0, B_KNIFE, numcuts, SUBDIV_SELECT_ORIG);
else esubdivideflag(obedit, em, SELECT, 0, B_KNIFE|B_PERCENTSUBD, 1, SUBDIV_SELECT_ORIG); else esubdivideflag(obedit, em, SELECT, 0, 0, B_KNIFE|B_PERCENTSUBD, 1, SUBDIV_SELECT_ORIG);
eed=em->edges.first; eed=em->edges.first;
while(eed){ while(eed){

@ -1412,7 +1412,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
break; break;
case 2: /* copy image */ case 2: /* copy image */
if (!tf_act) { if (!tf_act) {
BKE_report(op->reports, RPT_ERROR, "mesh has no uv/image layers"); BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
return; return;
} }
for(efa=em->faces.first; efa; efa=efa->next) { for(efa=em->faces.first; efa; efa=efa->next) {
@ -1433,7 +1433,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
case 3: /* copy UV's */ case 3: /* copy UV's */
if (!tf_act) { if (!tf_act) {
BKE_report(op->reports, RPT_ERROR, "mesh has no uv/image layers"); BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
return; return;
} }
for(efa=em->faces.first; efa; efa=efa->next) { for(efa=em->faces.first; efa; efa=efa->next) {
@ -1446,7 +1446,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
break; break;
case 4: /* mode's */ case 4: /* mode's */
if (!tf_act) { if (!tf_act) {
BKE_report(op->reports, RPT_ERROR, "mesh has no uv/image layers"); BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
return; return;
} }
for(efa=em->faces.first; efa; efa=efa->next) { for(efa=em->faces.first; efa; efa=efa->next) {
@ -1459,7 +1459,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
break; break;
case 5: /* copy transp's */ case 5: /* copy transp's */
if (!tf_act) { if (!tf_act) {
BKE_report(op->reports, RPT_ERROR, "mesh has no uv/image layers"); BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
return; return;
} }
for(efa=em->faces.first; efa; efa=efa->next) { for(efa=em->faces.first; efa; efa=efa->next) {
@ -1473,7 +1473,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
case 6: /* copy vcols's */ case 6: /* copy vcols's */
if (!mcol_act) { if (!mcol_act) {
BKE_report(op->reports, RPT_ERROR, "mesh has no color layers"); BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers.");
return; return;
} else { } else {
/* guess the 4th color if needs be */ /* guess the 4th color if needs be */
@ -3207,7 +3207,7 @@ void EM_select_swap(EditMesh *em) /* exported for UV */
} }
static int select_invert_mesh_exec(bContext *C, wmOperator *op) static int select_inverse_mesh_exec(bContext *C, wmOperator *op)
{ {
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
@ -3220,14 +3220,14 @@ static int select_invert_mesh_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void MESH_OT_select_invert(wmOperatorType *ot) void MESH_OT_select_inverse(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Select Invert"; ot->name= "Select Inverse";
ot->idname= "MESH_OT_select_invert"; ot->idname= "MESH_OT_select_inverse";
/* api callbacks */ /* api callbacks */
ot->exec= select_invert_mesh_exec; ot->exec= select_inverse_mesh_exec;
ot->poll= ED_operator_editmesh; ot->poll= ED_operator_editmesh;
/* flags */ /* flags */
@ -3641,7 +3641,7 @@ static int editmesh_mark_seam(bContext *C, wmOperator *op)
void MESH_OT_mark_seam(wmOperatorType *ot) void MESH_OT_mark_seam(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Mark seam"; ot->name= "Mark Seam";
ot->idname= "MESH_OT_mark_seam"; ot->idname= "MESH_OT_mark_seam";
/* api callbacks */ /* api callbacks */
@ -3660,15 +3660,15 @@ static int editmesh_mark_sharp(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
Mesh *me= ((Mesh *)obedit->data); Mesh *me= ((Mesh *)obedit->data);
int set = RNA_boolean_get(op->ptr, "set"); int clear = RNA_boolean_get(op->ptr, "clear");
EditEdge *eed; EditEdge *eed;
/* auto-enable sharp edge drawing */ /* auto-enable sharp edge drawing */
if(set) { if(clear == 0) {
me->drawflag |= ME_DRAWSHARP; me->drawflag |= ME_DRAWSHARP;
} }
if(set) { if(!clear) {
eed= em->edges.first; eed= em->edges.first;
while(eed) { while(eed) {
if(!eed->h && (eed->f & SELECT)) eed->sharp = 1; if(!eed->h && (eed->f & SELECT)) eed->sharp = 1;
@ -3693,7 +3693,7 @@ static int editmesh_mark_sharp(bContext *C, wmOperator *op)
void MESH_OT_mark_sharp(wmOperatorType *ot) void MESH_OT_mark_sharp(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Mark sharp"; ot->name= "Mark Sharp";
ot->idname= "MESH_OT_mark_sharp"; ot->idname= "MESH_OT_mark_sharp";
/* api callbacks */ /* api callbacks */
@ -3703,167 +3703,9 @@ void MESH_OT_mark_sharp(wmOperatorType *ot)
/* flags */ /* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
RNA_def_boolean(ot->srna, "set", 0, "Set", ""); RNA_def_boolean(ot->srna, "clear", 0, "Clear", "");
} }
void BME_Menu() {
short ret;
ret= pupmenu("BME modeller%t|Select Edges of Vert%x1");
switch(ret)
{
case 1:
//BME_edges_of_vert();
break;
}
}
void Vertex_Menu(EditMesh *em)
{
short ret;
ret= pupmenu("Vertex Specials%t|Remove Doubles%x1|Merge%x2|Smooth %x3|Select Vertex Path%x4|Blend From Shape%x5|Propagate To All Shapes%x6");
switch(ret)
{
case 1:
// XXX notice("Removed %d Vertices", removedoublesflag(1, 0, scene->toolsettings->doublimit));
break;
case 2:
// XXX mergemenu(em);
break;
case 3:
// XXX vertexsmooth(em);
break;
case 4:
// XXX pathselect(em);
break;
case 5:
// XXX shape_copy_select_from(em);
break;
case 6:
// XXX shape_propagate(em);
break;
}
/* some items crashed because this is in the original W menu but not here. should really manage this better */
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
}
void Edge_Menu(EditMesh *em)
{
short ret;
ret= pupmenu("Edge Specials%t|Mark Seam %x1|Clear Seam %x2|Rotate Edge CW%x3|Rotate Edge CCW%x4|Loopcut%x6|Edge Slide%x5|Edge Loop Select%x7|Edge Ring Select%x8|Loop to Region%x9|Region to Loop%x10|Mark Sharp%x11|Clear Sharp%x12");
switch(ret)
{
case 1:
//editmesh_mark_seam(em, 0);
break;
case 2:
//editmesh_mark_seam(em, 1);
break;
case 3:
// edge_rotate_selected(em, 2);
break;
case 4:
// edge_rotate_selected(em, 1);
break;
case 5:
// EdgeSlide(em, 0,0.0);
break;
case 6:
// CutEdgeloop(em, 1);
break;
case 7:
// loop_multiselect(em, 0);
break;
case 8:
// loop_multiselect(em, 1);
break;
case 9:
// loop_to_region(em);
break;
case 10:
// region_to_loop(em);
break;
case 11:
// editmesh_mark_sharp(em, 1);
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
break;
case 12:
// editmesh_mark_sharp(em, 0);
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
break;
}
/* some items crashed because this is in the original W menu but not here. should really manage this better */
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
}
void Face_Menu(EditMesh *em)
{
short ret;
ret= pupmenu(
"Face Specials%t|Flip Normals%x1|Bevel%x2|Shade Smooth%x3|Shade Flat%x4|"
"Triangulate (Ctrl T)%x5|Quads from Triangles (Alt J)%x6|Flip Triangle Edges (Ctrl Shift F)%x7|%l|"
"Face Mode Set%x8|Face Mode Clear%x9|%l|"
"UV Rotate (Shift - CCW)%x10|UV Mirror (Shift - Switch Axis)%x11|"
"Color Rotate (Shift - CCW)%x12|Color Mirror (Shift - Switch Axis)%x13");
switch(ret)
{
case 1:
// flip_editnormals(em);
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
break;
case 2:
// bevel_menu(em);
break;
case 3:
// mesh_set_smooth_faces(em, 1);
break;
case 4:
// mesh_set_smooth_faces(em, 0);
break;
case 5: /* Quads to Tris */
// convert_to_triface(em, 0);
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
break;
case 6: /* Tris to Quads */
// join_triangles(em);
break;
case 7: /* Flip triangle edges */
// edge_flip(em);
break;
case 8:
// mesh_set_face_flags(em, 1);
break;
case 9:
// mesh_set_face_flags(em, 0);
break;
/* uv texface options */
case 10:
// mesh_rotate_uvs(em);
break;
case 11:
// mesh_mirror_uvs(em);
break;
case 12:
// mesh_rotate_colors(em);
break;
case 13:
// mesh_mirror_colors(em);
break;
}
/* some items crashed because this is in the original W menu but not here. should really manage this better */
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
}
/* **************** NORMALS ************** */ /* **************** NORMALS ************** */
/* XXX value of select is messed up, it means two things */ /* XXX value of select is messed up, it means two things */
@ -4293,20 +4135,13 @@ static int smooth_vertex(bContext *C, wmOperator *op)
{ {
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
Mesh *me= obedit->data; EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
EditMesh *em= (EditMesh *)me;
EditVert *eve, *eve_mir = NULL; EditVert *eve, *eve_mir = NULL;
EditEdge *eed; EditEdge *eed;
float *adror, *adr, fac; float *adror, *adr, fac;
float fvec[3]; float fvec[3];
int teller=0; int teller=0;
ModifierData *md= obedit->modifiers.first; ModifierData *md;
if(em==NULL) {
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
/* count */ /* count */
eve= em->verts.first; eve= em->verts.first;
@ -4334,8 +4169,8 @@ static int smooth_vertex(bContext *C, wmOperator *op)
/* if there is a mirror modifier with clipping, flag the verts that /* if there is a mirror modifier with clipping, flag the verts that
* are within tolerance of the plane(s) of reflection * are within tolerance of the plane(s) of reflection
*/ */
for (; md; md=md->next) { for(md=obedit->modifiers.first; md; md=md->next) {
if (md->type==eModifierType_Mirror) { if(md->type==eModifierType_Mirror) {
MirrorModifierData *mmd = (MirrorModifierData*) md; MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) { if(mmd->flag & MOD_MIR_CLIPPING) {
@ -4604,7 +4439,7 @@ void flipface(EditMesh *em, EditFace *efa)
} }
static int flip_editnormals(bContext *C, wmOperator *op) static int flip_normals(bContext *C, wmOperator *op)
{ {
Scene *scene = CTX_data_scene(C); Scene *scene = CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
@ -4630,14 +4465,14 @@ static int flip_editnormals(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void MESH_OT_flip_editnormals(wmOperatorType *ot) void MESH_OT_flip_normals(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Flip Normals"; ot->name= "Flip Normals";
ot->idname= "MESH_OT_flip_editnormals"; ot->idname= "MESH_OT_flip_normals";
/* api callbacks */ /* api callbacks */
ot->exec= flip_editnormals; ot->exec= flip_normals;
ot->poll= ED_operator_editmesh; ot->poll= ED_operator_editmesh;
/* flags */ /* flags */

@ -736,7 +736,7 @@ static int mesh_extrude_exec(bContext *C, wmOperator *op)
void MESH_OT_extrude(wmOperatorType *ot) void MESH_OT_extrude(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Extrude Mesh"; ot->name= "Extrude";
ot->idname= "MESH_OT_extrude"; ot->idname= "MESH_OT_extrude";
/* api callbacks */ /* api callbacks */
@ -777,7 +777,7 @@ static int split_mesh(bContext *C, wmOperator *op)
void MESH_OT_split(wmOperatorType *ot) void MESH_OT_split(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Split Mesh"; ot->name= "Split";
ot->idname= "MESH_OT_split"; ot->idname= "MESH_OT_split";
/* api callbacks */ /* api callbacks */
@ -1341,7 +1341,7 @@ void MESH_OT_delete(wmOperatorType *ot)
#define DOUBLEOPFILL 16 #define DOUBLEOPFILL 16
/* calculates offset for co, based on fractal, sphere or smooth settings */ /* calculates offset for co, based on fractal, sphere or smooth settings */
static void alter_co(float *co, EditEdge *edge, float rad, int beauty, float perc) static void alter_co(float *co, EditEdge *edge, float smooth, float fractal, int beauty, float perc)
{ {
float vec1[3], fac; float vec1[3], fac;
@ -1368,37 +1368,38 @@ static void alter_co(float *co, EditEdge *edge, float rad, int beauty, float per
vec1[0]+= fac*nor2[0]; vec1[0]+= fac*nor2[0];
vec1[1]+= fac*nor2[1]; vec1[1]+= fac*nor2[1];
vec1[2]+= fac*nor2[2]; vec1[2]+= fac*nor2[2];
/* falloff for multi subdivide */
smooth *= sqrt(fabs(1.0f - 2.0f*fabs(0.5f-perc)));
vec1[0]*= rad*len; vec1[0]*= smooth*len;
vec1[1]*= rad*len; vec1[1]*= smooth*len;
vec1[2]*= rad*len; vec1[2]*= smooth*len;
co[0] += vec1[0]; co[0] += vec1[0];
co[1] += vec1[1]; co[1] += vec1[1];
co[2] += vec1[2]; co[2] += vec1[2];
} }
else { else if(beauty & B_SPHERE) { /* subdivide sphere */
if(rad > 0.0) { /* subdivide sphere */ Normalize(co);
Normalize(co); co[0]*= smooth;
co[0]*= rad; co[1]*= smooth;
co[1]*= rad; co[2]*= smooth;
co[2]*= rad; }
}
else if(rad< 0.0) { /* fractal subdivide */
fac= rad* VecLenf(edge->v1->co, edge->v2->co);
vec1[0]= fac*(float)(0.5-BLI_drand());
vec1[1]= fac*(float)(0.5-BLI_drand());
vec1[2]= fac*(float)(0.5-BLI_drand());
VecAddf(co, co, vec1);
}
if(beauty & B_FRACTAL) {
fac= fractal*VecLenf(edge->v1->co, edge->v2->co);
vec1[0]= fac*(float)(0.5-BLI_drand());
vec1[1]= fac*(float)(0.5-BLI_drand());
vec1[2]= fac*(float)(0.5-BLI_drand());
VecAddf(co, co, vec1);
} }
} }
/* assumes in the edge is the correct interpolated vertices already */ /* assumes in the edge is the correct interpolated vertices already */
/* percent defines the interpolation, rad and beauty are for special options */ /* percent defines the interpolation, smooth, fractal and beauty are for special options */
/* results in new vertex with correct coordinate, vertex normal and weight group info */ /* results in new vertex with correct coordinate, vertex normal and weight group info */
static EditVert *subdivide_edge_addvert(EditMesh *em, EditEdge *edge, float rad, int beauty, float percent) static EditVert *subdivide_edge_addvert(EditMesh *em, EditEdge *edge, float smooth, float fractal, int beauty, float percent)
{ {
EditVert *ev; EditVert *ev;
float co[3]; float co[3];
@ -1408,7 +1409,7 @@ static EditVert *subdivide_edge_addvert(EditMesh *em, EditEdge *edge, float rad,
co[2] = (edge->v2->co[2]-edge->v1->co[2])*percent + edge->v1->co[2]; co[2] = (edge->v2->co[2]-edge->v1->co[2])*percent + edge->v1->co[2];
/* offset for smooth or sphere or fractal */ /* offset for smooth or sphere or fractal */
alter_co(co, edge, rad, beauty, percent); alter_co(co, edge, smooth, fractal, beauty, percent);
/* clip if needed by mirror modifier */ /* clip if needed by mirror modifier */
if (edge->v1->f2) { if (edge->v1->f2) {
@ -2176,7 +2177,7 @@ static void fill_quad_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int
//EM_fgon_flags(em); //EM_fgon_flags(em);
} }
static void fill_quad_quadruple(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts, float rad, int beauty) static void fill_quad_quadruple(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts, float smooth, float fractal, int beauty)
{ {
EditVert **verts[4], ***innerverts; EditVert **verts[4], ***innerverts;
EditFace *hold; EditFace *hold;
@ -2246,7 +2247,7 @@ static void fill_quad_quadruple(EditMesh *em, EditFace *efa, struct GHash *gh, i
for(j=1;j<=numcuts;j++) { for(j=1;j<=numcuts;j++) {
float percent= (float)j/(float)(numcuts+1); float percent= (float)j/(float)(numcuts+1);
innerverts[i][(numcuts+1)-j]= subdivide_edge_addvert(em, &temp, rad, beauty, percent); innerverts[i][(numcuts+1)-j]= subdivide_edge_addvert(em, &temp, smooth, fractal, beauty, percent);
} }
} }
// Fill with faces // Fill with faces
@ -2273,7 +2274,7 @@ static void fill_quad_quadruple(EditMesh *em, EditFace *efa, struct GHash *gh, i
MEM_freeN(innerverts); MEM_freeN(innerverts);
} }
static void fill_tri_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts, float rad, int beauty) static void fill_tri_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts, float smooth, float fractal, int beauty)
{ {
EditVert **verts[3], ***innerverts; EditVert **verts[3], ***innerverts;
short vertsize, i, j; short vertsize, i, j;
@ -2344,7 +2345,7 @@ static void fill_tri_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int n
for(j=1;j<(numcuts+1)-i;j++) { for(j=1;j<(numcuts+1)-i;j++) {
float percent= (float)j/(float)((numcuts+1)-i); float percent= (float)j/(float)((numcuts+1)-i);
innerverts[i][((numcuts+1)-i)-j]= subdivide_edge_addvert(em, &temp, rad, beauty, 1-percent); innerverts[i][((numcuts+1)-i)-j]= subdivide_edge_addvert(em, &temp, smooth, fractal, beauty, 1-percent);
} }
} }
@ -2522,7 +2523,7 @@ static void fill_quad_singlevert(EditMesh *em, EditFace *efa, struct GHash *gh)
// This function takes an example edge, the current point to create and // This function takes an example edge, the current point to create and
// the total # of points to create, then creates the point and return the // the total # of points to create, then creates the point and return the
// editvert pointer to it. // editvert pointer to it.
static EditVert *subdivideedgenum(EditMesh *em, EditEdge *edge, int curpoint, int totpoint, float rad, int beauty) static EditVert *subdivideedgenum(EditMesh *em, EditEdge *edge, int curpoint, int totpoint, float smooth, float fractal, int beauty)
{ {
EditVert *ev; EditVert *ev;
float percent; float percent;
@ -2533,13 +2534,13 @@ static EditVert *subdivideedgenum(EditMesh *em, EditEdge *edge, int curpoint, in
else else
percent= (float)curpoint/(float)(totpoint+1); percent= (float)curpoint/(float)(totpoint+1);
ev= subdivide_edge_addvert(em, edge, rad, beauty, percent); ev= subdivide_edge_addvert(em, edge, smooth, fractal, beauty, percent);
ev->f = edge->v1->f; ev->f = edge->v1->f;
return ev; return ev;
} }
void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beauty, int numcuts, int seltype) void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float fractal, int beauty, int numcuts, int seltype)
{ {
EditFace *ef; EditFace *ef;
EditEdge *eed, *cedge, *sort[4]; EditEdge *eed, *cedge, *sort[4];
@ -2692,7 +2693,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
for(i=0;i<numcuts;i++) { for(i=0;i<numcuts;i++) {
// This function creates the new vert and returns it back // This function creates the new vert and returns it back
// to the array // to the array
templist[i+1] = subdivideedgenum(em, eed, i+1, numcuts, rad, beauty); templist[i+1] = subdivideedgenum(em, eed, i+1, numcuts, smooth, fractal, beauty);
//while we are here, we can copy edge info from the original edge //while we are here, we can copy edge info from the original edge
cedge = addedgelist(em, templist[i],templist[i+1],eed); cedge = addedgelist(em, templist[i],templist[i+1],eed);
// Also set the edge f2 to EDGENEW so that we can use this info later // Also set the edge f2 to EDGENEW so that we can use this info later
@ -2795,7 +2796,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
fill_quad_triple(em, ef, gh, numcuts); fill_quad_triple(em, ef, gh, numcuts);
break; break;
case 4: ef->f1 = SELECT; case 4: ef->f1 = SELECT;
fill_quad_quadruple(em, ef, gh, numcuts, rad, beauty); fill_quad_quadruple(em, ef, gh, numcuts, smooth, fractal, beauty);
break; break;
} }
} else { } else {
@ -2808,7 +2809,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
fill_tri_double(em, ef, gh, numcuts); fill_tri_double(em, ef, gh, numcuts);
break; break;
case 3: ef->f1 = SELECT; case 3: ef->f1 = SELECT;
fill_tri_triple(em, ef, gh, numcuts, rad, beauty); fill_tri_triple(em, ef, gh, numcuts, smooth, fractal, beauty);
break; break;
} }
} }
@ -3487,7 +3488,23 @@ void edge_flip(EditMesh *em)
MEM_freeN(efaar); MEM_freeN(efaar);
} }
static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir) #define DIRECTION_CW 1
#define DIRECTION_CCW 2
static const EnumPropertyItem direction_items[]= {
{DIRECTION_CW, "CW", 0, "Clockwise", ""},
{DIRECTION_CCW, "CCW", 0, "Counter Clockwise", ""},
{0, NULL, 0, NULL, NULL}};
#define AXIS_X 1
#define AXIS_Y 2
static const EnumPropertyItem axis_items[]= {
{AXIS_X, "X", 0, "X", ""},
{AXIS_Y, "Y", 0, "Y", ""},
{0, NULL, 0, NULL, NULL}};
static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed, int dir)
{ {
EditVert **verts[2]; EditVert **verts[2];
EditFace *face[2], *efa, *newFace[2]; EditFace *face[2], *efa, *newFace[2];
@ -3585,10 +3602,10 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], -1); newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], -1);
} }
else if(fac1 == 4 && fac2 == 3) { else if(fac1 == 4 && fac2 == 3) {
if(dir == 1) { if(dir == DIRECTION_CW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], p[0][3], 4+p[1][1]); newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], p[0][3], 4+p[1][1]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], -1); newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], -1);
} else if (dir == 2) { } else if (dir == DIRECTION_CCW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][2], 4+p[1][1], p[0][0], p[0][1]); newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][2], 4+p[1][1], p[0][0], p[0][1]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], 4+p[0][2], p[1][0], p[1][1], -1); newFace[1]= EM_face_from_faces(em, face[1], face[0], 4+p[0][2], p[1][0], p[1][1], -1);
@ -3597,10 +3614,10 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
} }
} }
else if(fac1 == 3 && fac2 == 4) { else if(fac1 == 3 && fac2 == 4) {
if(dir == 1) { if(dir == DIRECTION_CW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], 4+p[1][1], -1); newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], 4+p[1][1], -1);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], p[1][3], 4+p[0][1]); newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], p[1][3], 4+p[0][1]);
} else if (dir == 2) { } else if (dir == DIRECTION_CCW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][0], p[0][1], 4+p[1][2], -1); newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][0], p[0][1], 4+p[1][2], -1);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], 4+p[0][2]); newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], 4+p[0][2]);
@ -3610,10 +3627,10 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
} }
else if(fac1 == 4 && fac2 == 4) { else if(fac1 == 4 && fac2 == 4) {
if(dir == 1) { if(dir == DIRECTION_CW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], p[0][3], 4+p[1][1]); newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], p[0][3], 4+p[1][1]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], p[1][3], 4+p[0][1]); newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], p[1][3], 4+p[0][1]);
} else if (dir == 2) { } else if (dir == DIRECTION_CCW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][2], p[0][3], 4+p[1][1], 4+p[1][2]); newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][2], p[0][3], 4+p[1][1], 4+p[1][2]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][2], p[1][3], 4+p[0][1], 4+p[0][2]); newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][2], p[1][3], 4+p[0][1], 4+p[0][2]);
@ -3624,7 +3641,7 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
else else
return; /* This should never happen */ return; /* This should never happen */
if(dir == 1 || (fac1 == 3 && fac2 == 3)) { if(dir == DIRECTION_CW || (fac1 == 3 && fac2 == 3)) {
verts[0][p[0][1]]->f |= SELECT; verts[0][p[0][1]]->f |= SELECT;
verts[1][p[1][1]]->f |= SELECT; verts[1][p[1][1]]->f |= SELECT;
} }
@ -3668,10 +3685,9 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
int dir = RNA_int_get(op->ptr,"dir"); // dir == 2 when clockwise and ==1 for counter CW.
EditEdge *eed; EditEdge *eed;
EditFace *efa; EditFace *efa;
int dir = RNA_int_get(op->ptr, "direction"); // dir == 2 when clockwise and ==1 for counter CW.
short edgeCount = 0; short edgeCount = 0;
/*clear new flag for new edges, count selected edges */ /*clear new flag for new edges, count selected edges */
@ -3719,23 +3735,21 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
} }
} }
} }
else else {
{
BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces"); BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces");
BKE_mesh_end_editmesh(obedit->data, em); BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
} }
/* flush selected vertices (again) to edges/faces */ /* flush selected vertices (again) to edges/faces */
EM_select_flush(em); EM_select_flush(em);
BKE_mesh_end_editmesh(obedit->data, em);
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void MESH_OT_edge_rotate(wmOperatorType *ot) void MESH_OT_edge_rotate(wmOperatorType *ot)
@ -3752,7 +3766,7 @@ void MESH_OT_edge_rotate(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */ /* props */
RNA_def_int(ot->srna, "dir", 1, 1, 2, "Direction", "Clockwise and Counter Clockwise", 1, 2); RNA_def_enum(ot->srna, "direction", direction_items, DIRECTION_CW, "direction", "direction to rotate edge around.");
} }
@ -4726,23 +4740,7 @@ void mesh_set_face_flags(EditMesh *em, short mode)
} }
#endif #endif
void mesh_set_smooth_faces(EditMesh *em, short event) /********************** Rip Operator *************************/
{
EditFace *efa;
if(em==NULL) return;
efa= em->faces.first;
while(efa) {
if(efa->f & SELECT) {
if(event==1) efa->flag |= ME_SMOOTH;
else if(event==0) efa->flag &= ~ME_SMOOTH;
}
efa= efa->next;
}
}
/* ********************** mesh rip ********************** */
/* helper to find edge for edge_rip */ /* helper to find edge for edge_rip */
static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, short *mval) static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, short *mval)
@ -5014,7 +5012,7 @@ void MESH_OT_rip(wmOperatorType *ot)
} }
/* ************************************** */ /************************ Shape Operators *************************/
void shape_propagate(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op) void shape_propagate(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op)
{ {
@ -5205,6 +5203,8 @@ void shape_copy_select_from(Object *obedit, EditMesh *em, wmOperator *op)
return; return;
} }
/************************ Merge Operator *************************/
/* Collection Routines|Currently used by the improved merge code*/ /* Collection Routines|Currently used by the improved merge code*/
/* buildEdge_collection() creates a list of lists*/ /* buildEdge_collection() creates a list of lists*/
/* these lists are filled with edges that are topologically connected.*/ /* these lists are filled with edges that are topologically connected.*/
@ -5695,10 +5695,6 @@ int collapseEdges(EditMesh *em)
} }
freecollections(&allcollections); freecollections(&allcollections);
removedoublesflag(em, 1, 0, MERGELIMIT); removedoublesflag(em, 1, 0, MERGELIMIT);
/*get rid of this!*/
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
// if (EM_texFaceCheck())
return mergecount; return mergecount;
} }
@ -5741,6 +5737,7 @@ int merge_target(EditMesh *em, int target, int uvmerge)
{ {
EditVert *eve; EditVert *eve;
// XXX not working
if(target) snap_sel_to_curs(); if(target) snap_sel_to_curs();
else snap_to_center(); else snap_to_center();
@ -5751,21 +5748,113 @@ int merge_target(EditMesh *em, int target, int uvmerge)
} }
collapseuvs(em, NULL); collapseuvs(em, NULL);
} }
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
return removedoublesflag(em, 1, 0, MERGELIMIT); return removedoublesflag(em, 1, 0, MERGELIMIT);
} }
#undef MERGELIMIT #undef MERGELIMIT
typedef struct PathNode{ static int merge_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
int count= 0, uvs= RNA_boolean_get(op->ptr, "uvs");
switch(RNA_enum_get(op->ptr, "type")) {
case 3:
count = merge_target(em, 0, uvs);
break;
case 4:
count = merge_target(em, 1, uvs);
break;
case 1:
count = merge_firstlast(em, 0, uvs);
break;
case 6:
count = merge_firstlast(em, 1, uvs);
break;
case 2:
count = collapseEdges(em);
break;
}
if(!count)
return OPERATOR_CANCELLED;
BKE_reportf(op->reports, RPT_INFO, "Removed %d vertices.", count);
BKE_mesh_end_editmesh(obedit->data, em);
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
return OPERATOR_FINISHED;
}
static EnumPropertyItem merge_type_items[]= {
{6, "FIRST", 0, "At First", ""},
{1, "LAST", 0, "At Last", ""},
{3, "CENTER", 0, "At Center", ""},
{4, "CURSOR", 0, "At Cursor", ""},
{5, "COLLAPSE", 0, "Collapse", ""},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem *merge_type_itemf(PointerRNA *ptr)
{
/* XXX need context here */
#if 0
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
if(em->selectmode & SCE_SELECT_VERTEX)
if(em->selected.first && em->selected.last &&
((EditSelection*)em->selected.first)->type == EDITVERT && ((EditSelection*)em->selected.last)->type == EDITVERT)
event = pupmenu("Merge %t|At First %x6|At Last%x1|At Center%x3|At Cursor%x4|Collapse%x2");
else if (em->selected.first && ((EditSelection*)em->selected.first)->type == EDITVERT)
event = pupmenu("Merge %t|At First %x6|At Center%x3|At Cursor%x4|Collapse%x2");
else if (em->selected.last && ((EditSelection*)em->selected.last)->type == EDITVERT)
event = pupmenu("Merge %t|At Last %x1|At Center%x3|At Cursor%x4|Collapse%x2");
else event = pupmenu("Merge %t|At Center%x3|At Cursor%x4|Collapse%x2");
else event = pupmenu("Merge %t|At Center%x3|At Cursor%x4|Collapse%x2");
BKE_mesh_end_editmesh(obedit->data, em);
#endif
return merge_type_items;
}
void MESH_OT_merge(wmOperatorType *ot)
{
PropertyRNA *prop;
/* identifiers */
ot->name= "Merge";
ot->idname= "MESH_OT_merge";
/* api callbacks */
ot->exec= merge_exec;
ot->invoke= WM_menu_invoke;
ot->poll= ED_operator_editmesh;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
prop= RNA_def_enum(ot->srna, "type", merge_type_items, 6, "Type", "Merge method to use.");
RNA_def_enum_funcs(prop, merge_type_itemf);
RNA_def_boolean(ot->srna, "uvs", 0, "UVs", "Move UVs according to merge.");
}
/************************ Vertex Path Operator *************************/
typedef struct PathNode {
int u; int u;
int visited; int visited;
ListBase edges; ListBase edges;
} PathNode; } PathNode;
typedef struct PathEdge{ typedef struct PathEdge {
struct PathEdge *next, *prev; struct PathEdge *next, *prev;
int v; int v;
float w; float w;
@ -5957,43 +6046,46 @@ void MESH_OT_select_vertex_path(wmOperatorType *ot)
RNA_def_enum(ot->srna, "type", type_items, PATH_SELECT_EDGE_LENGTH, "Type", "Method to compute distance."); RNA_def_enum(ot->srna, "type", type_items, PATH_SELECT_EDGE_LENGTH, "Type", "Method to compute distance.");
} }
/********************** Region/Loop Operators *************************/
static int region_to_loop(bContext *C, wmOperator *op) static int region_to_loop(bContext *C, wmOperator *op)
{ {
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditEdge *eed; EditEdge *eed;
EditFace *efa; EditFace *efa;
int selected= 0;
if(em->totfacesel){ for(eed=em->edges.first; eed; eed=eed->next) eed->f1 = 0;
for(eed=em->edges.first; eed; eed=eed->next) eed->f1 = 0;
for(efa=em->faces.first; efa; efa=efa->next){
for(efa=em->faces.first; efa; efa=efa->next){ if(efa->f&SELECT){
if(efa->f&SELECT){ efa->e1->f1++;
efa->e1->f1++; efa->e2->f1++;
efa->e2->f1++; efa->e3->f1++;
efa->e3->f1++; if(efa->e4)
if(efa->e4) efa->e4->f1++;
efa->e4->f1++;
}
}
EM_clear_flag_all(em, SELECT);
for(eed=em->edges.first; eed; eed=eed->next){
if(eed->f1 == 1) EM_select_edge(eed, 1);
}
em->selectmode = SCE_SELECT_EDGE;
EM_selectmode_set(em);
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
// if (EM_texFaceCheck()) selected= 1;
}
}
if(!selected)
return OPERATOR_CANCELLED;
EM_clear_flag_all(em, SELECT);
for(eed=em->edges.first; eed; eed=eed->next){
if(eed->f1 == 1) EM_select_edge(eed, 1);
} }
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); em->selectmode = SCE_SELECT_EDGE;
EM_selectmode_set(em);
BKE_mesh_end_editmesh(obedit->data, em); BKE_mesh_end_editmesh(obedit->data, em);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
@ -6165,12 +6257,10 @@ static int loop_to_region(bContext *C, wmOperator *op)
} }
freecollections(&allcollections); freecollections(&allcollections);
// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); BKE_mesh_end_editmesh(obedit->data, em);
// if (EM_texFaceCheck())
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
@ -6188,6 +6278,7 @@ void MESH_OT_loop_to_region(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
} }
/********************** UV/Color Operators *************************/
// XXX please check if these functions do what you want them to // XXX please check if these functions do what you want them to
/* texface and vertex color editmode tools for the face menu */ /* texface and vertex color editmode tools for the face menu */
@ -6199,26 +6290,24 @@ static int mesh_rotate_uvs(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditFace *efa; EditFace *efa;
short change = 0, ccw; short change = 0;
MTFace *tf; MTFace *tf;
float u1, v1; float u1, v1;
int shift = 0; // XXX int dir= RNA_enum_get(op->ptr, "direction");
if (!EM_texFaceCheck(em)) { if (!EM_texFaceCheck(em)) {
BKE_report(op->reports, RPT_ERROR, "mesh has no uv/image layers"); BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
BKE_mesh_end_editmesh(obedit->data, em); BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
} }
ccw = (shift);
for(efa=em->faces.first; efa; efa=efa->next) { for(efa=em->faces.first; efa; efa=efa->next) {
if (efa->f & SELECT) { if (efa->f & SELECT) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
u1= tf->uv[0][0]; u1= tf->uv[0][0];
v1= tf->uv[0][1]; v1= tf->uv[0][1];
if (ccw) { if (dir == DIRECTION_CCW) {
if(efa->v4) { if(efa->v4) {
tf->uv[0][0]= tf->uv[3][0]; tf->uv[0][0]= tf->uv[3][0];
tf->uv[0][1]= tf->uv[3][1]; tf->uv[0][1]= tf->uv[3][1];
@ -6276,23 +6365,21 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditFace *efa; EditFace *efa;
short change = 0, altaxis; short change = 0;
MTFace *tf; MTFace *tf;
float u1, v1; float u1, v1;
int shift= 0; // XXX int axis= RNA_enum_get(op->ptr, "axis");
if (!EM_texFaceCheck(em)) { if (!EM_texFaceCheck(em)) {
BKE_report(op->reports, RPT_ERROR, "mesh has no uv/image layers"); BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
BKE_mesh_end_editmesh(obedit->data, em); BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
} }
altaxis = (shift);
for(efa=em->faces.first; efa; efa=efa->next) { for(efa=em->faces.first; efa; efa=efa->next) {
if (efa->f & SELECT) { if (efa->f & SELECT) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (altaxis) { if (axis == AXIS_Y) {
u1= tf->uv[1][0]; u1= tf->uv[1][0];
v1= tf->uv[1][1]; v1= tf->uv[1][1];
if(efa->v4) { if(efa->v4) {
@ -6368,24 +6455,22 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditFace *efa; EditFace *efa;
short change = 0, ccw; short change = 0;
MCol tmpcol, *mcol; MCol tmpcol, *mcol;
int shift= 0; // XXX int dir= RNA_enum_get(op->ptr, "direction");
if (!EM_vertColorCheck(em)) { if (!EM_vertColorCheck(em)) {
BKE_report(op->reports, RPT_ERROR, "mesh has no color layers"); BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers.");
BKE_mesh_end_editmesh(obedit->data, em); BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
} }
ccw = (shift);
for(efa=em->faces.first; efa; efa=efa->next) { for(efa=em->faces.first; efa; efa=efa->next) {
if (efa->f & SELECT) { if (efa->f & SELECT) {
mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL); mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
tmpcol= mcol[0]; tmpcol= mcol[0];
if (ccw) { if (dir == DIRECTION_CCW) {
if(efa->v4) { if(efa->v4) {
mcol[0]= mcol[3]; mcol[0]= mcol[3];
mcol[3]= mcol[2]; mcol[3]= mcol[2];
@ -6428,9 +6513,9 @@ static int mesh_mirror_colors(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditFace *efa; EditFace *efa;
short change = 0, altaxis; short change = 0;
MCol tmpcol, *mcol; MCol tmpcol, *mcol;
int shift= 0; // XXX int axis= RNA_enum_get(op->ptr, "axis");
if (!EM_vertColorCheck(em)) { if (!EM_vertColorCheck(em)) {
BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers"); BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers");
@ -6438,12 +6523,10 @@ static int mesh_mirror_colors(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
} }
altaxis = (shift);
for(efa=em->faces.first; efa; efa=efa->next) { for(efa=em->faces.first; efa; efa=efa->next) {
if (efa->f & SELECT) { if (efa->f & SELECT) {
mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL); mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
if (altaxis) { if (axis == AXIS_Y) {
tmpcol= mcol[1]; tmpcol= mcol[1];
mcol[1]= mcol[2]; mcol[1]= mcol[2];
mcol[2]= tmpcol; mcol[2]= tmpcol;
@ -6491,6 +6574,9 @@ void MESH_OT_uvs_rotate(wmOperatorType *ot)
/* flags */ /* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
RNA_def_enum(ot->srna, "direction", direction_items, DIRECTION_CW, "Direction", "Direction to rotate UVs around.");
} }
void MESH_OT_uvs_mirror(wmOperatorType *ot) void MESH_OT_uvs_mirror(wmOperatorType *ot)
@ -6505,6 +6591,9 @@ void MESH_OT_uvs_mirror(wmOperatorType *ot)
/* flags */ /* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
RNA_def_enum(ot->srna, "axis", axis_items, DIRECTION_CW, "Axis", "Axis to mirror UVs around.");
} }
void MESH_OT_colors_rotate(wmOperatorType *ot) void MESH_OT_colors_rotate(wmOperatorType *ot)
@ -6519,6 +6608,9 @@ void MESH_OT_colors_rotate(wmOperatorType *ot)
/* flags */ /* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
RNA_def_enum(ot->srna, "direction", direction_items, DIRECTION_CW, "Direction", "Direction to rotate edge around.");
} }
void MESH_OT_colors_mirror(wmOperatorType *ot) void MESH_OT_colors_mirror(wmOperatorType *ot)
@ -6533,22 +6625,34 @@ void MESH_OT_colors_mirror(wmOperatorType *ot)
/* flags */ /* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
RNA_def_enum(ot->srna, "axis", axis_items, DIRECTION_CW, "Axis", "Axis to mirror colors around.");
} }
/********************** Subdivide Operator *************************/
static int subdivide_exec(bContext *C, wmOperator *op) static int subdivide_exec(bContext *C, wmOperator *op)
{ {
Scene *scene = CTX_data_scene(C); Scene *scene = CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
int cuts= RNA_int_get(op->ptr,"number_cuts");
esubdivideflag(obedit, em, 1, 0.0, scene->toolsettings->editbutflag, 1, 0); float smooth= 0.292f*RNA_float_get(op->ptr, "smoothness");
float fractal= RNA_float_get(op->ptr, "fractal")/100;
BKE_mesh_end_editmesh(obedit->data, em); int flag= 0;
if(smooth != 0.0f)
flag |= B_SMOOTH;
if(fractal != 0.0f)
flag |= B_FRACTAL;
esubdivideflag(obedit, em, 1, smooth, fractal, scene->toolsettings->editbutflag|flag, cuts, 0);
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void MESH_OT_subdivide(wmOperatorType *ot) void MESH_OT_subdivide(wmOperatorType *ot)
@ -6563,173 +6667,14 @@ void MESH_OT_subdivide(wmOperatorType *ot)
/* flags */ /* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
static int subdivide_multi_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
esubdivideflag(obedit, em, 1, 0.0, scene->toolsettings->editbutflag, RNA_int_get(op->ptr,"number_cuts"), 0);
BKE_mesh_end_editmesh(obedit->data, em);
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
return OPERATOR_FINISHED;
}
void MESH_OT_subdivide_multi(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Subdivide Multi";
ot->idname= "MESH_OT_subdivide_multi";
/* api callbacks */
ot->exec= subdivide_multi_exec;
ot->poll= ED_operator_editmesh;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
RNA_def_int(ot->srna, "number_cuts", 4, 1, 100, "Number of Cuts", "", 1, INT_MAX);
}
static int subdivide_multi_fractal_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
esubdivideflag(obedit, em, 1, -(RNA_float_get(op->ptr, "random_factor")/100), scene->toolsettings->editbutflag, RNA_int_get(op->ptr, "number_cuts"), 0);
BKE_mesh_end_editmesh(obedit->data, em);
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
return OPERATOR_FINISHED;
}
void MESH_OT_subdivide_multi_fractal(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Subdivide Multi Fractal";
ot->idname= "MESH_OT_subdivide_multi_fractal";
/* api callbacks */
ot->exec= subdivide_multi_fractal_exec;
ot->poll= ED_operator_editmesh;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */ /* properties */
RNA_def_int(ot->srna, "number_cuts", 4, 1, 100, "Number of Cuts", "", 1, INT_MAX); RNA_def_int(ot->srna, "number_cuts", 1, 1, 10, "Number of Cuts", "", 1, INT_MAX);
RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f); RNA_def_float(ot->srna, "fractal", 0.0, 0.0f, FLT_MAX, "Fractal", "Fractal randomness factor.", 0.0f, 1000.0f);
RNA_def_float(ot->srna, "smoothness", 0.0f, 0.0f, 1000.0f, "Smoothness", "Smoothness factor.", 0.0f, FLT_MAX);
} }
static int subdivide_smooth_exec(bContext *C, wmOperator *op) /********************** Fill Operators *************************/
{
Scene *scene = CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
esubdivideflag(obedit, em, 1, 0.292f*RNA_float_get(op->ptr, "smoothness"), scene->toolsettings->editbutflag | B_SMOOTH, 1, 0);
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
return OPERATOR_FINISHED;
}
void MESH_OT_subdivide_smooth(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Subdivide Smooth";
ot->idname= "MESH_OT_subdivide_smooth";
/* api callbacks */
ot->exec= subdivide_smooth_exec;
ot->poll= ED_operator_editmesh;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
RNA_def_float(ot->srna, "smoothness", 1.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX);
}
static int subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
uiPopupMenu *pup;
uiLayout *layout;
pup= uiPupMenuBegin(C, "Subdivision Type", 0);
layout= uiPupMenuLayout(pup);
uiItemsEnumO(layout, "MESH_OT_subdivs", "type");
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
static int subdivs_exec(bContext *C, wmOperator *op)
{
switch(RNA_int_get(op->ptr, "type"))
{
case 0: // simple
subdivide_exec(C,op);
break;
case 1: // multi
subdivide_multi_exec(C,op);
break;
case 2: // fractal;
subdivide_multi_fractal_exec(C,op);
break;
case 3: //smooth
subdivide_smooth_exec(C,op);
break;
}
return OPERATOR_FINISHED;
}
void MESH_OT_subdivs(wmOperatorType *ot)
{
static EnumPropertyItem type_items[]= {
{0, "SIMPLE", 0, "Simple", ""},
{1, "MULTI", 0, "Multi", ""},
{2, "FRACTAL", 0, "Fractal", ""},
{3, "SMOOTH", 0, "Smooth", ""},
{0, NULL, 0, NULL, NULL}};
/* identifiers */
ot->name= "subdivs";
ot->idname= "MESH_OT_subdivs";
/* api callbacks */
ot->invoke= subdivs_invoke;
ot->exec= subdivs_exec;
ot->poll= ED_operator_editmesh;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/*props */
RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
/* this is temp, the ops are different, but they are called from subdivs, so all the possible props should be here as well*/
RNA_def_int(ot->srna, "number_cuts", 4, 1, 10, "Number of Cuts", "", 1, INT_MAX);
RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f);
RNA_def_float(ot->srna, "smoothness", 1.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX);
}
/* ************************************* */
/* note; the EM_selectmode_set() calls here illustrate how badly constructed it all is... from before the /* note; the EM_selectmode_set() calls here illustrate how badly constructed it all is... from before the
edge/face flags, with very mixed results.... */ edge/face flags, with very mixed results.... */
@ -6975,7 +6920,6 @@ static void fill_mesh(EditMesh *em)
} }
static int fill_mesh_exec(bContext *C, wmOperator *op) static int fill_mesh_exec(bContext *C, wmOperator *op)
{ {
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
@ -6996,7 +6940,7 @@ static int fill_mesh_exec(bContext *C, wmOperator *op)
void MESH_OT_fill(wmOperatorType *ot) void MESH_OT_fill(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Fill Mesh"; ot->name= "Fill";
ot->idname= "MESH_OT_fill"; ot->idname= "MESH_OT_fill";
/* api callbacks */ /* api callbacks */
@ -7037,6 +6981,8 @@ void MESH_OT_beauty_fill(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
} }
/********************** Quad/Tri Operators *************************/
static int quads_convert_to_tris_exec(bContext *C, wmOperator *op) static int quads_convert_to_tris_exec(bContext *C, wmOperator *op)
{ {
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
@ -7124,13 +7070,29 @@ void MESH_OT_edge_flip(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
} }
/********************** Smooth/Solid Operators *************************/
void mesh_set_smooth_faces(EditMesh *em, short smooth)
{
EditFace *efa;
if(em==NULL) return;
for(efa= em->faces.first; efa; efa=efa->next) {
if(efa->f & SELECT) {
if(smooth) efa->flag |= ME_SMOOTH;
else efa->flag &= ~ME_SMOOTH;
}
}
}
static int mesh_faces_shade_smooth_exec(bContext *C, wmOperator *op) static int mesh_faces_shade_smooth_exec(bContext *C, wmOperator *op)
{ {
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
mesh_set_smooth_faces(em,1); mesh_set_smooth_faces(em, 1);
BKE_mesh_end_editmesh(obedit->data, em); BKE_mesh_end_editmesh(obedit->data, em);
@ -7143,7 +7105,7 @@ static int mesh_faces_shade_smooth_exec(bContext *C, wmOperator *op)
void MESH_OT_faces_shade_smooth(wmOperatorType *ot) void MESH_OT_faces_shade_smooth(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Smooth Face Shading"; ot->name= "Shade Smooth";
ot->idname= "MESH_OT_faces_shade_smooth"; ot->idname= "MESH_OT_faces_shade_smooth";
/* api callbacks */ /* api callbacks */
@ -7160,7 +7122,7 @@ static int mesh_faces_shade_solid_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
mesh_set_smooth_faces(em,0); mesh_set_smooth_faces(em, 0);
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
@ -7171,7 +7133,7 @@ static int mesh_faces_shade_solid_exec(bContext *C, wmOperator *op)
void MESH_OT_faces_shade_solid(wmOperatorType *ot) void MESH_OT_faces_shade_solid(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Flat Face Shading"; ot->name= "Shade Flat";
ot->idname= "MESH_OT_faces_shade_solid"; ot->idname= "MESH_OT_faces_shade_solid";
/* api callbacks */ /* api callbacks */

@ -85,7 +85,7 @@ void MESH_OT_primitive_ico_sphere_add(struct wmOperatorType *ot);
void MESH_OT_edge_face_add(struct wmOperatorType *ot); void MESH_OT_edge_face_add(struct wmOperatorType *ot);
void MESH_OT_dupli_extrude_cursor(struct wmOperatorType *ot); void MESH_OT_dupli_extrude_cursor(struct wmOperatorType *ot);
void MESH_OT_duplicate_add(struct wmOperatorType *ot); void MESH_OT_duplicate(struct wmOperatorType *ot);
void MESH_OT_fgon_make(struct wmOperatorType *ot); void MESH_OT_fgon_make(struct wmOperatorType *ot);
void MESH_OT_fgon_clear(struct wmOperatorType *ot); void MESH_OT_fgon_clear(struct wmOperatorType *ot);
@ -151,7 +151,7 @@ void MESH_OT_loop_select(struct wmOperatorType *ot);
void MESH_OT_select_all_toggle(struct wmOperatorType *ot); void MESH_OT_select_all_toggle(struct wmOperatorType *ot);
void MESH_OT_select_more(struct wmOperatorType *ot); void MESH_OT_select_more(struct wmOperatorType *ot);
void MESH_OT_select_less(struct wmOperatorType *ot); void MESH_OT_select_less(struct wmOperatorType *ot);
void MESH_OT_select_invert(struct wmOperatorType *ot); void MESH_OT_select_inverse(struct wmOperatorType *ot);
void MESH_OT_select_non_manifold(struct wmOperatorType *ot); void MESH_OT_select_non_manifold(struct wmOperatorType *ot);
void MESH_OT_select_linked(struct wmOperatorType *ot); void MESH_OT_select_linked(struct wmOperatorType *ot);
void MESH_OT_select_linked_pick(struct wmOperatorType *ot); void MESH_OT_select_linked_pick(struct wmOperatorType *ot);
@ -170,7 +170,7 @@ void MESH_OT_loop_multi_select(struct wmOperatorType *ot);
void MESH_OT_mark_seam(struct wmOperatorType *ot); void MESH_OT_mark_seam(struct wmOperatorType *ot);
void MESH_OT_mark_sharp(struct wmOperatorType *ot); void MESH_OT_mark_sharp(struct wmOperatorType *ot);
void MESH_OT_vertices_smooth(struct wmOperatorType *ot); void MESH_OT_vertices_smooth(struct wmOperatorType *ot);
void MESH_OT_flip_editnormals(struct wmOperatorType *ot); void MESH_OT_flip_normals(struct wmOperatorType *ot);
extern EditEdge *findnearestedge(ViewContext *vc, int *dist); extern EditEdge *findnearestedge(ViewContext *vc, int *dist);
extern void EM_automerge(int update); extern void EM_automerge(int update);
@ -201,14 +201,11 @@ extern EditVert *findnearestvert(ViewContext *vc, int *dist, short sel, short st
void join_triangles(EditMesh *em); void join_triangles(EditMesh *em);
int removedoublesflag(EditMesh *em, short flag, short automerge, float limit); /* return amount */ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit); /* return amount */
void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beauty, int numcuts, int seltype); void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float fractal, int beauty, int numcuts, int seltype);
int EdgeSlide(EditMesh *em, wmOperator *op, short immediate, float imperc); int EdgeSlide(EditMesh *em, wmOperator *op, short immediate, float imperc);
void MESH_OT_merge(struct wmOperatorType *ot);
void MESH_OT_subdivide(struct wmOperatorType *ot); void MESH_OT_subdivide(struct wmOperatorType *ot);
void MESH_OT_subdivs(struct wmOperatorType *ot);
void MESH_OT_subdivide_multi(struct wmOperatorType *ot);
void MESH_OT_subdivide_multi_fractal(struct wmOperatorType *ot);
void MESH_OT_subdivide_smooth(struct wmOperatorType *ot);
void MESH_OT_remove_doubles(struct wmOperatorType *ot); void MESH_OT_remove_doubles(struct wmOperatorType *ot);
void MESH_OT_extrude(struct wmOperatorType *ot); void MESH_OT_extrude(struct wmOperatorType *ot);
void MESH_OT_spin(struct wmOperatorType *ot); void MESH_OT_spin(struct wmOperatorType *ot);

@ -59,18 +59,181 @@
#include "ED_transform.h" #include "ED_transform.h"
#include "ED_view3d.h" #include "ED_view3d.h"
#include "UI_interface.h"
#include "mesh_intern.h" #include "mesh_intern.h"
/******************************** menus *************************************/
static int vertex_specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
uiPopupMenu *pup;
uiLayout *layout;
/* ************************** registration **********************************/ pup= uiPupMenuBegin(C, "Vertex Specials", 0);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
uiItemO(layout, "Remove Doubles", 0, "MESH_OT_remove_doubles");
uiItemO(layout, "Merge...", 0, "MESH_OT_merge"); // mergmenu(em)
uiItemO(layout, "Smooth", 0, "MESH_OT_vertices_smooth");
uiItemO(layout, "Select Vertex Path", 0, "MESH_OT_select_vertex_path");
//uiItemO(layout, "Blend From Shape", 0, "MESH_OT_blend_from_shape");
//uiItemO(layout, "Propagate to All Shapes", 0, "MESH_OT_shape_propagate_to_all");
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
static void MESH_OT_vertex_specials(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Vertex Specials";
ot->idname= "MESH_OT_vertex_specials";
/* api callbacks */
ot->invoke= vertex_specials_invoke;
ot->poll= ED_operator_editmesh;
}
static int edge_specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
uiPopupMenu *pup;
uiLayout *layout;
pup= uiPupMenuBegin(C, "Edge Specials", 0);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
uiItemO(layout, "Mark Seam", 0, "MESH_OT_mark_seam");
uiItemBooleanO(layout, "Clear Seam", 0, "MESH_OT_mark_seam", "clear", 1);
uiItemEnumO(layout, "Rotate Edge CW", 0, "MESH_OT_edge_rotate", "direction", 1);
uiItemEnumO(layout, "Rotate Edge CCW", 0, "MESH_OT_edge_rotate", "direction", 2);
//uiItemO(layout, "Loopcut", 0, "MESH_OT_loop_cut"); // CutEdgeloop(em, 1);
//uiItemO(layout, "Edge Slide", 0, "MESH_OT_edge_slide"); // EdgeSlide(em, 0,0.0);
uiItemO(layout, "Edge Loop", 0, "MESH_OT_loop_multi_select");
uiItemBooleanO(layout, "Edge Ring", 0, "MESH_OT_loop_multi_select", "ring", 1);
uiItemO(layout, NULL, 0, "MESH_OT_loop_to_region");
uiItemO(layout, NULL, 0, "MESH_OT_region_to_loop");
uiItemO(layout, "Mark Sharp", 0, "MESH_OT_mark_sharp");
uiItemBooleanO(layout, "Clear Sharp", 0, "MESH_OT_mark_sharp", "clear", 1);
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
static void MESH_OT_edge_specials(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Edge Specials";
ot->idname= "MESH_OT_edge_specials";
/* api callbacks */
ot->invoke= edge_specials_invoke;
ot->poll= ED_operator_editmesh;
}
static int face_specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
uiPopupMenu *pup;
uiLayout *layout;
pup= uiPupMenuBegin(C, "Face Specials", 0);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
uiItemO(layout, NULL, 0, "MESH_OT_flip_normals");
// uiItemO(layout, "Bevel", 0, "MESH_OT_bevel"); // bevelmenu(em)
uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_solid");
uiItemO(layout, NULL, 0, "MESH_OT_quads_convert_to_tris");
uiItemO(layout, NULL, 0, "MESH_OT_tris_convert_to_quads");
uiItemO(layout, NULL, 0, "MESH_OT_edge_flip");
uiItemS(layout);
uiItemO(layout, NULL, 0, "MESH_OT_fill");
uiItemO(layout, NULL, 0, "MESH_OT_beauty_fill");
uiItemS(layout);
// uiItemO(layout, NULL, 0, "MESH_OT_face_mode"); // mesh_set_face_flags(em, 1);
// uiItemBooleanO(layout, NULL, 0, "MESH_OT_face_mode", "clear", 1); // mesh_set_face_flags(em, 0);
//
// uiItemS(layout);
uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_uvs_rotate", "direction");
uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_uvs_mirror", "axis");
uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_colors_rotate", "direction");
uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_colors_mirror", "axis");
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
static void MESH_OT_face_specials(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Face Specials";
ot->idname= "MESH_OT_face_specials";
/* api callbacks */
ot->invoke= face_specials_invoke;
ot->poll= ED_operator_editmesh;
}
static int specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
uiPopupMenu *pup;
uiLayout *layout;
pup= uiPupMenuBegin(C, "Specials", 0);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
uiItemO(layout, "Subdivide", 0, "MESH_OT_subdivide");
uiItemFloatO(layout, "Subdivide Smooth", 0, "MESH_OT_subdivide", "smoothness", 1.0f);
uiItemO(layout, "Merge...", 0, "MESH_OT_merge");
uiItemO(layout, "Remove Doubles", 0, "MESH_OT_remove_doubles");
uiItemO(layout, "Hide", 0, "MESH_OT_hide");
uiItemO(layout, "Reveal", 0, "MESH_OT_reveal");
uiItemO(layout, "Select Inverse", 0, "MESH_OT_select_inverse");
uiItemO(layout, NULL, 0, "MESH_OT_flip_normals");
uiItemO(layout, "Smooth", 0, "MESH_OT_vertices_smooth");
// uiItemO(layout, "Bevel", 0, "MESH_OT_bevel"); // bevelmenu(em)
uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_solid");
//uiItemO(layout, "Blend From Shape", 0, "MESH_OT_blend_from_shape");
//uiItemO(layout, "Propagate to All Shapes", 0, "MESH_OT_shape_propagate_to_all");
uiItemO(layout, "Select Vertex Path", 0, "MESH_OT_select_vertex_path");
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
static void MESH_OT_specials(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Specials";
ot->idname= "MESH_OT_specials";
/* api callbacks */
ot->invoke= specials_invoke;
ot->poll= ED_operator_editmesh;
}
/**************************** registration **********************************/
void ED_operatortypes_mesh(void) void ED_operatortypes_mesh(void)
{ {
WM_operatortype_append(MESH_OT_select_all_toggle); WM_operatortype_append(MESH_OT_select_all_toggle);
WM_operatortype_append(MESH_OT_select_more); WM_operatortype_append(MESH_OT_select_more);
WM_operatortype_append(MESH_OT_select_less); WM_operatortype_append(MESH_OT_select_less);
WM_operatortype_append(MESH_OT_select_invert); WM_operatortype_append(MESH_OT_select_inverse);
WM_operatortype_append(MESH_OT_select_non_manifold); WM_operatortype_append(MESH_OT_select_non_manifold);
WM_operatortype_append(MESH_OT_select_linked); WM_operatortype_append(MESH_OT_select_linked);
WM_operatortype_append(MESH_OT_select_linked_pick); WM_operatortype_append(MESH_OT_select_linked_pick);
@ -80,11 +243,8 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_reveal); WM_operatortype_append(MESH_OT_reveal);
WM_operatortype_append(MESH_OT_select_by_number_vertices); WM_operatortype_append(MESH_OT_select_by_number_vertices);
WM_operatortype_append(MESH_OT_normals_make_consistent); WM_operatortype_append(MESH_OT_normals_make_consistent);
WM_operatortype_append(MESH_OT_merge);
WM_operatortype_append(MESH_OT_subdivide); WM_operatortype_append(MESH_OT_subdivide);
WM_operatortype_append(MESH_OT_subdivide_multi);
WM_operatortype_append(MESH_OT_subdivide_multi_fractal);
WM_operatortype_append(MESH_OT_subdivide_smooth);
WM_operatortype_append(MESH_OT_subdivs);
WM_operatortype_append(MESH_OT_faces_select_linked_flat); WM_operatortype_append(MESH_OT_faces_select_linked_flat);
WM_operatortype_append(MESH_OT_edges_select_sharp); WM_operatortype_append(MESH_OT_edges_select_sharp);
WM_operatortype_append(MESH_OT_primitive_plane_add); WM_operatortype_append(MESH_OT_primitive_plane_add);
@ -99,7 +259,7 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_primitive_ico_sphere_add); WM_operatortype_append(MESH_OT_primitive_ico_sphere_add);
WM_operatortype_append(MESH_OT_fgon_clear); WM_operatortype_append(MESH_OT_fgon_clear);
WM_operatortype_append(MESH_OT_fgon_make); WM_operatortype_append(MESH_OT_fgon_make);
WM_operatortype_append(MESH_OT_duplicate_add); WM_operatortype_append(MESH_OT_duplicate);
WM_operatortype_append(MESH_OT_remove_doubles); WM_operatortype_append(MESH_OT_remove_doubles);
WM_operatortype_append(MESH_OT_extrude); WM_operatortype_append(MESH_OT_extrude);
WM_operatortype_append(MESH_OT_spin); WM_operatortype_append(MESH_OT_spin);
@ -138,7 +298,7 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_mark_seam); WM_operatortype_append(MESH_OT_mark_seam);
WM_operatortype_append(MESH_OT_mark_sharp); WM_operatortype_append(MESH_OT_mark_sharp);
WM_operatortype_append(MESH_OT_vertices_smooth); WM_operatortype_append(MESH_OT_vertices_smooth);
WM_operatortype_append(MESH_OT_flip_editnormals); WM_operatortype_append(MESH_OT_flip_normals);
WM_operatortype_append(MESH_OT_knife_cut); WM_operatortype_append(MESH_OT_knife_cut);
WM_operatortype_append(MESH_OT_rip); WM_operatortype_append(MESH_OT_rip);
@ -148,6 +308,11 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_vertex_color_remove); WM_operatortype_append(MESH_OT_vertex_color_remove);
WM_operatortype_append(MESH_OT_sticky_add); WM_operatortype_append(MESH_OT_sticky_add);
WM_operatortype_append(MESH_OT_sticky_remove); WM_operatortype_append(MESH_OT_sticky_remove);
WM_operatortype_append(MESH_OT_vertex_specials);
WM_operatortype_append(MESH_OT_edge_specials);
WM_operatortype_append(MESH_OT_face_specials);
WM_operatortype_append(MESH_OT_specials);
} }
/* note mesh keymap also for other space? */ /* note mesh keymap also for other space? */
@ -172,7 +337,7 @@ void ED_keymap_mesh(wmWindowManager *wm)
WM_keymap_add_item(keymap, "MESH_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MESH_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "MESH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_select_non_manifold", MKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0); WM_keymap_add_item(keymap, "MESH_OT_select_non_manifold", MKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0);
WM_keymap_add_item(keymap, "MESH_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
@ -184,12 +349,6 @@ void ED_keymap_mesh(wmWindowManager *wm)
WM_keymap_add_item(keymap, "MESH_OT_vertices_transform_to_sphere", SKEY, KM_PRESS, KM_CTRL|KM_SHIFT , 0); WM_keymap_add_item(keymap, "MESH_OT_vertices_transform_to_sphere", SKEY, KM_PRESS, KM_CTRL|KM_SHIFT , 0);
WM_keymap_add_item(keymap, "MESH_OT_mark_seam", ONEKEY, KM_PRESS, KM_CTRL , 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_mark_seam", ONEKEY, KM_PRESS, KM_ALT , 0)->ptr,"clear",1);
WM_keymap_add_item(keymap, "MESH_OT_mark_sharp", TWOKEY, KM_PRESS, KM_CTRL , 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_mark_sharp", TWOKEY, KM_PRESS, KM_ALT , 0)->ptr,"set",1);
WM_keymap_add_item(keymap, "MESH_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "MESH_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0);
/* selection mode */ /* selection mode */
@ -203,24 +362,17 @@ void ED_keymap_mesh(wmWindowManager *wm)
/* tools */ /* tools */
WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "inside", 1); RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "inside", 1);
WM_keymap_add_item(keymap, "MESH_OT_vertices_smooth", THREEKEY, KM_PRESS, KM_CTRL , 0);
WM_keymap_add_item(keymap, "MESH_OT_flip_editnormals", THREEKEY, KM_PRESS, KM_ALT , 0);
WM_keymap_add_item(keymap, "MESH_OT_subdivs", WKEY, KM_PRESS, 0, 0); // this is the menu
/*WM_keymap_add_item(keymap, "MESH_OT_subdivide_multi", WKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
WM_keymap_add_item(keymap, "MESH_OT_subdivide_multi_fractal", WKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_subdivide_smooth", WKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);*/
WM_keymap_add_item(keymap, "MESH_OT_remove_doubles", VKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_extrude", EKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MESH_OT_extrude", EKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "MESH_OT_spin", RKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "MESH_OT_spin", RKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_screw", NINEKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_screw", NINEKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_editmesh_face_toolbox", FKEY, KM_PRESS, KM_CTRL, 0); /* operators below are in this toolbox */
WM_keymap_add_item(keymap, "MESH_OT_fill", FKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "MESH_OT_fill", FKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "MESH_OT_beauty_fill", FKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "MESH_OT_beauty_fill", FKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_tris_convert_to_quads", JKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "MESH_OT_tris_convert_to_quads", JKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_edge_flip", FKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_split", FOURKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_split", FOURKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_extrude_repeat", FOURKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "MESH_OT_extrude_repeat", FOURKEY, KM_PRESS, KM_ALT, 0);
@ -238,7 +390,7 @@ void ED_keymap_mesh(wmWindowManager *wm)
/* add/remove */ /* add/remove */
WM_keymap_add_item(keymap, "MESH_OT_edge_face_add", FKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MESH_OT_edge_face_add", FKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "MESH_OT_duplicate_add", DKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "MESH_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_mesh_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "OBJECT_OT_mesh_add", AKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "MESH_OT_separate", PKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "MESH_OT_separate", PKEY, KM_PRESS, KM_SHIFT, 0);
/* use KM_RELEASE because same key is used for tweaks */ /* use KM_RELEASE because same key is used for tweaks */
@ -250,6 +402,12 @@ void ED_keymap_mesh(wmWindowManager *wm)
WM_keymap_add_item(keymap, "MESH_OT_fgon_clear", FKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0); WM_keymap_add_item(keymap, "MESH_OT_fgon_clear", FKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0);
/* menus */
WM_keymap_add_item(keymap, "MESH_OT_vertex_specials", VKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_edge_specials", EKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_face_specials", FKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_specials", WKEY, KM_PRESS, 0, 0);
/* UV's */ /* UV's */
WM_keymap_add_item(keymap, "UV_OT_mapping_menu", UKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "UV_OT_mapping_menu", UKEY, KM_PRESS, 0, 0);

@ -1732,7 +1732,7 @@ void OBJECT_OT_select_by_layer(wmOperatorType *ot)
} }
/* ****** invert selection *******/ /* ****** invert selection *******/
static int object_select_invert_exec(bContext *C, wmOperator *op) static int object_select_inverse_exec(bContext *C, wmOperator *op)
{ {
CTX_DATA_BEGIN(C, Base*, base, visible_bases) { CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
if (base->flag & SELECT) if (base->flag & SELECT)
@ -1748,16 +1748,16 @@ static int object_select_invert_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void OBJECT_OT_select_invert(wmOperatorType *ot) void OBJECT_OT_select_inverse(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Invert selection"; ot->name= "Select Inverse";
ot->description = "Invert th select of all visible objects."; ot->description = "Invert selection of all visible objects.";
ot->idname= "OBJECT_OT_select_invert"; ot->idname= "OBJECT_OT_select_inverse";
/* api callbacks */ /* api callbacks */
ot->exec= object_select_invert_exec; ot->exec= object_select_inverse_exec;
ot->poll= ED_operator_scene_editable; ot->poll= ED_operator_scene_editable;
/* flags */ /* flags */
@ -3772,144 +3772,8 @@ void special_editmenu(Scene *scene, View3D *v3d)
} }
} }
else if(obedit->type==OB_MESH) { else if(obedit->type==OB_MESH) {
/* This is all that is needed, since all other functionality is in Ctrl+ V/E/F but some users didnt like, so for now have the old/big menu */
/*
nr= pupmenu("Subdivide Mesh%t|Subdivide%x1|Subdivide Multi%x2|Subdivide Multi Fractal%x3|Subdivide Smooth%x4");
switch(nr) {
case 1:
waitcursor(1);
esubdivideflag(1, 0.0, scene->toolsettings->editbutflag, 1, 0);
break;
case 2:
if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
waitcursor(1);
esubdivideflag(1, 0.0, scene->toolsettings->editbutflag, numcuts, 0);
break;
case 3:
if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
randfac= 10;
if(button(&randfac, 1, 100, "Rand fac:")==0) return;
waitcursor(1);
fac= -( (float)randfac )/100;
esubdivideflag(1, fac, scene->toolsettings->editbutflag, numcuts, 0);
break;
case 4:
fac= 1.0f;
if(fbutton(&fac, 0.0f, 5.0f, 10, 10, "Smooth:")==0) return;
fac= 0.292f*fac;
waitcursor(1);
esubdivideflag(1, fac, scene->toolsettings->editbutflag | B_SMOOTH, 1, 0);
break;
}
*/
nr= pupmenu("Specials%t|Subdivide%x1|Subdivide Multi%x2|Subdivide Multi Fractal%x3|Subdivide Smooth%x12|Merge%x4|Remove Doubles%x5|Hide%x6|Reveal%x7|Select Swap%x8|Flip Normals %x9|Smooth %x10|Bevel %x11|Set Smooth %x14|Set Solid %x15|Blend From Shape%x16|Propagate To All Shapes%x17|Select Vertex Path%x18");
switch(nr) {
case 1:
waitcursor(1);
// XXX esubdivideflag(1, 0.0, scene->toolsettings->editbutflag, 1, 0);
break;
case 2:
// XXX if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
waitcursor(1);
// XXX esubdivideflag(1, 0.0, scene->toolsettings->editbutflag, numcuts, 0);
break;
case 3:
// XXX if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
randfac= 10;
// XXX if(button(&randfac, 1, 100, "Rand fac:")==0) return;
waitcursor(1);
fac= -( (float)randfac )/100;
// XXX esubdivideflag(1, fac, scene->toolsettings->editbutflag, numcuts, 0);
break;
case 12: /* smooth */
/* if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return; */
fac= 1.0f;
// XXX if(fbutton(&fac, 0.0f, 5.0f, 10, 10, "Smooth:")==0) return;
// XXX fac= 0.292f*fac;
waitcursor(1);
// XXX esubdivideflag(1, fac, scene->toolsettings->editbutflag | B_SMOOTH, 1, 0);
break;
case 4:
// XXX mergemenu();
break;
case 5:
// XXX notice("Removed %d Vertices", removedoublesflag(1, 0, scene->toolsettings->doublimit));
break;
case 6:
// XXX hide_mesh(0);
break;
case 7:
// XXX reveal_mesh();
break;
case 8:
// XXX selectswap_mesh();
break;
case 9:
// XXX flip_editnormals();
break;
case 10:
// XXX vertexsmooth();
break;
case 11:
// XXX bevel_menu();
break;
case 14:
// XXX mesh_set_smooth_faces(1);
break;
case 15:
// XXX mesh_set_smooth_faces(0);
break;
case 16:
// XXX shape_copy_select_from();
break;
case 17:
// XXX shape_propagate();
break;
case 18:
// XXX pathselect();
break;
}
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
if(nr>0) waitcursor(0);
} }
else if(ELEM(obedit->type, OB_CURVE, OB_SURF)) { else if(ELEM(obedit->type, OB_CURVE, OB_SURF)) {
nr= pupmenu("Specials%t|Subdivide%x1|Switch Direction%x2|Set Goal Weight%x3|Set Radius%x4|Smooth%x5|Smooth Radius%x6");
switch(nr) {
case 1:
// XXX subdivideNurb();
break;
case 2:
// XXX switchdirectionNurb2();
break;
case 3:
// XXX setweightNurb();
break;
case 4:
// XXX setradiusNurb();
break;
case 5:
// XXX smoothNurb();
break;
case 6:
// XXX smoothradiusNurb();
break;
}
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
} }
else if(obedit->type==OB_ARMATURE) { else if(obedit->type==OB_ARMATURE) {
nr= pupmenu("Specials%t|Subdivide %x1|Subdivide Multi%x2|Switch Direction%x7|Flip Left-Right Names%x3|%l|AutoName Left-Right%x4|AutoName Front-Back%x5|AutoName Top-Bottom%x6"); nr= pupmenu("Specials%t|Subdivide %x1|Subdivide Multi%x2|Switch Direction%x7|Flip Left-Right Names%x3|%l|AutoName Left-Right%x4|AutoName Front-Back%x5|AutoName Top-Bottom%x6");

@ -45,7 +45,7 @@ void OBJECT_OT_parent_clear(struct wmOperatorType *ot);
void OBJECT_OT_track_set(struct wmOperatorType *ot); void OBJECT_OT_track_set(struct wmOperatorType *ot);
void OBJECT_OT_track_clear(struct wmOperatorType *ot); void OBJECT_OT_track_clear(struct wmOperatorType *ot);
void OBJECT_OT_select_all_toggle(struct wmOperatorType *ot); void OBJECT_OT_select_all_toggle(struct wmOperatorType *ot);
void OBJECT_OT_select_invert(struct wmOperatorType *ot); void OBJECT_OT_select_inverse(struct wmOperatorType *ot);
void OBJECT_OT_select_random(struct wmOperatorType *ot); void OBJECT_OT_select_random(struct wmOperatorType *ot);
void OBJECT_OT_select_by_type(struct wmOperatorType *ot); void OBJECT_OT_select_by_type(struct wmOperatorType *ot);
void OBJECT_OT_select_by_layer(struct wmOperatorType *ot); void OBJECT_OT_select_by_layer(struct wmOperatorType *ot);

@ -68,7 +68,7 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_parent_clear); WM_operatortype_append(OBJECT_OT_parent_clear);
WM_operatortype_append(OBJECT_OT_track_set); WM_operatortype_append(OBJECT_OT_track_set);
WM_operatortype_append(OBJECT_OT_track_clear); WM_operatortype_append(OBJECT_OT_track_clear);
WM_operatortype_append(OBJECT_OT_select_invert); WM_operatortype_append(OBJECT_OT_select_inverse);
WM_operatortype_append(OBJECT_OT_select_random); WM_operatortype_append(OBJECT_OT_select_random);
WM_operatortype_append(OBJECT_OT_select_all_toggle); WM_operatortype_append(OBJECT_OT_select_all_toggle);
WM_operatortype_append(OBJECT_OT_select_by_type); WM_operatortype_append(OBJECT_OT_select_by_type);
@ -139,7 +139,7 @@ void ED_keymap_object(wmWindowManager *wm)
keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0); keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "OBJECT_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "OBJECT_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_select_random", PADASTERKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "OBJECT_OT_select_random", PADASTERKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_select_by_type", PADASTERKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "OBJECT_OT_select_by_type", PADASTERKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_select_by_layer", PADASTERKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "OBJECT_OT_select_by_layer", PADASTERKEY, KM_PRESS, KM_ALT, 0);

@ -86,95 +86,6 @@
#define B_SIMA_RECORD 8 #define B_SIMA_RECORD 8
#define B_SIMA_PLAY 9 #define B_SIMA_PLAY 9
static void image_view_viewnavmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
int a;
uiItemO(layout, NULL, 0, "IMAGE_OT_view_zoom_in");
uiItemO(layout, NULL, 0, "IMAGE_OT_view_zoom_out");
uiItemS(layout);
for(a=0; a<7; a++) {
const int ratios[7][2] = {{1, 8}, {1, 4}, {1, 2}, {1, 1}, {2, 1}, {4, 1}, {8, 1}};
char namestr[128];
sprintf(namestr, "Zoom %d:%d", ratios[a][0], ratios[a][1]);
uiItemFloatO(layout, namestr, 0, "IMAGE_OT_view_zoom_ratio", "ratio", (float)ratios[a][0]/(float)ratios[a][1]);
}
}
#if 0
static void do_viewmenu(bContext *C, void *arg, int event)
{
add_blockhandler(curarea, IMAGE_HANDLER_VIEW_PROPERTIES, UI_PNL_UNSTOW);
add_blockhandler(curarea, IMAGE_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
add_blockhandler(curarea, IMAGE_HANDLER_PAINT, UI_PNL_UNSTOW);
add_blockhandler(curarea, IMAGE_HANDLER_CURVES, UI_PNL_UNSTOW);
toggle_blockhandler(curarea, IMAGE_HANDLER_PREVIEW, 0);
scrarea_queue_winredraw(curarea);
add_blockhandler(curarea, IMAGE_HANDLER_GAME_PROPERTIES, UI_PNL_UNSTOW);
add_blockhandler(curarea, IMAGE_HANDLER_GREASEPENCIL, UI_PNL_UNSTOW);
allqueue(REDRAWIMAGE, 0);
allqueue(REDRAWVIEW3D, 0);
}
#endif
static void image_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
bScreen *sc= CTX_wm_screen(C);
ScrArea *sa= CTX_wm_area(C);
SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
PointerRNA spaceptr, uvptr;
int show_paint, show_render, show_uvedit;
/* retrieve state */
RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr);
RNA_pointer_create(&sc->id, &RNA_SpaceUVEditor, sima, &uvptr);
show_render= ED_space_image_show_render(sima);
show_paint= ED_space_image_show_paint(sima);
show_uvedit= ED_space_image_show_uvedit(sima, CTX_data_edit_object(C));
/* create menu */
uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_properties");
//if(show_render) uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_compositing_preview_panel"); // Compositing Preview...|Shift P
uiItemS(layout);
uiItemR(layout, NULL, 0, &spaceptr, "update_automatically", 0, 0, 0);
// XXX if(show_uvedit) uiItemR(layout, NULL, 0, &uvptr, "local_view", 0, 0, 0); // "UV Local View", Numpad /
uiItemS(layout);
uiItemMenuF(layout, "View Navigation", 0, image_view_viewnavmenu);
if(show_uvedit) uiItemO(layout, NULL, 0, "IMAGE_OT_view_selected");
uiItemO(layout, NULL, 0, "IMAGE_OT_view_all");
if(sa->full) uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
else uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctr DownArrow
}
static void image_selectmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
uiItemO(layout, NULL, 0, "UV_OT_select_border");
uiItemBooleanO(layout, "Border Select Pinned", 0, "UV_OT_select_border", "pinned", 1); // Border Select Pinned|Shift B
uiItemS(layout);
uiItemO(layout, NULL, 0, "UV_OT_select_all_toggle");
uiItemO(layout, NULL, 0, "UV_OT_select_invert");
uiItemO(layout, NULL, 0, "UV_OT_unlink_selection");
uiItemS(layout);
uiItemO(layout, NULL, 0, "UV_OT_select_pinned");
uiItemO(layout, NULL, 0, "UV_OT_select_linked");
}
#if 0 #if 0
static void do_image_imagemenu(void *arg, int event) static void do_image_imagemenu(void *arg, int event)
{ {
@ -183,61 +94,7 @@ static void do_image_imagemenu(void *arg, int event)
if (event >= 20) BPY_menu_do_python(PYMENU_IMAGE, event - 20); if (event >= 20) BPY_menu_do_python(PYMENU_IMAGE, event - 20);
#endif #endif
} }
#endif
static void image_imagemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
bScreen *sc= CTX_wm_screen(C);
SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
PointerRNA spaceptr, imaptr;
Image *ima;
ImBuf *ibuf;
int show_render;
/* retrieve state */
ima= ED_space_image(sima);
ibuf= ED_space_image_buffer(sima);
show_render= ED_space_image_show_render(sima);
RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr);
/* create menu */
uiItemO(layout, NULL, 0, "IMAGE_OT_new"); // New...
uiItemO(layout, NULL, 0, "IMAGE_OT_open"); // Open...
if(ima) {
if(!show_render) {
uiItemO(layout, NULL, 0, "IMAGE_OT_replace"); // Replace...
uiItemO(layout, NULL, 0, "IMAGE_OT_reload"); // Reload...
}
uiItemO(layout, NULL, 0, "IMAGE_OT_save"); // Save
uiItemO(layout, NULL, 0, "IMAGE_OT_save_as"); // Save As...
if(ima->source == IMA_SRC_SEQUENCE)
uiItemO(layout, NULL, 0, "IMAGE_OT_save_sequence"); // Save Changed Sequence Images
if(!show_render) {
uiItemS(layout);
if(ima->packedfile) uiItemO(layout, NULL, 0, "IMAGE_OT_unpack"); // Unpack Image...
else uiItemO(layout, NULL, 0, "IMAGE_OT_pack"); // Pack Image
/* only for dirty && specific image types : XXX poll? */
if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
if(ELEM(ima->source, IMA_SRC_FILE, IMA_SRC_GENERATED) && ima->type != IMA_TYPE_MULTILAYER)
uiItemBooleanO(layout, "Pack As PNG", 0, "IMAGE_OT_pack", "as_png", 1); // Pack Image As PNG
uiItemS(layout);
uiItemR(layout, NULL, 0, &spaceptr, "image_painting", 0, 0, 0);
/* move to realtime properties panel */
RNA_id_pointer_create(&ima->id, &imaptr);
uiItemMenuEnumR(layout, NULL, 0, &imaptr, "mapping");
}
}
#if 0
#ifndef DISABLE_PYTHON #ifndef DISABLE_PYTHON
{ {
BPyMenu *pym; BPyMenu *pym;
@ -253,33 +110,6 @@ static void image_imagemenu(bContext *C, uiLayout *layout, void *arg_unused)
} }
#endif #endif
#endif #endif
}
static void image_uvs_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
uiItemO(layout, NULL, 0, "UV_OT_reveal");
uiItemO(layout, NULL, 0, "UV_OT_hide");
uiItemBooleanO(layout, "Hide Unselected", 0, "UV_OT_hide", "unselected", 1);
}
static void image_uvs_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_TRANSLATION);
uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_ROTATION);
uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_RESIZE);
}
static void image_uvs_mirrormenu(bContext *C, uiLayout *layout, void *arg_unused)
{
uiItemEnumO(layout, NULL, 0, "UV_OT_mirror", "axis", 'x'); // "X Axis", M, 1
uiItemEnumO(layout, NULL, 0, "UV_OT_mirror", "axis", 'y'); // "Y Axis", M, 2
}
static void image_uvs_weldalignmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
uiItemO(layout, NULL, 0, "UV_OT_weld"); // W, 1
uiItemsEnumO(layout, "UV_OT_align", "axis"); // W, 2/3/4
}
#if 0 #if 0
#ifndef DISABLE_PYTHON #ifndef DISABLE_PYTHON
@ -316,87 +146,7 @@ static void image_uvs_scriptsmenu (void *args_unused)
#endif /* DISABLE_PYTHON */ #endif /* DISABLE_PYTHON */
#endif #endif
static void image_uvsmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
bScreen *sc= CTX_wm_screen(C);
Scene *scene= CTX_data_scene(C);
SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
PointerRNA uvptr, sceneptr;
Image *ima;
ImBuf *ibuf;
/* retrieve state */
ima= ED_space_image(sima);
ibuf= ED_space_image_buffer(sima);
RNA_pointer_create(&sc->id, &RNA_SpaceUVEditor, sima, &uvptr);
RNA_id_pointer_create(&scene->id, &sceneptr);
/* create menu */
uiItemR(layout, NULL, 0, &uvptr, "snap_to_pixels", 0, 0, 0);
uiItemR(layout, NULL, 0, &uvptr, "constrain_to_image_bounds", 0, 0, 0);
uiItemS(layout);
uiItemR(layout, NULL, 0, &uvptr, "live_unwrap", 0, 0, 0);
uiItemO(layout, NULL, 0, "UV_OT_unwrap");
uiItemBooleanO(layout, "Unpin", 0, "UV_OT_pin", "clear", 1);
uiItemO(layout, NULL, 0, "UV_OT_pin");
uiItemS(layout);
uiItemO(layout, NULL, 0, "UV_OT_pack_islands");
uiItemO(layout, NULL, 0, "UV_OT_average_islands_scale");
uiItemO(layout, NULL, 0, "UV_OT_minimize_stretch");
uiItemO(layout, NULL, 0, "UV_OT_stitch");
uiItemS(layout);
uiItemMenuF(layout, "Transform", 0, image_uvs_transformmenu);
uiItemMenuF(layout, "Mirror", 0, image_uvs_mirrormenu);
uiItemMenuF(layout, "Weld/Align", 0, image_uvs_weldalignmenu);
uiItemS(layout);
uiItemR(layout, NULL, 0, &sceneptr, "proportional_editing", 0, 0, 0);
uiItemMenuEnumR(layout, NULL, 0, &sceneptr, "proportional_editing_falloff");
uiItemS(layout);
uiItemMenuF(layout, "Show/Hide Faces", 0, image_uvs_showhidemenu);
#if 0 #if 0
#ifndef DISABLE_PYTHON
uiItemS(layout);
uiItemMenuF(layout, "Scripts", image_uvs_scriptsmenu);
#endif
#endif
}
static void image_menu_uvlayers(Object *obedit, char *menustr, int *active)
{
Mesh *me= (Mesh*)obedit->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
CustomDataLayer *layer;
int i, count = 0;
menustr[0]= '\0';
for(i=0; i<em->fdata.totlayer; i++) {
layer = &em->fdata.layers[i];
if(layer->type == CD_MTFACE) {
menustr += sprintf(menustr, "%s%%x%d|", layer->name, count);
count++;
}
}
*active= CustomData_get_active_layer(&em->fdata, CD_MTFACE);
BKE_mesh_end_editmesh(me, em);
}
static void do_image_buttons(bContext *C, void *arg, int event) static void do_image_buttons(bContext *C, void *arg, int event)
{ {
switch(event) { switch(event) {
@ -405,7 +155,6 @@ static void do_image_buttons(bContext *C, void *arg, int event)
break; break;
} }
#if 0
ToolSettings *settings= G.scene->toolsettings; ToolSettings *settings= G.scene->toolsettings;
ID *id, *idtest; ID *id, *idtest;
int nr; int nr;
@ -660,279 +409,9 @@ static void do_image_buttons(bContext *C, void *arg, int event)
imagespace_composite_flipbook(curarea); imagespace_composite_flipbook(curarea);
break; break;
} }
#endif
}
#if 0
static void do_image_buttons_set_uvlayer_callback(void *act, void *data)
{
CustomData_set_layer_active(&G.editMesh->fdata, CD_MTFACE, *((int *)act));
BIF_undo_push("Set Active UV Texture");
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWIMAGE, 0);
} }
#endif #endif
static void sima_idpoin_handle(bContext *C, ID *id, int event)
{
SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
switch(event) {
case UI_ID_BROWSE:
case UI_ID_DELETE:
ED_space_image_set(C, sima, scene, obedit, (Image*)id);
ED_undo_push(C, "Assign Image UV");
break;
case UI_ID_RENAME:
break;
case UI_ID_ADD_NEW:
WM_operator_name_call(C, "IMAGE_OT_new", WM_OP_INVOKE_REGION_WIN, NULL);
break;
case UI_ID_OPEN:
WM_operator_name_call(C, "IMAGE_OT_open", WM_OP_INVOKE_REGION_WIN, NULL);
break;
case UI_ID_PIN:
ED_area_tag_refresh(CTX_wm_area(C));
break;
}
}
void image_header_buttons(const bContext *C, ARegion *ar)
{
bScreen *sc= CTX_wm_screen(C);
ScrArea *sa= CTX_wm_area(C);
Scene *scene= CTX_data_scene(C);
SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
Image *ima;
ImBuf *ibuf;
uiBlock *block;
uiBut *but;
PointerRNA spaceptr, uvptr, sceneptr;
int xco, yco= 3, show_uvedit, show_render, show_paint, pinflag;
/* retrieve state */
ima= ED_space_image(sima);
ibuf= ED_space_image_buffer(sima);
show_render= ED_space_image_show_render(sima);
show_paint= ED_space_image_show_paint(sima);
show_uvedit= ED_space_image_show_uvedit(sima, CTX_data_edit_object(C));
RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr);
RNA_pointer_create(&sc->id, &RNA_SpaceUVEditor, sima, &uvptr);
RNA_id_pointer_create(&scene->id, &sceneptr);
/* create block */
block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
uiBlockSetHandleFunc(block, do_image_buttons, NULL);
xco= ED_area_header_standardbuttons(C, block, yco);
/* create pulldown menus */
if((sa->flag & HEADER_NO_PULLDOWN)==0) {
char *menuname;
int xmax;
xmax= GetButStringLength("View");
uiDefMenuBut(block, image_viewmenu, NULL, "View", xco, yco, xmax-3, 20, "");
xco+= xmax;
if(show_uvedit) {
xmax= GetButStringLength("Select");
uiDefMenuBut(block, image_selectmenu, NULL, "Select", xco, yco, xmax-3, 20, "");
xco+= xmax;
}
menuname= (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))? "Image*": "Image";
xmax= GetButStringLength(menuname);
uiDefMenuBut(block, image_imagemenu, NULL, menuname, xco, yco, xmax-3, 20, "");
xco+= xmax;
if(show_uvedit) {
xmax= GetButStringLength("UVs");
uiDefMenuBut(block, image_uvsmenu, NULL, "UVs", xco, yco, xmax-3, 20, "");
xco+= xmax;
}
}
uiBlockSetEmboss(block, UI_EMBOSS);
/* image select */
pinflag= (show_render)? 0: UI_ID_PIN;
xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)sima->image, ID_IM, &sima->pin, xco, yco,
sima_idpoin_handle, UI_ID_BROWSE|UI_ID_BROWSE_RENDER|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_DELETE|pinflag);
xco += 8;
if(ima && !ELEM3(ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE, IMA_SRC_VIEWER) && ima->ok) {
/* XXX this should not be a static var */
static int headerbuttons_packdummy;
headerbuttons_packdummy = 0;
if (ima->packedfile) {
headerbuttons_packdummy = 1;
}
if (ima->packedfile && ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
uiDefIconButBitI(block, TOG, 1, 0 /* XXX B_SIMA_REPACK */, ICON_UGLYPACKAGE, xco,yco,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Re-Pack this image as PNG");
else
uiDefIconButBitI(block, TOG, 1, 0 /* XXX B_SIMAPACKIMA */, ICON_PACKAGE, xco,yco,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Pack/Unpack this image");
xco+= XIC+8;
}
/* uv editing */
if(show_uvedit) {
/* pivot */
uiDefIconTextButS(block, ICONTEXTROW, B_NOP, ICON_ROTATE,
"Pivot: %t|Bounding Box Center %x0|Median Point %x3|2D Cursor %x1",
xco,yco,XIC+10,YIC, &ar->v2d.around, 0, 3.0, 0, 0,
"Rotation/Scaling Pivot (Hotkeys: Comma, Shift Comma, Period)");
xco+= XIC + 18;
/* selection modes */
uiDefIconButBitS(block, TOG, UV_SYNC_SELECTION, B_REDR, ICON_EDIT, xco,yco,XIC,YIC, &scene->toolsettings->uv_flag, 0, 0, 0, 0, "Sync UV and Mesh Selection");
xco+= XIC+8;
if(scene->toolsettings->uv_flag & UV_SYNC_SELECTION) {
uiBlockBeginAlign(block);
uiDefIconButBitS(block, TOG, SCE_SELECT_VERTEX, B_REDR, ICON_VERTEXSEL,
xco,yco,XIC,YIC, &scene->toolsettings->selectmode, 1.0, 0.0, 0, 0, "Vertex select mode");
uiDefIconButBitS(block, TOG, SCE_SELECT_EDGE, B_REDR, ICON_EDGESEL,
xco+=XIC,yco,XIC,YIC, &scene->toolsettings->selectmode, 1.0, 0.0, 0, 0, "Edge select mode");
uiDefIconButBitS(block, TOG, SCE_SELECT_FACE, B_REDR, ICON_FACESEL,
xco+=XIC,yco,XIC,YIC, &scene->toolsettings->selectmode, 1.0, 0.0, 0, 0, "Face select mode");
uiBlockEndAlign(block);
}
else {
uiBlockBeginAlign(block);
uiDefIconButS(block, ROW, B_REDR, ICON_VERTEXSEL,
xco,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_VERTEX, 0, 0, "Vertex select mode");
uiDefIconButS(block, ROW, B_REDR, ICON_EDGESEL,
xco+=XIC,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_EDGE, 0, 0, "Edge select mode");
uiDefIconButS(block, ROW, B_REDR, ICON_FACESEL,
xco+=XIC,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_FACE, 0, 0, "Face select mode");
uiDefIconButS(block, ROW, B_REDR, ICON_LINKEDSEL,
xco+=XIC,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_ISLAND, 0, 0, "Island select mode");
uiBlockEndAlign(block);
/* would use these if const's could go in strings
* SI_STICKY_LOC SI_STICKY_DISABLE SI_STICKY_VERTEX */
but = uiDefIconTextButC(block, ICONTEXTROW, B_REDR, ICON_STICKY_UVS_LOC,
"Sticky UV Selection: %t|Disable%x1|Shared Location%x0|Shared Vertex%x2",
xco+=XIC+10,yco,XIC+10,YIC, &(sima->sticky), 0, 3.0, 0, 0,
"Sticky UV Selection (Hotkeys: Shift C, Alt C, Ctrl C)");
}
xco+= XIC + 16;
/* snap options, identical to options in 3d view header */
uiBlockBeginAlign(block);
if (scene->toolsettings->snap_flag & SCE_SNAP) {
uiDefIconButBitS(block, TOG, SCE_SNAP, B_REDR, ICON_SNAP_GEO,xco,yco,XIC,YIC, &scene->toolsettings->snap_flag, 0, 0, 0, 0, "Use Snap or Grid (Shift Tab).");
xco+= XIC;
uiDefButS(block, MENU, B_NOP, "Mode%t|Closest%x0|Center%x1|Median%x2",xco,yco,70,YIC, &scene->toolsettings->snap_target, 0, 0, 0, 0, "Snap Target Mode.");
xco+= 70;
}
else {
uiDefIconButBitS(block, TOG, SCE_SNAP, B_REDR, ICON_SNAP_GEAR,xco,yco,XIC,YIC, &scene->toolsettings->snap_flag, 0, 0, 0, 0, "Snap while Ctrl is held during transform (Shift Tab).");
xco+= XIC;
}
uiBlockEndAlign(block);
xco+= 8;
/* uv layers */
{
Object *obedit= CTX_data_edit_object(C);
char menustr[34*MAX_MTFACE];
static int act;
image_menu_uvlayers(obedit, menustr, &act);
but = uiDefButI(block, MENU, B_NOP, menustr ,xco,yco,85,YIC, &act, 0, 0, 0, 0, "Active UV Layer for editing.");
// uiButSetFunc(but, do_image_buttons_set_uvlayer_callback, &act, NULL);
xco+= 85;
}
xco+= 8;
}
if(ima) {
RenderResult *rr;
/* render layers and passes */
rr= BKE_image_get_renderresult(scene, ima);
if(rr) {
uiBlockBeginAlign(block);
#if 0
uiblock_layer_pass_buttons(block, rr, &sima->iuser, B_REDR, xco, 0, 160);
#endif
uiBlockEndAlign(block);
xco+= 166;
}
/* painting */
uiDefIconButR(block, TOG, B_REDR, ICON_TPAINT_HLT, xco,yco,XIC,YIC, &spaceptr, "image_painting", 0, 0, 0, 0, 0, NULL);
xco+= XIC+8;
/* image draw options */
uiBlockBeginAlign(block);
uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_RGB, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, 0, 0, 0, NULL);
xco+= XIC;
if(ibuf==NULL || ibuf->channels==4) {
uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_RGB_ALPHA, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, SI_USE_ALPHA, 0, 0, NULL);
xco+= XIC;
uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_ALPHA, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, SI_SHOW_ALPHA, 0, 0, NULL);
xco+= XIC;
}
if(ibuf) {
if(ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels==1)) {
uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_ZDEPTH, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, SI_SHOW_ZBUF, 0, 0, NULL);
xco+= XIC;
}
}
#ifdef WITH_LCMS
uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_ALPHA, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, SI_COLOR_CORRECTION, 0, 0, NULL);
xco+= XIC;
#endif
xco+= 8;
/* record & play */
uiBlockBeginAlign(block);
if(ima->type==IMA_TYPE_COMPOSITE) {
uiDefIconButO(block, BUT, "IMAGE_OT_record_composite", WM_OP_INVOKE_REGION_WIN, ICON_REC, xco, yco, XIC, YIC, NULL); // Record Composite
xco+= XIC;
}
if((ima->type==IMA_TYPE_COMPOSITE) || ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
//XXX uiDefIconButO(block, BUT, "IMAGE_OT_play_composite", WM_OP_INVOKE_REGION_WIN, ICON_PLAY, xco, yco, XIC, YIC, NULL); // PLAY
xco+= XIC;
}
uiBlockEndAlign(block);
xco+= 8;
}
/* draw lock */
uiDefIconButR(block, ICONTOG, 0, ICON_UNLOCKED, xco,yco,XIC,YIC, &spaceptr, "update_automatically", 0, 0, 0, 0, 0, NULL);
/* always as last */
UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
uiEndBlock(C, block);
uiDrawBlock(C, block);
}
/********************** toolbox operator *********************/ /********************** toolbox operator *********************/
static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event) static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
@ -948,10 +427,10 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
pup= uiPupMenuBegin(C, "Toolbox", 0); pup= uiPupMenuBegin(C, "Toolbox", 0);
layout= uiPupMenuLayout(pup); layout= uiPupMenuLayout(pup);
uiItemMenuF(layout, "View", 0, image_viewmenu); uiItemM(layout, C, NULL, 0, "IMAGE_MT_view");
if(show_uvedit) uiItemMenuF(layout, "Select", 0, image_selectmenu); if(show_uvedit) uiItemM(layout, C, NULL, 0, "IMAGE_MT_select");
uiItemMenuF(layout, "Image", 0, image_imagemenu); uiItemM(layout, C, NULL, 0, "IMAGE_MT_image");
if(show_uvedit) uiItemMenuF(layout, "UVs", 0, image_uvsmenu); if(show_uvedit) uiItemM(layout, C, NULL, 0, "IMAGE_MT_uvs");
uiPupMenuEnd(C, pup); uiPupMenuEnd(C, pup);

@ -588,7 +588,6 @@ void ED_spacetype_image(void)
BLI_addhead(&st->regiontypes, art); BLI_addhead(&st->regiontypes, art);
BKE_spacetype_register(st); BKE_spacetype_register(st);
} }

@ -104,7 +104,7 @@ void SEQUENCER_OT_select_linked_pick(struct wmOperatorType *ot);
void SEQUENCER_OT_select_handles(struct wmOperatorType *ot); void SEQUENCER_OT_select_handles(struct wmOperatorType *ot);
void SEQUENCER_OT_select_active_side(struct wmOperatorType *ot); void SEQUENCER_OT_select_active_side(struct wmOperatorType *ot);
void SEQUENCER_OT_select_border(struct wmOperatorType *ot); void SEQUENCER_OT_select_border(struct wmOperatorType *ot);
void SEQUENCER_OT_select_invert(struct wmOperatorType *ot); void SEQUENCER_OT_select_inverse(struct wmOperatorType *ot);
/* sequencer_select.c */ /* sequencer_select.c */

@ -83,7 +83,7 @@ void sequencer_operatortypes(void)
/* sequencer_select.c */ /* sequencer_select.c */
WM_operatortype_append(SEQUENCER_OT_select_all_toggle); WM_operatortype_append(SEQUENCER_OT_select_all_toggle);
WM_operatortype_append(SEQUENCER_OT_select_invert); WM_operatortype_append(SEQUENCER_OT_select_inverse);
WM_operatortype_append(SEQUENCER_OT_select); WM_operatortype_append(SEQUENCER_OT_select);
WM_operatortype_append(SEQUENCER_OT_select_more); WM_operatortype_append(SEQUENCER_OT_select_more);
WM_operatortype_append(SEQUENCER_OT_select_less); WM_operatortype_append(SEQUENCER_OT_select_less);
@ -111,7 +111,7 @@ void sequencer_keymap(wmWindowManager *wm)
WM_keymap_add_item(keymap, "SEQUENCER_OT_properties", NKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_properties", NKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, 0, 0)->ptr, "type", SEQ_CUT_SOFT); RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, 0, 0)->ptr, "type", SEQ_CUT_SOFT);
RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", SEQ_CUT_HARD); RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", SEQ_CUT_HARD);

@ -244,7 +244,7 @@ void SEQUENCER_OT_select_all_toggle(struct wmOperatorType *ot)
/* (de)select operator */ /* (de)select operator */
static int sequencer_select_invert_exec(bContext *C, wmOperator *op) static int sequencer_select_inverse_exec(bContext *C, wmOperator *op)
{ {
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE); Editing *ed= seq_give_editing(scene, FALSE);
@ -267,14 +267,14 @@ static int sequencer_select_invert_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void SEQUENCER_OT_select_invert(struct wmOperatorType *ot) void SEQUENCER_OT_select_inverse(struct wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Select Invert"; ot->name= "Select Inverse";
ot->idname= "SEQUENCER_OT_select_invert"; ot->idname= "SEQUENCER_OT_select_inverse";
/* api callbacks */ /* api callbacks */
ot->exec= sequencer_select_invert_exec; ot->exec= sequencer_select_inverse_exec;
ot->poll= ED_operator_sequencer_active; ot->poll= ED_operator_sequencer_active;

@ -644,6 +644,9 @@ static void view3d_view_alignviewmenu(bContext *C, uiLayout *layout, void *arg_u
static void view3d_viewmenu(bContext *C, uiLayout *layout, void *arg_unused) static void view3d_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
{ {
ScrArea *sa= CTX_wm_area(C); ScrArea *sa= CTX_wm_area(C);
uiItemO(layout, NULL, ICON_MENU_PANEL, "VIEW3D_OT_properties");
uiItemO(layout, NULL, ICON_MENU_PANEL, "VIEW3D_OT_toolbar");
// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_transform_orientations_panel"); // Transform Orientations... // uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_transform_orientations_panel"); // Transform Orientations...
// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_render_preview_panel"); // render preview... // uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_render_preview_panel"); // render preview...
@ -651,7 +654,7 @@ static void view3d_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_background_image_panel"); // Background Image.... // uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_background_image_panel"); // Background Image....
// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_grease_pencil_panel"); // Grease Pencil.... // uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_grease_pencil_panel"); // Grease Pencil....
// uiItemS(layout); uiItemS(layout);
uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_CAMERA); uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_CAMERA);
uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_TOP); uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_TOP);
@ -1014,7 +1017,7 @@ static void view3d_select_objectmenu(bContext *C, uiLayout *layout, void *arg_un
uiItemS(layout); uiItemS(layout);
uiItemO(layout, "Select/Deselect All", 0, "OBJECT_OT_select_all_toggle"); uiItemO(layout, "Select/Deselect All", 0, "OBJECT_OT_select_all_toggle");
uiItemO(layout, "Inverse", 0, "OBJECT_OT_select_invert"); uiItemO(layout, "Inverse", 0, "OBJECT_OT_select_inverse");
uiItemO(layout, "Random", 0, "OBJECT_OT_select_random"); uiItemO(layout, "Random", 0, "OBJECT_OT_select_random");
uiItemO(layout, "Select All by Layer", 0, "OBJECT_OT_select_by_layer"); uiItemO(layout, "Select All by Layer", 0, "OBJECT_OT_select_by_layer");
uiItemMenuEnumO(layout, "Select All by Type", 0, "OBJECT_OT_select_by_type", "type"); uiItemMenuEnumO(layout, "Select All by Type", 0, "OBJECT_OT_select_by_type", "type");
@ -1037,7 +1040,7 @@ static void view3d_select_meshmenu(bContext *C, uiLayout *layout, void *arg_unus
uiItemS(layout); uiItemS(layout);
uiItemO(layout, "Select/Deselect All", 0, "MESH_OT_select_all_toggle"); uiItemO(layout, "Select/Deselect All", 0, "MESH_OT_select_all_toggle");
uiItemO(layout, "Inverse", 0, "MESH_OT_select_invert"); uiItemO(layout, "Inverse", 0, "MESH_OT_select_inverse");
uiItemS(layout); uiItemS(layout);
@ -1061,8 +1064,8 @@ static void view3d_select_meshmenu(bContext *C, uiLayout *layout, void *arg_unus
uiItemO(layout, "Linked", 0, "MESH_OT_select_linked"); uiItemO(layout, "Linked", 0, "MESH_OT_select_linked");
uiItemO(layout, "Vertex Path", 0, "MESH_OT_select_vertex_path"); // W, Alt 7 uiItemO(layout, "Vertex Path", 0, "MESH_OT_select_vertex_path"); // W, Alt 7
// XXX uiItemO(layout, "Edge Loop", 0, "MESH_OT_select_edge_loop"); // loop_multiselect(0) uiItemO(layout, "Edge Loop", 0, "MESH_OT_loop_multi_select");
// XXX uiItemO(layout, "Edge Ring", 0, "MESH_OT_select_edge_ring"); // loop_multiselect(1) uiItemBooleanO(layout, "Edge Ring", 0, "MESH_OT_loop_multi_select", "ring", 1);
uiItemS(layout); uiItemS(layout);
@ -1080,7 +1083,7 @@ static void view3d_select_curvemenu(bContext *C, uiLayout *layout, void *arg_unu
uiItemS(layout); uiItemS(layout);
uiItemO(layout, NULL, 0, "CURVE_OT_select_all_toggle"); uiItemO(layout, NULL, 0, "CURVE_OT_select_all_toggle");
uiItemO(layout, NULL, 0, "CURVE_OT_select_invert"); uiItemO(layout, NULL, 0, "CURVE_OT_select_inverse");
uiItemO(layout, NULL, 0, "CURVE_OT_select_random"); // Random... uiItemO(layout, NULL, 0, "CURVE_OT_select_random"); // Random...
uiItemO(layout, NULL, 0, "CURVE_OT_select_every_nth"); // Every Nth.. uiItemO(layout, NULL, 0, "CURVE_OT_select_every_nth"); // Every Nth..
@ -1182,7 +1185,7 @@ static void view3d_select_armaturemenu(bContext *C, uiLayout *layout, void *arg_
uiItemS(layout); uiItemS(layout);
uiItemO(layout, "Select/Deselect All", 0, "ARMATURE_OT_select_all_toggle"); uiItemO(layout, "Select/Deselect All", 0, "ARMATURE_OT_select_all_toggle");
uiItemO(layout, "Inverse", 0, "ARMATURE_OT_select_invert"); uiItemO(layout, "Inverse", 0, "ARMATURE_OT_select_inverse");
uiItemS(layout); uiItemS(layout);
@ -1211,7 +1214,7 @@ static void view3d_select_posemenu(bContext *C, uiLayout *layout, void *arg_unus
uiItemS(layout); uiItemS(layout);
uiItemO(layout, "Select/Deselect All", 0, "POSE_OT_select_all_toggle"); uiItemO(layout, "Select/Deselect All", 0, "POSE_OT_select_all_toggle");
uiItemO(layout, "Inverse", 0, "POSE_OT_select_invert"); uiItemO(layout, "Inverse", 0, "POSE_OT_select_inverse");
uiItemO(layout, "Constraint Target", 0, "POSE_OT_select_constraint_target"); uiItemO(layout, "Constraint Target", 0, "POSE_OT_select_constraint_target");
uiItemS(layout); uiItemS(layout);
@ -1302,57 +1305,17 @@ static uiBlock *view3d_select_faceselmenu(bContext *C, ARegion *ar, void *arg_un
return block; return block;
} }
void do_view3d_edit_snapmenu(bContext *C, void *arg, int event) static void view3d_edit_snapmenu(bContext *C, uiLayout *layout, void *arg_unused)
{ {
#if 0 uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_grid");
switch (event) { uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_cursor");
case 1: /*Selection to grid*/ uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_center");
snap_sel_to_grid();
ED_undo_push(C, "Snap selection to grid");
break;
case 2: /*Selection to cursor*/
snap_sel_to_curs();
ED_undo_push(C, "Snap selection to cursor");
break;
case 3: /*Selection to center of selection*/
snap_to_center();
ED_undo_push(C, "Snap selection to center");
break;
case 4: /*Cursor to selection*/
snap_curs_to_sel();
break;
case 5: /*Cursor to grid*/
snap_curs_to_grid();
break;
case 6: /*Cursor to Active*/
snap_curs_to_active();
ED_undo_push(C, "Snap selection to center");
break;
}
#endif
}
static uiBlock *view3d_edit_snapmenu(bContext *C, ARegion *ar, void *arg_unused) uiItemS(layout);
{
uiBlock *block;
short yco = 20, menuwidth = 120;
block= uiBeginBlock(C, ar, "view3d_edit_snapmenu", UI_EMBOSSP); uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_selected");
uiBlockSetButmFunc(block, do_view3d_edit_snapmenu, NULL); uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_grid");
uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_active");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Grid|Shift S, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Cursor|Shift S, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Center|Shift S, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Selection|Shift S, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Grid|Shift S, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Active|Shift S, 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
return block;
} }
void do_view3d_transform_moveaxismenu(bContext *C, void *arg, int event) void do_view3d_transform_moveaxismenu(bContext *C, void *arg, int event)
@ -2338,7 +2301,7 @@ static uiBlock *view3d_edit_objectmenu(bContext *C, ARegion *ar, void *arg_unuse
uiDefIconTextBlockBut(block, view3d_object_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, ""); uiDefIconTextBlockBut(block, view3d_object_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_object_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Clear/Apply", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_object_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Clear/Apply", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, ""); // XXX uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@ -2397,116 +2360,26 @@ static uiBlock *view3d_edit_objectmenu(bContext *C, ARegion *ar, void *arg_unuse
} }
static void do_view3d_edit_propfalloffmenu(bContext *C, void *arg, int event) static void view3d_edit_mesh_verticesmenu(bContext *C, uiLayout *layout, void *arg_unused)
{ {
ToolSettings *ts= CTX_data_tool_settings(C); uiItemO(layout, "Merge...", 0, "MESH_OT_merge");
uiItemO(layout, "Rip", 0, "MESH_OT_rip");
ts->prop_mode= event; uiItemO(layout, "Split", 0, "MESH_OT_split");
uiItemO(layout, "Separate", 0, "MESH_OT_separate");
}
static uiBlock *view3d_edit_propfalloffmenu(bContext *C, ARegion *ar, void *arg_unused) uiItemS(layout);
{
ToolSettings *ts= CTX_data_tool_settings(C);
uiBlock *block;
short yco = 20, menuwidth = 120;
block= uiBeginBlock(C, ar, "view3d_edit_propfalloffmenu", UI_EMBOSSP); uiItemO(layout, "Smooth", 0, "MESH_OT_vertices_smooth");
uiBlockSetButmFunc(block, do_view3d_edit_propfalloffmenu, NULL); uiItemO(layout, "Remove Doubles", 0, "MESH_OT_remove_doubles");
if (ts->prop_mode==PROP_SMOOTH) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Smooth|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Smooth|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
if (ts->prop_mode==PROP_SPHERE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sphere|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sphere|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
if (ts->prop_mode==PROP_ROOT) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Root|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Root|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
if (ts->prop_mode==PROP_SHARP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
if (ts->prop_mode==PROP_LIN) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Linear|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Linear|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
if (ts->prop_mode==PROP_RANDOM) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Random|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_RANDOM, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Random|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_RANDOM, "");
if (ts->prop_mode==PROP_CONST) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Constant|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Constant|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
return block;
}
void do_view3d_edit_mesh_verticesmenu(bContext *C, void *arg, int event)
{
#if 0 #if 0
Scene *scene= CTX_data_scene(C); uiItemS(layout);
switch(event) { uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); // add_hook_menu();
int count; uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); // make_parent();
case 0: /* make vertex parent */
make_parent();
break;
case 1: /* remove doubles */
count= removedoublesflag(1, 0, ts->doublimit);
notice("Removed: %d", count);
if (count) { /* only undo and redraw if an action is taken */
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
ED_undo_push(C, "Rem Doubles");
}
break;
case 2: /* smooth */
vertexsmooth();
break;
case 3: /* separate */
separate_mesh();
break;
case 4: /*split */
split_mesh();
break;
case 5: /*merge */
mergemenu();
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
break;
case 6: /* add hook */
add_hook_menu();
break;
case 7: /* rip */
mesh_rip();
break;
}
#endif #endif
} }
static uiBlock *view3d_edit_mesh_verticesmenu(bContext *C, ARegion *ar, void *arg_unused)
{
uiBlock *block;
short yco = 20, menuwidth = 120;
block= uiBeginBlock(C, ar, "view3d_edit_mesh_verticesmenu", UI_EMBOSSP);
uiBlockSetButmFunc(block, do_view3d_edit_mesh_verticesmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Merge...|Alt M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rip|V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Split|Y", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Smooth|W, Alt 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Doubles|W, 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
return block;
}
extern void editmesh_mark_sharp(int set); /* declared in editmesh_mods.c */
void do_view3d_edit_mesh_edgesmenu(bContext *C, void *arg, int event) void do_view3d_edit_mesh_edgesmenu(bContext *C, void *arg, int event)
{ {
#if 0 #if 0
@ -2515,52 +2388,12 @@ void do_view3d_edit_mesh_edgesmenu(bContext *C, void *arg, int event)
short randfac; short randfac;
switch(event) { switch(event) {
case 0: /* subdivide smooth */
esubdivideflag(1, 0.0, ts->editbutflag | B_SMOOTH,1,0);
ED_undo_push(C, "Subdivide Smooth");
break;
case 1: /*subdivide fractal */
randfac= 10;
if(button(&randfac, 1, 100, "Rand fac:")==0) return;
fac= -( (float)randfac )/100;
esubdivideflag(1, fac, ts->editbutflag,1,0);
ED_undo_push(C, "Subdivide Fractal");
break;
case 2: /* subdivide */
esubdivideflag(1, 0.0, ts->editbutflag,1,0);
ED_undo_push(C, "Subdivide");
break;
case 3: /* knife subdivide */
KnifeSubdivide(KNIFE_PROMPT);
break;
case 4: /* Loop subdivide */
CutEdgeloop(1);
break;
case 5: /* Make Edge/Face */
addedgeface_mesh();
break;
case 6:
bevel_menu();
break;
case 7: /* Mark Seam */
editmesh_mark_seam(0);
break;
case 8: /* Clear Seam */
editmesh_mark_seam(1);
break;
case 9: /* Crease SubSurf */ case 9: /* Crease SubSurf */
if(!multires_level1_test()) { if(!multires_level1_test()) {
initTransform(TFM_CREASE, CTX_EDGE); initTransform(TFM_CREASE, CTX_EDGE);
Transform(); Transform();
} }
break; break;
case 10: /* Rotate Edge */
edge_rotate_selected(2);
break;
case 11: /* Rotate Edge */
edge_rotate_selected(1);
break;
case 12: /* Edgeslide */ case 12: /* Edgeslide */
EdgeSlide(0,0.0); EdgeSlide(0,0.0);
break; break;
@ -2575,16 +2408,6 @@ void do_view3d_edit_mesh_edgesmenu(bContext *C, void *arg, int event)
collapseEdges(); collapseEdges();
ED_undo_push(C, "Collapse"); ED_undo_push(C, "Collapse");
break; break;
case 15:
editmesh_mark_sharp(1);
ED_undo_push(C, "Mark Sharp");
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
break;
case 16:
editmesh_mark_sharp(0);
ED_undo_push(C, "Clear Sharp");
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
break;
case 17: /* Adjust Bevel Weight */ case 17: /* Adjust Bevel Weight */
if(!multires_level1_test()) { if(!multires_level1_test()) {
initTransform(TFM_BWEIGHT, CTX_EDGE); initTransform(TFM_BWEIGHT, CTX_EDGE);
@ -2595,158 +2418,79 @@ void do_view3d_edit_mesh_edgesmenu(bContext *C, void *arg, int event)
#endif #endif
} }
static uiBlock *view3d_edit_mesh_edgesmenu(bContext *C, ARegion *ar, void *arg_unused) static void view3d_edit_mesh_edgesmenu(bContext *C, uiLayout *layout, void *arg_unused)
{ {
uiBlock *block; uiItemO(layout, NULL, 0, "MESH_OT_edge_face_add");
short yco = 20, menuwidth = 120;
block= uiBeginBlock(C, ar, "view3d_edit_mesh_edgesmenu", UI_EMBOSSP); #if 0
uiBlockSetButmFunc(block, do_view3d_edit_mesh_edgesmenu, NULL); uiItemO(layout, "Bevel", 0, "MESH_OT_bevel"); // bevelmenu(em)
uiItemO(layout, "Loop Subdivide...", 0, "MESH_OT_loop_subdivide"); // Ctr R, CutEdgeloop(1);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); uiItemO(layout, "Knife Subdivide...", 0, "MESH_OT_loop_subdivide"); // Shift K, KnifeSubdivide(KNIFE_PROMPT);
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel|W, Alt 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop Subdivide...|Ctrl R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Knife Subdivide...|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Fractal|W, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Smooth|W, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiItemS(layout);
#endif
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Seam|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); uiItemO(layout, "Subdivide", 0, "MESH_OT_subdivide");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, ""); uiItemFloatO(layout, "Subdivide Smooth", 0, "MESH_OT_subdivide", "smoothness", 1.0f);
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiItemS(layout);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Sharp|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, ""); uiItemO(layout, "Mark Seam", 0, "MESH_OT_mark_seam");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Sharp|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, ""); uiItemBooleanO(layout, "Clear Seam", 0, "MESH_OT_mark_seam", "clear", 1);
uiItemS(layout);
uiItemO(layout, "Mark Sharp", 0, "MESH_OT_mark_sharp");
uiItemBooleanO(layout, "Clear Sharp", 0, "MESH_OT_mark_sharp", "clear", 1);
#if 0
uiItemS(layout);
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Adjust Bevel Weight|Ctrl Shift E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Adjust Bevel Weight|Ctrl Shift E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
#endif
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiItemS(layout);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CW|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, ""); uiItemEnumO(layout, "Rotate Edge CW", 0, "MESH_OT_edge_rotate", "direction", 1);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CCW|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, ""); uiItemEnumO(layout, "Rotate Edge CCW", 0, "MESH_OT_edge_rotate", "direction", 2);
#if 0
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Slide Edge |Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Slide Edge |Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Edge Loop|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Edge Loop|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
return block;
}
void do_view3d_edit_mesh_facesmenu(bContext *C, void *arg, int event)
{
#if 0
Scene *scene= CTX_data_scene(C);
switch(event) {
case 0: /* Fill Faces */
fill_mesh();
break;
case 1: /* Beauty Fill Faces */
beauty_fill();
break;
case 2: /* Quads to Tris */
convert_to_triface(0);
countall();
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
break;
case 3: /* Tris to Quads */
join_triangles();
break;
case 4: /* Flip triangle edges */
edge_flip();
break;
case 5: /* Make Edge/Face */
addedgeface_mesh();
break;
case 6: /* Set Smooth */
mesh_set_smooth_faces(1);
break;
case 7: /* Set Solid */
mesh_set_smooth_faces(0);
break;
}
#endif #endif
} }
static uiBlock *view3d_edit_mesh_facesmenu(bContext *C, ARegion *ar, void *arg_unused) static void view3d_edit_mesh_facesmenu(bContext *C, uiLayout *layout, void *arg_unused)
{ {
uiBlock *block; uiItemO(layout, NULL, 0, "MESH_OT_edge_face_add");
short yco = 20, menuwidth = 120; uiItemO(layout, NULL, 0, "MESH_OT_fill");
uiItemO(layout, NULL, 0, "MESH_OT_beauty_fill");
block= uiBeginBlock(C, ar, "view3d_edit_mesh_facesmenu", UI_EMBOSSP); uiItemS(layout);
uiBlockSetButmFunc(block, do_view3d_edit_mesh_facesmenu, NULL);
uiItemO(layout, NULL, 0, "MESH_OT_quads_convert_to_tris");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); uiItemO(layout, NULL, 0, "MESH_OT_tris_convert_to_quads");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill|Shift F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); uiItemO(layout, NULL, 0, "MESH_OT_edge_flip");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Beautify Fill|Alt F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiItemS(layout);
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_solid");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Quads to Triangles|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Triangles to Quads|Alt J", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Triangle Edges|Ctrl Shift F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Smooth|W, Alt 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Solid|W, Alt 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
return block;
} }
void do_view3d_edit_mesh_normalsmenu(bContext *C, void *arg, int event) static void view3d_edit_mesh_normalsmenu(bContext *C, uiLayout *layout, void *arg_unused)
{ {
#if 0 uiItemO(layout, "Recalculate Outside", 0, "MESH_OT_normals_make_consistent");
switch(event) { uiItemBooleanO(layout, "Recalculate Inside", 0, "MESH_OT_normals_make_consistent", "inside", 1);
case 0: /* flip */
flip_editnormals();
break;
case 1: /* recalculate inside */
righthandfaces(2);
break;
case 2: /* recalculate outside */
righthandfaces(1);
break;
}
#endif
}
static uiBlock *view3d_edit_mesh_normalsmenu(bContext *C, ARegion *ar, void *arg_unused) uiItemS(layout);
{
uiBlock *block;
short yco = 20, menuwidth = 120;
block= uiBeginBlock(C, ar, "view3d_edit_mesh_normalsmenu", UI_EMBOSSP); uiItemO(layout, NULL, 0, "MESH_OT_flip_normals");
uiBlockSetButmFunc(block, do_view3d_edit_mesh_normalsmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Outside|Ctrl N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Inside|Ctrl Shift N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip|W, 0", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
return block;
} }
void do_view3d_edit_mirrormenu(bContext *C, void *arg, int event) void do_view3d_edit_mirrormenu(bContext *C, void *arg, int event)
@ -2822,49 +2566,18 @@ static uiBlock *view3d_edit_mirrormenu(bContext *C, ARegion *ar, void *arg_unuse
return block; return block;
} }
static void do_view3d_edit_mesh_showhidemenu(bContext *C, void *arg, int event) static void view3d_edit_mesh_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
{ {
#if 0 uiItemO(layout, NULL, 0, "MESH_OT_reveal");
uiItemO(layout, NULL, 0, "MESH_OT_hide");
switch(event) { uiItemBooleanO(layout, "Hide Unselected", 0, "MESH_OT_hide", "unselected", 1);
case 0: /* show hidden vertices */
reveal_mesh();
break;
case 1: /* hide selected vertices */
hide_mesh(0);
break;
case 2: /* hide deselected vertices */
hide_mesh(1);
break;
}
#endif
}
static uiBlock *view3d_edit_mesh_showhidemenu(bContext *C, ARegion *ar, void *arg_unused)
{
uiBlock *block;
short yco = 20, menuwidth = 120;
block= uiBeginBlock(C, ar, "view3d_edit_mesh_showhidemenu", UI_EMBOSSP);
uiBlockSetButmFunc(block, do_view3d_edit_mesh_showhidemenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Unselected|Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
return block;
} }
#ifndef DISABLE_PYTHON #ifndef DISABLE_PYTHON
#if 0
static void do_view3d_edit_mesh_scriptsmenu(bContext *C, void *arg, int event) static void do_view3d_edit_mesh_scriptsmenu(bContext *C, void *arg, int event)
{ {
#if 0
BPY_menu_do_python(PYMENU_MESH, event); BPY_menu_do_python(PYMENU_MESH, event);
#endif
} }
static uiBlock *view3d_edit_mesh_scriptsmenu(bContext *C, ARegion *ar, void *arg_unused) static uiBlock *view3d_edit_mesh_scriptsmenu(bContext *C, ARegion *ar, void *arg_unused)
@ -2886,154 +2599,94 @@ static uiBlock *view3d_edit_mesh_scriptsmenu(bContext *C, ARegion *ar, void *arg
return block; return block;
} }
#endif
#endif /* DISABLE_PYTHON */ #endif /* DISABLE_PYTHON */
#if 0
static void do_view3d_edit_meshmenu(bContext *C, void *arg, int event) static void do_view3d_edit_meshmenu(bContext *C, void *arg, int event)
{ {
#if 0
ToolSettings *ts= CTX_data_tool_settings(C);
Scene *scene= CTX_data_scene(C);
ScrArea *sa= CTX_wm_area(C); ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
switch(event) { switch(event) {
case 0: /* Undo Editing */
BIF_undo();
break;
case 1: /* Redo Editing */
BIF_redo();
break;
case 2: /* transform properties */ case 2: /* transform properties */
add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, 0); add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, 0);
break; break;
case 4: /* insert keyframe */ case 4: /* insert keyframe */
common_insertkey(); common_insertkey();
break; break;
case 5: /* Extrude */
extrude_mesh();
break;
case 6: /* duplicate */
duplicate_context_selected();
break;
case 7: /* make edge face */
addedgeface_mesh();
break;
case 8: /* delete */
delete_context_selected();
break;
case 9: /* Shrink/Fatten Along Normals */
initTransform(TFM_SHRINKFATTEN, CTX_NONE);
Transform();
break;
case 10: /* Shear */
initTransform(TFM_SHEAR, CTX_NONE);
Transform();
break;
case 11: /* Warp */
initTransform(TFM_WARP, CTX_NONE);
Transform();
break;
case 12: /* proportional edit (toggle) */
if(ts->proportional) ts->proportional= 0;
else ts->proportional= 1;
break;
case 13: /* automerge edit (toggle) */
if(ts->automerge) ts->automerge= 0;
else ts->automerge= 1;
break;
case 15:
uv_autocalc_tface();
break;
case 16: /* delete keyframe */ case 16: /* delete keyframe */
common_deletekey(); common_deletekey();
break; break;
} }
#endif
} }
#endif
static uiBlock *view3d_edit_meshmenu(bContext *C, ARegion *ar, void *arg_unused) static void view3d_edit_meshmenu(bContext *C, uiLayout *layout, void *arg_unused)
{ {
Scene *scene= CTX_data_scene(C);
ToolSettings *ts= CTX_data_tool_settings(C); ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit = CTX_data_edit_object(C); PointerRNA tsptr;
uiBlock *block;
short yco= 0, menuwidth=120; RNA_pointer_create(&scene->id, &RNA_ToolSettings, ts, &tsptr);
block= uiBeginBlock(C, ar, "view3d_edit_meshmenu", UI_EMBOSSP);
uiBlockSetButmFunc(block, do_view3d_edit_meshmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|Ctrl Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); uiItemO(layout, "Undo Editing", 0, "ED_OT_undo");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Ctrl Shift Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); uiItemO(layout, "Redo Editing", 0, "ED_OT_redo");
// XXX uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
#if 0
uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
#endif
uiItemS(layout);
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); #if 0
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, view3d_edit_mesh_verticesmenu, NULL, ICON_RIGHTARROW_THIN, "Vertices", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_mesh_edgesmenu, NULL, ICON_RIGHTARROW_THIN, "Edges", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Faces", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_mesh_normalsmenu, NULL, ICON_RIGHTARROW_THIN, "Normals", 0, yco-=20, 120, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
if(ts->proportional) {
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
} else {
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
}
uiDefIconTextBlockBut(block, view3d_edit_propfalloffmenu, NULL, ICON_RIGHTARROW_THIN, "Proportional Falloff", 0, yco-=20, 120, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
/* PITA but we should let users know that automerge cant work with multires :/ */
uiDefIconTextBut(block, BUTM, 1,
ts->automerge ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT,
((Mesh*)obedit->data)->mr ? "AutoMerge Editing (disabled by multires)" : "AutoMerge Editing",
0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, view3d_edit_mesh_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Vertices", 0, yco-=20, 120, 19, "");
#ifndef DISABLE_PYTHON
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, view3d_edit_mesh_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
#endif #endif
if(ar->alignment==RGN_ALIGN_TOP) { uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu);
uiBlockSetDirection(block, UI_DOWN);
}
else {
uiBlockSetDirection(block, UI_TOP);
uiBlockFlipOrder(block);
}
uiTextBoundsBlock(block, 50); uiItemS(layout);
return block;
#if 0
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
uiItemS(layout);
#endif
uiItemO(layout, NULL, 0, "UV_OT_mapping_menu");
uiItemS(layout);
uiItemO(layout, NULL, 0, "MESH_OT_extrude");
uiItemO(layout, NULL, 0, "MESH_OT_duplicate");
uiItemO(layout, "Delete...", 0, "MESH_OT_delete");
uiItemS(layout);
uiItemMenuF(layout, "Vertices", 0, view3d_edit_mesh_verticesmenu);
uiItemMenuF(layout, "Edges", 0, view3d_edit_mesh_edgesmenu);
uiItemMenuF(layout, "Faces", 0, view3d_edit_mesh_facesmenu);
uiItemMenuF(layout, "Normals", 0, view3d_edit_mesh_normalsmenu);
uiItemS(layout);
uiItemR(layout, NULL, 0, &tsptr, "automerge_editing", 0, 0, 0);
uiItemR(layout, NULL, 0, &tsptr, "proportional_editing", 0, 0, 0); // |O
uiItemMenuEnumR(layout, NULL, 0, &tsptr, "proportional_editing_falloff"); // |Shift O
uiItemS(layout);
uiItemMenuF(layout, "Show/Hide", 0, view3d_edit_mesh_showhidemenu);
#if 0
#ifndef DISABLE_PYTHON
uiItemS(layout);
uiDefIconTextBlockBut(block, view3d_edit_mesh_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
#endif
#endif
} }
static void view3d_edit_curve_controlpointsmenu(bContext *C, uiLayout *layout, void *arg_unused) static void view3d_edit_curve_controlpointsmenu(bContext *C, uiLayout *layout, void *arg_unused)
@ -3085,10 +2738,11 @@ static void view3d_edit_curvemenu(bContext *C, uiLayout *layout, void *arg_unuse
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
uiItemS(layout);
#endif #endif
uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu);
uiItemS(layout);
// XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
// common_insertkey(); // common_insertkey();
@ -3111,7 +2765,7 @@ static void view3d_edit_curvemenu(bContext *C, uiLayout *layout, void *arg_unuse
uiItemS(layout); uiItemS(layout);
uiItemR(layout, NULL, 0, &tsptr, "proportional_editing", 0, 0, 0); // |O uiItemR(layout, NULL, 0, &tsptr, "proportional_editing", 0, 0, 0); // |O
uiItemMenuEnumR(layout, NULL, 0, &tsptr, "proportional_editing_falloff"); uiItemMenuEnumR(layout, NULL, 0, &tsptr, "proportional_editing_falloff"); // |Shift O
uiItemS(layout); uiItemS(layout);
@ -3203,7 +2857,7 @@ static uiBlock *view3d_edit_metaballmenu(bContext *C, ARegion *ar, void *arg_unu
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, ""); uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, ""); // XXX uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@ -3280,9 +2934,12 @@ static void view3d_edit_latticemenu(bContext *C, uiLayout *layout, void *arg_unu
uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
#endif #endif
uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu);
uiItemS(layout);
// XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
// common_insertkey(); // common_insertkey();
// XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, ""); // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
@ -3504,7 +3161,7 @@ static uiBlock *view3d_edit_armaturemenu(bContext *C, ARegion *ar, void *arg_unu
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Bone Sketching|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, ""); uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Bone Sketching|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, "");
uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, ""); // XXX uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_armature_rollmenu, NULL, ICON_RIGHTARROW_THIN, "Bone Roll", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_armature_rollmenu, NULL, ICON_RIGHTARROW_THIN, "Bone Roll", 0, yco-=20, 120, 19, "");
if (arm->drawtype==ARM_ENVELOPE) if (arm->drawtype==ARM_ENVELOPE)
@ -4886,7 +4543,7 @@ static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *o
if (obedit) { if (obedit) {
if (ob && ob->type == OB_MESH) { if (ob && ob->type == OB_MESH) {
xmax= GetButStringLength("Mesh"); xmax= GetButStringLength("Mesh");
uiDefPulldownBut(block, view3d_edit_meshmenu, NULL, "Mesh", xco,yco, xmax-3, 20, ""); uiDefMenuBut(block, view3d_edit_meshmenu, NULL, "Mesh", xco,yco, xmax-3, 20, "");
xco+= xmax; xco+= xmax;
} else if (ob && ob->type == OB_CURVE) { } else if (ob && ob->type == OB_CURVE) {
xmax= GetButStringLength("Curve"); xmax= GetButStringLength("Curve");
@ -5270,36 +4927,3 @@ void view3d_header_buttons(const bContext *C, ARegion *ar)
uiDrawBlock(C, block); uiDrawBlock(C, block);
} }
/* edit face toolbox */
static int editmesh_face_toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
uiPopupMenu *pup;
uiLayout *layout;
pup= uiPupMenuBegin(C, "Edit Faces", 0);
layout= uiPupMenuLayout(pup);
uiItemO(layout, NULL, 0, "MESH_OT_fill");
uiItemO(layout, NULL, 0, "MESH_OT_beauty_fill");
uiItemO(layout, NULL, 0, "MESH_OT_quads_convert_to_tris");
uiItemO(layout, NULL, 0, "MESH_OT_tris_convert_to_quads");
uiItemO(layout, NULL, 0, "MESH_OT_edge_flip");
uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_solid");
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
void VIEW3D_OT_editmesh_face_toolbox(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Edit Faces";
ot->idname= "VIEW3D_OT_editmesh_face_toolbox";
/* api callbacks */
ot->invoke= editmesh_face_toolbox_invoke;
ot->poll= ED_operator_editmesh;
}

@ -80,7 +80,6 @@ void VIEW3D_OT_manipulator(struct wmOperatorType *ot);
void VIEW3D_OT_render_border(struct wmOperatorType *ot); void VIEW3D_OT_render_border(struct wmOperatorType *ot);
void VIEW3D_OT_zoom_border(struct wmOperatorType *ot); void VIEW3D_OT_zoom_border(struct wmOperatorType *ot);
void VIEW3D_OT_drawtype(struct wmOperatorType *ot); void VIEW3D_OT_drawtype(struct wmOperatorType *ot);
void VIEW3D_OT_editmesh_face_toolbox(struct wmOperatorType *ot);
void view3d_boxview_copy(ScrArea *sa, ARegion *ar); void view3d_boxview_copy(ScrArea *sa, ARegion *ar);

@ -83,7 +83,6 @@ void view3d_operatortypes(void)
WM_operatortype_append(VIEW3D_OT_select_lasso); WM_operatortype_append(VIEW3D_OT_select_lasso);
WM_operatortype_append(VIEW3D_OT_setcameratoview); WM_operatortype_append(VIEW3D_OT_setcameratoview);
WM_operatortype_append(VIEW3D_OT_drawtype); WM_operatortype_append(VIEW3D_OT_drawtype);
WM_operatortype_append(VIEW3D_OT_editmesh_face_toolbox);
WM_operatortype_append(VIEW3D_OT_localview); WM_operatortype_append(VIEW3D_OT_localview);
WM_operatortype_append(VIEW3D_OT_game_start); WM_operatortype_append(VIEW3D_OT_game_start);
WM_operatortype_append(VIEW3D_OT_layers); WM_operatortype_append(VIEW3D_OT_layers);

@ -1342,11 +1342,11 @@ static int select_inverse_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
void UV_OT_select_invert(wmOperatorType *ot) void UV_OT_select_inverse(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Select Invert"; ot->name= "Select Inverse";
ot->idname= "UV_OT_select_invert"; ot->idname= "UV_OT_select_inverse";
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* api callbacks */ /* api callbacks */
@ -3079,7 +3079,7 @@ void UV_OT_tile_set(wmOperatorType *ot)
void ED_operatortypes_uvedit(void) void ED_operatortypes_uvedit(void)
{ {
WM_operatortype_append(UV_OT_select_all_toggle); WM_operatortype_append(UV_OT_select_all_toggle);
WM_operatortype_append(UV_OT_select_invert); WM_operatortype_append(UV_OT_select_inverse);
WM_operatortype_append(UV_OT_select); WM_operatortype_append(UV_OT_select);
WM_operatortype_append(UV_OT_select_loop); WM_operatortype_append(UV_OT_select_loop);
WM_operatortype_append(UV_OT_select_linked); WM_operatortype_append(UV_OT_select_linked);
@ -3134,7 +3134,7 @@ void ED_keymap_uvedit(wmWindowManager *wm)
WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "UV_OT_unlink_selection", LKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "UV_OT_unlink_selection", LKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "UV_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "UV_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "UV_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "UV_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "UV_OT_select_pinned", PKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "UV_OT_select_pinned", PKEY, KM_PRESS, KM_SHIFT, 0);
/* uv operations */ /* uv operations */

@ -1337,7 +1337,7 @@ static int mapping_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
void UV_OT_mapping_menu(wmOperatorType *ot) void UV_OT_mapping_menu(wmOperatorType *ot)
{ {
/* identifiers */ /* identifiers */
ot->name= "Mapping Menu"; ot->name= "UV Mapping";
ot->idname= "UV_OT_mapping_menu"; ot->idname= "UV_OT_mapping_menu";
/* api callbacks */ /* api callbacks */

@ -199,6 +199,10 @@ void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_enum_items(prop, prop_mode_items); RNA_def_property_enum_items(prop, prop_mode_items);
RNA_def_property_ui_text(prop, "Proportional Editing Falloff", "Falloff type for proportional editing mode."); RNA_def_property_ui_text(prop, "Proportional Editing Falloff", "Falloff type for proportional editing mode.");
prop= RNA_def_property(srna, "automerge_editing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "automerge", 0);
RNA_def_property_ui_text(prop, "AutoMerge Editing", "Automatically merge vertices moved to the same location.");
prop= RNA_def_property(srna, "snap", PROP_BOOLEAN, PROP_NONE); prop= RNA_def_property(srna, "snap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP); RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP);
RNA_def_property_ui_text(prop, "Snap", "Snap while Ctrl is held during transform."); RNA_def_property_ui_text(prop, "Snap", "Snap while Ctrl is held during transform.");

@ -151,7 +151,6 @@ wchar_t* Py_GetPath(void)
/* must be called before Py_Initialize */ /* must be called before Py_Initialize */
void BPY_start_python_path(void) void BPY_start_python_path(void)
{ {
char py_path[FILE_MAXDIR + 11] = "";
char *py_path_bundle= BLI_gethome_folder("python"); char *py_path_bundle= BLI_gethome_folder("python");
if(py_path_bundle==NULL) if(py_path_bundle==NULL)
@ -162,15 +161,21 @@ void BPY_start_python_path(void)
#if (defined(WIN32) || defined(WIN64)) #if (defined(WIN32) || defined(WIN64))
#if defined(FREE_WINDOWS) #if defined(FREE_WINDOWS)
sprintf(py_path, "PYTHONPATH=%s", py_path_bundle); {
putenv(py_path); char py_path[FILE_MAXDIR + 11] = "";
sprintf(py_path, "PYTHONPATH=%s", py_path_bundle);
putenv(py_path);
}
#else #else
_putenv_s("PYTHONPATH", py_path_bundle); _putenv_s("PYTHONPATH", py_path_bundle);
#endif #endif
#else #else
#ifdef __sgi #ifdef __sgi
sprintf(py_path, "PYTHONPATH=%s", py_path_bundle); {
putenv(py_path); char py_path[FILE_MAXDIR + 11] = "";
sprintf(py_path, "PYTHONPATH=%s", py_path_bundle);
putenv(py_path);
}
#else #else
setenv("PYTHONPATH", py_path_bundle, 1); setenv("PYTHONPATH", py_path_bundle, 1);
#endif #endif
@ -484,7 +489,10 @@ void BPY_run_ui_scripts(bContext *C, int reload)
while((de = readdir(dir)) != NULL) { while((de = readdir(dir)) != NULL) {
/* We could stat the file but easier just to let python /* We could stat the file but easier just to let python
* import it and complain if theres a problem */ * import it and complain if theres a problem */
if(strstr(de->d_name, ".pyc"))
continue;
file_extension = strstr(de->d_name, ".py"); file_extension = strstr(de->d_name, ".py");
if(file_extension && *(file_extension + 3) == '\0') { if(file_extension && *(file_extension + 3) == '\0') {

@ -130,12 +130,12 @@ static PyObject *pyop_base_getattro( BPy_OperatorBase * self, PyObject *pyname )
PyObject *ret; PyObject *ret;
wmOperatorType *ot; wmOperatorType *ot;
if ((ot= WM_operatortype_find(name))) { if ((ret = PyObject_GenericGetAttr((PyObject *)self, pyname))) {
ret = PyCFunction_New( pyop_base_call_meth, pyname); /* set the name string as self, PyCFunction_New incref's self */
}
else if ((ret = PyObject_GenericGetAttr((PyObject *)self, pyname))) {
/* do nothing, this accounts for methoddef's add and remove */ /* do nothing, this accounts for methoddef's add and remove */
} }
else if ((ot= WM_operatortype_find(name))) {
ret = PyCFunction_New( pyop_base_call_meth, pyname); /* set the name string as self, PyCFunction_New incref's self */
}
else { else {
PyErr_Format( PyExc_AttributeError, "Operator \"%s\" not found", name); PyErr_Format( PyExc_AttributeError, "Operator \"%s\" not found", name);
ret= NULL; ret= NULL;

@ -352,9 +352,10 @@ PyObject *PYOP_wrap_add(PyObject *self, PyObject *py_class)
idname = _PyUnicode_AsString(item); idname = _PyUnicode_AsString(item);
/* remove if it already exists */ /* remove if it already exists */
if ((ot=WM_operatortype_find(idname))) { if ((ot=WM_operatortype_exists(idname))) {
if(ot->pyop_data) if(ot->pyop_data) {
Py_XDECREF((PyObject*)ot->pyop_data); Py_XDECREF((PyObject*)ot->pyop_data);
}
WM_operatortype_remove(idname); WM_operatortype_remove(idname);
} }
@ -402,7 +403,7 @@ PyObject *PYOP_wrap_remove(PyObject *self, PyObject *value)
return NULL; return NULL;
} }
if (!(ot= WM_operatortype_find(idname))) { if (!(ot= WM_operatortype_exists(idname))) {
PyErr_Format( PyExc_AttributeError, "Operator \"%s\" does not exists, cant remove", idname); PyErr_Format( PyExc_AttributeError, "Operator \"%s\" does not exists, cant remove", idname);
return NULL; return NULL;
} }

@ -132,6 +132,7 @@ void WM_operator_free (struct wmOperator *op);
void WM_operator_stack_clear(struct bContext *C); void WM_operator_stack_clear(struct bContext *C);
wmOperatorType *WM_operatortype_find(const char *idname); wmOperatorType *WM_operatortype_find(const char *idname);
wmOperatorType *WM_operatortype_exists(const char *idname);
wmOperatorType *WM_operatortype_first(void); wmOperatorType *WM_operatortype_first(void);
void WM_operatortype_append (void (*opfunc)(wmOperatorType*)); void WM_operatortype_append (void (*opfunc)(wmOperatorType*));
void WM_operatortype_append_ptr (void (*opfunc)(wmOperatorType*, void *), void *userdata); void WM_operatortype_append_ptr (void (*opfunc)(wmOperatorType*, void *), void *userdata);

@ -94,6 +94,17 @@ wmOperatorType *WM_operatortype_find(const char *idname)
return NULL; return NULL;
} }
wmOperatorType *WM_operatortype_exists(const char *idname)
{
wmOperatorType *ot;
for(ot= global_ops.first; ot; ot= ot->next) {
if(strncmp(ot->idname, idname, OP_MAX_TYPENAME)==0)
return ot;
}
return NULL;
}
wmOperatorType *WM_operatortype_first(void) wmOperatorType *WM_operatortype_first(void)
{ {
return global_ops.first; return global_ops.first;