diff --git a/Makefile.am b/Makefile.am
index 91f4eee..1eeb988 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -163,6 +163,7 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
include/cglm/struct/mat2.h \
include/cglm/struct/affine-pre.h \
include/cglm/struct/affine-post.h \
+ include/cglm/struct/affine-mat.h \
include/cglm/struct/affine.h \
include/cglm/struct/affine2d.h \
include/cglm/struct/vec2.h \
diff --git a/include/cglm/affine-mat.h b/include/cglm/affine-mat.h
index 1cd4973..c22c0e0 100644
--- a/include/cglm/affine-mat.h
+++ b/include/cglm/affine-mat.h
@@ -8,6 +8,7 @@
/*
Functions:
CGLM_INLINE void glm_mul(mat4 m1, mat4 m2, mat4 dest);
+ CGLM_INLINE void glm_mul_rot(mat4 m1, mat4 m2, mat4 dest);
CGLM_INLINE void glm_inv_tr(mat4 mat);
*/
diff --git a/include/cglm/struct/affine-mat.h b/include/cglm/struct/affine-mat.h
new file mode 100644
index 0000000..78a6a40
--- /dev/null
+++ b/include/cglm/struct/affine-mat.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE mat4s glms_mul(mat4 m1, mat4 m2);
+ CGLM_INLINE mat4s glms_mul_rot(mat4 m1, mat4 m2);
+ CGLM_INLINE mat4s glms_inv_tr();
+ */
+
+#ifndef cglms_affine_mat_h
+#define cglms_affine_mat_h
+
+#include "../common.h"
+#include "../types-struct.h"
+#include "../affine-mat.h"
+#include "vec3.h"
+#include "vec4.h"
+#include "mat4.h"
+
+/*!
+ * @brief this is similar to glms_mat4_mul but specialized to affine transform
+ *
+ * Matrix format should be:
+ * R R R X
+ * R R R Y
+ * R R R Z
+ * 0 0 0 W
+ *
+ * this reduces some multiplications. It should be faster than mat4_mul.
+ * if you are not sure about matrix format then DON'T use this! use mat4_mul
+ *
+ * @param[in] m1 affine matrix 1
+ * @param[in] m2 affine matrix 2
+ * @returns destination matrix
+ */
+CGLM_INLINE
+mat4s
+glms_mul(mat4s m1, mat4s m2){
+ mat4s r;
+ glm_mul(m1.raw, m2.raw, r.raw);
+ return r;
+}
+
+/*!
+ * @brief this is similar to glm_mat4_mul but specialized to affine transform
+ *
+ * Right Matrix format should be:
+ * R R R 0
+ * R R R 0
+ * R R R 0
+ * 0 0 0 1
+ *
+ * this reduces some multiplications. It should be faster than mat4_mul.
+ * if you are not sure about matrix format then DON'T use this! use mat4_mul
+ *
+ * @param[in] m1 affine matrix 1
+ * @param[in] m2 affine matrix 2
+ * @returns destination matrix
+ */
+CGLM_INLINE
+mat4s
+glms_mul_rot(mat4s m1, mat4s m2){
+ mat4s r;
+ glm_mul_rot(m1.raw, m2.raw, r.raw);
+ return r;
+}
+
+/*!
+ * @brief inverse orthonormal rotation + translation matrix (ridig-body)
+ *
+ * @code
+ * X = | R T | X' = | R' -R'T |
+ * | 0 1 | | 0 1 |
+ * @endcode
+ *
+ * @param[in] mat matrix
+ * @returns destination matrix
+ */
+CGLM_INLINE
+mat4s
+glms_inv_tr(mat4s m){
+ glm_inv_tr(m.raw);
+ return m;
+}
+#endif /* cglms_affine_mat_h */
diff --git a/include/cglm/struct/affine.h b/include/cglm/struct/affine.h
index 64e56d0..bc62846 100644
--- a/include/cglm/struct/affine.h
+++ b/include/cglm/struct/affine.h
@@ -39,6 +39,7 @@
#include "vec3.h"
#include "vec4.h"
#include "mat4.h"
+#include "affine-mat.h"
/*!
* @brief creates NEW translate transform matrix by v vector
diff --git a/win/cglm.vcxproj b/win/cglm.vcxproj
index a0a9282..fb35069 100644
--- a/win/cglm.vcxproj
+++ b/win/cglm.vcxproj
@@ -184,6 +184,7 @@
+
diff --git a/win/cglm.vcxproj.filters b/win/cglm.vcxproj.filters
index 7b9b6a3..7a32d79 100644
--- a/win/cglm.vcxproj.filters
+++ b/win/cglm.vcxproj.filters
@@ -603,5 +603,8 @@
include\cglm\struct
+
+ include\cglm\struct
+
\ No newline at end of file