Fix default optics
* Prior cl caused an infinite loop with the defaults
* Removed linear approximation - it caused issues with
inverse distortion
Bug: 37443861
Test: Manually ran on a few phones
Test: Wrote a program that compared the distortion and
undistortion values with the old and new path
Change-Id: I7221679585dd7f0fe966ff11170e9d3ec74a51df
diff --git a/libs/vr/libeds/device_metrics.cpp b/libs/vr/libeds/device_metrics.cpp
index 50c3e54..ac22130 100644
--- a/libs/vr/libeds/device_metrics.cpp
+++ b/libs/vr/libeds/device_metrics.cpp
@@ -10,7 +10,6 @@
namespace {
-static constexpr char kRGBPolynomialOffset[] = "persist.dvr.rgb_poly_offset";
static constexpr char kRPolynomial[] = "persist.dvr.r_poly";
static constexpr char kGPolynomial[] = "persist.dvr.g_poly";
static constexpr char kBPolynomial[] = "persist.dvr.b_poly";
@@ -68,7 +67,9 @@
float GetDisplayGap() { return GetProperty(kDisplayGap, 0.0f); }
-float GetVEyeToDisplay() { return GetProperty(kVEyeToDisplay, 0.035f); }
+float GetTrayToLensDistance() { return 0.035f; }
+
+float GetVEyeToDisplay() { return GetProperty(kVEyeToDisplay, 0.042f); }
android::dvr::vec2 GetDisplaySize() {
static const std::vector<float> default_size = {0.0742177f, 0.131943f};
@@ -110,33 +111,23 @@
HeadMountMetrics CreateHeadMountMetrics(const FieldOfView& l_fov,
const FieldOfView& r_fov) {
static const std::vector<float> default_r = {
- -4.08519004f, 34.70282075f, -67.37781249f, 56.97304235f,
- -23.35768685f, 4.7199597f, 0.63198082f};
+ 0.00103f, 2.63917f, -7.14427f, 8.98036f, -4.10586f, 0.83705f, 0.00130f};
static const std::vector<float> default_g = {
- 4.43078318f, 3.47806617f, -20.58017398f, 20.85880414f,
- -8.4046504f, 1.61284685f, 0.8881761f};
+ 0.08944f, 2.26005f, -6.30924f, 7.94561f, -3.22788f, 0.45577f, 0.07300f};
static const std::vector<float> default_b = {
- 12.04141265f, -21.98112491f, 14.06758389f, -3.15245629f,
- 0.36549102f, 0.05252705f, 0.99844279f};
- static const std::vector<float> default_offsets = {
- 0.20971645238f, 0.15189450000f, 1.00096958278f};
-
- std::vector<float> poly_offsets =
- GetProperty(kRGBPolynomialOffset, default_offsets);
+ 0.16364f, 1.94083f, -5.55033f, 6.89578f, -2.19053f, -0.04050f, 0.17380f};
std::vector<float> poly_r = GetProperty(kRPolynomial, default_r);
std::vector<float> poly_g = GetProperty(kGPolynomial, default_g);
std::vector<float> poly_b = GetProperty(kBPolynomial, default_b);
- if (poly_offsets.size() != 3)
- poly_offsets = default_offsets;
std::shared_ptr<ColorChannelDistortion> distortion_r(
- new PolynomialRadialDistortion(poly_offsets[0], poly_r));
+ new PolynomialRadialDistortion(poly_r));
std::shared_ptr<ColorChannelDistortion> distortion_g(
- new PolynomialRadialDistortion(poly_offsets[1], poly_g));
+ new PolynomialRadialDistortion(poly_g));
std::shared_ptr<ColorChannelDistortion> distortion_b(
- new PolynomialRadialDistortion(poly_offsets[2], poly_b));
+ new PolynomialRadialDistortion(poly_b));
- return HeadMountMetrics(GetInterLensDistance(), GetVEyeToDisplay(),
+ return HeadMountMetrics(GetInterLensDistance(), GetTrayToLensDistance(),
GetVEyeToDisplay(), kDefaultVerticalAlignment, l_fov,
r_fov, distortion_r, distortion_g, distortion_b,
HeadMountMetrics::EyeOrientation::kCCW0Degrees,
diff --git a/libs/vr/libeds/include/private/dvr/polynomial_radial_distortion.h b/libs/vr/libeds/include/private/dvr/polynomial_radial_distortion.h
index c1f1ce9..8f080aa 100644
--- a/libs/vr/libeds/include/private/dvr/polynomial_radial_distortion.h
+++ b/libs/vr/libeds/include/private/dvr/polynomial_radial_distortion.h
@@ -28,8 +28,7 @@
// in the distortion equation: coefficients[0] is K1, coefficients[1] is K2,
// etc. Thus the polynomial used for distortion has degree
// (2 * coefficients.size()).
- explicit PolynomialRadialDistortion(float polynomial_offset,
- const std::vector<float>& coefficients);
+ explicit PolynomialRadialDistortion(const std::vector<float>& coefficients);
// Given a radius (measuring distance from the optical axis of the lens),
// returns the distortion factor for that radius.
@@ -52,10 +51,6 @@
const std::vector<float>& GetCoefficients() const;
private:
- // This is makes the polynomial work nicer with a specific lens that doesn't
- // fit nicely to a lower order polynomial. It's basically piecewise
- // line->poly.
- float polynomial_offset_;
std::vector<float> coefficients_;
};
diff --git a/libs/vr/libeds/polynomial_radial_distortion.cpp b/libs/vr/libeds/polynomial_radial_distortion.cpp
index a0c6ea3..fa01bb4 100644
--- a/libs/vr/libeds/polynomial_radial_distortion.cpp
+++ b/libs/vr/libeds/polynomial_radial_distortion.cpp
@@ -4,13 +4,10 @@
namespace dvr {
PolynomialRadialDistortion::PolynomialRadialDistortion(
- float polynomial_offset, const std::vector<float>& coefficients)
- : polynomial_offset_(polynomial_offset), coefficients_(coefficients) {}
+ const std::vector<float>& coefficients)
+ : coefficients_(coefficients) {}
float PolynomialRadialDistortion::DistortionFactor(float r_squared) const {
- if (r_squared < polynomial_offset_)
- return 1.0f;
-
float r_factor = 1.0f;
float distortion_factor = 1.0f;
diff --git a/libs/vr/libvrflinger/display_service.cpp b/libs/vr/libvrflinger/display_service.cpp
index 971345b..d3d50d0 100644
--- a/libs/vr/libvrflinger/display_service.cpp
+++ b/libs/vr/libvrflinger/display_service.cpp
@@ -209,16 +209,16 @@
// We should always have a red distortion.
LOG_FATAL_IF(view_params.distortion_coefficients_r.empty());
red_distortion = std::make_shared<PolynomialRadialDistortion>(
- 0.0f, view_params.distortion_coefficients_r);
+ view_params.distortion_coefficients_r);
if (!view_params.distortion_coefficients_g.empty()) {
green_distortion = std::make_shared<PolynomialRadialDistortion>(
- 0.0f, view_params.distortion_coefficients_g);
+ view_params.distortion_coefficients_g);
}
if (!view_params.distortion_coefficients_b.empty()) {
blue_distortion = std::make_shared<PolynomialRadialDistortion>(
- 0.0f, view_params.distortion_coefficients_b);
+ view_params.distortion_coefficients_b);
}
HeadMountMetrics::EyeOrientation left_orientation =