Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc36
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.h3
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc37
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.h3
-rw-r--r--source/blender/makesdna/DNA_ID.h3
5 files changed, 73 insertions, 9 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 2edd4ddf853..b0a5f1a34d6 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -388,7 +388,9 @@ void DepsgraphNodeBuilder::build_id(ID *id)
if (id == nullptr) {
return;
}
- switch (GS(id->name)) {
+
+ const ID_Type id_type = GS(id->name);
+ switch (id_type) {
case ID_AC:
build_action((bAction *)id);
break;
@@ -478,13 +480,39 @@ void DepsgraphNodeBuilder::build_id(ID *id)
case ID_SIM:
build_simulation((Simulation *)id);
break;
- default:
- fprintf(stderr, "Unhandled ID %s\n", id->name);
- BLI_assert(!"Should never happen");
+ case ID_PA:
+ build_particle_settings((ParticleSettings *)id);
+ break;
+ case ID_GD:
+ build_gpencil((bGPdata *)id);
+ break;
+
+ case ID_LI:
+ case ID_IP:
+ case ID_SCR:
+ case ID_VF:
+ case ID_BR:
+ case ID_WM:
+ case ID_PAL:
+ case ID_PC:
+ case ID_WS:
+ BLI_assert(!deg_copy_on_write_is_needed(id_type));
+ build_generic_id(id);
break;
}
}
+void DepsgraphNodeBuilder::build_generic_id(ID *id)
+{
+ if (built_map_.checkIsBuiltAndTag(id)) {
+ return;
+ }
+
+ build_idproperties(id->properties);
+ build_animdata(id);
+ build_parameters(id);
+}
+
static void build_idproperties_callback(IDProperty *id_property, void *user_data)
{
DepsgraphNodeBuilder *builder = reinterpret_cast<DepsgraphNodeBuilder *>(user_data);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 174f9b129f9..a7033c8c8f3 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -152,6 +152,9 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder {
virtual void build_id(ID *id);
+ /* Build function for ID types that do not need their own build_xxx() function. */
+ virtual void build_generic_id(ID *id);
+
virtual void build_idproperties(IDProperty *id_property);
virtual void build_scene_render(Scene *scene, ViewLayer *view_layer);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index ed78956e548..3c42f0f0612 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -491,7 +491,9 @@ void DepsgraphRelationBuilder::build_id(ID *id)
if (id == nullptr) {
return;
}
- switch (GS(id->name)) {
+
+ const ID_Type id_type = GS(id->name);
+ switch (id_type) {
case ID_AC:
build_action((bAction *)id);
break;
@@ -567,13 +569,40 @@ void DepsgraphRelationBuilder::build_id(ID *id)
case ID_SIM:
build_simulation((Simulation *)id);
break;
- default:
- fprintf(stderr, "Unhandled ID %s\n", id->name);
- BLI_assert(!"Should never happen");
+ case ID_PA:
+ build_particle_settings((ParticleSettings *)id);
+ break;
+ case ID_GD:
+ build_gpencil((bGPdata *)id);
+ break;
+
+ case ID_LI:
+ case ID_IP:
+ case ID_SCR:
+ case ID_VF:
+ case ID_BR:
+ case ID_WM:
+ case ID_PAL:
+ case ID_PC:
+ case ID_WS:
+ BLI_assert(!deg_copy_on_write_is_needed(id_type));
+ build_generic_id(id);
break;
}
}
+void DepsgraphRelationBuilder::build_generic_id(ID *id)
+{
+
+ if (built_map_.checkIsBuiltAndTag(id)) {
+ return;
+ }
+
+ build_idproperties(id->properties);
+ build_animdata(id);
+ build_parameters(id);
+}
+
static void build_idproperties_callback(IDProperty *id_property, void *user_data)
{
DepsgraphRelationBuilder *builder = reinterpret_cast<DepsgraphRelationBuilder *>(user_data);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index 5587379089c..21d1d4b6268 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -198,6 +198,9 @@ class DepsgraphRelationBuilder : public DepsgraphBuilder {
virtual void build_id(ID *id);
+ /* Build function for ID types that do not need their own build_xxx() function. */
+ virtual void build_generic_id(ID *id);
+
virtual void build_idproperties(IDProperty *id_property);
virtual void build_scene_render(Scene *scene, ViewLayer *view_layer);
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 51c47e917f1..263ce2203e9 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -526,7 +526,8 @@ typedef enum ID_Type {
#define ID_IS_ASSET(_id) (((const ID *)(_id))->asset_data != NULL)
/* Check whether datablock type is covered by copy-on-write. */
-#define ID_TYPE_IS_COW(_id_type) (!ELEM(_id_type, ID_BR, ID_PAL, ID_IM))
+#define ID_TYPE_IS_COW(_id_type) \
+ (!ELEM(_id_type, ID_LI, ID_IP, ID_SCR, ID_VF, ID_BR, ID_WM, ID_PAL, ID_PC, ID_WS, ID_IM))
#ifdef GS
# undef GS