Example #1
0
template<class RNG>std::pair<unsigned,SSE::Point3> Tetra<RNG>::position(RNG& rng) const
{
    std::array<float,3> p;

    // TODO: SSEify the items below? Fold into RNG to parallelize?

    std::array<float,3> rnd{{ *rng.floatU01(), *rng.floatU01(), *rng.floatU01() }};
    if (rnd[0]+rnd[1] > 1.0)
    {
        rnd[0] = 1.0-rnd[0];
        rnd[1] = 1.0-rnd[1];
    }

    if (rnd[0]+rnd[1]+rnd[2] > 1.0)
    {
        if(rnd[1]+rnd[2] < 1.0)
        {
            p[0] = 1-rnd[1]-rnd[2];
            p[1] = rnd[1];
            p[2] = rnd[0]+rnd[1]+rnd[2] - 1;
        }
        else {
            p[0] = rnd[0];
            p[1] = 1-rnd[2];
            p[2] = 1-rnd[0]-rnd[1];
        }
    }
    else {
        p[0]=rnd[0];
        p[1]=rnd[1];
        p[2]=rnd[2];
    }

    assert(p[0] >= 0.0 && p[1] >= 0.0 && p[2] >= 0.0 && p[0]+p[1]+p[2] <= 1.0);

    // TODO: Better matrix multiply code?
    return std::make_pair(m_IDt,m_origin + m_matrix[0]*SSE::Scalar(p[0]) + m_matrix[1]*SSE::Scalar(p[1]) + m_matrix[2]*SSE::Scalar(p[2]));
}