diff --git a/__init__.py b/__init__.py index 4a04485..8cad062 100644 --- a/__init__.py +++ b/__init__.py @@ -4,6 +4,9 @@ logger = logging.getLogger("fl_fill_nodes") from . import routes +from .nodes.conditioning.FL_KreaReference import FL_KreaReference, FL_KreaReferenceGuider +from .nodes.ksamplers.FL_KsamplerSEG_Krea import FL_KsamplerSEG_Krea + # AI NODES from .nodes.ai.FL_Fal_Gemini_ImageEdit import FL_Fal_Gemini_ImageEdit from .nodes.ai.FL_Fal_GPTImage2_Edit import FL_Fal_GPTImage2_Edit @@ -43,6 +46,7 @@ from .nodes.api_tools.FL_API_ImageSaver import FL_API_ImageSaver # AUDIO NODES from .nodes.audio.FL_Audio_BPM_Analyzer import FL_Audio_BPM_Analyzer from .nodes.audio.FL_Audio_Beat_Prompt_Schedule import FL_Audio_Beat_Prompt_Schedule +from .nodes.audio.FL_Prompt_Reference_Library import FL_Prompt_Reference_Library from .nodes.audio.FL_Audio_Prompt_Envelope import FL_Audio_Beat_Prompt_Envelope, FL_Audio_Envelope_Prompt from .nodes.audio.FL_Audio_Beat_Visualizer import FL_Audio_Beat_Visualizer from .nodes.audio.FL_Audio_Crop import FL_Audio_Crop @@ -157,7 +161,7 @@ from .nodes.ksamplers.FL_KsamplerSigma import FL_KsamplerSigma from .nodes.ksamplers.FL_KsamplerSEG_Regions import FL_KsamplerSEG_Regions from .nodes.ksamplers.FL_KsamplerSEG_Captioner import FL_KsamplerSEG_Captioner from .nodes.ksamplers.FL_KsamplerSEG_Encoder import FL_KsamplerSEG_Encoder -from .nodes.ksamplers.FL_KsamplerSEG import FL_KsamplerSEG +from .nodes.ksamplers.FL_KsamplerSEG import FL_KsamplerSEG, FL_KsamplerSEGAdvanced from .nodes.ksamplers.FL_KsamplerSettings import FL_KsamplerSettings from .nodes.ksamplers.FL_SamplerStrings import FL_SamplerStrings from .nodes.ksamplers.FL_SchedulerStrings import FL_SchedulerStrings @@ -208,6 +212,7 @@ from .nodes.utility.FL_SD_Slices import FL_SDUltimate_Slices from .nodes.utility.FL_SeparateMasks import FL_SeparateMaskComponents from .nodes.utility.FL_ShowText import FL_ShowText from .nodes.utility.FL_StringToLoraName import FL_StringToLoraName +from .nodes.utility.FL_ModelDifferenceLoraSave import FL_ModelDifferenceLoraSave from .nodes.utility.FL_Switch import FL_Switch from .nodes.utility.FL_Switch_Big import FL_Switch_Big from .nodes.utility.FL_SystemCheck import FL_SystemCheck @@ -220,6 +225,15 @@ from .nodes.vfx.FL_Ascii import FL_Ascii from .nodes.vfx.FL_DepthBlur import FL_DepthBlur from .nodes.vfx.FL_Dither import FL_Dither from .nodes.vfx.FL_Glitch import FL_Glitch +from .nodes.vfx.FL_StreetScan import FL_ScanVideoDetections, FL_StreetScanComposite +from .nodes.vfx.FL_ScanAudioEdit import FL_ScanAudioEdit +from .nodes.vfx.FL_VoxelNormalRelief import FL_VoxelNormalRelief +from .nodes.vfx.FL_LayeredParallax import FL_ParallaxLayer, FL_LayeredParallax, FL_ParallaxDepthSources, FL_ParallaxStackFromBatch +from .nodes.vfx.FL_PosterLayers import FL_PosterLayerPlanner, FL_PosterLayers, FL_PosterLayerAsset, FL_PosterLayerStack +from .nodes.vfx.poster_layer_cache import PosterLayerCache +from comfy_execution.cache_provider import register_cache_provider + +from .nodes.vfx.FL_InteractiveScanFX import FL_InteractiveScanFX, FL_ScanAnalysis, FL_ScanVideoSection, FL_ScanVideoShots, FL_ScanAnalysisCollect from .nodes.vfx.FL_HalfTone import FL_HalftonePattern from .nodes.vfx.FL_HexagonalPattern import FL_HexagonalPattern from .nodes.vfx.FL_ImageCollage import FL_ImageCollage @@ -263,7 +277,12 @@ from .nodes.wip.FL_WanVideoContinuationBlender import FL_WanVideoContinuationBle from .nodes.wip.FL_ZImageControlNetPatch import FL_ZImageControlNetPatch from .nodes.wip.FL_LTXVMaskedICLoRAGuide import FL_LTXVMaskedICLoRAGuide +register_cache_provider(PosterLayerCache()) + NODE_CLASS_MAPPINGS = { + "FL_KreaReference": FL_KreaReference, + "FL_KreaReferenceGuider": FL_KreaReferenceGuider, + "FL_KsamplerSEG_Krea": FL_KsamplerSEG_Krea, "FL_SaveWebM": FL_SaveWebM, "FL_TextOverlayNode": FL_TextOverlayNode, "FL_ImageBlank": FL_ImageBlank, @@ -281,6 +300,23 @@ NODE_CLASS_MAPPINGS = { "FL_ImageAddNoise": FL_ImageAddNoise, "FL_WordFrequencyGraph": FL_WordFrequencyGraph, "FL_Glitch": FL_Glitch, + "FL_ScanVideoDetections": FL_ScanVideoDetections, + "FL_StreetScanComposite": FL_StreetScanComposite, + "FL_ScanAudioEdit": FL_ScanAudioEdit, + "FL_VoxelNormalRelief": FL_VoxelNormalRelief, + "FL_ParallaxLayer": FL_ParallaxLayer, + "FL_LayeredParallax": FL_LayeredParallax, + "FL_ParallaxDepthSources": FL_ParallaxDepthSources, + "FL_ParallaxStackFromBatch": FL_ParallaxStackFromBatch, + "FL_PosterLayerPlanner": FL_PosterLayerPlanner, + "FL_PosterLayers": FL_PosterLayers, + "FL_PosterLayerAsset": FL_PosterLayerAsset, + "FL_PosterLayerStack": FL_PosterLayerStack, + "FL_InteractiveScanFX": FL_InteractiveScanFX, + "FL_ScanAnalysis": FL_ScanAnalysis, + "FL_ScanVideoSection": FL_ScanVideoSection, + "FL_ScanVideoShots": FL_ScanVideoShots, + "FL_ScanAnalysisCollect": FL_ScanAnalysisCollect, "FL_Ripple": FL_Ripple, "FL_PixelSort": FL_PixelSort, "FL_HexagonalPattern": FL_HexagonalPattern, @@ -332,6 +368,7 @@ NODE_CLASS_MAPPINGS = { "FL_KsamplerSEG_Captioner": FL_KsamplerSEG_Captioner, "FL_KsamplerSEG_Encoder": FL_KsamplerSEG_Encoder, "FL_KsamplerSEG": FL_KsamplerSEG, + "FL_KsamplerSEGAdvanced": FL_KsamplerSEGAdvanced, "FL_FractalKSampler": FL_FractalKSampler, "FL_UpscaleModel": FL_UpscaleModel, "FL_SaveCSV": FL_SaveCSV, @@ -414,6 +451,7 @@ NODE_CLASS_MAPPINGS = { "FL_GPT_Text": FL_GPT_Text, "FL_GoogleCloudStorage": FL_GoogleCloudStorage, "FL_StringToLoraName": FL_StringToLoraName, + "FL_ModelDifferenceLoraSave": FL_ModelDifferenceLoraSave, "FL_Switch": FL_Switch, "FL_Switch_Big": FL_Switch_Big, "FL_PasteByMask": FL_PasteByMask, @@ -446,6 +484,7 @@ NODE_CLASS_MAPPINGS = { "FL_SaveRGBAAnimatedWebP": FL_SaveRGBAAnimatedWebP, "FL_Audio_BPM_Analyzer": FL_Audio_BPM_Analyzer, "FL_Audio_Beat_Prompt_Schedule": FL_Audio_Beat_Prompt_Schedule, + "FL_Prompt_Reference_Library": FL_Prompt_Reference_Library, "FL_Audio_Beat_Prompt_Envelope": FL_Audio_Beat_Prompt_Envelope, "FL_Audio_Envelope_Prompt": FL_Audio_Envelope_Prompt, "FL_Audio_Beat_Visualizer": FL_Audio_Beat_Visualizer, @@ -490,6 +529,15 @@ NODE_DISPLAY_NAME_MAPPINGS = { "FL_ImageAddNoise": "FL Image Add Noise", "FL_WordFrequencyGraph": "FL Word Frequency Graph", "FL_Glitch": "FL Glitch", + "FL_ScanVideoDetections": "FL Scan Video Detections", + "FL_StreetScanComposite": "FL Street Scan Composite", + "FL_ScanAudioEdit": "FL Scan Audio Edit", + "FL_VoxelNormalRelief": "FL Voxel Normal Relief", + "FL_ParallaxLayer": "FL Parallax Layer", + "FL_LayeredParallax": "FL Layered Parallax", + "FL_InteractiveScanFX": "FL Interactive Scan FX", + "FL_ScanAnalysis": "FL Scan Analysis", + "FL_ScanVideoSection": "FL Scan Video Section", "FL_Ripple": "FL Ripple", "FL_PixelSort": "FL PixelSort", "FL_HexagonalPattern": "FL Hexagonal Pattern", @@ -542,6 +590,8 @@ NODE_DISPLAY_NAME_MAPPINGS = { "FL_KsamplerSEG_Captioner": "FL KSampler SEG Captioner", "FL_KsamplerSEG_Encoder": "FL KSampler SEG Encoder", "FL_KsamplerSEG": "FL KSampler SEG", + "FL_KsamplerSEGAdvanced": "FL KSampler SEG Advanced", + "FL_KsamplerSEG_Krea": "FL KSampler SEG Krea", "FL_FractalKSampler": "FL Fractal KSampler", "FL_UpscaleModel": "FL Upscale Model", "FL_SaveCSV": "FL Save CSV", @@ -624,6 +674,7 @@ NODE_DISPLAY_NAME_MAPPINGS = { "FL_GPT_Text": "FL GPT Text", "FL_GoogleCloudStorage": "FL Google Cloud Storage Uploader", "FL_StringToLoraName": "FL String To Lora Name", + "FL_ModelDifferenceLoraSave": "FL Model Difference to LoRA", "FL_Switch": "FL Switch", "FL_Switch_Big": "FL Switch Big", "FL_PasteByMask": "FL Paste By Mask", @@ -658,6 +709,7 @@ NODE_DISPLAY_NAME_MAPPINGS = { "FL_SaveRGBAAnimatedWebP": "FL Save RGBA Animated WebP", "FL_Audio_BPM_Analyzer": "FL Audio BPM Analyzer", "FL_Audio_Beat_Prompt_Schedule": "FL Audio Beat Prompt Schedule", + "FL_Prompt_Reference_Library": "FL Prompt Reference Library", "FL_Audio_Beat_Prompt_Envelope": "FL Audio Beat Prompt Envelope", "FL_Audio_Envelope_Prompt": "FL Audio Envelope Prompt", "FL_Audio_Beat_Visualizer": "FL Audio Beat Visualizer", diff --git a/docs/beat-writer-references.md b/docs/beat-writer-references.md new file mode 100644 index 0000000..d8f836d --- /dev/null +++ b/docs/beat-writer-references.md @@ -0,0 +1,21 @@ +# Timeline references and storyboards + +All storyboards requested in one Writer response are submitted in one graph of independent asynchronous Nano nodes, without a local concurrency-count cap. Queue items still execute normally; provider throttling, request-size validation and shared batch completion affect actual speed. Large requests may spend credits simultaneously. There are no automatic paid retries. + +Timeline and moodboard images use local 256-pixel WebP thumbnails with cache revalidation. Originals load only in the image popup, alongside available generation metadata. Reroll/remove controls sit below each timeline image. Loading indicators distinguish thumbnail loading from queued/generating jobs; reduced-motion preferences are respected. Wheel gestures over reference cards zoom/pan the timeline normally. + +All sections requested in a Writer response share the same continuity brief and snapshot of checked moodboards. For stronger consistency, supply a clear character sheet and a style reference with explicit roles. Text alone cannot guarantee identical designs. Rerolls reuse the original brief and moodboard references; ask the Writer for new storyboards to use changed moodboard selections. A first generated master reference can be uploaded as a checked moodboard for subsequent sections; automatic master-reference generation is not implemented. + +Ask Beat Writer to generate storyboards for the selected sections. It writes chronological image prompts and queues official Nano Banana 2 Partner Node jobs in ComfyUI. Prefer 2×2 grids for sections up to six seconds, 3×3 for longer sections. + +Completed sheets are split into panels locally and assigned automatically. Active sheet thumbnails on timeline clips represent selected video references. If a section changes or attachment fails, its saved sheet remains visible as **not attached**, with a reason and an **Attach** button that uses no generation credits. **×** dismisses an unattached result without changing active references. Generated storyboards take precedence over reference assignments for the same section in one Writer response. Click a thumbnail to preview; **↻** generates a replacement. The old references remain active while a reroll runs. Generation and rerolls use ComfyUI credits without another approval dialog. + +Four moodboard slots accept uploads, drops and pasted images. Add an optional role and check **Use** to send that image to the Writer and Google's image-generation endpoint. Unchecked images stay local. Checked moodboards and chat attachments share the Writer's eight-image limit. + +The scheduler must connect directly to **FL MiniMax H3 Beat Shot Planner**. Storyboard generation connects **FL Prompt Reference Library** automatically and sets the planner's visual reference mode to **full**. Custom section references replace the planner's default media. The timeline soundtrack is unchanged. Panels are visual references, not exact timed keyframe constraints. + +The optional **Section references** inspector supports manual image, video and audio assignments. `` and `