librashader/librashader-common/src/viewport.rs

47 lines
1.5 KiB
Rust

use crate::{GetSize, Size};
/// The rendering output of a filter chain.
///
/// Viewport coordinates are relative to the coordinate system of the
/// target runtime. For correct results, `x` and `y` should almost always be
/// 0, and `size` should be the same as the size of the output texture.
///
/// Size uniforms will always be passed the full size of the output texture,
/// regardless of the user-specified viewport size.
pub struct Viewport<'a, T> {
/// The x offset to start rendering from. For correct results, this should almost
/// always be 0 to indicate the origin.
pub x: f32,
/// The y offset to begin rendering from.
pub y: f32,
/// An optional pointer to an MVP to use when rendering
/// to the viewport.
pub mvp: Option<&'a [f32; 16]>,
/// The output handle to render the final image to.
pub output: T,
/// The extent of the viewport size starting from the origin defined
/// by x and y.
pub size: Size<u32>,
}
impl<'a, T: GetSize<u32>> Viewport<'a, T> {
/// Create a new viewport from an output that can be sized.
///
/// This will create a viewport that spans the entire output texture,
/// which will give correct results in the general case.
#[inline(always)]
pub fn new_render_target_sized_origin(
output: T,
mvp: Option<&'a [f32; 16]>,
) -> Result<Viewport<'a, T>, T::Error> {
let size = output.size()?;
Ok(Self {
x: 0.0,
y: 0.0,
mvp,
output,
size,
})
}
}