Cleanup: Move view layer array utils from macros to functions

These macros don't compile in C++ because of taking an address of a
temporary and use of designated initializers. Besides that, using
functions can improve debugging and type safety.

Differentil Revision: https://developer.blender.org/D15693
This commit is contained in:
Hans Goudey 2022-08-16 21:25:14 -04:00
parent d39abb74a0
commit 413c399ab8
5 changed files with 91 additions and 57 deletions

View File

@ -10,6 +10,7 @@
#include "DNA_layer_types.h"
#include "DNA_listBase.h"
#include "DNA_object_enums.h"
#ifdef __cplusplus
extern "C" {
@ -520,46 +521,28 @@ struct Object **BKE_view_layer_array_from_objects_in_mode_params(
uint *len,
const struct ObjectsInModeParams *params);
#define BKE_view_layer_array_from_objects_in_mode(view_layer, v3d, r_len, ...) \
BKE_view_layer_array_from_objects_in_mode_params( \
view_layer, v3d, r_len, &(const struct ObjectsInModeParams)__VA_ARGS__)
#define BKE_view_layer_array_from_bases_in_mode(view_layer, v3d, r_len, ...) \
BKE_view_layer_array_from_bases_in_mode_params( \
view_layer, v3d, r_len, &(const struct ObjectsInModeParams)__VA_ARGS__)
bool BKE_view_layer_filter_edit_mesh_has_uvs(const struct Object *ob, void *user_data);
bool BKE_view_layer_filter_edit_mesh_has_edges(const struct Object *ob, void *user_data);
/* Utility macros that wrap common args (add more as needed). */
/* Utility functions that wrap common arguments (add more as needed). */
#define BKE_view_layer_array_from_objects_in_edit_mode(view_layer, v3d, r_len) \
BKE_view_layer_array_from_objects_in_mode(view_layer, v3d, r_len, {.object_mode = OB_MODE_EDIT})
struct Object **BKE_view_layer_array_from_objects_in_edit_mode(struct ViewLayer *view_layer,
const struct View3D *v3d,
uint *r_len);
struct Base **BKE_view_layer_array_from_bases_in_edit_mode(struct ViewLayer *view_layer,
const struct View3D *v3d,
uint *r_len);
struct Object **BKE_view_layer_array_from_objects_in_edit_mode_unique_data(
struct ViewLayer *view_layer, const struct View3D *v3d, uint *r_len);
#define BKE_view_layer_array_from_bases_in_edit_mode(view_layer, v3d, r_len) \
BKE_view_layer_array_from_bases_in_mode(view_layer, v3d, r_len, {.object_mode = OB_MODE_EDIT})
#define BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, v3d, r_len) \
BKE_view_layer_array_from_objects_in_mode( \
view_layer, v3d, r_len, {.object_mode = OB_MODE_EDIT, .no_dup_data = true})
#define BKE_view_layer_array_from_bases_in_edit_mode_unique_data(view_layer, v3d, r_len) \
BKE_view_layer_array_from_bases_in_mode( \
view_layer, v3d, r_len, {.object_mode = OB_MODE_EDIT, .no_dup_data = true})
#define BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs( \
view_layer, v3d, r_len) \
BKE_view_layer_array_from_objects_in_mode( \
view_layer, \
v3d, \
r_len, \
{.object_mode = OB_MODE_EDIT, \
.no_dup_data = true, \
.filter_fn = BKE_view_layer_filter_edit_mesh_has_uvs})
#define BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, v3d, r_len, mode) \
BKE_view_layer_array_from_objects_in_mode( \
view_layer, v3d, r_len, {.object_mode = mode, .no_dup_data = true})
struct Base **BKE_view_layer_array_from_bases_in_edit_mode_unique_data(
struct ViewLayer *view_layer, const struct View3D *v3d, uint *r_len);
struct Object **BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(
struct ViewLayer *view_layer, const struct View3D *v3d, uint *r_len);
struct Object **BKE_view_layer_array_from_objects_in_mode_unique_data(struct ViewLayer *view_layer,
const struct View3D *v3d,
uint *r_len,
eObjectMode mode);
struct ViewLayerAOV *BKE_view_layer_add_aov(struct ViewLayer *view_layer);
void BKE_view_layer_remove_aov(struct ViewLayer *view_layer, struct ViewLayerAOV *aov);

View File

