From bbd31fc25336d6a2e6c5927ad4d7101696f8bd78 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Sun, 1 Nov 2026 13:55:35 +0400 Subject: feat(fx): animate native point light color and radius jitter --- docs/appendices/knowledge-boundaries.md | 9 +++++---- docs/reference/environment-effects.md | 23 +++++++++++++++++++++-- docs/reference/render-frame.md | 8 +++++--- docs/tomes/05-render.md | 10 ++++++++-- 4 files changed, 39 insertions(+), 11 deletions(-) (limited to 'docs') diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index 103769c..ed821e4 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -84,12 +84,13 @@ Raw queue clock задаёт фазу волн отдельно от време ## FXID field-level semantics -Control Op1 пока использует цвет и радиус без случайных добавок команды; -это явное приближение считается в `render_coverage control_op1_jitter_unsupported`. +Control Op1 воспроизводит добавки к RGBA и радиусу двумя сохраняемыми RNG-потоками. +Seeds просмотра `1/1` и общий порядок других FX ещё не совпадают с оригиналом; +это явное приближение считается в `render_coverage control_op1_rng_schedule_approx`. Масштаб радиуса длиной преобразованного направления и нижняя замена 0,01 восстановлены. Локальный флаг `0x80000000` сохраняет свет на MSH владельца, исключая его -из общего света рельефа. Мерцание жёлтого источника над заводом ещё использует -авторские цвет и радиус; порядок общего native RNG пока не воспроизводится. +из общего света рельефа. Мерцание жёлтого источника над заводом подключено; +конкретная последовательность пока не является эталоном совпадения во времени. Control Op2 воспроизводит modes 0/2; modes 1/3, body+76 и неподдержанные time modes/привязки считаются как `render_coverage control_op2_unsupported`. diff --git a/docs/reference/environment-effects.md b/docs/reference/environment-effects.md index 2a17838..23115af 100644 --- a/docs/reference/environment-effects.md +++ b/docs/reference/environment-effects.md @@ -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 и diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md index 8bd548f..b3c0be5 100644 --- a/docs/reference/render-frame.md +++ b/docs/reference/render-frame.md @@ -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 diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md index 1329268..8c059f2 100644 --- a/docs/tomes/05-render.md +++ b/docs/tomes/05-render.md @@ -864,8 +864,14 @@ shadows. Радиус источника масштабируется длино направления до нормализации. Например, локальный радиус 7 при масштабе узла около 4,85 освещает область радиусом около 34. Потеря этого множителя оставляла синий свет завода почти незаметным. Неположительный итог заменяется на 0,01. -Случайные добавки к цвету и радиусу пока явно считаются в -`render_coverage control_op1_jitter_unsupported`. +К плавным кривым добавляется мерцание: каждый канал RGBA и радиус получают +случайную поправку от минус половины авторской амплитуды до плюс половины. +Она не накапливается, а заново прибавляется к текущей кривой. Два потока +случайных чисел сохраняются между обновлениями сцены; даже погасший на время +свет расходует их. Повторная отправка кадра не меняет уже выбранный свет. +Формула и порядок выборок внутри команды сверены с исполнением оригинала. +Начальные значения просмотра и общий порядок вызовов других FX пока +приблизительные и считаются в `render_coverage control_op1_rng_schedule_approx`. Эффект может одновременно рисовать поверхность и издавать звук. Для Op2 приложение создаёт отдельный звуковой источник у каждого экземпляра команды: -- cgit v1.2.3