fix(render): apply celestial birth matrix to column vectors
Docs Deploy / Build and Deploy MkDocs (push) Successful in 40s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 40s
This commit is contained in:
4 files changed
+51
-22
No files matched your search
@@ -50,7 +50,25 @@ key_time = floor(duration * (key_hour * 60 + key_minute) * 60 / 86400)
|
||||
theta = (clamp((now - birth_start) / lifetime, 0, 1) * 1.2 - 0.1) * pi
|
||||
```
|
||||
|
||||
Затем к нему применяется матрица рождения. У солнца и луны независимые
|
||||
Затем к нему применяется матрица рождения как к вектору-столбцу. Если `A` и
|
||||
`B` — углы рождения, а `x = cos(theta)` и `z = -sin(theta)`, результат равен
|
||||
|
||||
```text
|
||||
[x*cos(A) + z*sin(A)*sin(B),
|
||||
x*sin(A) - z*cos(A)*sin(B),
|
||||
z*cos(B)]
|
||||
```
|
||||
|
||||
Порядок важен для всего освещения: транспонированное умножение переносит
|
||||
солнце на другую сторону мира и меняет освещённые склоны, блики и тени.
|
||||
В GOG `Terrain.dll` (SHA-256
|
||||
`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead`)
|
||||
матрицу строит RVA `0x4A550`, а вектор преобразует `CSun::Update`, RVA
|
||||
`0x4B570`. Живой замер после 282184 мс при длительности 525000 мс и углах
|
||||
`[90, 30]` дал направление `[-0.4950135, -0.1408745, -0.8573891]`;
|
||||
Rust-тест проверяет этот результат с допуском `3e-6`.
|
||||
|
||||
У солнца и луны независимые
|
||||
интервалы и независимые направления: при отсутствии активной луны нельзя
|
||||
подменять её направление противоположностью солнца. `SunFrame::color` — это
|
||||
единственный primary directional RGB. Второй источник получает направление
|
||||
|
||||
@@ -134,21 +134,17 @@ RVA `0xF6E0`, преобразует направление текущей ма
|
||||
глубину. За фиксированными диапазонами окружения сохраняются их явные состояния.
|
||||
|
||||
Для MSH без потока цветов type 16 диапазон, цвет которого вычисляет CPU, при
|
||||
raw-флаге `Batch20` `0x0008` получает переопределение alpha только в одном
|
||||
подтверждённом случае. В GOG `Terrain.dll` с SHA-256
|
||||
`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead` проверка
|
||||
по RVA `0x1B0F0` задаёт alpha `0`, когда установлен bit `0x0040` и сброшен
|
||||
`0x0010`; поэтому для `0x0148` alpha равна нулю. Для `0x0108` и `0x0118`
|
||||
превью сохраняет alpha MAT0; для `0x0058` действует приоритет bit `0x0010`,
|
||||
также оставляя alpha MAT0. При наличии type 16 или отсутствии `0x0008`
|
||||
переопределения нет. Оно относится к одному draw range и не меняет общий
|
||||
raw-флаге `Batch20` `0x0008` получает переопределение alpha по
|
||||
[дистанционной кривой портала](#прозрачность-порталов-msh). Bit `0x0010`
|
||||
имеет приоритет; иначе bit `0x0040` задаёт нулевую alpha, а оставшаяся
|
||||
ветвь использует границы 75/95 с поправкой на FOV. При наличии type 16 или
|
||||
отсутствии `0x0008` переопределения нет. Оно относится к одному draw range и не меняет общий
|
||||
материал; alpha `0` временно задаёт число индексов `0`, а при очистке
|
||||
переопределения исходное число индексов восстанавливается.
|
||||
|
||||
Общий fade по расстоянию пока не реализован. Открыты точная метрика расстояния,
|
||||
выбор первого CPU-принятого треугольника диапазона и эквивалентность frustum- и
|
||||
culling-отбору оригинала. Поэтому состояния `0x0108` и `0x0118` оставляют alpha
|
||||
MAT0, пока эти входные данные не установлены.
|
||||
Fade обновляется с камерой каждый кадр. Открыт выбор первой принятой вершины
|
||||
после native CPU clipping: приложение пока берёт первую индексированную
|
||||
вершину диапазона и считает это приближение в `render_coverage`.
|
||||
|
||||
В превью с фиксированной камерой диапазоны туманности и звёзд, купола и облаков
|
||||
явно помечаются как прозрачный фон. Непрозрачные диапазоны мира остаются на
|
||||
|
||||
Reference in new issue
Block a user