Reforca ancora de fidelidade visual de personagens e cenario em 100% dos quadros e adiciona re-sincronizacao de texto editado na regeneracao

This commit is contained in:
2026-08-31 20:00:55 +00:00
parent 8894a5068e
commit f40a5987f9
2 changed files with 87 additions and 8 deletions
+47 -4
View File
@@ -5275,7 +5275,7 @@ Se algum dado não for mencionado, deixe a string vazia ou false para boolean.`
});
};
// Regenerar um único painel
// Regenerar um único painel inteligente (considera textos/legendas alterados e preserva âncora visual de personagens)
const regenerateSinglePanel = async (index, panelCard, imgElement, btnRegen) => {
const panel = generatedPanelsData[index];
if (!panel) return;
@@ -5285,13 +5285,52 @@ Se algum dado não for mencionado, deixe a string vazia ou false para boolean.`
btnRegen.textContent = '⏳';
imgElement.style.opacity = '0.4';
const promptToUse = panel.image_prompt || 'cute children illustration';
const fullPrompt = `${promptToUse}, high resolution children book illustration, cute Pixar style, ${selectedComicsRatio === '16:9' ? '16:9 aspect ratio' : '4:3 aspect ratio'}`;
// Captura o diálogo/texto ATUAL que está escrito na textarea do quadrinho (caso o usuário tenha editado)
const textarea = panelCard.querySelector('.comic-caption-input');
const currentDialogue = textarea ? textarea.value.trim() : (panel.dialogue || '');
panel.dialogue = currentDialogue;
// Captura o prompt visual se o mini-editor tiver sido alterado
const promptInput = panelCard.querySelector('.comic-prompt-details textarea');
let promptToUse = promptInput ? promptInput.value.trim() : (panel.image_prompt || '');
// Se o diálogo tiver sido preenchido/alterado, re-sincronizamos a cena visual com o novo texto
if (currentDialogue) {
try {
const resyncResp = await fetch('/api/comics/resync-frame-prompt', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
currentDialogue,
oldPrompt: promptToUse,
character_description: currentComicsCharDescEnglish,
cenario: comicsCenarioSelect ? comicsCenarioSelect.value : ''
})
});
if (resyncResp.ok) {
const resyncData = await resyncResp.json();
if (resyncData.image_prompt) {
promptToUse = resyncData.image_prompt;
panel.image_prompt = promptToUse;
if (promptInput) promptInput.value = promptToUse;
}
}
} catch (resyncErr) {
console.warn('Re-sincronização de prompt ao regenerar:', resyncErr.message);
}
}
// Monta o prompt reforçado com a Âncora Visual Física de Personagens e Estilo 3D Pixar
let anchorPart = '';
if (currentComicsCharDescEnglish) {
anchorPart = `CHARACTER ANCHOR: [${currentComicsCharDescEnglish}]. `;
}
const fullPrompt = `${anchorPart}${promptToUse}, high resolution children book illustration, cute Pixar style, ${selectedComicsRatio === '16:9' ? '16:9 aspect ratio' : '4:3 aspect ratio'}`;
const resp = await fetch('/api/comics/generate-frame', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ prompt: fullPrompt })
body: JSON.stringify({ prompt: fullPrompt, proporcao: selectedComicsRatio })
});
if (!resp.ok) {
@@ -5303,6 +5342,10 @@ Se algum dado não for mencionado, deixe a string vazia ou false para boolean.`
panel.imageUrl = data.imageUrl;
imgElement.src = data.imageUrl + '?v=' + Date.now();
imgElement.style.opacity = '1';
// Auto-salva o projeto atualizado no banco
saveComicsProjectFlow(false).catch(e => console.warn('Auto-save pós regeneração:', e.message));
} catch (err) {
console.error('Erro ao regenerar painel:', err);
await showCustomAlert('Erro', 'Não foi possível regenerar o quadrinho: ' + err.message);