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:
+47
-4
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user