feat(runtime): publish provider values into model node state
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
This commit is contained in:
6 files changed
+156
-22
No files matched your search
@@ -343,9 +343,11 @@ MSH-часть проверки подтверждает начальный сн
|
||||
`Control.dll+0xf940` кладёт результат selector `3` в текущее и обработанное
|
||||
количество; при подтверждённых единичных множителях это raw `max_volume` NDP.
|
||||
Прямой API `apply_loaded_mission_control_node_delta` меняет amount, долю, флаг
|
||||
истощения, aggregate и dirty, возвращая обязательную публикацию `0x200` для
|
||||
узла. Он пока не доставляет её в AniMesh и не выполняет пересчёт стадий,
|
||||
видимости, FX или время Control. Поэтому обработанное количество остаётся
|
||||
истощения, aggregate и dirty, применяя публикацию `0x200` к CPU-проекции
|
||||
соответствующего узла модели. Исходный `AniMesh.dll+0x5750` подтверждён в
|
||||
связке с `Control+0x10f30`: меняется только поле узла `+0x124`, а стадия и
|
||||
соседние узлы сохраняются. Эта проекция ещё не подключена к GPU/window path
|
||||
и не выполняет пересчёт стадий, видимости, FX или время Control. Поэтому обработанное количество остаётся
|
||||
прежним. Гибель root/critical узла и неизвестные flags/aggregate дают явную
|
||||
ошибку до записи; неподдержанные численные диапазоны тоже отклоняются.
|
||||
|
||||
|
||||
@@ -672,8 +672,28 @@ native `+0x590` получает `max(0, total + (new - old))`, `+0x14` — до
|
||||
это начальное значение.
|
||||
|
||||
Rust сохраняет начальные и текущие поля отдельно. Возвращаемая
|
||||
`ControlNodeProviderPublication` содержит ключ и значение для обязательного
|
||||
callback узла с selector `0x200`; автоматической доставки в AniMesh пока нет.
|
||||
`ControlNodeProviderPublication` содержит ключ и значение уже применённого
|
||||
callback selector `0x200` в CPU-проекции узла. У `AniMesh.dll` с SHA-256
|
||||
`65659bf67f20e5be77d67a5b2f59968f61b94293143807fa59ca451c560c4f7e`
|
||||
primary vtable RVA `0x2057c`, slot `+0x34`, указывает на `0x5750`.
|
||||
Этот stdcall-обработчик принимает четыре DWORD: owner, ordinal, selector,
|
||||
raw float value. Только selector `0x200` записывает float в
|
||||
`owner[+0x1a8] + ordinal * 0x130 + 0x124`. Видимая стадия `+0x1c` при этом не
|
||||
меняется. Конструктор строки RVA `0x123e0` задаёт начальные `+0x124 = 1.0`
|
||||
и `+0x1c = 0`.
|
||||
|
||||
Native live-provider oracle использует оригинальный конструктор этих строк и
|
||||
передаёт callback `Control+0x10f30` в исходный `AniMesh+0x5750` через
|
||||
прозрачную записывающую трассу обёртку. Проверены значения `0.6` и `0.1`,
|
||||
отсутствие записи у соседнего узла и прежняя стадия `77` у целевого узла;
|
||||
selector `0x201` ничего не меняет. При signed-zero no-publication случае
|
||||
provider остаётся с заданным тестом значением `0.25`, а модель сохраняет
|
||||
последнее опубликованное `0.1`. Ещё один native вектор показывает, что
|
||||
стадийное наследование доли родителя тоже не переписывает `+0x124` модели.
|
||||
Поэтому Rust хранит `mesh_state.type1_value_bits` отдельно от
|
||||
`current_type1_value_bits` provider, а `mesh_state.visible_stage` — отдельно от
|
||||
будущего Control stage/sentinel. Неизвестный узел даёт ошибку без частичной
|
||||
записи; callback отражён в CPU-проекции, но GPU/window path ещё не подключён.
|
||||
Полный пересчёт стадии `0x11130`/`0x11220`, видимости и FX также не вызывается.
|
||||
Истощение корня или критического узла возвращает `UnsupportedNodeLifecycle`
|
||||
до записи: состояние владельца `+0x550`, отложенная гибель и сопутствующие
|
||||
@@ -1049,7 +1069,8 @@ Licensed full-load regression `full_load_builds_effective_control_device_table_f
|
||||
Проверка использует исходные CTL/NDP/MSH, затем явно уменьшает количество
|
||||
строки tag-26 устройства вдвое. Rust `0xe00` и `0x1002` дают `0.5`, и обычный
|
||||
шаг runtime сохраняет эту долю. Это вызов прямого API, а не полный живой
|
||||
Control tick или автоматическая публикация изменения в AniMesh.
|
||||
Control tick. Проекция поля модели `+0x124` также получает `0.5`, а её видимая
|
||||
стадия остаётся `0`; GPU/window path этим тестом не исполняется.
|
||||
|
||||
Native-часть этих ABI проверок воспроизводит
|
||||
`behavior_distributor_tick_native_oracle.cs` на синтетически выделенной памяти
|
||||
|
||||
@@ -362,8 +362,8 @@ CollObject, Control и PhysicalModel, пропуская отсутствующ
|
||||
[техническом разборе](../appendices/script-vm.md#доставка-игровых-часов-в-control).
|
||||
Статическая цепочка ещё не доказывает исполнение активного Control update на
|
||||
миссии. Rust сохраняет исходные и текущие provider-поля отдельно. Прямой delta
|
||||
API меняет строку и возвращает публикацию узла, но описанный clock/budget-путь
|
||||
пока не подключён.
|
||||
API меняет строку и значение соответствующего CPU-узла модели, но описанный
|
||||
clock/budget-путь и вывод этого состояния в окно пока не подключены.
|
||||
|
||||
В текущем runtime `step_headless` и `frame` получают время очереди явным
|
||||
аргументом `u32`. По нему запускается представленный ресурсный планировщик
|
||||
|
||||
@@ -945,9 +945,22 @@ let ratio = amount / maximum;
|
||||
Это три отдельные операции над `f32`, с проверкой поддерживаемого численного
|
||||
диапазона до записи состояния. Исходные `initial_*` поля сохраняются;
|
||||
`processed_amount_bits` тоже не меняется, поскольку его обновляет другой
|
||||
нативный проход — пересчёт стадий. API возвращает обязательную публикацию
|
||||
`ControlNodeProviderPublication` для узла и selector `0x200`; сам callback
|
||||
AniMesh и пересчёт стадий этим API не исполняются. Истощение корня либо узла
|
||||
нативный проход — пересчёт стадий. Публикация selector `0x200` теперь применяется
|
||||
к CPU-состоянию соответствующего узла модели. Результат
|
||||
`ControlNodeProviderPublication` описывает уже выполненную запись. Пересчёт
|
||||
стадий и вывод изменённой модели в окно этим API ещё не запускаются.
|
||||
|
||||
У AniMesh есть собственное поле значения узла, отдельное от доли Control.
|
||||
Конструктор `AniMesh.dll+0x123e0` начинает его с `1.0`, а видимую стадию — с
|
||||
`0`. Callback `+0x5750` при selector `0x200` записывает число в поле `+0x124`
|
||||
строки модели с шагом `0x130`, не меняя её стадию `+0x1c` и соседние узлы.
|
||||
Native oracle соединяет исходные `Control+0x10f30` и `AniMesh+0x5750`; между
|
||||
ними стоит только запись диагностической трассы. Прямая добавка `20` к
|
||||
количеству `40` из максимума `100` записывает `0.6` и в provider, и в узел
|
||||
модели. Эти поля нельзя объединять: наследование родительской доли в отдельном
|
||||
стадийном проходе меняет provider, не повторяя callback `0x200`.
|
||||
В Rust `mesh_state` хранит это отдельное значение и видимую стадию;
|
||||
неразрешённый узел прерывает изменение до записи остальных полей. Истощение корня либо узла
|
||||
с критическим флагом `1` пока возвращает ошибку без изменения состояния:
|
||||
эта ветвь требует полного lifecycle объекта, а не только нового количества.
|
||||
|
||||
|
||||
Reference in new issue
Block a user