// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#pragma once

#include "common-config.hpp"

#include <qmath.h>
#include <QVector3D>

qreal VS_COMMON_EXPORT radToDeg(qreal v);

qreal VS_COMMON_EXPORT degToRad(qreal v);

void VS_COMMON_EXPORT equirectangular2sphere(QPointF uv, QVector3D& vec, qreal sphereRadius);

void VS_COMMON_EXPORT rectilinear2sphere(QPointF uv, QVector3D& v, qreal sphereRadius);

void VS_COMMON_EXPORT stereographic2sphere(QPointF uv, QVector3D& v, qreal sphereRadius);

void VS_COMMON_EXPORT spherical2sphere(QPointF uv, QVector3D& v, qreal sphereRadius);

void VS_COMMON_EXPORT sphere2orientation(const QVector3D& v1, const QVector3D& v2, qreal& yaw, qreal& pitch,
                                         qreal& roll);

void VS_COMMON_EXPORT quaternion2euler(qreal q0, qreal q1, qreal q2, qreal q3, qreal& yaw, qreal& pitch, qreal& roll);

void VS_COMMON_EXPORT euler2quaternion(qreal yaw, qreal pitch, qreal roll, qreal& q0, qreal& q1, qreal& q2, qreal& q3);

// apply o, then p
void VS_COMMON_EXPORT quaternionProduct(qreal o0, qreal o1, qreal o2, qreal o3, qreal p0, qreal p1, qreal p2, qreal p3,
                                        qreal& q0, qreal& q1, qreal& q2, qreal& q3);