re-organise files, remove cglm prefix from file to make them more clean

This commit is contained in:
Recep Aslantas
2017-07-11 18:05:10 +03:00
parent 3b159cdf02
commit 9d61668e04
49 changed files with 977 additions and 847 deletions

View File

@@ -1,22 +0,0 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_h
#define cglm_h
#include "cglm-common.h"
#include "cglm-vec.h"
#include "cglm-mat.h"
#include "cglm-mat3.h"
#include "cglm-affine.h"
#include "cglm-cam.h"
#include "cglm-quat.h"
#include "cglm-euler.h"
#include "cglm-util.h"
#include "cglm-io.h"
#endif /* cglm_h */

View File

@@ -14,11 +14,16 @@
#ifndef cglm_affine_mat_h
#define cglm_affine_mat_h
#include "cglm-common.h"
#include "cglm-mat.h"
#include "cglm-mat3.h"
#include "arch/simd/cglm-affine-mat-sse2.h"
#include "arch/simd/cglm-affine-mat-avx.h"
#include "common.h"
#include "mat4.h"
#ifdef CGLM_SSE_FP
# include "simd/sse2/affine.h"
#endif
#ifdef CGLM_AVX_FP
# include "simd/avx/affine.h"
#endif
#include <assert.h>

View File

@@ -33,10 +33,10 @@
#ifndef cglm_affine_h
#define cglm_affine_h
#include "cglm-common.h"
#include "cglm-vec.h"
#include "cglm-affine-mat.h"
#include "cglm-util.h"
#include "common.h"
#include "vec4.h"
#include "affine-mat.h"
#include "util.h"
CGLM_INLINE
void

View File

@@ -12,14 +12,15 @@ extern "C" {
#endif
#include "cglm.h"
#include "call/cglmc-vec.h"
#include "call/cglmc-mat.h"
#include "call/cglmc-mat3.h"
#include "call/cglmc-affine.h"
#include "call/cglmc-cam.h"
#include "call/cglmc-quat.h"
#include "call/cglmc-euler.h"
#include "call/cglmc-io.h"
#include "call/vec3.h"
#include "call/vec4.h"
#include "call/mat4.h"
#include "call/mat3.h"
#include "call/affine.h"
#include "call/cam.h"
#include "call/quat.h"
#include "call/euler.h"
#include "call/io.h"
#ifdef __cplusplus
}

View File

