Fix #118837: Time offset modifier not working as expected
The time offset modifier was working differently than in GPv2. This is because in the new implementation, the time offset modifier actually modifies the keyframe mappings. And thus the order of the modifiers, and where the time offset modifier is placed in the stack, matters. The problem is that this can lead to unexpected results like seeing unmodified drawings. Technically, the issue here is that other modifiers only modify the current frame as supposed to all drawings in the timeline. This is done as an optimization, but doesn't work when drawings can be shifted around on the timeline using the time offset modifier. The fix changes the way the modifiers are executed. Because the time offset modifier can only modify **when** the drawings are show, and not the drawing data themselves, we execute all the time offset modifiers first (in the order they appear in the stack) and then execute all the other modifiers after. This means that the user can no longer run into the issue of "moving" drawings away from the current frame where they can't be seen. It also makes time offset modifier behave the same as they did in GPv2. Pull Request: https://projects.blender.org/blender/blender/pulls/118842
This commit is contained in:
@@ -1368,11 +1368,32 @@ static void grease_pencil_evaluate_modifiers(Depsgraph *depsgraph,
|
||||
VirtualModifierData virtualModifierData;
|
||||
ModifierData *md = BKE_modifiers_get_virtual_modifierlist(object, &virtualModifierData);
|
||||
|
||||
/* Evaluate modifiers. */
|
||||
/* Evaluate time modifiers.
|
||||
* The time offset modifier can change what drawings are shown on the current frame. But it
|
||||
* doesn't affect the drawings data. Modifiers that modify the drawings data are only evaluated
|
||||
* for the current frame, so we run the time offset modifiers before all the other ones. */
|
||||
ModifierData *tmd = md;
|
||||
for (; tmd; tmd = tmd->next) {
|
||||
const ModifierTypeInfo *mti = BKE_modifier_get_info(ModifierType(tmd->type));
|
||||
|
||||
if (!BKE_modifier_is_enabled(scene, tmd, required_mode) ||
|
||||
ModifierType(tmd->type) != eModifierType_GreasePencilTime)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mti->modify_geometry_set != nullptr) {
|
||||
mti->modify_geometry_set(tmd, &mectx, &geometry_set);
|
||||
}
|
||||
}
|
||||
|
||||
/* Evaluate drawing modifiers. */
|
||||
for (; md; md = md->next) {
|
||||
const ModifierTypeInfo *mti = BKE_modifier_get_info(ModifierType(md->type));
|
||||
|
||||
if (!BKE_modifier_is_enabled(scene, md, required_mode)) {
|
||||
if (!BKE_modifier_is_enabled(scene, md, required_mode) ||
|
||||
ModifierType(md->type) == eModifierType_GreasePencilTime)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user