diff options
author | Philipp Oeser <info@graphics-engineer.com> | 2021-08-26 16:45:00 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2021-09-06 10:36:36 +0300 |
commit | 333db02e5d9dfc059b67e372637f0b6b5b159cd9 (patch) | |
tree | b031a657e0a9fc55137b86a6d2424f8b8036195b | |
parent | f0b3b6710c6ae66121deb6d8fd5ee95194b1a643 (diff) |
Fix T88433: no greaspencil depsgraph evaluation with certain drivers
When the same stroke was used as a driver variable, this could make this
stroke already tagged as built in the course of building driver
variables (via `build_gpencil`), but then important stuff from
`build_object_data_geometry_datablock` could be missed later on (because
both of these funtions use `checkIsBuiltAndTag`). Most importantly,
setting up operations such as GEOMETRY_EVAL would be skipped entirely.
`build_object_data_geometry_datablock` seems to cover greasepencil just
fine (does the same as `build_gpencil` and more). Proposed solution is to
remove `build_gpencil` entirely. In `build_id` it would then also call
`build_object_data_geometry_datablock` for `ID_GD` IDs. Now the covered
types that _call_ `build_object_data_geometry_datablock` match exactly
to what is covered _inside_ `build_object_data_geometry_datablock`.
Think this "duplication" of functionality was just overseen in
rB66da2f537ae8 [`build_gpencil` existed long before and said commit made
greasepencil a real object with geometry and such].
thx @JacquesLucke for additional input!
Maniphest Tasks: T88433
Differential Revision: https://developer.blender.org/D12324
4 files changed, 4 insertions, 38 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index ec5037fb29c..930db0403ff 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -449,9 +449,10 @@ void DepsgraphNodeBuilder::build_id(ID *id) build_movieclip((MovieClip *)id); break; case ID_ME: - case ID_CU: case ID_MB: + case ID_CU: case ID_LT: + case ID_GD: case ID_HA: case ID_PT: case ID_VO: @@ -482,9 +483,6 @@ void DepsgraphNodeBuilder::build_id(ID *id) case ID_PA: build_particle_settings((ParticleSettings *)id); break; - case ID_GD: - build_gpencil((bGPdata *)id); - break; case ID_LI: case ID_IP: @@ -1712,22 +1710,6 @@ void DepsgraphNodeBuilder::build_image(Image *image) &image->id, NodeType::GENERIC_DATABLOCK, OperationCode::GENERIC_DATABLOCK_UPDATE); } -void DepsgraphNodeBuilder::build_gpencil(bGPdata *gpd) -{ - if (built_map_.checkIsBuiltAndTag(gpd)) { - return; - } - ID *gpd_id = &gpd->id; - - /* TODO(sergey): what about multiple users of same datablock? This should - * only get added once. */ - - /* The main reason Grease Pencil is included here is because the animation - * (and drivers) need to be hosted somewhere. */ - build_animdata(gpd_id); - build_parameters(gpd_id); -} - void DepsgraphNodeBuilder::build_cachefile(CacheFile *cache_file) { if (built_map_.checkIsBuiltAndTag(cache_file)) { diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index a7033c8c8f3..7bbe130e8ff 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -223,7 +223,6 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { virtual void build_texture(Tex *tex); virtual void build_image(Image *image); virtual void build_world(World *world); - virtual void build_gpencil(bGPdata *gpd); virtual void build_cachefile(CacheFile *cache_file); virtual void build_mask(Mask *mask); virtual void build_movieclip(MovieClip *clip); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 0f8b613f7ac..48143aef09b 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -543,12 +543,13 @@ void DepsgraphRelationBuilder::build_id(ID *id) build_movieclip((MovieClip *)id); break; case ID_ME: - case ID_CU: case ID_MB: + case ID_CU: case ID_LT: case ID_HA: case ID_PT: case ID_VO: + case ID_GD: build_object_data_geometry_datablock(id); break; case ID_SPK: @@ -572,9 +573,6 @@ void DepsgraphRelationBuilder::build_id(ID *id) case ID_PA: build_particle_settings((ParticleSettings *)id); break; - case ID_GD: - build_gpencil((bGPdata *)id); - break; case ID_LI: case ID_IP: @@ -2591,18 +2589,6 @@ void DepsgraphRelationBuilder::build_image(Image *image) build_parameters(&image->id); } -void DepsgraphRelationBuilder::build_gpencil(bGPdata *gpd) -{ - if (built_map_.checkIsBuiltAndTag(gpd)) { - return; - } - /* animation */ - build_animdata(&gpd->id); - build_parameters(&gpd->id); - - // TODO: parent object (when that feature is implemented) -} - void DepsgraphRelationBuilder::build_cachefile(CacheFile *cache_file) { if (built_map_.checkIsBuiltAndTag(cache_file)) { diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index 21d1d4b6268..1ad61c25305 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -286,7 +286,6 @@ class DepsgraphRelationBuilder : public DepsgraphBuilder { virtual void build_freestyle_linestyle(FreestyleLineStyle *linestyle); virtual void build_texture(Tex *tex); virtual void build_image(Image *image); - virtual void build_gpencil(bGPdata *gpd); virtual void build_cachefile(CacheFile *cache_file); virtual void build_mask(Mask *mask); virtual void build_movieclip(MovieClip *clip); |