From b03c8aed7cf5fa76fcc46397d8c7b05933368694 Mon Sep 17 00:00:00 2001 From: ryanontheinstide Date: Sun, 1 Sep 2024 09:34:47 -0400 Subject: [PATCH] improved wave response in EmanatingRings --- assets/help.png | Bin 0 -> 53075 bytes nodes/masks/flex_masks.py | 63 +++++++++++++++++++++++--------------- pyproject.toml | 2 +- readme.md | 5 +++ 4 files changed, 45 insertions(+), 25 deletions(-) create mode 100644 assets/help.png diff --git a/assets/help.png b/assets/help.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee3b9c3b31c122189a109796ef1125894614147 GIT binary patch literal 53075 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 literal 0 HcmV?d00001 diff --git a/nodes/masks/flex_masks.py b/nodes/masks/flex_masks.py index c519bd0..8355307 100644 --- a/nodes/masks/flex_masks.py +++ b/nodes/masks/flex_masks.py @@ -389,7 +389,7 @@ class FlexMaskWavePropagation(FlexMaskBase): class FlexMaskEmanatingRings(FlexMaskBase): @classmethod def INPUT_TYPES(cls): - cls.feature_threshold_default = 0.25 + cls.feature_threshold_default = 0.25 return { **super().INPUT_TYPES(), "required": { @@ -403,36 +403,53 @@ class FlexMaskEmanatingRings(FlexMaskBase): def __init__(self): super().__init__() - self.time = 0 + self.rings = [] def process_mask(self, mask: np.ndarray, feature_value: float, strength: float, num_rings: int, max_ring_width: float, wave_speed: float, feature_param: str, **kwargs) -> np.ndarray: - # Adjust parameters based on feature_value and feature_param - if feature_param in ["num_rings", "all"]: - adjusted_num_rings = max(1, int(num_rings * feature_value * strength)) - else: - adjusted_num_rings = num_rings - - if feature_param in ["ring_width", "all"]: - adjusted_max_ring_width = max_ring_width * feature_value * strength - else: - adjusted_max_ring_width = max_ring_width - - if feature_param in ["wave_speed", "all"]: - adjusted_wave_speed = wave_speed * feature_value * strength - else: - adjusted_wave_speed = wave_speed - + height, width = mask.shape distance = distance_transform_edt(1 - mask) max_distance = np.max(distance) normalized_distance = distance / max_distance + # Update existing rings + new_rings = [] + for ring in self.rings: + ring['progress'] += ring['wave_speed'] + if ring['progress'] < 1: + new_rings.append(ring) + self.rings = new_rings + + # Create new rings if feature_value > 0 + if feature_value > 0: + if feature_param in ["num_rings", "all"]: + adjusted_num_rings = max(1, int(num_rings * feature_value * strength)) + else: + adjusted_num_rings = num_rings + + if feature_param in ["ring_width", "all"]: + adjusted_max_ring_width = max_ring_width * feature_value * strength + else: + adjusted_max_ring_width = max_ring_width + + if feature_param in ["wave_speed", "all"]: + adjusted_wave_speed = wave_speed * feature_value * strength + else: + adjusted_wave_speed = wave_speed + + for i in range(adjusted_num_rings): + self.rings.append({ + 'progress': i / adjusted_num_rings, + 'ring_width': adjusted_max_ring_width, + 'wave_speed': adjusted_wave_speed + }) + # Create emanating rings rings = np.zeros_like(mask) - for i in range(adjusted_num_rings): - ring_progress = (self.time * adjusted_wave_speed + i / adjusted_num_rings) % 1 - ring_width = adjusted_max_ring_width * (1 - ring_progress) # Rings get thinner as they move out + for ring in self.rings: + ring_progress = ring['progress'] % 1 + ring_width = ring['ring_width'] * (1 - ring_progress) # Rings get thinner as they move out ring_outer = normalized_distance < ring_progress ring_inner = normalized_distance < (ring_progress - ring_width) rings = np.logical_or(rings, np.logical_xor(ring_outer, ring_inner)) @@ -440,17 +457,15 @@ class FlexMaskEmanatingRings(FlexMaskBase): # Combine with original mask result = np.logical_or(mask, rings).astype(np.float32) - self.time += 1 return result def process_mask_below_threshold(self, mask: np.ndarray, feature_value: float, strength: float, **kwargs) -> np.ndarray: - # Continue the animation don't create new rings + # Continue the animation but don't create new rings return self.process_mask(mask, 0, strength, **kwargs) def main_function(self, masks, feature, feature_pipe, strength, feature_threshold, invert, subtract_original, grow_with_blur, num_rings, max_ring_width, wave_speed, feature_param, **kwargs): - self.time = 0 # Reset time for each new feature input return (self.apply_mask_operation(masks, feature, feature_pipe, strength, feature_threshold, invert, subtract_original, grow_with_blur, num_rings=num_rings, diff --git a/pyproject.toml b/pyproject.toml index edb50ba..1ae9ce5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui_ryanonyheinside" description = "Custom nodes introducing particle simulations, optical flow, audio manipulation & reactivity, and temporal masks" -version = "1.5.0" +version = "1.5.1" license = {file = "LICENSE"} dependencies = ["opencv-python==4.10.0","scipy","pillow","librosa","pymunk==6.8.1","matplotlib","openunmix","mido"] diff --git a/readme.md b/readme.md index 373d7dd..e377d00 100644 --- a/readme.md +++ b/readme.md @@ -48,6 +48,11 @@ For a range of example and tutorial workflows showcasing the capabilities of thi [RyanOnTheInside Civitai Profile](https://civitai.com/user/RyanOnTheInside) +## ❓ Help and Documentation + +For detailed information on each and every node, click the ❓ icon present in the top-right corner of every node. + +![Help and Documentation](./assets/help.png) ## 🚀 Key Features Particles are now reactive!