Fix bugs for pbrt bilinear patch

This commit is contained in:
hal8174 2025-08-27 19:06:47 +02:00
parent bb2089477e
commit 0480e041cd
Signed by: hal8174
SSH key fingerprint: SHA256:NN98ZYwnrreQLSOV/g+amY7C3yL/mS1heD7bi5t6PPw
6 changed files with 85 additions and 33 deletions

View file

@ -224,6 +224,23 @@ impl AffineTransform {
+ self.mat[2][3],
)
}
pub fn inverse_transform_pos(&self, pos: Pos3) -> Pos3 {
Pos3::new(
self.inv[0][0] * pos.x()
+ self.inv[0][1] * pos.y()
+ self.inv[0][2] * pos.z()
+ self.inv[0][3],
self.inv[1][0] * pos.x()
+ self.inv[1][1] * pos.y()
+ self.inv[1][2] * pos.z()
+ self.inv[1][3],
self.inv[2][0] * pos.x()
+ self.inv[2][1] * pos.y()
+ self.inv[2][2] * pos.z()
+ self.inv[2][3],
)
}
pub fn transform_dir(&self, dir: Dir3) -> Dir3 {
Dir3::new(
self.mat[0][0] * dir.x() + self.mat[0][1] * dir.y() + self.mat[0][2] * dir.z(),
@ -231,13 +248,27 @@ impl AffineTransform {
self.mat[2][0] * dir.x() + self.mat[2][1] * dir.y() + self.mat[2][2] * dir.z(),
)
}
pub fn transform_normal(&self, pos: Pos3) -> Pos3 {
Pos3::new(
pub fn inverse_transform_dir(&self, dir: Dir3) -> Dir3 {
Dir3::new(
self.inv[0][0] * dir.x() + self.inv[0][1] * dir.y() + self.inv[0][2] * dir.z(),
self.inv[1][0] * dir.x() + self.inv[1][1] * dir.y() + self.inv[1][2] * dir.z(),
self.inv[2][0] * dir.x() + self.inv[2][1] * dir.y() + self.inv[2][2] * dir.z(),
)
}
pub fn transform_normal(&self, pos: Dir3) -> Dir3 {
Dir3::new(
self.inv[0][0] * pos.x() + self.inv[0][1] * pos.y() + self.inv[0][2] * pos.z(),
self.inv[1][0] * pos.x() + self.inv[1][1] * pos.y() + self.inv[1][2] * pos.z(),
self.inv[2][0] * pos.x() + self.inv[2][1] * pos.y() + self.inv[2][2] * pos.z(),
)
}
pub fn inverse_transform_normal(&self, pos: Dir3) -> Dir3 {
Dir3::new(
self.mat[0][0] * pos.x() + self.mat[0][1] * pos.y() + self.mat[0][2] * pos.z(),
self.mat[1][0] * pos.x() + self.mat[1][1] * pos.y() + self.mat[1][2] * pos.z(),
self.mat[2][0] * pos.x() + self.mat[2][1] * pos.y() + self.mat[2][2] * pos.z(),
)
}
pub fn transform_ray(&self, ray: Ray) -> Ray {
Ray::new(
@ -302,7 +333,7 @@ impl Mul<AffineTransform> for AffineTransform {
self.mat[2][0] * rhs.mat[0][2]
+ self.mat[2][1] * rhs.mat[1][2]
+ self.mat[2][2] * rhs.mat[2][2]
+ self.mat[2][3] * rhs.mat[3][3],
+ self.mat[2][3] * rhs.mat[3][2],
self.mat[2][0] * rhs.mat[0][3]
+ self.mat[2][1] * rhs.mat[1][3]
+ self.mat[2][2] * rhs.mat[2][3]
@ -376,7 +407,7 @@ impl Mul<AffineTransform> for AffineTransform {
rhs.inv[2][0] * self.inv[0][2]
+ rhs.inv[2][1] * self.inv[1][2]
+ rhs.inv[2][2] * self.inv[2][2]
+ rhs.inv[2][3] * self.inv[3][3],
+ rhs.inv[2][3] * self.inv[3][2],
rhs.inv[2][0] * self.inv[0][3]
+ rhs.inv[2][1] * self.inv[1][3]
+ rhs.inv[2][2] * self.inv[2][3]