// Given an anchored position and sprite dimensions, // return the translation that should be applied on // vertex coordinates fn anchor( anchor: u32, // Anchor index position: vec2, // Anchored position dim: vec2, // Sprite dimensions (width, height) ) -> vec2 { var trans: vec2 = vec2(0.0, 0.0); let window_dim = global_data.window_size / global_data.window_scale.x; if anchor == 0u { // NW C (screen anchor, sprite anchor) trans += vec2(-window_dim.x, window_dim.y) / 2.0; // origin trans += vec2(0.0, 0.0) / 2.0; // offset } else if anchor == 1u { // NW NW trans += vec2(-window_dim.x, window_dim.y) / 2.0; trans += vec2(dim.x, -dim.y) / 2.0; } else if anchor == 2u { // NW NE trans += vec2(-window_dim.x, window_dim.y) / 2.0; trans += vec2(-dim.x, -dim.y) / 2.0; } else if anchor == 3u { // NW SW trans += vec2(-window_dim.x, window_dim.y) / 2.0; trans += vec2(dim.x, dim.y) / 2.0; } else if anchor == 4u { // NW SE trans += vec2(-window_dim.x, window_dim.y) / 2.0; trans += vec2(-dim.x, dim.y) / 2.0; } else if anchor == 5u { // NE NE trans += vec2(window_dim.x, window_dim.y) / 2.0; trans += vec2(-dim.x, -dim.y) / 2.0; } else if anchor == 6u { // C C trans += vec2(0.0, 0.0) / 2.0; trans += vec2(0.0, 0.0) / 2.0; } else if anchor == 7u { // C NW trans += vec2(0.0, 0.0) / 2.0; trans += vec2(dim.x, -dim.y) / 2.0; } else { // center / center as default, since it's the most visible variant. trans += vec2(0.0, 0.0) / 2.0; trans += vec2(0.0, 0.0) / 2.0; } trans += position; // This renders correctly, but the offsets here are off by a factor of two. // I'm not sure why... might be because WGPU screen coordinates are -1 to 1. return (trans / window_dim) * 2.0; }