use geng::prelude::*;
use crate::conversions::Vec2RealConversions;
pub fn new_texture(ugli: &Ugli, size: vec2<usize>) -> ugli::Texture {
ugli::Texture::new_with(ugli, size, |_| Rgba::BLACK)
}
pub fn update_texture_size(texture: &mut ugli::Texture, size: vec2<usize>, ugli: &Ugli) {
if texture.size() != size {
*texture = ugli::Texture::new_with(ugli, size, |_| Rgba::BLACK);
texture.set_filter(ugli::Filter::Nearest);
}
}
pub fn attach_texture<'a>(texture: &'a mut ugli::Texture, ugli: &Ugli) -> ugli::Framebuffer<'a> {
ugli::Framebuffer::new_color(ugli, ugli::ColorAttachment::Texture(texture))
}
pub struct DrawTexture<'a> {
pub texture: &'a ugli::Texture,
pub target: Aabb2<f32>,
pub color: Rgba<f32>,
}
impl<'a> DrawTexture<'a> {
pub fn new(texture: &'a ugli::Texture) -> Self {
Self {
texture,
target: Aabb2::ZERO.extend_positive(texture.size().as_f32()),
color: Rgba::WHITE,
}
}
pub fn colored(self, color: Rgba<f32>) -> Self {
Self { color, ..self }
}
pub fn fit(self, target: Aabb2<f32>, align: vec2<f32>) -> Self {
let target = crate::layout::fit_aabb(self.texture.size().as_f32(), target, align);
Self { target, ..self }
}
pub fn fit_width(self, target: Aabb2<f32>, align: f32) -> Self {
let target = crate::layout::fit_aabb_width(self.texture.size().as_f32(), target, align);
Self { target, ..self }
}
pub fn fit_height(self, target: Aabb2<f32>, align: f32) -> Self {
let target = crate::layout::fit_aabb_height(self.texture.size().as_f32(), target, align);
Self { target, ..self }
}
pub fn fit_screen(self, align: vec2<f32>, framebuffer: &ugli::Framebuffer) -> Self {
self.fit(
Aabb2::ZERO.extend_positive(framebuffer.size().as_f32()),
align,
)
}
pub fn fit_screen_width(self, align: f32, framebuffer: &mut ugli::Framebuffer) -> Self {
self.fit_width(
Aabb2::ZERO.extend_positive(framebuffer.size().as_f32()),
align,
)
}
pub fn fit_screen_height(self, align: f32, framebuffer: &mut ugli::Framebuffer) -> Self {
self.fit_height(
Aabb2::ZERO.extend_positive(framebuffer.size().as_f32()),
align,
)
}
pub fn pixel_perfect(
self,
pos: vec2<f32>,
align: vec2<f32>,
camera: &impl geng::AbstractCamera2d,
framebuffer: &mut ugli::Framebuffer,
) -> Self {
let target = crate::pixel::pixel_perfect_aabb(
pos,
align,
self.texture.size(),
camera,
framebuffer.size().as_f32(),
);
Self { target, ..self }
}
pub fn draw(
self,
camera: &impl geng::AbstractCamera2d,
geng: &Geng,
framebuffer: &mut ugli::Framebuffer,
) {
geng.draw2d()
.textured_quad(framebuffer, camera, self.target, self.texture, self.color);
}
}