1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use crate::{DisplayArea, Domain, PaddleResult, Rectangle, SchedulingContext, WebGLCanvas};
use div::DivHandle;
use nuts::DomainState;

mod config;
pub use crate::display::Display;
pub use config::*;

/// Root object that holds state for paddle game engine. Is stored in Domain::Frame upon initialization.
pub(crate) struct Context {
    pub display: DisplayArea,
    pub scheduling: SchedulingContext,
}
impl Context {
    pub(super) fn init(config: PaddleConfig) -> PaddleResult<()> {
        let scheduling = SchedulingContext::new(config.display.update_delay_ms)?;
        let display = Display::new(config.display)?.into();
        let ctx = Self {
            display,
            scheduling,
        };
        nuts::store_to_domain(&Domain::Frame, ctx);
        Ok(())
    }
    pub(crate) fn display_region(&mut self, region: Rectangle, div: DivHandle) -> &mut DisplayArea {
        self.display.select(region, div)
    }
    pub(crate) fn canvas_mut(&mut self) -> &mut WebGLCanvas {
        self.display.full_mut().canvas_mut()
    }
}

impl Display {
    pub fn from_domain(domain: &mut DomainState) -> &mut Self {
        let context = domain.get_mut::<Context>();
        context.display.full_mut()
    }
}