Overhaul Studio controls and add image batch from one still.

Video and Image pickers, thumbwheels, aspect icons, and a Scale to MP paddle; extra prompts default to batch so each run starts from the original image.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-08-30 23:16:19 -05:00
co-authored by Cursor
parent 8df265cbf3
commit 755aaeede8
17 changed files with 791 additions and 233 deletions
+8 -3
View File
@@ -47,6 +47,7 @@ export interface StudioJobPayload {
shotLoraStacks?: import('~/utils/loras').LoraStackItem[][]
negative?: string
passes?: { prompt: string }[]
passMode?: 'batch' | 'chain'
referenceStillId?: string
referenceStillFilename?: string
scaleToTotalPixels?: boolean
@@ -781,7 +782,9 @@ async function startStudioEditJob(item: StudioJob) {
chainIndex: 0,
chainStep: 1,
chainTotal: 1 + ((mode === 'edit' || mode === 'compose') ? (payload.passes?.length || 0) : 0),
chainLabel: (mode === 'edit' || mode === 'compose') && payload.passes?.length ? 'Pass 1' : undefined,
chainLabel: (mode === 'edit' || mode === 'compose') && payload.passes?.length
? (payload.passMode === 'chain' ? 'Pass 1' : 'Batch 1')
: undefined,
passes: payload.passes,
...persistLoraFields(payload.loraStack || payload.loraName)
}
@@ -796,6 +799,7 @@ async function startStudioEditJob(item: StudioJob) {
mask,
prompt: payload.prompt,
passes: payload.passes || [],
passMode: payload.passMode === 'chain' ? 'chain' : 'batch',
negative: payload.negative || '',
steps: payload.steps,
seed: live.library?.seed || payload.seed,
@@ -804,7 +808,7 @@ async function startStudioEditJob(item: StudioJob) {
snofsClip: payload.snofsClip ?? 0,
consistencyModel: payload.consistencyModel ?? (mode === 'generate' || payload.engine === 'krea' ? 0 : 0.7),
consistencyClip: payload.consistencyClip ?? (mode === 'generate' || payload.engine === 'krea' ? 0 : 0.7),
megapixels: payload.scaleMegapixels ?? 1,
megapixels: payload.scaleToTotalPixels === false ? 0 : (payload.scaleMegapixels ?? 1),
strength: payload.refineStrength,
aspect: payload.aspect || 'auto',
width: payload.width,
@@ -848,7 +852,7 @@ async function startStudioEditJob(item: StudioJob) {
chainIndex: 0,
chainStep: 1,
chainTotal: 1 + passes.length,
chainLabel: passes.length ? 'Pass 1' : undefined,
chainLabel: passes.length ? (payload.passMode === 'chain' ? 'Pass 1' : 'Batch 1') : undefined,
passes,
...persistLoraFields(payload.loraStack || payload.loraName)
}
@@ -860,6 +864,7 @@ async function startStudioEditJob(item: StudioJob) {
reference,
prompt: payload.prompt,
passes,
passMode: payload.passMode === 'chain' ? 'chain' : 'batch',
negative: payload.negative || '',
steps: payload.steps,
seed: live.library?.seed || payload.seed,