use crate::quad::{DEFAULT_MVP, IDENTITY_MVP};
use librashader_common::{GetSize, Size, Viewport};
use num_traits::{zero, AsPrimitive, Num};
use std::borrow::Borrow;
#[derive(Debug, Clone)]
pub struct RenderTarget<'a, T, C = f32>
where
C: Num,
{
pub x: C,
pub y: C,
pub mvp: &'a [f32; 16],
pub output: &'a T,
pub size: Size<u32>,
}
impl<'a, T: GetSize<u32>, C: Num> RenderTarget<'a, T, C> {
pub fn new(output: &'a T, mvp: &'a [f32; 16], x: C, y: C) -> Result<Self, T::Error> {
Ok(RenderTarget {
output,
mvp,
x,
y,
size: output.size()?,
})
}
pub fn identity(output: &'a T) -> Result<Self, T::Error> {
Self::offscreen(output, IDENTITY_MVP)
}
pub fn offscreen(output: &'a T, mvp: &'a [f32; 16]) -> Result<Self, T::Error> {
Self::new(output, mvp, zero(), zero())
}
}
impl<'a, T, C: Num + Copy + 'static> RenderTarget<'a, T, C>
where
f32: AsPrimitive<C>,
{
pub fn viewport(viewport: &'a Viewport<'a, impl Borrow<T>>) -> Self {
RenderTarget {
output: viewport.output.borrow(),
mvp: viewport.mvp.unwrap_or(DEFAULT_MVP),
x: viewport.x.as_(),
y: viewport.y.as_(),
size: viewport.size,
}
}
pub fn viewport_with_output<S>(output: &'a T, viewport: &'a Viewport<'a, S>) -> Self {
RenderTarget {
output,
mvp: viewport.mvp.unwrap_or(DEFAULT_MVP),
x: viewport.x.as_(),
y: viewport.y.as_(),
size: viewport.size,
}
}
}