vec: normalize cross product helper

This commit is contained in:
Recep Aslantas
2018-12-06 18:01:52 +03:00
parent 92605f845a
commit 2ef9c23a6c
6 changed files with 61 additions and 29 deletions

View File

@@ -39,7 +39,6 @@ Functions:
#. :c:func:`glm_vec3_zero` #. :c:func:`glm_vec3_zero`
#. :c:func:`glm_vec3_one` #. :c:func:`glm_vec3_one`
#. :c:func:`glm_vec3_dot` #. :c:func:`glm_vec3_dot`
#. :c:func:`glm_vec3_cross`
#. :c:func:`glm_vec3_norm2` #. :c:func:`glm_vec3_norm2`
#. :c:func:`glm_vec3_norm` #. :c:func:`glm_vec3_norm`
#. :c:func:`glm_vec3_add` #. :c:func:`glm_vec3_add`
@@ -65,6 +64,8 @@ Functions:
#. :c:func:`glm_vec3_negate_to` #. :c:func:`glm_vec3_negate_to`
#. :c:func:`glm_vec3_normalize` #. :c:func:`glm_vec3_normalize`
#. :c:func:`glm_vec3_normalize_to` #. :c:func:`glm_vec3_normalize_to`
#. :c:func:`glm_vec3_cross`
#. :c:func:`glm_vec3_crossn`
#. :c:func:`glm_vec3_distance2` #. :c:func:`glm_vec3_distance2`
#. :c:func:`glm_vec3_distance` #. :c:func:`glm_vec3_distance`
#. :c:func:`glm_vec3_angle` #. :c:func:`glm_vec3_angle`
@@ -125,12 +126,21 @@ Functions documentation
.. c:function:: void glm_vec3_cross(vec3 a, vec3 b, vec3 d) .. c:function:: void glm_vec3_cross(vec3 a, vec3 b, vec3 d)
cross product cross product of two vector (RH)
Parameters: Parameters:
| *[in]* **a** source 1 | *[in]* **a** vector 1
| *[in]* **b** source 2 | *[in]* **b** vector 2
| *[out]* **d** destination | *[out]* **dest** destination
.. c:function:: void glm_vec3_crossn(vec3 a, vec3 b, vec3 dest)
cross product of two vector (RH) and normalize the result
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** destination
.. c:function:: float glm_vec3_norm2(vec3 v) .. c:function:: float glm_vec3_norm2(vec3 v)

View File

