61 lines
1.3 KiB
Rust
61 lines
1.3 KiB
Rust
use galactica_content::SpriteHandle;
|
|
use galactica_util::to_radians;
|
|
use nalgebra::{Point2, Vector2};
|
|
|
|
use super::SpriteRect;
|
|
use crate::{vertexbuffer::types::UiInstance, PositionAnchor, RenderState};
|
|
|
|
pub struct UiImage {
|
|
parent: SpriteHandle,
|
|
parent_position: Point2<f32>,
|
|
parent_size: f32,
|
|
|
|
inner: SpriteHandle,
|
|
mask: SpriteHandle,
|
|
rect: SpriteRect,
|
|
}
|
|
|
|
impl UiImage {
|
|
pub fn new(
|
|
parent: SpriteHandle,
|
|
parent_position: Point2<f32>,
|
|
parent_size: f32,
|
|
inner: SpriteHandle,
|
|
mask: SpriteHandle,
|
|
rect: SpriteRect,
|
|
) -> Self {
|
|
return Self {
|
|
parent,
|
|
parent_position,
|
|
parent_size,
|
|
inner,
|
|
mask,
|
|
rect,
|
|
};
|
|
}
|
|
|
|
/// Add this image to the gpu sprite buffer
|
|
pub fn push_to_buffer(&self, state: &mut RenderState) {
|
|
let h = self.parent_size;
|
|
let w = self.parent.aspect * h;
|
|
|
|
let zero = Point2::new(
|
|
self.parent_position.x - (w / 2.0),
|
|
self.parent_position.y + (h / 2.0),
|
|
);
|
|
|
|
let pos = zero + Vector2::new(self.rect.pos.x * w, -self.rect.pos.y * h);
|
|
let dim = Vector2::new(self.rect.dim.x * w, self.rect.dim.y * h);
|
|
|
|
state.push_ui_buffer(UiInstance {
|
|
anchor: PositionAnchor::CNw.to_int(),
|
|
position: pos.into(),
|
|
angle: to_radians(90.0),
|
|
size: dim.y,
|
|
color: [1.0, 1.0, 1.0, 1.0],
|
|
sprite_index: self.inner.get_index(),
|
|
mask_index: [1, self.mask.get_index()],
|
|
});
|
|
}
|
|
}
|