42 lines
1.5 KiB
Plaintext
42 lines
1.5 KiB
Plaintext
// 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<f32>, // Anchored position
|
|
dim: vec2<f32>, // Sprite dimensions (width, height)
|
|
) -> vec2<f32> {
|
|
|
|
var trans: vec2<f32> = 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 { // 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;
|
|
}
|