From cd0fde0f55baf27e89ef3f00fa71616518348ff0 Mon Sep 17 00:00:00 2001 From: space-nuko <24979496+space-nuko@users.noreply.github.com> Date: Tue, 25 Apr 2023 06:26:40 -0700 Subject: [PATCH] Randomize seed in a hackish way --- src/lib/api.ts | 2 +- src/lib/components/ComfyApp.ts | 8 ++++++- src/lib/nodes/ComfyGraphNode.ts | 1 + src/lib/nodes/ComfyKSamplerNodes.ts | 34 +++++++++++++++++++++++++++++ src/lib/nodes/index.ts | 1 + src/lib/stores/widgetState.ts | 17 ++++++++++++--- src/lib/widgets/ComfyWidget.ts | 2 +- src/lib/widgets/RangeWidget.svelte | 11 ++++++---- 8 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 src/lib/nodes/ComfyKSamplerNodes.ts diff --git a/src/lib/api.ts b/src/lib/api.ts index 442d0fa..ebe2b52 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -116,7 +116,7 @@ export default class ComfyAPI extends EventTarget { this.dispatchEvent(new CustomEvent("progress", { detail: msg.data })); break; case "executing": - this.dispatchEvent(new CustomEvent("executing", { detail: msg.data.node })); + this.dispatchEvent(new CustomEvent("executing", { detail: msg.data })); break; case "executed": this.dispatchEvent(new CustomEvent("executed", { detail: msg.data })); diff --git a/src/lib/components/ComfyApp.ts b/src/lib/components/ComfyApp.ts index cd25a37..7d85b31 100644 --- a/src/lib/components/ComfyApp.ts +++ b/src/lib/components/ComfyApp.ts @@ -206,6 +206,8 @@ export default class ComfyApp { private registerNodeTypeOverrides() { ComfyApp.node_type_overrides["SaveImage"] = nodes.ComfySaveImageNode; ComfyApp.node_type_overrides["PreviewImage"] = nodes.ComfyPreviewImageNode; + ComfyApp.node_type_overrides["KSampler"] = nodes.ComfyKSamplerNode; + ComfyApp.node_type_overrides["KSamplerAdvanced"] = nodes.ComfyKSamplerAdvancedNode; } private registerWidgetTypeOverrides() { @@ -386,7 +388,11 @@ export default class ComfyApp { }); this.api.addEventListener("executing", ({ detail }: CustomEvent) => { - queueState.executingUpdated(detail); + queueState.executingUpdated(detail.node); + const node = this.lGraph.getNodeById(detail.node) as ComfyGraphNode; + if (node?.onExecuting) { + node.onExecuting(); + } this.lGraph.setDirtyCanvas(true, false); }); diff --git a/src/lib/nodes/ComfyGraphNode.ts b/src/lib/nodes/ComfyGraphNode.ts index b754e03..f6838f6 100644 --- a/src/lib/nodes/ComfyGraphNode.ts +++ b/src/lib/nodes/ComfyGraphNode.ts @@ -10,5 +10,6 @@ export default class ComfyGraphNode extends LGraphNode { */ virtualWidgets: ComfyWidget[] = []; + onExecuting?(): void; onExecuted?(output: any): void; } diff --git a/src/lib/nodes/ComfyKSamplerNodes.ts b/src/lib/nodes/ComfyKSamplerNodes.ts new file mode 100644 index 0000000..84e10e1 --- /dev/null +++ b/src/lib/nodes/ComfyKSamplerNodes.ts @@ -0,0 +1,34 @@ +import { get } from 'svelte/store'; +import ComfyGraphNode from "./ComfyGraphNode"; +import widgetState from "$lib/stores/widgetState" + +/* + * Autorefreshes seed (until bangs/main inlets are implemented) + */ +class ComfyBaseKSamplerNode extends ComfyGraphNode { + constructor(title?: any) { + super(title) + } + + override onExecuting() { + console.log(this); + const widget = widgetState.findWidgetByName(this.id, "seed") + if (!widget) + return; + + // TODO cleanup&remove + let min = widget.widget.options.min; + let max = widget.widget.options.max; + // limit to something that javascript can handle + max = Math.min(1125899906842624, max); + min = Math.max(-1125899906842624, min); + const range = (max - min) / (widget.widget.options.step); + const v = Math.floor(Math.floor(Math.random() * range) * (widget.widget.options.step) + min); + + widget.widget.value = v; + widgetState.widgetStateChanged(this.id, widget.widget); + } +} + +export class ComfyKSamplerNode extends ComfyBaseKSamplerNode {} +export class ComfyKSamplerAdvancedNode extends ComfyBaseKSamplerNode {} diff --git a/src/lib/nodes/index.ts b/src/lib/nodes/index.ts index e355079..bab1b7d 100644 --- a/src/lib/nodes/index.ts +++ b/src/lib/nodes/index.ts @@ -1,2 +1,3 @@ export { default as ComfyReroute } from "./ComfyReroute" export { ComfySaveImageNode, ComfyPreviewImageNode } from "./ComfyImageNodes" +export { ComfyKSamplerNode, ComfyKSamplerAdvancedNode } from "./ComfyKSamplerNodes" diff --git a/src/lib/stores/widgetState.ts b/src/lib/stores/widgetState.ts index 8540a8f..45d4da4 100644 --- a/src/lib/stores/widgetState.ts +++ b/src/lib/stores/widgetState.ts @@ -34,7 +34,8 @@ type WidgetStateOps = { nodeAdded: (node: LGraphNode) => void, nodeRemoved: (node: LGraphNode) => void, configureFinished: (graph: LGraph) => void, - widgetStateChanged: (widget: ComfyWidget) => void, + widgetStateChanged: (nodeId: number, widget: IWidget) => void, + findWidgetByName: (nodeId: number, name: string) => WidgetUIState | null, clear: () => void, } @@ -78,9 +79,9 @@ function nodeRemoved(node: LGraphNode) { store.set(state) } -function widgetStateChanged(widget: ComfyWidget) { +function widgetStateChanged(nodeId: number, widget: IWidget) { const state = get(store) - const entries = state[widget.node.id] + const entries = state[nodeId] if (entries) { let widgetState = entries.find(e => e.widget === widget); if (widgetState) { @@ -116,6 +117,15 @@ function configureFinished(graph: LGraph) { store.set(state) } +function findWidgetByName(nodeId: number, name: string): WidgetUIState | null { + let state = get(store); + + if (!(nodeId in state)) + return null; + + return state[nodeId].find((v) => v.widget.name === name); +} + const widgetStateStore: WritableWidgetStateStore = { ...store, @@ -123,6 +133,7 @@ const widgetStateStore: WritableWidgetStateStore = nodeRemoved, widgetStateChanged, configureFinished, + findWidgetByName, clear } export default widgetStateStore; diff --git a/src/lib/widgets/ComfyWidget.ts b/src/lib/widgets/ComfyWidget.ts index d75fb01..ea2d9d3 100644 --- a/src/lib/widgets/ComfyWidget.ts +++ b/src/lib/widgets/ComfyWidget.ts @@ -26,7 +26,7 @@ export default abstract class ComfyWidget implements IWidget