diff --git a/studio/src/App.tsx b/studio/src/App.tsx index 19c010a8..fec2c52c 100644 --- a/studio/src/App.tsx +++ b/studio/src/App.tsx @@ -17,18 +17,23 @@ import { usePromptHistory } from './components/SceneBuilder/PromptHistory'; import { theme } from './theme'; import { computeNextBatchSize } from './lib/generateUntil'; import { buildNegativePrompt, buildPrompt } from './lib/prompt'; +import { PoseGallery } from '@lilith/imajin-config'; import type { LayoutId, MaturityRating, ModelId, PersonAppearance, SceneState, StudioRequest } from './types'; // ─── Default state ──────────────────────────────────────────────────────────── +// Editorial standing pose — avoids the selfie/lying-down default that SDXL +// tends to generate when no pose is constrained and the prompt has a bedroom/hotel scene. +const DEFAULT_POSE = PoseGallery.helpers.getPose('sexy-leaning-wall') ?? null; + const DEFAULT_SCENE: SceneState = { promptCore: '', bodyDescriptor: 'tall woman 6 feet, hourglass figure, narrow waist, wide hips, full E cup bust, large natural breasts, long blonde hair, green eyes, slender waist, curvy hips', background: 'professional studio, clean background', shotType: 'medium-close', cameraAngle: 'eye-level', - selectedPose: null, - poseCategory: null, + selectedPose: DEFAULT_POSE, + poseCategory: DEFAULT_POSE?.category ?? null, outfitDescription: '', expressionMood: '', referenceImage: undefined, @@ -230,11 +235,14 @@ export function App(): ReactElement { const handleIdentitySelect = useCallback((id: string | undefined) => { setSelectedIdentityId(id); + // Enable InstantID face conditioning whenever an identity is active; + // disable it when cleared so it doesn't produce artifacts on text-only generations. + setAdvancedValues((prev) => ({ ...prev, enable_instantid: !!id })); if (!id || !identities) return; const identity = identities.find((i) => i.id === id || i.name === id); if (!identity?.gender) return; setScene((prev) => ({ ...prev, subjectGender: identity.gender === 'M' ? 'male' : 'female' })); - }, [identities, setScene]); + }, [identities, setScene, setAdvancedValues]); // Auto-select quinn (or first identity) on initial load if nothing is selected useEffect(() => { @@ -501,6 +509,7 @@ export function App(): ReactElement { Improve Repaint + Shoot Library {images.length > 0 ? `(${images.length})` : ''} diff --git a/studio/src/main.tsx b/studio/src/main.tsx index 0fd34752..bd2906dc 100644 --- a/studio/src/main.tsx +++ b/studio/src/main.tsx @@ -7,6 +7,7 @@ import { ImageLibraryContext, useImageLibraryState } from './hooks/useImageLibra import { Library } from './pages/Library'; import { Repaint } from './pages/Repaint'; import { Services } from './pages/Services'; +import { Shoot } from './pages/Shoot'; const queryClient = new QueryClient({ defaultOptions: { @@ -38,6 +39,7 @@ createRoot(rootEl).render( } /> } /> } /> + } /> } />