Scene Card sub-tab in the scene visuals manager (issue #317) (#318)

* Add a Scene Card sub-tab to the scene visuals manager (issue #317)

* Mirror the Scene Card amendment into the rendered 0.39.0 release notes; review nits
This commit is contained in:
veguAI
2026-08-17 21:58:34 +03:00
committed by GitHub
parent 98b64b512b
commit 82d3abc39d
8 changed files with 62 additions and 29 deletions

View File

@@ -48,7 +48,7 @@ An optional Auto Backdrop setting promotes newly generated scene backgrounds and
### Scene Visual Manager
World Editor → Scene gains a Visuals tab mirroring the character visual manager: browse, upload, generate (single or batch, new or as variations of a reference image), and delete the scene's background and scene illustrations, set the scene cover image, and set or fully unset the scene backdrop. A Prompt Finalization sub-tab edits the Visualizer agent's per-scene prompt finalization overrides.
World Editor → Scene gains a Visuals tab mirroring the character visual manager: browse, upload, generate (single or batch, new or as variations of a reference image), and delete the scene's background illustrations, scene illustrations and scene cards, set the scene cover image, and set or fully unset the scene backdrop (the Scene Card sub-tab is portrait and offers no set-backdrop action). A Prompt Finalization sub-tab edits the Visualizer agent's per-scene prompt finalization overrides.
### Visual Prompt Finalization

View File

@@ -5,7 +5,7 @@
- "Environment Variable Store: Application settings gained an Environment Variables page for named values that are encrypted at rest and passed as environment variables to processes Talemate spawns — currently the Pi Bridge client's pi instances, so pi's models.json can reference secrets as $NAME instead of keeping plaintext keys in environment files."
- "Timeline: A new timeline dialog provides a single home for a scene's version history. Drag a slider across the scene's automatic version history to preview the message history at any revision, then fork that revision to a new save — the scene you are playing is never modified, and browsing the history changes nothing on disk. Opened from the scene tools Save menu, from the Fork button on any changelog-backed message (which positions the timeline at that message's revision), or from the Quick Load card menu on the main screen, where it replaces the old Restore from Backup dialog. Forking is the only action the timeline applies in this release, see below."
- "Character Creation Example Dialogue: AI-assisted character creation (World Editor → Characters → Create and the scene tools creative menu) gained a 'Generate example dialogue' option that generates a few example dialogue lines for the new character, with an optional guidance field to steer how the examples are written (tone, speech patterns, quirks). Off by default."
- "Scene Visual Manager: World Editor → Scene gained a Visuals tab mirroring the character visual manager, with Background Illustration and Scene Illustration sub-tabs to browse, upload, generate (new or as a variation of a reference image, single or batch), view, and delete scene images — plus per-image actions to set the scene cover image and set or unset the scene backdrop. A Prompt Finalization sub-tab edits the Visualizer agent's per-scene Prompt Finalization overrides directly from the world editor, creating the scene's agent-settings file with the default name when none is linked yet. The scene backdrop can now also be fully unset (not just toggled off), keeping the image in the scene assets."
- "Scene Visual Manager: World Editor → Scene gained a Visuals tab mirroring the character visual manager, with Background Illustration, Scene Illustration and Scene Card sub-tabs to browse, upload, generate (new or as a variation of a reference image, single or batch), view, and delete scene images — plus per-image actions to set the scene cover image and set or unset the scene backdrop (the Scene Card sub-tab is portrait and offers no Set as Scene Backdrop action). A Prompt Finalization sub-tab edits the Visualizer agent's per-scene Prompt Finalization overrides directly from the world editor, creating the scene's agent-settings file with the default name when none is linked yet. The scene backdrop can now also be fully unset (not just toggled off), keeping the image in the scene assets."
- "Help Agent: A new Help agent provides an interactive help chat that answers questions about Talemate itself — settings, agents, clients, the world editor and more — grounded in the bundled documentation, which it can search and read before answering. Opened via the help icon in the app bar, it works with or without a loaded scene, supports multiple persistent multi-turn chats, and runs in the background so it never blocks the main Talemate loop. A per-chat Scene Aware toggle lets a conversation see (or stay unaware of) the currently loaded scene, and each question carries a small snapshot of what you are looking at in the interface so contextual questions like 'what does this setting do?' can be answered. The most recent answer can be regenerated via a button right on the message, matching the director chat. Beyond answering questions, the help agent can read your actual configuration — any agent's settings, application settings, and a read-only view of your clients (API keys are never exposed) — and, when asked, change agent settings (globally or as a per-scene override) and application settings directly from the chat, recording exactly what changed. It cannot change scene content — scene changes remain the director chat's job."
- "Scene Backdrop: Any scene illustration can now be set as the scene backdrop — an image that fills the whole scene view behind the messages instead of rendering inline. The backdrop belongs to the scene and is saved with it, so it survives reloads and history edits. Set it via 'Set as scene backdrop' on any illustration's image menu, the 'Set backdrop' button in the Visual Library, or enable 'Auto Backdrop' per visual type (Settings → Appearance → Message Visuals) to have newly generated Scene Backgrounds ('Visualize Scene (Background)') and/or Scene Illustrations ('Visualize Moment') promoted automatically. An 'Immersive' quick-toggle chip in the scene tools turns the backdrop on and off without forgetting the chosen image. Message text sits on translucent panels with a drop shadow for legibility — panel opacity and the text shadow are configurable — and a small marker icon shows which message's image is the current backdrop (click it for the image menu, which stays reachable via an Illustration chip on the message hover toolbar)."
- "Visual Prompt Finalization: The Visualizer agent gained a Prompt Finalization settings tab defining post-processing actions (exact, fuzzy or regex match and replace, or an AI instruction) that rewrite image prompts right before they are sent to the image generation backend. Actions can target positive and/or negative prompts, be restricted to specific visual types, and be overridden per scene. Characters can define their own actions under World Editor → Characters → Visuals → Prompt Finalization, which run after the agent's. Reusable action sets are managed as a new 'Visual prompt finalizer' template type, including a shipped Ideogram JSON preset that converts the positive prompt into an Ideogram 4.0 structured JSON prompt. Prompt-only generation output is finalized as well, and a new FinalizePrompt node exposes the step to custom node graphs."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 289 KiB

After

Width:  |  Height:  |  Size: 426 KiB

View File

@@ -1,24 +1,25 @@
# Scene Visuals
The **Visuals** tab in the Scene Editor provides a dedicated interface for managing the scene's own imagery — background illustrations, scene illustrations, the scene cover image, and the [scene backdrop](/talemate/user-guide/inline-visuals/#scene-backdrop) — mirroring the [character visual manager](/talemate/user-guide/world-editor/characters/visuals).
The **Visuals** tab in the Scene Editor provides a dedicated interface for managing the scene's own imagery — background illustrations, scene illustrations, scene cards, the scene cover image, and the [scene backdrop](/talemate/user-guide/inline-visuals/#scene-backdrop) — mirroring the [character visual manager](/talemate/user-guide/world-editor/characters/visuals).
To access it, open the :material-earth-box: **World Editor**, navigate to the :material-script: **Scene** tab, and click the :material-image-multiple-outline: **Visuals** tab.
![Scene editor Visuals tab overview](/talemate/img/0.39.0/world-editor-scene-visuals-overview.png)
![Scene editor Visuals tab, Scene Card sub-tab](/talemate/img/0.39.0/world-editor-scene-visuals-overview.png)
## Overview
The Visuals tab is organized into three sub-tabs:
The Visuals tab is organized into four sub-tabs:
- **:material-image-area: Background Illustration** - Purely environmental images of the scene ("Visualize Scene (Background)")
- **:material-image-filter-hdr: Scene Illustration** - Images of specific moments in the story ("Visualize Moment")
- **:material-image-frame: Scene Card** - Portrait images representing the story as a whole ("Visualize Scene (Card)"), the ones you pick the scene cover image from
- **:material-auto-fix: Prompt Finalization** - Edit the Visualizer agent's per-scene prompt finalization overrides
## Background Illustration & Scene Illustration
## Background Illustration, Scene Illustration & Scene Card
Both image sub-tabs work the same way and differ only in the visual type they manage. Each shows a grid of the scene's images of that type — badges mark the image currently used as the scene **Cover** and the current **Backdrop**.
The three image sub-tabs work the same way and differ only in the visual type they manage. Each shows a grid of the scene's images of that type — badges mark the image currently used as the scene **Cover** and the current **Backdrop**. Background illustrations and scene illustrations are landscape images, scene cards are portrait ones.
When a backdrop is set, a banner above the grid names the backdrop image, offers a **Render backdrop** switch (the same toggle as the scene tools **Immersive** chip), and an **Unset backdrop** button that removes the backdrop entirely while keeping the image in the scene assets.
When a backdrop is set, a banner above the grid names the backdrop image, offers a **Render backdrop** switch (the same toggle as the scene tools **Immersive** chip), and an **Unset backdrop** button that removes the backdrop entirely while keeping the image in the scene assets. The backdrop is meant for the landscape types, so the Scene Card sub-tab shows neither the banner nor the **Set as Scene Backdrop** action.
### Adding images
@@ -33,7 +34,7 @@ Generation requires a ready [Visualizer Agent](/talemate/user-guide/agents/visua
Click an image to access its menu:
- **Set as Scene Cover Image**: Make this the scene's cover image (shown on the scene card in the scene directory)
- **Set as Scene Backdrop** / **Unset Scene Backdrop**: Make this image the [scene backdrop](/talemate/user-guide/inline-visuals/#scene-backdrop), rendered behind the scene text — or unset it (the image stays in the scene assets)
- **Set as Scene Backdrop** / **Unset Scene Backdrop**: Make this image the [scene backdrop](/talemate/user-guide/inline-visuals/#scene-backdrop), rendered behind the scene text — or unset it (the image stays in the scene assets). Setting is offered on the two illustration sub-tabs; unsetting is offered wherever the current backdrop image appears
- **View Image**: Open a larger preview
- **Open in Visual Library**: View and edit the image in the full [Visual Library](/talemate/user-guide/agents/visualizer/visual-library)
- **Delete**: Permanently remove the image from the scene assets

View File

@@ -1194,9 +1194,9 @@
new scenes from an episode.
- path: user-guide/world-editor/scene/visuals.md
title: Scene Visuals
summary: 'World Editor Scene Visuals tab: manage background illustrations and scene illustrations (upload, Generate New,
Generate Variation with batch prompts), set the scene cover image, set/unset the scene backdrop with the Render backdrop
switch, and edit the visualizer agent''s per-scene Prompt Finalization overrides.'
summary: 'World Editor Scene Visuals tab: manage background illustrations, scene illustrations and scene cards (upload,
Generate New, Generate Variation with batch prompts), set the scene cover image, set/unset the scene backdrop with the
Render backdrop switch, and edit the visualizer agent''s per-scene Prompt Finalization overrides.'
- path: user-guide/world-editor/suggestions.md
title: Suggestions
summary: The Suggestions view where agent-proposed world changes (currently character changes only) accumulate for review,

View File

@@ -130,7 +130,7 @@ export default {
},
{
"title": "Scene Visual Manager",
"description": "World Editor → Scene gains a Visuals tab mirroring the character visual manager: browse, upload, generate (single or batch, new or as variations of a reference image), and delete the scene's background and scene illustrations, set the scene cover image, and set or fully unset the scene backdrop. A Prompt Finalization sub-tab edits the Visualizer agent's per-scene prompt finalization overrides."
"description": "World Editor → Scene gains a Visuals tab mirroring the character visual manager: browse, upload, generate (single or batch, new or as variations of a reference image), and delete the scene's background illustrations, scene illustrations and scene cards, set the scene cover image, and set or fully unset the scene backdrop (the Scene Card sub-tab is portrait and offers no set-backdrop action). A Prompt Finalization sub-tab edits the Visualizer agent's per-scene prompt finalization overrides."
},
{
"title": "Visual Prompt Finalization",

View File

@@ -8,6 +8,9 @@
<v-tab value="illustration" class="text-caption" prepend-icon="mdi-image-filter-hdr">
Scene Illustration
</v-tab>
<v-tab value="card" class="text-caption" prepend-icon="mdi-image-frame">
Scene Card
</v-tab>
<v-tab value="finalizers" class="text-caption" prepend-icon="mdi-auto-fix">
Prompt Finalization
</v-tab>
@@ -32,6 +35,15 @@
:image-edit-available="imageEditAvailable"
:image-create-available="imageCreateAvailable"
/>
<WorldStateManagerSceneVisualsAssets
v-else-if="tab === 'card'"
ref="card"
:vis-type="VIS_TYPE.SCENE_CARD"
:scene="scene"
:visual-agent-ready="visualAgentReady"
:image-edit-available="imageEditAvailable"
:image-create-available="imageCreateAvailable"
/>
<WorldStateManagerSceneVisualsFinalizers
v-else-if="tab === 'finalizers'"
ref="finalizers"

View File

@@ -7,7 +7,7 @@
</div>
<v-alert
v-if="backdropAssetId"
v-if="typeConfig.offersSetBackdrop && backdropAssetId"
icon="mdi-image-area"
density="compact"
variant="tonal"
@@ -44,7 +44,7 @@
<VisualAssetGrid
:assets="assets"
aspect="landscape"
:aspect="typeConfig.aspect"
:drop-label="`Add ${typeConfig.label}`"
:is-dragging="isDragging"
:get-src="getAssetSrc"
@@ -74,7 +74,7 @@
<v-list-item-title>Set as Scene Cover Image</v-list-item-title>
</v-list-item>
<v-list-item
v-if="backdropAssetId !== asset.id"
v-if="typeConfig.offersSetBackdrop && backdropAssetId !== asset.id"
@click="setBackdrop({ assetId: asset.id })"
>
<template v-slot:prepend>
@@ -83,7 +83,7 @@
<v-list-item-title>Set as Scene Backdrop</v-list-item-title>
</v-list-item>
<v-list-item
v-else
v-else-if="backdropAssetId === asset.id"
@click="setBackdrop({ clear: true })"
>
<template v-slot:prepend>
@@ -151,7 +151,7 @@
:reference-asset-ids="referenceAssetIds"
:assets-map="assetsMap"
:base64-by-id="base64ById"
aspect="landscape"
:aspect="typeConfig.aspect"
:is-generating="isGenerating"
:can-generate="canGenerate"
no-references-text="No reference images available for this scene."
@@ -218,14 +218,23 @@ import VisualAssetGenerateDialog from './VisualAssetGenerateDialog.vue';
import VisualAssetGenerateNewDialog from './VisualAssetGenerateNewDialog.vue';
import { VIS_TYPE, FORMAT_TYPE, GEN_TYPE } from '@/constants/visual';
// Per-vis-type copy and naming. Both scene illustration types share the
// same landscape-oriented management UX; only the wording differs.
// VisualAssetGrid's aspect keys are a lowercase alias of FORMAT_TYPE; deriving
// one from the other keeps a type's grid and its generation format in step.
const FORMAT_TO_ASPECT = {
[FORMAT_TYPE.LANDSCAPE]: 'landscape',
[FORMAT_TYPE.PORTRAIT]: 'portrait',
[FORMAT_TYPE.SQUARE]: 'square',
};
// Per-vis-type copy, layout and naming for the scene image sub-tabs.
const TYPE_CONFIG = {
[VIS_TYPE.SCENE_BACKGROUND]: {
label: 'background illustration',
pluralLabel: 'background illustrations',
namePrefix: 'background',
icon: 'mdi-image-area',
format: FORMAT_TYPE.LANDSCAPE,
offersSetBackdrop: true,
description: 'Background illustrations are purely environmental images of the scene\'s location — no characters. They work well as the scene backdrop rendered behind the scene text.',
generateHint: 'Describe the environment, e.g., a moonlit forest clearing with ancient stones',
},
@@ -234,9 +243,23 @@ const TYPE_CONFIG = {
pluralLabel: 'scene illustrations',
namePrefix: 'illustration',
icon: 'mdi-image-filter-hdr',
format: FORMAT_TYPE.LANDSCAPE,
offersSetBackdrop: true,
description: 'Scene illustrations depict the current moment of the scene and may include characters. They are ideal for illustrating key story beats.',
generateHint: 'Describe the moment, e.g., the party gathered around the campfire at dusk',
},
[VIS_TYPE.SCENE_CARD]: {
label: 'scene card',
pluralLabel: 'scene cards',
namePrefix: 'card',
icon: 'mdi-image-frame',
format: FORMAT_TYPE.PORTRAIT,
// a UI choice, not a backend rule — an asset of any type can be made
// the backdrop elsewhere, which is why Unset below stays un-gated
offersSetBackdrop: false,
description: 'Scene cards are portrait-oriented images representing the story as a whole — the kind of image that works as the scene\'s cover image, shown on its card in the scene library.',
generateHint: 'Describe the cover image, e.g., a lone airship drifting over a storm-lit mountain range',
},
};
export default {
@@ -270,7 +293,8 @@ export default {
},
computed: {
typeConfig() {
return TYPE_CONFIG[this.visType];
const config = TYPE_CONFIG[this.visType];
return { ...config, aspect: FORMAT_TO_ASPECT[config.format] };
},
sceneTitle() {
return this.scene?.title || this.scene?.name || 'the scene';
@@ -280,14 +304,10 @@ export default {
.filter(([, asset]) => asset?.meta?.vis_type === this.visType)
.map(([id, asset]) => ({ id, ...asset }));
},
// Same-type assets first, then the other scene-level vis types, so a
// Same-type assets first, then the other types managed here, so a
// variation can be started even before any image of this type exists.
referenceAssetIds() {
const sceneVisTypes = [
VIS_TYPE.SCENE_BACKGROUND,
VIS_TYPE.SCENE_ILLUSTRATION,
VIS_TYPE.SCENE_CARD,
].filter(v => v !== this.visType);
const sceneVisTypes = Object.keys(TYPE_CONFIG).filter(v => v !== this.visType);
const sameType = this.assets.map(a => a.id);
const otherTypes = Object.entries(this.assetsMap)
.filter(([, asset]) => sceneVisTypes.includes(asset?.meta?.vis_type))
@@ -352,7 +372,7 @@ export default {
},
openGenerateDialog() {
if (this.backdropAssetId && this.referenceAssetIds.includes(this.backdropAssetId)) {
if (this.typeConfig.offersSetBackdrop && this.backdropAssetId && this.referenceAssetIds.includes(this.backdropAssetId)) {
this.selectedReferenceAssetId = this.backdropAssetId;
} else {
this.selectedReferenceAssetId = this.referenceAssetIds[0] || null;
@@ -387,7 +407,7 @@ export default {
negative_prompt: null,
vis_type: this.visType,
gen_type: GEN_TYPE.IMAGE_EDIT,
format: FORMAT_TYPE.LANDSCAPE,
format: this.typeConfig.format,
reference_assets: [this.selectedReferenceAssetId],
inline_reference: null,
};