From 12bc34b0b81b11186e3814f8a255f1226f0588c3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 30 Aug 2020 17:39:12 +1000 Subject: Object: add ED_object_array_in_mode_or_selected Use this utility function for render-shading & weight paint modes. This adds support for edit-mode & pose-mode where all objects in the mode are used in this case instead of the selected objects. --- source/blender/blenkernel/BKE_layer.h | 4 ++ source/blender/editors/include/ED_object.h | 5 ++ source/blender/editors/object/object_edit.c | 66 ++++++++++++++++++++++++++ source/blender/editors/object/object_vgroup.c | 50 +------------------ source/blender/editors/render/render_shading.c | 49 +------------------ 5 files changed, 78 insertions(+), 96 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index 6c9b41b835e..52503f08153 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -365,6 +365,10 @@ struct Object **BKE_view_layer_array_selected_objects_params( uint *r_len, const struct ObjectsInViewLayerParams *params); +#define BKE_view_layer_array_selected_objects(view_layer, v3d, r_len, ...) \ + BKE_view_layer_array_selected_objects_params( \ + view_layer, v3d, r_len, &(const struct ObjectsInViewLayerParams)__VA_ARGS__) + struct ObjectsInModeParams { int object_mode; uint no_dup_data : 1; diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 4c7dd4fe66c..f1ddc10f1a8 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -62,6 +62,11 @@ struct Object *ED_object_context(const struct bContext *C); struct Object *ED_object_active_context(const struct bContext *C); void ED_collection_hide_menu_draw(const struct bContext *C, struct uiLayout *layout); +Object **ED_object_array_in_mode_or_selected(struct bContext *C, + bool (*filter_fn)(struct Object *ob, void *user_data), + void *filter_user_data, + uint *r_objects_len); + /* object_utils.c */ bool ED_object_calc_active_center_for_editmode(struct Object *obedit, const bool select_only, diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 04113f70e52..966aeed75ab 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -145,6 +145,72 @@ Object *ED_object_active_context(const bContext *C) return ob; } +/** + * Return an array of objects: + * - When in the property space, return the pinned or active object. + * - When in edit-mode/pose-mode, return an array of objects in the mode. + * - Otherwise return selected objects, + * the callers \a filter_fn needs to check of they are editable + * (assuming they need to be modified). + */ +Object **ED_object_array_in_mode_or_selected(bContext *C, + bool (*filter_fn)(Object *ob, void *user_data), + void *filter_user_data, + uint *r_objects_len) +{ + ScrArea *area = CTX_wm_area(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + Object *ob_active = OBACT(view_layer); + Object **objects; + + Object *ob = NULL; + bool use_ob = true; + if (area && (area->spacetype == SPACE_PROPERTIES)) { + /* May return pinned object. */ + ob = ED_object_context(C); + } + else if (ob_active && (ob_active->mode & + (OB_MODE_ALL_PAINT | OB_MODE_ALL_SCULPT | OB_MODE_ALL_PAINT_GPENCIL))) { + /* When painting, limit to active. */ + ob = ob_active; + } + else { + /* Otherwise use full selection. */ + use_ob = false; + } + + if (use_ob) { + if ((ob != NULL) && !filter_fn(ob, filter_user_data)) { + ob = NULL; + } + *r_objects_len = (ob != NULL) ? 1 : 0; + objects = MEM_mallocN(sizeof(*objects) * *r_objects_len, __func__); + if (ob != NULL) { + objects[0] = ob; + } + } + else { + const View3D *v3d = (area && area->spacetype == SPACE_VIEW3D) ? area->spacedata.first : NULL; + /* When in a mode that supports multiple active objects, use "objects in mode" + * instead of the object's selection. */ + if ((ob_active != NULL) && (ob_active->mode & (OB_MODE_EDIT | OB_MODE_POSE))) { + objects = BKE_view_layer_array_from_objects_in_mode( + view_layer, + v3d, + r_objects_len, + {.no_dup_data = true, .filter_fn = filter_fn, .filter_userdata = filter_user_data}); + } + else { + objects = BKE_view_layer_array_selected_objects( + view_layer, + v3d, + r_objects_len, + {.no_dup_data = true, .filter_fn = filter_fn, .filter_userdata = filter_user_data}); + } + } + return objects; +} + /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 41541288e07..a144632fc5f 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -84,54 +84,6 @@ static bool vertex_group_supported_poll_ex(bContext *C, const Object *ob); /** \name Local Utility Functions * \{ */ -static Object **object_array_for_wpaint_impl(bContext *C, - bool (*filter_fn)(struct Object *ob, void *user_data), - void *filter_user_data, - uint *r_objects_len) -{ - Object **objects; - - Object *ob = NULL; - bool use_ob = true; - if (CTX_wm_space_properties(C)) { - /* May return pinned object. */ - ob = ED_object_context(C); - } - else if (CTX_data_mode_enum(C) == CTX_MODE_PAINT_WEIGHT) { - /* When painting, limit to active. */ - ob = CTX_data_active_object(C); - } - else { - /* Otherwise use full selection. */ - use_ob = false; - } - - if (use_ob) { - if (!filter_fn(ob, filter_user_data)) { - ob = NULL; - } - *r_objects_len = (ob != NULL) ? 1 : 0; - objects = MEM_mallocN(sizeof(*objects) * *r_objects_len, __func__); - if (ob != NULL) { - objects[0] = ob; - } - } - else { - ViewLayer *view_layer = CTX_data_view_layer(C); - const View3D *v3d = CTX_wm_view3d(C); /* may be NULL. */ - objects = BKE_view_layer_array_selected_objects_params( - view_layer, - v3d, - r_objects_len, - &((const struct ObjectsInViewLayerParams){ - .no_dup_data = true, - .filter_fn = filter_fn, - .filter_userdata = filter_user_data, - })); - } - return objects; -} - static bool object_array_for_wpaint_filter(Object *ob, void *user_data) { bContext *C = user_data; @@ -143,7 +95,7 @@ static bool object_array_for_wpaint_filter(Object *ob, void *user_data) static Object **object_array_for_wpaint(bContext *C, uint *r_objects_len) { - return object_array_for_wpaint_impl(C, object_array_for_wpaint_filter, C, r_objects_len); + return ED_object_array_in_mode_or_selected(C, object_array_for_wpaint_filter, C, r_objects_len); } static bool vertex_group_use_vert_sel(Object *ob) diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c index 078817e091a..2b52ae117fc 100644 --- a/source/blender/editors/render/render_shading.c +++ b/source/blender/editors/render/render_shading.c @@ -102,51 +102,6 @@ static bool object_materials_supported_poll_ex(bContext *C, const Object *ob); /** \name Local Utilities * \{ */ -static Object **object_array_for_shading_impl(bContext *C, - bool (*filter_fn)(struct Object *ob, - void *user_data), - void *filter_user_data, - uint *r_objects_len) -{ - Object **objects; - - Object *ob = NULL; - bool use_ob = true; - if (CTX_wm_space_properties(C)) { - /* May return pinned object. */ - ob = ED_object_context(C); - } - else { - /* Otherwise use full selection. */ - use_ob = false; - } - - if (use_ob) { - if (!filter_fn(ob, filter_user_data)) { - ob = NULL; - } - *r_objects_len = (ob != NULL) ? 1 : 0; - objects = MEM_mallocN(sizeof(*objects) * *r_objects_len, __func__); - if (ob != NULL) { - objects[0] = ob; - } - } - else { - ViewLayer *view_layer = CTX_data_view_layer(C); - const View3D *v3d = CTX_wm_view3d(C); /* may be NULL. */ - objects = BKE_view_layer_array_selected_objects_params( - view_layer, - v3d, - r_objects_len, - &((const struct ObjectsInViewLayerParams){ - .no_dup_data = true, - .filter_fn = filter_fn, - .filter_userdata = filter_user_data, - })); - } - return objects; -} - static bool object_array_for_shading_edit_mode_enabled_filter(Object *ob, void *user_data) { bContext *C = user_data; @@ -160,7 +115,7 @@ static bool object_array_for_shading_edit_mode_enabled_filter(Object *ob, void * static Object **object_array_for_shading_edit_mode_enabled(bContext *C, uint *r_objects_len) { - return object_array_for_shading_impl( + return ED_object_array_in_mode_or_selected( C, object_array_for_shading_edit_mode_enabled_filter, C, r_objects_len); } @@ -177,7 +132,7 @@ static bool object_array_for_shading_edit_mode_disabled_filter(Object *ob, void static Object **object_array_for_shading_edit_mode_disabled(bContext *C, uint *r_objects_len) { - return object_array_for_shading_impl( + return ED_object_array_in_mode_or_selected( C, object_array_for_shading_edit_mode_disabled_filter, C, r_objects_len); } -- cgit v1.2.3