shared_ptr<Surfel> RayTracer::castRay(const Ray& ray,float maxDistance,bool anyHit) const {

    // Distance from P to X
    float distance(maxDistance);
    shared_ptr<Surfel> surfel;

    if (m_settings.useTree) {
        // Treat the triTree as a tree
        surfel = m_triTree.intersectRay(ray, distance, anyHit);
    } else {

        // Treat the triTree as an array
        Tri::Intersector intersector;
        for (int t = 0; t < m_triTree.size(); ++t) {
            const Tri& tri = m_triTree[t];
            intersector(ray, m_triTree.cpuVertexArray(), tri,
            anyHit, distance);
        }

        surfel = intersector.surfel();

    }

    return surfel;
}
Ejemplo n.º 2
0
shared_ptr<Surfel> RayTracer::castRay(const Point3& X, const Vector3& w, float& distance, bool anyHit) const {
    // Distance from P to X
    shared_ptr<Surfel> surfel;

    const Ray ray(X, w);
    if (m_settings.useTree) {

        // Treat the triTree as a tree
        surfel = m_triTree.intersectRay(ray, distance, anyHit);
//    if(!isNull(surfel)) {
//      if(surfel->material->name() == "mirror") {
//      }
//    }

    } else {

        // Treat the triTree as an array
        Tri::Intersector intersector;
        for (int t = 0; t < m_triTree.size(); ++t) {
            const Tri& tri = m_triTree[t];
            intersector(ray, m_triTree.cpuVertexArray(), tri, anyHit, distance);
        }

        surfel = intersector.surfel();
    }

    return surfel;
}