tge 0.0.4

A lightweight cross-platform 2D game framework written in pure Rust and based on OpenGL 3.3+.
Documentation
use crate::math::{Vector, Size};

pub type LogicalPosition = Vector<f32>;
pub type PhysicalPosition = Vector<i32>;

impl LogicalPosition {
    pub fn from_physical(physical_position: impl Into<PhysicalPosition>, scale_factor: f32) -> Self {
        let physical_position = {
            let physical_position = physical_position.into();
            winit::dpi::PhysicalPosition::new(physical_position.x, physical_position.y)
        };
        let logical_position = winit::dpi::LogicalPosition::from_physical(physical_position, scale_factor as f64);
        Self::new(logical_position.x, logical_position.y)
    }

    pub fn to_physical(&self, scale_factor: f32) -> PhysicalPosition {
        let logical_position = winit::dpi::LogicalPosition::new(self.x, self.y);
        let physical_position = logical_position.to_physical(scale_factor as f64);
        PhysicalPosition::new(physical_position.x, physical_position.y)
    }
}

impl PhysicalPosition {
    pub fn from_logical(logical_position: impl Into<LogicalPosition>, scale_factor: f32) -> Self {
        let logical_position = {
            let logical_position = logical_position.into();
            winit::dpi::LogicalPosition::new(logical_position.x, logical_position.y)
        };
        let physical_position = winit::dpi::PhysicalPosition::from_logical(logical_position, scale_factor as f64);
        Self::new(physical_position.x, physical_position.y)
    }

    pub fn to_logical(&self, scale_factor: f32) -> LogicalPosition {
        let physical_position = winit::dpi::PhysicalPosition::new(self.x, self.y);
        let logical_position = physical_position.to_logical(scale_factor as f64);
        LogicalPosition::new(logical_position.x, logical_position.y)
    }
}

pub type LogicalSize = Size<f32>;
pub type PhysicalSize = Size<u32>;

impl LogicalSize {
    pub fn from_physical(physical_size: impl Into<PhysicalSize>, scale_factor: f32) -> Self {
        let physical_size = {
            let physical_size = physical_size.into();
            winit::dpi::PhysicalSize::new(physical_size.width, physical_size.height)
        };
        let logical_size = winit::dpi::LogicalSize::from_physical(physical_size, scale_factor as f64);
        Self::new(logical_size.width, logical_size.height)
    }

    pub fn to_physical(&self, scale_factor: f32) -> PhysicalSize {
        let logical_size = winit::dpi::LogicalSize::new(self.width, self.height);
        let physical_size = logical_size.to_physical(scale_factor as f64);
        PhysicalSize::new(physical_size.width, physical_size.height)
    }
}

impl PhysicalSize {
    pub fn from_logical(logical_size: impl Into<LogicalSize>, scale_factor: f32) -> Self {
        let logical_size = {
            let logical_size = logical_size.into();
            winit::dpi::LogicalSize::new(logical_size.width, logical_size.height)
        };
        let physical_size = winit::dpi::PhysicalSize::from_logical(logical_size, scale_factor as f64);
        Self::new(physical_size.width, physical_size.height)
    }

    pub fn to_logical(&self, scale_factor: f32) -> LogicalSize {
        let physical_size = winit::dpi::PhysicalSize::new(self.width, self.height);
        let logical_size = physical_size.to_logical(scale_factor as f64);
        LogicalSize::new(logical_size.width, logical_size.height)
    }
}