diff --git a/src/art/artJS.js b/src/art/artJS.js index 606a1166c30770cec6d7187c2b6d377119329d01..63c20dfde2f39a3ba44467322bf3b02b0d003ffa 100644 --- a/src/art/artJS.js +++ b/src/art/artJS.js @@ -547,7 +547,6 @@ App.Art.aiArtElement = function(slave, imageSize, isEventImage = null) { const lightboxBackground = App.UI.DOM.appendNewElement('div', lightbox, null, ['lightbox-background']); lightboxBackground.addEventListener('click', (ev) => { if (ev.target === lightboxBackground) { - console.log('background clicked'); lightbox.remove(); document.removeEventListener('keydown', keys); } diff --git a/src/art/genAI/prompts/eyePromptPart.js b/src/art/genAI/prompts/eyePromptPart.js index ae7243bf90ab803614d848c48e0f9ffdcdbfd4d9..8b11a72366e37792b14fccff1271fb3a183e0ed7 100644 --- a/src/art/genAI/prompts/eyePromptPart.js +++ b/src/art/genAI/prompts/eyePromptPart.js @@ -47,7 +47,7 @@ App.Art.GenAI.EyePromptPart = class EyePromptPart extends App.Art.GenAI.PromptPa if (this.slave.eyewear === "corrective glasses" || this.slave.eyewear === "blurring glasses" || this.slave.eyewear === "glasses"){ positive.push(`glasses`); } - return positive.join(`, `); + return positive.filter(p => !!p).join(`, `); } /** diff --git a/src/art/genAI/reactiveImageDB.js b/src/art/genAI/reactiveImageDB.js index 35ec8a4da2d8b089afabeb0441cbcfa916a02925..3a0509f4f67fd39fdf5078778e77efb701a19349 100644 --- a/src/art/genAI/reactiveImageDB.js +++ b/src/art/genAI/reactiveImageDB.js @@ -181,18 +181,28 @@ App.Art.GenAI.reactiveImageDB = (function() { App.Art.GenAI.CustomPromptPart // player probably cares ]; + let count = 0; for (const DealBreaker of dealBreakers) { const p1 = new DealBreaker(s1); const p2 = new DealBreaker(s2); - // immediate disqualification if (p1.positive() !== p2.positive()) { - return { - canReuse: false - }; + // immediate disqualification + if (!s2.custom.aiAutoRegenExclude) { + return { + canReuse: false + }; + } else { + count += 1; + } } } + // Count will only ever be larger 0 if slave.custom.aiAutoRegenExclude is active + if (count > 0) { + return {canReuse: true, difference: count * 10}; + } + let differenceScore = 0; // // Calculate and sum the "difference score" for each of these @@ -256,8 +266,8 @@ App.Art.GenAI.reactiveImageDB = (function() { /** * Fuzzily compares to see if all the slaves in an array are close enough to be used again * - * @param {FC.SlaveState[]} slaveArr1 - * @param {FC.SlaveState[]} slaveArr2 + * @param {FC.SlaveState[]} slaveArr1 old slaves save in db + * @param {FC.SlaveState[]} slaveArr2 current slaves * * @returns {{canReuse: boolean, averageDifference: number}} Comparison results */ @@ -306,7 +316,7 @@ App.Art.GenAI.reactiveImageDB = (function() { const fuzzyResults = entries.map((entry) => { return { entry, - ...fuzzyCompareSlavesArr(slaveStates, entry.slaveStates) + ...fuzzyCompareSlavesArr(entry.slaveStates, slaveStates) }; }).filter((record) => record.canReuse) .reduce(( /** @type {ClosestEventRecord} */prevRecord, currentRecord) => { @@ -375,9 +385,12 @@ App.Art.GenAI.reactiveImageDB = (function() { const eventEntries = await db.getAllFromIndex(EVENT_STORE.path, EVENT_STORE.indicies.bySlaveIdsActions, IDBKeyRange.only([event.slaveIds, event.action])); const {matches, averageDifference} = findClosestEvents(slaves, eventEntries, effectiveOptions); - const shouldUseCache = (averageDifference <= SIGNIFICANTLY_DIFFERENT_THRESHOLD) && !effectiveOptions.forceRegenerate; - const isExactMatch = averageDifference === 0; - const chosenEvent = matches[Math.floor(Math.random() * matches.length)]; + // Use cache if an existing image is similar enough or all slaves are excluded from auto image gen + const shouldUseCache = ( + averageDifference <= SIGNIFICANTLY_DIFFERENT_THRESHOLD || + (slaves.reduce((acc, s) => acc && !!s.custom.aiAutoRegenExclude, true)) + + ) && !effectiveOptions.forceRegenerate; // Use the cached value if (matches?.length > 0 && shouldUseCache) { @@ -385,7 +398,8 @@ App.Art.GenAI.reactiveImageDB = (function() { return matches[Math.floor(Math.random() * matches.length)]; } - const base64Image = await generateNewImage(slaves, effectiveOptions); + const isExactMatch = averageDifference === 0; + const chosenEvent = matches[Math.floor(Math.random() * matches.length)]; /** @type {App.Art.GenAI.EventStore.Entry} */ // @ts-expect-error @@ -398,6 +412,8 @@ App.Art.GenAI.reactiveImageDB = (function() { }; } + const base64Image = await generateNewImage(slaves, effectiveOptions); + if (event.action === 'overview') { if (!base64Image) { return undefined; diff --git a/src/art/genAI/workflows.js b/src/art/genAI/workflows.js index 718392c1bb9840acd2774ece7aaceefe10f02b3e..ea8d13557b1aa0a51ce6f84461b4fa53bad7b016 100644 --- a/src/art/genAI/workflows.js +++ b/src/art/genAI/workflows.js @@ -239,7 +239,7 @@ App.Art.GenAI.ComfyUIWorkflow = class { promptWorkflow[30].inputs.positive = ["8", 0]; } if (V.aiDynamicCfgEnabled) { - promptWorkflow[30].inputs.model[0] = "10"; + promptWorkflow[30].inputs.model = ["10", 0]; } } diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 0d2ee04554941a723dfff840feb57e1c2fec37a1..14d39fadb0c8273c77f520100ce1b0fbc5b31f37 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -4670,9 +4670,13 @@ App.RA.options = (function() { } } - class AiAutoRegen extends BooleanSwitch { + class AiAutoRegen extends RadioSelector { constructor() { - super("Exclude slave from automatic image generation: ", [0, 1]); + const pairs = [ + ["Include", 0], + ["Exclude", 1], + ]; + super("Automatic image generation", pairs); this.setValue(current_rule.set.aiAutoRegenExclude); this.onchange = (value) => current_rule.set.aiAutoRegenExclude = value; }