#![allow(clippy::default_trait_access)]
use amethyst_assets::{AssetStorage, Handle};
use amethyst_core::math::Point3;
use amethyst_rendy::{
pod::IntoPod,
rendy::{
hal::format::Format,
mesh::{AsVertex, VertexFormat},
},
resources::Tint as TintComponent,
sprite::SpriteSheet,
Texture,
};
use glsl_layout::{mat4, uvec3, vec2, vec4, AsStd140};
#[derive(Clone, Copy, Debug, AsStd140)]
#[repr(C, align(16))]
pub struct TileMapArgs {
pub proj: mat4,
pub view: mat4,
pub map_coordinate_transform: mat4,
pub map_transform: mat4,
pub sprite_dimensions: vec2,
}
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, AsStd140)]
#[repr(C, align(4))]
pub struct TileArgs {
pub u_offset: vec2,
pub v_offset: vec2,
pub tint: vec4,
pub tile_coordinate: uvec3,
}
impl AsVertex for TileArgs {
#[must_use]
fn vertex() -> VertexFormat {
VertexFormat::new((
(Format::Rg32Sfloat, "u_offset"),
(Format::Rg32Sfloat, "v_offset"),
(Format::Rgba32Sfloat, "tint"),
(Format::Rgb32Uint, "tile_coordinate"),
))
}
}
impl TileArgs {
#[allow(clippy::cast_precision_loss)]
pub fn from_data<'a>(
tex_storage: &AssetStorage<Texture>,
sprite_sheet: &'a SpriteSheet,
sprite_number: usize,
tint: Option<&TintComponent>,
tile_coordinate: &Point3<u32>,
) -> Option<(Self, &'a Handle<Texture>)> {
if !tex_storage.contains(&sprite_sheet.texture) {
return None;
}
let sprite = &sprite_sheet.sprites[sprite_number];
Some((
Self {
u_offset: [sprite.tex_coords.left, sprite.tex_coords.right].into(),
v_offset: [sprite.tex_coords.top, sprite.tex_coords.bottom].into(),
tint: tint.map_or([1.0; 4].into(), |t| t.0.into_pod()),
tile_coordinate: [tile_coordinate.x, tile_coordinate.y, tile_coordinate.z].into(),
},
&sprite_sheet.texture,
))
}
}