# Ambient car close material check (r168)

The L4RA Chrome capture in review item 241 selects the retail COUPE BODY_A and
renders it beside the roadway from a close side view. Runtime telemetry reports
BODY_A, an upright vehicle frame, road-supported placement, and the COUPE's
available embedded textures loaded. The body silhouette and window surfaces
are present. The wheels still read nearly black in this night scene.

The GLB preserves `COLOR_0` for body, glass, and tire primitives. The COUPE
body-paint vertices have average source RGB `[126.5, 107.6, 117.6]` in 8-bit
space for this mesh export. The exporter assigns the unresolved
`0xd6d6080a` paint material a neutral preview factor `[0.4784, 0.5060,
0.5336, 1]`; the vehicle shader also multiplies source vertex color directly.
That factor is not a recovered retail paint choice. Replacing it with a color
or a player-car image would conceal the missing runtime state; using a neutral
white factor would remove the invented tint but still would not reproduce the
game's selected traffic paint.

The ambient GLB contains `CARBOTTOM`, `DRIVER`, `WINDOW_TRAFFIC`, and
`TIREBACK` source images. `CARBOTTOM` is an underbody map and the other two
body-visible maps cover the driver and windows; no body-paint image resolves
for the paint hash. The retail setup selects paint using the class-`0x3f`
descriptor and owner state described in
[traffic-controller-viewer-gap-r168.md](traffic-controller-viewer-gap-r168.md).
A live state capture is needed for both the paint color/material run and the
actual tire surface response.

## Follow-up: current traffic export (r170)

The ambient exporter now marks every untextured `paint_body` material as
`paintState: unresolved`, uses an identity base-color factor, and skips the
per-slot tint. The viewer already gates its synthetic paint finish on that
marker. BODY_A/B/C traffic GLBs retain their embedded maps; the 240SX player
GLB is unchanged. For the COUPE, the current traffic paint run is source hash
`0x19e0ecbe` (the older `0xd6d6080a` belongs to a different exported player
material path), and its A/B variants each retain four embedded images while C
retains three.

The current Chrome capture in review entry 243 shows the consequence plainly:
the COUPE paint fallback is white and still has no retail paint texture. This
change removes an unsupported tint; it does not recover a paint choice. The
selector descriptor and resolved runtime state remain the missing evidence.

## Stock garage body paint (r176)

The stock player-car exports also contain runtime material masks. In the
240SX, the source `COLOR_0` RGB channels are black on body, glass, chrome, and
tire runs; they are not diffuse colors. The viewer now preserves those source
channels in the GLBs but skips their RGB modulation for stock garage materials,
so embedded maps and neutral material fallbacks remain visible. Untextured
`paint_body` runs use neutral gray. The synthetic clearcoat and slot tint stay
disabled. This makes the model readable, but it does not recover a paint
texture or retail color.

The headless Chrome garage inspection is in
[`267-r176-garage-neutral-paint.png`](../webgl-city/review/images/267-r176-garage-neutral-paint.png).
The side view in
[`269-r177-garage-side-wheels.png`](../webgl-city/review/images/269-r177-garage-side-wheels.png)
confirms the stock wheel batches and embedded tire, rim, and glass maps render
when viewed from the side. The neutral body remains a paint fallback.

## Generic paint clearcoat pass (r182)

The viewer now applies its existing paint-surface clearcoat path to unresolved
`paint_*` materials as well as recovered paint materials. The body color and
texture state remain unresolved and neutral; the highlight samples the
extracted city dusk panorama and local authored lights. This is a material
presentation approximation, not a recovered retail paint state. The packaged
default-drive capture in review entry 260 shows the body under that pass beside
the earlier r181 neutral-matte capture in entry 259. A live XP render capture is
still needed to match the retail paint color and finish.

Revision r183 scales the generic clearcoat to 38% because the first 350Z view
showed clipped highlights on the white fallback. Recovered paint materials
retain their full existing finish response. The revised 350Z drive capture is
review entry 263; its body remains neutral because the runtime paint selector
and selected state are still unavailable.

## Packaged 240SX material review (r252)

The current packaged L4RA drive view was checked in Chrome 150 after the
loading cover cleared. The stock 240SX starts at rest; a 2.2-second W input
reaches about 38 mph and starts the mapped engine recording. The browser reports
no page or console errors. The capture is review entry 319. This confirms the
drive input and asset path, while the neutral body still reads pale and flat in
the chase view.

The packaged `garage-cars/240sx-stock.glb` embeds three images. The
`240SX_b3dc27ab` image is a badge atlas referenced by the `0x02a05578` material
run, not a body paint map. `240SX_039cbe0b` and `240SX_03a09493` provide small
interior, brake, tire, and rim details. The body panel paint runs have no
`baseColorTexture`; binding the badge atlas to them would put Nissan lettering
across the body.

