#![no_std]
#[macro_use]
extern crate alloc;
pub mod buffer;
pub mod interpolate;
pub mod rasterizer;
pub use self::{
interpolate::Interpolate,
rasterizer::{DepthStrategy, Rasterizer},
};
pub trait Pipeline
where
Self: Sized,
{
type Vertex;
type VsOut: Clone + Interpolate;
type Pixel: Clone;
fn vert(&self, vertex: &Self::Vertex) -> ([f32; 4], Self::VsOut);
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,
supplement: <R as Rasterizer>::Supplement,
) {
R::draw::<Self, T>(self, vertices, target, supplement)
}
}
pub trait Target {
type Item: Clone;
fn size(&self) -> [usize; 2];
unsafe fn set(&mut self, pos: [usize; 2], item: Self::Item);
unsafe fn get(&self, pos: [usize; 2]) -> Self::Item;
fn clear(&mut self, fill: Self::Item);
}
impl<T: Default + Clone> Target for (T,) {
type Item = T;
fn size(&self) -> [usize; 2] {
[1; 2]
}
unsafe fn set(&mut self, _pos: [usize; 2], _item: Self::Item) {}
unsafe fn get(&self, _pos: [usize; 2]) -> Self::Item {
Self::Item::default()
}
fn clear(&mut self, _fill: Self::Item) {}
}