diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CGALEvaluator.cc | 11 | ||||
-rw-r--r-- | src/linalg.cc | 21 | ||||
-rw-r--r-- | src/linalg.h | 3 |
3 files changed, 34 insertions, 1 deletions
diff --git a/src/CGALEvaluator.cc b/src/CGALEvaluator.cc index ee04e05..c84d21f 100644 --- a/src/CGALEvaluator.cc +++ b/src/CGALEvaluator.cc @@ -241,6 +241,15 @@ Response CGALEvaluator::visit(State &state, const TransformNode &node) // First union all children N = applyToChildren(node, CGE_UNION); + if ( matrix_contains_infinity( node.matrix ) ) { + PRINT("Warning: Transformation matrix contains Infinity - removing object."); + N.reset(); + } + if ( matrix_contains_nan( node.matrix ) ) { + PRINT("Warning: Transformation matrix contains Not-a-Number - removing object"); + N.reset(); + } + // Then apply transform // If there is no geometry under the transform, N will be empty and of dim 0, // just just silently ignore such nodes @@ -248,7 +257,7 @@ Response CGALEvaluator::visit(State &state, const TransformNode &node) // Unfortunately CGAL provides no transform method for CGAL_Nef_polyhedron2 // objects. So we convert in to our internal 2d data format, transform it, // tesselate it and create a new CGAL_Nef_polyhedron2 from it.. What a hack! - + Eigen::Matrix2f testmat; testmat << node.matrix(0,0), node.matrix(0,1), node.matrix(1,0), node.matrix(1,1); if (testmat.determinant() == 0) { diff --git a/src/linalg.cc b/src/linalg.cc index 30f23af..b0ea2b4 100644 --- a/src/linalg.cc +++ b/src/linalg.cc @@ -1,4 +1,5 @@ #include "linalg.h" +#include <boost/math/special_functions/fpclassify.hpp> // FIXME: We can achieve better pruning by either: // o Recalculate the box based on the transformed object @@ -25,3 +26,23 @@ BoundingBox operator*(const Transform3d &m, const BoundingBox &box) return newbox; } +bool matrix_contains_infinity( const Eigen::Transform3d &m ) +{ + for (int i=0;i<m.matrix().rows();i++) { + for (int j=0;j<m.matrix().cols();j++) { + if ((boost::math::isinf)(m(i,j))) return true; + } + } + return false; +} + +bool matrix_contains_nan( const Eigen::Transform3d &m ) +{ + for (int i=0;i<m.matrix().rows();i++) { + for (int j=0;j<m.matrix().cols();j++) { + if ((boost::math::isnan)(m(i,j))) return true; + } + } + return false; +} + diff --git a/src/linalg.h b/src/linalg.h index 65243dc..baff7f1 100644 --- a/src/linalg.h +++ b/src/linalg.h @@ -14,6 +14,9 @@ using Eigen::Matrix3d; using Eigen::Matrix4d; using Eigen::Transform3d; +bool matrix_contains_infinity( const Eigen::Transform3d &m ); +bool matrix_contains_nan( const Eigen::Transform3d &m ); + BoundingBox operator*(const Transform3d &m, const BoundingBox &box); class Color4f : public Eigen::Vector4f |