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}