The glass runs retain four source hashes, including `0x471a1dca`, which resolves
to the named `WINDSHIELD` state resource in
[`traffic-paint-states.json`](traffic-paint-states.json). The current viewer
uses a dark tinted reflection shader for these GLB materials. The state export
preserves 24 floats per named record, but their shader semantics and selected
runtime values are not decoded. This audit therefore supports keeping the
existing glass treatment until that state mapping is recovered; it does not
support inventing transparency or a body texture.

## Brake-lamp part-name correction (r252)

A material scan of the 29 stock player GLBs found that 23 models have named
`BRAKELIGHT` meshes whose `0xd79597d6` source run had been classified by the
shared glass-hash fallback before the mesh's part name was checked. The car
geometry exporters identify these objects explicitly as brake-lamp parts. The
exporter now resolves that name first and assigns the existing red lamp
fallback. All 29 stock GLBs were regenerated from the installed `GEOMETRY.BIN`
and `TEXTURES.BIN` data; the packaged 240SX screenshot is review item 320.
Chrome reached the drivable scene, the 240SX moved under W, and no page or
console errors were reported. This corrects the mesh category while the exact
lens images and retail light intensity remain unresolved.

## Stock paint/reflection binding check (r255)

Chrome 150's packaged WebGL2 debug state confirms the 240SX's paint materials
are not missing a WebGL sampler or environment upload. All 10 drawn
`paint_body` batches have no base-color texture, use the viewer's default
`#858c94` paint, and select gloss. The recovered panorama is resident at
texture index 1461, the local cube probe is ready, and the shader assigns them
to texture units 2 and 4. Chrome reports no page or console errors. The
settled source-page screenshot is review item 322.

This rules out a broken reflection bind as the cause of the pale body. The
remaining gap is the source material state: the stock export has no body-paint
bitmap, and the executable's runtime paint parameters have not been translated
to WebGL. Do not increase reflection weight to conceal that gap; the paint
shader already receives both recovered environment sources. The existing
high-angle screenshot in review item 317 shows the current body and window
response at close range.

## Packaged 240SX close inspection (r259)

Chrome 150 loaded the standalone stock 240SX inspection asset from the
packaged route in 2 seconds. The ready model contains 5,025 triangles, 95
selected part meshes, and three embedded images. A close rear three-quarter
capture is review item 334. It shows the body shell and separate dark glazing
surfaces; the body is still a uniform gray paint response in the clean-room
viewer.

The source GLB inventory has 45 materials. The body paint runs have no
`baseColorTexture`; the three images resolve to a badge atlas and small
wheel/interior/brake details. This confirms that the flat solid paint is not a
failed body-image binding. The runtime paint state and exact shader response
remain missing, so assigning the badge atlas to the body or increasing
reflection strength would be unsupported.

## Retail windshield material parameters (r262)

The PC executable's material-state helper at `0x005bb5b0` reads the render
state hash at object `+0x0c`. For hash `0x471a1dca` (the named `WINDSHIELD`
state), it copies the compiled float at `0x007ff060` into object `+0x50` and
the float at `0x007ff070` into `+0x54`. The initial executable data values are
`0.3` and `1.0`; the code section contains reads of those globals but no
direct writes. The two destination fields' shader meanings are not recovered,
so these values do not establish transparency, roughness, or an alpha level.

The 240SX GLB's windshield and window geometry has no base-color image in its
per-car `CARS/240SX/TEXTURES.BIN` catalog or the shared `CARS/TEXTURES.BIN`
catalog. Its material slices retain the source hash but use opaque preview
materials with a dark blue-gray fallback. The viewer's reflection treatment is
therefore standing in for the unavailable retail material state; simply
binding a guessed car texture or making the panes translucent is not supported
by this evidence. A runtime render-state capture or a trace of consumers for
the material object's `+0x50/+0x54` fields is needed before changing that
shader path.

## Drive-view glass reflection adjustment (r264)

The default chase camera showed the opaque `glass_vehicle` fallback washed out
by the city panorama. The viewer now reduces the panorama reflection weight to
`0.05 + 0.18 * fresnel` for those materials, keeping the exported dark
blue-gray fallback visible while the local city reflection and lamp highlights
remain active. This is a viewer-side visual adjustment only. The retail
`WINDSHIELD` record still yields raw values `0.3` and `1.0` whose shader
semantics are unknown; they do not justify claiming this reflection weight is
retail-accurate. No alpha mode or texture binding was changed. The same-camera
Chrome comparison is in review item 338.
