Skip to content

Commit 3c1597f

Browse files
committed
Волна, gif работают
1 parent dbdd874 commit 3c1597f

File tree

1 file changed

+38
-19
lines changed

1 file changed

+38
-19
lines changed

renderer.py

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)