Skip to content

Commit

Permalink
Auto merge of #223 - mephisto41:backface-visible, r=kvark
Browse files Browse the repository at this point in the history
Add is_backface_visible.

We need this utility function for servo/webrender#1419

r? @kvark

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/euclid/223)
<!-- Reviewable:end -->
  • Loading branch information
bors-servo authored Aug 24, 2017
2 parents 11bdb0b + 6617f20 commit e1ab971
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "euclid"
version = "0.15.1"
version = "0.15.2"
authors = ["The Servo Project Developers"]
description = "Geometry primitives"
documentation = "https://docs.rs/euclid/"
Expand Down
33 changes: 32 additions & 1 deletion src/transform3d.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,18 @@ where T: Copy + Clone +
)
}

/// Check whether shapes on the XY plane with Z pointing towards the
/// screen transformed by this matrix would be facing back.
pub fn is_backface_visible(&self) -> bool {
// inverse().m33 < 0;
let det = self.determinant();
let m33 = self.m12 * self.m24 * self.m41 - self.m14 * self.m22 * self.m41 +
self.m14 * self.m21 * self.m42 - self.m11 * self.m24 * self.m42 -
self.m12 * self.m21 * self.m44 + self.m11 * self.m22 * self.m44;
let _0: T = Zero::zero();
(m33 * det) < _0
}

pub fn approx_eq(&self, other: &Self) -> bool {
self.m11.approx_eq(&other.m11) && self.m12.approx_eq(&other.m12) &&
self.m13.approx_eq(&other.m13) && self.m14.approx_eq(&other.m14) &&
Expand Down Expand Up @@ -661,7 +673,7 @@ mod tests {
use Radians;
use super::*;

use std::f32::consts::FRAC_PI_2;
use std::f32::consts::{FRAC_PI_2, PI};

type Mf32 = Transform3D<f32>;

Expand Down Expand Up @@ -885,4 +897,23 @@ mod tests {
assert_eq!(v2, m.transform_vector2d(&v2));
assert!(v2.to_point() != m.transform_point2d(&v2.to_point()));
}

#[test]
pub fn test_is_backface_visible() {
// backface is not visible for rotate-x 0 degree.
let r1 = Mf32::create_rotation(1.0, 0.0, 0.0, rad(0.0));
assert!(!r1.is_backface_visible());
// backface is not visible for rotate-x 45 degree.
let r1 = Mf32::create_rotation(1.0, 0.0, 0.0, rad(PI * 0.25));
assert!(!r1.is_backface_visible());
// backface is visible for rotate-x 180 degree.
let r1 = Mf32::create_rotation(1.0, 0.0, 0.0, rad(PI));
assert!(r1.is_backface_visible());
// backface is visible for rotate-x 225 degree.
let r1 = Mf32::create_rotation(1.0, 0.0, 0.0, rad(PI * 1.25));
assert!(r1.is_backface_visible());
// backface is not visible for non-inverseable matrix
let r1 = Mf32::create_scale(2.0, 0.0, 2.0);
assert!(!r1.is_backface_visible());
}
}

0 comments on commit e1ab971

Please sign in to comment.