116 lines
5.6 KiB
Markdown
116 lines
5.6 KiB
Markdown
---
|
|
tags:
|
|
- AnimationScheduling
|
|
- Frame
|
|
- Keyframe
|
|
---
|
|
|
|
# Timestep Keyframe 🛂🅐🅒🅝
|
|
## Documentation
|
|
- Class name: `TimestepKeyframe`
|
|
- Category: `Adv-ControlNet 🛂🅐🅒🅝/keyframes`
|
|
- Output node: `False`
|
|
|
|
The TimestepKeyframe node is designed to encapsulate the concept of a keyframe within a timeline, specifying the start percentage, strength, and optional control weights, latent keyframes, and mask hints. It serves as a foundational element for defining and manipulating keyframes in advanced control networks, enabling precise control over the animation or transformation process.
|
|
## Input types
|
|
### Required
|
|
- **`start_percent`**
|
|
- Specifies the starting point of the keyframe as a percentage of the total timeline, allowing for precise positioning within the sequence.
|
|
- Comfy dtype: `FLOAT`
|
|
- Python dtype: `float`
|
|
### Optional
|
|
- **`prev_timestep_kf`**
|
|
- References a previous timestep keyframe, enabling the chaining or sequencing of keyframes over time.
|
|
- Comfy dtype: `TIMESTEP_KEYFRAME`
|
|
- Python dtype: `TimestepKeyframeGroup`
|
|
- **`strength`**
|
|
- Determines the influence or intensity of the keyframe, enabling the modulation of effects or transformations applied at this point in the timeline.
|
|
- Comfy dtype: `FLOAT`
|
|
- Python dtype: `float`
|
|
- **`cn_weights`**
|
|
- Optional control weights that can be applied to the keyframe, providing additional control over the effects or transformations.
|
|
- Comfy dtype: `CONTROL_NET_WEIGHTS`
|
|
- Python dtype: `ControlWeights`
|
|
- **`latent_keyframe`**
|
|
- Optional latent keyframes that can be associated with this keyframe, allowing for complex transformations or animations.
|
|
- Comfy dtype: `LATENT_KEYFRAME`
|
|
- Python dtype: `LatentKeyframeGroup`
|
|
- **`null_latent_kf_strength`**
|
|
- Specifies the strength of a null or default latent keyframe, used when no specific latent keyframe is provided.
|
|
- Comfy dtype: `FLOAT`
|
|
- Python dtype: `float`
|
|
- **`inherit_missing`**
|
|
- A boolean flag indicating whether missing attributes should be inherited from previous keyframes, ensuring continuity in the animation or transformation process.
|
|
- Comfy dtype: `BOOLEAN`
|
|
- Python dtype: `bool`
|
|
- **`guarantee_usage`**
|
|
- A boolean flag that guarantees the usage of this keyframe, ensuring it is considered in the animation or transformation process.
|
|
- Comfy dtype: `BOOLEAN`
|
|
- Python dtype: `bool`
|
|
- **`mask_optional`**
|
|
- Optional mask hints that can be associated with the keyframe, providing additional control over the areas affected by the transformations.
|
|
- Comfy dtype: `MASK`
|
|
- Python dtype: `Tensor`
|
|
## Output types
|
|
- **`TIMESTEP_KF`**
|
|
- Comfy dtype: `TIMESTEP_KEYFRAME`
|
|
- Returns a modified or new timestep keyframe, incorporating the specified parameters and potentially adding it to a sequence of keyframes.
|
|
- Python dtype: `TimestepKeyframeGroup`
|
|
## Usage tips
|
|
- Infra type: `CPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
class TimestepKeyframeNode:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {
|
|
"required": {
|
|
"start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}, ),
|
|
},
|
|
"optional": {
|
|
"prev_timestep_kf": ("TIMESTEP_KEYFRAME", ),
|
|
"strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}, ),
|
|
"cn_weights": ("CONTROL_NET_WEIGHTS", ),
|
|
"latent_keyframe": ("LATENT_KEYFRAME", ),
|
|
"null_latent_kf_strength": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 10.0, "step": 0.001}, ),
|
|
"inherit_missing": ("BOOLEAN", {"default": True}, ),
|
|
"guarantee_usage": ("BOOLEAN", {"default": True}, ),
|
|
"mask_optional": ("MASK", ),
|
|
#"interpolation": ([SI.LINEAR, SI.EASE_IN, SI.EASE_OUT, SI.EASE_IN_OUT, SI.NONE], {"default": SI.NONE}, ),
|
|
}
|
|
}
|
|
|
|
RETURN_NAMES = ("TIMESTEP_KF", )
|
|
RETURN_TYPES = ("TIMESTEP_KEYFRAME", )
|
|
FUNCTION = "load_keyframe"
|
|
|
|
CATEGORY = "Adv-ControlNet 🛂🅐🅒🅝/keyframes"
|
|
|
|
def load_keyframe(self,
|
|
start_percent: float,
|
|
strength: float=1.0,
|
|
cn_weights: ControlWeights=None, control_net_weights: ControlWeights=None, # old name
|
|
latent_keyframe: LatentKeyframeGroup=None,
|
|
prev_timestep_kf: TimestepKeyframeGroup=None, prev_timestep_keyframe: TimestepKeyframeGroup=None, # old name
|
|
null_latent_kf_strength: float=0.0,
|
|
inherit_missing=True,
|
|
guarantee_usage=True,
|
|
mask_optional=None,
|
|
interpolation: str=SI.NONE,):
|
|
control_net_weights = control_net_weights if control_net_weights else cn_weights
|
|
prev_timestep_keyframe = prev_timestep_keyframe if prev_timestep_keyframe else prev_timestep_kf
|
|
if not prev_timestep_keyframe:
|
|
prev_timestep_keyframe = TimestepKeyframeGroup()
|
|
else:
|
|
prev_timestep_keyframe = prev_timestep_keyframe.clone()
|
|
keyframe = TimestepKeyframe(start_percent=start_percent, strength=strength, interpolation=interpolation, null_latent_kf_strength=null_latent_kf_strength,
|
|
control_weights=control_net_weights, latent_keyframes=latent_keyframe, inherit_missing=inherit_missing, guarantee_usage=guarantee_usage,
|
|
mask_hint_orig=mask_optional)
|
|
prev_timestep_keyframe.add(keyframe)
|
|
return (prev_timestep_keyframe,)
|
|
|
|
```
|