#[cfg(any(windows))]
use crate::windows::OpenGraphicsLibrary;
pub mod blend;
use blend::Blend;
pub mod viewport;
use viewport::Viewport;
use core::mem::transmute;
const BLEND:u32=0x0BE2;
const LINE_SMOOTH:u32=0x0B20;
const NONE:u32=0;
const FRONT_LEFT:u32=0x0400;
const FRONT_RIGHT:u32=0x0401;
const BACK_LEFT:u32=0x0402;
const BACK_RIGHT:u32=0x0403;
const FRONT:u32=0x0404;
const BACK:u32=0x0405;
const LEFT:u32=0x0406;
const RIGHT:u32=0x0407;
const FRONT_AND_BACK:u32=0x0408;
pub const UNPACK_ALIGNMENT:u32=0x0CF5;
#[repr(u32)]
#[derive(Clone,Copy,Debug,PartialEq,Eq)]
pub enum GLCapability{
Blend=BLEND,
LineSmooth=LINE_SMOOTH,
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum DrawBufferMode{
None=NONE,
FrontLeft=FRONT_LEFT,
FrontRight=FRONT_RIGHT,
BackLeft=BACK_LEFT,
BackRight=BACK_RIGHT,
Front=FRONT,
Back=BACK,
Left=LEFT,
Right=RIGHT,
FrontBack=FRONT_AND_BACK
}
pub struct GraphicsParameters{
pub blend:Blend,
pub viewport:Viewport,
glEnable:usize,
glDisable:usize,
glIsEnabled:usize,
glPixelStoref:usize,
glPixelStorei:usize,
glLineWidth:usize,
glClearColor:usize,
glDrawBuffer:usize,
}
impl GraphicsParameters{
pub const fn new()->GraphicsParameters{
Self{
blend:Blend::new(),
viewport:Viewport::new(),
glEnable:0,
glDisable:0,
glIsEnabled:0,
glPixelStoref:0,
glPixelStorei:0,
glLineWidth:0,
glClearColor:0,
glDrawBuffer:0,
}
}
#[cfg(any(windows))]
pub fn load(&mut self,library:&OpenGraphicsLibrary){
self.blend.load(library);
self.viewport.load(library);
unsafe{
self.glEnable=transmute(library.get_proc_address("glEnable\0"));
self.glDisable=transmute(library.get_proc_address("glDisable\0"));
self.glIsEnabled=transmute(library.get_proc_address("glIsEnabled\0"));
self.glPixelStoref=transmute(library.get_proc_address("glPixelStoref\0"));
self.glPixelStorei=transmute(library.get_proc_address("glPixelStorei\0"));
self.glLineWidth=transmute(library.get_proc_address("glLineWidth\0"));
self.glClearColor=transmute(library.get_proc_address("glClearColor\0"));
self.glDrawBuffer=transmute(library.get_proc_address("glDrawBuffer\0"));
}
}
}
impl GraphicsParameters{
#[inline(always)]
pub fn enable(&self,capability:GLCapability){
unsafe{
transmute::<usize,fn(GLCapability)>(self.glEnable)(capability)
}
}
#[inline(always)]
pub fn disable(&self,capability:GLCapability){
unsafe{
transmute::<usize,fn(GLCapability)>(self.glDisable)(capability)
}
}
#[inline(always)]
pub fn is_enabled(&self,capability:GLCapability)->bool{
unsafe{
transmute::<usize,fn(GLCapability)->bool>(self.glIsEnabled)(capability)
}
}
}
impl GraphicsParameters{
#[inline(always)]
pub unsafe fn set_pixel_storage_modei(&self,parameter:u32,value:i32){
transmute::<usize,fn(u32,i32)>(self.glPixelStorei)(parameter,value)
}
#[inline(always)]
pub unsafe fn set_pixel_storage_modef(&self,parameter:u32,value:f32){
transmute::<usize,fn(u32,f32)>(self.glPixelStoref)(parameter,value)
}
}
impl GraphicsParameters{
pub unsafe fn set_line_width(&self,width:f32){
transmute::<usize,fn(f32)>(self.glLineWidth)(width)
}
}
impl GraphicsParameters{
#[inline(always)]
pub fn set_clear_colour(&self,[red,greed,blue,alpha]:[f32;4]){
unsafe{
transmute::<usize,fn(f32,f32,f32,f32)>(self.glClearColor)(red,greed,blue,alpha)
}
}
#[inline(always)]
pub fn draw_buffer(&self,mode:DrawBufferMode){
unsafe{
transmute::<usize,fn(DrawBufferMode)>(self.glDrawBuffer)(mode)
}
}
}