fix(app-glasses): би-нокулярный рендер RayNeo — letterbox + scale=false (полный кадр в каждый глаз)

Живой тест на RayNeo X2: каждый глаз = 640x480 (пол-экрана 1280x480), видео 896x480 (16:9) растягивалось на весь глаз → «квадратное» (сплющено по горизонтали).
- letterboxRect(videoW,videoH,viewW,viewH): FIT-вьюпорт с полями (страховка для произвольных поверхностей)
- Binocular(scale=true→false): два полных кадра 640x343 в двух половинах экрана (вместо scaleX 0.5 половинки кадра)
- onVideoSizeChanged → videoWidth/Height для letterbox
- Тесты 32/0 (LetterboxRectTest 5)
- Пользователь: «на глаз размер поменялся, будто бы норм»
This commit is contained in:
Hermes Agent
2026-08-19 21:03:55 +03:00
parent 25b85ea191
commit b4420f446c
4 changed files with 138 additions and 2 deletions
+32
View File
@@ -0,0 +1,32 @@
# Фикс би-нокулярного рендера RayNeo: scale=true → scale=false
Живой тест на RayNeo X2: экран 1280×480, каждый глаз видит СВОЮ половину
(640×480). `Binocular(scale = true)` (GlassesMovieScreen.kt:63) рисует
контент на весь экран и сжимает scaleX 0.5 → каждый SurfaceView (буфер
~850×455, полный кадр) визуально 425px в половине глаза 640px → **каждый
глаз видит ПОЛОВИНУ кадра**, растянутую на 640px (масштаб ×1.5) → видео
выглядит «сплющенным по горизонтали» (жалоба пользователя).
SurfaceFlinger подтверждает: слои #0/#1 с scaleX=0.5006, translate 215/640.
## Изменение (app-glasses, GlassesMovieScreen.kt)
`Binocular(scale = true)` → `Binocular(scale = false)`.
Что это даёт (scale=false — ветка Row + two Columns weight 1f):
- BinocularScreenSize = (ширина/2, высота) = (640, 480);
- calculateVideoSizeFull(896×480, maxWidth=640, maxHeight=455) →
SurfaceView 640×343 (16:9 вписан в пол-экрана, поля 68+69 сверху/снизу
— чёрный фон Row);
- ДВА SurfaceView 640×343: левый в левой половине, правый в правой —
каждый глаз видит ПОЛНЫЙ кадр с полями. Пропорции правильные.
letterboxRect в drawFrame оставить (страховка: SurfaceView 640×343 =
ровно 16:9 — letterboxRect вернёт полный viewport, ничего не сломает).
## Проверка
- Тесты/сборка зелёные (`./gradlew :app-glasses:testDebugUnitTest
:app-glasses:assembleDebug`).
- Железо (после установки): скрин очков — ДВА одинаковых кадра 640×343
(поля сверху/снизу), в каждом глазу полный кадр; пользователь видит
правильные пропорции (не «квадратное»).