OSL::Matrix44 ShadingPoint::OSLObjectTransformInfo::get_transform(float t) const { const Transformd assembly_xform = m_assembly_instance_transform->evaluate(t); const Transformd::MatrixType m( m_object_instance_transform->get_local_to_parent() * assembly_xform.get_local_to_parent()); return Matrix4f(transpose(m)); }
double get_autofocus_focal_distance(const Intersector& intersector) const { // The autofocus considers the scene at the middle of the shutter interval. const float time = get_shutter_middle_time(); const Transformd transform = m_transform_sequence.evaluate(time); // Create a ray that goes through the center of the lens. ShadingRay ray; ray.m_org = transform.get_local_to_parent().extract_translation(); ray.m_dir = normalize(transform.vector_to_parent(-ndc_to_camera(m_autofocus_target))); ray.m_tmin = 0.0; ray.m_tmax = numeric_limits<double>::max(); ray.m_time = ShadingRay::Time::create_with_normalized_time( 0.5f, get_shutter_open_time(), get_shutter_close_time()); ray.m_flags = VisibilityFlags::ProbeRay; ray.m_depth = 0; // Trace the ray. ShadingPoint shading_point; intersector.trace(ray, shading_point); if (shading_point.hit()) { // Hit: compute the focal distance. const Vector3d v = shading_point.get_point() - ray.m_org; const double af_focal_distance = -transform.vector_to_local(v).z; RENDERER_LOG_INFO( "camera \"%s\": autofocus sets focal distance to %f (using camera position at time=%.1f).", get_path().c_str(), af_focal_distance, ray.m_time.m_absolute); return af_focal_distance; } else { // Miss: focus at infinity. RENDERER_LOG_INFO( "camera \"%s\": autofocus sets focal distance to infinity (using camera position at time=%.1f).", get_path().c_str(), ray.m_time.m_absolute); return 1.0e38; } }