57 lines
1.9 KiB
C++
57 lines
1.9 KiB
C++
#pragma once
|
|
|
|
|
|
#include <J3ML/LinearAlgebra/Matrix3x3.hpp>
|
|
|
|
namespace J3ML::LinearAlgebra {
|
|
|
|
/// A class that performs and represents translations, rotations, and scaling operations in two dimensions.
|
|
class Transform2D {
|
|
protected:
|
|
// TODO: Verify column-major order (or transpose it) for compatibility with OpenGL.
|
|
Matrix3x3 transformation;
|
|
public:
|
|
const static Transform2D Identity;
|
|
const static Transform2D FlipX;
|
|
const static Transform2D FlipY;
|
|
|
|
/// Default constructor initializes to an Identity transformation.
|
|
Transform2D();
|
|
|
|
Transform2D(const Vector2& pos, const Vector2& scale, const Vector2& origin, const Vector2& skew, float rotation);
|
|
explicit Transform2D(const Matrix3x3& transform);
|
|
|
|
static Transform2D FromScale(float sx, float sy);
|
|
static Transform2D FromScale(const Vector2& scale);
|
|
static Transform2D FromRotation(float radians);
|
|
static Transform2D FromTranslation(const Vector2& translation);
|
|
static Transform2D FromTranslation(float tx, float ty);
|
|
|
|
/// Returns a Transform2D
|
|
Transform2D Translate(const Vector2& offset) const;
|
|
Transform2D Translate(float x, float y) const;
|
|
Transform2D Scale(float scale);
|
|
Transform2D Scale(float x, float y);
|
|
Transform2D Scale(const Vector2& scales);
|
|
Transform2D Rotate(float radians);
|
|
|
|
/// Transforms a given 2D point by this transformation.
|
|
Vector2 Transform(const Vector2& point) const;
|
|
Transform2D Inverse() const;
|
|
Transform2D AffineInverse() const;
|
|
|
|
Vector2 ForwardVector() const;
|
|
Vector2 UpVector() const;
|
|
|
|
float Determinant() const;
|
|
float& At(int row, int col);
|
|
[[nodiscard]] float At(int row, int col) const;
|
|
|
|
Vector2 GetTranslation() const;
|
|
float GetRotation() const;
|
|
Vector2 GetScale() const;
|
|
Transform2D OrthoNormalize();
|
|
};
|
|
}
|
|
|