fix(lighting): #143 — dynamic lights use retail's D3D 1/d attenuation (portal + viewer spread)
The portal swirl's magenta light (and the viewer fill) read as a tight, concentrated pool vs retail's soft, room-wide tint. Cause: acdream applied its STATIC dat-bake falloff (1/d^3 distance-cube + range x1.3) to ALL point lights, including dynamic ones. Retail draws dynamic lights through the D3D hardware path (config_hardware_light 0x0059ad30): a point light gets Attenuation1=1 => att = 1/d (inverse-linear), plain Lambert, range x1.5 (rangeAdjust 0x00820cc4). Split the two paths by a per-light IsDynamic flag: - LightSource.IsDynamic; packed into GlobalLight.coneAngleEtc.y (binding=4). - LightInfoLoader.Load(isDynamic) => range x1.5 + flag (server-object/portal lights via the live spawn path); dat-static lights keep x1.3 (default). - Viewer fill + weenie/portal lights = dynamic; dat torches = static. - mesh_modern.vert pointContribution: dynamic branch = 1/d att, plain Lambert, hard cutoff, no per-light cap (D3D accumulates then saturates via the existing min(pointAcc,1)); static branch = the unchanged wrap/norm bake. This is the portal half of #143 (the magenta light itself now registers + reaches the walls via the prior weenie-light + landblock-key fix). Refines AP-35: point lights now split static-bake (1/d^3) vs dynamic-hardware (1/d) by path. Verified: portal light now range=9 (6x1.5), magenta spreads softly; shader compiles clean; static torches unchanged (range 5.2/6.5/7.8). User-confirmed the portal matches retail and the torch-lit interior did not over-brighten. Core lighting 44/44, App 476 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
0d8b827721
commit
57c2ab735d
6 changed files with 41 additions and 17 deletions
|
|
@ -3283,7 +3283,8 @@ public sealed class GameWindow : IDisposable
|
|||
liteSetup,
|
||||
ownerId: entity.Id,
|
||||
entityPosition: entity.Position,
|
||||
entityRotation: entity.Rotation);
|
||||
entityRotation: entity.Rotation,
|
||||
isDynamic: true); // #143: server-object lights take the D3D dynamic path (1/d att, range×1.5)
|
||||
foreach (var ls in loaded)
|
||||
_lightingSink.RegisterOwnedLight(ls);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue