Теней в движке не было вообще — это и было причиной того, что плоская трава
читалась как «вывернутая», хотя намотка рельефа верна: плоскости 110 граней
смотрят вверх, развёрнуто 0 из 11 776 треугольников. Проверка переворотом
подтвердила: при инверсии становится вверх 8 008 / вниз 10 353 и разворачиваются
все треугольники, то есть явно хуже.
Добавлена карта теней 2048x2048 (Depth32Float), ортографическая проекция на
область радиусом 2 600 юнитов вокруг камеры по направлению на солнце. Отдельный
пасс глубины со стороны источника; вода в него не идёт — она полупрозрачна.
В шейдере луч сравнивается с картой четырьмя сравнениями по соседним текселям
и сглаживается smoothstep, иначе край тени идёт лестницей. Смещение по
нормали на 3 юнита убирает полосу самозатенения.
Солнце в небе: направление пишется в uniform камеры шестым vec4, небо рисует
ядро 2,5 градуса и ореол до 12.
Сверка с GMod на той же камере, что в E11:
бетон 143,6 -> 147,0 (было 87,8)
трава 127,1 -> 129,0 (было 77,3)
небо 199,7 -> 196,9
Расходится стена в тени: GMod 36,4, у нас 124,6. Основной свет даёт запечённая
лайтмапа, а динамическое солнце при SUN_BRIGHTNESS_SCALE = 900 вносит малую
долю, поэтому затенение этой стены у нас не гаснет. Причина не найдена,
записана в PARITY.md E12.5.
Заодно добавлен Mat4::ortho в math.
- AABB игрока: ступни на position.z (было — центр), фикс проекций на нормали
(учёт знака компонент) — игрок больше не проваливается сквозь пол
- коллизия displacement'ов: SAT AABB-треугольник (13 осей, минимальный сдвиг
для тонких поверхностей) + пространственная сетка 128 юнитов
- ориентация сетки displacement'ов: стартовый угол по startPosition, далее по
порядку обхода грани (VBSP AdjustSurfPointData); индексы a*side+b; проверено
на gm_construct — 332 совпадающих ребра соседних displacement'ов
- нормали displacement'ов наружу (порядок обхода как у граней BSP)
- тесты игрока: падение на пол, стояние на треугольнике, направления стрейфа