12#define DNA_DEPRECATED_ALLOW
43#undef INVALIDATE_WORK_DATA
46# define INVALIDATE_WORK_DATA
60#ifdef INVALIDATE_WORK_DATA
62 memset((
void *)&
data->temp_dupli_object, 0xff,
sizeof(
data->temp_dupli_object));
81 if (!dob || !(dob->
type & hide_original_types)) {
98 if (
data->dupli_list.is_empty()) {
101 data->dupli_parent = object;
102 data->dupli_object_next = &
data->dupli_list.first();
103 data->dupli_object_next_index = 0;
109 if (
data->dupli_list.is_empty()) {
113 while (
data->dupli_object_next !=
nullptr) {
117 if (++
data->dupli_object_next_index <
data->dupli_list.size()) {
118 data->dupli_object_next = &
data->dupli_list[
data->dupli_object_next_index];
121 data->dupli_object_next =
nullptr;
122 data->dupli_object_next_index = -1;
138 if (
data->dupli_object_current) {
140 &
data->temp_dupli_object);
143 data->dupli_object_current = dob;
146 data->dupli_object_current,
149 &
data->temp_dupli_object,
150 &
data->temp_dupli_object_runtime))
152 data->next_object = &
data->temp_dupli_object;
161 if (
data->dupli_object_current) {
164 data->dupli_list.clear();
165 data->dupli_parent =
nullptr;
166 data->dupli_object_next =
nullptr;
167 data->dupli_object_next_index = -1;
168 data->dupli_object_current =
nullptr;
169 deg_invalidate_iterator_work_data(
data);
178 for (;
data->id_node_index <
data->num_id_nodes;
data->id_node_index++) {
189 if (id_type !=
ID_OB) {
229 object->runtime->select_id = object_orig->
runtime->select_id;
231 const bool use_preview = object_orig ==
data->object_orig_with_preview;
234 data->graph,
data->scene,
object,
data->settings->viewer_path,
data->dupli_list);
235 deg_iterator_duplis_init(
data,
object);
236 data->id_node_index++;
255 data->graph,
data->scene,
object,
data->settings->included_objects,
data->dupli_list);
256 deg_iterator_duplis_init(
data,
object);
262 data->next_object = object;
264 data->id_node_index++;
305 if (id_elem->
id ==
nullptr) {
324 return reinterpret_cast<Object *
>(id_elem->
id);
335 if (num_id_nodes == 0) {
340 data->next_object =
nullptr;
341 data->dupli_parent =
nullptr;
342 data->dupli_list.clear();
343 data->dupli_object_next =
nullptr;
344 data->dupli_object_next_index = -1;
345 data->dupli_object_current =
nullptr;
347 data->id_node_index = 0;
348 data->num_id_nodes = num_id_nodes;
350 deg_invalidate_iterator_work_data(
data);
354 if (viewer_path !=
nullptr) {
365 if (
data->next_object !=
nullptr) {
367 data->next_object =
nullptr;
370 if (deg_iterator_duplis_step(
data)) {
373 if (deg_iterator_objects_step(
data)) {
384 if (
data !=
nullptr) {
387 deg_invalidate_iterator_work_data(
data);
410 if (ntree ==
nullptr) {
437 data->id_node_index = 0;
438 data->num_id_nodes = num_id_nodes;
457 ++
data->id_node_index;
458 if (
data->id_node_index ==
data->num_id_nodes) {
465 }
while (iter->
skip);
475 return !deg_object_hide_original(eval_mode, ob,
nullptr);
486 if (dupli->
ob->
type !=
OB_MBALL && deg_object_hide_original(eval_mode, dupli->
ob, dupli)) {
496 bool do_matrix_setup,
500 *r_temp_object = blender::dna::shallow_copy(*dupli->
ob);
501 r_temp_object->
runtime = r_temp_runtime;
506 r_temp_object->
runtime->local_collections_bits = dupli_parent->
runtime->local_collections_bits;
507 r_temp_object->
dt = std::min(r_temp_object->
dt, dupli_parent->
dt);
509 r_temp_object->
runtime->select_id = dupli_parent->
runtime->select_id;
524 if (do_matrix_setup) {
532 r_temp_object->object_to_world().ptr());
543 if (*temp_dupli_idprops ==
nullptr) {
547 if (*temp_dupli_idprops == dupli_idprops) {
553 *temp_dupli_idprops =
nullptr;
void object_duplilist_preview(Depsgraph *depsgraph, Scene *scene, Object *ob, const ViewerPath *viewer_path, DupliList &r_duplilist)
void object_duplilist(Depsgraph *depsgraph, Scene *sce, Object *ob, blender::Set< const Object * > *include_objects, DupliList &r_duplilist)
void IDP_FreeProperty(IDProperty *prop)
ModifierData * BKE_modifiers_findby_persistent_uid(const Object *ob, int persistent_uid)
General operations, lookup, etc. for blender objects.
void BKE_object_replace_data_on_shallow_copy(Object *ob, ID *new_data)
int BKE_object_visibility(const Object *ob, int dag_eval_mode)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void copy_m4_m4(float m1[4][4], const float m2[4][4])
bool is_negative_m4(const float mat[4][4])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
#define SET_FLAG_FROM_TEST(value, test, flag)
bool DEG_iterator_dupli_is_visible(const DupliObject *dupli, eEvaluationMode eval_mode)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
eEvaluationMode DEG_get_mode(const Depsgraph *graph)
bool DEG_iterator_object_is_visible(eEvaluationMode eval_mode, const Object *ob)
bool DEG_id_type_any_updated(const Depsgraph *depsgraph)
T * DEG_get_original(T *id)
@ DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY
@ DEG_ITER_OBJECT_FLAG_VISIBLE
@ DEG_ITER_OBJECT_FLAG_DUPLI
@ DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY
@ DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET
@ BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT
Object is a sort of wrapper for general info.
struct ObjectRuntimeHandle ObjectRuntimeHandle
@ VIEWER_PATH_ELEM_TYPE_MODIFIER
@ VIEWER_PATH_ELEM_TYPE_ID
BMesh const char void * data
BPy_StructRNA * depsgraph
bool contains(const Key &key) const
bool DEG_iterator_dupli_is_visible(const DupliObject *dupli, eEvaluationMode eval_mode)
void DEG_iterator_ids_begin(BLI_Iterator *iter, DEGIDIterData *data)
void DEG_iterator_objects_begin(BLI_Iterator *iter, DEGObjectIterData *data)
void DEG_iterator_objects_end(BLI_Iterator *iter)
static void ensure_id_properties_freed(const IDProperty *dupli_idprops, IDProperty **temp_dupli_idprops)
void DEG_iterator_ids_end(BLI_Iterator *)
void DEG_iterator_temp_object_free_properties(const DupliObject *dupli, Object *temp_object)
bool DEG_iterator_object_is_visible(eEvaluationMode eval_mode, const Object *ob)
void DEG_iterator_objects_next(BLI_Iterator *iter)
static Object * find_object_with_preview_geometry(const ViewerPath &viewer_path)
void DEG_iterator_ids_next(BLI_Iterator *iter)
bool DEG_iterator_temp_object_from_dupli(const Object *dupli_parent, const DupliObject *dupli, eEvaluationMode eval_mode, bool do_matrix_setup, Object *r_temp_object, ObjectRuntimeHandle *r_temp_runtime)
static void DEG_iterator_ids_step(BLI_Iterator *iter, deg::IDNode *id_node, bool only_updated)
bNodeTree * node_tree_from_id(ID *id)
bool deg_eval_copy_is_expanded(const ID *id_cow)
bool deg_validate_eval_copy_datablock(ID *id_cow)
@ DEG_ID_LINKED_INDIRECTLY
void DEG_iterator_temp_object_free_properties(const DupliObject *dupli, Object *temp_object)
bool DEG_iterator_temp_object_from_dupli(const Object *dupli_parent, const DupliObject *dupli, eEvaluationMode eval_mode, bool do_matrix_setup, Object *r_temp_object, ObjectRuntimeHandle *r_temp_runtime)
int dupli_object_next_index
DEGObjectIterSettings * settings
eEvaluationMode eval_mode
void transfer_from(DEGObjectIterData &other)
DupliObject * dupli_object_next
DupliObject * dupli_object_current
blender::bke::ObjectRuntime temp_dupli_object_runtime
Object * object_orig_with_preview
blender::Set< const Object * > * included_objects
IDProperty * system_properties
ObjectRuntimeHandle * runtime
unsigned short base_local_view_bits
struct ViewerPathElem * next
eDepsNode_LinkedState_Type linked_state