engine: окно частиц пирамидой (перспективные режимы камеры)
...
polyWindow.ts: particleWindowPersp — боковые грани пирамиды через камеру
(n·δ ≤ n·d), near/far плоскости с честными смещениями, тот же polyAABB.
Контракт: окно всегда конечное — пустой фрустум (взгляд в небо, far cap
D·3 → 0) даёт вырожденный бокс в точке цели вместо ±Infinity, иначе
wrapV у осадков делит на размер окна и размножает NaN.
voxelRenderer.visibleWindow: ветка iso/persp по режиму, сигнатура без
изменений; persp: tanHalf = tan(PERSP_FOV/2), far = min(camera.far,
D·PERSP_WINDOW_FAR_K). cameraMath: экспорт PERSP_WINDOW_FAR_K = 3.
Тесты polyWindowPersp: земля перед камерой внутри, позади/под камерой
снаружи, вырожденные углы и пустой фрустум — конечное окно, far cap
режет окно. Потребители (weatherWindow, ash, ambientParticles, airFx)
не тронуты. check:fast 401 тестов, гейт погоды 26/26 (изо не сломан).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
10 hours ago