diff options
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 |