feat(fx): play ambient Control sound commands
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s
This commit is contained in:
7 files changed
+573
-24
No files matched your search
@@ -70,6 +70,10 @@ Control Op1 пока использует цвет и радиус без слу
|
||||
это явное приближение считается в `render_coverage control_op1_jitter_unsupported`.
|
||||
Масштаб радиуса длиной преобразованного направления и нижняя замена 0,01 восстановлены.
|
||||
|
||||
Control Op2 воспроизводит modes 0/2; modes 1/3, body+76 и неподдержанные
|
||||
time modes/привязки считаются как `render_coverage control_op2_unsupported`.
|
||||
Управление фазой экземпляра командами Control остаётся до его подключения в runtime.
|
||||
|
||||
Размеры команд, resource references, lifecycle, flags families и используемые
|
||||
time modes известны. Не закрыто значение каждого поля body opcodes 1--10,
|
||||
отсутствующий во всех проверенных каталогах opcode 6 и точные формулы редких
|
||||
|
||||
@@ -218,6 +218,41 @@ OneShot -> воспроизвести разовый звук молни
|
||||
отдельный spatial source, применяет DirectSound range/pan и текущий listener.
|
||||
Отсутствие устройства вывода не должно останавливать симуляцию.
|
||||
|
||||
### Звуки Control
|
||||
|
||||
Команда Op2 может принадлежать не погоде, а экземпляру эффекта на узле модели.
|
||||
`fparkan-fx::ambient_sound` хранит её временное окно и предыдущее значение
|
||||
фазы. В режиме 0 разовый звук начинается при строгом пересечении начала окна:
|
||||
`previous <= start && start < phase`, если фаза движется вперёд. Значение
|
||||
`phase == 1` для этой проверки заменяется нулём и подготавливает следующий
|
||||
цикл. Режим 2 включает loop на обеих границах окна; внутри окна уже работающий
|
||||
источник обновляется, а не запускается заново. Выход за окно останавливает его.
|
||||
|
||||
Позиция интерполируется между двумя локальными точками и проходит через ту же
|
||||
матрицу владельца, что и графические команды. Минимальная и максимальная
|
||||
дистанции остаются постоянными; частота интерполируется по фазе окна.
|
||||
Каждая команда получает отдельный источник звука, даже если ресурс совпадает
|
||||
с ресурсом соседней команды. Дождь сохраняет свой loop. Перемещение слушателя,
|
||||
потеря фокуса и завершение приложения затрагивают все эти источники.
|
||||
|
||||
Эти ветви восстановлены в GOG `Effect.dll` (сборка из
|
||||
[таблицы бинарников](original-binaries.md)): init RVA `0x12D10`, update
|
||||
`0x12EB0`. Живой loop `sounds.lib:f_defl.wav` передаёт в звуковой backend
|
||||
диапазон `12/80`, частоту `1` и мировую позицию из матрицы владельца.
|
||||
В режиме 2 признак loop берётся из первого DWORD body, а не из command flag.
|
||||
|
||||
Обычное создание эффекта Control сохраняет time mode заголовка и задаёт
|
||||
постоянную фазу нулём. Raw selector строки служит ID экземпляра, а не номером
|
||||
режима времени. Поэтому `f_comp_sfx` с time mode 0 и началом окна `0.001`
|
||||
остаётся тихим до управляющей команды Control. Preview такие команды ещё не
|
||||
исполняет. Периодические звуки с time mode 2 уже следуют общим часам и текущей
|
||||
позе узла. `render_coverage control_op2_supported` считает подготовленные
|
||||
команды, а `control_sound_start/stop` показывает фактические переходы.
|
||||
|
||||
Неизвестные backend modes 1/3, ненулевое поле body+76, неподдержанное время
|
||||
или привязка владельца пропускаются с `render_coverage control_op2_unsupported`.
|
||||
Они не заменяются разовым звуком или произвольным loop.
|
||||
|
||||
## Цвет солнца
|
||||
|
||||
Солнце берёт цвет спрайта и прозрачность бликов из `palette[10]` расписания
|
||||
|
||||
@@ -845,6 +845,17 @@ projected shadows. Радиус источника масштабируется
|
||||
синий свет завода почти незаметным. Неположительный итог заменяется на 0,01.
|
||||
Случайные добавки к цвету и радиусу пока явно считаются в
|
||||
`render_coverage control_op1_jitter_unsupported`.
|
||||
|
||||
Эффект может одновременно рисовать поверхность и издавать звук. Для Op2
|
||||
приложение создаёт отдельный звуковой источник у каждого экземпляра команды:
|
||||
несколько одинаковых механизмов слышны одновременно и не заменяют дождь.
|
||||
Позиция следует анимируемому узлу, а фаза включает, обновляет и останавливает
|
||||
loop. Обычная строка Control создаёт экземпляр с нулевой постоянной фазой;
|
||||
звуки с таким режимом ожидают отдельной управляющей команды. Периодические
|
||||
звуки работают по часам уже в preview. Устройство вывода остаётся в приложении,
|
||||
а правила переходов и параметров — в `fparkan-fx::ambient_sound`
|
||||
([подробнее](../reference/environment-effects.md#звуки-control)).
|
||||
|
||||
Туман также зависит от расстояния нелинейно: между ближней и дальней границами
|
||||
движок интерполирует по квадрату дистанции. При границах 0 и 700 точка в 350
|
||||
получает четверть тумана, а не половину. Это сохраняет контраст среднего плана.
|
||||
|
||||
Reference in new issue
Block a user