tea/texture/
gl3.rs

1use crate::{GlEnum, GlObject, GlBind};
2
3#[derive(Default, Debug, PartialEq, Eq, Copy, Clone)]
4pub enum PixelFormat {
5    Red,
6    RG,
7    RGB,
8    #[default]
9    RGBA,
10    Depth,
11    Depth16,
12    Depth24,
13    Depth32,
14    Depth32F,
15    Depth24Stencil8,
16    Depth32FStencil8
17}
18
19impl GlEnum for PixelFormat {
20    fn to_enum(&self) -> u32 {
21        match self {
22            PixelFormat::Red => { return gl::RED },
23            PixelFormat::RG => { return gl::RG },
24            PixelFormat::RGB => { return gl::RGB },
25            PixelFormat::RGBA => { return gl::RGBA },
26            PixelFormat::Depth => { return gl::DEPTH_COMPONENT },
27            PixelFormat::Depth16 => { return gl::DEPTH_COMPONENT16 },
28            PixelFormat::Depth24 => { return gl::DEPTH_COMPONENT24 },
29            PixelFormat::Depth32 => { return gl::DEPTH_COMPONENT32 },
30            PixelFormat::Depth32F => { return gl::DEPTH_COMPONENT32F },
31            PixelFormat::Depth24Stencil8 => { return gl::DEPTH24_STENCIL8 },
32            PixelFormat::Depth32FStencil8 => { return gl::DEPTH32F_STENCIL8 },
33        }
34    }
35}
36
37pub trait Texture: GlBind + GlObject {
38    type Target;
39}
40
41#[derive(Default, Debug, PartialEq, Eq, Copy, Clone)]
42pub enum TexTarget {
43    Texture1D,
44    #[default]
45    Texture2D,
46    CubeMapPositiveX,
47    CubeMapNegativeX,
48    CubeMapPositiveY,
49    CubeMapNegativeY,
50    CubeMapPositiveZ,
51    CubeMapNegativeZ,
52    ProxyTexture2D,
53    ProxyCubeMap,
54    Texture3D,
55    Texture1DArray,
56    Texture2DArray,
57    Texture2DMultisample,
58    Texture2DMultisampleArray,
59}
60
61impl GlEnum for TexTarget {
62    fn to_enum(&self) -> u32 {
63        match self {
64            Self::Texture1D => { gl::TEXTURE_1D },
65            Self::Texture2D => { gl::TEXTURE_2D },
66            Self::CubeMapPositiveX => { gl::TEXTURE_CUBE_MAP_POSITIVE_X },
67            Self::CubeMapNegativeX => { gl::TEXTURE_CUBE_MAP_NEGATIVE_X },
68            Self::CubeMapPositiveY => { gl::TEXTURE_CUBE_MAP_POSITIVE_Y },
69            Self::CubeMapNegativeY => { gl::TEXTURE_CUBE_MAP_NEGATIVE_Y },
70            Self::CubeMapPositiveZ => { gl::TEXTURE_CUBE_MAP_POSITIVE_Z },
71            Self::CubeMapNegativeZ => { gl::TEXTURE_CUBE_MAP_NEGATIVE_Z },
72            Self::ProxyTexture2D => { gl::PROXY_TEXTURE_2D },
73            Self::ProxyCubeMap => { gl::PROXY_TEXTURE_CUBE_MAP },
74            Self::Texture3D => { gl::TEXTURE_3D },
75            Self::Texture1DArray => { gl::TEXTURE_1D_ARRAY },
76            Self::Texture2DArray => { gl::TEXTURE_2D_ARRAY },
77            Self::Texture2DMultisample => { gl::TEXTURE_2D_MULTISAMPLE },
78            Self::Texture2DMultisampleArray => { gl::TEXTURE_2D_MULTISAMPLE_ARRAY },
79        }
80    }
81}
82
83impl TexTarget {
84    pub fn get_binding(&self) -> u32 {
85        match self {
86            TexTarget::Texture2D => { gl::TEXTURE_BINDING_2D },
87            _ => { gl::NONE }
88        }
89    }
90}
91
92#[derive(Default, Debug, PartialEq, Eq, Copy, Clone)]
93pub enum TexFilter {
94    Nearest,
95    #[default]
96    Linear,
97    // only for min filter
98    NearestMipmapNearest,
99    LinearMipmapNearest,
100    NearestMipmapLinear,
101    LinearMipmapLinear
102}
103
104impl GlEnum for TexFilter {
105    fn to_enum(&self) -> u32 {
106        match self {
107            Self::Nearest => { gl::NEAREST },
108            Self::Linear => { gl::LINEAR },
109            Self::NearestMipmapNearest => { gl::NEAREST_MIPMAP_NEAREST },
110            Self::LinearMipmapNearest => { gl::LINEAR_MIPMAP_NEAREST },
111            Self::NearestMipmapLinear => { gl::NEAREST_MIPMAP_LINEAR },
112            Self::LinearMipmapLinear => { gl::LINEAR_MIPMAP_LINEAR },
113        }
114    }
115}
116
117#[derive(Default, Debug, PartialEq, Eq, Copy, Clone)]
118pub enum TexWrap {
119    #[default]
120    Repeat,
121    MirroredRepeat,
122    ClampToEdge,
123    ClampToBorder,
124}
125
126impl GlEnum for TexWrap {
127    fn to_enum(&self) -> u32 {
128        match self {
129            Self::Repeat => { gl::REPEAT },
130            Self::MirroredRepeat => { gl::MIRRORED_REPEAT }
131            Self::ClampToEdge => { gl::CLAMP_TO_EDGE },
132            Self::ClampToBorder => { gl::CLAMP_TO_BORDER },
133        }
134    }
135}
136
137#[derive(Debug, PartialEq, Eq, Copy, Clone)]
138pub enum TexParam {
139    MinFilter(TexFilter),
140    MagFilter(TexFilter),
141    WrapS(TexWrap),
142    WrapT(TexWrap),
143    WrapR(TexWrap),
144}
145
146impl Default for TexParam {
147    fn default() -> Self {
148        TexParam::MinFilter(TexFilter::default())
149    }
150}
151
152impl GlEnum for TexParam {
153    fn to_enum(&self) -> u32 {
154        match self {
155            Self::MinFilter(_) => { gl::TEXTURE_MIN_FILTER },
156            Self::MagFilter(_) => { gl::TEXTURE_MAG_FILTER },
157            Self::WrapS(_) => { gl::TEXTURE_WRAP_S },
158            Self::WrapT(_) => { gl::TEXTURE_WRAP_T }
159            Self::WrapR(_) => { gl::TEXTURE_WRAP_R }
160        }
161    }
162}