@@ -100,7 +100,7 @@ def __init__(self, width=700, height=700, fps=60):
100100 self .wave_frequency = 0.5 # Частота волн
101101 self .wave_speed = 1.0 # Скорость анимации
102102
103- # Предрассчитанные кадры искажения (4 варианта)
103+ # Предрассчитанные кадры искажения (4 варианта) - только для статичных изображений
104104 self ._wave_frames_cache = {} # Ключ: (layer_name, frame_index)
105105 self ._current_wave_frame = 0
106106 self ._wave_frame_timer = 0
@@ -159,6 +159,7 @@ def load_model(self, model_json, model_dir):
159159 self ._gif_frame_times .clear ()
160160 self ._gif_current_frame .clear ()
161161 self ._gif_last_update .clear ()
162+ self ._wave_frames_cache .clear ()
162163
163164 # Загружаем слои с уникальными именами
164165 self .layers_by_name = {}
@@ -316,7 +317,7 @@ def load_model(self, model_json, model_dir):
316317 self .group_blink_timers [name ] = time .time () + random .uniform (0.5 , 2.0 )
317318 self .group_blink_until [name ] = 0.0
318319
319- # Предрассчитываем кадры эффекта "Волна" для каждого слоя (4 кадра)
320+ # Предрассчитываем кадры эффекта "Волна" только для статичных изображений
320321 if self .wave_enabled :
321322 self ._precalculate_wave_frames ()
322323
@@ -602,7 +603,7 @@ def _create_wave_effect(self, image, frame_index):
602603 return image
603604
604605 def _precalculate_wave_frames (self ):
605- """Предрассчитывает 4 кадра эффекта 'Волна' для каждого слоя """
606+ """Предрассчитывает 4 кадра эффекта 'Волна' для статичных слоев """
606607 self ._wave_frames_cache .clear ()
607608 now = time .time ()
608609 self ._wave_last_update = now
@@ -611,14 +612,18 @@ def _precalculate_wave_frames(self):
611612 if original_image is None :
612613 continue
613614
614- # Создаем 4 варианта искажения
615+ # Пропускаем GIF-изображения, они будут обрабатываться в реальном времени
616+ if unique_name in self ._gif_frames :
617+ continue
618+
619+ # Создаем 4 варианта искажения для статичных изображений
615620 for frame_idx in range (4 ):
616621 cache_key = (unique_name , frame_idx )
617622 distorted_img = self ._create_wave_effect (original_image .copy (), frame_idx )
618623 if distorted_img :
619624 self ._wave_frames_cache [cache_key ] = distorted_img
620625
621- logger .info (f"Precalculated { len (self ._wave_frames_cache )} wave frames" )
626+ logger .info (f"Precalculated { len (self ._wave_frames_cache )} wave frames for static images " )
622627
623628 def _render_frame_cpu (self ):
624629 """Рендеринг кадра на CPU"""
@@ -635,25 +640,39 @@ def _render_frame_cpu(self):
635640 self ._wave_frame_timer = now
636641
637642 for unique_name in visible_layers :
638- # Получаем изображение с учетом эффекта "Волна"
639- if self .wave_enabled :
640- cache_key = (unique_name , self ._current_wave_frame )
641- if cache_key in self ._wave_frames_cache :
642- image = self ._wave_frames_cache [cache_key ]
643- else :
644- # Если нет в кэше, используем оригинальное
645- image = self ._get_layer_image (unique_name )
646- else :
647- # Когда волна выключена, всегда используем оригинальное изображение
648- image = self ._get_layer_image (unique_name )
649-
650- if not image :
643+ # Получаем оригинальное изображение (для GIF - текущий кадр)
644+ original_image = self ._get_layer_image (unique_name )
645+ if not original_image :
651646 continue
652647
653648 layer_data = self .layers_by_name .get (unique_name )
654649 if not layer_data :
655650 continue
656651
652+ # Применяем эффект волны если он включен
653+ if self .wave_enabled :
654+ # Проверяем, является ли изображение GIF
655+ is_gif = unique_name in self ._gif_frames
656+
657+ if is_gif :
658+ # Для GIF применяем эффект волны к текущему кадру в реальном времени
659+ image = self ._create_wave_effect (original_image .copy (), self ._current_wave_frame )
660+ else :
661+ # Для статичных изображений используем кэш
662+ cache_key = (unique_name , self ._current_wave_frame )
663+ if cache_key in self ._wave_frames_cache :
664+ image = self ._wave_frames_cache [cache_key ]
665+ else :
666+ # Если нет в кэше, создаем новый
667+ image = self ._create_wave_effect (original_image .copy (), self ._current_wave_frame )
668+ self ._wave_frames_cache [cache_key ] = image
669+ else :
670+ # Когда волна выключена, используем оригинальное изображение
671+ image = original_image
672+
673+ if not image :
674+ continue
675+
657676 # Применяем прозрачность слоя
658677 alpha = layer_data .get ('alpha' , 1.0 )
659678 if alpha < 1.0 :
@@ -776,4 +795,4 @@ def set_wave(self, enabled, amplitude=3.0, frequency=0.5, speed=1.0):
776795 self ._render_cache = None
777796 self ._visible_layers_cache_time = 0 # Сбрасываем кэш видимых слоев
778797
779- logger .info (f"Wave effect: enabled={ enabled } , amplitude={ amplitude } " )
798+ logger .info (f"Wave effect: enabled={ enabled } , amplitude={ amplitude } , frequency= { frequency } , speed= { speed } " )
0 commit comments