use std::marker::PhantomData;
use crate::core::{Color, Renderer, Texture, BlendMode, Program, Display};
use crate::core::math::*;
#[derive(Clone)]
pub struct DrawBuilderFill;
impl DrawBuilderFill {
pub(crate) fn new(renderer: &Renderer) -> DrawBuilder<'_, DrawBuilderFill> {
DrawBuilder {
renderer : renderer,
phantomdata : PhantomData,
rect : ((0., 0.), (1., 1.)),
color : None,
texture : None,
blendmode : None,
view_matrix : DrawBuilderViewSource::One,
model_matrix: None,
program : None,
}
}
}
#[derive(Clone)]
pub struct DrawBuilderRect;
impl DrawBuilderRect {
pub(crate) fn new(renderer: &Renderer, rect: Rect) -> DrawBuilder<'_, DrawBuilderRect> {
DrawBuilder {
renderer : renderer,
phantomdata : PhantomData,
rect : rect,
color : None,
texture : None,
blendmode : None,
view_matrix : DrawBuilderViewSource::Target,
model_matrix: None,
program : None,
}
}
}
#[derive(Clone)]
pub enum DrawBuilderViewSource<'a> {
Display(&'a Display),
Target,
Source,
One,
Matrix(Mat4)
}
#[must_use]
#[derive(Clone)]
pub struct DrawBuilder<'a, T: 'a> {
renderer : &'a Renderer,
phantomdata : PhantomData<&'a T>,
pub(crate) rect : Rect,
pub(crate) color : Option<Color>,
pub(crate) texture : Option<&'a Texture>,
pub(crate) blendmode : Option<BlendMode>,
pub(crate) view_matrix : DrawBuilderViewSource<'a>,
pub(crate) model_matrix : Option<Mat4>,
pub(crate) program : Option<&'a Program>,
}
impl<'a, T> DrawBuilder<'a, T> {
pub fn color(mut self: Self, color: Color) -> Self {
self.color = Some(color);
self
}
pub fn texture(mut self: Self, texture: &'a Texture) -> Self {
self.texture = Some(texture);
self
}
pub fn blendmode(mut self: Self, blendmode: BlendMode) -> Self {
self.blendmode = Some(blendmode);
self
}
pub fn program(mut self: Self, program: &'a Program) -> Self {
self.program = Some(program);
self
}
pub fn model_matrix(mut self: Self, model_matrix: Mat4) -> Self {
self.model_matrix = Some(model_matrix);
self
}
pub fn draw(self: Self) {
self.renderer.draw_rect(self);
}
}
impl<'a> DrawBuilder<'a, DrawBuilderRect> {
pub fn view_matrix(mut self: Self, view_matrix: Mat4) -> Self {
self.view_matrix = DrawBuilderViewSource::Matrix(view_matrix);
self
}
pub fn view_target(mut self: Self) -> Self {
self.view_matrix = DrawBuilderViewSource::Target;
self
}
pub fn view_display(mut self: Self, display: &'a Display) -> Self {
self.view_matrix = DrawBuilderViewSource::Display(display);
self
}
pub fn view_source(mut self: Self) -> Self {
self.view_matrix = DrawBuilderViewSource::Source;
self
}
pub fn view_one(mut self: Self) -> Self {
self.view_matrix = DrawBuilderViewSource::One;
self
}
}