use crate::math::prelude::{Color, Vector2};
use crate::video::assets::texture::RenderTextureHandle;
use crate::video::errors::{Error, Result};
use crate::video::MAX_FRAMEBUFFER_ATTACHMENTS;
#[derive(Debug, Copy, Clone)]
pub struct SurfaceParams {
pub(crate) colors: [Option<RenderTextureHandle>; MAX_FRAMEBUFFER_ATTACHMENTS],
pub(crate) depth_stencil: Option<RenderTextureHandle>,
pub(crate) clear_color: Option<Color<f32>>,
pub(crate) clear_depth: Option<f32>,
pub(crate) clear_stencil: Option<i32>,
}
impl Default for SurfaceParams {
fn default() -> Self {
SurfaceParams {
colors: [None; MAX_FRAMEBUFFER_ATTACHMENTS],
depth_stencil: None,
clear_color: Some(Color::black()),
clear_depth: Some(1.0),
clear_stencil: None,
}
}
}
impl_handle!(SurfaceHandle);
impl SurfaceParams {
pub fn set_attachments<T1>(
&mut self,
colors: &[RenderTextureHandle],
depth_stencil: T1,
) -> Result<()>
where
T1: Into<Option<RenderTextureHandle>>,
{
if colors.len() >= MAX_FRAMEBUFFER_ATTACHMENTS {
return Err(Error::SurfaceInvalid("Too many color attachments.".into()));
}
for (i, v) in self.colors.iter_mut().enumerate() {
if i < colors.len() {
*v = Some(colors[i]);
} else {
*v = None;
}
}
self.depth_stencil = depth_stencil.into();
Ok(())
}
#[inline]
pub fn set_clear<C, D, S>(&mut self, color: C, depth: D, stentil: S)
where
C: Into<Option<Color<f32>>>,
D: Into<Option<f32>>,
S: Into<Option<i32>>,
{
self.clear_color = color.into();
self.clear_depth = depth.into();
self.clear_stencil = stentil.into();
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SurfaceScissor {
Enable {
position: Vector2<i32>,
size: Vector2<u32>,
},
Disable,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SurfaceViewport {
pub position: Vector2<i32>,
pub size: Vector2<u32>,
}