feat(fx): animate native point light color and radius jitter
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s

This commit is contained in:
Valentin Popov committed 2026-11-01 13:55:35 +04:00
1 parent e8942caa23
commit bbd31fc253
6 files changed
+222 -22

No files matched your search

+21 -2
View File
@@ -165,13 +165,32 @@ opcode 1; обе границы включены, а коэффициент вы
Позиция, направление, цвет и range интерполируются по концам команды.
Позиция и направление переводятся через основу родителя; направление после
этого нормализуется, а нулевой вектор остаётся нулевым. Range сохраняет
авторское значение без ограничения снизу. Типы Op1 `1`, `2`, `5`, `6` и `7`
этого нормализуется, а нулевой вектор остаётся нулевым. Радиус умножается на
длину преобразованного направления; неположительный результат заменяется на
`0,01`. Типы Op1 `1`, `2`, `5`, `6` и `7`
выбирают point-light selector `1`; их native flags сохраняются. Типы `3` и
`4` выбирают другие классы записей LightManager и не попадают в generic список
точечного света. У `LightningEffect` выборка тех же полей использует отдельные
ограничение по длительности FXID и правила безопасной обработки.
Generic Control Op1 добавляет к интерполированным RGBA и радиусу равномерный
шум `U × (amplitude / 65536) − amplitude / 2`, где `U` — очередное 16-битное
слово native FX-генератора. Цветовые амплитуды лежат в body `92..108`,
амплитуда радиуса — в `116..120`. Радиус с этой добавкой затем умножается на
длину преобразованного направления и ограничивается снизу `0,01`.
В [эталонной Effect.dll](original-binaries.md) RVA `0xF6E0` расходует слова
в порядке A, B, G, R, радиус: R использует общий поток DLL, остальные четыре
выборки — отдельный поток Op1. Нулевая амплитуда и выход за интервал команды
не отменяют расход этих слов. Четыре активные выборки RGBA и состояния обоих
генераторов после пяти вызовов совпали побитно с DLL при CW `0x007F`;
сравнение радиуса учитывает известное приближение native FastProc длины.
Приложение сохраняет состояния между обновлениями сцены, не пересчитывая их
при повторной отправке кадра. Начальные seeds просмотра равны `1/1`;
инициализация и общий порядок выборок остальных FX ещё не воспроизведены.
Эта граница учитывается в `control_op1_rng_schedule_approx`: мерцание
подключено, но его конкретная последовательность ещё не служит эталоном parity.
## Молния и звуковые события
`decode_env_lightning_fxid` извлекает из FXID длительность, ссылки opcode 3 и
+5 -3
View File
@@ -122,9 +122,11 @@ RVA `0xF6E0`, преобразует направление текущей ма
завода локальный радиус 7 и длина `0x409B1F91` дали радиус `0x4207BB9F`.
Это же значение проверяется Rust-тестом общего Op1 evaluator.
Случайные добавки цвета и радиуса ещё не воспроизводятся; приложение сообщает
число таких Control-команд как `control_op1_jitter_unsupported` и использует
их авторские значения. У синего источника в проверенном захвате добавки нулевые.
Случайные добавки к RGBA и радиусу воспроизводятся двумя сохраняемыми потоками;
формула и расход слов внутри Op1 сверены исполнением DLL. Инициализация
и общий порядок других FX ещё приближённые: такие команды считаются в
`control_op1_rng_schedule_approx`. У синего источника в проверенном захвате
амплитуды нулевые; у жёлтого света над трубой они меняют освещение крыши.
Флаг источника `0x80000000` отделяет локальный свет объекта от общего света
мира. В эталонной `Terrain.dll` (SHA-256