Initial commit
This commit is contained in:
commit
4c872f9f91
9 changed files with 228 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
.target
|
||||||
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ray-tracing-core"
|
||||||
|
version = "0.1.0"
|
||||||
4
Cargo.toml
Normal file
4
Cargo.toml
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
[workspace]
|
||||||
|
|
||||||
|
members = [ "ray-tracing-core"]
|
||||||
|
resolver = "2"
|
||||||
6
ray-tracing-core/Cargo.toml
Normal file
6
ray-tracing-core/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "ray-tracing-core"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
11
ray-tracing-core/src/lib.rs
Normal file
11
ray-tracing-core/src/lib.rs
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
pub mod material;
|
||||||
|
pub mod math;
|
||||||
|
pub mod ray;
|
||||||
|
pub mod scene;
|
||||||
|
|
||||||
|
pub mod prelude {
|
||||||
|
pub type Float = f64;
|
||||||
|
pub use crate::material::Material;
|
||||||
|
pub use crate::math::{Dir3, Pos3};
|
||||||
|
pub use crate::ray::Ray;
|
||||||
|
}
|
||||||
1
ray-tracing-core/src/material.rs
Normal file
1
ray-tracing-core/src/material.rs
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
pub trait Material {}
|
||||||
166
ray-tracing-core/src/math.rs
Normal file
166
ray-tracing-core/src/math.rs
Normal file
|
|
@ -0,0 +1,166 @@
|
||||||
|
use crate::prelude::*;
|
||||||
|
use std::ops::{Add, Div, Mul, Neg, Sub};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub struct Pos3 {
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
z: Float,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub struct Dir3 {
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
z: Float,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Pos3 {
|
||||||
|
pub fn new(x: Float, y: Float, z: Float) -> Self {
|
||||||
|
Self { x, y, z }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn x(self) -> Float {
|
||||||
|
self.x
|
||||||
|
}
|
||||||
|
pub fn y(self) -> Float {
|
||||||
|
self.y
|
||||||
|
}
|
||||||
|
pub fn z(self) -> Float {
|
||||||
|
self.z
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn zero() -> Self {
|
||||||
|
Self {
|
||||||
|
x: 0.0,
|
||||||
|
y: 0.0,
|
||||||
|
z: 0.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Dir3 {
|
||||||
|
pub fn new(x: Float, y: Float, z: Float) -> Self {
|
||||||
|
Self { x, y, z }
|
||||||
|
}
|
||||||
|
pub fn x(self) -> Float {
|
||||||
|
self.x
|
||||||
|
}
|
||||||
|
pub fn y(self) -> Float {
|
||||||
|
self.y
|
||||||
|
}
|
||||||
|
pub fn z(self) -> Float {
|
||||||
|
self.z
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn zero() -> Self {
|
||||||
|
Self {
|
||||||
|
x: 0.0,
|
||||||
|
y: 0.0,
|
||||||
|
z: 0.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn normalize(self) -> Self {
|
||||||
|
self / self.length()
|
||||||
|
}
|
||||||
|
pub fn length(self) -> Float {
|
||||||
|
Float::sqrt(self.x * self.x + self.y * self.y + self.z * self.z)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sub for Pos3 {
|
||||||
|
type Output = Dir3;
|
||||||
|
|
||||||
|
fn sub(self, rhs: Self) -> Self::Output {
|
||||||
|
Dir3 {
|
||||||
|
x: self.x - rhs.x,
|
||||||
|
y: self.y - rhs.y,
|
||||||
|
z: self.z - rhs.z,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Add for Dir3 {
|
||||||
|
type Output = Dir3;
|
||||||
|
|
||||||
|
fn add(self, rhs: Self) -> Self::Output {
|
||||||
|
Dir3 {
|
||||||
|
x: self.x + rhs.x,
|
||||||
|
y: self.y + rhs.y,
|
||||||
|
z: self.z + rhs.z,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Add<Pos3> for Dir3 {
|
||||||
|
type Output = Pos3;
|
||||||
|
|
||||||
|
fn add(self, rhs: Pos3) -> Self::Output {
|
||||||
|
Pos3 {
|
||||||
|
x: self.x + rhs.x,
|
||||||
|
y: self.y + rhs.y,
|
||||||
|
z: self.z + rhs.z,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Add<Dir3> for Pos3 {
|
||||||
|
type Output = Pos3;
|
||||||
|
|
||||||
|
fn add(self, rhs: Dir3) -> Self::Output {
|
||||||
|
Pos3 {
|
||||||
|
x: self.x + rhs.x,
|
||||||
|
y: self.y + rhs.y,
|
||||||
|
z: self.z + rhs.z,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sub for Dir3 {
|
||||||
|
type Output = Dir3;
|
||||||
|
|
||||||
|
fn sub(self, rhs: Self) -> Self::Output {
|
||||||
|
Dir3 {
|
||||||
|
x: self.x - rhs.x,
|
||||||
|
y: self.y - rhs.y,
|
||||||
|
z: self.z - rhs.z,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Mul<Float> for Dir3 {
|
||||||
|
type Output = Dir3;
|
||||||
|
|
||||||
|
fn mul(self, rhs: Float) -> Self::Output {
|
||||||
|
Dir3 {
|
||||||
|
x: self.x * rhs,
|
||||||
|
y: self.y * rhs,
|
||||||
|
z: self.z * rhs,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Div<Float> for Dir3 {
|
||||||
|
type Output = Dir3;
|
||||||
|
|
||||||
|
fn div(self, rhs: Float) -> Self::Output {
|
||||||
|
Dir3 {
|
||||||
|
x: self.x / rhs,
|
||||||
|
y: self.y / rhs,
|
||||||
|
z: self.z / rhs,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Neg for Dir3 {
|
||||||
|
type Output = Dir3;
|
||||||
|
|
||||||
|
fn neg(self) -> Self::Output {
|
||||||
|
Dir3 {
|
||||||
|
x: -self.x,
|
||||||
|
y: -self.y,
|
||||||
|
z: -self.z,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
8
ray-tracing-core/src/ray.rs
Normal file
8
ray-tracing-core/src/ray.rs
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub struct Ray {
|
||||||
|
pub start: Pos3,
|
||||||
|
pub dir: Dir3,
|
||||||
|
pub time: Float,
|
||||||
|
}
|
||||||
24
ray-tracing-core/src/scene.rs
Normal file
24
ray-tracing-core/src/scene.rs
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
pub trait Scene {
|
||||||
|
fn intersect(&self, ray: Ray, min: Float, max: Float) -> Option<Intersection<'_>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Intersection<'sc> {
|
||||||
|
t: Float,
|
||||||
|
material: &'sc dyn Material,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'sc> Intersection<'sc> {
|
||||||
|
pub fn new(t: Float, material: &'sc dyn Material) -> Self {
|
||||||
|
Self { t, material }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn t(&self) -> Float {
|
||||||
|
self.t
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn material(&self) -> &'sc dyn Material {
|
||||||
|
self.material
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue