fix(render): preserve object-local point lights on models
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s

This commit is contained in:
Valentin Popov committed 2026-11-01 13:40:12 +04:00
1 parent 315afff220
commit e8942caa23
14 files changed
+136 -30

No files matched your search

+3
View File
@@ -87,6 +87,9 @@ Raw queue clock задаёт фазу волн отдельно от време
Control Op1 пока использует цвет и радиус без случайных добавок команды;
это явное приближение считается в `render_coverage control_op1_jitter_unsupported`.
Масштаб радиуса длиной преобразованного направления и нижняя замена 0,01 восстановлены.
Локальный флаг `0x80000000` сохраняет свет на MSH владельца, исключая его
из общего света рельефа. Мерцание жёлтого источника над заводом ещё использует
авторские цвет и радиус; порядок общего native RNG пока не воспроизводится.
Control Op2 воспроизводит modes 0/2; modes 1/3, body+76 и неподдержанные
time modes/привязки считаются как `render_coverage control_op2_unsupported`.
+6 -3
View File
@@ -350,9 +350,12 @@ Renderer preview поддерживает FXID-команды Op3 modes 0–2, O
Op3 mode0 строит camera-facing поверхность из анимируемых локальных позиции и
масштаба; Op7/Op8 обновляют отдельные элементы particle pool; Op9 создаёт
индексированную полусферическую сетку. Op1 вычисляется отдельно как список
point lights: selector 1 и записи без `flags & 0x80000000` входят в общий
diffuse light set. Записи с этим битом сохраняют native flags для специальных
путей и projected shadows, но не добавляются в общий diffuse список.
point lights: selector 1 без `flags & 0x80000000` освещает мир, а с этим битом —
собственное строение или юнит. Локальный источник нельзя удалять из освещения
MSH вместе с исключением из общего списка рельефа. Preview сохраняет исходные
flags для projected shadows и передаёт в renderer область действия корневого
объекта. Область ноль означает общий свет; у локального источника и диапазонов
его модели одинаковый ненулевой идентификатор.
Body discriminator Op3 читается из первого DWORD `FxCommand.raw_body`; offsets
в evaluator-е относительны к данным после четырёхбайтового command word. Mode 1
+17
View File
@@ -126,6 +126,23 @@ RVA `0xF6E0`, преобразует направление текущей ма
число таких Control-команд как `control_op1_jitter_unsupported` и использует
их авторские значения. У синего источника в проверенном захвате добавки нулевые.
Флаг источника `0x80000000` отделяет локальный свет объекта от общего света
мира. В эталонной `Terrain.dll` (SHA-256
`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead`)
`CLightManager` RVA `0x4C1D0` ведёт отдельные числа всех активных и общих
источников; второй счётчик исключает этот бит. Живой вход `CShade` RVA
`0x2E4A0` подтверждает различие: завод получает жёлтый источник с flags
`0xA0000000`, а рельеф — только общие источники. Для выбранной вершины крыши
native diffuse `1,205386/1,095748/1,893271` и specular после переноса переполнения
`0,160597/0,147096/0,358346` воспроизводятся формулой shader с теми же входами
с отклонением менее `0,0002`. Менять формулу блика для этого дефекта не нужно.
В Vulkan каждый свет хранит `owner_scope` в последнем DWORD 48-байтовой
SSBO-записи; область диапазона передаётся через `firstInstance`. Нулевая
область света доступна всем диапазонам, ненулевая — только совпадающему
владельцу. Terrain и геометрия без владельца имеют область ноль. Один общий
буфер сохраняется; отдельные наборы света для каждого строения не создаются.
## Элемент отрисовки
Подготовленный элемент отрисовки содержит:
+7 -3
View File
@@ -854,9 +854,13 @@ emit не должен повторно менять игровое состоя
gate. Type 4 point list задаёт локальную матрицу; текущие MSH owner и mounted
node poses входят в transform до локальной FX basis. Реализованные visuals
охватывают Op3 modes 0–2, Op4, Op7/8 particle pools и Op9 generated mesh. Op1
selector 1 добавляет point lights без native flag `0x80000000` в общий diffuse
список; остальные active records сохраняют flags для специальных путей и
projected shadows. Радиус источника масштабируется длиной его преобразованного
selector 1 добавляет point lights в освещение. Native flag `0x80000000`
ограничивает источник собственным объектом: такая лампа освещает завод, но
не рельеф вокруг него. Это не запрет на обычный расчёт света. Потеря локального
жёлтого источника над трубой делала крышу завода заметно холоднее оригинала.
Renderer сопоставляет владельца лампы и диапазона MSH; общие источники
доступны всем поверхностям. Исходные flags сохраняются также для projected
shadows. Радиус источника масштабируется длиной его преобразованного
направления до нормализации. Например, локальный радиус 7 при масштабе узла
около 4,85 освещает область радиусом около 34. Потеря этого множителя оставляла
синий свет завода почти незаметным. Неположительный итог заменяется на 0,01.