[Bf-blender-cvs] [37e08e526c6] blender-v2.83-release: Depsgraph: Add IDProperties handling.

Bastien Montagne noreply at git.blender.org
Tue Apr 28 15:33:48 CEST 2020


Commit: 37e08e526c6fef7d0a4fc359bc4b7e665d012119
Author: Bastien Montagne
Date:   Tue Apr 28 11:45:57 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rB37e08e526c6fef7d0a4fc359bc4b7e665d012119

Depsgraph: Add IDProperties handling.

Fix T75279: BLI_assert failed when deleting object in debug build
(only).

And all general cases of ID pointer idproperties that would use a
data-block not referenced anywhere else in the depsgraph.

This includes idproperties from:
* All ID types;
* Bones and pose bones;
* Sequences;
* Nodes and sockets.

Differential Revision: https://developer.blender.org/D7551

===================================================================

M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.h
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.h
M	source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc

===================================================================

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 0adea027ecc..f6834feeeae 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -77,6 +77,7 @@ extern "C" {
 #include "BKE_fcurve.h"
 #include "BKE_gpencil.h"
 #include "BKE_gpencil_modifier.h"
+#include "BKE_idprop.h"
 #include "BKE_idtype.h"
 #include "BKE_image.h"
 #include "BKE_key.h"
@@ -488,6 +489,18 @@ void DepsgraphNodeBuilder::build_id(ID *id)
   }
 }
 
