trellis.2. unified 3d workflows

This commit is contained in:
Aggtaa
2026-09-24 13:34:06 +03:00
parent a47d23603c
commit 8db94e5c31
11 changed files with 690 additions and 177 deletions
+105 -14
View File
@@ -43,6 +43,8 @@ export interface Project {
created: number;
/** батч, из которого картинка */
batchId: number;
/** откуда исходная картинка: сгенерирована (text — SDXL) или загружена */
imageSource: 'text' | 'upload';
/** исходная картинка */
image: BatchImage;
/** последняя очищенная картинка (история очисток не хранится) */
@@ -54,26 +56,87 @@ export interface Project {
cleanError?: string;
/** положение идущей очистки в очереди ComfyUI */
live?: LiveStatus;
/** последняя 3D-модель из очищенной картинки: GLB и PNG-превью (история не хранится) */
model: FileRef | null;
modelPreview: FileRef | null;
modelUpdated: number | null;
/** число треугольников в GLB (null — неизвестно) */
modelFaces: number | null;
/**
* 3D-модель без текстур (история не хранится). Генерирует её Hunyuan3D-2 mini или TRELLIS.2;
* TRELLIS.2 заодно заполняет и texture.
*/
model: ModelArtifacts | null;
/** идёт генерация модели: prompt_id в ComfyUI */
modelJobId: string | null;
modelError?: string;
/** положение идущей генерации модели в очереди ComfyUI */
/** положение идущей генерации в очереди ComfyUI */
modelLive?: LiveStatus;
/** текстурированная модель и её текстуры (от TRELLIS.2 или Hunyuan3D-2 Paint) */
texture: TextureArtifacts | null;
/** идёт текстурирование (Paint): prompt_id в ComfyUI */
textureJobId: string | null;
textureError?: string;
textureLive?: LiveStatus;
}
/** Чем сгенерирована 3D-модель. */
export type ModelGenerator = 'hunyuan' | 'trellis';
export const GENERATOR_NAMES: Record<ModelGenerator, string> = { hunyuan: 'Hunyuan3D-2 mini', trellis: 'TRELLIS.2' };
/** Модель без текстур. */
export interface ModelArtifacts {
generator: ModelGenerator;
glb: FileRef;
/** PNG-превью (рендер без текстур) */
preview: FileRef | null;
/** число треугольников в GLB */
faces: number | null;
/** мс */
updated: number;
}
/** Откуда текстуры: вместе с моделью от TRELLIS.2 или отдельным текстурированием Hunyuan3D-2 Paint. */
export type TextureSource = 'trellis' | 'paint';
/** Текстурированная модель и всё, что к ней относится; каких-то файлов может не быть (у Paint — metallic, roughness). */
export interface TextureArtifacts {
source: TextureSource;
/** текстурированная модель */
glb: FileRef | null;
faces: number | null;
baseColor: FileRef | null;
/** металличность (канал B карты metallicRoughness glTF) в оттенках серого */
metallic: FileRef | null;
/** шероховатость (канал G карты metallicRoughness glTF) в оттенках серого */
roughness: FileRef | null;
/** изображение UV-развёртки */
uv: FileRef | null;
/** виды: у TRELLIS.2 — рендеры модели с 4 сторон, у Paint — 6 видов, нарисованных моделью */
views: FileRef[];
/** мс */
updated: number;
}
/** Генерация 3D-модели проекта. */
export interface ProjectModelRequest {
generator: ModelGenerator;
/** Пусто — случайный. */
seed: number | string;
/** Hunyuan3D-2 mini */
steps: number | string;
octree: number | string;
/** целевое число треугольников после упрощения */
faces: number | string;
/** TRELLIS.2: размер текстуры, px */
textureSize: number | string;
/** TRELLIS.2: металличность и шероховатость (карты metallic, roughness) в модели */
pbr: boolean;
}
/** Текстурирование модели проекта (Hunyuan3D-2 Paint). */
export interface ProjectTextureRequest {
/** Пусто — случайный. */
seed: number | string;
/** размер текстуры, px */
textureSize: number | string;
/** снимать блики и тени с картинки (Hunyuan3D Delight) */
delight: boolean;
}
interface BatchBase {
@@ -130,7 +193,7 @@ export interface CleanupRequest {
}
// ---------- задачи ComfyUI (таблица jobs; отслеживаются трекером) ----------
export type JobType = 'text2img' | 'cleanup' | 'model';
export type JobType = 'text2img' | 'cleanup' | 'model' | 'texture';
export type JobState = 'pending' | 'done' | 'error';
/** Состояние незавершённой задачи в очереди ComfyUI (не хранится, считается сервером на лету). */
@@ -161,10 +224,23 @@ export interface CleanupParams {
export interface ModelParams {
/** проект, к которому прикрепляется модель */
projectId: number;
generator: ModelGenerator;
seed: number;
steps: number;
octree: number;
faces: number;
/** Hunyuan3D-2 mini */
steps?: number;
octree?: number;
/** TRELLIS.2 */
textureSize?: number;
pbr?: boolean;
}
export interface TextureParams {
/** проект, к которому прикрепляется результат */
projectId: number;
seed: number;
textureSize: number;
delight: boolean;
}
interface JobOf<T extends JobType, P> {
@@ -180,7 +256,7 @@ interface JobOf<T extends JobType, P> {
params: P;
/** результаты-картинки (для model — PNG-превью) */
images: FileRef[];
/** GLB-файлы (только model) */
/** GLB-файлы (model, texture) */
models: FileRef[];
live?: LiveStatus;
}
@@ -188,7 +264,8 @@ interface JobOf<T extends JobType, P> {
export type Text2ImgJob = JobOf<'text2img', Text2ImgParams>;
export type CleanupJob = JobOf<'cleanup', CleanupParams>;
export type ModelJob = JobOf<'model', ModelParams>;
export type Job = Text2ImgJob | CleanupJob | ModelJob;
export type TextureJob = JobOf<'texture', TextureParams>;
export type Job = Text2ImgJob | CleanupJob | ModelJob | TextureJob;
// ---------- значения полей форм (тоже в SQLite) ----------
export interface Text2ImgSettings {
@@ -209,17 +286,31 @@ export interface CleanupSettings {
}
export interface ModelSettings {
generator: ModelGenerator;
seed: string;
/** Hunyuan3D-2 mini */
steps: string;
octree: string;
faces: string;
/** TRELLIS.2 */
trellisFaces: string;
textureSize: string;
trellisPbr: boolean;
}
export type SettingsByPage = { text2img: Text2ImgSettings; cleanup: CleanupSettings; model: ModelSettings };
export interface TextureSettings {
seed: string;
textureSize: string;
delight: boolean;
}
export type SettingsByPage = {
text2img: Text2ImgSettings; cleanup: CleanupSettings; model: ModelSettings; texture: TextureSettings;
};
export type SettingsPage = keyof SettingsByPage;
// ---------- очередь ComfyUI ----------
export type JobKind = 'генерация' | 'очистка фона' | '3D-модель' | 'другое';
export type JobKind = 'генерация' | 'очистка фона' | '3D-модель' | 'текстура' | 'другое';
export interface QueueItem {
id: string;