pub const MESH_WGSL: &str = "// Triangle-mesh renderer \u{2014} imported OBJ / STL / GLB surfaces (Phase 1.2,\n// RENDERER_IMPLEMENTATION_PLAN.md). Flat-shaded from screen-space derivatives, so no per-vertex\n// normal buffer is needed for this first cut. Shares the orbit camera with the projector/ambient.\n\nstruct Camera {\n view_projection: mat4x4<f32>,\n yaw: f32,\n pitch: f32,\n zoom: f32,\n tensor_mode: u32,\n _padding0: vec4<f32>,\n _padding1: vec4<f32>,\n _padding2: vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> camera: Camera;\n// Per-artefact model transform (Phase 2): the kinematic-joint pose, identity when not animating.\n@group(1) @binding(0) var<uniform> model: mat4x4<f32>;\n\nstruct VertexOutput {\n @builtin(position) clip_position: vec4<f32>,\n @location(0) world_pos: vec3<f32>,\n @location(1) color: vec4<f32>,\n};\n\n@vertex\nfn vertex_main(\n @location(0) position: vec3<f32>,\n @location(1) color: vec4<f32>\n) -> VertexOutput {\n var output: VertexOutput;\n let world = (model * vec4<f32>(position, 1.0)).xyz;\n output.world_pos = world;\n output.color = color;\n output.clip_position = camera.view_projection * vec4<f32>(world, 1.0);\n return output;\n}\n\n@fragment\nfn fragment_main(input: VertexOutput) -> @location(0) vec4<f32> {\n // Flat per-face normal from the derivative of world position across the triangle.\n let n = normalize(cross(dpdx(input.world_pos), dpdy(input.world_pos)));\n let key = normalize(vec3<f32>(0.45, 0.8, 0.55));\n let diffuse = clamp(dot(n, key), 0.0, 1.0);\n // Cheap rim term so silhouettes read against the dark field.\n let facing = clamp(abs(n.z), 0.0, 1.0);\n let rim = pow(1.0 - facing, 2.0);\n let base = input.color.rgb;\n let col = base * (0.22 + 0.78 * diffuse) + vec3<f32>(0.10, 0.14, 0.22) * rim;\n return vec4<f32>(col, input.color.a);\n}\n";