limelight 0.1.3

WebGL2 wrapper with a focus on making high-performance graphics code easier to write and maintain
Documentation
use web_sys::WebGl2RenderingContext;

use crate::shadow_gpu::GpuBind;

#[derive(Copy, Clone, Debug, PartialEq)]
#[repr(u32)]
pub enum BlendingFactorDest {
    Zero = 0,
    One = 1,
    SrcColor = 0x0300,
    OneMinusSrcColor = 0x0301,
    SrcAlpha = 0x0302,
    OneMinusSrcAlpha = 0x0303,
    DstAlpha = 0x0304,
    OneMinusDstAlpha = 0x0305,
}

impl Default for BlendingFactorDest {
    fn default() -> Self {
        BlendingFactorDest::Zero
    }
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[repr(u32)]
pub enum BlendingFactorSrc {
    Zero = 0,
    One = 1,
    DstColor = 0x0306,
    OneMinusDstColor = 0x0307,
    SrcAlphaSaturate = 0x0308,
    SrcAlpha = 0x0302,
    OneMinusSrcAlpha = 0x0303,
    DstAlpha = 0x0304,
    OneMinusDstAlpha = 0x0305,
}

impl Default for BlendingFactorSrc {
    fn default() -> Self {
        BlendingFactorSrc::One
    }
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[repr(u32)]
pub enum BlendEquation {
    Add = 0x8006,
    BlendEquation = 0x8009,
    BlendEquationAlpha = 0x883d,
    Subtract = 0x800a,
    ReverseSubtract = 0x800b,
}

impl Default for BlendEquation {
    fn default() -> Self {
        BlendEquation::Add
    }
}

#[derive(Default, Clone, PartialEq)]
pub struct BlendFunction {
    pub source_factor: BlendingFactorSrc,
    pub dst_factor: BlendingFactorDest,
    pub equation: BlendEquation,
}

impl GpuBind for Option<BlendFunction> {
    fn gpu_bind(&self, gl: &web_sys::WebGl2RenderingContext) -> anyhow::Result<()> {
        match self {
            Some(blend) => {
                gl.blend_func(blend.source_factor as _, blend.dst_factor as _);
                gl.blend_equation(blend.equation as _);
                gl.enable(WebGl2RenderingContext::BLEND);
            }
            None => gl.disable(WebGl2RenderingContext::BLEND),
        }

        Ok(())
    }
}