wgsl_types/types/
vec3.rs

1use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
2
3use bytes_kman::prelude::*;
4
5#[derive(Bytes)]
6pub struct vec3<T>(pub T, pub T, pub T);
7
8impl<T: Clone> From<T> for vec3<T> {
9    fn from(value: T) -> Self {
10        Self(value.clone(), value.clone(), value)
11    }
12}
13
14impl<T> From<(T, T, T)> for vec3<T> {
15    fn from(value: (T, T, T)) -> Self {
16        Self::new(value.0, value.1, value.2)
17    }
18}
19
20impl<T: Clone> From<(&T, &T, &T)> for vec3<T> {
21    fn from(value: (&T, &T, &T)) -> Self {
22        Self::new(value.0.clone(), value.1.clone(), value.2.clone())
23    }
24}
25
26impl<T: TBytes + Copy> Copy for vec3<T> {}
27
28impl<T> vec3<T> {
29    pub fn new(x: T, y: T, z: T) -> Self {
30        Self(x, y, z)
31    }
32
33    pub fn x(&self) -> &T {
34        &self.0
35    }
36
37    pub fn y(&self) -> &T {
38        &self.1
39    }
40
41    pub fn z(&self) -> &T {
42        &self.2
43    }
44
45    pub fn xy(&self) -> (&T, &T) {
46        (self.x(), self.y())
47    }
48    pub fn yx(&self) -> (&T, &T) {
49        (self.y(), self.x())
50    }
51
52    pub fn xz(&self) -> (&T, &T) {
53        (self.x(), self.z())
54    }
55    pub fn zx(&self) -> (&T, &T) {
56        (self.z(), self.x())
57    }
58
59    pub fn yz(&self) -> (&T, &T) {
60        (self.y(), self.z())
61    }
62    pub fn zy(&self) -> (&T, &T) {
63        (self.z(), self.y())
64    }
65
66    pub fn xyz(&self) -> (&T, &T, &T) {
67        (self.x(), self.y(), self.z())
68    }
69    pub fn zxy(&self) -> (&T, &T, &T) {
70        (self.z(), self.x(), self.y())
71    }
72    pub fn yzx(&self) -> (&T, &T, &T) {
73        (self.y(), self.z(), self.x())
74    }
75
76    pub fn yxz(&self) -> (&T, &T, &T) {
77        (self.y(), self.x(), self.z())
78    }
79    pub fn zyx(&self) -> (&T, &T, &T) {
80        (self.z(), self.y(), self.x())
81    }
82    pub fn xzy(&self) -> (&T, &T, &T) {
83        (self.x(), self.z(), self.y())
84    }
85
86    pub fn r(&self) -> &T {
87        self.x()
88    }
89    pub fn g(&self) -> &T {
90        self.y()
91    }
92    pub fn b(&self) -> &T {
93        self.z()
94    }
95
96    pub fn rg(&self) -> (&T, &T) {
97        self.xy()
98    }
99    pub fn gr(&self) -> (&T, &T) {
100        self.yx()
101    }
102
103    pub fn rb(&self) -> (&T, &T) {
104        self.xz()
105    }
106    pub fn br(&self) -> (&T, &T) {
107        self.zx()
108    }
109
110    pub fn rgb(&self) -> (&T, &T, &T) {
111        self.xyz()
112    }
113    pub fn brg(&self) -> (&T, &T, &T) {
114        self.zxy()
115    }
116    pub fn gbr(&self) -> (&T, &T, &T) {
117        self.yzx()
118    }
119
120    pub fn grb(&self) -> (&T, &T, &T) {
121        self.yxz()
122    }
123    pub fn bgr(&self) -> (&T, &T, &T) {
124        self.zyx()
125    }
126    pub fn rbg(&self) -> (&T, &T, &T) {
127        self.xzy()
128    }
129}
130
131impl<T: TBytes + Clone> Clone for vec3<T> {
132    fn clone(&self) -> Self {
133        Self(self.0.clone(), self.1.clone(), self.2.clone())
134    }
135}
136
137impl<T: TBytes + std::fmt::Debug> std::fmt::Debug for vec3<T> {
138    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
139        f.debug_struct("vec3")
140            .field("x", &self.0)
141            .field("y", &self.1)
142            .field("z", &self.2)
143            .finish()
144    }
145}
146
147impl<T: Add<Output = T>> Add for vec3<T> {
148    type Output = vec3<T>;
149
150    fn add(self, rhs: Self) -> Self::Output {
151        vec3(self.0 + rhs.0, self.1 + rhs.1, self.2 + rhs.2)
152    }
153}
154
155impl<T: Sub<Output = T>> Sub for vec3<T> {
156    type Output = vec3<T>;
157
158    fn sub(self, rhs: Self) -> Self::Output {
159        vec3(self.0 - rhs.0, self.1 - rhs.1, self.2 - rhs.2)
160    }
161}
162
163impl<T: Mul<Output = T>> Mul for vec3<T> {
164    type Output = vec3<T>;
165
166    fn mul(self, rhs: Self) -> Self::Output {
167        vec3(self.0 * rhs.0, self.1 * rhs.1, self.2 * rhs.2)
168    }
169}
170
171impl<T: Div<Output = T>> Div for vec3<T> {
172    type Output = vec3<T>;
173
174    fn div(self, rhs: Self) -> Self::Output {
175        vec3(self.0 / rhs.0, self.1 / rhs.1, self.2 / rhs.2)
176    }
177}
178
179impl<T: AddAssign> AddAssign for vec3<T> {
180    fn add_assign(&mut self, rhs: Self) {
181        self.0 += rhs.0;
182        self.1 += rhs.1;
183        self.2 += rhs.2;
184    }
185}
186
187impl<T: SubAssign> SubAssign for vec3<T> {
188    fn sub_assign(&mut self, rhs: Self) {
189        self.0 -= rhs.0;
190        self.1 -= rhs.1;
191        self.2 -= rhs.2;
192    }
193}
194
195impl<T: MulAssign> MulAssign for vec3<T> {
196    fn mul_assign(&mut self, rhs: Self) {
197        self.0 *= rhs.0;
198        self.1 *= rhs.1;
199        self.2 *= rhs.2;
200    }
201}
202
203impl<T: DivAssign> DivAssign for vec3<T> {
204    fn div_assign(&mut self, rhs: Self) {
205        self.0 /= rhs.0;
206        self.1 /= rhs.1;
207        self.2 /= rhs.2;
208    }
209}