extern crate ami;
extern crate awi;
pub use awi::{ afi, Input, Key, Click, Msg, Window, WindowConnection };
use afi::*;
use ami::Mat4;
pub trait Display: Sized {
type Texture;
fn new(title: &str, icon: &afi::Graphic) -> Option<Self>;
fn color(&mut self, color: (f32, f32, f32)) -> ();
fn fog(&mut self, fog: Option<(f32, f32)>) -> ();
fn update(&mut self) -> Option<Input>;
fn camera(&mut self, position: (f32, f32, f32),
rotation: (f32, f32, f32)) -> ();
fn model(&mut self, vertices: &[f32], indices: &[u32]) -> Model;
fn texture(&mut self, graphic: Graphic) -> Self::Texture;
fn gradient(&mut self, colors: &[f32]) -> Gradient;
fn texcoords(&mut self, texcoords: &[f32]) -> TexCoords;
fn set_texture(&mut self, texture: &mut Self::Texture, pixels: &[u32])
-> ();
fn shape_solid(&mut self, model: &Model, transform: Mat4,
color: [f32; 4], blending: bool, fog: bool, camera: bool)
-> Shape;
fn shape_gradient(&mut self, model: &Model, transform: Mat4,
gradient: Gradient, blending: bool, fog: bool, camera: bool)
-> Shape;
fn shape_texture(&mut self, model: &Model, transform: Mat4,
texture: Self::Texture, tc: TexCoords, blending: bool,
fog: bool, camera: bool) -> Shape;
fn shape_faded(&mut self, model: &Model, transform: Mat4,
texture: Self::Texture, tc: TexCoords, alpha: f32,
fog: bool, camera: bool) -> Shape;
fn shape_tinted(&mut self, model: &Model, transform: Mat4,
texture: Self::Texture, tc: TexCoords, tint: [f32; 4],
blending: bool, fog: bool, camera: bool) -> Shape;
fn shape_complex(&mut self, model: &Model, transform: Mat4,
texture: Self::Texture, tc: TexCoords,
gradient: Gradient, blending: bool,
fog: bool, camera: bool) -> Shape;
fn transform(&mut self, shape: &mut Shape, transform: Mat4);
fn resize(&mut self, wh: (u32, u32)) -> ();
fn wh(&self) -> (u32, u32);
}
pub trait Texture {
fn wh(&self) -> (u32, u32);
}
#[derive(Clone)]
pub enum ShapeHandle {
Alpha(u32),
Opaque(u32),
Gui(u32),
}
pub struct Shape(ShapeHandle);
#[derive(Copy, Clone)]
pub struct Model(pub usize);
#[derive(Copy, Clone)]
pub struct Gradient(pub usize);
#[derive(Copy, Clone)]
pub struct TexCoords(pub usize);
pub fn new_shape(i: ShapeHandle) -> Shape {
Shape(i)
}
pub fn get_shape(s: &Shape) -> ShapeHandle {
s.0.clone()
}
pub fn projection(ratio: f32, fov: f32) -> Mat4 {
let scale = (fov * 0.5 * ::std::f32::consts::PI / 180.).tan().recip();
let yscale = scale * ratio;
Mat4([
scale, 0., 0., 0.,
0., yscale, 0., 0.,
0., 0., 1., 1.,
0., 0., 0., 1.,
])
}