+static void build_idproperties_callback(IDProperty *id_property, void *user_data)
+{
+  DepsgraphNodeBuilder *builder = reinterpret_cast<DepsgraphNodeBuilder *>(user_data);
+  BLI_assert(id_property->type == IDP_ID);
+  builder->build_id(reinterpret_cast<ID *>(id_property->data.pointer));
+}
+
+void DepsgraphNodeBuilder::build_idproperties(IDProperty *id_property)
+{
+  IDP_foreach_property(id_property, IDP_TYPE_FILTER_ID, build_idproperties_callback, this);
+}
+
 void DepsgraphNodeBuilder::build_collection(LayerCollection *from_layer_collection,
                                             Collection *collection)
 {
@@ -517,6 +530,8 @@ void DepsgraphNodeBuilder::build_collection(LayerCollection *from_layer_collecti
     /* Collection itself. */
     id_node = add_id_node(&collection->id);
     id_node->is_directly_visible = is_collection_visible;
+
+    build_idproperties(collection->id.properties);
   }
   if (from_layer_collection != nullptr) {
     /* If we came from layer collection we don't go deeper, view layer
@@ -629,6 +644,7 @@ void DepsgraphNodeBuilder::build_object(int base_index,
   /* Parameters, used by both drivers/animation and also to inform dependency
    * from object's data. */
   build_parameters(&object->id);
+  build_idproperties(object->id.properties);
   /* Build animation data,
    *
    * Do it now because it's possible object data will affect
@@ -943,6 +959,7 @@ void DepsgraphNodeBuilder::build_action(bAction *action)
   if (built_map_.checkIsBuiltAndTag(action)) {
     return;
   }
+  build_idproperties(action->id.properties);
   add_operation_node(&action->id, NodeType::ANIMATION, OperationCode::ANIMATION_EVAL);
 }
 
@@ -1048,6 +1065,7 @@ void DepsgraphNodeBuilder::build_world(World *world)
                      NodeType::SHADING,
                      OperationCode::WORLD_UPDATE,
                      function_bind(BKE_world_eval, _1, world_cow));
+  build_idproperties(world->id.properties);
   /* Animation. */
   build_animdata(&world->id);
   build_parameters(&world->id);
@@ -1230,6 +1248,7 @@ void DepsgraphNodeBuilder::build_shapekeys(Key *key)
   if (built_map_.checkIsBuiltAndTag(key)) {
     return;
   }
+  build_idproperties(key->id.properties);
   build_animdata(&key->id);
   build_parameters(&key->id);
   /* This is an exit operation for the entire key datablock, is what is used
@@ -1284,6 +1303,7 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata, bool
   /* Make sure we've got an ID node before requesting CoW pointer. */
   (void)add_id_node((ID *)obdata);
   ID *obdata_cow = get_cow_id(obdata);
+  build_idproperties(obdata->properties);
   /* Animation. */
   build_animdata(obdata);
   /* ShapeKeys */
@@ -1389,10 +1409,20 @@ void DepsgraphNodeBuilder::build_armature(bArmature *armature)
   if (built_map_.checkIsBuiltAndTag(armature)) {
     return;
   }
+  build_idproperties(armature->id.properties);
   build_animdata(&armature->id);
   build_parameters(&armature->id);
   /* Make sure pose is up-to-date with armature updates. */
   add_operation_node(&armature->id, NodeType::ARMATURE, OperationCode::ARMATURE_EVAL);
+  build_armature_bones(&armature->bonebase);
+}
+
+void DepsgraphNodeBuilder::build_armature_bones(ListBase *bones)
+{
+  LISTBASE_FOREACH (Bone *, bone, bones) {
+    build_idproperties(bone->prop);
+    build_armature_bones(&bone->childbase);
+  }
 }
 
 void DepsgraphNodeBuilder::build_camera(Camera *camera)
@@ -1400,6 +1430,7 @@ void DepsgraphNodeBuilder::build_camera(Camera *camera)
   if (built_map_.checkIsBuiltAndTag(camera)) {
     return;
   }
+  build_idproperties(camera->id.properties);
   build_animdata(&camera->id);
   build_parameters(&camera->id);
   if (camera->dof.focus_object != nullptr) {
@@ -1412,6 +1443,7 @@ void DepsgraphNodeBuilder::build_light(Light *lamp)
   if (built_map_.checkIsBuiltAndTag(lamp)) {
     return;
   }
+  build_idproperties(lamp->id.properties);
   build_animdata(&lamp->id);
   build_parameters(&lamp->id);
   /* light's nodetree */
@@ -1431,6 +1463,7 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
   bNodeTree *ntree_cow = get_cow_datablock(ntree);
   /* General parameters. */
   build_parameters(&ntree->id);
+  build_idproperties(ntree->id.properties);
   /* Animation, */
   build_animdata(&ntree->id);
   /* Shading update. */
@@ -1443,6 +1476,14 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
                      function_bind(BKE_nodetree_shading_params_eval, _1, ntree_cow, ntree));
   /* nodetree's nodes... */
   LISTBASE_FOREACH (bNode *, bnode, &ntree->nodes) {
+    build_idproperties(bnode->prop);
+    LISTBASE_FOREACH (bNodeSocket *, socket, &bnode->inputs) {
+      build_idproperties(socket->prop);
+    }
+    LISTBASE_FOREACH (bNodeSocket *, socket, &bnode->outputs) {
+      build_idproperties(socket->prop);
+    }
+
     ID *id = bnode->id;
     if (id == nullptr) {
       continue;
@@ -1491,6 +1532,13 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
     }
   }
 
+  LISTBASE_FOREACH (bNodeSocket *, socket, &ntree->inputs) {
+    build_idproperties(socket->prop);
+  }
+  LISTBASE_FOREACH (bNodeSocket *, socket, &ntree->outputs) {
+    build_idproperties(socket->prop);
+  }
+
   // TODO: link from nodetree to owner_component?
 }
 
@@ -1508,6 +1556,7 @@ void DepsgraphNodeBuilder::build_material(Material *material)
                      NodeType::SHADING,
                      OperationCode::MATERIAL_UPDATE,
                      function_bind(BKE_material_eval, _1, material_cow));
+  build_idproperties(material->id.properties);
   /* Material animation. */
   build_animdata(&material->id);
   build_parameters(&material->id);
@@ -1532,6 +1581,7 @@ void DepsgraphNodeBuilder::build_texture(Tex *texture)
     return;
   }
   /* Texture itself. */
+  build_idproperties(texture->id.properties);
   build_animdata(&texture->id);
   build_parameters(&texture->id);
   /* Texture's nodetree. */
@@ -1552,6 +1602,7 @@ void DepsgraphNodeBuilder::build_image(Image *image)
     return;
   }
   build_parameters(&image->id);
