use std::sync::{Arc, RwLock}; use raidillon_platform::Platform; use glium::winit::event_loop::EventLoop; use glium::winit::window::Window; use glium::backend::glutin::Display; use glium::glutin::surface::WindowSurface; use glium::backend::glutin::SimpleWindowBuilder; use glium::Surface; use crate::system::{RenderingSystemManager, RenderingSystem, RenderingContext}; use winit::event::{Event, WindowEvent}; use raidillon_core::Engine; use crate::GliumAssetManager; use crate::render::BasicRenderingSystem; pub struct GliumPlatform { event_loop: EventLoop<()>, window: Window, display: Display, rendering_system_manager: RenderingSystemManager, asset_manager: Arc>, } impl Platform for GliumPlatform { fn initialize(title: String, width: u32, height: u32) -> Self { let event_loop = glium::winit::event_loop::EventLoop::builder() .build() .expect("create event-loop"); let (window, display) = SimpleWindowBuilder::new() .with_title(title.as_str()) .with_inner_size(width, height) .build(&event_loop); let asset_manager = Arc::new(RwLock::new(GliumAssetManager::new(Box::new(display.clone())))); let rendering_system_manager = RenderingSystemManager::new(); Self { event_loop, window, display, rendering_system_manager, asset_manager, } } fn run(mut self, engine: Engine) { let _ = &self.event_loop.run(move |event, el| { match event { Event::WindowEvent { event, .. } => match event { WindowEvent::CloseRequested => {}, WindowEvent::RedrawRequested => { let mut target = self.display.draw(); target.clear_color(0.0, 0.0, 0.0, 1.0); // TODO: let mut context; for (system_id, system) in self.rendering_system_manager.systems.iter_mut() { todo!(); } } _ => {}, }, Event::AboutToWait => { // TODO: Run systems here self.window.request_redraw(); } _ => {}, } }); } }