import type { LiveQualityTier } from '@/scene/types'; export interface RenderQualitySettings { pixelRatio: number; roadSegments: number; terrainSegments: number; terrainOctaves: 1 | 2 | 3; starCount: number; streakCount: number; postScale: number; postEffects: boolean; } const settings: Readonly & { dprCap: number }>> = { high: { dprCap: 1.5, roadSegments: 224, terrainSegments: 112, terrainOctaves: 3, starCount: 760, streakCount: 112, postScale: 1, postEffects: true, }, medium: { dprCap: 1.5, roadSegments: 168, terrainSegments: 80, terrainOctaves: 2, starCount: 420, streakCount: 64, postScale: 0.7, postEffects: true, }, low: { dprCap: 1.25, roadSegments: 112, terrainSegments: 48, terrainOctaves: 1, starCount: 160, streakCount: 28, postScale: 0, postEffects: false, }, }; export function renderQualityFor( tier: LiveQualityTier, devicePixelRatio: number, mobileOrTablet: boolean, ): RenderQualitySettings { const selected = settings[tier]; const finiteDpr = Number.isFinite(devicePixelRatio) ? Math.max(1, devicePixelRatio) : 1; return { pixelRatio: Math.min(finiteDpr, selected.dprCap, mobileOrTablet ? 1.5 : 2), roadSegments: selected.roadSegments, terrainSegments: selected.terrainSegments, terrainOctaves: selected.terrainOctaves, starCount: selected.starCount, streakCount: selected.streakCount, postScale: selected.postScale, postEffects: selected.postEffects, }; }