12#define DNA_DEPRECATED_ALLOW
43#undef INVALIDATE_WORK_DATA
46# define INVALIDATE_WORK_DATA
57#ifdef INVALIDATE_WORK_DATA
59 memset((
void *)&
data->temp_dupli_object, 0xff,
sizeof(
data->temp_dupli_object));
65void ensure_id_properties_freed(
const Object *dupli_object,
Object *temp_dupli_object)
82 if (
data->dupli_object_current ==
nullptr) {
87 const Object *dupli_object =
data->dupli_object_current->ob;
88 Object *temp_dupli_object = &
data->temp_dupli_object;
90 ensure_id_properties_freed(dupli_object, temp_dupli_object);
106 if (!dob || !(dob->
type & hide_original_types)) {
118 data->dupli_parent = object;
119 data->dupli_list = duplis;
126 if (
data->dupli_list ==
nullptr) {
130 while (
data->dupli_object_next !=
nullptr) {
134 data->dupli_object_next =
data->dupli_object_next->next;
142 if (obd->
type !=
OB_MBALL && deg_object_hide_original(
data->eval_mode, dob->
ob, dob)) {
154 free_owned_memory(
data);
156 data->dupli_object_current = dob;
160 Object *temp_dupli_object = &
data->temp_dupli_object;
162 *temp_dupli_object = blender::dna::shallow_copy(*dob->
ob);
163 temp_dupli_object->
runtime = &
data->temp_dupli_object_runtime;
168 temp_dupli_object->
runtime->local_collections_bits =
169 dupli_parent->
runtime->local_collections_bits;
170 temp_dupli_object->
dt = std::min(temp_dupli_object->
dt, dupli_parent->
dt);
172 temp_dupli_object->
runtime->select_id = dupli_parent->
runtime->select_id;
192 data->temp_dupli_object.object_to_world().ptr());
193 data->next_object = &
data->temp_dupli_object;
198 free_owned_memory(
data);
200 data->dupli_parent =
nullptr;
201 data->dupli_list =
nullptr;
202 data->dupli_object_next =
nullptr;
203 data->dupli_object_current =
nullptr;
204 deg_invalidate_iterator_work_data(
data);
213 for (;
data->id_node_index <
data->num_id_nodes;
data->id_node_index++) {
224 if (id_type !=
ID_OB) {
264 object->runtime->select_id = object_orig->
runtime->select_id;
266 const bool use_preview = object_orig ==
data->object_orig_with_preview;
269 data->graph,
data->scene,
object,
data->settings->viewer_path);
270 deg_iterator_duplis_init(
data,
object, preview_duplis);
271 data->id_node_index++;
279 if (object->
type !=
OB_MBALL && deg_object_hide_original(
data->eval_mode,
object,
nullptr)) {
290 data->graph,
data->scene,
object,
data->settings->included_objects);
291 deg_iterator_duplis_init(
data,
object, duplis);
297 data->next_object = object;
299 data->id_node_index++;
309 if (
this != &other) {
340 if (id_elem->
id ==
nullptr) {
359 return reinterpret_cast<Object *
>(id_elem->
id);
370 if (num_id_nodes == 0) {
375 data->next_object =
nullptr;
376 data->dupli_parent =
nullptr;
377 data->dupli_list =
nullptr;
378 data->dupli_object_next =
nullptr;
379 data->dupli_object_current =
nullptr;
381 data->id_node_index = 0;
382 data->num_id_nodes = num_id_nodes;
384 deg_invalidate_iterator_work_data(
data);
388 if (viewer_path !=
nullptr) {
399 if (
data->next_object !=
nullptr) {
401 data->next_object =
nullptr;
404 if (deg_iterator_duplis_step(
data)) {
407 if (deg_iterator_objects_step(
data)) {
418 if (
data !=
nullptr) {
421 deg_invalidate_iterator_work_data(
data);
444 if (ntree ==
nullptr) {
471 data->id_node_index = 0;
472 data->num_id_nodes = num_id_nodes;
491 ++
data->id_node_index;
492 if (
data->id_node_index ==
data->num_id_nodes) {
499 }
while (iter->
skip);
void free_object_duplilist(ListBase *lb)
ListBase * object_duplilist_preview(Depsgraph *depsgraph, Scene *scene, Object *ob, const ViewerPath *viewer_path)
ListBase * object_duplilist(Depsgraph *depsgraph, Scene *sce, Object *ob, blender::Set< const Object * > *include_objects=nullptr)
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)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
eEvaluationMode DEG_get_mode(const Depsgraph *graph)
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.
@ VIEWER_PATH_ELEM_TYPE_MODIFIER
@ VIEWER_PATH_ELEM_TYPE_ID
BMesh const char void * data
BPy_StructRNA * depsgraph
bool contains(const Key &key) const
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)
void DEG_iterator_ids_end(BLI_Iterator *)
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)
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
DEGObjectIterSettings * settings
eEvaluationMode eval_mode
DEGObjectIterData & operator=(const 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
ObjectRuntimeHandle * runtime
unsigned short base_local_view_bits
struct ViewerPathElem * next
eDepsNode_LinkedState_Type linked_state