aboutsummaryrefslogtreecommitdiff
path: root/docs/reference/environment-effects.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/reference/environment-effects.md')
-rw-r--r--docs/reference/environment-effects.md25
1 files changed, 19 insertions, 6 deletions
diff --git a/docs/reference/environment-effects.md b/docs/reference/environment-effects.md
index 677c159..0e709d9 100644
--- a/docs/reference/environment-effects.md
+++ b/docs/reference/environment-effects.md
@@ -416,10 +416,23 @@ RVA `0x93D0`, ветка mode 1 с `0x9739`, сборка столбцов `0x97
XY, ненулевой выбирает статические quad/cap координаты. Op4 вычисляет локальное
расстояние камеры тем же component-wise projection, что использует native path.
-FX-команды используют общий preview clock и ограниченный набор time modes:
-mode 0 оставляет фазу равной нулю, mode 1 вычисляет `elapsed / duration` без
-зажатия, mode 2 повторяет цикл. Header flags `0x200` и `0x20` преобразуют эту
-фазу; command path `0x8120` зажимает результат только после преобразований.
+FX-команды одной Control-строки используют общие часы экземпляра
+`fparkan_fx::clock::FxInstanceClock`. Время хранится в миллисекундах `f32`,
+отдельно от длительности документа: mode 0 возвращает постоянную фазу
+(при создании ноль), mode 1 — `(now − origin) / duration`, mode 2 повторяет
+цикл, mode 3 возвращает `1 − (now − origin) / duration`.
+Header flags `0x200` и `0x20` преобразуют незажатую фазу; command path
+`0x8120` зажимает результат только после преобразований.
+Вызов `set_time` меняет начало отсчёта и режим экземпляра, сохраняя режим
+документа. Запрос перезапуска (`Effect.dll` RVA `0x7B40`, instance bit `0x20`)
+срабатывает после конца текущего времени жизни: следующий update начинает
+новый цикл в своём времени и возвращает режим документа. Это отдельный флаг,
+не header `0x20`, складывающий фазу треугольником. Правила режимов, gates
+`0x80/0x100` и установления времени сверены вызовом эталонной DLL с x87 CW
+`0x007F`; отложенный переход закреплён Rust-тестом по ветви update `0x8120`.
+Все экземпляры статического preview пока создаются в момент ноль; геометрия,
+свет и звук получают одну фазу на обновление сцены. Команды Control ещё не
+меняют эти часы, а нативная очередь обновления с шагом 50 ms не моделируется.
В [эталонной Effect.dll](original-binaries.md) RVA `0x5C60` режимы 4–17
читают состояние владельца или провайдера; режим 14 тоже входит в эту группу.
Пропуски при расширении выбранных начальных Control-строк учитываются по
@@ -433,8 +446,8 @@ Effect renderer проверяет header bit `0x800` только при
render selector 0; native AniMesh component path был захвачен с selector 1,
поэтому preview использует selector 1 и не подавляет такие visual commands.
Этот capture также показал `0xD00` FX entries в 53-entry manager. Динамическое
-состояние manager `A8`, связанное с header gate и фактической FX phase, пока не
-моделируется. Header bit `0x10` относится к activation lifecycle и сам по себе
+состояние manager `A8` пока заменено нулём; экземпляры с gates `0x80/0x100`
+считаются в `control_fx_manager_flag_stub`. Header bit `0x10` относится к activation lifecycle и сам по себе
не отключает draw.
Header jitter и random shift хранятся один раз на Control row и совместно
применяются к его sibling-командам; отдельный детерминированный поток каждой