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
This commit is contained in:
Philipp Oeser 2021-08-26 15:45:00 +02:00
parent 84f826ff23
commit b18122451f
Notes: blender-bot 2023-02-14 07:53:51 +01:00
Referenced by issue #88449: Blender LTS: Maintenance Task 2.93
Referenced by issue #88449, Blender LTS: Maintenance Task 2.93
Referenced by issue #88433, Grease Pencil: Adding driver in Transform doesn't behave as expected during playback
4 changed files with 4 additions and 38 deletions

View File

@ -571,9 +571,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:
@ -604,9 +605,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:
@ -1852,22 +1850,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)) {

View File

@ -225,7 +225,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);

View File

@ -544,12 +544,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:
@ -573,9 +574,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:
@ -2609,18 +2607,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)) {

View File

@ -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);