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 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}