diff --git a/sprout/darkroom/intersects/intersection.hpp b/sprout/darkroom/intersects/intersection.hpp index 6e420303..0335aa89 100644 --- a/sprout/darkroom/intersects/intersection.hpp +++ b/sprout/darkroom/intersects/intersection.hpp @@ -114,7 +114,7 @@ namespace sprout { // template inline SPROUT_CONSTEXPR sprout::tuples::tuple - make_material_image(Elements const&... elems) { + make_intersection(Elements const&... elems) { return sprout::tuples::make_tuple(elems...); } } // namespace intersects diff --git a/sprout/darkroom/objects/aa_plane.hpp b/sprout/darkroom/objects/aa_plane.hpp index 8709aee3..290da553 100644 --- a/sprout/darkroom/objects/aa_plane.hpp +++ b/sprout/darkroom/objects/aa_plane.hpp @@ -32,6 +32,18 @@ namespace sprout { }; }; // + // aa_plane_face + // + struct aa_plane_face { + public: + enum values { + both, + negative, + positive, + same_as_direction + }; + }; + // // basic_aa_plane // template @@ -41,6 +53,7 @@ namespace sprout { typedef Position position_type; typedef typename sprout::darkroom::access::unit::type unit_type; typedef sprout::darkroom::objects::aa_plane_direction aa_plane_direction; + typedef sprout::darkroom::objects::aa_plane_face aa_plane_face; public: template struct intersection { @@ -53,13 +66,15 @@ namespace sprout { std::declval(), std::declval(), std::declval() - )) + )), + bool > type; }; private: aa_plane_direction::values direction_value_; unit_type val_; material_type mat_; + aa_plane_face::values face_; private: SPROUT_CONSTEXPR bool is_x() const { @@ -75,7 +90,7 @@ namespace sprout { } template SPROUT_CONSTEXPR typename intersection::type - intersect_5(int hit_side, bool does_intersect, unit_type distance, position_type const& point_of_intersection) const { + intersect_5(int hit_side, bool is_from_inside, bool does_intersect, unit_type distance, position_type const& point_of_intersection) const { return typename intersection::type( does_intersect, distance, @@ -99,13 +114,16 @@ namespace sprout { sprout::darkroom::coords::x(point_of_intersection), sprout::darkroom::coords::y(point_of_intersection) ) + , + is_from_inside ); } template SPROUT_CONSTEXPR typename intersection::type - intersect_4(Ray const& ray, int hit_side, bool does_intersect, unit_type distance) const { + intersect_4(Ray const& ray, int hit_side, bool is_from_inside, bool does_intersect, unit_type distance) const { return intersect_5( hit_side, + is_from_inside, does_intersect, distance, does_intersect @@ -115,10 +133,11 @@ namespace sprout { } template SPROUT_CONSTEXPR typename intersection::type - intersect_3(Ray const& ray, unit_type pos_v, unit_type dir_v, int hit_side, bool does_intersect) const { + intersect_3(Ray const& ray, unit_type pos_v, unit_type dir_v, int hit_side, bool is_from_inside, bool does_intersect) const { return intersect_4( ray, hit_side, + is_from_inside, does_intersect, does_intersect ? (pos_v - val_) / -dir_v @@ -127,12 +146,13 @@ namespace sprout { } template SPROUT_CONSTEXPR typename intersection::type - intersect_2(Ray const& ray, unit_type pos_v, unit_type dir_v, int hit_side) const { + intersect_2(Ray const& ray, unit_type pos_v, unit_type dir_v, int hit_side, bool is_from_inside) const { return intersect_3( ray, pos_v, dir_v, hit_side, + is_from_inside, (hit_side > 0 && dir_v < 0) || (hit_side < 0 && dir_v > 0) ); } @@ -143,14 +163,19 @@ namespace sprout { ray, pos_v, dir_v, - pos_v > val_ ? 1 : -1 + pos_v > val_ ? 1 : -1, + face_ == aa_plane_face::both ? false + : face_ == aa_plane_face::negative ? dir_v > 0 + : face_ == aa_plane_face::positive ? dir_v < 0 + : (val_ > 0 && dir_v < 0) || (val_ < 0 && dir_v > 0) ); } public: - SPROUT_CONSTEXPR basic_aa_plane(aa_plane_direction::values direction_value, unit_type val, material_type const& mat) + SPROUT_CONSTEXPR basic_aa_plane(aa_plane_direction::values direction_value, unit_type val, material_type const& mat, aa_plane_face::values face = aa_plane_face::both) : direction_value_(direction_value) , val_(val) , mat_(mat) + , face_(face) {} template SPROUT_CONSTEXPR typename intersection::type @@ -173,8 +198,14 @@ namespace sprout { // template inline SPROUT_CONSTEXPR sprout::darkroom::objects::basic_aa_plane - make_aa_plane(sprout::darkroom::objects::aa_plane_direction::values dir_val, Unit const& val, Material const& mat) { - return sprout::darkroom::objects::basic_aa_plane(dir_val, val, mat); + make_aa_plane( + sprout::darkroom::objects::aa_plane_direction::values dir_val, + Unit const& val, + Material const& mat, + sprout::darkroom::objects::aa_plane_face::values face_val = sprout::darkroom::objects::aa_plane_face::both + ) + { + return sprout::darkroom::objects::basic_aa_plane(dir_val, val, mat, face_val); } } // namespace objects } // namespace darkroom diff --git a/sprout/darkroom/objects/polygon/triangle.hpp b/sprout/darkroom/objects/polygon/triangle.hpp index 0d74fe55..cf086087 100644 --- a/sprout/darkroom/objects/polygon/triangle.hpp +++ b/sprout/darkroom/objects/polygon/triangle.hpp @@ -43,7 +43,8 @@ namespace sprout { std::declval(), std::declval(), std::declval() - )) + )), + bool > type; }; private: @@ -72,7 +73,8 @@ namespace sprout { : position_type(0, 0, 0) , normal_,//hit_side > 0 ? normal_ : sprout::darkroom::coords::negate(normal_), - sprout::darkroom::materials::calculate_material(mat_, unit_type(0), unit_type(0)) // ??? + sprout::darkroom::materials::calculate_material(mat_, unit_type(0), unit_type(0)), // ??? + false // !!! is_from_inside ); } template diff --git a/sprout/darkroom/objects/sphere.hpp b/sprout/darkroom/objects/sphere.hpp index ef4875f9..5e3e18d1 100644 --- a/sprout/darkroom/objects/sphere.hpp +++ b/sprout/darkroom/objects/sphere.hpp @@ -46,15 +46,17 @@ namespace sprout { std::declval(), std::declval(), std::declval() - )) + )), + bool > type; }; private: - typedef sprout::tuples::tuple zwo_type; + typedef sprout::tuples::tuple zwo_type; typedef sprout::tuples::tuple drei_type; struct zw { - SPROUT_STATIC_CONSTEXPR std::size_t does_intersect = 0; - SPROUT_STATIC_CONSTEXPR std::size_t distance = 1; + SPROUT_STATIC_CONSTEXPR std::size_t hit_side = 0; + SPROUT_STATIC_CONSTEXPR std::size_t does_intersect = 1; + SPROUT_STATIC_CONSTEXPR std::size_t distance = 2; }; struct dr { SPROUT_STATIC_CONSTEXPR std::size_t point_of_intersection = 0; @@ -68,6 +70,10 @@ namespace sprout { SPROUT_STATIC_CONSTEXPR zwo_type zweitens_1(unit_type const& i1, unit_type const& i2) { return zwo_type( + i2 > 0 + ? i1 < 0 ? -1 : 1 + : 0 + , i2 > 0, i2 > 0 ? i1 < 0 ? i2 : i1 @@ -78,7 +84,7 @@ namespace sprout { zweitens(bool neg, unit_type const& b, unit_type const& det) { return neg ? zweitens_1(b - det, b + det) - : zwo_type(false, -1) + : zwo_type(0, false, -1) ; } template @@ -104,7 +110,7 @@ namespace sprout { } template SPROUT_CONSTEXPR typename intersection::type - intersect_6(zwo_type const& zwo, drei_type const& drei, Vec const& normal) const { + intersect_6(Ray const& ray, zwo_type const& zwo, drei_type const& drei, Vec const& normal) const { return typename intersection::type( sprout::tuples::get(zwo), sprout::tuples::get(zwo), @@ -126,13 +132,15 @@ namespace sprout { ) ) / sprout::math::half_pi() - ) + ), + sprout::darkroom::coords::dot(normal, sprout::darkroom::rays::direction(ray)) > 0 ); } template SPROUT_CONSTEXPR typename intersection::type - intersect_5(zwo_type const& zwo, drei_type const& drei) const { - return intersect_6( + intersect_5(Ray const& ray, zwo_type const& zwo, drei_type const& drei) const { + return intersect_6( + ray, zwo, drei, sprout::tuples::get(drei) @@ -141,7 +149,8 @@ namespace sprout { template SPROUT_CONSTEXPR typename intersection::type intersect_4(Ray const& ray, zwo_type const& zwo) const { - return intersect_5( + return intersect_5( + ray, zwo, drittens( ray,