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>
1 parent d483fcc commit 705772afb601bb442b2509c73e9b81f7ec4ba589
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 5 hours ago
Showing 4 changed files
View
v2/packages/engine/src/render/__tests__/polyWindowPersp.test.ts 0 → 100644
View
v2/packages/engine/src/render/cameraMath.ts
View
v2/packages/engine/src/render/polyWindow.ts
View
v2/packages/engine/src/render/voxelRenderer.ts