|
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> |
|---|
|
|
| v2/packages/engine/src/render/__tests__/polyWindowPersp.test.ts 0 → 100644 |
|---|
| v2/packages/engine/src/render/cameraMath.ts |
|---|
| v2/packages/engine/src/render/polyWindow.ts |
|---|
| v2/packages/engine/src/render/voxelRenderer.ts |
|---|