blob: 08765840e5933303d81f7d0c11ba70a20fcce1ef [file] [log] [blame]
#ifndef RTTL_INTERVAL_ARITH_HXX
#define RTTL_INTERVAL_ARITH_HXX
#include "RTVec.hxx"
namespace RTTL {
class RTIntervalVec {
public:
sse_f m_min;
sse_f m_max;
RTIntervalVec() {}
RTIntervalVec(const sse_f& _min, const sse_f& _max)
{
m_min = _min;
m_max = _max;
}
_INLINE RTIntervalVec &operator=(const RTIntervalVec &v)
{
m_min = v.m_min;
m_max = v.m_max;
return *this;
};
_INLINE bool empty() const
{
return minHorizontal3f(m_min) > maxHorizontal3f(m_max);
}
};
_INLINE RTIntervalVec inverse(const RTIntervalVec &v)
{
const sse_f m_min = rcp(v.m_min);
const sse_f m_max = rcp(v.m_min);
return RTIntervalVec(m_min,m_max);
}
_INLINE RTIntervalVec operator+(const RTIntervalVec &a,const RTIntervalVec &b)
{
return RTIntervalVec(a.m_min+b.m_min,a.m_max+b.m_max);
}
_INLINE RTIntervalVec operator-(const RTIntervalVec &a,const RTIntervalVec &b)
{
return RTIntervalVec(a.m_min+b.m_max,a.m_max+b.m_min);
}
_INLINE RTIntervalVec operator*(const RTIntervalVec &a,const RTIntervalVec &b)
{
const sse_f t0 = a.m_min * b.m_min;
const sse_f t1 = a.m_min * b.m_max;
const sse_f t2 = a.m_max * b.m_min;
const sse_f t3 = a.m_max * b.m_max;
return RTIntervalVec(min(min(t0,t1),min(t2,t3)),max(max(t0,t1),max(t2,t3)));
}
};
#endif