blob: c4005e0311372374b16223b47dd4c2568dbf9b1a [file] [log] [blame]
// Copyright (c) 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "device/vr/openvr/openvr_type_converters.h"
#include <math.h>
#include <iterator>
#include <vector>
#include "device/vr/public/mojom/vr_service.mojom.h"
#include "third_party/openvr/src/headers/openvr.h"
#include "ui/gfx/transform_util.h"
namespace mojo {
device::mojom::VRPosePtr
TypeConverter<device::mojom::VRPosePtr, vr::TrackedDevicePose_t>::Convert(
const vr::TrackedDevicePose_t& hmd_pose) {
device::mojom::VRPosePtr pose = device::mojom::VRPose::New();
pose->orientation = std::vector<float>({0.0f, 0.0f, 0.0f, 1.0f});
pose->position = std::vector<float>({0.0f, 0.0f, 0.0f});
if (hmd_pose.bPoseIsValid && hmd_pose.bDeviceIsConnected) {
const float(&m)[3][4] = hmd_pose.mDeviceToAbsoluteTracking.m;
gfx::Transform transform = gfx::Transform(
m[0][0], m[0][1], m[0][2], 0.0f, m[1][0], m[1][1], m[1][2], 0.0f,
m[2][0], m[2][1], m[2][2], 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);
gfx::DecomposedTransform decomposed;
if (gfx::DecomposeTransform(&decomposed, transform)) {
pose->orientation.value()[0] = decomposed.quaternion.x();
pose->orientation.value()[1] = decomposed.quaternion.y();
pose->orientation.value()[2] = decomposed.quaternion.z();
pose->orientation.value()[3] = decomposed.quaternion.w();
}
pose->position.value()[0] = m[0][3];
pose->position.value()[1] = m[1][3];
pose->position.value()[2] = m[2][3];
pose->linearVelocity = std::vector<float>(std::begin(hmd_pose.vVelocity.v),
std::end(hmd_pose.vVelocity.v));
pose->angularVelocity =
std::vector<float>(std::begin(hmd_pose.vAngularVelocity.v),
std::end(hmd_pose.vAngularVelocity.v));
}
return pose;
}
} // namespace mojo