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])); }