{Math.round(editor.files[path].size / 1024)} КБ {resultTask(path) ? "· результат готов" : ""}
+ + {resultTask(path) && } +{result.width} × {result.height}, масштаб ×{result.scale.toFixed(3)}.{Math.max(result.width, result.height) > 16383 && " Больше лимита WebP: сохранится как PNG."}
+{message}
} + {!editor.editable || version.kind !== "mod" ?Для применения создайте свой черновик мода кнопкой «Форк» в карточке игры.
: null} +Сначала обработайте один файл и проверьте результат. «Обработать» сохраняет превью локально; «Применить» заменяет выбранные файлы в моде. Анимации пропускаются с пояснением.
+{Math.round(editor.files[path].size / 1024)} КБ {resultTask(path) ? "· результат готов" : ""}
+ + {resultTask(path) && } +{message}
} +Установите SwarmUI, загрузите модель и апскейлер. В Server → Server Configuration → Network задайте AccessControlAllowOrigin: {location.origin}, сохраните и перезапустите. Проверка выше делает настоящий запрос из этого браузера.
ComfyUI: запустите с --enable-cors-header {location.origin}. A1111: --api --cors-allow-origins {location.origin}. Оставьте сервис доступным только локально.
Если браузер запрашивает доступ к локальной сети, разрешите его для сайта. При блокировке HTTP из HTTPS используйте совместимую настройку браузера или HTTPS для локального генератора. Успешная проверка API ещё не проверяет скачивание результата: сначала обработайте одну картинку в редакторе.
+В плеере: Настройки → Графика. Обработка по ходу игры включается отдельно; по умолчанию выключена. Для замены исходников откройте свой черновик мода → Библиотека.
+SwarmUI использует выбранную модель даже в режиме апскейлера; для ESRGAN выберите модельный апскейлер из списка. Animated WebP, GIF и видео исключены.
+{visible.filter((t) => t.status === "done").length} / {visible.length} готово. Одновременно обрабатывается одно изображение.
+При отмене результат активного задания отбрасывается; следующее начнётся, когда генератор освободится. После перезагрузки нажмите «Повторить».
+ {(error || imageQueue.storageError) &&{error || imageQueue.storageError}
} +{dirty ? "Есть несохранённые изменения" : "Изменения сохранены"}. Ревизия {data.revision.slice(0, 8)}. {data.baseRevision ? `База ${data.baseRevision.slice(0, 8)}` : "Историческая база неизвестна"}.
{!data.editable &&Для редактирования создайте свой черновик мода через кнопку «Форк».
} diff --git a/frontend/src/player/engine.ts b/frontend/src/player/engine.ts index 5849914..14230db 100644 --- a/frontend/src/player/engine.ts +++ b/frontend/src/player/engine.ts @@ -2,6 +2,7 @@ import { AudioSystem } from "./audio"; import { VolumeStore } from "./volume-store"; +import { LiveImages } from "../imager/live"; import { BlockingCall, JumpSignal, PyDict, Python, decodeValue, encodeValue, pyStr, truthy, userBuiltins, type Scope } from "./python"; import { Renderer, type ResolvedImage } from "./renderer"; import { fastPoint, interpolate, parseText, plainText, renderText, waitPoints } from "./text"; @@ -24,6 +25,8 @@ interface LabelRef { } export class Engine { + private liveImages?: LiveImages; + private imageScales = new Map