void camera::view_all(aabb const& box, vec3 const& up) { float diagonal = length(box.size()); float r = diagonal * 0.5f; vec3 eye = box.center() + vec3(0, 0, r + r / std::atan(fovy_)); look_at(eye, box.center(), up); }
aap::aap(const aabb &total) { VEC3F center = total.center(); char xyz = 2; if (total.width() >= total.height() && total.width() >= total.depth()) { xyz = 0; } else if (total.height() >= total.width() && total.height() >= total.depth()) { xyz = 1; } this->xyz = xyz; this->p = center[xyz]; }
void calcDepthRange(mat4 const& pr, mat4 const& mv, aabb const& bbox, float& minval, float& maxval) { vec3 center = vec4( mv * vec4(bbox.center(), 1.0f) ).xyz(); vec3 min = vec4( mv * vec4(bbox.min, 1.0f) ).xyz(); vec3 max = vec4( mv * vec4(bbox.max, 1.0f) ).xyz(); float radius = length(max - min) * 0.5f; // Depth buffer of ibrPlanes vec3 scal(center); scal = normalize(scal) * radius; min = center - scal; max = center + scal; vec4 min4 = pr * vec4(min, 1.f); vec4 max4 = pr * vec4(max, 1.f); min = min4.xyz() / min4.w; max = max4.xyz() / max4.w; minval = (min.z+1.f) * 0.5f; maxval = (max.z+1.f) * 0.5f; }