diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addImageToImage.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addImageToImage.ts index 27be363a1d..8d284f8988 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addImageToImage.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addImageToImage.ts @@ -14,6 +14,7 @@ import type { VaeSourceNodes, } from 'features/nodes/util/graph/types'; import type { Invocation } from 'services/api/types'; +import { assert } from 'tsafe'; type AddImageToImageArg = { g: Graph; @@ -21,6 +22,7 @@ type AddImageToImageArg = { manager: CanvasManager; l2i: Invocation; i2l: Invocation<'i2l' | 'flux_vae_encode' | 'sd3_i2l' | 'cogview4_i2l'>; + noise?: Invocation<'noise'>; denoise: Invocation; vaeSource: Invocation; }; @@ -31,6 +33,7 @@ export const addImageToImage = async ({ manager, l2i, i2l, + noise, denoise, vaeSource, }: AddImageToImageArg): Promise> => { @@ -40,6 +43,16 @@ export const addImageToImage = async ({ const { originalSize, scaledSize, rect } = getOriginalAndScaledSizesForOtherModes(state); + if (denoise.type === 'cogview4_denoise' || denoise.type === 'flux_denoise' || denoise.type === 'sd3_denoise') { + denoise.width = scaledSize.width; + denoise.height = scaledSize.height; + } else { + assert(denoise.type === 'denoise_latents'); + assert(noise, 'SD1.5/SD2/SDXL graphs require a noise node to be passed in'); + noise.width = scaledSize.width; + noise.height = scaledSize.height; + } + const adapters = manager.compositor.getVisibleAdaptersOfType('raster_layer'); const { image_name } = await manager.compositor.getCompositeImageDTO(adapters, rect, { is_intermediate: true, @@ -55,8 +68,6 @@ export const addImageToImage = async ({ ...scaledSize, }); - i2l.image = { image_name }; - const resizeImageToOriginalSize = g.addNode({ type: 'img_resize', id: getPrefixedId('initial_image_resize_out'), diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts index 6d33fe77c2..ac71ec4b0c 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts @@ -17,6 +17,7 @@ import type { VaeSourceNodes, } from 'features/nodes/util/graph/types'; import type { ImageDTO, Invocation } from 'services/api/types'; +import { assert } from 'tsafe'; type AddInpaintArg = { g: Graph; @@ -24,6 +25,7 @@ type AddInpaintArg = { manager: CanvasManager; l2i: Invocation; i2l: Invocation<'i2l' | 'flux_vae_encode' | 'sd3_i2l' | 'cogview4_i2l'>; + noise?: Invocation<'noise'>; denoise: Invocation; vaeSource: Invocation; modelLoader: Invocation; @@ -36,6 +38,7 @@ export const addInpaint = async ({ manager, l2i, i2l, + noise, denoise, vaeSource, modelLoader, @@ -50,6 +53,16 @@ export const addInpaint = async ({ const { originalSize, scaledSize, rect } = getOriginalAndScaledSizesForOtherModes(state); + if (denoise.type === 'cogview4_denoise' || denoise.type === 'flux_denoise' || denoise.type === 'sd3_denoise') { + denoise.width = scaledSize.width; + denoise.height = scaledSize.height; + } else { + assert(denoise.type === 'denoise_latents'); + assert(noise, 'SD1.5/SD2/SDXL graphs require a noise node to be passed in'); + noise.width = scaledSize.width; + noise.height = scaledSize.height; + } + const rasterAdapters = manager.compositor.getVisibleAdaptersOfType('raster_layer'); const initialImage = await manager.compositor.getCompositeImageDTO(rasterAdapters, rect, { is_intermediate: true, @@ -92,8 +105,6 @@ export const addInpaint = async ({ if (needsScaleBeforeProcessing) { // Scale before processing requires some resizing - i2l.image = { image_name: initialImage.image_name }; - const resizeImageToScaledSize = g.addNode({ type: 'img_resize', id: getPrefixedId('resize_image_to_scaled_size'), @@ -198,7 +209,6 @@ export const addInpaint = async ({ } } else { // No scale before processing, much simpler - i2l.image = { image_name: initialImage.image_name }; // If we have a noise mask, apply it to the input image before i2l conversion if (noiseMaskImage) { @@ -219,6 +229,8 @@ export const addInpaint = async ({ g.addEdge(seed, 'value', noiseNode, 'seed'); g.addEdge(noiseNode, 'image', i2l, 'image'); + } else { + i2l.image = { image_name: initialImage.image_name }; } const createGradientMask = g.addNode({ diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts index eee5c243f3..3a74c4c0ed 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts @@ -19,6 +19,7 @@ import type { VaeSourceNodes, } from 'features/nodes/util/graph/types'; import type { ImageDTO, Invocation } from 'services/api/types'; +import { assert } from 'tsafe'; type AddOutpaintArg = { g: Graph; @@ -26,6 +27,7 @@ type AddOutpaintArg = { manager: CanvasManager; l2i: Invocation; i2l: Invocation; + noise?: Invocation<'noise'>; denoise: Invocation; vaeSource: Invocation; modelLoader: Invocation; @@ -38,6 +40,7 @@ export const addOutpaint = async ({ manager, l2i, i2l, + noise, denoise, vaeSource, modelLoader, @@ -52,6 +55,16 @@ export const addOutpaint = async ({ const { originalSize, scaledSize, rect } = getOriginalAndScaledSizesForOtherModes(state); + if (denoise.type === 'cogview4_denoise' || denoise.type === 'flux_denoise' || denoise.type === 'sd3_denoise') { + denoise.width = scaledSize.width; + denoise.height = scaledSize.height; + } else { + assert(denoise.type === 'denoise_latents'); + assert(noise, 'SD1.5/SD2/SDXL graphs require a noise node to be passed in'); + noise.width = scaledSize.width; + noise.height = scaledSize.height; + } + const rasterAdapters = manager.compositor.getVisibleAdaptersOfType('raster_layer'); const initialImage = await manager.compositor.getCompositeImageDTO(rasterAdapters, rect, { is_intermediate: true, diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts index 4a70280dde..84af60cbc8 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts @@ -130,6 +130,7 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise