// 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/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);
}

std::unique_ptr<TransformationMatrix> DOMFloat32ArrayToTransformationMatrix(
    DOMFloat32Array* m) {
  DCHECK_EQ(m->length(), 16u);

  auto* data = m->Data();

  return TransformationMatrix::Create(
      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]));
}

// 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);
}

}  // namespace blink
