#![allow(deprecated)]
use glium::backend::glutin::SimpleWindowBuilder;
pub use gilrs;
use gilrs::Gilrs;
pub use glium;
pub use glium_types;
pub use winit;
pub use winit_input_map as input_map;
use std::time::Duration;
pub struct Settings {
pub gamepads: Option<Gilrs>,
pub min_frame_duration: Option<Duration>
}
impl Settings {
pub fn new(gamepads: Option<Gilrs>, min_frame_duration: Option<Duration>) -> Self {
Self { gamepads, min_frame_duration }
}
pub fn from_fps(fps: u32) -> Self {
let gamepads = Gilrs::new().map_err(|i| eprintln!("{i}")).ok();
let min_frame_duration = Some(Duration::from_secs_f32(1.0/fps as f32));
Self::new(gamepads, min_frame_duration)
}
pub fn with_gamepads() -> Result<Self, gilrs::Error> {
let gilrs = Gilrs::new()?;
Ok(Self::new(Some(gilrs), None))
}
pub fn set_target_fps(&mut self, target_fps: Option<u32>) {
let min_duration = target_fps.map(|i| Duration::from_secs_f32(1.0/i as f32));
self.min_frame_duration = min_duration;
}
pub fn get_fps(&self) -> Option<u32> {
self.min_frame_duration.map(|i| (1.0 / i.as_secs_f64()).round() as u32)
}
}
impl Default for Settings {
fn default() -> Self {
let gamepads = Gilrs::new().map_err(|i| println!("{i}")).ok();
Self::new(gamepads, None)
}
}
pub mod meshes;
pub mod shaders;
pub mod application;
#[cfg(feature = "text")]
pub mod text_renderer;
pub type Display = glium::Display<glium::glutin::surface::WindowSurface>;
use winit_input_map::InputMap;
use crate::application::ThinBuilder;
use std::hash::Hash;
pub fn builder<'a, H: Hash + Eq + Copy>(input_map: InputMap<H>) -> ThinBuilder<'a, H> {
ThinBuilder::<'a, H>::new(input_map)
}
pub mod prelude {
pub use crate::application::*;
pub use glium::{
draw_parameters, IndexBuffer, self,
VertexBuffer, Program, Texture2d,
uniform, Surface, Frame, DrawParameters,
backend::glutin::simple_window_builder::SimpleWindowBuilder
};
pub use crate::Settings;
pub use std::time::{Duration, Instant};
pub use std::thread;
pub use glium_types::prelude::*;
pub use crate::{meshes, shaders};
pub use winit::{self, event::MouseButton, keyboard::KeyCode};
pub use gilrs::ev::{Button as GamepadButton, Axis as GamepadAxis};
pub use winit::{event_loop::*, window::{Fullscreen, CursorGrabMode}};
pub use crate::input_map::*;
}
#[derive(Default)]
pub struct ResizableTexture2d {
pub size: (u32, u32),
pub texture: Option<glium::Texture2d>
}
impl ResizableTexture2d {
pub fn resize(&mut self, display: &Display, new_size: (u32, u32)) {
if self.size.0 != new_size.0 || self.size.1 != new_size.1 {
self.texture = glium::Texture2d::empty(display, new_size.0, new_size.1).ok();
self.size = new_size;
}
}
pub fn resize_to_display(&mut self, display: &Display) {
let new_size = display.get_framebuffer_dimensions();
if self.size.0 != new_size.0 || self.size.1 != new_size.1 {
self.texture = glium::Texture2d::empty(display, new_size.0, new_size.1).ok();
self.size = new_size;
}
}
pub fn texture(&self) -> &glium::Texture2d {
self.texture.as_ref().expect("texture was not initialised. maybe use 'new()' instead of 'default()'")
}
pub fn new(size: (u32, u32), display: &Display) -> Self {
Self { size, texture: glium::Texture2d::empty(display, size.0, size.1).ok() }
}
}
#[derive(Default)]
pub struct ResizableDepthTexture2d {
size: (u32, u32),
pub texture: Option<glium::texture::DepthTexture2d>
}
impl ResizableDepthTexture2d {
pub fn resize(&mut self, display: &Display, new_size: (u32, u32)) {
if self.size.0 != new_size.0 || self.size.1 != new_size.1 {
self.texture = glium::texture::DepthTexture2d::empty(display, new_size.0, new_size.1).ok();
self.size = new_size;
}
}
pub fn texture(&self) -> &glium::texture::DepthTexture2d {
self.texture.as_ref().expect("texture was not initialised. maybe use 'new()' instead of 'default()'")
}
pub fn new(size: (u32, u32), display: &Display) -> Self {
Self { size, texture: glium::texture::DepthTexture2d::empty(display, size.0, size.1).ok() }
}
pub fn resize_to_display(&mut self, display: &Display) {
let new_size = display.get_framebuffer_dimensions();
if self.size.0 != new_size.0 || self.size.1 != new_size.1 {
self.texture = glium::texture::DepthTexture2d::empty(display, new_size.0, new_size.1).ok();
self.size = new_size;
}
}
}