@@ -5,8 +5,8 @@
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_vec_h
#define cglmc_vec_h
#ifndef cglmc_vec3_h
#define cglmc_vec3_h
#ifdef __cplusplus
extern "C" {
#endif
@@ -14,30 +14,16 @@ extern "C" {
#include "../cglm.h"
/* DEPRECATED! use _copy, _ucopy versions */
#define glmc_vec_dup(v, dest) glmc_vec_copy(v, dest)
#define glmc_vec4_dup3(v, dest) glmc_vec4_copy3(v, dest)
#define glmc_vec4_dup(v, dest) glmc_vec4_copy(v, dest)
#define glmc_vec_dup(v, dest) glmc_vec_copy(v, dest)
CGLM_EXPORT
void
glmc_vec_copy(vec3 a, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_copy3(vec4 a, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_copy(vec4 v, vec4 dest);
CGLM_EXPORT
float
glmc_vec_dot(vec3 a, vec3 b);
CGLM_EXPORT
float
glmc_vec4_dot(vec4 a, vec4 b);
CGLM_EXPORT
void
glmc_vec_cross(vec3 a, vec3 b, vec3 d);
@@ -46,74 +32,38 @@ CGLM_EXPORT
float
glmc_vec_norm(vec3 vec);
CGLM_EXPORT
float
glmc_vec4_norm(vec4 vec);
CGLM_EXPORT
float
glmc_vec_norm2(vec3 vec);
CGLM_EXPORT
float
glmc_vec4_norm2(vec4 vec);
CGLM_EXPORT
void
glmc_vec_normalize_to(vec3 vec, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_normalize_to(vec4 vec, vec4 dest);
CGLM_EXPORT
void
glmc_vec_normalize(vec3 v);
CGLM_EXPORT
void
glmc_vec4_normalize(vec4 v);
CGLM_EXPORT
void
glmc_vec_add(vec3 v1, vec3 v2, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_add(vec4 v1, vec4 v2, vec4 dest);
CGLM_EXPORT
void
glmc_vec_sub(vec3 v1, vec3 v2, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_sub(vec4 v1, vec4 v2, vec4 dest);
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);
CGLM_EXPORT
void
glmc_vec4_flipsign(vec4 v);
CGLM_EXPORT
float
glmc_vec_angle(vec3 v1, vec3 v2);
@@ -138,11 +88,7 @@ CGLM_EXPORT
float
glmc_vec_distance(vec3 v1, vec3 v2);
CGLM_EXPORT
float
glmc_vec4_distance(vec4 v1, vec4 v2);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_vec_h */
#endif /* cglmc_vec3_h */

76
include/cglm/call/vec4.h Normal file
View File

@@ -0,0 +1,76 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_vec4_h
#define cglmc_vec4_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
/* DEPRECATED! use _copy, _ucopy versions */
#define glmc_vec4_dup3(v, dest) glmc_vec4_copy3(v, dest)
#define glmc_vec4_dup(v, dest) glmc_vec4_copy(v, dest)
CGLM_EXPORT
void
glmc_vec4_copy3(vec4 a, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_copy(vec4 v, vec4 dest);
CGLM_EXPORT
float
glmc_vec4_dot(vec4 a, vec4 b);
CGLM_EXPORT
float
glmc_vec4_norm(vec4 vec);
CGLM_EXPORT
float
glmc_vec4_norm2(vec4 vec);
CGLM_EXPORT
void
glmc_vec4_normalize_to(vec4 vec, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_normalize(vec4 v);
CGLM_EXPORT
void
glmc_vec4_add(vec4 v1, vec4 v2, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_sub(vec4 v1, vec4 v2, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_scale(vec4 v, float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_scale_as(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_flipsign(vec4 v);
CGLM_EXPORT
float
glmc_vec4_distance(vec4 v1, vec4 v2);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_vec4_h */

View File

@@ -36,7 +36,7 @@
#ifndef cglm_vcam_h
#define cglm_vcam_h
#include "cglm-common.h"
#include "common.h"
/*!
* @brief set up perspective peprojection matrix

23
include/cglm/cglm.h Normal file
View File

@@ -0,0 +1,23 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_h
#define cglm_h
#include "common.h"
#include "vec3.h"
#include "vec4.h"
#include "mat4.h"
#include "mat3.h"
#include "affine.h"
#include "cam.h"
#include "quat.h"
#include "euler.h"
#include "util.h"
#include "io.h"
#endif /* cglm_h */

View File

@@ -53,7 +53,7 @@
#define glm__memzero(type, dest, size) glm__memset(type, dest, size, 0)
#include "cglm-types.h"
#include "arch/simd/cglm-intrin.h"
#include "types.h"
#include "simd/intrin.h"
#endif /* cglm_common_h */

View File

@@ -26,7 +26,7 @@
#ifndef cglm_euler_h
#define cglm_euler_h
#include "cglm-common.h"
#include "common.h"
/*!
* if you have axis order like vec3 orderVec = [0, 1, 2] or [0, 2, 1]...

View File

@@ -18,7 +18,7 @@
#ifndef cglm_io_h
#define cglm_io_h
#include "cglm-common.h"
#include "common.h"
#include <stdio.h>
#include <stdlib.h>

View File

@@ -30,8 +30,11 @@
#ifndef cglm_mat3_h
#define cglm_mat3_h
#include "cglm-common.h"
#include "arch/simd/cglm-mat3-simd-sse2.h"
#include "common.h"
#ifdef CGLM_SSE_FP
# include "simd/sse2/mat3.h"
#endif
#define GLM_MAT3_IDENTITY_INIT {{1.0f, 0.0f, 0.0f}, \
{0.0f, 1.0f, 0.0f}, \

View File

@@ -44,18 +44,18 @@
#ifndef cglm_mat_h
#define cglm_mat_h
#include "cglm-common.h"
#include "common.h"
#ifdef CGLM_SSE_FP
# include "arch/simd/cglm-mat-simd-sse2.h"
# include "simd/sse2/mat4.h"
#endif
#ifdef CGLM_AVX_FP
# include "arch/simd/cglm-mat-simd-avx.h"
# include "simd/avx/mat4.h"
#endif
#ifdef CGLM_NEON_FP
# include "arch/simd/neon/mat4.h"
# include "simd/neon/mat4.h"
#endif
#include <assert.h>

View File

@@ -25,10 +25,12 @@
#ifndef cglm_quat_h
#define cglm_quat_h
#include "cglm-common.h"
#include "cglm-vec.h"
#include "arch/simd/cglm-intrin.h"
#include "arch/simd/cglm-quat-simd.h"
#include "common.h"
#include "vec4.h"
#ifdef CGLM_SSE_FP
# include "simd/sse2/quat.h"
#endif
#define GLM_QUAT_IDENTITY_INIT {0.0f, 0.0f, 0.0f, 1.0f}
#define GLM_QUAT_IDENTITY (versor){0.0f, 0.0f, 0.0f, 1.0f}

View File

@@ -9,8 +9,8 @@
#define cglm_affine_mat_avx_h
#ifdef __AVX__
#include "../../cglm-common.h"
#include "cglm-intrin.h"
#include "../../common.h"
#include "../intrin.h"
#include <immintrin.h>

View File

@@ -9,8 +9,8 @@
#define cglm_mat_simd_avx_h
#ifdef __AVX__
#include "../../cglm-common.h"
#include "cglm-intrin.h"
#include "../../common.h"
#include "../intrin.h"
#include <immintrin.h>

View File

@@ -43,6 +43,7 @@
/* ARM Neon */
#if defined(__ARM_NEON) && defined(__ARM_NEON_FP)
# include <arm_neon.h>
# define CGLM_NEON_FP 1
#else
# undef CGLM_NEON_FP

View File

@@ -9,8 +9,8 @@
#define cglm_mat4_neon_h
#if defined(__ARM_NEON_FP)
#include "../../../cglm-common.h"
#include <arm_neon.h>
#include "../../common.h"
#include "../intrin.h"
CGLM_INLINE
void

View File

@@ -9,8 +9,8 @@
#define cglm_affine_mat_sse2_h
#if defined( __SSE__ ) || defined( __SSE2__ )
#include "../../cglm-common.h"
#include "cglm-intrin.h"
#include "../../common.h"
#include "../intrin.h"
CGLM_INLINE
void

View File

@@ -9,8 +9,8 @@
#define cglm_mat3_sse_h
#if defined( __SSE__ ) || defined( __SSE2__ )
#include "../../cglm-common.h"
#include "cglm-intrin.h"
#include "../../common.h"
#include "../intrin.h"
CGLM_INLINE
void

View File

@@ -9,8 +9,8 @@
#define cglm_mat_sse_h
#if defined( __SSE__ ) || defined( __SSE2__ )
#include "../../cglm-common.h"
#include "cglm-intrin.h"
#include "../../common.h"
#include "../intrin.h"
CGLM_INLINE
void

View File

@@ -9,8 +9,8 @@
#define cglm_quat_simd_h
#if defined( __SSE__ ) || defined( __SSE2__ )
#include "../../cglm-common.h"
#include "cglm-intrin.h"
#include "../../common.h"
#include "../intrin.h"
CGLM_INLINE
void

View File

@@ -18,7 +18,7 @@
#ifndef cglm_util_h
#define cglm_util_h
#include "cglm-common.h"
#include "common.h"
/*!
* @brief get sign of 32 bit integer as +1 or -1

163
include/cglm/vec3-ext.h Normal file
View File

@@ -0,0 +1,163 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*!
* @brief SIMD like functions
*/
/*
Functions:
CGLM_INLINE void glm_vec_mulv(vec3 a, vec3 b, vec3 d);
CGLM_INLINE void glm_vec_broadcast(float val, vec3 d);
CGLM_INLINE bool glm_vec_eq(vec3 v, float val);
CGLM_INLINE bool glm_vec_eq_eps(vec4 v, float val);
CGLM_INLINE bool glm_vec_eq_all(vec3 v);
CGLM_INLINE bool glm_vec_eqv(vec3 v1, vec3 v2);
CGLM_INLINE bool glm_vec_eqv_eps(vec3 v1, vec3 v2);
CGLM_INLINE float glm_vec_max(vec3 v);
CGLM_INLINE float glm_vec_min(vec3 v);
*/
#ifndef cglm_vec3_ext_h
#define cglm_vec3_ext_h
#include "common.h"
#include <stdbool.h>
#include <math.h>
#include <float.h>
/*!
* @brief multiplies individual items, just for convenient like SIMD
*
* @param a vec1
* @param b vec2
* @param d vec3 = (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2])
*/
CGLM_INLINE
void
glm_vec_mulv(vec3 a, vec3 b, vec3 d) {
d[0] = a[0] * b[0];
d[1] = a[1] * b[1];
d[2] = a[2] * b[2];
}
/*!
* @brief fill a vector with specified value
*
* @param val value
* @param d dest
*/
CGLM_INLINE
void
glm_vec_broadcast(float val, vec3 d) {
d[0] = d[1] = d[2] = val;
}
/*!
* @brief check if vector is equal to value (without epsilon)
*
* @param v vector
* @param val value
*/
CGLM_INLINE
bool
glm_vec_eq(vec3 v, float val) {
return v[0] == val && v[0] == v[1] && v[0] == v[2];
}
/*!
* @brief check if vector is equal to value (with epsilon)
*
* @param v vector
* @param val value
*/
CGLM_INLINE
bool
glm_vec_eq_eps(vec4 v, float val) {
return fabsf(v[0] - val) <= FLT_EPSILON
&& fabsf(v[1] - val) <= FLT_EPSILON
&& fabsf(v[2] - val) <= FLT_EPSILON;
}
/*!
* @brief check if vectors members are equal (without epsilon)
*
* @param v vector
*/
CGLM_INLINE
bool
glm_vec_eq_all(vec3 v) {
return v[0] == v[1] && v[0] == v[2];
}
/*!
* @brief check if vector is equal to another (without epsilon)
*
* @param v1 vector
* @param v2 vector
*/
CGLM_INLINE
bool
glm_vec_eqv(vec3 v1, vec3 v2) {
return v1[0] == v2[0]
&& v1[1] == v2[1]
&& v1[2] == v2[2];
}
/*!
* @brief check if vector is equal to another (with epsilon)
*
* @param v1 vector
* @param v2 vector
*/
CGLM_INLINE
bool
glm_vec_eqv_eps(vec3 v1, vec3 v2) {
return fabsf(v1[0] - v2[0]) <= FLT_EPSILON
&& fabsf(v1[1] - v2[1]) <= FLT_EPSILON
&& fabsf(v1[2] - v2[2]) <= FLT_EPSILON;
}
/*!
* @brief max value of vector
*
* @param v vector
*/
CGLM_INLINE
float
glm_vec_max(vec3 v) {
float max;
max = v[0];
if (v[1] > max)
max = v[1];
if (v[2] > max)
max = v[2];
return max;
}
/*!
* @brief min value of vector
*
* @param v vector
*/
CGLM_INLINE
float
glm_vec_min(vec3 v) {
float min;
min = v[0];
if (v[1] < min)
min = v[1];
if (v[2] < min)
min = v[2];
return min;
}
#endif /* cglm_vec3_ext_h */

View File

@@ -13,11 +13,8 @@
/*
Macros:
glm_vec_dup(v, dest)
glm_vec4_dup3(v, dest)
glm_vec4_dup(v, dest)
Functions:
vec3:
CGLM_INLINE void glm_vec_copy(vec3 a, vec3 dest);
CGLM_INLINE float glm_vec_dot(vec3 a, vec3 b);
CGLM_INLINE void glm_vec_cross(vec3 a, vec3 b, vec3 d);
@@ -36,35 +33,17 @@
CGLM_INLINE void glm_vec_rotate_m4(mat4 m, vec3 v, vec3 dest);
CGLM_INLINE void glm_vec_proj(vec3 a, vec3 b, vec3 dest);
CGLM_INLINE void glm_vec_center(vec3 v1, vec3 v2, vec3 dest);
vec4:
CGLM_INLINE void glm_vec4_copy3(vec4 a, vec3 dest);
CGLM_INLINE void glm_vec4_copy(vec4 v, vec4 dest);
CGLM_INLINE float glm_vec4_dot(vec4 a, vec4 b);
CGLM_INLINE float glm_vec4_norm2(vec4 v);
CGLM_INLINE float glm_vec4_norm(vec4 vec);
CGLM_INLINE void glm_vec4_add(vec4 v1, vec4 v2, vec4 dest);
CGLM_INLINE void glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest);
CGLM_INLINE void glm_vec4_scale(vec4 v, float s, vec4 dest);
CGLM_INLINE void glm_vec4_scale_as(vec4 v, float s, vec4 dest);
CGLM_INLINE void glm_vec4_flipsign(vec4 v);
CGLM_INLINE void glm_vec4_normalize(vec4 v);
CGLM_INLINE void glm_vec4_normalize_to(vec4 vec, vec4 dest);
CGLM_INLINE float glm_vec4_distance(vec4 v1, vec4 v2);
*/
#ifndef cglm_vec_h
#define cglm_vec_h
#ifndef cglm_vec3_h
#define cglm_vec3_h
#include "cglm-common.h"
#include "cglm-vec-ext.h"
#include "arch/simd/cglm-intrin.h"
#include "cglm-util.h"
#include "common.h"
#include "vec3-ext.h"
#include "util.h"
/* DEPRECATED! use _copy, _ucopy versions */
#define glm_vec_dup(v, dest) glm_vec_copy(v, dest)
#define glm_vec4_dup3(v, dest) glm_vec4_copy3(v, dest)
#define glm_vec4_dup(v, dest) glm_vec4_copy(v, dest)
#define glm_vec_dup(v, dest) glm_vec_copy(v, dest)
/*!
* @brief copy all members of [a] to [dest]
@@ -80,39 +59,6 @@ glm_vec_copy(vec3 a, vec3 dest) {
dest[2] = a[2];
}
/*!
* @brief copy first 3 members of [a] to [dest]
*
* @param[in] a source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec4_copy3(vec4 a, vec3 dest) {
dest[0] = a[0];
dest[1] = a[1];
dest[2] = a[2];
}
/*!
* @brief copy all members of [a] to [dest]
*
* @param[in] v source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec4_copy(vec4 v, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(dest, _mm_load_ps(v));
#else
dest[0] = v[0];
dest[1] = v[1];
dest[2] = v[2];
dest[3] = v[3];
#endif
}
/*!
* @brief vec3 dot product
*
@@ -127,20 +73,6 @@ glm_vec_dot(vec3 a, vec3 b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}
/*!
* @brief vec4 dot product
*
* @param[in] a vector1
* @param[in] b vector2
*
* @return dot product
*/
CGLM_INLINE
float
glm_vec4_dot(vec4 a, vec4 b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
}
/*!
* @brief vec3 cross product
*
@@ -187,36 +119,6 @@ glm_vec_norm(vec3 vec) {
return sqrtf(glm_vec_norm2(vec));
}
/*!
* @brief norm * norm (magnitude) of vec
*
* we can use this func instead of calling norm * norm, because it would call
* sqrtf fuction twice but with this func we can avoid func call, maybe this is
* not good name for this func
*
* @param[in] v vec4
*
* @return norm * norm
*/
CGLM_INLINE
float
glm_vec4_norm2(vec4 v) {
return v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3];
}
/*!
* @brief norm (magnitude) of vec4
*
* @param[in] vec vector
*
* @return norm
*/
CGLM_INLINE
float
glm_vec4_norm(vec4 vec) {
return sqrtf(glm_vec4_norm2(vec));
}
/*!
* @brief add v2 vector to v1 vector store result in dest
*
@@ -232,28 +134,6 @@ glm_vec_add(vec3 v1, vec3 v2, vec3 dest) {
dest[2] = v1[2] + v2[2];
}
/*!
* @brief add v2 vector to v1 vector store result in dest
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest destination vector
*/
CGLM_INLINE
void
glm_vec4_add(vec4 v1, vec4 v2, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(dest,
_mm_add_ps(_mm_load_ps(v1),
_mm_load_ps(v2)));
#else
dest[0] = v1[0] + v2[0];
dest[1] = v1[1] + v2[1];
dest[2] = v1[2] + v2[2];
dest[3] = v1[3] + v2[3];
#endif
}
/*!
* @brief subtract v2 vector from v1 vector store result in dest
*
@@ -269,28 +149,6 @@ glm_vec_sub(vec3 v1, vec3 v2, vec3 dest) {
dest[2] = v1[2] - v2[2];
}
/*!
* @brief subtract v2 vector from v1 vector store result in dest
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest destination vector
*/
CGLM_INLINE
void
glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(dest,
_mm_sub_ps(_mm_load_ps(v1),
_mm_load_ps(v2)));
#else
dest[0] = v1[0] - v2[0];
dest[1] = v1[1] - v2[1];
dest[2] = v1[2] - v2[2];
dest[3] = v1[3] - v2[3];
#endif
}
/*!
* @brief multiply/scale vec3 vector with scalar: result = v * s
*
@@ -306,28 +164,6 @@ 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
*
@@ -349,27 +185,6 @@ glm_vec_scale_as(vec3 v, float s, vec3 dest) {
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
*
@@ -383,25 +198,6 @@ glm_vec_flipsign(vec3 v) {
v[2] = -v[2];
}
/*!
* @brief flip sign of all vec4 members
*
* @param[in, out] v vector
*/
CGLM_INLINE
void
glm_vec4_flipsign(vec4 v) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(v, _mm_xor_ps(_mm_load_ps(v),
_mm_set1_ps(-0.0f)));
#else
v[0] = -v[0];
v[1] = -v[1];
v[2] = -v[2];
v[3] = -v[3];
#endif
}
/*!
* @brief normalize vec3 and store result in same vec
*
@@ -422,26 +218,6 @@ glm_vec_normalize(vec3 v) {
glm_vec_scale(v, 1.0f / norm, v);
}
/*!
* @brief normalize vec4 and store result in same vec
*
* @param[in, out] v vector
*/
CGLM_INLINE
void
glm_vec4_normalize(vec4 v) {
float norm;
norm = glm_vec4_norm(v);
if (norm == 0.0f) {
v[0] = v[1] = v[2] = v[3] = 0.0f;
return;
}
glm_vec4_scale(v, 1.0f / norm, v);
}
/*!
* @brief normalize vec3 to dest
*
@@ -463,27 +239,6 @@ glm_vec_normalize_to(vec3 vec, vec3 dest) {
glm_vec_scale(vec, 1.0f / norm, dest);
}
/*!
* @brief normalize vec4 to dest
*
* @param[in] vec source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec4_normalize_to(vec4 vec, vec4 dest) {
float norm;
norm = glm_vec4_norm(vec);
if (norm == 0.0f) {
dest[0] = dest[1] = dest[2] = dest[3] = 0.0f;
return;
}
glm_vec4_scale(vec, 1.0f / norm, dest);
}
/*!
* @brief angle betwen two vector
*
@@ -609,20 +364,4 @@ glm_vec_distance(vec3 v1, vec3 v2) {
+ glm_pow2(v2[2] - v1[2]));
}
/**
* @brief distance between two vectors
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @return returns distance
*/
CGLM_INLINE
float
glm_vec4_distance(vec4 v1, vec4 v2) {
return sqrtf(glm_pow2(v2[0] - v1[0])
+ glm_pow2(v2[1] - v1[1])
+ glm_pow2(v2[2] - v1[2])
+ glm_pow2(v2[3] - v1[3]));
}
#endif /* cglm_vec_h */
#endif /* cglm_vec3_h */

View File

@@ -11,18 +11,6 @@
/*
Functions:
vec3:
CGLM_INLINE void glm_vec_mulv(vec3 a, vec3 b, vec3 d);
CGLM_INLINE void glm_vec_broadcast(float val, vec3 d);
CGLM_INLINE bool glm_vec_eq(vec3 v, float val);
CGLM_INLINE bool glm_vec_eq_eps(vec4 v, float val);
CGLM_INLINE bool glm_vec_eq_all(vec3 v);
CGLM_INLINE bool glm_vec_eqv(vec3 v1, vec3 v2);
CGLM_INLINE bool glm_vec_eqv_eps(vec3 v1, vec3 v2);
CGLM_INLINE float glm_vec_max(vec3 v);
CGLM_INLINE float glm_vec_min(vec3 v);
vec4:
CGLM_INLINE void glm_vec4_mulv(vec4 a, vec4 b, vec4 d);
CGLM_INLINE void glm_vec4_broadcast(float val, vec4 d);
CGLM_INLINE bool glm_vec4_eq(vec4 v, float val);
@@ -34,30 +22,14 @@
CGLM_INLINE float glm_vec4_min(vec4 v);
*/
#ifndef cglm_vec_ext_h
#define cglm_vec_ext_h
#ifndef cglm_vec4_ext_h
#define cglm_vec4_ext_h
#include "cglm-common.h"
#include "arch/simd/cglm-intrin.h"
#include "common.h"
#include <stdbool.h>
#include <math.h>
#include <float.h>
/*!
* @brief multiplies individual items, just for convenient like SIMD
*
* @param a vec1
* @param b vec2
* @param d vec3 = (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2])
*/
CGLM_INLINE
void
glm_vec_mulv(vec3 a, vec3 b, vec3 d) {
d[0] = a[0] * b[0];
d[1] = a[1] * b[1];
d[2] = a[2] * b[2];
}
/*!
* @brief multiplies individual items, just for convenient like SIMD
*
@@ -78,18 +50,6 @@ glm_vec4_mulv(vec4 a, vec4 b, vec4 d) {
#endif
}
/*!
* @brief fill a vector with specified value
*
* @param val value
* @param d dest
*/
CGLM_INLINE
void
glm_vec_broadcast(float val, vec3 d) {
d[0] = d[1] = d[2] = val;
}
/*!
* @brief fill a vector with specified value
*
@@ -106,71 +66,6 @@ glm_vec4_broadcast(float val, vec4 d) {
#endif
}
/*!
* @brief check if vector is equal to value (without epsilon)
*
* @param v vector
* @param val value
*/
CGLM_INLINE
bool
glm_vec_eq(vec3 v, float val) {
return v[0] == val && v[0] == v[1] && v[0] == v[2];
}
/*!
* @brief check if vector is equal to value (with epsilon)
*
* @param v vector
* @param val value
*/
CGLM_INLINE
bool
glm_vec_eq_eps(vec4 v, float val) {
return fabsf(v[0] - val) <= FLT_EPSILON
&& fabsf(v[1] - val) <= FLT_EPSILON
&& fabsf(v[2] - val) <= FLT_EPSILON;
}
/*!
* @brief check if vectors members are equal (without epsilon)
*
* @param v vector
*/
CGLM_INLINE
bool
glm_vec_eq_all(vec3 v) {
return v[0] == v[1] && v[0] == v[2];
}
/*!
* @brief check if vector is equal to another (without epsilon)
*
* @param v1 vector
* @param v2 vector
*/
CGLM_INLINE
bool
glm_vec_eqv(vec3 v1, vec3 v2) {
return v1[0] == v2[0]
&& v1[1] == v2[1]
&& v1[2] == v2[2];
}
/*!
* @brief check if vector is equal to another (with epsilon)
*
* @param v1 vector
* @param v2 vector
*/
CGLM_INLINE
bool
glm_vec_eqv_eps(vec3 v1, vec3 v2) {
return fabsf(v1[0] - v2[0]) <= FLT_EPSILON
&& fabsf(v1[1] - v2[1]) <= FLT_EPSILON
&& fabsf(v1[2] - v2[2]) <= FLT_EPSILON;
}
/*!
* @brief check if vector is equal to value (without epsilon)
*
@@ -244,44 +139,6 @@ glm_vec4_eqv_eps(vec3 v1, vec3 v2) {
&& fabsf(v1[3] - v2[3]) <= FLT_EPSILON;
}
/*!
* @brief max value of vector
*
* @param v vector
*/
CGLM_INLINE
float
glm_vec_max(vec3 v) {
float max;
max = v[0];
if (v[1] > max)
max = v[1];
if (v[2] > max)
max = v[2];
return max;
}
/*!
* @brief min value of vector
*
* @param v vector
*/
CGLM_INLINE
float
glm_vec_min(vec3 v) {
float min;
min = v[0];
if (v[1] < min)
min = v[1];
if (v[2] < min)
min = v[2];
return min;
}
/*!
* @brief max value of vector
*
@@ -316,4 +173,5 @@ glm_vec4_min(vec4 v) {
return min;
}
#endif /* cglm_vec_ext_h */
#endif /* cglm_vec4_ext_h */

285
include/cglm/vec4.h Normal file
View File

@@ -0,0 +1,285 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*!
* vec3 functions dont have suffix e.g glm_vec_dot (not glm_vec3_dot)
* all functions without suffix are vec3 functions
*/
/*
Macros:
glm_vec4_dup3(v, dest)
glm_vec4_dup(v, dest)
Functions:
CGLM_INLINE void glm_vec4_copy3(vec4 a, vec3 dest);
CGLM_INLINE void glm_vec4_copy(vec4 v, vec4 dest);
CGLM_INLINE float glm_vec4_dot(vec4 a, vec4 b);
CGLM_INLINE float glm_vec4_norm2(vec4 v);
CGLM_INLINE float glm_vec4_norm(vec4 vec);
CGLM_INLINE void glm_vec4_add(vec4 v1, vec4 v2, vec4 dest);
CGLM_INLINE void glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest);
CGLM_INLINE void glm_vec4_scale(vec4 v, float s, vec4 dest);
CGLM_INLINE void glm_vec4_scale_as(vec4 v, float s, vec4 dest);
CGLM_INLINE void glm_vec4_flipsign(vec4 v);
CGLM_INLINE void glm_vec4_normalize(vec4 v);
CGLM_INLINE void glm_vec4_normalize_to(vec4 vec, vec4 dest);
CGLM_INLINE float glm_vec4_distance(vec4 v1, vec4 v2);
*/
#ifndef cglm_vec4_h
#define cglm_vec4_h
#include "common.h"
#include "vec4-ext.h"
#include "util.h"
/* DEPRECATED! use _copy, _ucopy versions */
#define glm_vec4_dup3(v, dest) glm_vec4_copy3(v, dest)
#define glm_vec4_dup(v, dest) glm_vec4_copy(v, dest)
/*!
* @brief copy first 3 members of [a] to [dest]
*
* @param[in] a source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec4_copy3(vec4 a, vec3 dest) {
dest[0] = a[0];
dest[1] = a[1];
dest[2] = a[2];
}
/*!
* @brief copy all members of [a] to [dest]
*
* @param[in] v source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec4_copy(vec4 v, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(dest, _mm_load_ps(v));
#else
dest[0] = v[0];
dest[1] = v[1];
dest[2] = v[2];
dest[3] = v[3];
#endif
}
/*!
* @brief vec4 dot product
*
* @param[in] a vector1
* @param[in] b vector2
*
* @return dot product
*/
CGLM_INLINE
float
glm_vec4_dot(vec4 a, vec4 b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
}
/*!
* @brief norm * norm (magnitude) of vec
*
* we can use this func instead of calling norm * norm, because it would call
* sqrtf fuction twice but with this func we can avoid func call, maybe this is
* not good name for this func
*
* @param[in] v vec4
*
* @return norm * norm
*/
CGLM_INLINE
float
glm_vec4_norm2(vec4 v) {
return v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3];
}
/*!
* @brief norm (magnitude) of vec4
*
* @param[in] vec vector
*
* @return norm
*/
CGLM_INLINE
float
glm_vec4_norm(vec4 vec) {
return sqrtf(glm_vec4_norm2(vec));
}
/*!
* @brief add v2 vector to v1 vector store result in dest
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest destination vector
*/
CGLM_INLINE
void
glm_vec4_add(vec4 v1, vec4 v2, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(dest,
_mm_add_ps(_mm_load_ps(v1),
_mm_load_ps(v2)));
#else
dest[0] = v1[0] + v2[0];
dest[1] = v1[1] + v2[1];
dest[2] = v1[2] + v2[2];
dest[3] = v1[3] + v2[3];
#endif
}
/*!
* @brief subtract v2 vector from v1 vector store result in dest
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest destination vector
*/
CGLM_INLINE
void
glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(dest,
_mm_sub_ps(_mm_load_ps(v1),
_mm_load_ps(v2)));
#else
dest[0] = v1[0] - v2[0];
dest[1] = v1[1] - v2[1];
dest[2] = v1[2] - v2[2];
dest[3] = v1[3] - v2[3];
#endif
}
/*!
* @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 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 vec4 members
*
* @param[in, out] v vector
*/
CGLM_INLINE
void
glm_vec4_flipsign(vec4 v) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(v, _mm_xor_ps(_mm_load_ps(v),
_mm_set1_ps(-0.0f)));
#else
v[0] = -v[0];
v[1] = -v[1];
v[2] = -v[2];
v[3] = -v[3];
#endif
}
/*!
* @brief normalize vec4 and store result in same vec
*
* @param[in, out] v vector
*/
CGLM_INLINE
void
glm_vec4_normalize(vec4 v) {
float norm;
norm = glm_vec4_norm(v);
if (norm == 0.0f) {
v[0] = v[1] = v[2] = v[3] = 0.0f;
return;
}
glm_vec4_scale(v, 1.0f / norm, v);
}
/*!
* @brief normalize vec4 to dest
*
* @param[in] vec source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec4_normalize_to(vec4 vec, vec4 dest) {
float norm;
norm = glm_vec4_norm(vec);
if (norm == 0.0f) {
dest[0] = dest[1] = dest[2] = dest[3] = 0.0f;
return;
}
glm_vec4_scale(vec, 1.0f / norm, dest);
}
/**
* @brief distance between two vectors
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @return returns distance
*/
CGLM_INLINE
float
glm_vec4_distance(vec4 v1, vec4 v2) {
return sqrtf(glm_pow2(v2[0] - v1[0])
+ glm_pow2(v2[1] - v1[1])
+ glm_pow2(v2[2] - v1[2])
+ glm_pow2(v2[3] - v1[3]));
}
#endif /* cglm_vec4_h */