@@ -42,7 +42,11 @@ glmc_vec3_dot(vec3 a, vec3 b);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_vec3_cross(vec3 a, vec3 b, vec3 d); glmc_vec3_cross(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_crossn(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT CGLM_EXPORT
float float

View File

@@ -323,9 +323,7 @@ glm_lookat(vec3 eye,
glm_vec3_sub(center, eye, f); glm_vec3_sub(center, eye, f);
glm_vec3_normalize(f); glm_vec3_normalize(f);
glm_vec3_cross(f, up, s); glm_vec3_crossn(f, up, s);
glm_vec3_normalize(s);
glm_vec3_cross(s, f, u); glm_vec3_cross(s, f, u);
dest[0][0] = s[0]; dest[0][0] = s[0];

View File

@@ -21,7 +21,6 @@
CGLM_INLINE void glm_vec3_zero(vec3 v); CGLM_INLINE void glm_vec3_zero(vec3 v);
CGLM_INLINE void glm_vec3_one(vec3 v); CGLM_INLINE void glm_vec3_one(vec3 v);
CGLM_INLINE float glm_vec3_dot(vec3 a, vec3 b); CGLM_INLINE float glm_vec3_dot(vec3 a, vec3 b);
CGLM_INLINE void glm_vec3_cross(vec3 a, vec3 b, vec3 d);
CGLM_INLINE float glm_vec3_norm2(vec3 v); CGLM_INLINE float glm_vec3_norm2(vec3 v);
CGLM_INLINE float glm_vec3_norm(vec3 v); CGLM_INLINE float glm_vec3_norm(vec3 v);
CGLM_INLINE void glm_vec3_add(vec3 a, vec3 b, vec3 dest); CGLM_INLINE void glm_vec3_add(vec3 a, vec3 b, vec3 dest);
@@ -47,6 +46,8 @@
CGLM_INLINE void glm_vec3_inv_to(vec3 v, vec3 dest); CGLM_INLINE void glm_vec3_inv_to(vec3 v, vec3 dest);
CGLM_INLINE void glm_vec3_normalize(vec3 v); CGLM_INLINE void glm_vec3_normalize(vec3 v);
CGLM_INLINE void glm_vec3_normalize_to(vec3 v, vec3 dest); CGLM_INLINE void glm_vec3_normalize_to(vec3 v, vec3 dest);
CGLM_INLINE void glm_vec3_cross(vec3 a, vec3 b, vec3 d);
CGLM_INLINE void glm_vec3_crossn(vec3 a, vec3 b, vec3 dest);
CGLM_INLINE float glm_vec3_distance(vec3 a, vec3 b); CGLM_INLINE float glm_vec3_distance(vec3 a, vec3 b);
CGLM_INLINE float glm_vec3_angle(vec3 a, vec3 b); CGLM_INLINE float glm_vec3_angle(vec3 a, vec3 b);
CGLM_INLINE void glm_vec3_rotate(vec3 v, float angle, vec3 axis); CGLM_INLINE void glm_vec3_rotate(vec3 v, float angle, vec3 axis);
@@ -166,22 +167,6 @@ glm_vec3_dot(vec3 a, vec3 b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
} }
/*!
* @brief vec3 cross product
*
* @param[in] a source 1
* @param[in] b source 2
* @param[out] d destination
*/
CGLM_INLINE
void
glm_vec3_cross(vec3 a, vec3 b, vec3 d) {
/* (u2.v3 - u3.v2, u3.v1 - u1.v3, u1.v2 - u2.v1) */
d[0] = a[1] * b[2] - a[2] * b[1];
d[1] = a[2] * b[0] - a[0] * b[2];
d[2] = a[0] * b[1] - a[1] * b[0];
}
/*! /*!
* @brief norm * norm (magnitude) of vec * @brief norm * norm (magnitude) of vec
* *
@@ -521,6 +506,36 @@ glm_vec3_normalize_to(vec3 v, vec3 dest) {
glm_vec3_scale(v, 1.0f / norm, dest); glm_vec3_scale(v, 1.0f / norm, dest);
} }
/*!
* @brief cross product of two vector (RH)
*
* @param[in] a vector 1
* @param[in] b vector 2
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec3_cross(vec3 a, vec3 b, vec3 dest) {
/* (u2.v3 - u3.v2, u3.v1 - u1.v3, u1.v2 - u2.v1) */
dest[0] = a[1] * b[2] - a[2] * b[1];
dest[1] = a[2] * b[0] - a[0] * b[2];
dest[2] = a[0] * b[1] - a[1] * b[0];
}
/*!
* @brief cross product of two vector (RH) and normalize the result
*
* @param[in] a vector 1
* @param[in] b vector 2
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec3_crossn(vec3 a, vec3 b, vec3 dest) {
glm_vec3_cross(a, b, dest);
glm_vec3_normalize(dest);
}
/*! /*!
* @brief angle betwen two vector * @brief angle betwen two vector
* *

View File

@@ -426,7 +426,6 @@ glm_vec4_divs(vec4 v, float s, vec4 dest) {
#endif #endif
} }
/*! /*!
* @brief add two vectors and add result to sum * @brief add two vectors and add result to sum
* *

View File

@@ -40,8 +40,14 @@ glmc_vec3_dot(vec3 a, vec3 b) {
CGLM_EXPORT CGLM_EXPORT
void void
glmc_vec3_cross(vec3 a, vec3 b, vec3 d) { glmc_vec3_cross(vec3 a, vec3 b, vec3 dest) {
glm_vec3_cross(a, b, d); glm_vec3_cross(a, b, dest);
}
CGLM_EXPORT
void
glmc_vec3_crossn(vec3 a, vec3 b, vec3 dest) {
glm_vec3_crossn(a, b, dest);
} }
CGLM_EXPORT CGLM_EXPORT