Skip to main content

gcrecomp_runtime/
runtime.rs

1// Complete runtime system integration
2use crate::graphics::Renderer;
3use crate::input::ControllerManager;
4use crate::memory::{ARam, DmaSystem, Ram, VRam};
5use crate::texture::TextureLoader;
6use anyhow::Result;
7use std::sync::Arc;
8
9pub struct Runtime {
10    controller_manager: ControllerManager,
11    renderer: Option<Renderer>,
12    texture_loader: TextureLoader,
13    ram: Ram,
14    vram: VRam,
15    aram: ARam,
16    dma: DmaSystem,
17}
18
19impl Runtime {
20    pub fn new() -> Result<Self> {
21        Ok(Self {
22            controller_manager: ControllerManager::new()?,
23            renderer: None,
24            texture_loader: TextureLoader::new(),
25            ram: Ram::new(),
26            vram: VRam::new(),
27            aram: ARam::new(),
28            dma: DmaSystem::new(),
29        })
30    }
31
32    pub fn initialize_graphics(&mut self, window: Arc<winit::window::Window>) -> Result<()> {
33        self.renderer = Some(Renderer::new(window)?);
34        Ok(())
35    }
36
37    pub fn update(&mut self) -> Result<()> {
38        // Update controller manager
39        self.controller_manager.update()?;
40
41        // Update DMA transfers
42        // Process any active DMA transfers
43
44        Ok(())
45    }
46
47    pub fn get_controller_input(
48        &self,
49        controller_id: usize,
50    ) -> Option<crate::input::controller::GameCubeInput> {
51        self.controller_manager.get_gamecube_input(controller_id)
52    }
53
54    pub fn ram_mut(&mut self) -> &mut Ram {
55        &mut self.ram
56    }
57
58    pub fn ram(&self) -> &Ram {
59        &self.ram
60    }
61
62    pub fn vram_mut(&mut self) -> &mut VRam {
63        &mut self.vram
64    }
65
66    pub fn vram(&self) -> &VRam {
67        &self.vram
68    }
69
70    pub fn aram_mut(&mut self) -> &mut ARam {
71        &mut self.aram
72    }
73
74    pub fn aram(&self) -> &ARam {
75        &self.aram
76    }
77
78    pub fn dma_mut(&mut self) -> &mut DmaSystem {
79        &mut self.dma
80    }
81
82    pub fn renderer_mut(&mut self) -> Option<&mut Renderer> {
83        self.renderer.as_mut()
84    }
85
86    pub fn texture_loader_mut(&mut self) -> &mut TextureLoader {
87        &mut self.texture_loader
88    }
89}