From e8942caa233a663155ffec14c1070ad5dbbb9c7b Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Sun, 1 Nov 2026 13:40:12 +0400 Subject: fix(render): preserve object-local point lights on models --- docs/appendices/knowledge-boundaries.md | 3 +++ docs/reference/environment-effects.md | 9 ++++++--- docs/reference/render-frame.md | 17 +++++++++++++++++ docs/tomes/05-render.md | 10 +++++++--- 4 files changed, 33 insertions(+), 6 deletions(-) (limited to 'docs') diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index baf5ed5..103769c 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -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`. diff --git a/docs/reference/environment-effects.md b/docs/reference/environment-effects.md index 0e709d9..2a17838 100644 --- a/docs/reference/environment-effects.md +++ b/docs/reference/environment-effects.md @@ -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 diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md index ebe3971..8bd548f 100644 --- a/docs/reference/render-frame.md +++ b/docs/reference/render-frame.md @@ -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 и геометрия без владельца имеют область ноль. Один общий +буфер сохраняется; отдельные наборы света для каждого строения не создаются. + ## Элемент отрисовки Подготовленный элемент отрисовки содержит: diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md index 7cbe7d7..1329268 100644 --- a/docs/tomes/05-render.md +++ b/docs/tomes/05-render.md @@ -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. -- cgit v1.2.3