From 0156cc8da6eab109fd195fc38189242ad0426278 Mon Sep 17 00:00:00 2001 From: jkjkil4 <1173374788@qq.com> Date: Thu, 27 Jun 2024 21:56:44 +0800 Subject: [PATCH] fix: incorrect time-range of render calls --- janim/anims/animation.py | 4 ++++ janim/anims/composition.py | 2 +- janim/anims/timeline.py | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/janim/anims/animation.py b/janim/anims/animation.py index ea36ed3..e7a4d1a 100644 --- a/janim/anims/animation.py +++ b/janim/anims/animation.py @@ -91,6 +91,10 @@ def get_alpha_on_global_t(self, global_t: float) -> float: anim_t = self.parent.get_anim_t(self.parent.get_alpha_on_global_t(global_t), self) return self.rate_func(anim_t / self.local_range.duration) + def is_visible(self, global_t: float) -> bool: + # + 1e-5 是为了避免在两端的浮点误差 + return self.global_range.at <= global_t + 1e-5 < self.global_range.end + global_t_ctx: ContextVar[float] = ContextVar('Animation.global_t_ctx') ''' 对该值进行设置,使得进行 :meth:`anim_on` 和 :meth:`render` 时不需要将 ``global_t`` 作为参数传递也能获取到 diff --git a/janim/anims/composition.py b/janim/anims/composition.py index 3182823..b162ccc 100644 --- a/janim/anims/composition.py +++ b/janim/anims/composition.py @@ -124,7 +124,7 @@ def anim_on_alpha(self, alpha: float) -> None: for anim in self.anims: anim_t = self.get_anim_t(alpha, anim) - if anim.global_range.at <= global_t < anim.global_range.end: + if anim.is_visible(global_t): anim.anim_on(anim_t) diff --git a/janim/anims/timeline.py b/janim/anims/timeline.py index 6b724ef..d376f03 100644 --- a/janim/anims/timeline.py +++ b/janim/anims/timeline.py @@ -235,7 +235,7 @@ def schedule(self, at: float, func: Callable, *args, **kwargs) -> None: 会在进度达到 ``at`` 时,对 ``func`` 进行调用, 可传入 ``*args`` 和 ``**kwargs`` ''' - rough_at = round(at, 4) # 防止因为精度误差使得本来计划更迟的任务被更早地执行了 + rough_at = round(at, 3) # 防止因为精度误差使得本来计划更迟的任务被更早地执行了 task = Timeline.ScheduledTask(rough_at, func, args, kwargs) insort(self.scheduled_tasks, task, key=lambda x: x.at) @@ -824,7 +824,7 @@ def render_all(self, ctx: mgl.Context) -> None: *[ anim.render_call_list for anim in self.flattened - if anim.render_call_list and anim.global_range.at <= self._time < anim.global_range.end + if anim.render_call_list and anim.is_visible(self._time) ], key=lambda x: x.depth, reverse=True