#[cfg(feature = "custom_cursor")]
use bevy::window::{CursorIcon, CustomCursor, CustomCursorImage};
use bevy::{
asset::Assets,
image::{TextureAtlas, TextureAtlasLayout},
math::UVec2,
sprite::Sprite,
ui::widget::ImageNode,
utils::default,
};
#[cfg(feature = "3d")]
use crate::components::sprite3d::Sprite3d;
use crate::spritesheet::Spritesheet;
pub struct ComponentGenerator {
spritesheet: Spritesheet,
image_width: u32,
image_height: u32,
}
impl ComponentGenerator {
pub(crate) fn new(spritesheet: &Spritesheet, image_width: u32, image_height: u32) -> Self {
Self {
spritesheet: spritesheet.clone(),
image_width,
image_height,
}
}
pub fn sprite(&self, atlas_layouts: &mut Assets<TextureAtlasLayout>) -> Sprite {
Sprite::from_atlas_image(self.spritesheet.image().clone(), self.atlas(atlas_layouts))
}
#[cfg(feature = "3d")]
pub fn sprite3d(&self, atlas_layouts: &mut Assets<TextureAtlasLayout>) -> Sprite3d {
Sprite3d::from_atlas_image(self.spritesheet.image().clone(), self.atlas(atlas_layouts))
}
pub fn image_node(&self, atlas_layouts: &mut Assets<TextureAtlasLayout>) -> ImageNode {
ImageNode::from_atlas_image(self.spritesheet.image().clone(), self.atlas(atlas_layouts))
}
#[cfg(feature = "custom_cursor")]
pub fn cursor_icon(&self, atlas_layouts: &mut Assets<TextureAtlasLayout>) -> CursorIcon {
CursorIcon::Custom(CustomCursor::Image(CustomCursorImage {
handle: self.spritesheet.image().clone(),
texture_atlas: Some(self.atlas(atlas_layouts)),
..default()
}))
}
pub fn atlas(&self, atlas_layouts: &mut Assets<TextureAtlasLayout>) -> TextureAtlas {
let cell_width = self.image_width / (self.spritesheet.columns() as u32);
let cell_height = self.image_height / (self.spritesheet.rows() as u32);
let layout = TextureAtlasLayout::from_grid(
UVec2::new(cell_width, cell_height),
self.spritesheet.columns() as u32,
self.spritesheet.rows() as u32,
None,
None,
);
let layout_handle = atlas_layouts.add(layout);
TextureAtlas {
layout: layout_handle,
..default()
}
}
}