Organic Fill Animation πΏ
Watch a shape grow from a seed β an organic 'fill the mask' animation, fully parameterized
- image
- frames
Eden_OrganicFillAnimation turns an image into a video of a shape growing into being. It converts your image to a mask, drops one or more "seeds" on it, and animates the mask spreading outward from those seeds with organic, noise-driven growth - the effect looks like a liquid, a plant, or a stain slowly filling the shape. It's a procedural animation generator: no video model, no sampler, just a growth simulation producing frames.
How it works
The core is a cellular-growth simulation. Your image gets reduced to a threshold mask - pick color_channel (luminance, red, green, blue, or random) and a threshold_value (default 128), and pixels below the threshold count as "fillable area." A seed of seed_radius pixels is placed (position chosen by starting_position - center, corners, edges, or random - with position_randomness jittering it). Each step, the boundary pixels are tested against a noise field: a pixel grows only where the noise value exceeds growth_threshold. noise_low and noise_high define that noise field's range and are the main "how wild is the growth" knobs. island_connection_radius lets detached regions get connected back to the main blob; active_region_padding bounds how far the growth can wander.
The output is a frame sequence resampled to hit target_seconds at your fps, with a hold on the final frame (hold_final_frame_fraction) and optional loop (which plays the growth in reverse back to the start for a seamless cycle). num_seeds (1β10) grows from several points at once. invert_input flips which pixels are fillable.
Inputs you'll actually touch
- image (
IMAGE) - the input. - threshold_value, color_channel - what counts as fillable.
- growth_threshold + noise_low/noise_high - the organic feel.
- starting_position, num_seeds - where growth starts.
- target_seconds, fps, loop - the video's shape.
Output: frames (IMAGE, a batch of frames ready for a video encode).
Where it fits
It's a VFX gadget for animated transitions and generative-video scaffolding. Feed it a logo mask and you get an organic logo-reveal. Feed it a depth-based mask and you get a fill animation that pairs with image-to-video. It slots in front of a video encoder, or the frames can be fed back into ComfyUI as a conditioning reference. It's niche, and honestly that's fine - it does one distinctive thing well and it's GPU-cheap (CPU simulation, mostly torch tensor ops).
Installing it
Part of the Eden.art nodesuite. Install via ComfyUI Manager (search "Eden.art nodesuite") or git clone https://github.com/edenartlab/eden_comfy_pipelines into custom_nodes/, then pip install -r requirements.txt and restart.
Common issues
Growth can stall if growth_threshold is too high - the simulation just stops filling. If a run finishes instantly with a mostly-empty result, drop growth_threshold. The noise range defaults (0.0β1.2) are a safe starting band. And remember: this generates frames, not a video file - you still need a video-save/encode node downstream, and long durations at high fps produce a lot of frames to hold in memory.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Shape image; dark pixels (below threshold_value) are the region that gets filled. | |
| target_seconds | FLOAT | 5.00.5β120 | Output duration; frames = target_seconds * fps. |
| target_size | INT | 51264β2048 | Longest side of the simulation (and output) resolution. |
| threshold_value | INT | 1281β254 | Pixels darker than this (0-255) belong to the fillable shape. |
| seed_radius | INT | 51β50 | Radius in pixels of each starting seed. |
| growth_threshold | FLOAT | 0.500β1 | A boundary pixel grows when its noise exceeds this. Higher = slower, more ragged growth. |
| noise_low | FLOAT | 0.00β2 | Lower bound of the per-pixel growth noise. |
| noise_high | FLOAT | 1.20β3 | Upper bound of the per-pixel growth noise. |
| starting_position | COMBO | center | Region of the shape where the (single) seed is placed. |
| position_randomness | FLOAT | 0.000β1 | 0 = seed at the region's center, 1 = at a random pixel of the region. |
| island_connection_radius | FLOAT | 0.00050β0.05 | Closes small gaps between shape islands (fraction of image size) so growth can cross them. |
| active_region_padding | INT | 30β20 | Pixels around recently grown areas that stay eligible for growth. |
| fps | FLOAT | 241β60 | Frames per second of the output. |
| num_seeds | INT | 11β10 | Number of seeds; more than one are placed on a circle around the center. |
| invert_input | BOOLEAN | false | Fill the light areas instead of the dark ones. |
| loop | BOOLEAN | true | Append a hold and an un-fill so the clip loops. |
| hold_final_frame_fraction | FLOAT | 0.250β2 | When looping: how long to hold the filled frame, relative to the fill duration. |
| color_channel | COMBO | luminance | Which channel of the image is thresholded. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | Fill animation frames (white = filled). |