use crate::{download::Downloader, network::Network, renderer::Renderer}; use anyhow::{Context, Result}; use log::{info, warn}; use std::net::TcpStream; use weareshared::{store::ResourceStore, tree::SceneTree}; use winit::window::Window; pub struct State<'a> { pub network: Network, pub downloader: Downloader, pub renderer: Renderer<'a>, pub tree: SceneTree, } impl<'a> State<'a> { pub fn new(conn: TcpStream, window: &'a Window) -> Result> { info!("new state"); Ok(Self { network: Network::new(conn), tree: SceneTree::default(), renderer: Renderer::new(window)?, downloader: Downloader::new(ResourceStore::new_memory()), }) } pub fn draw(&mut self) { if let Err(e) = self.renderer.draw(&self.tree) { warn!("draw failed: {e:?}"); } } pub fn update(&mut self) -> Result<()> { for p in self.network.packet_recv.try_iter() { self.downloader.packet(&p)?; self.tree.packet(&p); } self.downloader .update(&mut self.network) .context("downloader state")?; self.renderer .scene_prepare .update(&mut self.downloader) .context("scene preparation")?; Ok(()) } }