int Triangle::intersectBBox(const BBox &box) const { if (box.vertexInside(v[id1]) || box.vertexInside(v[id2]) || box.vertexInside(v[id3])) { return 1; } if (box.triangleOutsideSlash(v[id1], v[id2], v[id3])) { return -1; } // edge test. vec3 e1 = v[id2] - v[id1]; float t1 = length(e1); vec3 d1 = normalize(e1); Intersection ret = box.intersect(Ray(v[id1], d1, CONST_NEAR, CONST_FAR)); if (ret.t < t1) { return 1; } vec3 e2 = v[id3] - v[id1]; float t2 = length(e2); vec3 d2 = normalize(e2); ret = box.intersect(Ray(v[id1], d2, CONST_NEAR, CONST_FAR)); if (ret.t < t2) { return 1; } vec3 e3 = v[id3] - v[id2]; float t3 = length(e3); vec3 d3 = normalize(e3); ret = box.intersect(Ray(v[id2], d3, CONST_NEAR, CONST_FAR)); if (ret.t < t3) { return 1; } vector<Ray> diags = box.getDiagonals(); for (const auto &diag : diags) { ret = intersect(diag); if (ret.t < CONST_FAR) { return 1; } } return -1; }