cotis-raylib 0.1.0-alpha

Raylib-backed renderer for Cotis
Documentation
//! Cotis context trait implementations for [`crate::renderer::RaylibRender`].
//!
//! Bridges Cotis's window/frame/render context traits and text measurement to raylib:
//!
//! - `CotisWindowContext` (`cotis_utils::traits`) — screen dimensions from raylib.
//! - `CotisFrameContext` — frame delta time.
//! - `CotisRenderContext` — provided automatically via blanket impl when window and frame contexts are implemented.
//! - `RendererTextMeasuringProvider` — layout text sizing via [`crate::functions_raylib::raylib_measure_text_inner`].

use crate::raylib_images::Texture2DHolder;
use crate::renderer::RaylibRender;
use cotis_utils::math::Dimensions;
use cotis_utils::traits::{CotisFrameContext, CotisWindowContext};
use raylib::texture::Texture2D;
use std::ops::Deref;
use std::sync::Arc;

impl CotisWindowContext for RaylibRender {
    fn window_dimensions(&self) -> Dimensions {
        let rl = self.lock_handle();
        (rl.get_screen_width() as f32, rl.get_screen_height() as f32).into()
    }
}

impl CotisFrameContext for RaylibRender {
    fn get_delta_time(&self) -> f32 {
        self.delta_time()
    }
}

mod traits {
    use crate::functions_raylib::raylib_measure_text_inner;
    use crate::renderer::RaylibRender;
    use cotis_defaults::element_configs::text_config::TextConfig;
    use cotis_utils::text::{RendererTextMeasuringProvider, TextMeasurer};

    impl RendererTextMeasuringProvider<TextConfig> for RaylibRender {
        fn provide_measurer(&mut self) -> Box<TextMeasurer<'_, TextConfig>> {
            let fonts = self.fonts();
            Box::new(move |str, config| raylib_measure_text_inner(str, config, fonts.clone()))
        }
    }

    #[cfg(feature = "test-render")]
    use crate::test_render::RayTestRender;

    #[cfg(feature = "test-render")]
    impl RendererTextMeasuringProvider<TextConfig> for RayTestRender {
        fn provide_measurer(&mut self) -> Box<TextMeasurer<'_, TextConfig>> {
            let fonts = self.get_render().fonts();
            Box::new(move |str, config| raylib_measure_text_inner(str, config, fonts.clone()))
        }
    }
}

impl Texture2DHolder for Arc<Texture2D> {
    fn texture(&self) -> &Texture2D {
        self.deref()
    }
}