namespace Msp {
namespace Geometry {
-/**
-Joins component shapes together into one.
-*/
template<typename T, unsigned D>
struct UnionOps
{
- static HyperBox<T, D> combine_aabb(const HyperBox<T, D> &, const HyperBox<T, D> &);
- static bool init_inside() { return false; }
- static bool combine_inside(bool a, bool b) { return a || b; }
- static bool is_inside_decided(bool a) { return a; }
- static bool init_surface() { return true; }
- static bool combine_surface(bool a, bool b) { return a && !b; }
+ static BoundingBox<T, D> combine_aabb(const BoundingBox<T, D> &a, const BoundingBox<T, D> &b) { return a|b; }
+ static Coverage combine_coverage(Coverage a, Coverage b) { return std::max(a, b); }
+ static bool shortcircuit(bool c) { return c; }
};
+/**
+Joins component shapes together into one.
+*/
template<typename T, unsigned D>
class Union: public CompositeShape<T, D, UnionOps<T, D> >
{
return new Union<T, D>(*this);
}
-
-template<typename T, unsigned D>
-inline HyperBox<T, D> UnionOps<T, D>::combine_aabb(const HyperBox<T, D> &box1, const HyperBox<T, D> &box2)
-{
- LinAl::Vector<T, D> dimensions;
- for(unsigned i=0; i<D; ++i)
- dimensions[i] = std::max(box1.get_dimension(i), box2.get_dimension(i));
- return HyperBox<T, D>(dimensions);
-}
-
} // namespace Geometry
} // namespace Msp