From a5a2a71ce3efe7a0b456a6dcadd1548391772882 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 17 May 2013 07:00:21 +0000 Subject: svn merge ^/trunk/blender -c56857 -c56863 -c56865 -c56868 --- source/blender/blenkernel/intern/node.c | 45 +++++++++++++++--------- source/blender/editors/include/ED_mesh.h | 2 ++ source/blender/editors/mesh/editmesh_loopcut.c | 20 +++++++++++ source/blender/editors/transform/transform_ops.c | 41 +++++++++++++++++++++ source/blender/makesdna/DNA_node_types.h | 6 ++-- source/blender/makesrna/intern/rna_scene.c | 7 ++++ 6 files changed, 100 insertions(+), 21 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 03d4fc35f42..75bf594a976 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -2278,30 +2278,41 @@ bNode *nodeGetActive(bNodeTree *ntree) return node; } -/* two active flags, ID nodes have special flag for buttons display */ -bNode *nodeGetActiveID(bNodeTree *ntree, short idtype) +static bNode *node_get_active_id_recursive(bNodeInstanceKey active_key, bNodeInstanceKey parent_key, bNodeTree *ntree, short idtype) { - bNode *node, *tnode; - - if (ntree == NULL) return NULL; - - for (node = ntree->nodes.first; node; node = node->next) - if (node->id && GS(node->id->name) == idtype) - if (node->flag & NODE_ACTIVE_ID) - return node; - - /* no node with active ID in this tree, look inside groups */ - for (node = ntree->nodes.first; node; node = node->next) { - if (node->type == NODE_GROUP) { - tnode = nodeGetActiveID((bNodeTree *)node->id, idtype); - if (tnode) - return tnode; + if (parent_key.value == active_key.value) { + bNode *node; + for (node = ntree->nodes.first; node; node = node->next) + if (node->id && GS(node->id->name) == idtype) + if (node->flag & NODE_ACTIVE_ID) + return node; + } + else { + bNode *node, *tnode; + /* no node with active ID in this tree, look inside groups */ + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == NODE_GROUP) { + bNodeTree *group = (bNodeTree *)node->id; + bNodeInstanceKey group_key = BKE_node_instance_key(parent_key, ntree, node); + tnode = node_get_active_id_recursive(active_key, group_key, group, idtype); + if (tnode) + return tnode; + } } } return NULL; } +/* two active flags, ID nodes have special flag for buttons display */ +bNode *nodeGetActiveID(bNodeTree *ntree, short idtype) +{ + if (ntree) + return node_get_active_id_recursive(ntree->active_viewer_key, NODE_INSTANCE_KEY_BASE, ntree, idtype); + else + return NULL; +} + bool nodeSetActiveID(bNodeTree *ntree, short idtype, ID *id) { bNode *node; diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index aa9178ee3fc..65217e09259 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -308,6 +308,8 @@ bool ED_mesh_pick_face_vert(struct bContext *C, struct Object *ob, const int mva #define ED_MESH_PICK_DEFAULT_VERT_SIZE 50 #define ED_MESH_PICK_DEFAULT_FACE_SIZE 3 +#define USE_LOOPSLIDE_HACK + #ifdef __cplusplus } #endif diff --git a/source/blender/editors/mesh/editmesh_loopcut.c b/source/blender/editors/mesh/editmesh_loopcut.c index 68a5809bc2e..396030ee57e 100644 --- a/source/blender/editors/mesh/editmesh_loopcut.c +++ b/source/blender/editors/mesh/editmesh_loopcut.c @@ -443,6 +443,21 @@ static int loopcut_init(bContext *C, wmOperator *op, const wmEvent *event) loopcut_update_edge(lcd, e, 0); } +#ifdef USE_LOOPSLIDE_HACK + /* for use in macro so we can restore, HACK */ + { + Scene *scene = CTX_data_scene(C); + ToolSettings *settings = scene->toolsettings; + int mesh_select_mode[3] = { + (settings->selectmode & SCE_SELECT_VERTEX) != 0, + (settings->selectmode & SCE_SELECT_EDGE) != 0, + (settings->selectmode & SCE_SELECT_FACE) != 0, + }; + + RNA_boolean_set_array(op->ptr, "mesh_select_mode_init", mesh_select_mode); + } +#endif + if (is_interactive) { ScrArea *sa = CTX_wm_area(C); ED_area_headerprint(sa, IFACE_("Select a ring to be cut, use mouse-wheel or page-up/down for number of cuts, " @@ -652,4 +667,9 @@ void MESH_OT_loopcut(wmOperatorType *ot) prop = RNA_def_int(ot->srna, "edge_index", -1, -1, INT_MAX, "Number of Cuts", "", 0, INT_MAX); RNA_def_property_flag(prop, PROP_HIDDEN); + +#ifdef USE_LOOPSLIDE_HACK + prop = RNA_def_boolean_array(ot->srna, "mesh_select_mode_init", 3, NULL, "", ""); + RNA_def_property_flag(prop, PROP_HIDDEN); +#endif } diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 4f46e969c3c..ae8193d1f26 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -50,6 +50,7 @@ #include "UI_resources.h" #include "ED_screen.h" +#include "ED_mesh.h" #include "transform.h" @@ -292,8 +293,48 @@ static void TRANSFORM_OT_create_orientation(struct wmOperatorType *ot) RNA_def_boolean(ot->srna, "overwrite", 0, "Overwrite previous", "Overwrite previously created orientation with same name"); } + +#ifdef USE_LOOPSLIDE_HACK +/** + * Special hack for MESH_OT_loopcut_slide so we get back to the selection mode + */ +static void transformops_loopsel_hack(bContext *C, wmOperator *op) +{ + if (op->type->idname == OP_EDGE_SLIDE) { + if (op->opm && op->opm->opm && op->opm->opm->prev) { + wmOperator *op_prev = op->opm->opm->prev; + Scene *scene = CTX_data_scene(C); + int mesh_select_mode[3]; + PropertyRNA *prop = RNA_struct_find_property(op_prev->ptr, "mesh_select_mode_init"); + + if (RNA_property_is_set(op_prev->ptr, prop)) { + ToolSettings *ts = scene->toolsettings; + short selectmode_orig; + + RNA_property_boolean_get_array(op_prev->ptr, prop, mesh_select_mode); + selectmode_orig = ((mesh_select_mode[0] ? SCE_SELECT_VERTEX : 0) | + (mesh_select_mode[1] ? SCE_SELECT_EDGE : 0) | + (mesh_select_mode[2] ? SCE_SELECT_FACE : 0)); + + /* still switch if we were originally in face select mode */ + if ((ts->selectmode != selectmode_orig) && (selectmode_orig != SCE_SELECT_FACE)) { + BMEditMesh *em = BKE_editmesh_from_object(scene->obedit); + em->selectmode = ts->selectmode = selectmode_orig; + EDBM_selectmode_set(em); + } + } + } + } +} +#endif /* USE_LOOPSLIDE_HACK */ + + static void transformops_exit(bContext *C, wmOperator *op) { +#ifdef USE_LOOPSLIDE_HACK + transformops_loopsel_hack(C, op); +#endif + saveTransform(C, op->customdata, op); MEM_freeN(op->customdata); op->customdata = NULL; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 3ed97c2480f..25412f1937b 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -370,10 +370,8 @@ typedef struct bNodeTree { * Only available in base node trees (e.g. scene->node_tree) */ struct bNodeInstanceHash *previews; - /* XXX workaround for ambiguous viewer output: - * Viewer nodes all write to the same image buffer. - * This determines the tree instance containing the "active" output. - * Only used in local scene->nodetree. + /* Defines the node tree instance to use for the "active" context, + * in case multiple different editors are used and make context ambiguous. */ bNodeInstanceKey active_viewer_key; int pad; diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 9327522aa9d..fae5e6374b7 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1122,6 +1122,10 @@ static void rna_SceneRenderLayer_name_set(PointerRNA *ptr, const char *value) { Scene *scene = (Scene *)ptr->id.data; SceneRenderLayer *rl = (SceneRenderLayer *)ptr->data; + char oldname[sizeof(rl->name)]; + + BLI_strncpy(oldname, rl->name, sizeof(rl->name)); + BLI_strncpy_utf8(rl->name, value, sizeof(rl->name)); BLI_uniquename(&scene->r.layers, rl, DATA_("RenderLayer"), '.', offsetof(SceneRenderLayer, name), sizeof(rl->name)); @@ -1136,6 +1140,9 @@ static void rna_SceneRenderLayer_name_set(PointerRNA *ptr, const char *value) } } } + + /* fix all the animation data which may link to this */ + BKE_all_animdata_fix_paths_rename(NULL, "render.layers", oldname, rl->name); } static char *rna_SceneRenderLayer_path(PointerRNA *ptr) -- cgit v1.2.3