Constant USER_COMP_FRAGMENT_PREFIX
Source const USER_COMP_FRAGMENT_PREFIX: &str = r#"
@fragment
fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
// All MD2 bare-name bindings live at module scope (`var<private>` in
// `MD2_PRIVATE_STATE_DECLS`) so lifted user-defined functions can read
// them. Initialise from the per-invocation inputs and the uniform
// struct here — WGSL `var<private>` has no static initialiser, so the
// first thing every fragment thread does is seed its private state.
uv = in.uv;
uv_orig = in.uv;
rad = length(uv - vec2<f32>(0.5)) * 1.4142135;
ang = atan2(uv.y - 0.5, uv.x - 0.5);
ret = textureSample(sampler_main_texture, sampler_main, uv).rgb;
_md2_color = ret;
texsize = uniforms.texsize;
aspect = uniforms.aspect;
time = uniforms.time;
fps = uniforms.fps;
frame = uniforms.frame;
progress = uniforms.progress;
bass = uniforms.bass;
mid = uniforms.mid;
treb = uniforms.treb;
vol = uniforms.vol;
bass_att = uniforms.bass_att;
mid_att = uniforms.mid_att;
treb_att = uniforms.treb_att;
vol_att = uniforms.vol_att;
rand_preset = uniforms.rand_preset;
rand_frame = uniforms.rand_frame;
slow_roam_cos = uniforms.slow_roam_cos;
slow_roam_sin = uniforms.slow_roam_sin;
roam_cos = uniforms.roam_cos;
roam_sin = uniforms.roam_sin;
blur1_min = uniforms.blur1_min;
blur1_max = uniforms.blur1_max;
blur2_min = uniforms.blur2_min;
blur2_max = uniforms.blur2_max;
blur3_min = uniforms.blur3_min;
blur3_max = uniforms.blur3_max;
// `hue_shader` is the per-frame RGB tint MD2 cycles through over time.
// The engine writes a time-driven tri-phase oscillator into
// `uniforms.hue_shader.xyz` each frame; here we just splice it in so
// user shaders that multiply `ret * hue_shader` get the slow rainbow
// rotation MD2 is tuned for.
hue_shader = uniforms.hue_shader.xyz;
g_fTexSize = uniforms.texsize;
q1 = uniforms.q[0].x;
q2 = uniforms.q[0].y;
q3 = uniforms.q[0].z;
q4 = uniforms.q[0].w;
q5 = uniforms.q[1].x;
q6 = uniforms.q[1].y;
q7 = uniforms.q[1].z;
q8 = uniforms.q[1].w;
q9 = uniforms.q[2].x;
q10 = uniforms.q[2].y;
q11 = uniforms.q[2].z;
q12 = uniforms.q[2].w;
q13 = uniforms.q[3].x;
q14 = uniforms.q[3].y;
q15 = uniforms.q[3].z;
q16 = uniforms.q[3].w;
q17 = uniforms.q[4].x;
q18 = uniforms.q[4].y;
q19 = uniforms.q[4].z;
q20 = uniforms.q[4].w;
q21 = uniforms.q[5].x;
q22 = uniforms.q[5].y;
q23 = uniforms.q[5].z;
q24 = uniforms.q[5].w;
q25 = uniforms.q[6].x;
q26 = uniforms.q[6].y;
q27 = uniforms.q[6].z;
q28 = uniforms.q[6].w;
q29 = uniforms.q[7].x;
q30 = uniforms.q[7].y;
q31 = uniforms.q[7].z;
q32 = uniforms.q[7].w;
// ---- begin translated user body ----
"#;