Files
Portfolio/src/scene/render-quality.ts
LucaP bc18bc2043 feat: refine nightdrive world and authored car
Integrate the Blender grand tourer with a cohesive shader-driven road, terrain, atmosphere, lighting, and post-processing pass. Refine responsive drive dynamics and sign lifecycle behavior, and add durable visual, accessibility, and performance verification evidence.
2026-09-02 23:16:25 +03:00

65 lines
1.6 KiB
TypeScript

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<Record<LiveQualityTier, Omit<RenderQualitySettings, 'pixelRatio'> & { 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,
};
}