@ -149,6 +149,65 @@ Object **BKE_view_layer_array_from_objects_in_mode_params(ViewLayer *view_layer,
return (Object **)base_array;
}
struct Object **BKE_view_layer_array_from_objects_in_edit_mode(ViewLayer *view_layer,
const View3D *v3d,
uint *r_len)
{
struct ObjectsInModeParams params = {0};
params.object_mode = OB_MODE_EDIT;
return BKE_view_layer_array_from_objects_in_mode_params(view_layer, v3d, r_len, &params);
}
struct Base **BKE_view_layer_array_from_bases_in_edit_mode(ViewLayer *view_layer,
const View3D *v3d,
uint *r_len)
{
struct ObjectsInModeParams params = {0};
params.object_mode = OB_MODE_EDIT;
return BKE_view_layer_array_from_bases_in_mode_params(view_layer, v3d, r_len, &params);
}
struct Object **BKE_view_layer_array_from_objects_in_edit_mode_unique_data(ViewLayer *view_layer,
const View3D *v3d,
uint *r_len)
{
struct ObjectsInModeParams params = {0};
params.object_mode = OB_MODE_EDIT;
params.no_dup_data = true;
return BKE_view_layer_array_from_objects_in_mode_params(view_layer, v3d, r_len, &params);
}
struct Base **BKE_view_layer_array_from_bases_in_edit_mode_unique_data(ViewLayer *view_layer,
const View3D *v3d,
uint *r_len)
{
struct ObjectsInModeParams params = {0};
params.object_mode = OB_MODE_EDIT;
params.no_dup_data = true;
return BKE_view_layer_array_from_bases_in_mode_params(view_layer, v3d, r_len, &params);
}
struct Object **BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(
ViewLayer *view_layer, const View3D *v3d, uint *r_len)
{
struct ObjectsInModeParams params = {0};
params.object_mode = OB_MODE_EDIT;
params.no_dup_data = true;
params.filter_fn = BKE_view_layer_filter_edit_mesh_has_uvs;
return BKE_view_layer_array_from_objects_in_mode_params(view_layer, v3d, r_len, &params);
}
struct Object **BKE_view_layer_array_from_objects_in_mode_unique_data(ViewLayer *view_layer,
const View3D *v3d,
uint *r_len,
const eObjectMode mode)
{
struct ObjectsInModeParams params = {0};
params.object_mode = mode;
params.no_dup_data = true;
return BKE_view_layer_array_from_objects_in_mode_params(view_layer, v3d, r_len, &params);
}
/** \} */
/* -------------------------------------------------------------------- */

View File

@ -339,12 +339,7 @@ static void *ed_armature_pick_bone_impl(
Base **bases;
if (vc.obedit != NULL) {
bases = BKE_view_layer_array_from_bases_in_mode(vc.view_layer,
vc.v3d,
&bases_len,
{
.object_mode = OB_MODE_EDIT,
});
bases = BKE_view_layer_array_from_bases_in_edit_mode(vc.view_layer, vc.v3d, &bases_len);
}
else {
bases = BKE_object_pose_base_array_get(vc.view_layer, vc.v3d, &bases_len);

View File

@ -194,13 +194,13 @@ Object **ED_object_array_in_mode_or_selected(bContext *C,
/* When in a mode that supports multiple active objects, use "objects in mode"
* instead of the object's selection. */
if (use_objects_in_mode) {
objects = BKE_view_layer_array_from_objects_in_mode(view_layer,
v3d,
r_objects_len,
{.object_mode = ob_active->mode,
.no_dup_data = true,
.filter_fn = filter_fn,
.filter_userdata = filter_user_data});
struct ObjectsInModeParams params = {0};
params.object_mode = ob_active->mode;
params.no_dup_data = true;
params.filter_fn = filter_fn;
params.filter_userdata = filter_user_data;
objects = BKE_view_layer_array_from_objects_in_mode_params(
view_layer, v3d, r_objects_len, &params);
}
else {
objects = BKE_view_layer_array_selected_objects(

View File

@ -940,15 +940,12 @@ static void init_TransDataContainers(TransInfo *t,
bool free_objects = false;
if (objects == NULL) {
objects = BKE_view_layer_array_from_objects_in_mode(
t->view_layer,
(t->spacetype == SPACE_VIEW3D) ? t->view : NULL,
&objects_len,
{
.object_mode = object_mode,
/* Pose transform operates on `ob->pose` so don't skip duplicate object-data. */
.no_dup_data = (object_mode & OB_MODE_POSE) == 0,
});
struct ObjectsInModeParams params = {0};
params.object_mode = object_mode;
/* Pose transform operates on `ob->pose` so don't skip duplicate object-data. */
params.no_dup_data = (object_mode & OB_MODE_POSE) == 0;
objects = BKE_view_layer_array_from_objects_in_mode_params(
t->view_layer, (t->spacetype == SPACE_VIEW3D) ? t->view : NULL, &objects_len, &params);
free_objects = true;
}