ft (wip): deserialization
This commit is contained in:
209
src/vec3.rs
209
src/vec3.rs
@@ -1,39 +1,40 @@
|
||||
use core::f32::math::sqrt;
|
||||
use is_close::default;
|
||||
use rand::RngExt;
|
||||
use serde::Deserialize;
|
||||
use std::{
|
||||
fmt::Display,
|
||||
ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign},
|
||||
};
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
#[derive(Copy, Clone, Debug, Deserialize)]
|
||||
pub struct Vec3 {
|
||||
r: f32,
|
||||
g: f32,
|
||||
b: f32,
|
||||
x: f32,
|
||||
y: f32,
|
||||
z: f32,
|
||||
}
|
||||
|
||||
pub type Colour = Vec3;
|
||||
|
||||
impl Vec3 {
|
||||
pub fn new(r: f32, g: f32, b: f32) -> Self {
|
||||
Self { r: r, g: g, b: b }
|
||||
Self { x: r, y: g, z: b }
|
||||
}
|
||||
|
||||
pub fn nil() -> Self {
|
||||
Self {
|
||||
r: 0.,
|
||||
g: 0.,
|
||||
b: 0.,
|
||||
x: 0.,
|
||||
y: 0.,
|
||||
z: 0.,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn random() -> Self {
|
||||
let mut rng = rand::rng();
|
||||
Self {
|
||||
r: rng.random_range(-1.0..1.),
|
||||
g: rng.random_range(-1.0..1.),
|
||||
b: rng.random_range(-1.0..1.),
|
||||
x: rng.random_range(-1.0..1.),
|
||||
y: rng.random_range(-1.0..1.),
|
||||
z: rng.random_range(-1.0..1.),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,15 +57,15 @@ impl Vec3 {
|
||||
}
|
||||
|
||||
pub fn x(&self) -> &f32 {
|
||||
&self.r
|
||||
&self.x
|
||||
}
|
||||
|
||||
pub fn y(&self) -> &f32 {
|
||||
&self.g
|
||||
&self.y
|
||||
}
|
||||
|
||||
pub fn z(&self) -> &f32 {
|
||||
&self.b
|
||||
&self.z
|
||||
}
|
||||
|
||||
pub fn length(&self) -> f32 {
|
||||
@@ -72,18 +73,18 @@ impl Vec3 {
|
||||
}
|
||||
|
||||
pub fn length_squared(&self) -> f32 {
|
||||
(self.r * self.r + self.g * self.g + self.b * self.b) as f32
|
||||
(self.x * self.x + self.y * self.y + self.z * self.z) as f32
|
||||
}
|
||||
|
||||
pub fn dot(&self, other: &Self) -> f32 {
|
||||
self.r * other.r + self.g * other.g + self.b * other.b
|
||||
self.x * other.x + self.y * other.y + self.z * other.z
|
||||
}
|
||||
|
||||
pub fn cross(&self, other: &Self) -> Self {
|
||||
Self {
|
||||
r: self.g * other.b - self.b * other.g,
|
||||
g: self.b * other.r - self.r * other.b,
|
||||
b: self.r * other.g - self.g * other.r,
|
||||
x: self.y * other.z - self.z * other.y,
|
||||
y: self.z * other.x - self.x * other.z,
|
||||
z: self.x * other.y - self.y * other.x,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,9 +97,9 @@ impl Vec3 {
|
||||
}
|
||||
|
||||
pub fn near_zero(&self) -> bool {
|
||||
default().is_close(self.r, 0.)
|
||||
&& default().is_close(self.g, 0.)
|
||||
&& default().is_close(self.b, 0.)
|
||||
default().is_close(self.x, 0.)
|
||||
&& default().is_close(self.y, 0.)
|
||||
&& default().is_close(self.z, 0.)
|
||||
}
|
||||
|
||||
pub fn reflect(&self, n: &Self) -> Self {
|
||||
@@ -117,18 +118,18 @@ impl Vec3 {
|
||||
|
||||
pub fn output(self) -> image::Rgb<u8> {
|
||||
// gamma correction
|
||||
let r = if self.r > 0. {
|
||||
sqrt(self.r).clamp(0., 1.)
|
||||
let r = if self.x > 0. {
|
||||
sqrt(self.x).clamp(0., 1.)
|
||||
} else {
|
||||
0.
|
||||
};
|
||||
let g = if self.g > 0. {
|
||||
sqrt(self.g).clamp(0., 1.)
|
||||
let g = if self.y > 0. {
|
||||
sqrt(self.y).clamp(0., 1.)
|
||||
} else {
|
||||
0.
|
||||
};
|
||||
let b = if self.b > 0. {
|
||||
sqrt(self.b).clamp(0.1, 1.)
|
||||
let b = if self.z > 0. {
|
||||
sqrt(self.z).clamp(0.1, 1.)
|
||||
} else {
|
||||
0.
|
||||
};
|
||||
@@ -142,9 +143,19 @@ impl Vec3 {
|
||||
|
||||
pub fn clone(&self) -> Self {
|
||||
Self {
|
||||
r: self.r,
|
||||
g: self.g,
|
||||
b: self.b,
|
||||
x: self.x,
|
||||
y: self.y,
|
||||
z: self.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Vec3 {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
x: 0.,
|
||||
y: 0.,
|
||||
z: 0.,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -162,9 +173,9 @@ impl Neg for Vec3 {
|
||||
|
||||
fn neg(self) -> Self::Output {
|
||||
Self {
|
||||
r: -self.r,
|
||||
g: -self.g,
|
||||
b: -self.b,
|
||||
x: -self.x,
|
||||
y: -self.y,
|
||||
z: -self.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -174,9 +185,9 @@ impl Add<Vec3> for Vec3 {
|
||||
|
||||
fn add(self, _rhs: Self) -> Self {
|
||||
Self {
|
||||
r: self.r + _rhs.r,
|
||||
g: self.g + _rhs.g,
|
||||
b: self.b + _rhs.b,
|
||||
x: self.x + _rhs.x,
|
||||
y: self.y + _rhs.y,
|
||||
z: self.z + _rhs.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -186,9 +197,9 @@ impl Add<f32> for Vec3 {
|
||||
|
||||
fn add(self, f: f32) -> Self {
|
||||
Self {
|
||||
r: self.r + f,
|
||||
g: self.g + f,
|
||||
b: self.b + f,
|
||||
x: self.x + f,
|
||||
y: self.y + f,
|
||||
z: self.z + f,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -196,9 +207,9 @@ impl Add<f32> for Vec3 {
|
||||
impl AddAssign<Vec3> for Vec3 {
|
||||
fn add_assign(&mut self, other: Self) {
|
||||
*self = Self {
|
||||
r: self.r + other.r,
|
||||
g: self.g + other.g,
|
||||
b: self.b + other.b,
|
||||
x: self.x + other.x,
|
||||
y: self.y + other.y,
|
||||
z: self.z + other.z,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -206,9 +217,9 @@ impl AddAssign<Vec3> for Vec3 {
|
||||
impl AddAssign<f32> for Vec3 {
|
||||
fn add_assign(&mut self, f: f32) {
|
||||
*self = Self {
|
||||
r: self.r + f,
|
||||
g: self.g + f,
|
||||
b: self.b + f,
|
||||
x: self.x + f,
|
||||
y: self.y + f,
|
||||
z: self.z + f,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -217,9 +228,9 @@ impl Sub<&Vec3> for Vec3 {
|
||||
|
||||
fn sub(self, rhs: &Self) -> Self {
|
||||
Self {
|
||||
r: self.r - rhs.r,
|
||||
g: self.g - rhs.g,
|
||||
b: self.b - rhs.b,
|
||||
x: self.x - rhs.x,
|
||||
y: self.y - rhs.y,
|
||||
z: self.z - rhs.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -229,9 +240,9 @@ impl Sub<Vec3> for Vec3 {
|
||||
|
||||
fn sub(self, rhs: Self) -> Self {
|
||||
Self {
|
||||
r: self.r - rhs.r,
|
||||
g: self.g - rhs.g,
|
||||
b: self.b - rhs.b,
|
||||
x: self.x - rhs.x,
|
||||
y: self.y - rhs.y,
|
||||
z: self.z - rhs.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -241,9 +252,9 @@ impl Sub<f32> for Vec3 {
|
||||
|
||||
fn sub(self, f: f32) -> Self {
|
||||
Self {
|
||||
r: self.r - f,
|
||||
g: self.g - f,
|
||||
b: self.b - f,
|
||||
x: self.x - f,
|
||||
y: self.y - f,
|
||||
z: self.z - f,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -251,9 +262,9 @@ impl Sub<f32> for Vec3 {
|
||||
impl SubAssign<Vec3> for Vec3 {
|
||||
fn sub_assign(&mut self, rhs: Self) {
|
||||
*self = Self {
|
||||
r: self.r - rhs.r,
|
||||
g: self.g - rhs.g,
|
||||
b: self.b - rhs.b,
|
||||
x: self.x - rhs.x,
|
||||
y: self.y - rhs.y,
|
||||
z: self.z - rhs.z,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -261,9 +272,9 @@ impl SubAssign<Vec3> for Vec3 {
|
||||
impl SubAssign<f32> for Vec3 {
|
||||
fn sub_assign(&mut self, f: f32) {
|
||||
*self = Self {
|
||||
r: self.r - f,
|
||||
g: self.g - f,
|
||||
b: self.b - f,
|
||||
x: self.x - f,
|
||||
y: self.y - f,
|
||||
z: self.z - f,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -273,9 +284,9 @@ impl Mul<Vec3> for Vec3 {
|
||||
|
||||
fn mul(self, rhs: Self) -> Self::Output {
|
||||
Self {
|
||||
r: self.r * rhs.r,
|
||||
g: self.g * rhs.g,
|
||||
b: self.b * rhs.b,
|
||||
x: self.x * rhs.x,
|
||||
y: self.y * rhs.y,
|
||||
z: self.z * rhs.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -286,9 +297,9 @@ impl Mul<Vec3> for u32 {
|
||||
fn mul(self, rhs: Vec3) -> Self::Output {
|
||||
let f = self as f32;
|
||||
Vec3 {
|
||||
r: rhs.r * f,
|
||||
g: rhs.g * f,
|
||||
b: rhs.b * f,
|
||||
x: rhs.x * f,
|
||||
y: rhs.y * f,
|
||||
z: rhs.z * f,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -298,9 +309,9 @@ impl Mul<f32> for Vec3 {
|
||||
|
||||
fn mul(self, f: f32) -> Self::Output {
|
||||
Self {
|
||||
r: self.r * f,
|
||||
g: self.g * f,
|
||||
b: self.b * f,
|
||||
x: self.x * f,
|
||||
y: self.y * f,
|
||||
z: self.z * f,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -310,9 +321,9 @@ impl Mul<Vec3> for f32 {
|
||||
|
||||
fn mul(self, rhs: Vec3) -> Self::Output {
|
||||
Vec3 {
|
||||
r: rhs.r * self,
|
||||
g: rhs.g * self,
|
||||
b: rhs.b * self,
|
||||
x: rhs.x * self,
|
||||
y: rhs.y * self,
|
||||
z: rhs.z * self,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -322,9 +333,9 @@ impl Mul<&Vec3> for f32 {
|
||||
|
||||
fn mul(self, rhs: &Vec3) -> Self::Output {
|
||||
Vec3 {
|
||||
r: rhs.r * self,
|
||||
g: rhs.g * self,
|
||||
b: rhs.b * self,
|
||||
x: rhs.x * self,
|
||||
y: rhs.y * self,
|
||||
z: rhs.z * self,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -332,9 +343,9 @@ impl Mul<&Vec3> for f32 {
|
||||
impl MulAssign<Vec3> for Vec3 {
|
||||
fn mul_assign(&mut self, rhs: Self) {
|
||||
*self = Self {
|
||||
r: self.r * rhs.r,
|
||||
g: self.g * rhs.g,
|
||||
b: self.b * rhs.b,
|
||||
x: self.x * rhs.x,
|
||||
y: self.y * rhs.y,
|
||||
z: self.z * rhs.z,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -342,9 +353,9 @@ impl MulAssign<Vec3> for Vec3 {
|
||||
impl MulAssign<f32> for Vec3 {
|
||||
fn mul_assign(&mut self, f: f32) {
|
||||
*self = Self {
|
||||
r: self.r * f,
|
||||
g: self.g * f,
|
||||
b: self.b * f,
|
||||
x: self.x * f,
|
||||
y: self.y * f,
|
||||
z: self.z * f,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -354,9 +365,9 @@ impl Div<Vec3> for Vec3 {
|
||||
|
||||
fn div(self, rhs: Self) -> Self::Output {
|
||||
Self {
|
||||
r: self.r / rhs.r,
|
||||
g: self.g / rhs.g,
|
||||
b: self.b / rhs.b,
|
||||
x: self.x / rhs.x,
|
||||
y: self.y / rhs.y,
|
||||
z: self.z / rhs.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -366,9 +377,9 @@ impl Div<i32> for Vec3 {
|
||||
fn div(self, i: i32) -> Self::Output {
|
||||
let f: f32 = i as f32;
|
||||
Self {
|
||||
r: self.r / f,
|
||||
g: self.g / f,
|
||||
b: self.b / f,
|
||||
x: self.x / f,
|
||||
y: self.y / f,
|
||||
z: self.z / f,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -378,9 +389,9 @@ impl Div<f32> for Vec3 {
|
||||
|
||||
fn div(self, f: f32) -> Self::Output {
|
||||
Self {
|
||||
r: self.r / f,
|
||||
g: self.g / f,
|
||||
b: self.b / f,
|
||||
x: self.x / f,
|
||||
y: self.y / f,
|
||||
z: self.z / f,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -388,9 +399,9 @@ impl Div<f32> for Vec3 {
|
||||
impl DivAssign<Vec3> for Vec3 {
|
||||
fn div_assign(&mut self, rhs: Self) {
|
||||
*self = Self {
|
||||
r: self.r / rhs.r,
|
||||
g: self.g / rhs.g,
|
||||
b: self.b / rhs.b,
|
||||
x: self.x / rhs.x,
|
||||
y: self.y / rhs.y,
|
||||
z: self.z / rhs.z,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -398,21 +409,21 @@ impl DivAssign<Vec3> for Vec3 {
|
||||
impl DivAssign<f32> for Vec3 {
|
||||
fn div_assign(&mut self, f: f32) {
|
||||
*self = Self {
|
||||
r: self.r / f,
|
||||
g: self.g / f,
|
||||
b: self.b / f,
|
||||
x: self.x / f,
|
||||
y: self.y / f,
|
||||
z: self.z / f,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for Vec3 {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
self.r == other.r && self.g == other.g && self.b == other.b
|
||||
self.x == other.x && self.y == other.y && self.z == other.z
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for Vec3 {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "({}, {}, {})", self.r, self.g, self.b)
|
||||
write!(f, "({}, {}, {})", self.x, self.y, self.z)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user