Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions glm/gtx/matrix_transform_2d.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#pragma once

// Dependency:
#include "../trigonometric.hpp"
#include "../mat3x3.hpp"
#include "../vec2.hpp"

Expand All @@ -33,7 +34,7 @@ namespace glm
/// @param m Input matrix multiplied by this translation matrix.
/// @param v Coordinates of a translation vector.
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate(
GLM_FUNC_DECL GLM_CONSTEXPR mat<3, 3, T, Q> translate(
mat<3, 3, T, Q> const& m,
vec<2, T, Q> const& v);

Expand All @@ -42,7 +43,7 @@ namespace glm
/// @param m Input matrix multiplied by this translation matrix.
/// @param angle Rotation angle expressed in radians.
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate(
GLM_FUNC_DECL mat<3, 3, T, Q> rotate(
mat<3, 3, T, Q> const& m,
T angle);

Expand All @@ -51,7 +52,7 @@ namespace glm
/// @param m Input matrix multiplied by this translation matrix.
/// @param v Coordinates of a scale vector.
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale(
GLM_FUNC_DECL GLM_CONSTEXPR mat<3, 3, T, Q> scale(
mat<3, 3, T, Q> const& m,
vec<2, T, Q> const& v);

Expand All @@ -60,7 +61,7 @@ namespace glm
/// @param m Input matrix multiplied by this translation matrix.
/// @param y Shear factor.
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX(
GLM_FUNC_DECL GLM_CONSTEXPR mat<3, 3, T, Q> shearX(
mat<3, 3, T, Q> const& m,
T y);

Expand All @@ -69,10 +70,19 @@ namespace glm
/// @param m Input matrix multiplied by this translation matrix.
/// @param x Shear factor.
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY(
GLM_FUNC_DECL GLM_CONSTEXPR mat<3, 3, T, Q> shearY(
mat<3, 3, T, Q> const& m,
T x);

/// Builds a shear 3 * 3 matrix.
///
/// @param m Input matrix multiplied by this translation matrix.
/// @param s Shear vector.
template <typename T, qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR mat<3, 3, T, Q> shear(
mat<3, 3, T, Q> const& m,
vec<2, T, Q> const& s);

/// @}
}//namespace glm

Expand Down
26 changes: 18 additions & 8 deletions glm/gtx/matrix_transform_2d.inl
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
/// @ref gtx_matrix_transform_2d
/// @author Miguel Ángel Pérez Martínez

#include "../trigonometric.hpp"

namespace glm
{

template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate(
GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> translate(
mat<3, 3, T, Q> const& m,
vec<2, T, Q> const& v)
{
Expand All @@ -16,7 +13,6 @@ namespace glm
return Result;
}


template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate(
mat<3, 3, T, Q> const& m,
Expand All @@ -34,7 +30,7 @@ namespace glm
}

template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale(
GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> scale(
mat<3, 3, T, Q> const& m,
vec<2, T, Q> const& v)
{
Expand All @@ -46,7 +42,7 @@ namespace glm
}

template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX(
GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> shearX(
mat<3, 3, T, Q> const& m,
T y)
{
Expand All @@ -56,7 +52,7 @@ namespace glm
}

template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY(
GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> shearY(
mat<3, 3, T, Q> const& m,
T x)
{
Expand All @@ -65,4 +61,18 @@ namespace glm
return m * Result;
}

template <typename T, qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> shear(
mat<3, 3, T, Q> const& m,
vec<2, T, Q> const& s)
{
mat<3, 3, T, Q> Result{};

Result[0] = m[0] * (s.x * s.y + 1.0f) + m[1] * s.y;
Result[1] = m[0] * s.x + m[1];
Result[2] = m[2];

return Result;
}

}//namespace glm
2 changes: 1 addition & 1 deletion test/ext/ext_matrix_transform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ static int test_rotate()

glm::mat4 const R = glm::rotate(glm::mat4(1.0f), glm::radians(90.f), glm::vec3(0, 0, 1));
glm::vec4 const B = R * A;
Error += glm::all(glm::equal(B, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f), 0.0001f)) ? 0 : 1;
Error += glm::all(glm::equal(B, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f), glm::epsilon<float>())) ? 0 : 1;

return Error;
}
Expand Down
99 changes: 99 additions & 0 deletions test/gtx/gtx_matrix_transform_2d.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,108 @@
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/gtx/matrix_transform_2d.hpp>
#include <glm/gtc/constants.hpp>
#include <glm/ext/matrix_relational.hpp>
#include <glm/ext/matrix_float3x3.hpp>
#include <glm/ext/vector_relational.hpp>
#include <glm/ext/vector_float3.hpp>
#include <glm/ext/vector_float2.hpp>

static int test_translate()
{
int Error = 0;

glm::mat3 const M(1.0f);
glm::vec2 const V(1.0f);

glm::mat3 const T = glm::translate(M, V);
Error += glm::all(glm::equal(T[2], glm::vec3(1.0f), glm::epsilon<float>())) ? 0 : 1;

return Error;
}

static int test_rotate()
{
int Error = 0;

glm::vec3 const A(1.0f, 0.0f, 1.0f);
float constexpr a = glm::radians(90.f);

glm::mat3 const R = glm::rotate(glm::mat3(1.0f), a);
glm::vec3 const B = R * A;
Error += glm::all(glm::equal(B, glm::vec3(0.0f, 1.0f, 1.0f), glm::epsilon<float>())) ? 0 : 1;

return Error;
}

static int test_scale()
{
int Error = 0;

glm::mat3 const M(1.0f);
glm::vec2 const V(2.0f);

glm::mat3 const S = glm::scale(M, V);
glm::mat3 const R = glm::mat3(
glm::vec3(2, 0, 0),
glm::vec3(0, 2, 0),
glm::vec3(0, 0, 1));
Error += glm::all(glm::equal(S, R, glm::epsilon<float>())) ? 0 : 1;

return Error;
}

static int test_shearX()
{
int Error = 0;

glm::mat3 const M(1.0f);
float constexpr y = 1.0f;

glm::mat3 const S = glm::shearX(M, y);
glm::vec3 const V = S * glm::vec3(1.0f);
Error += glm::all(glm::equal(V, glm::vec3(1.0f, 2.0f, 1.0f), glm::epsilon<float>())) ? 0 : 1;

return Error;
}

static int test_shearY()
{
int Error = 0;

glm::mat3 const M(1.0f);
float constexpr x = 1.0f;

glm::mat3 const S = glm::shearY(M, x);
glm::vec3 const V = S * glm::vec3(1.0f);
Error += glm::all(glm::equal(V, glm::vec3(2.0f, 1.0f, 1.0f), glm::epsilon<float>())) ? 0 : 1;

return Error;
}

static int test_shear()
{
int Error = 0;

glm::mat3 const M(1.0f);
glm::vec2 const s(1.0f);

glm::mat3 const S = glm::shear(M, s);
glm::vec3 const V = S * glm::vec3(1.0f);
Error += glm::all(glm::equal(V, glm::vec3(3.0f, 2.0f, 1.0f), glm::epsilon<float>())) ? 0 : 1;

return Error;
}

int main()
{
int Error(0);

Error += test_translate();
Error += test_rotate();
Error += test_scale();
Error += test_shearX();
Error += test_shearY();
Error += test_shear();

return Error;
}