Merge branch 'comfyanonymous:master' into feature/preview-latent

This commit is contained in:
Dr.Lt.Data 2023-07-12 16:46:14 +09:00 committed by GitHub
commit 4b1357bd35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 84 additions and 26 deletions

1
.gitignore vendored
View File

@ -14,4 +14,3 @@ venv/
web/extensions/* web/extensions/*
!web/extensions/logging.js.example !web/extensions/logging.js.example
!web/extensions/core/ !web/extensions/core/
startup-scripts/

View File

@ -7,6 +7,7 @@ import hashlib
import traceback import traceback
import math import math
import time import time
import random
from PIL import Image, ImageDraw, ImageOps from PIL import Image, ImageDraw, ImageOps
from PIL.PngImagePlugin import PngInfo from PIL.PngImagePlugin import PngInfo
@ -1239,6 +1240,7 @@ class SaveImage:
def __init__(self): def __init__(self):
self.output_dir = folder_paths.get_output_directory() self.output_dir = folder_paths.get_output_directory()
self.type = "output" self.type = "output"
self.prefix_append = ""
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
@ -1256,6 +1258,7 @@ class SaveImage:
CATEGORY = "image" CATEGORY = "image"
def save_images(self, images, filename_prefix="ComfyUI", prompt=None, extra_pnginfo=None): def save_images(self, images, filename_prefix="ComfyUI", prompt=None, extra_pnginfo=None):
filename_prefix += self.prefix_append
full_output_folder, filename, counter, subfolder, filename_prefix = folder_paths.get_save_image_path(filename_prefix, self.output_dir, images[0].shape[1], images[0].shape[0]) full_output_folder, filename, counter, subfolder, filename_prefix = folder_paths.get_save_image_path(filename_prefix, self.output_dir, images[0].shape[1], images[0].shape[0])
results = list() results = list()
for image in images: for image in images:
@ -1283,6 +1286,7 @@ class PreviewImage(SaveImage):
def __init__(self): def __init__(self):
self.output_dir = folder_paths.get_temp_directory() self.output_dir = folder_paths.get_temp_directory()
self.type = "temp" self.type = "temp"
self.prefix_append = "_temp_" + ''.join(random.choice("abcdefghijklmnopqrstupvxyz") for x in range(5))
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):

View File

@ -144,6 +144,10 @@
ctrl_shift_v_paste_connect_unselected_outputs: true, //[true!] allows ctrl + shift + v to paste nodes with the outputs of the unselected nodes connected with the inputs of the newly pasted nodes ctrl_shift_v_paste_connect_unselected_outputs: true, //[true!] allows ctrl + shift + v to paste nodes with the outputs of the unselected nodes connected with the inputs of the newly pasted nodes
// if true, all newly created nodes/links will use string UUIDs for their id fields instead of integers.
// use this if you must have node IDs that are unique across all graphs and subgraphs.
use_uuids: false,
/** /**
* Register a node class so it can be listed when the user wants to create a new one * Register a node class so it can be listed when the user wants to create a new one
* @method registerNodeType * @method registerNodeType
@ -603,6 +607,13 @@
return target; return target;
}, },
/*
* https://gist.github.com/jed/982883?permalink_comment_id=852670#gistcomment-852670
*/
uuidv4: function() {
return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,a=>(a^Math.random()*16>>a/4).toString(16));
},
/** /**
* Returns if the types of two slots are compatible (taking into account wildcards, etc) * Returns if the types of two slots are compatible (taking into account wildcards, etc)
* @method isValidConnection * @method isValidConnection
@ -1407,7 +1418,12 @@
console.warn( console.warn(
"LiteGraph: there is already a node with this ID, changing it" "LiteGraph: there is already a node with this ID, changing it"
); );
node.id = ++this.last_node_id; if (LiteGraph.use_uuids) {
node.id = LiteGraph.uuidv4();
}
else {
node.id = ++this.last_node_id;
}
} }
if (this._nodes.length >= LiteGraph.MAX_NUMBER_OF_NODES) { if (this._nodes.length >= LiteGraph.MAX_NUMBER_OF_NODES) {
@ -1415,10 +1431,16 @@
} }
//give him an id //give him an id
if (node.id == null || node.id == -1) { if (LiteGraph.use_uuids) {
node.id = ++this.last_node_id; if (node.id == null || node.id == -1)
} else if (this.last_node_id < node.id) { node.id = LiteGraph.uuidv4();
this.last_node_id = node.id; }
else {
if (node.id == null || node.id == -1) {
node.id = ++this.last_node_id;
} else if (this.last_node_id < node.id) {
this.last_node_id = node.id;
}
} }
node.graph = this; node.graph = this;
@ -2415,7 +2437,12 @@
enumerable: true enumerable: true
}); });
this.id = -1; //not know till not added if (LiteGraph.use_uuids) {
this.id = LiteGraph.uuidv4();
}
else {
this.id = -1; //not know till not added
}
this.type = null; this.type = null;
//inputs available: array of inputs //inputs available: array of inputs
@ -2629,6 +2656,11 @@
} }
delete data["id"]; delete data["id"];
if (LiteGraph.use_uuids) {
data["id"] = LiteGraph.uuidv4()
}
//remove links //remove links
node.configure(data); node.configure(data);
@ -3540,8 +3572,8 @@
/** /**
* computes the minimum size of a node according to its inputs and output slots * computes the minimum size of a node according to its inputs and output slots
* @method computeSize * @method computeSize
* @param {number} minHeight * @param {vec2} minHeight
* @return {number} the total size * @return {vec2} the total size
*/ */
LGraphNode.prototype.computeSize = function(out) { LGraphNode.prototype.computeSize = function(out) {
if (this.constructor.size) { if (this.constructor.size) {
@ -4279,10 +4311,16 @@
break; break;
} }
} }
var nextId
if (LiteGraph.use_uuids)
nextId = LiteGraph.uuidv4();
else
nextId = ++this.graph.last_link_id;
//create link class //create link class
link_info = new LLink( link_info = new LLink(
++this.graph.last_link_id, nextId,
input.type || output.type, input.type || output.type,
this.id, this.id,
slot, slot,
@ -6023,6 +6061,9 @@ LGraphNode.prototype.executeAction = function(action)
//it wasn't clicked on the links boxes //it wasn't clicked on the links boxes
if (!skip_action) { if (!skip_action) {
var block_drag_node = false; var block_drag_node = false;
if(node && node.flags && node.flags.pinned) {
block_drag_node = true;
}
var pos = [e.canvasX - node.pos[0], e.canvasY - node.pos[1]]; var pos = [e.canvasX - node.pos[0], e.canvasY - node.pos[1]];
//widgets //widgets
@ -7070,6 +7111,8 @@ LGraphNode.prototype.executeAction = function(action)
var selected_nodes_array = []; var selected_nodes_array = [];
for (var i in this.selected_nodes) { for (var i in this.selected_nodes) {
var node = this.selected_nodes[i]; var node = this.selected_nodes[i];
if (node.clonable === false)
continue;
node._relative_id = index; node._relative_id = index;
selected_nodes_array.push(node); selected_nodes_array.push(node);
index += 1; index += 1;
@ -7077,12 +7120,12 @@ LGraphNode.prototype.executeAction = function(action)
for (var i = 0; i < selected_nodes_array.length; ++i) { for (var i = 0; i < selected_nodes_array.length; ++i) {
var node = selected_nodes_array[i]; var node = selected_nodes_array[i];
var cloned = node.clone(); var cloned = node.clone();
if(!cloned) if(!cloned)
{ {
console.warn("node type not found: " + node.type ); console.warn("node type not found: " + node.type );
continue; continue;
} }
clipboard_info.nodes.push(cloned.serialize()); clipboard_info.nodes.push(cloned.serialize());
if (node.inputs && node.inputs.length) { if (node.inputs && node.inputs.length) {
for (var j = 0; j < node.inputs.length; ++j) { for (var j = 0; j < node.inputs.length; ++j) {
@ -8148,7 +8191,7 @@ LGraphNode.prototype.executeAction = function(action)
**/ **/
LGraphCanvas.prototype.renderInfo = function(ctx, x, y) { LGraphCanvas.prototype.renderInfo = function(ctx, x, y) {
x = x || 10; x = x || 10;
y = y || this.canvas.height - 80; y = y || this.canvas.offsetHeight - 80;
ctx.save(); ctx.save();
ctx.translate(x, y); ctx.translate(x, y);
@ -9952,7 +9995,7 @@ LGraphNode.prototype.executeAction = function(action)
break; break;
case "slider": case "slider":
var old_value = w.value; var old_value = w.value;
var nvalue = Math.clamp((x - 15) / (widget_width - 30), 0, 1); var nvalue = clamp((x - 15) / (widget_width - 30), 0, 1);
if(w.options.read_only) break; if(w.options.read_only) break;
w.value = w.options.min + (w.options.max - w.options.min) * nvalue; w.value = w.options.min + (w.options.max - w.options.min) * nvalue;
if (old_value != w.value) { if (old_value != w.value) {
@ -12949,7 +12992,7 @@ LGraphNode.prototype.executeAction = function(action)
var newSelected = {}; var newSelected = {};
var fApplyMultiNode = function(node){ var fApplyMultiNode = function(node){
if (node.clonable == false) { if (node.clonable === false) {
return; return;
} }
var newnode = node.clone(); var newnode = node.clone();
@ -14148,10 +14191,10 @@ LGraphNode.prototype.executeAction = function(action)
return; return;
} }
if( !is_edge_point ) //not edges if( !is_edge_point ) //not edges
point[0] = Math.clamp(x,0,1); point[0] = clamp(x, 0, 1);
else else
point[0] = s == 0 ? 0 : 1; point[0] = s == 0 ? 0 : 1;
point[1] = 1.0 - Math.clamp(y,0,1); point[1] = 1.0 - clamp(y, 0, 1);
points.sort(function(a,b){ return a[0] - b[0]; }); points.sort(function(a,b){ return a[0] - b[0]; });
this.selected = points.indexOf(point); this.selected = points.indexOf(point);
this.must_update = true; this.must_update = true;
@ -14299,10 +14342,11 @@ LGraphNode.prototype.executeAction = function(action)
return oDOM.removeEventListener(sEvent, fCall, capture); return oDOM.removeEventListener(sEvent, fCall, capture);
} }
} }
Math.clamp = function(v, a, b) { function clamp(v, a, b) {
return a > v ? a : b < v ? b : v; return a > v ? a : b < v ? b : v;
}; };
global.clamp = clamp;
if (typeof window != "undefined" && !window["requestAnimationFrame"]) { if (typeof window != "undefined" && !window["requestAnimationFrame"]) {
window.requestAnimationFrame = window.requestAnimationFrame =
@ -14316,6 +14360,13 @@ LGraphNode.prototype.executeAction = function(action)
if (typeof exports != "undefined") { if (typeof exports != "undefined") {
exports.LiteGraph = this.LiteGraph; exports.LiteGraph = this.LiteGraph;
exports.LGraph = this.LGraph;
exports.LLink = this.LLink;
exports.LGraphNode = this.LGraphNode;
exports.LGraphGroup = this.LGraphGroup;
exports.DragAndScale = this.DragAndScale;
exports.LGraphCanvas = this.LGraphCanvas;
exports.ContextMenu = this.ContextMenu;
} }

View File

@ -4,7 +4,7 @@ import { api } from "./api.js";
import { defaultGraph } from "./defaultGraph.js"; import { defaultGraph } from "./defaultGraph.js";
import { getPngMetadata, importA1111, getLatentMetadata } from "./pnginfo.js"; import { getPngMetadata, importA1111, getLatentMetadata } from "./pnginfo.js";
/** /**
* @typedef {import("types/comfy").ComfyExtension} ComfyExtension * @typedef {import("types/comfy").ComfyExtension} ComfyExtension
*/ */
@ -1038,8 +1038,12 @@ export class ComfyApp {
this.graph.start(); this.graph.start();
function resizeCanvas() { function resizeCanvas() {
canvasEl.width = canvasEl.offsetWidth; // Limit minimal scale to 1, see https://github.com/comfyanonymous/ComfyUI/pull/845
canvasEl.height = canvasEl.offsetHeight; const scale = Math.max(window.devicePixelRatio, 1);
const { width, height } = canvasEl.getBoundingClientRect();
canvasEl.width = Math.round(width * scale);
canvasEl.height = Math.round(height * scale);
canvasEl.getContext("2d").scale(scale, scale);
canvas.draw(true, true); canvas.draw(true, true);
} }