blob: 541841ee55403b2f860c24afc152634d6890b3b7 [file] [log] [blame]
// Copyright 2018 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 "third_party/blink/renderer/modules/xr/xr_utils.h"
#include <cmath>
#include "third_party/blink/renderer/core/geometry/dom_point_read_only.h"
#include "third_party/blink/renderer/modules/webgl/webgl2_rendering_context.h"
#include "third_party/blink/renderer/modules/webgl/webgl_rendering_context.h"
#include "third_party/blink/renderer/modules/xr/xr_webgl_rendering_context.h"
#include "third_party/blink/renderer/platform/transforms/transformation_matrix.h"
namespace blink {
DOMFloat32Array* transformationMatrixToDOMFloat32Array(
const TransformationMatrix& matrix) {
float array[] = {
static_cast<float>(matrix.M11()), static_cast<float>(matrix.M12()),
static_cast<float>(matrix.M13()), static_cast<float>(matrix.M14()),
static_cast<float>(matrix.M21()), static_cast<float>(matrix.M22()),
static_cast<float>(matrix.M23()), static_cast<float>(matrix.M24()),
static_cast<float>(matrix.M31()), static_cast<float>(matrix.M32()),
static_cast<float>(matrix.M33()), static_cast<float>(matrix.M34()),
static_cast<float>(matrix.M41()), static_cast<float>(matrix.M42()),
static_cast<float>(matrix.M43()), static_cast<float>(matrix.M44())};
return DOMFloat32Array::Create(array, 16);
}
TransformationMatrix DOMFloat32ArrayToTransformationMatrix(DOMFloat32Array* m) {
DCHECK_EQ(m->length(), 16u);
auto* data = m->Data();
return TransformationMatrix(
static_cast<double>(data[0]), static_cast<double>(data[1]),
static_cast<double>(data[2]), static_cast<double>(data[3]),
static_cast<double>(data[4]), static_cast<double>(data[5]),
static_cast<double>(data[6]), static_cast<double>(data[7]),
static_cast<double>(data[8]), static_cast<double>(data[9]),
static_cast<double>(data[10]), static_cast<double>(data[11]),
static_cast<double>(data[12]), static_cast<double>(data[13]),
static_cast<double>(data[14]), static_cast<double>(data[15]));
}
TransformationMatrix WTFFloatVectorToTransformationMatrix(
const Vector<float>& m) {
return TransformationMatrix(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7],
m[8], m[9], m[10], m[11], m[12], m[13], m[14],
m[15]);
}
// Normalize to have length = 1.0
DOMPointReadOnly* makeNormalizedQuaternion(double x,
double y,
double z,
double w) {
double length = std::sqrt((x * x) + (y * y) + (z * z) + (w * w));
if (length == 0.0) {
// Return a default value instead of crashing.
return DOMPointReadOnly::Create(0.0, 0.0, 0.0, 1.0);
}
return DOMPointReadOnly::Create(x / length, y / length, z / length,
w / length);
}
WebGLRenderingContextBase* webglRenderingContextBaseFromUnion(
const XRWebGLRenderingContext& context) {
if (context.IsWebGL2RenderingContext()) {
return context.GetAsWebGL2RenderingContext();
} else {
return context.GetAsWebGLRenderingContext();
}
}
base::Optional<device::Pose> CreatePose(
const blink::TransformationMatrix& matrix) {
return device::Pose::Create(
gfx::Transform(TransformationMatrix::ToSkMatrix44(matrix)));
}
device::mojom::blink::XRHandJoint StringToMojomHandJoint(
const String& hand_joint_string) {
if (hand_joint_string == "wrist") {
return device::mojom::blink::XRHandJoint::kWrist;
} else if (hand_joint_string == "thumb-metacarpal") {
return device::mojom::blink::XRHandJoint::kThumbMetacarpal;
} else if (hand_joint_string == "thumb-phalanx-proximal") {
return device::mojom::blink::XRHandJoint::kThumbPhalanxProximal;
} else if (hand_joint_string == "thumb-phalanx-distal") {
return device::mojom::blink::XRHandJoint::kThumbPhalanxDistal;
} else if (hand_joint_string == "thumb-tip") {
return device::mojom::blink::XRHandJoint::kThumbTip;
} else if (hand_joint_string == "index-finger-metacarpal") {
return device::mojom::blink::XRHandJoint::kIndexFingerMetacarpal;
} else if (hand_joint_string == "index-finger-phalanx-proximal") {
return device::mojom::blink::XRHandJoint::kIndexFingerPhalanxProximal;
} else if (hand_joint_string == "index-finger-phalanx-intermediate") {
return device::mojom::blink::XRHandJoint::kIndexFingerPhalanxIntermediate;
} else if (hand_joint_string == "index-finger-phalanx-distal") {
return device::mojom::blink::XRHandJoint::kIndexFingerPhalanxDistal;
} else if (hand_joint_string == "index-finger-tip") {
return device::mojom::blink::XRHandJoint::kIndexFingerTip;
} else if (hand_joint_string == "middle-finger-metacarpal") {
return device::mojom::blink::XRHandJoint::kMiddleFingerMetacarpal;
} else if (hand_joint_string == "middle-finger-phalanx-proximal") {
return device::mojom::blink::XRHandJoint::kMiddleFingerPhalanxProximal;
} else if (hand_joint_string == "middle-finger-phalanx-intermediate") {
return device::mojom::blink::XRHandJoint::kMiddleFingerPhalanxIntermediate;
} else if (hand_joint_string == "middle-finger-phalanx-distal") {
return device::mojom::blink::XRHandJoint::kMiddleFingerPhalanxDistal;
} else if (hand_joint_string == "middle-finger-tip") {
return device::mojom::blink::XRHandJoint::kMiddleFingerTip;
} else if (hand_joint_string == "ring-finger-metacarpal") {
return device::mojom::blink::XRHandJoint::kRingFingerMetacarpal;
} else if (hand_joint_string == "ring-finger-phalanx-proximal") {
return device::mojom::blink::XRHandJoint::kRingFingerPhalanxProximal;
} else if (hand_joint_string == "ring-finger-phalanx-intermediate") {
return device::mojom::blink::XRHandJoint::kRingFingerPhalanxIntermediate;
} else if (hand_joint_string == "ring-finger-phalanx-distal") {
return device::mojom::blink::XRHandJoint::kRingFingerPhalanxDistal;
} else if (hand_joint_string == "ring-finger-tip") {
return device::mojom::blink::XRHandJoint::kRingFingerTip;
} else if (hand_joint_string == "pinky-finger-metacarpal") {
return device::mojom::blink::XRHandJoint::kPinkyFingerMetacarpal;
} else if (hand_joint_string == "pinky-finger-phalanx-proximal") {
return device::mojom::blink::XRHandJoint::kPinkyFingerPhalanxProximal;
} else if (hand_joint_string == "pinky-finger-phalanx-intermediate") {
return device::mojom::blink::XRHandJoint::kPinkyFingerPhalanxIntermediate;
} else if (hand_joint_string == "pinky-finger-phalanx-distal") {
return device::mojom::blink::XRHandJoint::kPinkyFingerPhalanxDistal;
} else if (hand_joint_string == "pinky-finger-tip") {
return device::mojom::blink::XRHandJoint::kPinkyFingerTip;
}
NOTREACHED();
return device::mojom::blink::XRHandJoint::kMaxValue;
}
String MojomHandJointToString(device::mojom::blink::XRHandJoint hand_joint) {
switch (hand_joint) {
case device::mojom::blink::XRHandJoint::kWrist:
return "wrist";
case device::mojom::blink::XRHandJoint::kThumbMetacarpal:
return "thumb-metacarpal";
case device::mojom::blink::XRHandJoint::kThumbPhalanxProximal:
return "thumb-phalanx-proximal";
case device::mojom::blink::XRHandJoint::kThumbPhalanxDistal:
return "thumb-phalanx-distal";
case device::mojom::blink::XRHandJoint::kThumbTip:
return "thumb-tip";
case device::mojom::blink::XRHandJoint::kIndexFingerMetacarpal:
return "index-finger-metacarpal";
case device::mojom::blink::XRHandJoint::kIndexFingerPhalanxProximal:
return "index-finger-phalanx-proximal";
case device::mojom::blink::XRHandJoint::kIndexFingerPhalanxIntermediate:
return "index-finger-phalanx-intermediate";
case device::mojom::blink::XRHandJoint::kIndexFingerPhalanxDistal:
return "index-finger-phalanx-distal";
case device::mojom::blink::XRHandJoint::kIndexFingerTip:
return "index-finger-tip";
case device::mojom::blink::XRHandJoint::kMiddleFingerMetacarpal:
return "middle-finger-metacarpal";
case device::mojom::blink::XRHandJoint::kMiddleFingerPhalanxProximal:
return "middle-finger-phalanx-proximal";
case device::mojom::blink::XRHandJoint::kMiddleFingerPhalanxIntermediate:
return "middle-finger-phalanx-intermediate";
case device::mojom::blink::XRHandJoint::kMiddleFingerPhalanxDistal:
return "middle-finger-phalanx-distal";
case device::mojom::blink::XRHandJoint::kMiddleFingerTip:
return "middle-finger-tip";
case device::mojom::blink::XRHandJoint::kRingFingerMetacarpal:
return "ring-finger-metacarpal";
case device::mojom::blink::XRHandJoint::kRingFingerPhalanxProximal:
return "ring-finger-phalanx-proximal";
case device::mojom::blink::XRHandJoint::kRingFingerPhalanxIntermediate:
return "ring-finger-phalanx-intermediate";
case device::mojom::blink::XRHandJoint::kRingFingerPhalanxDistal:
return "ring-finger-phalanx-distal";
case device::mojom::blink::XRHandJoint::kRingFingerTip:
return "ring-finger-tip";
case device::mojom::blink::XRHandJoint::kPinkyFingerMetacarpal:
return "pinky-finger-metacarpal";
case device::mojom::blink::XRHandJoint::kPinkyFingerPhalanxProximal:
return "pinky-finger-phalanx-proximal";
case device::mojom::blink::XRHandJoint::kPinkyFingerPhalanxIntermediate:
return "pinky-finger-phalanx-intermediate";
case device::mojom::blink::XRHandJoint::kPinkyFingerPhalanxDistal:
return "pinky-finger-phalanx-distal";
case device::mojom::blink::XRHandJoint::kPinkyFingerTip:
return "pinky-finger-tip";
default:
NOTREACHED();
return "";
}
}
} // namespace blink