Iterator to loop over objects based on a flag
This commit is contained in:
parent
0f94c99ee7
commit
218bcff32d
|
@ -346,6 +346,20 @@ void BKE_scene_objects_iterator_begin(struct BLI_Iterator *iter, void *data_in);
|
|||
void BKE_scene_objects_iterator_next(struct BLI_Iterator *iter);
|
||||
void BKE_scene_objects_iterator_end(struct BLI_Iterator *iter);
|
||||
|
||||
/** Iterate over objects in the scene based on a flag.
|
||||
*
|
||||
* \note The object->flag is tested against flag.
|
||||
* */
|
||||
typedef struct SceneObjectsIteratorExData {
|
||||
struct Scene *scene;
|
||||
int flag;
|
||||
void *iter_data;
|
||||
} SceneObjectsIteratorExData;
|
||||
|
||||
void BKE_scene_objects_iterator_begin_ex(struct BLI_Iterator *iter, void *data_in);
|
||||
void BKE_scene_objects_iterator_next_ex(struct BLI_Iterator *iter);
|
||||
void BKE_scene_objects_iterator_end_ex(struct BLI_Iterator *iter);
|
||||
|
||||
/**
|
||||
* Generate a new #GSet (or extend given `objects_gset` if not NULL) with all objects referenced by
|
||||
* all collections of given `scene`.
|
||||
|
|
|
@ -436,15 +436,26 @@ void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter);
|
|||
IteratorBeginCb func_begin; \
|
||||
IteratorCb func_next, func_end; \
|
||||
void *data_in; \
|
||||
struct ObjectsVisibleIteratorData data_ = {NULL}; \
|
||||
data_.view_layer = _view_layer; \
|
||||
data_.v3d = _v3d; \
|
||||
\
|
||||
struct ObjectsVisibleIteratorData data_select_ = {NULL}; \
|
||||
data_select_.view_layer = _view_layer; \
|
||||
data_select_.v3d = _v3d; \
|
||||
\
|
||||
struct SceneObjectsIteratorExData data_flag_ = {NULL}; \
|
||||
data_flag_.scene = scene; \
|
||||
data_flag_.flag = flag; \
|
||||
\
|
||||
if (flag == SELECT) { \
|
||||
func_begin = &BKE_view_layer_selected_objects_iterator_begin; \
|
||||
func_next = &BKE_view_layer_selected_objects_iterator_next; \
|
||||
func_end = &BKE_view_layer_selected_objects_iterator_end; \
|
||||
data_in = &data_; \
|
||||
data_in = &data_select_; \
|
||||
} \
|
||||
else if (flag != 0) { \
|
||||
func_begin = BKE_scene_objects_iterator_begin_ex; \
|
||||
func_next = BKE_scene_objects_iterator_next_ex; \
|
||||
func_end = BKE_scene_objects_iterator_end_ex; \
|
||||
data_in = &data_flag_; \
|
||||
} \
|
||||
else { \
|
||||
func_begin = BKE_scene_objects_iterator_begin; \
|
||||
|
|
|
@ -1929,6 +1929,48 @@ void BKE_scene_objects_iterator_begin(BLI_Iterator *iter, void *data_in)
|
|||
scene_objects_iterator_begin(iter, scene, NULL);
|
||||
}
|
||||
|
||||
void BKE_scene_objects_iterator_begin_ex(BLI_Iterator *iter, void *data_in)
|
||||
{
|
||||
SceneObjectsIteratorExData *data = data_in;
|
||||
|
||||
BKE_scene_objects_iterator_begin(iter, data->scene);
|
||||
|
||||
/* Pack the data. */
|
||||
data->iter_data = iter->data;
|
||||
iter->data = data_in;
|
||||
}
|
||||
|
||||
void BKE_scene_objects_iterator_next_ex(struct BLI_Iterator *iter)
|
||||
{
|
||||
/* Unpack the data. */
|
||||
SceneObjectsIteratorExData *data = iter->data;
|
||||
iter->data = data->iter_data;
|
||||
|
||||
BKE_scene_objects_iterator_next(iter);
|
||||
|
||||
Object *ob = iter->current;
|
||||
if (ob && (ob->flag & data->flag) == 0) {
|
||||
iter->skip = true;
|
||||
}
|
||||
|
||||
/* Pack the data. */
|
||||
data->iter_data = iter->data;
|
||||
iter->data = data;
|
||||
}
|
||||
|
||||
void BKE_scene_objects_iterator_end_ex(struct BLI_Iterator *iter)
|
||||
{
|
||||
/* Unpack the data. */
|
||||
SceneObjectsIteratorExData *data = iter->data;
|
||||
iter->data = data->iter_data;
|
||||
|
||||
BKE_scene_objects_iterator_end(iter);
|
||||
|
||||
/* Pack the data. */
|
||||
data->iter_data = iter->data;
|
||||
iter->data = data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures we only get each object once, even when included in several collections.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue