fn normalise_swizzle(s: &str) -> Vec<char>Expand description
Map r/g/b/a to x/y/z/w while preserving identity for x/y/z/w.
MD2 user shaders mix the two conventions freely; the codegen wrapper
always uses xyzw for its locals, so canonicalising on emit keeps
downstream lane lookups stable.