// Copyright 2015 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/vr/vr_pose.h"

#include "device/vr/public/mojom/vr_service.mojom-blink.h"

namespace blink {

namespace {

DOMFloat32Array* QuaternionToFloat32Array(
    const base::Optional<gfx::Quaternion>& quat) {
  if (!quat)
    return nullptr;

  auto* dom_array = DOMFloat32Array::Create(4);
  float* data = dom_array->Data();
  data[0] = quat->x();
  data[1] = quat->y();
  data[2] = quat->z();
  data[3] = quat->w();

  return dom_array;
}

DOMFloat32Array* Vector3dFToFloat32Array(
    const base::Optional<gfx::Vector3dF>& vec) {
  if (!vec)
    return nullptr;

  auto* dom_array = DOMFloat32Array::Create(3);
  float* data = dom_array->Data();
  data[0] = vec->x();
  data[1] = vec->y();
  data[2] = vec->z();

  return dom_array;
}

DOMFloat32Array* WebPoint3DToFloat32Array(
    const base::Optional<WebFloatPoint3D>& p) {
  if (!p)
    return nullptr;

  auto* dom_array = DOMFloat32Array::Create(3);
  float* data = dom_array->Data();
  data[0] = p->x;
  data[1] = p->y;
  data[2] = p->z;

  return dom_array;
}

}  // namespace

VRPose::VRPose() = default;

void VRPose::SetPose(const device::mojom::blink::VRPosePtr& state) {
  if (state.is_null())
    return;

  orientation_ = QuaternionToFloat32Array(state->orientation);
  position_ = WebPoint3DToFloat32Array(state->position);
  angular_velocity_ = Vector3dFToFloat32Array(state->angular_velocity);
  linear_velocity_ = Vector3dFToFloat32Array(state->linear_velocity);
  angular_acceleration_ = Vector3dFToFloat32Array(state->angular_acceleration);
  linear_acceleration_ = Vector3dFToFloat32Array(state->linear_acceleration);
}

void VRPose::Trace(blink::Visitor* visitor) {
  visitor->Trace(orientation_);
  visitor->Trace(position_);
  visitor->Trace(angular_velocity_);
  visitor->Trace(linear_velocity_);
  visitor->Trace(angular_acceleration_);
  visitor->Trace(linear_acceleration_);
  ScriptWrappable::Trace(visitor);
}

}  // namespace blink
