diff options
| author | nsfisis <nsfisis@gmail.com> | 2022-12-07 22:37:14 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2022-12-07 22:54:47 +0900 |
| commit | 86914985b77ddf5d6d3a3dd6c13deed9d906a471 (patch) | |
| tree | a523883d6524d55aee713bfd6400f044f8715d52 /src/rtw/vec.zig | |
| parent | e264078ed9d94b5091a6d78f8128496ac49fbde4 (diff) | |
| download | RayTracingInOneWeekend.zig-86914985b77ddf5d6d3a3dd6c13deed9d906a471.tar.gz RayTracingInOneWeekend.zig-86914985b77ddf5d6d3a3dd6c13deed9d906a471.tar.zst RayTracingInOneWeekend.zig-86914985b77ddf5d6d3a3dd6c13deed9d906a471.zip | |
refactor: separate single main.zig
Diffstat (limited to 'src/rtw/vec.zig')
| -rw-r--r-- | src/rtw/vec.zig | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/rtw/vec.zig b/src/rtw/vec.zig new file mode 100644 index 0000000..9b2c3f0 --- /dev/null +++ b/src/rtw/vec.zig @@ -0,0 +1,109 @@ +const std = @import("std"); + +const rand = @import("rand.zig"); +const Random = rand.Random; +const randomReal = rand.randomReal; +const randomReal01 = rand.randomReal01; + +pub const Vec3 = struct { + x: f64, + y: f64, + z: f64, + + pub fn norm(v: Vec3) f64 { + return @sqrt(v.normSquared()); + } + + pub fn normSquared(v: Vec3) f64 { + return v.x * v.x + v.y * v.y + v.z * v.z; + } + + pub fn dot(u: Vec3, v: Vec3) f64 { + return u.x * v.x + u.y * v.y + u.z * v.z; + } + + pub fn cross(u: Vec3, v: Vec3) Vec3 { + return Vec3{ + .x = u.y * v.z - u.z * v.y, + .y = u.z * v.x - u.x * v.z, + .z = u.x * v.y - u.y * v.x, + }; + } + + pub fn normalized(v: Vec3) Vec3 { + const n = v.norm(); + if (n == 0.0) { + return v; + } else { + return v.div(n); + } + } + + pub fn add(u: Vec3, v: Vec3) Vec3 { + return Vec3{ + .x = u.x + v.x, + .y = u.y + v.y, + .z = u.z + v.z, + }; + } + + pub fn sub(u: Vec3, v: Vec3) Vec3 { + return Vec3{ + .x = u.x - v.x, + .y = u.y - v.y, + .z = u.z - v.z, + }; + } + + pub fn mul(v: Vec3, t: f64) Vec3 { + return Vec3{ + .x = v.x * t, + .y = v.y * t, + .z = v.z * t, + }; + } + + pub fn mulV(u: Vec3, v: Vec3) Vec3 { + return Vec3{ + .x = u.x * v.x, + .y = u.y * v.y, + .z = u.z * v.z, + }; + } + + pub fn div(v: Vec3, t: f64) Vec3 { + return Vec3{ + .x = v.x / t, + .y = v.y / t, + .z = v.z / t, + }; + } + + pub fn random01(rng: Random) Vec3 { + return Vec3{ + .x = randomReal01(rng), + .y = randomReal01(rng), + .z = randomReal01(rng), + }; + } + + pub fn random(rng: Random, min: f64, max: f64) Vec3 { + return Vec3{ + .x = randomReal(rng, min, max), + .y = randomReal(rng, min, max), + .z = randomReal(rng, min, max), + }; + } + + pub fn near_zero(v: Vec3) bool { + const epsilon = 1e-8; + return @fabs(v.x) < epsilon and @fabs(v.y) < epsilon and @fabs(v.z) < epsilon; + } +}; + +pub const Point3 = Vec3; +pub const Color = Vec3; + +pub fn rgb(r: f64, g: f64, b: f64) Color { + return .{ .x = r, .y = g, .z = b }; +} |
