use crate::{
ffi::graphics as ffi,
graphics::{BlendMode, Shader, Texture, Transform},
};
use std::{marker::PhantomData, ptr};
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct RenderStates<'texture, 'shader, 'shader_texture: 'shader> {
pub blend_mode: BlendMode,
pub transform: Transform,
texture: *const ffi::sfTexture,
shader: *const ffi::sfShader,
_texture: PhantomData<&'texture Texture>,
_shader: PhantomData<&'shader Shader<'shader_texture>>,
}
impl<'texture, 'shader, 'shader_texture> RenderStates<'texture, 'shader, 'shader_texture> {
#[must_use]
pub fn new(
blend_mode: BlendMode,
transform: Transform,
texture: Option<&'texture Texture>,
shader: Option<&'shader Shader<'shader_texture>>,
) -> Self {
Self {
blend_mode,
transform,
texture: match texture {
Some(tex) => tex,
None => ptr::null(),
},
shader: match shader {
Some(shader) => shader.raw(),
None => ptr::null(),
},
_texture: PhantomData,
_shader: PhantomData,
}
}
pub fn set_texture(&mut self, texture: Option<&'texture Texture>) {
self.texture = match texture {
None => ptr::null(),
Some(tex) => tex,
};
}
pub fn set_shader(&mut self, shader: Option<&'shader Shader<'shader_texture>>) {
self.shader = match shader {
None => ptr::null(),
Some(shader) => shader.raw(),
};
}
}
impl RenderStates<'static, 'static, 'static> {
pub const DEFAULT: Self = Self {
blend_mode: BlendMode::ALPHA,
transform: Transform::IDENTITY,
texture: ptr::null(),
shader: ptr::null(),
_texture: PhantomData,
_shader: PhantomData,
};
}
impl Default for RenderStates<'static, 'static, 'static> {
fn default() -> Self {
Self::DEFAULT
}
}