add _scale_as feature

glm_vec_scale multiplies vector (all items) by a scalar
result = vector * factor, new scale = old scale * factor

now it is possible to scale a vector as specified factor
result = unit(vector) * factor, new scale = factor
This commit is contained in:
Recep Aslantas
2017-05-21 21:34:50 +03:00
parent eafcd1d103
commit 3728102644
3 changed files with 95 additions and 33 deletions

View File

@@ -94,6 +94,18 @@ CGLM_EXPORT
void
glmc_vec_scale(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_scale(vec4 v, float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec_scale_as(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_scale_as(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec_flipsign(vec3 v);
@@ -102,10 +114,6 @@ CGLM_EXPORT
void
glmc_vec4_flipsign(vec4 v);
CGLM_EXPORT
void
glmc_vec4_scale(vec4 v, float s, vec4 dest);
CGLM_EXPORT
float
glmc_vec_angle(vec3 v1, vec3 v2)

View File

@@ -249,7 +249,7 @@ glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest) {
}
/*!
* @brief multiply vec3 vector with scalar
* @brief multiply/scale vec3 vector with scalar: result = v * s
*
* @param[in] v vector
* @param[in] s scalar
@@ -263,6 +263,70 @@ glm_vec_scale(vec3 v, float s, vec3 dest) {
dest[2] = v[2] * s;
}
/*!
* @brief multiply/scale vec4 vector with scalar: result = v * s
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination vector
*/
CGLM_INLINE
void
glm_vec4_scale(vec4 v, float s, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(dest,
_mm_mul_ps(_mm_load_ps(v),
_mm_set1_ps(s)));
#else
dest[0] = v[0] * s;
dest[1] = v[1] * s;
dest[2] = v[2] * s;
dest[3] = v[3] * s;
#endif
}
/*!
* @brief make vec3 vector scale as specified: result = unit(v) * s
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination vector
*/
CGLM_INLINE
void
glm_vec_scale_as(vec3 v, float s, vec3 dest) {
float norm;
norm = glm_vec_norm(v);
if (norm == 0) {
glm_vec_copy(v, dest);
return;
}
glm_vec_scale(v, s / norm, dest);
}
/*!
* @brief make vec4 vector scale as specified: result = unit(v) * s
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination vector
*/
CGLM_INLINE
void
glm_vec4_scale_as(vec4 v, float s, vec4 dest) {
float norm;
norm = glm_vec4_norm(v);
if (norm == 0) {
glm_vec4_copy(v, dest);
return;
}
glm_vec4_scale(v, s / norm, dest);
}
/*!
* @brief flip sign of all vec3 members
*
@@ -299,28 +363,6 @@ glm_vec4_flipsign(vec4 v) {
#endif
}
/*!
* @brief multiply vec4 vector with scalar
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination vector
*/
CGLM_INLINE
void
glm_vec4_scale(vec4 v, float s, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(dest,
_mm_mul_ps(_mm_load_ps(v),
_mm_set1_ps(s)));
#else
dest[0] = v[0] * s;
dest[1] = v[1] * s;
dest[2] = v[2] * s;
dest[3] = v[3] * s;
#endif
}
/*!
* @brief normalize vec3 and store result in same vec
*

View File

@@ -121,6 +121,24 @@ glmc_vec_scale(vec3 v, float s, vec3 dest) {
glm_vec_scale(v, s, dest);
}
CGLM_EXPORT
void
glmc_vec4_scale(vec4 v, float s, vec4 dest) {
glm_vec4_scale(v, s, dest);
}
CGLM_EXPORT
void
glmc_vec_scale_as(vec3 v, float s, vec3 dest) {
glm_vec_scale_as(v, s, dest);
}
CGLM_EXPORT
void
glmc_vec4_scale_as(vec3 v, float s, vec3 dest) {
glm_vec4_scale_as(v, s, dest);
}
CGLM_EXPORT
void
glmc_vec_flipsign(vec3 v) {
@@ -133,12 +151,6 @@ glmc_vec4_flipsign(vec4 v) {
glm_vec4_flipsign(v);
}
CGLM_EXPORT
void
glmc_vec4_scale(vec4 v, float s, vec4 dest) {
glm_vec4_scale(v, s, dest);
}
CGLM_EXPORT
float
glmc_vec_angle(vec3 v1, vec3 v2) {