use astrelis::prelude::*;
use astrelis::render::RenderWindow;
use std::sync::Arc;
struct WindowApp {
#[allow(dead_code)]
engine: Engine,
renderable: Option<RenderWindow>,
}
impl App for WindowApp {
fn render(&mut self, _ctx: &mut AppCtx, window_id: WindowId, events: &mut EventBatch) {
let renderable = match &mut self.renderable {
Some(r) if r.id() == window_id => r,
_ => return,
};
events.dispatch(|event| {
match event {
Event::WindowResized(new_size) => {
renderable.resized(*new_size);
HandleStatus::consumed()
}
Event::CloseRequested => {
HandleStatus::ignored() }
_ => HandleStatus::ignored(),
}
});
let Some(frame) = renderable.begin_frame() else {
return; };
{
let _pass = frame
.render_pass()
.clear_color(Color::rgb(0.1, 0.1, 0.15)) .label("main_pass")
.build();
}
}
}
fn main() {
println!("Window App Example");
println!("==================");
println!();
println!("This example demonstrates:");
println!(" - Creating an Engine with RenderPlugin");
println!(" - Using RenderWindow for window rendering");
println!(" - Handling window events (resize, close)");
println!(" - Rendering a simple clear pass");
println!();
println!("Press Ctrl+C or close the window to exit.");
println!();
run_app(|ctx| {
let window = ctx
.create_window(WindowDescriptor {
title: "Astrelis Window App".to_string(),
..Default::default()
})
.expect("Failed to create window");
let engine = Engine::builder().add_plugin(RenderPlugin).build();
let graphics = engine.get::<Arc<GraphicsContext>>().unwrap();
let renderable = RenderWindow::new(window, graphics.clone())
.expect("Failed to create renderable window");
Box::new(WindowApp {
engine,
renderable: Some(renderable),
})
});
}