#-----------------------------------------------------------------------------------------------------------# | |
# CR Animation Nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/CR-Animation-Nodes | |
# for ComfyUI https://github.com/comfyanonymous/ComfyUI | |
#-----------------------------------------------------------------------------------------------------------# | |
#-----------------------------------------------------------------------------------------------------------# | |
# FUNCTIONS | |
#-----------------------------------------------------------------------------------------------------------# | |
def keyframe_scheduler(schedule, schedule_alias, current_frame): | |
# Initialise | |
schedule_lines = list() | |
previous_params = "" | |
# Loop through the schedule to find lines with matching schedule_alias | |
for item in schedule: | |
alias = item[0] | |
if alias == schedule_alias: | |
schedule_lines.extend([(item)]) | |
# Loop through the filtered lines | |
for i, item in enumerate(schedule_lines): | |
# Get alias and schedule line | |
alias, line = item | |
# Skip empty lines | |
if not line.strip(): | |
print(f"[Warning] Skipped blank line at line {i}") | |
continue | |
# Get parameters from the tuples | |
frame_str, params = line.split(',', 1) | |
frame = int(frame_str) | |
# Strip spaces at start of params | |
params = params.lstrip() | |
# Return the params | |
if frame < current_frame: | |
previous_params = params | |
continue | |
if frame == current_frame: | |
previous_params = params | |
else: | |
params = previous_params | |
return params | |
# Continue using the final params after the last schedule line has been evaluated | |
return previous_params | |
def prompt_scheduler(schedule, schedule_alias, current_frame): | |
# Initialise | |
schedule_lines = list() | |
previous_prompt = "" | |
previous_keyframe = 0 | |
#print(schedule, schedule_alias, current_frame) | |
# Loop through the schedule to find lines with matching schedule_alias | |
for item in schedule: | |
alias = item[0] | |
if alias == schedule_alias: | |
schedule_lines.extend([(item)]) | |
# Loop through the filtered lines | |
for i, item in enumerate(schedule_lines): | |
# Get alias and schedule line | |
alias, line = item | |
# Get parameters from the tuples | |
frame_str, prompt = line.split(',', 1) | |
frame_str = frame_str.strip('\"') | |
frame = int(frame_str) | |
# Strip leading spaces and quotes | |
prompt = prompt.lstrip() | |
prompt = prompt.replace('"', '') | |
# Return the parameters | |
if frame < current_frame: | |
previous_prompt = prompt | |
previous_keyframe = frame | |
#print(f"[Debug] frame < current_frame, frame {frame}, current frame {current_frame}") | |
#print(f"[Debug] frame < current_frame, prompt {prompt}") | |
continue | |
if frame == current_frame: | |
next_prompt = prompt | |
next_keyframe = frame | |
previous_prompt = prompt | |
previous_keyframe = frame | |
#print(f"[Debug] frame = current_frame, frame {frame}, current frame {current_frame}, next keyframe {next_keyframe}") | |
#print(f"[Debug] frame = current_frame, prompt {prompt}") | |
else: | |
next_prompt = prompt | |
next_keyframe = frame | |
prompt = previous_prompt | |
#print(f"[Debug] frame > current_frame, frame {frame}, current frame {current_frame}, next keyframe {next_keyframe}") | |
#print(f"[Debug] frame > current_frame, next prompt {next_prompt}") | |
return prompt, next_prompt, previous_keyframe, next_keyframe | |
# Continue using the final params after the last schedule line has been evaluated | |
return previous_prompt, previous_prompt, previous_keyframe, previous_keyframe |