#[cfg(any(windows))]
use crate::windows::OpenGraphicsLibrary;
use core::mem::transmute;
const TEXTURE_1D:u32=0x0DE0;
const TEXTURE_2D:u32=0x0DE1;
const PROXY_TEXTURE_1D:u32=0x8063;
const PROXY_TEXTURE_2D:u32=0x8064;
const TEXTURE_3D:u32=0x806F;
const TEXTURE_RECTANGLE:u32=0x84F5;
const TEXTURE_CUBE_MAP:u32=0x8513;
const TEXTURE_1D_ARRAY:u32=0x8C18;
const TEXTURE_2D_ARRAY:u32=0x8C1A;
const TEXTURE_BUFFER:u32=0x8C2A;
const TEXTURE_2D_MULTISAMPLE:u32=0x9100;
const TEXTURE_2D_MULTISAMPLE_ARRAY:u32=0x9102;
const R8:u32=0x8229;
const R16:u32=0x822A;
const R16F:u32=0x822D;
const R16I:u32=0x8233;
const R16UI:u32=0x8234;
const R16_SNORM:u32=0x8F98;
const R32F:u32=0x822E;
const R32I:u32=0x8235;
const R32UI:u32=0x8236;
const R3_G3_B2:u32=0x2A10;
const R8I:u32=0x8231;
const R8UI:u32=0x8232;
const R8_SNORM:u32=0x8F94;
const RG:u32=0x8227;
const RG16:u32=0x822C;
const RG16F:u32=0x822F;
const RG16I:u32=0x8239;
const RG16UI:u32=0x823A;
const RG16_SNORM:u32=0x8F99;
const RG32F:u32=0x8230;
const RG32I:u32=0x823B;
const RG32UI:u32=0x823C;
const RG8:u32=0x822B;
const RG8I:u32=0x8237;
const RG8UI:u32=0x8238;
const RG8_SNORM:u32=0x8F95;
const RGB:u32=0x1907;
const RGB10:u32=0x8052;
const RGB10_A2:u32=0x8059;
const RGB10_A2UI:u32=0x906F;
const RGB12:u32=0x8053;
const RGB16:u32=0x8054;
const RGB16F:u32=0x881B;
const RGB16I:u32=0x8D89;
const RGB16UI:u32=0x8D77;
const RGB16_SNORM:u32=0x8F9A;
const RGB32F:u32=0x8815;
const RGB32I:u32=0x8D83;
const RGB32UI:u32=0x8D71;
const RGB4:u32=0x804F;
const RGB5:u32=0x8050;
const RGB565:u32=0x8D62;
const RGB5_A1:u32=0x8057;
const RGB8:u32=0x8051;
const RGB8I:u32=0x8D8F;
const RGB8UI:u32=0x8D7D;
const RGB8_SNORM:u32=0x8F96;
const RGB9_E5:u32=0x8C3D;
const RGBA12:u32=0x805A;
const RGBA16:u32=0x805B;
const RGBA16F:u32=0x881A;
const RGBA16I:u32=0x8D88;
const RGBA16UI:u32=0x8D76;
const RGBA16_SNORM:u32=0x8F9B;
const RGBA2:u32=0x8055;
const RGBA32F:u32=0x8814;
const RGBA32I:u32=0x8D82;
const RGBA32UI:u32=0x8D70;
const RGBA4:u32=0x8056;
const RGBA8I:u32=0x8D8E;
const RGBA8UI:u32=0x8D7C;
const RGBA8_SNORM:u32=0x8F97;
const SRGB:u32=0x8C40;
const SRGB8:u32=0x8C41;
const SRGB8_ALPHA8:u32=0x8C43;
const RGBA8:u32=0x8058;
const R11F_G11F_B10F:u32=0x8C3A;
const RED:u32=0x1903;
const BGR:u32=0x80E0;
const RGBA:u32=0x1908;
const BGRA:u32=0x80E1;
const BYTE:u32=0x1400;
const UNSIGNED_BYTE:u32=0x1401;
const UNSIGNED_BYTE_2_3_3_REV:u32=0x8362;
const UNSIGNED_BYTE_3_3_2:u32=0x8032;
const SHORT:u32=0x1402;
const UNSIGNED_SHORT:u32=0x1403;
const UNSIGNED_SHORT_1_5_5_5_REV:u32=0x8366;
const UNSIGNED_SHORT_4_4_4_4:u32=0x8033;
const UNSIGNED_SHORT_4_4_4_4_REV:u32=0x8365;
const UNSIGNED_SHORT_5_5_5_1:u32=0x8034;
const UNSIGNED_SHORT_5_6_5:u32=0x8363;
const UNSIGNED_SHORT_5_6_5_REV:u32=0x8364;
const INT:u32=0x1404;
const FLOAT:u32=0x1406;
const UNSIGNED_INT:u32=0x1405;
const UNSIGNED_INT_10F_11F_11F_REV:u32=0x8C3B;
const UNSIGNED_INT_24_8:u32=0x84FA;
const UNSIGNED_INT_5_9_9_9_REV:u32=0x8C3E;
const UNSIGNED_INT_8_8_8_8:u32=0x8035;
const UNSIGNED_INT_8_8_8_8_REV:u32=0x8367;
const UNSIGNED_INT_2_10_10_10_REV:u32=0x8368;
const UNSIGNED_INT_10_10_10_2:u32=0x8036;
const TEXTURE_MAG_FILTER:u32=0x2800;
const TEXTURE_MIN_FILTER:u32=0x2801;
const TEXTURE_BASE_LEVEL:u32=0x813C;
const TEXTURE_COMPARE_MODE:u32=0x884C;
const TEXTURE_COMPARE_FUNC:u32=0x884D;
const TEXTURE_WRAP_R:u32=0x8072;
const TEXTURE_WRAP_S:u32=0x2802;
const TEXTURE_WRAP_T:u32=0x2803;
const NEVER:u32=0x0200;
const LESS:u32=0x0201;
const EQUAL:u32=0x0202;
const LEQUAL:u32=0x0203;
const GREATER:u32=0x0204;
const NOTEQUAL:u32=0x0205;
const GEQUAL:u32=0x0206;
const ALWAYS:u32=0x0207;
const NONE:u32=0;
const COMPARE_REF_TO_TEXTURE:u32=0x884E;
const NEAREST:u32=0x2600;
const NEAREST_MIPMAP_LINEAR:u32=0x2702;
const NEAREST_MIPMAP_NEAREST:u32=0x2700;
const LINEAR:u32=0x2601;
const LINEAR_MIPMAP_LINEAR:u32=0x2703;
const LINEAR_MIPMAP_NEAREST:u32=0x2701;
const REPEAT:u32=0x2901;
const MIRRORED_REPEAT:u32=0x8370;
const CLAMP_TO_EDGE:u32=0x812F;
const CLAMP_TO_BORDER:u32=0x812D;
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum TextureBindTarget{
Texture1D=TEXTURE_1D,
Texture2D=TEXTURE_2D,
Texture3D=TEXTURE_3D,
TextureRectable=TEXTURE_RECTANGLE,
TextureCubeMap=TEXTURE_CUBE_MAP,
Texture1DArray=TEXTURE_1D_ARRAY,
Texture2DArray=TEXTURE_2D_ARRAY,
TextureBuffer=TEXTURE_BUFFER,
Texture2DMultisample=TEXTURE_2D_MULTISAMPLE,
Texture2DMultisampleArray=TEXTURE_2D_MULTISAMPLE_ARRAY,
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum TextureParameterTarget{
Texture1D=TEXTURE_1D,
Texture2D=TEXTURE_2D,
Texture3D=TEXTURE_3D,
TextureRectable=TEXTURE_RECTANGLE,
TextureCubeMap=TEXTURE_CUBE_MAP,
Texture1DArray=TEXTURE_1D_ARRAY,
Texture2DArray=TEXTURE_2D_ARRAY,
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum Texture1DRewriteTarget{
Texture1D=TEXTURE_1D,
ProxyTexture1D=PROXY_TEXTURE_1D
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum Texture2DRewriteTarget{
Texture2D=TEXTURE_2D,
ProxyTexture2D=PROXY_TEXTURE_2D,
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum Texture2DWriteTarget{
Texture2D=TEXTURE_2D,
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum Texture2DCopyTarget{
Texture2D=TEXTURE_2D,
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum Texture2DInternalFormat{
R8=R8,
R16=R16,
RG8=RG8,
RG16=RG16,
RGB8=RGB8,
RGB16=RGB16,
RGBA8=RGBA8,
RGBA16=RGBA16,
}
#[repr(u64)]
#[derive(Clone,Copy,Debug)]
pub enum ImageDataFormat{
R_I8=RED as u64 | (BYTE as u64)<<32,
R_U8=RED as u64 | (UNSIGNED_BYTE as u64)<<32,
R_I16=RED as u64 | (SHORT as u64)<<32,
R_U16=RED as u64 | (UNSIGNED_SHORT as u64)<<32,
R_I32=RED as u64 | (INT as u64)<<32,
R_U32=RED as u64 | (UNSIGNED_INT as u64)<<32,
R_F32=RED as u64 | (FLOAT as u64)<<32,
RG_I8=RG as u64 | (BYTE as u64)<<32,
RG_U8=RG as u64 | (UNSIGNED_BYTE as u64)<<32,
RG_I16=RG as u64 | (SHORT as u64)<<32,
RG_U16=RG as u64 | (UNSIGNED_SHORT as u64)<<32,
RG_I32=RG as u64 | (INT as u64)<<32,
RG_U32=RG as u64 | (UNSIGNED_INT as u64)<<32,
RG_F32=RG as u64 | (FLOAT as u64)<<32,
RGB_I8=RGB as u64 | (BYTE as u64)<<32,
RGB_U8=RGB as u64 | (UNSIGNED_BYTE as u64)<<32,
RGB_I16=RGB as u64 | (SHORT as u64)<<32,
RGB_U16=RGB as u64 | (UNSIGNED_SHORT as u64)<<32,
RGB_I32=RGB as u64 | (INT as u64)<<32,
RGB_U32=RGB as u64 | (UNSIGNED_INT as u64)<<32,
RGB_F32=RGB as u64 | (FLOAT as u64)<<32,
BGR_I8=BGR as u64 | (BYTE as u64)<<32,
BGR_U8=BGR as u64 | (UNSIGNED_BYTE as u64)<<32,
BGR_I16=BGR as u64 | (SHORT as u64)<<32,
BGR_U16=BGR as u64 | (UNSIGNED_SHORT as u64)<<32,
BGR_I32=BGR as u64 | (INT as u64)<<32,
BGR_U32=BGR as u64 | (UNSIGNED_INT as u64)<<32,
BGR_F32=BGR as u64 | (FLOAT as u64)<<32,
RGBA_I8=RGBA as u64 | (BYTE as u64)<<32,
RGBA_U8=RGBA as u64 | (UNSIGNED_BYTE as u64)<<32,
RGBA_I16=RGBA as u64 | (SHORT as u64)<<32,
RGBA_U16=RGBA as u64 | (UNSIGNED_SHORT as u64)<<32,
RGBA_I32=RGBA as u64 | (INT as u64)<<32,
RGBA_U32=RGBA as u64 | (UNSIGNED_INT as u64)<<32,
RGBA_F32=RGBA as u64 | (FLOAT as u64)<<32,
BGRA_I8=BGRA as u64 | (BYTE as u64)<<32,
BGRA_U8=BGRA as u64 | (UNSIGNED_BYTE as u64)<<32,
BGRA_I16=BGRA as u64 | (SHORT as u64)<<32,
BGRA_U16=BGRA as u64 | (UNSIGNED_SHORT as u64)<<32,
BGRA_I32=BGRA as u64 | (INT as u64)<<32,
BGRA_U32=BGRA as u64 | (UNSIGNED_INT as u64)<<32,
BGRA_F32=BGRA as u64 | (FLOAT as u64)<<32,
BGRA_U4=BGRA as u64 | (UNSIGNED_SHORT_4_4_4_4 as u64)<<32,
}
impl ImageDataFormat{
fn to_gl_enums(self)->[u32;2]{
unsafe{
transmute(self)
}
}
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum TextureCompareFunction{
LessEqual=LEQUAL,
GreaterEqual=GEQUAL,
Less=LESS,
Greater=GREATER,
Equal=EQUAL,
NotEqual=NOTEQUAL,
Always=ALWAYS,
Never=NEVER,
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum TextureCompareMode{
CompareRefToTexture=COMPARE_REF_TO_TEXTURE,
None=NONE,
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum TextureMagFilter{
Nearest=NEAREST,
Linear=LINEAR,
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum TextureMinFilter{
Nearest=NEAREST,
Linear=LINEAR,
NearestMipmapNearest=NEAREST_MIPMAP_NEAREST,
LinearMipmapNearest=LINEAR_MIPMAP_NEAREST,
NearestMipmapLinear=NEAREST_MIPMAP_LINEAR,
LinearMipmapLinear=LINEAR_MIPMAP_LINEAR,
}
#[repr(u32)]
#[derive(Clone,Copy,Debug)]
pub enum TextureWrap{
Repeat=REPEAT,
MirroredRepeat=MIRRORED_REPEAT,
ClampToEdge=CLAMP_TO_EDGE,
ClampToBorder=CLAMP_TO_BORDER,
}
pub struct Texture{
glGenTextures:usize,
glDeleteTextures:usize,
glBindTexture:usize,
glTexImage2D:usize,
glTexSubImage2D:usize,
glCopyTexSubImage2D:usize,
glTexParameteri:usize,
}
impl Texture{
pub const fn new()->Texture{
Self{
glGenTextures:0,
glDeleteTextures:0,
glBindTexture:0,
glTexImage2D:0,
glTexSubImage2D:0,
glCopyTexSubImage2D:0,
glTexParameteri:0,
}
}
#[cfg(any(windows))]
pub fn load(&mut self,library:&OpenGraphicsLibrary){
unsafe{
self.glGenTextures=transmute(library.get_proc_address("glGenTextures\0"));
self.glDeleteTextures=transmute(library.get_proc_address("glDeleteTextures\0"));
self.glBindTexture=transmute(library.get_proc_address("glBindTexture\0"));
self.glTexImage2D=transmute(library.get_proc_address("glTexImage2D\0"));
self.glTexSubImage2D=transmute(library.get_proc_address("glTexSubImage2D\0"));
self.glCopyTexSubImage2D=transmute(library.get_proc_address("glCopyTexSubImage2D\0"));
self.glTexParameteri=transmute(library.get_proc_address("glTexParameteri\0"));
}
}
}
impl Texture{
#[inline(always)]
pub fn generate_one(&self,texture:&mut u32){
unsafe{
transmute::<usize,fn(i32,&mut u32)>(self.glGenTextures)(1,texture)
}
}
#[inline(always)]
pub unsafe fn delete_one(&self,texture:&u32){
transmute::<usize,fn(i32,&u32)>(self.glDeleteTextures)(1,texture)
}
#[inline(always)]
pub unsafe fn generate(&self,textures:&mut [u32]){
transmute::<usize,fn(i32,&mut u32)>(self.glGenTextures)(textures.len() as i32,&mut textures[0])
}
#[inline(always)]
pub fn delete(&self,textures:&[u32]){
unsafe{
transmute::<usize,fn(i32,&u32)>(self.glDeleteTextures)(textures.len() as i32,&textures[0])
}
}
#[inline(always)]
pub unsafe fn bind(&self,target:TextureBindTarget,texture_id:u32){
transmute::<usize,fn(TextureBindTarget,u32)>(self.glBindTexture)(target,texture_id)
}
}
impl Texture{
#[inline(always)]
pub fn set_base_level(&self,target:TextureParameterTarget,level:i32){
unsafe{
transmute::<usize,fn(TextureParameterTarget,u32,i32)>(self.glTexParameteri)(target,TEXTURE_BASE_LEVEL,level)
}
}
#[inline(always)]
pub fn set_compare_function(&self,target:TextureParameterTarget,function:TextureCompareFunction){
unsafe{
transmute::<usize,fn(TextureParameterTarget,u32,TextureCompareFunction)>(self.glTexParameteri)(target,TEXTURE_COMPARE_FUNC,function)
}
}
#[inline(always)]
pub fn set_compare_mode(&self,target:TextureParameterTarget,mode:TextureCompareMode){
unsafe{
transmute::<usize,fn(TextureParameterTarget,u32,TextureCompareMode)>(self.glTexParameteri)(target,TEXTURE_COMPARE_MODE,mode)
}
}
#[inline(always)]
pub fn set_mag_filter(&self,target:TextureParameterTarget,filter:TextureMagFilter){
unsafe{
transmute::<usize,fn(TextureParameterTarget,u32,TextureMagFilter)>(self.glTexParameteri)(target,TEXTURE_MAG_FILTER,filter)
}
}
#[inline(always)]
pub fn set_min_filter(&self,target:TextureParameterTarget,filter:TextureMinFilter){
unsafe{
transmute::<usize,fn(TextureParameterTarget,u32,TextureMinFilter)>(self.glTexParameteri)(target,TEXTURE_MIN_FILTER,filter)
}
}
#[inline(always)]
pub fn set_wrap_s(&self,target:TextureParameterTarget,value:TextureWrap){
unsafe{
transmute::<usize,fn(TextureParameterTarget,u32,TextureWrap)>(self.glTexParameteri)(target,TEXTURE_WRAP_S,value)
}
}
#[inline(always)]
pub fn set_wrap_t(&self,target:TextureParameterTarget,value:TextureWrap){
unsafe{
transmute::<usize,fn(TextureParameterTarget,u32,TextureWrap)>(self.glTexParameteri)(target,TEXTURE_WRAP_T,value)
}
}
#[inline(always)]
pub fn set_wrap_r(&self,target:TextureParameterTarget,value:TextureWrap){
unsafe{
transmute::<usize,fn(TextureParameterTarget,u32,TextureWrap)>(self.glTexParameteri)(target,TEXTURE_WRAP_R,value)
}
}
}
impl Texture{
#[inline(always)]
pub unsafe fn rewrite_image_2d<I:Sized>(
&self,
target:Texture2DRewriteTarget,
mipmap_level:i32,
internal_format:Texture2DInternalFormat,
[width,height]:[i32;2],
image_data_format:ImageDataFormat,
data:*const I,
){
let [image_format,image_type]=image_data_format.to_gl_enums();
transmute::<usize,fn(
Texture2DRewriteTarget,
i32,
Texture2DInternalFormat,
i32,
i32,
i32,
u32,
u32,
*const I
)>(self.glTexImage2D)(
target,
mipmap_level,
internal_format,
width,
height,
0,
image_format,
image_type,
data
)
}
#[inline(always)]
pub unsafe fn write_image_2d<I:Sized>(
&self,
target:Texture2DWriteTarget,
mipmap_level:i32,
[x,y,width,height]:[i32;4],
image_data_format:ImageDataFormat,
data:*const I
){
let [image_format,image_type]=image_data_format.to_gl_enums();
transmute::<usize,fn(
Texture2DWriteTarget,
i32,
i32,
i32,
i32,
i32,
u32,
u32,
*const I
)>(self.glTexSubImage2D)(
target,
mipmap_level,
x,
y,
width,
height,
image_format,
image_type,
data,
)
}
#[inline(always)]
pub unsafe fn copy_image_2d(
&self,
target:Texture2DCopyTarget,
mipmap_level:i32,
[read_x,read_y]:[i32;2],
[write_x,write_y]:[i32;2],
[width,height]:[i32;2]
){
transmute::<usize,fn(Texture2DCopyTarget,i32,i32,i32,i32,i32,i32,i32)>(self.glCopyTexSubImage2D)(
target,
mipmap_level,
write_x,write_y,
read_x,read_y,width,height
)
}
}