diff --git a/docs/source/vec3.rst b/docs/source/vec3.rst index 8529333..0c5d590 100644 --- a/docs/source/vec3.rst +++ b/docs/source/vec3.rst @@ -31,6 +31,8 @@ Functions: 1. :c:func:`glm_vec3` #. :c:func:`glm_vec_copy` +#. :c:func:`glm_vec_zero` +#. :c:func:`glm_vec_one` #. :c:func:`glm_vec_dot` #. :c:func:`glm_vec_cross` #. :c:func:`glm_vec_norm2` @@ -76,6 +78,20 @@ Functions documentation | *[in]* **a** source | *[out]* **dest** destination +.. c:function:: void glm_vec_zero(vec3 v) + + makes all members 0.0f (zero) + + Parameters: + | *[in, out]* **v** vector + +.. c:function:: void glm_vec_one(vec3 v) + + makes all members 1.0f (one) + + Parameters: + | *[in, out]* **v** vector + .. c:function:: float glm_vec_dot(vec3 a, vec3 b) dot product of vec3 diff --git a/docs/source/vec4.rst b/docs/source/vec4.rst index 6955246..8deed35 100644 --- a/docs/source/vec4.rst +++ b/docs/source/vec4.rst @@ -24,6 +24,8 @@ Functions: 1. :c:func:`glm_vec4` #. :c:func:`glm_vec4_copy3` #. :c:func:`glm_vec4_copy` +#. :c:func:`glm_vec4_zero` +#. :c:func:`glm_vec4_one` #. :c:func:`glm_vec4_dot` #. :c:func:`glm_vec4_norm2` #. :c:func:`glm_vec4_norm` @@ -78,6 +80,13 @@ Functions documentation | *[in]* **v** source | *[in]* **dest** destination +.. c:function:: void glm_vec4_zero(vec4 v) + + makes all members zero + + Parameters: + | *[in, out]* **v** vector + .. c:function:: float glm_vec4_dot(vec4 a, vec4 b) dot product of vec4 diff --git a/include/cglm/call/vec3.h b/include/cglm/call/vec3.h index e79ec8f..396972f 100644 --- a/include/cglm/call/vec3.h +++ b/include/cglm/call/vec3.h @@ -24,6 +24,14 @@ CGLM_EXPORT void glmc_vec_copy(vec3 a, vec3 dest); +CGLM_EXPORT +void +glmc_vec_zero(vec3 v); + +CGLM_EXPORT +void +glmc_vec_one(vec3 v); + CGLM_EXPORT float glmc_vec_dot(vec3 a, vec3 b); diff --git a/include/cglm/call/vec4.h b/include/cglm/call/vec4.h index ad915e6..95f91e2 100644 --- a/include/cglm/call/vec4.h +++ b/include/cglm/call/vec4.h @@ -21,6 +21,14 @@ CGLM_EXPORT void glmc_vec4(vec3 v3, float last, vec4 dest); +CGLM_EXPORT +void +glmc_vec4_zero(vec4 v); + +CGLM_EXPORT +void +glmc_vec4_one(vec4 v); + CGLM_EXPORT void glmc_vec4_copy3(vec4 a, vec3 dest); diff --git a/include/cglm/vec3.h b/include/cglm/vec3.h index 714165b..6f42855 100644 --- a/include/cglm/vec3.h +++ b/include/cglm/vec3.h @@ -103,6 +103,32 @@ glm_vec_copy(vec3 a, vec3 dest) { dest[2] = a[2]; } +/*! + * @brief make vector zero + * + * @param[in, out] v vector + */ +CGLM_INLINE +void +glm_vec_zero(vec4 v) { + v[0] = 0.0f; + v[1] = 0.0f; + v[2] = 0.0f; +} + +/*! + * @brief make vector one + * + * @param[in, out] v vector + */ +CGLM_INLINE +void +glm_vec_one(vec4 v) { + v[0] = 1.0f; + v[1] = 1.0f; + v[2] = 1.0f; +} + /*! * @brief vec3 dot product * diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index c50b4f9..44c6a31 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -111,6 +111,42 @@ glm_vec4_copy(vec4 v, vec4 dest) { #endif } +/*! + * @brief make vector zero + * + * @param[in, out] v vector + */ +CGLM_INLINE +void +glm_vec4_zero(vec4 v) { +#if defined( __SSE__ ) || defined( __SSE2__ ) + _mm_store_ps(v, _mm_setzero_ps()); +#else + v[0] = 0.0f; + v[1] = 0.0f; + v[2] = 0.0f; + v[3] = 0.0f; +#endif +} + +/*! + * @brief make vector one + * + * @param[in, out] v vector + */ +CGLM_INLINE +void +glm_vec4_one(vec4 v) { +#if defined( __SSE__ ) || defined( __SSE2__ ) + _mm_store_ps(v, _mm_set1_ps(1.0f)); +#else + v[0] = 1.0f; + v[1] = 1.0f; + v[2] = 1.0f; + v[3] = 1.0f; +#endif +} + /*! * @brief vec4 dot product * diff --git a/makefile.am b/makefile.am index 2922373..00800c0 100644 --- a/makefile.am +++ b/makefile.am @@ -110,7 +110,8 @@ test_tests_SOURCES=\ test/src/test_clamp.c \ test/src/test_euler.c \ test/src/test_quat.c \ - test/src/test_vec4.c + test/src/test_vec4.c \ + test/src/test_vec3.c all-local: sh ./post-build.sh diff --git a/src/vec3.c b/src/vec3.c index f7e2692..f7c890e 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -20,6 +20,18 @@ glmc_vec_copy(vec3 a, vec3 dest) { glm_vec_copy(a, dest); } +CGLM_EXPORT +void +glmc_vec_zero(vec3 v) { + glm_vec_zero(v); +} + +CGLM_EXPORT +void +glmc_vec_one(vec3 v) { + glm_vec_one(v); +} + CGLM_EXPORT float glmc_vec_dot(vec3 a, vec3 b) { diff --git a/src/vec4.c b/src/vec4.c index 7228070..df93556 100644 --- a/src/vec4.c +++ b/src/vec4.c @@ -14,6 +14,18 @@ glmc_vec4(vec3 v3, float last, vec4 dest) { glm_vec4(v3, last, dest); } +CGLM_EXPORT +void +glmc_vec4_zero(vec4 v) { + glm_vec4_zero(v); +} + +CGLM_EXPORT +void +glmc_vec4_one(vec4 v) { + glm_vec4_one(v); +} + CGLM_EXPORT void glmc_vec4_copy3(vec4 a, vec3 dest) { diff --git a/test/src/test_main.c b/test/src/test_main.c index 7995a5a..b0649cd 100644 --- a/test/src/test_main.c +++ b/test/src/test_main.c @@ -29,7 +29,10 @@ main(int argc, const char * argv[]) { cmocka_unit_test(test_quat), /* vec4 */ - cmocka_unit_test(test_vec4) + cmocka_unit_test(test_vec4), + + /* vec3 */ + cmocka_unit_test(test_vec3) }; return cmocka_run_group_tests(tests, NULL, NULL); diff --git a/test/src/test_tests.h b/test/src/test_tests.h index 1dfbb5f..224d943 100644 --- a/test/src/test_tests.h +++ b/test/src/test_tests.h @@ -31,4 +31,7 @@ test_quat(void **state); void test_vec4(void **state); +void +test_vec3(void **state); + #endif /* test_tests_h */ diff --git a/test/src/test_vec3.c b/test/src/test_vec3.c new file mode 100644 index 0000000..5a3a4c8 --- /dev/null +++ b/test/src/test_vec3.c @@ -0,0 +1,21 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#include "test_common.h" + +void +test_vec3(void **state) { + vec3 v; + + /* test zero */ + glm_vec_zero(v); + test_assert_vec3_eq(GLM_VEC3_ZERO, v); + + /* test one */ + glm_vec_one(v); + test_assert_vec3_eq(GLM_VEC3_ONE, v); +} diff --git a/test/src/test_vec4.c b/test/src/test_vec4.c index 51986f1..a80d9c7 100644 --- a/test/src/test_vec4.c +++ b/test/src/test_vec4.c @@ -70,4 +70,12 @@ test_vec4(void **state) { test_rand_vec4(v); test_assert_eqf(test_vec4_norm2(v), glm_vec4_norm2(v)); } + + /* test zero */ + glm_vec4_zero(v); + test_assert_vec4_eq(GLM_VEC4_ZERO, v); + + /* test one */ + glm_vec4_one(v); + test_assert_vec4_eq(GLM_VEC4_ONE, v); }