#![cfg_attr(feature = "nightly", no_std)]
#![cfg_attr(feature = "nightly", feature(alloc))]
#[cfg(feature = "nightly")]
#[macro_use]
extern crate alloc;
pub mod interpolate;
pub mod rasterizer;
pub mod buffer;
pub use self::rasterizer::{Rasterizer, DepthStrategy};
pub use self::interpolate::Interpolate;
pub trait Pipeline where Self: Sized {
type Vertex;
type VsOut: Clone + Interpolate;
type Pixel: Clone;
#[inline(always)]
fn vert(
&self,
vertex: &Self::Vertex,
) -> ([f32; 4], Self::VsOut);
#[inline(always)]
fn frag(
&self,
vs_out: &Self::VsOut,
) -> Self::Pixel;
#[inline(always)]
fn get_depth_strategy(&self) -> DepthStrategy {
DepthStrategy::IfLessWrite
}
fn draw<R: Rasterizer, T: Target<Item=Self::Pixel>>(
&self,
vertices: &[Self::Vertex],
target: &mut T,
mut supplement: <R as Rasterizer>::Supplement,
) {
R::draw::<Self, T>(self, vertices, target, &mut supplement)
}
}
pub trait Target {
type Item: Clone;
#[inline(always)]
fn size(&self) -> [usize; 2];
#[inline(always)]
unsafe fn set(&mut self, pos: [usize; 2], item: Self::Item);
#[inline(always)]
unsafe fn get(&self, pos: [usize; 2]) -> Self::Item;
fn clear(&mut self, fill: Self::Item);
}