41 inline static Viewport
42 computeViewport(uint8_t eye,
43 display_schema_1::DisplayDescriptor &descriptor) {
47 switch (descriptor.getDisplayMode()) {
48 case display_schema_1::DisplayDescriptor::FULL_SCREEN:
49 viewport.bottom = viewport.left = 0;
50 viewport.width = descriptor.getDisplayWidth();
51 viewport.height = descriptor.getDisplayHeight();
53 case display_schema_1::DisplayDescriptor::HORIZONTAL_SIDE_BY_SIDE:
55 viewport.height = descriptor.getDisplayHeight();
56 viewport.width = descriptor.getDisplayWidth() / 2;
58 viewport.left = eye * viewport.width;
60 case display_schema_1::DisplayDescriptor::VERTICAL_SIDE_BY_SIDE:
62 viewport.width = descriptor.getDisplayWidth();
63 viewport.height = descriptor.getDisplayHeight() / 2;
66 viewport.bottom = viewport.height;
72 throw std::logic_error(
"Unrecognized enum value for display mode");
78 inline static util::Rectd
79 computeRect(display_schema_1::DisplayDescriptor &descriptor) {
81 descriptor.getVerticalFOV());
84 static const char HEAD_PATH[] =
"/me/head";
91 cfg->m_viewers.container().emplace_back(
Viewer(ctx, HEAD_PATH));
92 auto &viewer = cfg->m_viewers.container().front();
93 auto eyesDesc = desc.getEyes();
96 std::vector<uint8_t> eyeIndices;
97 Eigen::Vector3d offset;
98 if (eyesDesc.size() == 2) {
100 offset = desc.getIPDMeters() / 2. * Eigen::Vector3d::UnitX();
105 offset = Eigen::Vector3d::Zero();
110 boost::optional<OSVR_RadialDistortionParameters> distort;
111 auto k1 = desc.getDistortion();
112 if (k1.k1_red != 0 || k1.k1_green != 0 || k1.k1_blue != 0) {
114 params.
k1.
data[0] = k1.k1_red;
115 params.
k1.
data[1] = k1.k1_green;
116 params.
k1.
data[2] = k1.k1_blue;
123 auto overlapPct = desc.getOverlapPercent();
125 if (overlapPct < 1.) {
126 const auto hfov = desc.getHorizontalFOV();
127 const auto angularOverlap = hfov * overlapPct;
128 axisOffset = (hfov - angularOverlap) / 2.;
134 std::vector<OSVR_DisplayInputCount> displayInputIndices;
135 if (eyesDesc.size() == 2 &&
136 display_schema_1::DisplayDescriptor::FULL_SCREEN ==
137 desc.getDisplayMode()) {
140 displayInputIndices = {0, 1};
143 desc.getDisplayWidth(), desc.getDisplayHeight()));
145 desc.getDisplayWidth(), desc.getDisplayHeight()));
151 displayInputIndices = {0, 0};
154 desc.getDisplayWidth(), desc.getDisplayHeight()));
156 BOOST_ASSERT_MSG(displayInputIndices.size() >= eyesDesc.size(),
157 "Must have at least as many indices as eyes");
160 for (
auto eye : eyeIndices) {
164 double offsetFactor = (2. * eye) - 1.;
167 boost::optional<OSVR_RadialDistortionParameters> distortEye(
170 distortEye->centerOfProjection.data[0] =
171 eyesDesc[eye].m_CenterProjX;
172 distortEye->centerOfProjection.data[1] =
173 eyesDesc[eye].m_CenterProjY;
177 auto xlateOffset = (offsetFactor * offset).eval();
182 auto eyeAxisOffset = axisOffset * -1. * offsetFactor;
185 auto displayInputIdx = displayInputIndices[eye];
188 viewer.container().emplace_back(
ViewerEye(
189 ctx, xlateOffset, HEAD_PATH, computeViewport(eye, desc),
190 computeRect(desc), eyesDesc[eye].m_rotate180,
191 desc.getPitchTilt().value(), distortEye, displayInputIdx,
195 OSVR_DEV_VERBOSE(
"Display: " << desc.getHumanReadableDescription());
197 }
catch (std::exception
const &e) {
199 "Couldn't create a display config internally! Exception: "
201 return DisplayConfigPtr{};
203 OSVR_DEV_VERBOSE(
"Couldn't create a display config internally! "
204 "Unknown exception!");
205 return DisplayConfigPtr{};
208 DisplayConfig::DisplayConfig() {}
210 bool DisplayConfig::isStartupComplete()
const {
211 for (
auto const &viewer : m_viewers) {
212 if (!viewer.hasPose()) {
215 for (
auto const &eye : viewer) {
216 if (!eye.hasPose()) {
AngleRadiansd Angle
Default angle type.
Parameters for a per-color-component radial distortion shader.
OSVR_Vec3 k1
Vector of K1 coefficients for the R, G, B channels.
std::string getStringParameter(std::string const &path) const
Gets a string parameter value.
double data[3]
Internal array data.
Rectd computeSymmetricFOVRect(AngleGeneric< System > hFov, AngleGeneric< System > vFov)
Compute a rectangle at unit distance for the given fov values.
static DisplayConfigPtr create(OSVR_ClientContext ctx)
Internal, configured header file for verbosity macros.