# 350Z textured DECAL material classification (r430)

The embedded 128×64 `350Z_e490b3fc` atlas is correctly bound to source
material hash `0x02a05578`. The retail name-hash operation, initialized at
`0xffffffff` and applying `h = h*33 + byte` modulo 2³², gives
`DECAL -> 0x02a05578`; the same operation gives `CARSKIN -> 0xd6d6080a`.
The material's containing mesh names do not make it body paint.

The resolved atlas is used by six small detail slices: BASE (6 triangles),
BODY (16), each DOOR (27), FRONT_BUMPER (20), and TRUNK (10), totaling 106
triangles. Bounds computed from referenced indices isolate these badges,
handles and detail patches. The full shared vertex-array bounds would wrongly
suggest the atlas covers entire body panels. The separate primary CARSKIN
material covers 1,556 triangles, has no base image, and remains unresolved.

## Correction

The car exporter now assigns the `vehicle-decal` role to this exact source
hash when its texture resolves. Previously its fallback role name began
`paint_body`, causing `vehiclePaintFinishMode` to apply full paint clearcoat
(mode 1) to the atlas. The selected paint pigment was already excluded from
this textured material, so there was no selected-color overwrite or incorrect
atlas sampler binding. The corrected name selects finish mode 0 while retaining
ordinary vehicle lighting, source alpha blending, image and UV placement.
Unresolved DECAL slots retain their existing fallbacks; this change supplies
no invented fallback color or missing image.

A focused 350Z rebuild from the installed-source GEOMETRY/TEXTURES files and
GLOBALB changed only material 0's name, from `paint_body_350Z_e490b3fc` to
`vehicle-decal_350Z_e490b3fc`. All other JSON data match. The complete binary
chunk is byte-identical (SHA-256
`97f08208c04d38690d65252ae9a7456e22c0a6f98cc5adbac6fee2fc9be3b503`),
preserving positions, normals, UVs, vertex colors, indices and embedded PNGs.
The rebuilt 350Z GLB is synchronized to dist. Other cars were not rebuilt.
The exporter correction applies to future resolved DECAL exports.

## Host Chrome evidence and limitations

The [before](../webgl-city/review/images/575-r430-350z-decal-before.png) and
[after](../webgl-city/review/images/576-r430-350z-decal-after.png) are packaged
800×600 L4RA Route 450 / distance 550 / radius 160 captures. Both reached
`City scene ready`, with 43,493 nearby triangles, 170 city textures, an empty
page error readout and a ready local reflection cube. Both report
`ANGLE (NVIDIA, Vulkan 1.4.312 (NVIDIA Quadro P2000 (0x00001C30)), NVIDIA)`.
The after draw metadata lists the new decal name and retains the same three
untextured preview-paint batch records, `#858c94`, default finish mode 2,
and linear pigment `(0.23455,0.26225,0.29614)`. Traffic moves independently
between the captures. The XP guest did not render these images.

The correction is subtle in the chase view and does not make the body read
as convincing retail paint. It fixes a verified material-role error, not
missing body pigment or shading. The body still requires the selected runtime
paint/material state, actual diffuse/cube bindings, selected technique and
harmonic-light packet. The decal hash and badge bitmap supply none of those
inputs; assigning this atlas to CARSKIN would spread badge artwork across the
body. See [the live paint audit](player-paint-live-render-audit-r419.md) and
[the recovered car shader](car-programmable-shaders-r267.md).
