From 9bed13473300f307647f362c9b8453e88114304d Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 2 Jul 2010 18:38:11 +0000 Subject: [PATCH] sorting Extrude intersection results, still buggy intersect() though git-svn-id: svn://anubis/fart/trunk@274 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- scenes/extrudes.fart | 53 ++++++++++++++++++++++++++++++++++++++++++++ shapes/Extrude.cc | 39 +++++++++++++++++++++++--------- 2 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 scenes/extrudes.fart diff --git a/scenes/extrudes.fart b/scenes/extrudes.fart new file mode 100644 index 0000000..80106d4 --- /dev/null +++ b/scenes/extrudes.fart @@ -0,0 +1,53 @@ + +scene +{ + options + { + multisample 3 + exposure 1.2 + } + + camera + { + position <0, -10, 10> + look_at <0, 0, 1> + } + + light { position <10, -12, 8> } + + plane + { + position <0, 0, 1>, 0 + material + { + color <0, 0.5, 0.1> + } + } + + extrude + { + polygon + { + <3, 0> + <1, 1> + <2, 3> + <-1, 1> + <-3, 2> + <-2, -1> + <-3, -3> + <-1, -2> + <1, -4> + <2, -1> + } + offset 3 + material { color <1, 0.7, 0> } + translate <-2, 0, 0> + } + + extrude + { + ngon 5, 2 + offset 1 + translate <2, 0, 0> + } +} diff --git a/shapes/Extrude.cc b/shapes/Extrude.cc index 9d5eadc..2f9ef6d 100644 --- a/shapes/Extrude.cc +++ b/shapes/Extrude.cc @@ -2,6 +2,7 @@ #include #include +#include /* sort() */ #include "Extrude.h" #include "util/Polygon.h" @@ -15,6 +16,21 @@ Extrude::Extrude() { } +class IntersectListComparator +{ + public: + IntersectListComparator(Vector start) : m_start(start) {} + bool operator()(const Shape::Intersection & i1, + const Shape::Intersection & i2) const + { + double d1 = (i1.position - m_start).mag2(); + double d2 = (i2.position - m_start).mag2(); + return d1 < d2; + } + protected: + Vector m_start; +}; + Shape::IntersectionList Extrude::intersect(refptr _this, const Ray & ray) { Ray ray_inv = m_inverse.transform_ray(ray); @@ -54,19 +70,16 @@ Shape::IntersectionList Extrude::intersect(refptr _this, const Ray & ray) + c * ray_inv.getOrigin()[2] + d); Solver::Result solutions = solver.solve(); - if (solutions.numResults > 0) + if (solutions.numResults > 0 && solutions.results[0] > 0.0) { - if (solutions.results[0] > 0.0) + Vector ipoint = ray_inv[solutions.results[0]]; + Polygon quad; + quad.add(p1).add(p2).add(p3).add(p4); + if (quad.containsPoint(ipoint)) { - Vector ipoint = ray_inv[solutions.results[0]]; - Polygon quad; - quad.add(p1).add(p2).add(p3).add(p4); - if (quad.containsPoint(ipoint)) - { - res.add(Intersection(_this, - m_transform.transform_point(ipoint), - m_transform.transform_normal(normal))); - } + res.add(Intersection(_this, + m_transform.transform_point(ipoint), + m_transform.transform_normal(normal))); } } } @@ -77,6 +90,10 @@ Shape::IntersectionList Extrude::intersect(refptr _this, const Ray & ray) } } + vector m; + + sort(m.begin(), m.end(), IntersectListComparator(ray.getOrigin())); + return res; }