diff options
Diffstat (limited to 'source/blender/editors')
27 files changed, 387 insertions, 558 deletions
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c index beecbc7abed..f1dfbd40c11 100644 --- a/source/blender/editors/animation/anim_filter.c +++ b/source/blender/editors/animation/anim_filter.c @@ -1914,6 +1914,10 @@ static size_t animdata_filter_ds_world (bAnimContext *ac, ListBase *anim_data, b /* textures for world */ if (!(ads->filterflag & ADS_FILTER_NOTEX)) items += animdata_filter_ds_textures(ac, &tmp_data, ads, (ID *)wo, filter_mode); + + /* nodes */ + if ((wo->nodetree) && !(ads->filterflag & ADS_FILTER_NONTREE)) + tmp_items += animdata_filter_ds_nodetree(ac, &tmp_data, ads, (ID *)wo, wo->nodetree, filter_mode); } END_ANIMFILTER_SUBCHANNELS; @@ -2009,12 +2013,12 @@ static size_t animdata_filter_dopesheet_scene (bAnimContext *ac, ListBase *anim_ } /* world */ - if ((wo && wo->adt) && !(ads->filterflag & ADS_FILTER_NOWOR)) { + if ((wo) && !(ads->filterflag & ADS_FILTER_NOWOR)) { tmp_items += animdata_filter_ds_world(ac, &tmp_data, ads, sce, wo, filter_mode); } /* nodetree */ - if ((ntree && ntree->adt) && !(ads->filterflag & ADS_FILTER_NONTREE)) { + if ((ntree) && !(ads->filterflag & ADS_FILTER_NONTREE)) { tmp_items += animdata_filter_ds_nodetree(ac, &tmp_data, ads, (ID *)sce, ntree, filter_mode); } diff --git a/source/blender/editors/animation/anim_ipo_utils.c b/source/blender/editors/animation/anim_ipo_utils.c index 8e36e02bbb4..8c4e0065a19 100644 --- a/source/blender/editors/animation/anim_ipo_utils.c +++ b/source/blender/editors/animation/anim_ipo_utils.c @@ -161,6 +161,11 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu) * use the struct's icon if it is set */ icon= RNA_struct_ui_icon(ptr.type); + + /* valid path - remove the invalid tag since we now know how to use it saving + * users manual effort to reenable using "Revive Disabled FCurves" [#29629] + */ + fcu->flag &= ~FCURVE_DISABLED; } else { /* invalid path */ diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 48f3f78b849..becc7e9b68f 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -5067,7 +5067,6 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op) { int action = RNA_enum_get(op->ptr, "action"); - Object *ob = NULL; Scene *scene= CTX_data_scene(C); int multipaint = scene->toolsettings->multipaint; @@ -5100,8 +5099,8 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, NULL); - if(multipaint) { - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + if (multipaint) { + Object *ob = ED_object_context(C); DAG_id_tag_update(&ob->id, OB_RECALC_DATA); } diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c index 064defb1aef..5cdb9c76396 100644 --- a/source/blender/editors/armature/poselib.c +++ b/source/blender/editors/armature/poselib.c @@ -77,6 +77,7 @@ #include "ED_keyframing.h" #include "ED_keyframes_edit.h" #include "ED_screen.h" +#include "ED_object.h" #include "armature_intern.h" @@ -171,7 +172,7 @@ static Object *get_poselib_object (bContext *C) sa = CTX_wm_area(C); if (sa && (sa->spacetype == SPACE_BUTS)) - return CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + return ED_object_context(C); else return object_pose_armature_get(CTX_data_active_object(C)); } diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c index 8d35122650f..832ee55997b 100644 --- a/source/blender/editors/armature/poseobject.c +++ b/source/blender/editors/armature/poseobject.c @@ -73,6 +73,7 @@ #include "ED_keyframing.h" #include "ED_mesh.h" #include "ED_screen.h" +#include "ED_object.h" #include "UI_interface.h" #include "UI_resources.h" @@ -207,7 +208,7 @@ static int pose_calculate_paths_exec (bContext *C, wmOperator *op) /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ob= ED_object_context(C); else ob= object_pose_armature_get(CTX_data_active_object(C)); @@ -283,7 +284,7 @@ static int pose_clear_paths_exec (bContext *C, wmOperator *UNUSED(op)) /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ob= ED_object_context(C); else ob= object_pose_armature_get(CTX_data_active_object(C)); @@ -1221,7 +1222,7 @@ static int pose_group_add_exec (bContext *C, wmOperator *UNUSED(op)) /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ob= ED_object_context(C); else ob= object_pose_armature_get(CTX_data_active_object(C)); @@ -1261,7 +1262,7 @@ static int pose_group_remove_exec (bContext *C, wmOperator *UNUSED(op)) /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ob= ED_object_context(C); else ob= object_pose_armature_get(CTX_data_active_object(C)); @@ -1309,7 +1310,7 @@ static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ob= ED_object_context(C); else ob= object_pose_armature_get(CTX_data_active_object(C)); @@ -1358,7 +1359,7 @@ static int pose_group_assign_exec (bContext *C, wmOperator *op) /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ob= ED_object_context(C); else ob= object_pose_armature_get(CTX_data_active_object(C)); @@ -1421,7 +1422,7 @@ static int pose_group_unassign_exec (bContext *C, wmOperator *UNUSED(op)) /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ob= ED_object_context(C); else ob= object_pose_armature_get(CTX_data_active_object(C)); @@ -1466,7 +1467,7 @@ void POSE_OT_group_unassign (wmOperatorType *ot) static int group_move_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob = ED_object_context(C); bPose *pose= (ob) ? ob->pose : NULL; bPoseChannel *pchan; bActionGroup *grp; @@ -1564,7 +1565,7 @@ static int compare_agroup(const void *sgrp_a_ptr, const void *sgrp_b_ptr) static int group_sort_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob = ED_object_context(C); bPose *pose= (ob) ? ob->pose : NULL; bPoseChannel *pchan; tSortActionGroup *agrp_array; @@ -1656,7 +1657,7 @@ static int pose_group_select_exec (bContext *C, wmOperator *UNUSED(op)) /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ob= ED_object_context(C); else ob= object_pose_armature_get(CTX_data_active_object(C)); @@ -1694,7 +1695,7 @@ static int pose_group_deselect_exec (bContext *C, wmOperator *UNUSED(op)) /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ob= ED_object_context(C); else ob= object_pose_armature_get(CTX_data_active_object(C)); diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 5c7d9249c5f..51d3c3f021b 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -56,7 +56,8 @@ struct wmOperator; struct wmOperatorType; /* object_edit.c */ -struct Object *ED_object_active_context(struct bContext *C); +struct Object *ED_object_context(struct bContext *C); /* context.object */ +struct Object *ED_object_active_context(struct bContext *C); /* context.object or context.active_object */ /* object_ops.c */ void ED_operatortypes_object(void); diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c index 6ebb67af67a..1f1228a9bc5 100644 --- a/source/blender/editors/interface/interface_draw.c +++ b/source/blender/editors/interface/interface_draw.c @@ -1465,21 +1465,16 @@ static ImBuf *scale_trackpreview_ibuf(ImBuf *ibuf, float zoomx, float zoomy) { ImBuf *scaleibuf; int x, y, w= ibuf->x*zoomx, h= ibuf->y*zoomy; - const float max_x= ibuf->x-1.0f; - const float max_y= ibuf->y-1.0f; const float scalex= 1.0f/zoomx; const float scaley= 1.0f/zoomy; scaleibuf= IMB_allocImBuf(w, h, 32, IB_rect); - for(y= 0; y<scaleibuf->y; y++) { - for (x= 0; x<scaleibuf->x; x++) { + for(y= 0; y<h; y++) { + for (x= 0; x<w; x++) { float src_x= scalex*x; float src_y= scaley*y; - CLAMP(src_x, 0, max_x); - CLAMP(src_y, 0, max_y); - bicubic_interpolation(ibuf, scaleibuf, src_x, src_y, x, y); } } @@ -1514,28 +1509,36 @@ void ui_draw_but_TRACKPREVIEW(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wc ok= 1; } else if(scopes->track_preview) { - int a, off_x, off_y; - float zoomx, zoomy; + /* additional margin around image */ + /* NOTE: should be kept in sync with value from BKE_movieclip_update_scopes */ + const int margin= 2; + float zoomx, zoomy, track_pos[2], off_x, off_y; + int a; ImBuf *drawibuf; glPushMatrix(); + track_pos[0]= scopes->track_pos[0]-margin; + track_pos[1]= scopes->track_pos[1]-margin; + /* draw content of pattern area */ glScissor(ar->winrct.xmin+rect.xmin, ar->winrct.ymin+rect.ymin, scissor[2], scissor[3]); - zoomx= (rect.xmax-rect.xmin) / (scopes->track_preview->x-2.0f); - zoomy= (rect.ymax-rect.ymin) / (scopes->track_preview->y-2.0f); + zoomx= (rect.xmax-rect.xmin) / (scopes->track_preview->x-2*margin); + zoomy= (rect.ymax-rect.ymin) / (scopes->track_preview->y-2*margin); - off_x= ((int)scopes->track_pos[0]-scopes->track_pos[0]-0.5f)*zoomx; - off_y= ((int)scopes->track_pos[1]-scopes->track_pos[1]-0.5f)*zoomy; + off_x= ((int)track_pos[0]-track_pos[0]+0.5)*zoomx; + off_y= ((int)track_pos[1]-track_pos[1]+0.5)*zoomy; drawibuf= scale_trackpreview_ibuf(scopes->track_preview, zoomx, zoomy); - glaDrawPixelsSafe(off_x+rect.xmin, off_y+rect.ymin, rect.xmax-rect.xmin+1.f-off_x, rect.ymax-rect.ymin+1.f-off_y, drawibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, drawibuf->rect); - + glaDrawPixelsSafe(off_x+rect.xmin-zoomx*(margin-0.5f), off_y+rect.ymin-zoomy*(margin-0.5f), + rect.xmax-rect.xmin+2+(int)(zoomx*(margin-0.5f)-off_x), + rect.ymax-rect.ymin+2+(int)(zoomy*(margin-0.5f)-off_y), + drawibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, drawibuf->rect); IMB_freeImBuf(drawibuf); /* draw cross for pizel position */ - glTranslatef(off_x+rect.xmin+scopes->track_pos[0]*zoomx, off_y+rect.ymin+scopes->track_pos[1]*zoomy, 0.f); + glTranslatef(off_x+rect.xmin+track_pos[0]*zoomx, off_y+rect.ymin+track_pos[1]*zoomy, 0.f); glScissor(ar->winrct.xmin + rect.xmin, ar->winrct.ymin+rect.ymin, rect.xmax-rect.xmin, rect.ymax-rect.ymin); for(a= 0; a< 2; a++) { diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 900cbbd5cbf..525b15ac7e3 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -114,6 +114,17 @@ typedef enum uiButtonJumpType { BUTTON_EDIT_JUMP_ALL } uiButtonJumpType; +typedef enum uiButtonDelimType { + BUTTON_DELIM_NONE, + BUTTON_DELIM_ALPHA, + BUTTON_DELIM_PUNCT, + BUTTON_DELIM_BRACE, + BUTTON_DELIM_OPERATOR, + BUTTON_DELIM_QUOTE, + BUTTON_DELIM_WHITESPACE, + BUTTON_DELIM_OTHER +} uiButtonDelimType; + typedef struct uiHandleButtonData { wmWindowManager *wm; wmWindow *window; @@ -1230,46 +1241,60 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data, /* ************* in-button text selection/editing ************* */ /* return 1 if char ch is special character, otherwise return 0 */ -static short test_special_char(char ch) +static uiButtonDelimType test_special_char(const char ch) { + if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { + return BUTTON_DELIM_ALPHA; + } + switch(ch) { - case '\\': - case '/': + case ',': + case '.': + return BUTTON_DELIM_PUNCT; + + case '{': + case '}': + case '[': + case ']': + case '(': + case ')': + return BUTTON_DELIM_BRACE; + + case '+': + case '-': + case '=': case '~': + case '%': + case '/': + case '<': + case '>': + case '^': + case '*': + case '&': + return BUTTON_DELIM_OPERATOR; + + case '\'': + case '\"': // " - an extra closing one for Aligorith's text editor + return BUTTON_DELIM_QUOTE; + + case ' ': + return BUTTON_DELIM_WHITESPACE; + + case '\\': case '!': case '@': case '#': case '$': - case '%': - case '^': - case '&': - case '*': - case '(': - case ')': - case '+': - case '=': - case '{': - case '}': - case '[': - case ']': case ':': case ';': - case '\'': - case '\"': // " - an extra closing one for Aligorith's text editor - case '<': - case '>': - case ',': - case '.': case '?': case '_': - case '-': - case ' ': - return 1; - break; + return BUTTON_DELIM_OTHER; + default: break; } - return 0; + return BUTTON_DELIM_NONE; } static int ui_textedit_step_next_utf8(const char *str, size_t maxlen, short *pos) @@ -1308,12 +1333,13 @@ static void ui_textedit_step_utf8(const char *str, size_t maxlen, if(direction) { /* right*/ if(jump != BUTTON_EDIT_JUMP_NONE) { + const uiButtonDelimType is_special= (*pos) < maxlen ? test_special_char(str[(*pos)]) : BUTTON_DELIM_NONE; /* jump between special characters (/,\,_,-, etc.), * look at function test_special_char() for complete * list of special character, ctr -> */ while((*pos) < maxlen) { if (ui_textedit_step_next_utf8(str, maxlen, pos)) { - if((jump != BUTTON_EDIT_JUMP_ALL) && test_special_char(str[(*pos)])) break; + if((jump != BUTTON_EDIT_JUMP_ALL) && (is_special != test_special_char(str[(*pos)]))) break; } else { break; /* unlikely but just incase */ @@ -1326,6 +1352,7 @@ static void ui_textedit_step_utf8(const char *str, size_t maxlen, } else { /* left */ if(jump != BUTTON_EDIT_JUMP_NONE) { + const uiButtonDelimType is_special= (*pos) > 1 ? test_special_char(str[(*pos) - 1]) : BUTTON_DELIM_NONE; /* left only: compensate for index/change in direction */ ui_textedit_step_prev_utf8(str, maxlen, pos); @@ -1334,7 +1361,7 @@ static void ui_textedit_step_utf8(const char *str, size_t maxlen, * list of special character, ctr -> */ while ((*pos) > 0) { if (ui_textedit_step_prev_utf8(str, maxlen, pos)) { - if((jump != BUTTON_EDIT_JUMP_ALL) && test_special_char(str[(*pos)])) break; + if((jump != BUTTON_EDIT_JUMP_ALL) && (is_special != test_special_char(str[(*pos)]))) break; } else { break; diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 0670692a084..8df43b92760 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -55,6 +55,7 @@ #include "BKE_texture.h" #include "BKE_report.h" #include "BKE_displist.h" +#include "BKE_scene.h" #include "ED_screen.h" #include "ED_object.h" @@ -2126,6 +2127,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe else if(RNA_struct_is_a(itemptr->type, &RNA_MaterialSlot)) { /* provision to draw active node name */ Material *ma, *manode; + Scene *scene= CTX_data_scene(C); Object *ob= (Object*)ptr->id.data; int index= (Material**)itemptr->data - ob->mat; @@ -2133,7 +2135,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe uiItemL(sub, name, icon); ma= give_current_material(ob, index+1); - if(ma) { + if (ma && !scene_use_new_shading_nodes(scene)){ manode= give_node_material(ma); if(manode) { char str[MAX_ID_NAME + 12]; diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index 5706da93fe9..a993e651b5f 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -248,20 +248,19 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event) view_pan_apply(op); } break; - + /* XXX - Mode switching isn't implemented. See comments in 36818. + * switch to zoom * case LEFTMOUSE: - /* switch to zoom */ if (event->val==KM_PRESS) { - /* calculate overall delta mouse-movement for redo */ + * calculate overall delta mouse-movement for redo * RNA_int_set(op->ptr, "deltax", (vpd->startx - vpd->lastx)); RNA_int_set(op->ptr, "deltay", (vpd->starty - vpd->lasty)); view_pan_exit(op); WM_cursor_restore(CTX_wm_window(C)); - WM_operator_name_call(C, "VIEW2D_OT_zoom", WM_OP_INVOKE_DEFAULT, NULL); return OPERATOR_FINISHED; - } + }*/ default: if (event->type == vpd->invoke_event || event->type==ESCKEY) { diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index 7253d426ca6..7762203c371 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -318,14 +318,14 @@ int ED_mesh_color_remove_named(bContext *C, Object *ob, Mesh *me, const char *na static int layers_poll(bContext *C) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); ID *data= (ob)? ob->data: NULL; return (ob && !ob->id.lib && ob->type==OB_MESH && data && !data->lib); } static int uv_texture_add_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Mesh *me= ob->data; if(!ED_mesh_uv_texture_add(C, me, NULL, TRUE)) @@ -435,7 +435,7 @@ void MESH_OT_drop_named_image(wmOperatorType *ot) static int uv_texture_remove_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Mesh *me= ob->data; if(!ED_mesh_uv_texture_remove(C, ob, me)) @@ -464,7 +464,7 @@ void MESH_OT_uv_texture_remove(wmOperatorType *ot) static int vertex_color_add_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene= CTX_data_scene(C); - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Mesh *me= ob->data; if(!ED_mesh_color_add(C, scene, ob, me, NULL, TRUE)) @@ -490,7 +490,7 @@ void MESH_OT_vertex_color_add(wmOperatorType *ot) static int vertex_color_remove_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Mesh *me= ob->data; if(!ED_mesh_color_remove(C, ob, me)) @@ -520,7 +520,7 @@ static int sticky_add_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene= CTX_data_scene(C); View3D *v3d= CTX_wm_view3d(C); - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Mesh *me= ob->data; /*if(me->msticky) @@ -551,7 +551,7 @@ void MESH_OT_sticky_add(wmOperatorType *ot) static int sticky_remove_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Mesh *me= ob->data; if(!me->msticky) diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index fa308624454..6a68a264a28 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -108,9 +108,12 @@ static void waitcursor(int UNUSED(val)) {} static int pupmenu(const char *UNUSED(msg)) {return 0;} /* port over here */ -static bContext *evil_C; static void error_libdata(void) {} +Object *ED_object_context(bContext *C) +{ + return CTX_data_pointer_get_type(C, "object", &RNA_Object).data; +} /* find the correct active object per context * note: context can be NULL when called from a enum with PROP_ENUM_NO_CONTEXT */ @@ -118,7 +121,7 @@ Object *ED_object_active_context(bContext *C) { Object *ob= NULL; if(C) { - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ob= ED_object_context(C); if (!ob) ob= CTX_data_active_object(C); } return ob; @@ -718,240 +721,6 @@ static void spot_interactive(Object *ob, int mode) } #endif -static void UNUSED_FUNCTION(special_editmenu)(Scene *scene, View3D *v3d) -{ -// XXX static short numcuts= 2; - Object *ob= OBACT; - Object *obedit= NULL; // XXX - int nr,ret=0; - - if(ob==NULL) return; - - if(obedit==NULL) { - - if(ob->mode & OB_MODE_POSE) { -// XXX pose_special_editmenu(); - } - else if(paint_facesel_test(ob)) { - Mesh *me= get_mesh(ob); - MTFace *tface; - MFace *mface; - int a; - - if(me==NULL || me->mtface==NULL) return; - - nr= pupmenu("Specials%t|Set Tex%x1| Shared%x2| Light%x3| Invisible%x4| Collision%x5| TwoSide%x6|Clr Tex%x7| Shared%x8| Light%x9| Invisible%x10| Collision%x11| TwoSide%x12"); - - tface= me->mtface; - mface= me->mface; - for(a=me->totface; a>0; a--, tface++, mface++) { - if(mface->flag & ME_FACE_SEL) { - switch(nr) { - case 1: - tface->mode |= TF_TEX; break; - case 2: - tface->mode |= TF_SHAREDCOL; break; - case 3: - tface->mode |= TF_LIGHT; break; - case 4: - tface->mode |= TF_INVISIBLE; break; - case 5: - tface->mode |= TF_DYNAMIC; break; - case 6: - tface->mode |= TF_TWOSIDE; break; - case 7: - tface->mode &= ~TF_TEX; - tface->tpage= NULL; - break; - case 8: - tface->mode &= ~TF_SHAREDCOL; break; - case 9: - tface->mode &= ~TF_LIGHT; break; - case 10: - tface->mode &= ~TF_INVISIBLE; break; - case 11: - tface->mode &= ~TF_DYNAMIC; break; - case 12: - tface->mode &= ~TF_TWOSIDE; break; - } - } - } - DAG_id_tag_update(&ob->id, OB_RECALC_DATA); - } - else if(ob->mode & OB_MODE_VERTEX_PAINT) { - Mesh *me= get_mesh(ob); - - if(me==NULL || (me->mcol==NULL && me->mtface==NULL) ) return; - - nr= pupmenu("Specials%t|Shared VertexCol%x1"); - if(nr==1) { - -// XXX do_shared_vertexcol(me); - - DAG_id_tag_update(&ob->id, OB_RECALC_DATA); - } - } - else if(ob->mode & OB_MODE_WEIGHT_PAINT) { - Object *par= modifiers_isDeformedByArmature(ob); - - if(par && (par->mode & OB_MODE_POSE)) { -// XXX nr= pupmenu("Specials%t|Apply Bone Envelopes to Vertex Groups %x1|Apply Bone Heat Weights to Vertex Groups %x2"); - -// XXX if(nr==1 || nr==2) -// XXX pose_adds_vgroups(ob, (nr == 2)); - } - } - else if(ob->mode & OB_MODE_PARTICLE_EDIT) { -#if 0 - // XXX - ParticleSystem *psys = PE_get_current(ob); - ParticleEditSettings *pset = PE_settings(); - - if(!psys) - return; - - if(pset->selectmode & SCE_SELECT_POINT) - nr= pupmenu("Specials%t|Rekey%x1|Subdivide%x2|Select First%x3|Select Last%x4|Remove Doubles%x5"); - else - nr= pupmenu("Specials%t|Rekey%x1|Remove Doubles%x5"); - - switch(nr) { - case 1: -// XXX if(button(&pset->totrekey, 2, 100, "Number of Keys:")==0) return; - waitcursor(1); - PE_rekey(); - break; - case 2: - PE_subdivide(); - break; - case 3: - PE_select_root(); - break; - case 4: - PE_select_tip(); - break; - case 5: - PE_remove_doubles(); - break; - } - - DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); - - if(nr>0) waitcursor(0); -#endif - } - else { - Base *base, *base_select= NULL; - - /* Get the active object mesh. */ - Mesh *me= get_mesh(ob); - - /* Booleans, if the active object is a mesh... */ - if (me && ob->id.lib==NULL) { - - /* Bring up a little menu with the boolean operation choices on. */ - nr= pupmenu("Boolean Tools%t|Intersect%x1|Union%x2|Difference%x3|Add Intersect Modifier%x4|Add Union Modifier%x5|Add Difference Modifier%x6"); - - if (nr > 0) { - /* user has made a choice of a menu element. - All of the boolean functions require 2 mesh objects - we search through the object list to find the other - selected item and make sure it is distinct and a mesh. */ - - for(base= FIRSTBASE; base; base= base->next) { - if(TESTBASELIB(v3d, base)) { - if(base->object != ob) base_select= base; - } - } - - if (base_select) { - if (get_mesh(base_select->object)) { - if(nr <= 3){ - waitcursor(1); -// XXX ret = NewBooleanMesh(BASACT,base_select,nr); - if (ret==0) { - error("An internal error occurred"); - } else if(ret==-1) { - error("Selected meshes must have faces to perform boolean operations"); - } else if (ret==-2) { - error("Both meshes must be a closed mesh"); - } - waitcursor(0); - } else { - BooleanModifierData *bmd = NULL; - bmd = (BooleanModifierData *)modifier_new(eModifierType_Boolean); - BLI_addtail(&ob->modifiers, bmd); - modifier_unique_name(&ob->modifiers, (ModifierData*)bmd); - bmd->object = base_select->object; - bmd->modifier.mode |= eModifierMode_Realtime; - switch(nr){ - case 4: bmd->operation = eBooleanModifierOp_Intersect; break; - case 5: bmd->operation = eBooleanModifierOp_Union; break; - case 6: bmd->operation = eBooleanModifierOp_Difference; break; - } -// XXX do_common_editbuts(B_CHANGEDEP); - } - } else { - error("Please select 2 meshes"); - } - } else { - error("Please select 2 meshes"); - } - } - - } - else if (ob->type == OB_FONT) { - /* removed until this gets a decent implementation (ton) */ -/* nr= pupmenu("Split %t|Characters%x1"); - if (nr > 0) { - switch(nr) { - case 1: split_font(); - } - } -*/ - } - } - } - else if(obedit->type==OB_MESH) { - } - else if(ELEM(obedit->type, OB_CURVE, OB_SURF)) { - } - 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"); -// if(nr==1) -// XXX subdivide_armature(1); - if(nr==2) { -// XXX if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return; - waitcursor(1); -// XXX subdivide_armature(numcuts); - } -// else if(nr==3) -// XXX armature_flip_names(); - else if(ELEM3(nr, 4, 5, 6)) { -// XXX armature_autoside_names(nr-4); - } -// else if(nr == 7) -// XXX switch_direction_armature(); - } - else if(obedit->type==OB_LATTICE) { - Lattice *lt= obedit->data; - static float weight= 1.0f; - { // XXX -// XXX if(fbutton(&weight, 0.0f, 1.0f, 10, 10, "Set Weight")) { - Lattice *editlt= lt->editlatt->latt; - int a= editlt->pntsu*editlt->pntsv*editlt->pntsw; - BPoint *bp= editlt->def; - - while(a--) { - if(bp->f1 & SELECT) - bp->weight= weight; - bp++; - } - } - } - -} - static void copymenu_properties(Scene *scene, View3D *v3d, Object *ob) { //XXX no longer used - to be removed - replaced by game_properties_copy_exec @@ -1674,102 +1443,6 @@ static void UNUSED_FUNCTION(image_aspect)(Scene *scene, View3D *v3d) } -static int vergbaseco(const void *a1, const void *a2) -{ - Base **x1, **x2; - - x1= (Base **) a1; - x2= (Base **) a2; - - if( (*x1)->sy > (*x2)->sy ) return 1; - else if( (*x1)->sy < (*x2)->sy) return -1; - else if( (*x1)->sx > (*x2)->sx ) return 1; - else if( (*x1)->sx < (*x2)->sx ) return -1; - - return 0; -} - - -static void UNUSED_FUNCTION(auto_timeoffs)(Scene *scene, View3D *v3d) -{ - Base *base, **basesort, **bs; - float start, delta; - int tot=0, a; - short offset=25; - - if(BASACT==NULL || v3d==NULL) return; -// XXX if(button(&offset, 0, 1000,"Total time")==0) return; - - /* make array of all bases, xco yco (screen) */ - for(base= FIRSTBASE; base; base= base->next) { - if(TESTBASELIB(v3d, base)) { - tot++; - } - } - - delta= (float)offset/(float)tot; - start= OBACT->sf; - - bs= basesort= MEM_mallocN(sizeof(void *)*tot,"autotimeoffs"); - for(base= FIRSTBASE; base; base= base->next) { - if(TESTBASELIB(v3d, base)) { - *bs= base; - bs++; - } - } - qsort(basesort, tot, sizeof(void *), vergbaseco); - - bs= basesort; - for(a=0; a<tot; a++) { - - (*bs)->object->sf= start; - start+= delta; - - bs++; - } - MEM_freeN(basesort); - -} - -static void UNUSED_FUNCTION(ofs_timeoffs)(Scene *scene, View3D *v3d) -{ - float offset=0.0f; - - if(BASACT==NULL || v3d==NULL) return; - -// XXX if(fbutton(&offset, -10000.0f, 10000.0f, 10, 10, "Offset")==0) return; - - /* make array of all bases, xco yco (screen) */ - CTX_DATA_BEGIN(evil_C, Object*, ob, selected_editable_objects) { - ob->sf += offset; - if (ob->sf < -MAXFRAMEF) ob->sf = -MAXFRAMEF; - else if (ob->sf > MAXFRAMEF) ob->sf = MAXFRAMEF; - } - CTX_DATA_END; - -} - - -static void UNUSED_FUNCTION(rand_timeoffs)(Scene *scene, View3D *v3d) -{ - Base *base; - float rand_ofs=0.0f; - - if(BASACT==NULL || v3d==NULL) return; - -// XXX if(fbutton(&rand_ofs, 0.0f, 10000.0f, 10, 10, "Randomize")==0) return; - - rand_ofs *= 2; - - for(base= FIRSTBASE; base; base= base->next) { - if(TESTBASELIB(v3d, base)) { - base->object->sf += ((float)BLI_drand()-0.5f) * rand_ofs; - if (base->object->sf < -MAXFRAMEF) base->object->sf = -MAXFRAMEF; - else if (base->object->sf > MAXFRAMEF) base->object->sf = MAXFRAMEF; - } - } - -} static EnumPropertyItem *object_mode_set_itemsf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { @@ -1932,16 +1605,21 @@ void ED_object_toggle_modes(bContext *C, int mode) /************************ Game Properties ***********************/ -static int game_property_new(bContext *C, wmOperator *UNUSED(op)) +static int game_property_new(bContext *C, wmOperator *op) { Object *ob= CTX_data_active_object(C); bProperty *prop; + char name[32]; + int type= RNA_enum_get(op->ptr, "type"); - if(!ob) - return OPERATOR_CANCELLED; - - prop= new_property(PROP_FLOAT); + prop= new_property(type); BLI_addtail(&ob->prop, prop); + + RNA_string_get(op->ptr, "name", name); + if (name[0] != '\0') { + BLI_strncpy(prop->name, name, sizeof(prop->name)); + } + unique_property(NULL, prop, 0); // make_unique_prop_names(prop->name); WM_event_add_notifier(C, NC_LOGIC, NULL); @@ -1962,6 +1640,9 @@ void OBJECT_OT_game_property_new(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_enum(ot->srna, "type", gameproperty_type_items, 2, "Type", "Type of game property to add"); + RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the game property to add"); } static int game_property_remove(bContext *C, wmOperator *op) diff --git a/source/blender/editors/object/object_group.c b/source/blender/editors/object/object_group.c index bf0439b7044..74cf174d7b4 100644 --- a/source/blender/editors/object/object_group.c +++ b/source/blender/editors/object/object_group.c @@ -46,6 +46,7 @@ #include "BKE_report.h" #include "ED_screen.h" +#include "ED_object.h" #include "WM_api.h" #include "WM_types.h" @@ -230,7 +231,7 @@ void GROUP_OT_create(wmOperatorType *ot) static int group_add_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene= CTX_data_scene(C); - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Group *group; if(ob == NULL) @@ -261,7 +262,7 @@ void OBJECT_OT_group_add(wmOperatorType *ot) static int group_link_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group")); if(ELEM(NULL, ob, group)) @@ -299,7 +300,7 @@ void OBJECT_OT_group_link(wmOperatorType *ot) static int group_remove_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene= CTX_data_scene(C); - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Group *group= CTX_data_pointer_get_type(C, "group", &RNA_Group).data; if(!ob || !group) diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c index 28f9c88f950..956ec868104 100644 --- a/source/blender/editors/object/object_shapekey.c +++ b/source/blender/editors/object/object_shapekey.c @@ -61,6 +61,7 @@ #include "BLO_sys_types.h" // for intptr_t support +#include "ED_object.h" #include "ED_mesh.h" #include "RNA_access.h" @@ -269,14 +270,14 @@ static int object_shape_key_mirror(bContext *C, Object *ob) static int shape_key_mode_poll(bContext *C) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); ID *data= (ob)? ob->data: NULL; return (ob && !ob->id.lib && data && !data->lib && ob->mode != OB_MODE_EDIT); } static int shape_key_poll(bContext *C) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); ID *data= (ob)? ob->data: NULL; return (ob && !ob->id.lib && data && !data->lib); } @@ -284,7 +285,7 @@ static int shape_key_poll(bContext *C) static int shape_key_add_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); int from_mix = RNA_boolean_get(op->ptr, "from_mix"); ED_object_shape_key_add(C, scene, ob, from_mix); @@ -312,7 +313,7 @@ void OBJECT_OT_shape_key_add(wmOperatorType *ot) static int shape_key_remove_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); if(!ED_object_shape_key_remove(C, ob)) return OPERATOR_CANCELLED; @@ -337,7 +338,7 @@ void OBJECT_OT_shape_key_remove(wmOperatorType *ot) static int shape_key_clear_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Key *key= ob_get_key(ob); KeyBlock *kb= ob_get_keyblock(ob); @@ -370,7 +371,7 @@ void OBJECT_OT_shape_key_clear(wmOperatorType *ot) static int shape_key_mirror_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); if(!object_shape_key_mirror(C, ob)) return OPERATOR_CANCELLED; @@ -395,7 +396,7 @@ void OBJECT_OT_shape_key_mirror(wmOperatorType *ot) static int shape_key_move_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); int type= RNA_enum_get(op->ptr, "type"); Key *key= ob_get_key(ob); diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index bfb5d166e6f..dfe0b94605d 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -67,6 +67,7 @@ #include "WM_api.h" #include "WM_types.h" +#include "ED_object.h" #include "ED_mesh.h" #include "UI_resources.h" @@ -582,23 +583,47 @@ static void vgroup_select_verts(Object *ob, int select) if(ob->type == OB_MESH) { Mesh *me= ob->data; - EditMesh *em = BKE_mesh_get_editmesh(me); - EditVert *eve; - for (eve=em->verts.first; eve; eve=eve->next) { - if (!eve->h) { - dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); - if (defvert_find_index(dv, def_nr)) { - if (select) eve->f |= SELECT; - else eve->f &= ~SELECT; + if (me->edit_mesh) { + EditMesh *em = BKE_mesh_get_editmesh(me); + EditVert *eve; + + for (eve=em->verts.first; eve; eve=eve->next) { + if (!eve->h) { + dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + if (defvert_find_index(dv, def_nr)) { + if (select) eve->f |= SELECT; + else eve->f &= ~SELECT; + } } } + /* this has to be called, because this function operates on vertices only */ + if(select) EM_select_flush(em); // vertices to edges/faces + else EM_deselect_flush(em); + + BKE_mesh_end_editmesh(me, em); } - /* this has to be called, because this function operates on vertices only */ - if(select) EM_select_flush(em); // vertices to edges/faces - else EM_deselect_flush(em); + else { + if (me->dvert) { + MVert *mv; + MDeformVert *dv; + int i; + + mv = me->mvert; + dv = me->dvert; + + for (i=0; i<me->totvert; i++, mv++, dv++) { + if (!(mv->flag & ME_HIDE)) { + if (defvert_find_index(dv, def_nr)) { + if (select) mv->flag |= SELECT; + else mv->flag &= ~SELECT; + } + } + } - BKE_mesh_end_editmesh(me, em); + paintvert_flush_flags(ob); + } + } } else if(ob->type == OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); @@ -1740,23 +1765,47 @@ static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg) /* removes from active defgroup, if allverts==0 only selected vertices */ static void vgroup_active_remove_verts(Object *ob, const int allverts, bDeformGroup *dg) { - EditVert *eve; MDeformVert *dv; const int def_nr= BLI_findindex(&ob->defbase, dg); if(ob->type == OB_MESH) { Mesh *me= ob->data; - EditMesh *em = BKE_mesh_get_editmesh(me); - for(eve=em->verts.first; eve; eve=eve->next){ - dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + if (me->edit_mesh) { + EditVert *eve; + EditMesh *em = BKE_mesh_get_editmesh(me); - if(dv && dv->dw && (allverts || (eve->f & SELECT))){ - MDeformWeight *dw = defvert_find_index(dv, def_nr); - defvert_remove_group(dv, dw); /* dw can be NULL */ + for (eve=em->verts.first; eve; eve=eve->next) { + dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + + if (dv && dv->dw && (allverts || (eve->f & SELECT))) { + MDeformWeight *dw = defvert_find_index(dv, def_nr); + defvert_remove_group(dv, dw); /* dw can be NULL */ + } + } + BKE_mesh_end_editmesh(me, em); + } + else { + MVert *mv; + MDeformVert *dv; + int i; + + if (!me->dvert) { + ED_vgroup_data_create(&me->id); + } + + mv = me->mvert; + dv = me->dvert; + + for (i=0; i<me->totvert; i++, mv++, dv++) { + if (mv->flag & SELECT) { + if (dv->dw && (allverts || (mv->flag & SELECT))) { + MDeformWeight *dw = defvert_find_index(dv, def_nr); + defvert_remove_group(dv, dw); /* dw can be NULL */ + } + } } } - BKE_mesh_end_editmesh(me, em); } else if(ob->type == OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); @@ -1861,6 +1910,18 @@ static int vgroup_object_in_edit_mode(Object *ob) return 0; } +static int vgroup_object_in_wpaint_vert_select(Object *ob) +{ + if (ob->type == OB_MESH) { + Mesh *me = ob->data; + return ( (ob->mode & OB_MODE_WEIGHT_PAINT) && + (me->edit_mesh == NULL) && + (ME_EDIT_PAINT_SEL_MODE(me) == SCE_SELECT_VERTEX) ); + } + + return 0; +} + static void vgroup_delete(Object *ob) { bDeformGroup *dg = BLI_findlink(&ob->defbase, ob->actdef-1); @@ -1907,24 +1968,48 @@ static void vgroup_assign_verts(Object *ob, const float weight) if(ob->type == OB_MESH) { Mesh *me= ob->data; - EditMesh *em = BKE_mesh_get_editmesh(me); - EditVert *eve; + if (me->edit_mesh) { + EditMesh *em = BKE_mesh_get_editmesh(me); + EditVert *eve; - if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) - EM_add_data_layer(em, &em->vdata, CD_MDEFORMVERT, NULL); + if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) + EM_add_data_layer(em, &em->vdata, CD_MDEFORMVERT, NULL); - /* Go through the list of editverts and assign them */ - for (eve=em->verts.first; eve; eve=eve->next) { - if (eve->f & SELECT) { - MDeformWeight *dw; - dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); /* can be NULL */ - dw= defvert_verify_index(dv, def_nr); - if (dw) { - dw->weight= weight; + /* Go through the list of editverts and assign them */ + for (eve=em->verts.first; eve; eve=eve->next) { + if (eve->f & SELECT) { + MDeformWeight *dw; + dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); /* can be NULL */ + dw= defvert_verify_index(dv, def_nr); + if (dw) { + dw->weight= weight; + } + } + } + BKE_mesh_end_editmesh(me, em); + } + else { + MVert *mv; + MDeformVert *dv; + int i; + + if (!me->dvert) { + ED_vgroup_data_create(&me->id); + } + + mv = me->mvert; + dv = me->dvert; + + for (i=0; i<me->totvert; i++, mv++, dv++) { + if (mv->flag & SELECT) { + MDeformWeight *dw; + dw= defvert_verify_index(dv, def_nr); + if (dw) { + dw->weight= weight; + } } } } - BKE_mesh_end_editmesh(me, em); } else if(ob->type == OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); @@ -1968,14 +2053,14 @@ static void vgroup_remove_verts(Object *ob, int allverts) static int vertex_group_poll(bContext *C) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); ID *data= (ob)? ob->data: NULL; return (ob && !ob->id.lib && OB_TYPE_SUPPORT_VGROUP(ob->type) && data && !data->lib); } static int vertex_group_poll_edit(bContext *C) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); ID *data= (ob)? ob->data: NULL; if(!(ob && !ob->id.lib && data && !data->lib)) @@ -1984,9 +2069,22 @@ static int vertex_group_poll_edit(bContext *C) return vgroup_object_in_edit_mode(ob); } +/* editmode _or_ weight paint vertex sel */ +static int vertex_group_poll_edit_or_wpaint_vert_select(bContext *C) +{ + Object *ob= ED_object_context(C); + ID *data= (ob)? ob->data: NULL; + + if(!(ob && !ob->id.lib && data && !data->lib)) + return 0; + + return ( vgroup_object_in_edit_mode(ob) || + vgroup_object_in_wpaint_vert_select(ob) ); +} + static int vertex_group_add_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); ED_vgroup_add(ob); DAG_id_tag_update(&ob->id, OB_RECALC_DATA); @@ -2012,7 +2110,7 @@ void OBJECT_OT_vertex_group_add(wmOperatorType *ot) static int vertex_group_remove_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); if(RNA_boolean_get(op->ptr, "all")) vgroup_delete_all(ob); @@ -2049,7 +2147,7 @@ void OBJECT_OT_vertex_group_remove(wmOperatorType *ot) static int vertex_group_assign_exec(bContext *C, wmOperator *op) { ToolSettings *ts= CTX_data_tool_settings(C); - Object *ob= CTX_data_edit_object(C); + Object *ob= ED_object_context(C); if(RNA_boolean_get(op->ptr, "new")) ED_vgroup_add(ob); @@ -2068,7 +2166,7 @@ void OBJECT_OT_vertex_group_assign(wmOperatorType *ot) ot->idname= "OBJECT_OT_vertex_group_assign"; /* api callbacks */ - ot->poll= vertex_group_poll_edit; + ot->poll= vertex_group_poll_edit_or_wpaint_vert_select; ot->exec= vertex_group_assign_exec; /* flags */ @@ -2083,7 +2181,7 @@ void OBJECT_OT_vertex_group_assign(wmOperatorType *ot) static int vertex_group_remove_from_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_edit_object(C); + Object *ob= ED_object_context(C); if(RNA_boolean_get(op->ptr, "all")) vgroup_remove_verts(ob, 0); @@ -2110,7 +2208,7 @@ void OBJECT_OT_vertex_group_remove_from(wmOperatorType *ot) ot->idname= "OBJECT_OT_vertex_group_remove_from"; /* api callbacks */ - ot->poll= vertex_group_poll_edit; + ot->poll= vertex_group_poll_edit_or_wpaint_vert_select; ot->exec= vertex_group_remove_from_exec; /* flags */ @@ -2125,7 +2223,7 @@ void OBJECT_OT_vertex_group_remove_from(wmOperatorType *ot) static int vertex_group_select_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_edit_object(C); + Object *ob= ED_object_context(C); if(!ob || ob->id.lib) return OPERATOR_CANCELLED; @@ -2143,7 +2241,7 @@ void OBJECT_OT_vertex_group_select(wmOperatorType *ot) ot->idname= "OBJECT_OT_vertex_group_select"; /* api callbacks */ - ot->poll= vertex_group_poll_edit; + ot->poll= vertex_group_poll_edit_or_wpaint_vert_select; ot->exec= vertex_group_select_exec; /* flags */ @@ -2152,7 +2250,7 @@ void OBJECT_OT_vertex_group_select(wmOperatorType *ot) static int vertex_group_deselect_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_edit_object(C); + Object *ob= ED_object_context(C); vgroup_select_verts(ob, 0); WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data); @@ -2167,7 +2265,7 @@ void OBJECT_OT_vertex_group_deselect(wmOperatorType *ot) ot->idname= "OBJECT_OT_vertex_group_deselect"; /* api callbacks */ - ot->poll= vertex_group_poll_edit; + ot->poll= vertex_group_poll_edit_or_wpaint_vert_select; ot->exec= vertex_group_deselect_exec; /* flags */ @@ -2176,7 +2274,7 @@ void OBJECT_OT_vertex_group_deselect(wmOperatorType *ot) static int vertex_group_copy_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); vgroup_duplicate(ob); DAG_id_tag_update(&ob->id, OB_RECALC_DATA); @@ -2202,7 +2300,7 @@ void OBJECT_OT_vertex_group_copy(wmOperatorType *ot) static int vertex_group_levels_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); float offset= RNA_float_get(op->ptr,"offset"); float gain= RNA_float_get(op->ptr,"gain"); @@ -2235,7 +2333,7 @@ void OBJECT_OT_vertex_group_levels(wmOperatorType *ot) static int vertex_group_normalize_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); vgroup_normalize(ob); @@ -2262,7 +2360,7 @@ void OBJECT_OT_vertex_group_normalize(wmOperatorType *ot) static int vertex_group_normalize_all_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); int lock_active= RNA_boolean_get(op->ptr,"lock_active"); vgroup_normalize_all(ob, lock_active); @@ -2372,7 +2470,7 @@ void OBJECT_OT_vertex_group_lock(wmOperatorType *ot) static int vertex_group_invert_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); int auto_assign= RNA_boolean_get(op->ptr,"auto_assign"); int auto_remove= RNA_boolean_get(op->ptr,"auto_remove"); @@ -2406,7 +2504,7 @@ void OBJECT_OT_vertex_group_invert(wmOperatorType *ot) static int vertex_group_blend_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); vgroup_blend(ob); @@ -2435,7 +2533,7 @@ void OBJECT_OT_vertex_group_blend(wmOperatorType *ot) static int vertex_group_clean_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); float limit= RNA_float_get(op->ptr,"limit"); int all_groups= RNA_boolean_get(op->ptr,"all_groups"); @@ -2474,7 +2572,7 @@ void OBJECT_OT_vertex_group_clean(wmOperatorType *ot) static int vertex_group_mirror_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); ED_vgroup_mirror(ob, RNA_boolean_get(op->ptr,"mirror_weights"), @@ -2513,7 +2611,7 @@ void OBJECT_OT_vertex_group_mirror(wmOperatorType *ot) static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene= CTX_data_scene(C); - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Base *base; int retval= OPERATOR_CANCELLED; @@ -2553,7 +2651,7 @@ void OBJECT_OT_vertex_group_copy_to_linked(wmOperatorType *ot) static int vertex_group_copy_to_selected_exec(bContext *C, wmOperator *op) { - Object *obact= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *obact= ED_object_context(C); int change= 0; int fail= 0; @@ -2596,7 +2694,7 @@ static EnumPropertyItem vgroup_items[]= { static int set_active_group_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); int nr= RNA_enum_get(op->ptr, "group"); BLI_assert(nr+1 >= 0); @@ -2610,7 +2708,7 @@ static int set_active_group_exec(bContext *C, wmOperator *op) static EnumPropertyItem *vgroup_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); EnumPropertyItem tmp = {0, "", 0, "", ""}; EnumPropertyItem *item= NULL; bDeformGroup *def; @@ -2751,7 +2849,7 @@ static int vgroup_sort(void *def_a_ptr, void *def_b_ptr) static int vertex_group_sort_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); char *name_array; int ret; @@ -2790,7 +2888,7 @@ void OBJECT_OT_vertex_group_sort(wmOperatorType *ot) static int vgroup_move_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); bDeformGroup *def; char *name_array; int dir= RNA_enum_get(op->ptr, "direction"), ret; diff --git a/source/blender/editors/physics/dynamicpaint_ops.c b/source/blender/editors/physics/dynamicpaint_ops.c index 6e25307b786..cdcaae91070 100644 --- a/source/blender/editors/physics/dynamicpaint_ops.c +++ b/source/blender/editors/physics/dynamicpaint_ops.c @@ -42,6 +42,7 @@ #include "ED_mesh.h" #include "ED_screen.h" +#include "ED_object.h" #include "RNA_access.h" #include "RNA_define.h" @@ -58,7 +59,7 @@ static int surface_slot_add_exec(bContext *C, wmOperator *UNUSED(op)) { DynamicPaintModifierData *pmd = NULL; - Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *cObject = ED_object_context(C); DynamicPaintCanvasSettings *canvas; DynamicPaintSurface *surface; @@ -100,7 +101,7 @@ void DPAINT_OT_surface_slot_add(wmOperatorType *ot) static int surface_slot_remove_exec(bContext *C, wmOperator *UNUSED(op)) { DynamicPaintModifierData *pmd = NULL; - Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *cObject = ED_object_context(C); DynamicPaintCanvasSettings *canvas; DynamicPaintSurface *surface; int id=0; @@ -148,7 +149,7 @@ void DPAINT_OT_surface_slot_remove(wmOperatorType *ot) static int type_toggle_exec(bContext *C, wmOperator *op) { - Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *cObject = ED_object_context(C); Scene *scene = CTX_data_scene(C); DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint); int type= RNA_enum_get(op->ptr, "type"); @@ -199,7 +200,7 @@ void DPAINT_OT_type_toggle(wmOperatorType *ot) static int output_toggle_exec(bContext *C, wmOperator *op) { - Object *ob = CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob = ED_object_context(C); Scene *scene = CTX_data_scene(C); DynamicPaintSurface *surface; DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint); @@ -344,7 +345,7 @@ static int dynamicPaint_initBake(struct bContext *C, struct wmOperator *op) { DynamicPaintModifierData *pmd = NULL; DynamicPaintCanvasSettings *canvas; - Object *ob = CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob = ED_object_context(C); int status = 0; double timer = PIL_check_seconds_timer(); char result_str[80]; diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c index bbff2239a38..b26661da4a2 100644 --- a/source/blender/editors/physics/particle_object.c +++ b/source/blender/editors/physics/particle_object.c @@ -59,6 +59,7 @@ #include "ED_particle.h" #include "ED_screen.h" +#include "ED_object.h" #include "physics_intern.h" @@ -66,7 +67,7 @@ static int particle_system_add_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Scene *scene = CTX_data_scene(C); if(!scene || !ob) @@ -97,7 +98,7 @@ void OBJECT_OT_particle_system_add(wmOperatorType *ot) static int particle_system_remove_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Scene *scene = CTX_data_scene(C); int mode_orig = ob->mode; if(!scene || !ob) @@ -581,7 +582,7 @@ static void disconnect_hair(Scene *scene, Object *ob, ParticleSystem *psys) static int disconnect_hair_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem); ParticleSystem *psys= NULL; int all = RNA_boolean_get(op->ptr, "all"); @@ -719,7 +720,7 @@ static void connect_hair(Scene *scene, Object *ob, ParticleSystem *psys) static int connect_hair_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem); ParticleSystem *psys= NULL; int all = RNA_boolean_get(op->ptr, "all"); diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c index 96018de130b..937f43dfadb 100644 --- a/source/blender/editors/render/render_shading.c +++ b/source/blender/editors/render/render_shading.c @@ -77,6 +77,7 @@ #include "WM_api.h" #include "WM_types.h" +#include "ED_object.h" #include "ED_curve.h" #include "ED_mesh.h" #include "ED_node.h" @@ -95,7 +96,7 @@ static int material_slot_add_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); if(!ob) return OPERATOR_CANCELLED; @@ -124,7 +125,7 @@ void OBJECT_OT_material_slot_add(wmOperatorType *ot) static int material_slot_remove_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); if(!ob) return OPERATOR_CANCELLED; @@ -160,7 +161,7 @@ void OBJECT_OT_material_slot_remove(wmOperatorType *ot) static int material_slot_assign_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); if(!ob) return OPERATOR_CANCELLED; @@ -220,7 +221,7 @@ void OBJECT_OT_material_slot_assign(wmOperatorType *ot) static int material_slot_de_select(bContext *C, int select) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); if(!ob) return OPERATOR_CANCELLED; @@ -326,7 +327,7 @@ void OBJECT_OT_material_slot_deselect(wmOperatorType *ot) static int material_slot_copy_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Object *ob= ED_object_context(C); Material ***matar; if(!ob || !(matar= give_matarar(ob))) diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index ffdfea7fde5..98f85009140 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -3309,7 +3309,6 @@ static void SCREEN_OT_delete(wmOperatorType *ot) static int scene_new_exec(bContext *C, wmOperator *op) { Scene *newscene, *scene= CTX_data_scene(C); - bScreen *screen= CTX_wm_screen(C); Main *bmain= CTX_data_main(C); int type= RNA_enum_get(op->ptr, "type"); @@ -3328,11 +3327,9 @@ static int scene_new_exec(bContext *C, wmOperator *op) } } - /* this notifier calls ED_screen_set_scene, doing a lot of UI stuff, not for inside event loops */ - WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, newscene); + ED_screen_set_scene(C, newscene); - if(screen) - screen->scene= newscene; + WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, newscene); return OPERATOR_FINISHED; } @@ -3368,9 +3365,14 @@ static void SCENE_OT_new(wmOperatorType *ot) static int scene_delete_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene= CTX_data_scene(C); - + + ED_screen_delete_scene(C, scene); + + if(G.f & G_DEBUG) + printf("scene delete %p\n", scene); + WM_event_add_notifier(C, NC_SCENE|NA_REMOVED, scene); - + return OPERATOR_FINISHED; } diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c index 31aab956754..fe2dc1fb913 100644 --- a/source/blender/editors/screen/screendump.c +++ b/source/blender/editors/screen/screendump.c @@ -278,7 +278,6 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update, float ScreenshotJob *sj= sjv; RenderData rd= sj->scene->r; bMovieHandle *mh= BKE_get_movie_handle(sj->scene->r.im_format.imtype); - int cfra= 1; /* we need this as local variables for renderdata */ rd.frs_sec= U.scrcastfps; @@ -303,9 +302,9 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update, float if(sj->dumprect) { if(mh) { - if(mh->append_movie(&rd, cfra, (int *)sj->dumprect, sj->dumpsx, sj->dumpsy, &sj->reports)) { - BKE_reportf(&sj->reports, RPT_INFO, "Appended frame: %d", cfra); - printf("Appended frame %d\n", cfra); + if(mh->append_movie(&rd, rd.cfra, (int *)sj->dumprect, sj->dumpsx, sj->dumpsy, &sj->reports)) { + BKE_reportf(&sj->reports, RPT_INFO, "Appended frame: %d", rd.cfra); + printf("Appended frame %d\n", rd.cfra); } else break; } @@ -314,7 +313,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update, float char name[FILE_MAX]; int ok; - BKE_makepicstring(name, rd.pic, sj->bmain->name, cfra, rd.im_format.imtype, rd.scemode & R_EXTENSION, TRUE); + BKE_makepicstring(name, rd.pic, sj->bmain->name, rd.cfra, rd.im_format.imtype, rd.scemode & R_EXTENSION, TRUE); ibuf->rect= sj->dumprect; ok= BKE_write_ibuf(ibuf, name, &rd.im_format); @@ -338,7 +337,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update, float *do_update= 1; - cfra++; + rd.cfra++; } else diff --git a/source/blender/editors/space_buttons/buttons_texture.c b/source/blender/editors/space_buttons/buttons_texture.c index c0ccaeaea90..6927a78332f 100644 --- a/source/blender/editors/space_buttons/buttons_texture.c +++ b/source/blender/editors/space_buttons/buttons_texture.c @@ -1,6 +1,4 @@ /* - * $Id$ - * * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 7b692f55965..da7f22b2030 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -233,7 +233,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) /* output sockets */ for(nsock= node->outputs.first; nsock; nsock= nsock->next) { - if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { + if(!nodeSocketIsHidden(nsock)) { nsock->locx= locx + node->width; nsock->locy= dy - NODE_DYS; dy-= NODE_DY; @@ -312,7 +312,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) /* input sockets */ for(nsock= node->inputs.first; nsock; nsock= nsock->next) { - if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { + if(!nodeSocketIsHidden(nsock)) { nsock->locx= locx; nsock->locy= dy - NODE_DYS; dy-= NODE_DY; @@ -351,10 +351,10 @@ static void node_update_hidden(bNode *node) /* calculate minimal radius */ for(nsock= node->inputs.first; nsock; nsock= nsock->next) - if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE)) + if(!nodeSocketIsHidden(nsock)) totin++; for(nsock= node->outputs.first; nsock; nsock= nsock->next) - if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE)) + if(!nodeSocketIsHidden(nsock)) totout++; tot= MAX2(totin, totout); @@ -371,7 +371,7 @@ static void node_update_hidden(bNode *node) rad=drad= (float)M_PI/(1.0f + (float)totout); for(nsock= node->outputs.first; nsock; nsock= nsock->next) { - if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE)) { + if(!nodeSocketIsHidden(nsock)) { nsock->locx= node->totr.xmax - hiddenrad + (float)sin(rad)*hiddenrad; nsock->locy= node->totr.ymin + hiddenrad + (float)cos(rad)*hiddenrad; rad+= drad; @@ -382,7 +382,7 @@ static void node_update_hidden(bNode *node) rad=drad= - (float)M_PI/(1.0f + (float)totin); for(nsock= node->inputs.first; nsock; nsock= nsock->next) { - if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE)) { + if(!nodeSocketIsHidden(nsock)) { nsock->locx= node->totr.xmin + hiddenrad + (float)sin(rad)*hiddenrad; nsock->locy= node->totr.ymin + hiddenrad + (float)cos(rad)*hiddenrad; rad+= drad; @@ -713,7 +713,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN for(sock= node->inputs.first; sock; sock= sock->next) { bNodeSocketType *stype= ntreeGetSocketType(sock->type); - if(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) + if(nodeSocketIsHidden(sock)) continue; node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE); @@ -736,7 +736,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN RNA_pointer_create((ID*)ntree, &RNA_NodeSocket, sock, &sockptr); - if(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) + if(nodeSocketIsHidden(sock)) continue; node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE); @@ -854,12 +854,12 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b /* sockets */ for(sock= node->inputs.first; sock; sock= sock->next) { - if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (sock->flag & SOCK_IN_USE)) + if(!nodeSocketIsHidden(sock)) node_socket_circle_draw(snode->nodetree, sock, socket_size); } for(sock= node->outputs.first; sock; sock= sock->next) { - if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (sock->flag & SOCK_IN_USE)) + if(!nodeSocketIsHidden(sock)) node_socket_circle_draw(snode->nodetree, sock, socket_size); } diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 87a56274035..20fb385efdd 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -1600,40 +1600,38 @@ void NODE_OT_resize(wmOperatorType *ot) /* ********************** hidden sockets ******************** */ -int node_has_hidden_sockets(bNode *node) +int node_has_hidden_sockets(bNode *node, short flag) { bNodeSocket *sock; for(sock= node->inputs.first; sock; sock= sock->next) - if(sock->flag & SOCK_HIDDEN) + if(sock->flag & flag) return 1; for(sock= node->outputs.first; sock; sock= sock->next) - if(sock->flag & SOCK_HIDDEN) + if(sock->flag & flag) return 1; return 0; } -/* note: call node_tree_verify_groups(snode->nodetree) after this - */ -void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set) +void node_set_hidden_sockets(SpaceNode *snode, bNode *node, short flag, int set) { bNodeSocket *sock; if(set==0) { for(sock= node->inputs.first; sock; sock= sock->next) - sock->flag &= ~SOCK_HIDDEN; + sock->flag &= ~flag; for(sock= node->outputs.first; sock; sock= sock->next) - sock->flag &= ~SOCK_HIDDEN; + sock->flag &= ~flag; } else { /* hide unused sockets */ for(sock= node->inputs.first; sock; sock= sock->next) { if(sock->link==NULL) - sock->flag |= SOCK_HIDDEN; + sock->flag |= flag; } for(sock= node->outputs.first; sock; sock= sock->next) { if(nodeCountSocketLinks(snode->edittree, sock)==0) - sock->flag |= SOCK_HIDDEN; + sock->flag |= flag; } } } @@ -1680,14 +1678,14 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode) /* find a socket after the previously connected socket */ for(sock=sock->next; sock; sock= sock->next) - if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) + if(!nodeSocketIsHidden(sock)) break; } /* find a socket starting from the first socket */ if(!sock) { for(sock= tonode->outputs.first; sock; sock= sock->next) - if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) + if(!nodeSocketIsHidden(sock)) break; } @@ -1805,7 +1803,7 @@ static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket ** if(in_out & SOCK_IN) { for(sock= node->inputs.first; sock; sock= sock->next) { - if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { + if(!nodeSocketIsHidden(sock)) { if(BLI_in_rctf(&rect, sock->locx, sock->locy)) { if(node == visible_node(snode, &rect)) { *nodep= node; @@ -1818,7 +1816,7 @@ static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket ** } if(in_out & SOCK_OUT) { for(sock= node->outputs.first; sock; sock= sock->next) { - if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { + if(!nodeSocketIsHidden(sock)) { if(BLI_in_rctf(&rect, sock->locx, sock->locy)) { if(node == visible_node(snode, &rect)) { *nodep= node; @@ -1836,7 +1834,7 @@ static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket ** */ if(in_out & SOCK_IN) { for(sock= snode->edittree->outputs.first; sock; sock= sock->next) { - if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { + if(!nodeSocketIsHidden(sock)) { if(BLI_in_rctf(&rect, sock->locx, sock->locy)) { *nodep= NULL; /* NULL node pointer indicates group socket */ *sockp= sock; @@ -1847,7 +1845,7 @@ static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket ** } if(in_out & SOCK_OUT) { for(sock= snode->edittree->inputs.first; sock; sock= sock->next) { - if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { + if(!nodeSocketIsHidden(sock)) { if(BLI_in_rctf(&rect, sock->locx, sock->locy)) { *nodep= NULL; /* NULL node pointer indicates group socket */ *sockp= sock; @@ -1930,13 +1928,12 @@ static int sort_nodes_locx(void *a, void *b) static int socket_is_available(bNodeTree *ntree, bNodeSocket *sock, int allow_used) { - if (sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) + if (nodeSocketIsHidden(sock)) + return 0; + + if (!allow_used && (sock->flag & SOCK_IN_USE)) return 0; - if (!allow_used) { - if (nodeCountSocketLinks(ntree, sock) > 0) - return 0; - } return 1; } @@ -2246,7 +2243,7 @@ static void node_remove_extra_links(SpaceNode *snode, bNodeSocket *tsock, bNodeL } if(sock) { tlink->tosock= sock; - sock->flag &= ~SOCK_HIDDEN; + sock->flag &= ~(SOCK_HIDDEN|SOCK_AUTO_HIDDEN); } else { nodeRemLink(snode->edittree, tlink); @@ -2644,26 +2641,26 @@ static bNodeSocket *socket_best_match(ListBase *sockets, int type) /* first, match type */ for(sock= sockets->first; sock; sock= sock->next) - if(!(sock->flag & SOCK_HIDDEN)) + if(!nodeSocketIsHidden(sock)) if(type == sock->type) return sock; /* then just use first unhidden socket */ for(sock= sockets->first; sock; sock= sock->next) - if(!(sock->flag & SOCK_HIDDEN)) + if(!nodeSocketIsHidden(sock)) return sock; /* OK, let's unhide proper one */ for(sock= sockets->first; sock; sock= sock->next) { if(type == sock->type) { - sock->flag &= ~SOCK_HIDDEN; + sock->flag &= ~(SOCK_HIDDEN|SOCK_AUTO_HIDDEN); return sock; } } /* just the first */ sock= sockets->first; - sock->flag &= ~SOCK_HIDDEN; + sock->flag &= ~(SOCK_HIDDEN|SOCK_AUTO_HIDDEN); return sockets->first; } @@ -3003,10 +3000,20 @@ static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag) if(toggle_flag== NODE_OPTIONS && (node->typeinfo->flag & NODE_OPTIONS)==0) continue; - if( (tot_eq && tot_neq) || tot_eq==0) + if( (tot_eq && tot_neq) || tot_eq==0) { node->flag |= toggle_flag; - else + + /* hide/unhide node also toggles unlinked socket display */ + if (toggle_flag== NODE_HIDDEN) + node_set_hidden_sockets(snode, node, SOCK_AUTO_HIDDEN, 1); + } + else { node->flag &= ~toggle_flag; + + /* hide/unhide node also toggles unlinked socket display */ + if (toggle_flag== NODE_HIDDEN) + node_set_hidden_sockets(snode, node, SOCK_AUTO_HIDDEN, 0); + } } } } @@ -3119,7 +3126,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op)) hidden = 0; for(node= snode->edittree->nodes.first; node; node= node->next) { if(node->flag & SELECT) { - if(node_has_hidden_sockets(node)) { + if(node_has_hidden_sockets(node, SOCK_HIDDEN)) { hidden= 1; break; } @@ -3128,7 +3135,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op)) for(node= snode->edittree->nodes.first; node; node= node->next) { if(node->flag & SELECT) { - node_set_hidden_sockets(snode, node, !hidden); + node_set_hidden_sockets(snode, node, SOCK_HIDDEN, !hidden); } } diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 9068493360e..186ad3768be 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -118,8 +118,8 @@ void snode_composite_job(const struct bContext *C, ScrArea *sa); bNode *node_tree_get_editgroup(bNodeTree *ntree); void node_tree_verify_groups(bNodeTree *nodetree); void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace); -int node_has_hidden_sockets(bNode *node); -void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set); +int node_has_hidden_sockets(bNode *node, short flag); +void node_set_hidden_sockets(SpaceNode *snode, bNode *node, short flag, int set); int node_render_changed_exec(bContext *, wmOperator *); void NODE_OT_duplicate(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_node/node_templates.c b/source/blender/editors/space_node/node_templates.c index 6027a272270..a733d45c20b 100644 --- a/source/blender/editors/space_node/node_templates.c +++ b/source/blender/editors/space_node/node_templates.c @@ -1,6 +1,4 @@ /* - * $Id$ - * * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 5fd3d3b45d6..56c2e0ee4d1 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -2711,8 +2711,8 @@ static int sequencer_swap_data_exec(bContext *C, wmOperator *op) calc_sequence(scene, seq_act); calc_sequence(scene, seq_other); - if(seq_act->sound) sound_add_scene_sound(scene, seq_act, seq_act->startdisp, seq_act->enddisp, seq_act->startofs + seq_act->anim_startofs); - if(seq_other->sound) sound_add_scene_sound(scene, seq_other, seq_other->startdisp, seq_other->enddisp, seq_other->startofs + seq_other->anim_startofs); + if(seq_act->sound) sound_add_scene_sound_defaults(scene, seq_act); + if(seq_other->sound) sound_add_scene_sound_defaults(scene, seq_other); WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index ad2a0da4510..6bc1b3acce6 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -768,8 +768,7 @@ static void bundle_midpoint(Scene *scene, Object *ob, float vec[3]) tracking= &clip->tracking; - if(scene->camera) - copy_m4_m4(cammat, scene->camera->obmat); + copy_m4_m4(cammat, ob->obmat); BKE_get_tracking_mat(scene, ob, mat); |