Replace Aggregate with Primitive and stub Primitive::transform()

All the implemntations of transform are just todo!()
This commit is contained in:
Matthew Gordon 2025-03-29 15:39:02 -03:00
parent fa713fc72d
commit 6e3a5dd1d8
8 changed files with 34 additions and 49 deletions

View File

@ -20,7 +20,7 @@ use vanrijn::materials::LambertianMaterial;
use vanrijn::math::Vec3;
use vanrijn::mesh::load_obj;
use vanrijn::partial_render_scene;
use vanrijn::raycasting::{Aggregate, BoundingVolumeHierarchy, Plane, Primitive, Sphere};
use vanrijn::raycasting::{BoundingVolumeHierarchy, Plane, Primitive, Sphere};
use vanrijn::scene::Scene;
use vanrijn::util::TileIterator;
@ -131,7 +131,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
}),
)?;
println!("Building BVH...");
let model_bvh: Box<dyn Aggregate> =
let model_bvh: Box<dyn Primitive> =
Box::new(BoundingVolumeHierarchy::build(model_object.as_mut_slice()));
println!("Constructing Scene...");
@ -183,7 +183,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
//specular_strength: 1.0,
}),
)),
]) as Box<dyn Aggregate>,
]) as Box<dyn Primitive>,
model_bvh,
],
};

View File

@ -1,8 +1,6 @@
use crate::math::Vec3;
use crate::math::{Affine3, Vec3};
use super::{
Aggregate, BoundingBox, HasBoundingBox, Intersect, IntersectP, IntersectionInfo, Primitive, Ray,
};
use super::{BoundingBox, HasBoundingBox, Intersect, IntersectP, IntersectionInfo, Primitive, Ray};
use std::cmp::Ordering;
use std::sync::Arc;
@ -125,7 +123,11 @@ impl HasBoundingBox for BoundingVolumeHierarchy {
}
}
impl Aggregate for BoundingVolumeHierarchy {}
impl Primitive for BoundingVolumeHierarchy {
fn transform(&self, transformation: &Affine3<f64>) -> Box<dyn Primitive> {
todo!()
}
}
#[cfg(test)]
mod test {}

View File

@ -1,4 +1,4 @@
use crate::math::Vec3;
use crate::math::{Affine3,Vec3};
use super::materials::Material;
@ -121,23 +121,12 @@ pub trait HasBoundingBox: Send + Sync {
fn bounding_box(&self) -> BoundingBox;
}
/// Any geometric object which can have an affine transformation applied to it
///
/// Used for moving, rotating or scaling primitives
/*pub trait Transform {
/// Create a new object by applying the transformation to this object.
fn transform(&self, transformation: &Affine3<f64>) -> Self;
}*/
/// A basic geometric primitive such as a sphere or a triangle
pub trait Primitive: Intersect + HasBoundingBox {
// / Create a new object by applying the transformation to this object.
//fn transform(&self, transformation: &Affine3) -> dyn Primitive;
fn transform(&self, transformation: &Affine3<f64>) -> Box<dyn Primitive>;
}
/// Either a primitive or a collection of primitives
pub trait Aggregate: Intersect + HasBoundingBox {}
#[cfg(test)]
mod tests {
use quickcheck_macros::quickcheck;

View File

@ -106,7 +106,11 @@ impl HasBoundingBox for Plane {
}
}
impl Primitive for Plane {}
impl Primitive for Plane {
fn transform(&self, transformation: &crate::math::Affine3<f64>) -> Box<dyn Primitive> {
todo!()
}
}
#[cfg(test)]
mod tests {

View File

@ -99,7 +99,11 @@ impl HasBoundingBox for Sphere {
}
}
impl Primitive for Sphere {}
impl Primitive for Sphere {
fn transform(&self, transformation: &crate::math::Affine3<f64>) -> Box<dyn Primitive> {
todo!()
}
}
#[cfg(test)]
mod tests {

View File

@ -103,7 +103,11 @@ impl HasBoundingBox for Triangle {
}
}
impl Primitive for Triangle {}
impl Primitive for Triangle {
fn transform(&self, transformation: &crate::math::Affine3<f64>) -> Box<dyn Primitive> {
todo!()
}
}
fn indices_with_index_of_largest_element_last(v: &Vec3<f64>) -> [usize; 3] {
#[allow(clippy::collapsible_else_if)]

View File

@ -1,4 +1,5 @@
use super::{Aggregate, BoundingBox, HasBoundingBox, Intersect, IntersectionInfo, Primitive, Ray};
use super::{BoundingBox, HasBoundingBox, Intersect, IntersectionInfo, Primitive, Ray};
use crate::math::Affine3;
impl HasBoundingBox for Vec<Box<dyn Primitive>> {
fn bounding_box(&self) -> BoundingBox {
@ -21,27 +22,8 @@ impl Intersect for Vec<Box<dyn Primitive>> {
}
}
impl Aggregate for Vec<Box<dyn Primitive>> {}
impl HasBoundingBox for Vec<Box<dyn Aggregate>> {
fn bounding_box(&self) -> BoundingBox {
self.iter().fold(BoundingBox::empty(), |acc, elem| {
acc.union(&elem.bounding_box())
})
impl Primitive for Vec<Box<dyn Primitive>> {
fn transform(&self, transformation: &Affine3<f64>) -> Box<dyn Primitive> {
todo!()
}
}
impl Intersect for Vec<Box<dyn Aggregate>> {
fn intersect(&self, ray: &Ray) -> Option<IntersectionInfo> {
self.iter()
.flat_map(|aggregate| aggregate.intersect(ray))
.min_by(
|a, b| match PartialOrd::partial_cmp(&a.distance, &b.distance) {
None => std::cmp::Ordering::Less,
Some(ordering) => ordering,
},
)
}
}
impl Aggregate for Vec<Box<dyn Aggregate>> {}

View File

@ -1,8 +1,8 @@
use crate::math::Vec3;
use crate::raycasting::Aggregate;
use crate::raycasting::Primitive;
pub struct Scene {
pub camera_location: Vec3<f64>,
pub objects: Vec<Box<dyn Aggregate>>,
pub objects: Vec<Box<dyn Primitive>>,
}