1use bitflags::bitflags;
5
6#[doc(alias = "C3D_TexEnv")]
9pub struct TexEnv(*mut citro3d_sys::C3D_TexEnv);
10
11pub(crate) const TEXENV_COUNT: usize = 6;
13
14impl TexEnv {
15 pub(crate) fn new(stage: Stage) -> Self {
16 let mut result = unsafe { Self(citro3d_sys::C3D_GetTexEnv(stage.0 as _)) };
17 result.reset();
18 result
19 }
20
21 pub fn reset(&mut self) {
23 unsafe {
24 citro3d_sys::C3D_TexEnvInit(self.0);
25 }
26 }
27
28 #[doc(alias = "C3D_TexEnvSrc")]
36 pub fn src(
37 &mut self,
38 mode: Mode,
39 source0: Source,
40 source1: Option<Source>,
41 source2: Option<Source>,
42 ) -> &mut Self {
43 unsafe {
44 citro3d_sys::C3D_TexEnvSrc(
45 self.0,
46 mode.bits(),
47 source0 as _,
48 source1.unwrap_or(Source::PrimaryColor) as _,
49 source2.unwrap_or(Source::PrimaryColor) as _,
50 );
51 }
52 self
53 }
54
55 #[doc(alias = "C3D_TexEnvFunc")]
62 pub fn func(&mut self, mode: Mode, func: CombineFunc) -> &mut Self {
63 unsafe {
64 citro3d_sys::C3D_TexEnvFunc(self.0, mode.bits(), func as _);
65 }
66
67 self
68 }
69}
70
71bitflags! {
72 #[doc(alias = "C3D_TexEnvMode")]
74 pub struct Mode: citro3d_sys::C3D_TexEnvMode {
75 #[allow(missing_docs)]
76 const RGB = citro3d_sys::C3D_RGB;
77 #[allow(missing_docs)]
78 const ALPHA = citro3d_sys::C3D_Alpha;
79 #[allow(missing_docs)]
80 const BOTH = citro3d_sys::C3D_Both;
81 }
82}
83
84#[doc(alias = "GPU_TEVSRC")]
86#[allow(missing_docs)]
87#[derive(Debug, Clone, Copy)]
88#[repr(u8)]
89#[non_exhaustive]
90pub enum Source {
91 PrimaryColor = ctru_sys::GPU_PRIMARY_COLOR,
92 FragmentPrimaryColor = ctru_sys::GPU_FRAGMENT_PRIMARY_COLOR,
93 FragmentSecondaryColor = ctru_sys::GPU_FRAGMENT_SECONDARY_COLOR,
94 Texture0 = ctru_sys::GPU_TEXTURE0,
95 Texture1 = ctru_sys::GPU_TEXTURE1,
96 Texture2 = ctru_sys::GPU_TEXTURE2,
97 Texture3 = ctru_sys::GPU_TEXTURE3,
98 PreviousBuffer = ctru_sys::GPU_PREVIOUS_BUFFER,
99 Constant = ctru_sys::GPU_CONSTANT,
100 Previous = ctru_sys::GPU_PREVIOUS,
101}
102
103#[doc(alias = "GPU_COMBINEFUNC")]
105#[allow(missing_docs)]
106#[derive(Debug, Clone, Copy)]
107#[repr(u8)]
108#[non_exhaustive]
109pub enum CombineFunc {
110 Replace = ctru_sys::GPU_REPLACE,
111 Modulate = ctru_sys::GPU_MODULATE,
112 Add = ctru_sys::GPU_ADD,
113 AddSigned = ctru_sys::GPU_ADD_SIGNED,
114 Interpolate = ctru_sys::GPU_INTERPOLATE,
115 Subtract = ctru_sys::GPU_SUBTRACT,
116 Dot3Rgb = ctru_sys::GPU_DOT3_RGB,
117 }
120
121#[derive(Copy, Clone, Debug)]
125pub struct Stage(pub(crate) usize);
126
127impl Stage {
128 pub fn new(index: usize) -> Option<Self> {
130 (index < 6).then_some(Self(index))
131 }
132}