11 #define DNA_DEPRECATED_ALLOW
41 #undef INVALIDATE_WORK_DATA
44 # define INVALIDATE_WORK_DATA
55 #ifdef INVALIDATE_WORK_DATA
57 memset((
void *)&
data->temp_dupli_object, 0xff,
sizeof(
data->temp_dupli_object));
63 void ensure_id_properties_freed(
const Object *dupli_object,
Object *temp_dupli_object)
78 void ensure_boundbox_freed(
const Object *dupli_object,
Object *temp_dupli_object)
80 if (temp_dupli_object->
runtime.
bb ==
nullptr) {
95 if (
data->dupli_object_current ==
nullptr) {
100 const Object *dupli_object =
data->dupli_object_current->ob;
101 Object *temp_dupli_object = &
data->temp_dupli_object;
103 ensure_id_properties_freed(dupli_object, temp_dupli_object);
104 ensure_boundbox_freed(dupli_object, temp_dupli_object);
120 if (!dob || !(dob->
type & hide_original_types)) {
134 data->dupli_parent = object;
143 if (
data->dupli_list ==
nullptr) {
147 while (
data->dupli_object_next !=
nullptr) {
151 data->dupli_object_next =
data->dupli_object_next->next;
159 if (deg_object_hide_original(
data->eval_mode, dob->
ob, dob)) {
163 free_owned_memory(
data);
165 data->dupli_object_current = dob;
169 Object *temp_dupli_object = &
data->temp_dupli_object;
170 *temp_dupli_object = blender::dna::shallow_copy(*dob->
ob);
175 temp_dupli_object->
dt =
MIN2(temp_dupli_object->
dt, dupli_parent->
dt);
199 data->next_object = &
data->temp_dupli_object;
204 free_owned_memory(
data);
206 data->dupli_parent =
nullptr;
207 data->dupli_list =
nullptr;
208 data->dupli_object_next =
nullptr;
209 data->dupli_object_current =
nullptr;
210 deg_invalidate_iterator_work_data(
data);
219 for (;
data->id_node_index <
data->num_id_nodes;
data->id_node_index++) {
230 if (id_type !=
ID_OB) {
259 if (object->
type !=
OB_MBALL && deg_object_hide_original(
data->eval_mode,
object,
nullptr)) {
266 deg_iterator_duplis_init(
data,
object);
270 data->next_object = object;
272 data->id_node_index++;
288 if (num_id_nodes == 0) {
293 data->next_object =
nullptr;
294 data->dupli_parent =
nullptr;
295 data->dupli_list =
nullptr;
296 data->dupli_object_next =
nullptr;
297 data->dupli_object_current =
nullptr;
299 data->id_node_index = 0;
300 data->num_id_nodes = num_id_nodes;
302 deg_invalidate_iterator_work_data(
data);
311 if (
data->next_object !=
nullptr) {
313 data->next_object =
nullptr;
316 if (deg_iterator_duplis_step(
data)) {
319 if (deg_iterator_objects_step(
data)) {
333 deg_invalidate_iterator_work_data(
data);
345 if (!
id_node->is_visible_on_build) {
353 if (
ntree ==
nullptr) {
380 data->id_node_index = 0;
381 data->num_id_nodes = num_id_nodes;
400 ++
data->id_node_index;
401 if (
data->id_node_index ==
data->num_id_nodes) {
408 }
while (iter->
skip);
struct ListBase * object_duplilist(struct Depsgraph *depsgraph, struct Scene *sce, struct Object *ob)
void free_object_duplilist(struct ListBase *lb)
void IDP_FreeProperty(struct IDProperty *prop)
struct bNodeTree * ntreeFromID(struct ID *id)
General operations, lookup, etc. for blender objects.
void BKE_object_replace_data_on_shallow_copy(struct Object *ob, struct ID *new_data)
int BKE_object_visibility(const struct Object *ob, int dag_eval_mode)
bool invert_m4_m4(float R[4][4], const float A[4][4])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
bool is_negative_m4(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)
struct Depsgraph Depsgraph
eEvaluationMode DEG_get_mode(const Depsgraph *graph)
bool DEG_id_type_any_updated(const struct Depsgraph *depsgraph)
struct Object * DEG_get_original_object(struct Object *object)
@ 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
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
const Depsgraph * depsgraph
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_objects_next(BLI_Iterator *iter)
void DEG_iterator_ids_next(BLI_Iterator *iter)
void DEG_iterator_ids_end(BLI_Iterator *UNUSED(iter))
static void DEG_iterator_ids_step(BLI_Iterator *iter, deg::IDNode *id_node, bool only_updated)
SyclQueue void void size_t num_bytes void
void(* MEM_freeN)(void *vmemh)
bool deg_validate_copy_on_write_datablock(ID *id_cow)
@ DEG_ID_LINKED_INDIRECTLY
unsigned short local_collections_bits
struct GeometrySet * geometry_set_eval
unsigned short base_local_view_bits
eDepsNode_LinkedState_Type linked_state