+  build_idproperties(image->id.properties);
   add_operation_node(
       &image->id, NodeType::GENERIC_DATABLOCK, OperationCode::GENERIC_DATABLOCK_UPDATE);
 }
@@ -1580,6 +1631,7 @@ void DepsgraphNodeBuilder::build_cachefile(CacheFile *cache_file)
   ID *cache_file_id = &cache_file->id;
   add_id_node(cache_file_id);
   CacheFile *cache_file_cow = get_cow_datablock(cache_file);
+  build_idproperties(cache_file_id->properties);
   /* Animation, */
   build_animdata(cache_file_id);
   build_parameters(cache_file_id);
@@ -1597,6 +1649,7 @@ void DepsgraphNodeBuilder::build_mask(Mask *mask)
   }
   ID *mask_id = &mask->id;
   Mask *mask_cow = (Mask *)ensure_cow_id(mask_id);
+  build_idproperties(mask->id.properties);
   /* F-Curve based animation. */
   build_animdata(mask_id);
   build_parameters(mask_id);
@@ -1633,6 +1686,7 @@ void DepsgraphNodeBuilder::build_freestyle_linestyle(FreestyleLineStyle *linesty
 
   ID *linestyle_id = &linestyle->id;
   build_parameters(linestyle_id);
+  build_idproperties(linestyle->id.properties);
   build_animdata(linestyle_id);
   build_nodetree(linestyle->nodetree);
 }
@@ -1644,6 +1698,7 @@ void DepsgraphNodeBuilder::build_movieclip(MovieClip *clip)
   }
   ID *clip_id = &clip->id;
   MovieClip *clip_cow = (MovieClip *)ensure_cow_id(clip_id);
+  build_idproperties(clip_id->properties);
   /* Animation. */
   build_animdata(clip_id);
   build_parameters(clip_id);
@@ -1666,6 +1721,7 @@ void DepsgraphNodeBuilder::build_lightprobe(LightProbe *probe)
   }
   /* Placeholder so we can add relations and tag ID node for update. */
   add_operation_node(&probe->id, NodeType::PARAMETERS, OperationCode::LIGHT_PROBE_EVAL);
+  build_idproperties(probe->id.properties);
   build_animdata(&probe->id);
   build_parameters(&probe->id);
 }
@@ -1677,6 +1733,7 @@ void DepsgraphNodeBuilder::build_speaker(Speaker *speaker)
   }
   /* Placeholder so we can add relations and tag ID node for update. */
   add_operation_node(&speaker->id, NodeType::AUDIO, OperationCode::SPEAKER_EVAL);
+  build_idproperties(speaker->id.properties);
   build_animdata(&speaker->id);
   build_parameters(&speaker->id);
   if (speaker->sound != nullptr) {
@@ -1695,6 +1752,7 @@ void DepsgraphNodeBuilder::build_sound(bSound *sound)
                      NodeType::AUDIO,
                      OperationCode::SOUND_EVAL,
                      function_bind(BKE_sound_evaluate, _1, bmain_, sound_cow));
+  build_idproperties(sound->id.properties);
   build_animdata(&sound->id);
   build_parameters(&sound->id);
 }
@@ -1713,6 +1771,7 @@ void DepsgraphNodeBuilder::build_scene_sequencer(Scene *scene)
   /* Make sure data for sequences is in the graph. */
   Sequence *seq;
   SEQ_BEGIN (scene->ed, seq) {
+    build_idproperties(seq->prop);
     if (seq->sound != nullptr) {
       build_sound(seq->sound);
     }
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 7fcc8b431e7..16beedabc2a 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -39,6 +39,7 @@ struct FreestyleLineSet;
 struct FreestyleLineStyle;
 struct GHash;
 struct ID;
+struct IDProperty;
 struct Image;
 struct Key;
 struct LayerCollection;
@@ -149,6 +150,8 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder {
 
   virtual void build_id(ID *id);
 
+  virtual void build_idproperties(IDProperty *id_property);
+
   virtual void build_scene_render(Scene *scene, ViewLayer *view

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list