ralpha-assets/Plugins/CesiumForUnreal/Source/ThirdParty/include/CesiumGeometry/Transforms.h

186 lines
6.0 KiB
C++

#pragma once
#include <CesiumGeometry/Axis.h>
#include <CesiumGeometry/Library.h>
#include <glm/fwd.hpp>
namespace CesiumGeometry {
/**
* @brief Coordinate system matrix constructions helpers.
*/
struct CESIUMGEOMETRY_API Transforms final {
/**
* @brief A matrix to convert from y-up to z-up orientation,
* by rotating about PI/2 around the x-axis
*/
static const glm::dmat4 Y_UP_TO_Z_UP;
/**
* @brief A matrix to convert from z-up to y-up orientation,
* by rotating about -PI/2 around the x-axis
*/
static const glm::dmat4 Z_UP_TO_Y_UP;
/**
* @brief A matrix to convert from x-up to z-up orientation,
* by rotating about -PI/2 around the y-axis
*/
static const glm::dmat4 X_UP_TO_Z_UP;
/**
* @brief A matrix to convert from z-up to x-up orientation,
* by rotating about PI/2 around the y-axis
*/
static const glm::dmat4 Z_UP_TO_X_UP;
/**
* @brief A matrix to convert from x-up to y-up orientation,
* by rotating about PI/2 around the z-axis
*/
static const glm::dmat4 X_UP_TO_Y_UP;
/**
* @brief A matrix to convert from y-up to x-up orientation,
* by rotating about -PI/2 around the z-axis
*/
static const glm::dmat4 Y_UP_TO_X_UP;
/**
* @brief Creates a translation-rotation-scale matrix, equivalent to
* `translation * rotation * scale`. So if a vector is multiplied with the
* resulting matrix, it will be first scaled, then rotated, then translated.
*
* @param translation The translation.
* @param rotation The rotation.
* @param scale The scale.
*/
static glm::dmat4 createTranslationRotationScaleMatrix(
const glm::dvec3& translation,
const glm::dquat& rotation,
const glm::dvec3& scale);
/**
* @brief Decomposes a matrix into translation, rotation, and scale
* components. This is the reverse of
* {@link createTranslationRotationScaleMatrix}.
*
* The scale may be negative (i.e. when switching from a right-handed to a
* left-handed system), but skew and other funny business will result in
* undefined behavior.
*
* @param matrix The matrix to decompose.
* @param pTranslation A pointer to the vector in which to store the
* translation, or nullptr if the translation is not needed.
* @param pRotation A pointer to the quaternion in which to store the
* rotation, or nullptr if the rotation is not needed.
* @param pScale A pointer to the vector in which to store the scale, or
* nullptr if the scale is not needed.
*/
static void computeTranslationRotationScaleFromMatrix(
const glm::dmat4& matrix,
glm::dvec3* pTranslation,
glm::dquat* pRotation,
glm::dvec3* pScale);
/**
* @brief Gets a transform that converts from one up axis to another.
*
* @param from The up axis to convert from.
* @param to The up axis to convert to.
*
* @returns The up axis transform.
*/
static const glm::dmat4&
getUpAxisTransform(CesiumGeometry::Axis from, CesiumGeometry::Axis to);
/**
* @brief Create a view matrix.
*
* This is similar to glm::lookAt(), but uses the pose of the viewer to create
* the view matrix. The view matrix is the inverse of the pose matrix.
*
* @param position position of the eye
* @param direction view vector i.e., -z axis of the viewer's pose.
* @param up up vector of viewer i.e., y axis of the viewer's pose.
*
* @returns The view matrix.
*/
static glm::dmat4 createViewMatrix(
const glm::dvec3& position,
const glm::dvec3& direction,
const glm::dvec3& up);
/**
* @brief Compute a Vulkan-style perspective projection matrix with reversed
* Z.
*
* "Vulkan-style", as return by this function and others, uses the following
* conventions:
* * X maps from -1 to 1 left to right
* * Y maps from 1 to -1 bottom to top
* * Z maps from 1 to 0 near to far (known as "reverse Z")
*
* @param fovx horizontal field of view in radians
* @param fovy vertical field of view in radians
* @param zNear distance to near plane
* @param zFar distance to far plane
*/
static glm::dmat4
createPerspectiveMatrix(double fovx, double fovy, double zNear, double zFar);
/**
* @brief Compute a Vulkan-style perspective projection matrix with reversed
* Z.
*
* "Vulkan-style", as return by this function and others, uses the following
* conventions:
* * X maps from -1 to 1 left to right
* * Y maps from 1 to -1 bottom to top
* * Z maps from 1 to 0 near to far (known as "reverse Z")
*
* @param left left distance of near plane edge from center
* @param right right distance of near plane edge
* @param bottom bottom distance of near plane edge
* @param top top distance of near plane edge
* @param zNear distance of near plane
* @param zFar distance of far plane. This can be infinite
*/
static glm::dmat4 createPerspectiveMatrix(
double left,
double right,
double bottom,
double top,
double zNear,
double zFar);
/**
* @brief Compute a Vulkan-style orthographic projection matrix with reversed
* Z.
*
* "Vulkan-style", as return by this function and others, uses the following
* conventions:
* * X maps from -1 to 1 left to right
* * Y maps from 1 to -1 bottom to top
* * Z maps from 1 to 0 near to far (known as "reverse Z")
*
* @param left left distance of near plane edge from center
* @param right right distance of near plane edge
* @param bottom bottom distance of near plane edge
* @param top top distance of near plane edge
* @param zNear distance of near plane
* @param zFar distance of far plane. This can be infinite
*/
static glm::dmat4 createOrthographicMatrix(
double left,
double right,
double bottom,
double top,
double zNear,
double zFar);
};
} // namespace CesiumGeometry