WIP: add Mesh, TriangleTexture, TriangleMaterial
This commit is contained in:
parent
e65a2a1f48
commit
0f6b81e40c
|
@ -13,6 +13,7 @@ use serde::Deserialize;
|
||||||
pub enum MaterialEnum {
|
pub enum MaterialEnum {
|
||||||
#[serde(rename = "uniform")]
|
#[serde(rename = "uniform")]
|
||||||
UniformMaterial,
|
UniformMaterial,
|
||||||
|
TriangleMaterial,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represent the physical light properties of an object in the scene;
|
/// Represent the physical light properties of an object in the scene;
|
||||||
|
@ -22,5 +23,8 @@ pub trait Material: std::fmt::Debug {
|
||||||
fn properties(&self, point: Point2D) -> LightProperties;
|
fn properties(&self, point: Point2D) -> LightProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod triangle;
|
||||||
|
pub use triangle::*;
|
||||||
|
|
||||||
mod uniform;
|
mod uniform;
|
||||||
pub use uniform::*;
|
pub use uniform::*;
|
||||||
|
|
31
pathtracer/src/material/triangle.rs
Normal file
31
pathtracer/src/material/triangle.rs
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
use super::Material;
|
||||||
|
use crate::core::{LightProperties, LinearColor, ReflTransEnum};
|
||||||
|
use crate::Point2D;
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
/// Represent a material which interpolates between three points.
|
||||||
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
|
pub struct TriangleMaterial {
|
||||||
|
/// The diffuse components.
|
||||||
|
diffuse: [LinearColor; 3],
|
||||||
|
/// The specular components.
|
||||||
|
specular: [LinearColor; 3],
|
||||||
|
/// The transparency or reflectivity properties, this is not interpolated.
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub refl_trans: Option<ReflTransEnum>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Material for TriangleMaterial {
|
||||||
|
fn properties(&self, point: Point2D) -> LightProperties {
|
||||||
|
let (u, v) = (point.x, point.y);
|
||||||
|
let diffuse = self.diffuse[0].clone() * (1. - u - v)
|
||||||
|
+ self.diffuse[1].clone() * u
|
||||||
|
+ self.diffuse[2].clone() * v;
|
||||||
|
let specular = self.specular[0].clone() * (1. - u - v)
|
||||||
|
+ self.specular[1].clone() * u
|
||||||
|
+ self.specular[2].clone() * v;
|
||||||
|
LightProperties::new(diffuse, specular, self.refl_trans.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: tests
|
8
pathtracer/src/render/mesh.rs
Normal file
8
pathtracer/src/render/mesh.rs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
use super::Object;
|
||||||
|
|
||||||
|
/// Represent a mesh of objects.
|
||||||
|
pub struct Mesh {
|
||||||
|
/// The shapes composing the mesh
|
||||||
|
#[allow(unused)] // FIXME: remove when used
|
||||||
|
shapes: Vec<Object>,
|
||||||
|
}
|
|
@ -3,6 +3,9 @@
|
||||||
pub mod light_aggregate;
|
pub mod light_aggregate;
|
||||||
pub use light_aggregate::*;
|
pub use light_aggregate::*;
|
||||||
|
|
||||||
|
mod mesh;
|
||||||
|
pub use mesh::*;
|
||||||
|
|
||||||
pub mod object;
|
pub mod object;
|
||||||
pub use object::*;
|
pub use object::*;
|
||||||
|
|
||||||
|
|
9
pathtracer/src/shape/mesh.rs
Normal file
9
pathtracer/src/shape/mesh.rs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
use super::{InterpolatedTriangle, Shape, Triangle};
|
||||||
|
use crate::material::{Material, TriangleMaterial, UniformMaterial};
|
||||||
|
use crate::texture::{Texture, TriangleTexture, UniformTexture};
|
||||||
|
use crate::Point;
|
||||||
|
use beevee::{
|
||||||
|
aabb::{Bounded, AABB},
|
||||||
|
bvh::Intersected,
|
||||||
|
ray::Ray,
|
||||||
|
};
|
|
@ -13,6 +13,7 @@ use serde::Deserialize;
|
||||||
pub enum TextureEnum {
|
pub enum TextureEnum {
|
||||||
#[serde(rename = "uniform")]
|
#[serde(rename = "uniform")]
|
||||||
UniformTexture,
|
UniformTexture,
|
||||||
|
TriangleTexture,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represent an object's texture.
|
/// Represent an object's texture.
|
||||||
|
@ -22,5 +23,8 @@ pub trait Texture: std::fmt::Debug {
|
||||||
fn texel_color(&self, point: Point2D) -> LinearColor;
|
fn texel_color(&self, point: Point2D) -> LinearColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod triangle;
|
||||||
|
pub use triangle::*;
|
||||||
|
|
||||||
mod uniform;
|
mod uniform;
|
||||||
pub use uniform::*;
|
pub use uniform::*;
|
||||||
|
|
23
pathtracer/src/texture/triangle.rs
Normal file
23
pathtracer/src/texture/triangle.rs
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
use super::{uniform::UniformTexture, Texture};
|
||||||
|
use crate::core::LinearColor;
|
||||||
|
use crate::Point2D;
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
/// Represent a texture which interpolates between three points.
|
||||||
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
|
pub struct TriangleTexture {
|
||||||
|
/// The texture at each point
|
||||||
|
textures: [UniformTexture; 3],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Texture for TriangleTexture {
|
||||||
|
fn texel_color(&self, point: Point2D) -> LinearColor {
|
||||||
|
let (u, v) = (point.x, point.y);
|
||||||
|
let sum = self.textures[0].texel_color(point) * (1. - u - v)
|
||||||
|
+ self.textures[1].texel_color(point) * u
|
||||||
|
+ self.textures[2].texel_color(point) * v;
|
||||||
|
sum / 3.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: tests
|
Loading…
Reference in a new issue