mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3a141b7cc8 | ||
|
|
5cd1a4ab44 | ||
|
|
897f2afd88 | ||
|
|
68e3a072e8 | ||
|
|
282ea84dc0 | ||
|
|
2d5506d15d | ||
|
|
87f561fb06 | ||
|
|
522b18bda9 | ||
|
|
b7178749ee | ||
|
|
98c708281f | ||
|
|
896ba0a0f9 | ||
|
|
4603816330 | ||
|
|
9f5cc3a745 | ||
|
|
bde653b607 | ||
|
|
ede72ca412 | ||
|
|
8e784e762f | ||
|
|
82d1050c63 | ||
|
|
0631598d08 |
@@ -1,5 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.8.2)
|
||||
project(cglm VERSION 0.8.4 LANGUAGES C)
|
||||
project(cglm VERSION 0.8.5 LANGUAGES C)
|
||||
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_C_STANDARD_REQUIRED YES)
|
||||
@@ -47,7 +47,10 @@ include(GNUInstallDirs)
|
||||
|
||||
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
||||
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
||||
include(CPack)
|
||||
|
||||
if(NOT CPack_CMake_INCLUDED)
|
||||
include(CPack)
|
||||
endif()
|
||||
|
||||
# Target Start
|
||||
add_library(${PROJECT_NAME}
|
||||
@@ -97,6 +100,12 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${PROJECT_VERSION_MAJOR})
|
||||
|
||||
if(WIN32)
|
||||
# Because SOVERSION has no effect to file naming on Windows
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
RUNTIME_OUTPUT_NAME ${PROJECT_NAME}-${PROJECT_VERSION_MAJOR})
|
||||
endif()
|
||||
|
||||
target_include_directories(${PROJECT_NAME}
|
||||
PUBLIC
|
||||
$<INSTALL_INTERFACE:include>
|
||||
@@ -122,7 +131,7 @@ install(TARGETS ${PROJECT_NAME}
|
||||
EXPORT ${PROJECT_NAME}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
|
||||
install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||
PATTERN ".*" EXCLUDE)
|
||||
@@ -143,6 +152,7 @@ set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
||||
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
|
||||
set(PACKAGE_VERSION "${PROJECT_VERSION}")
|
||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/cglm.pc.in ${CMAKE_BINARY_DIR}/cglm.pc @ONLY)
|
||||
|
||||
install(FILES ${CMAKE_BINARY_DIR}/cglm.pc
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#*****************************************************************************
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([cglm], [0.8.4], [info@recp.me])
|
||||
AC_INIT([cglm], [0.8.5], [info@recp.me])
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
|
||||
|
||||
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
|
||||
|
||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'0.8.4'
|
||||
version = u'0.8.5'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.8.4'
|
||||
release = u'0.8.5'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -149,6 +149,18 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_complex_mul(vec2 a, vec2 b, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_complex_div(vec2 a, vec2 b, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_complex_conjugate(vec2 a, vec2 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
#ifndef CGLM_USE_DEFAULT_EPSILON
|
||||
# ifndef GLM_FLT_EPSILON
|
||||
# define GLM_FLT_EPSILON 1e-6
|
||||
# define GLM_FLT_EPSILON 1e-5
|
||||
# endif
|
||||
#else
|
||||
# define GLM_FLT_EPSILON FLT_EPSILON
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#endif
|
||||
|
||||
#if defined(__SSE3__)
|
||||
# include <x86intrin.h>
|
||||
# include <pmmintrin.h>
|
||||
# ifndef CGLM_SIMD_x86
|
||||
# define CGLM_SIMD_x86
|
||||
# endif
|
||||
|
||||
@@ -195,4 +195,45 @@ glms_vec2_sqrt(vec2s v) {
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief treat vectors as complex numbers and multiply them as such.
|
||||
*
|
||||
* @param[in] a left number
|
||||
* @param[in] b right number
|
||||
* @param[out] dest destination number
|
||||
*/
|
||||
CGLM_INLINE
|
||||
vec2s
|
||||
glms_vec2_complex_mul(vec2s a, vec2s b, vec2s dest) {
|
||||
glm_vec2_complex_mul(a.raw, b.raw, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief treat vectors as complex numbers and divide them as such.
|
||||
*
|
||||
* @param[in] a left number (numerator)
|
||||
* @param[in] b right number (denominator)
|
||||
* @param[out] dest destination number
|
||||
*/
|
||||
CGLM_INLINE
|
||||
vec2s
|
||||
glms_vec2_complex_div(vec2s a, vec2s b, vec2s dest) {
|
||||
glm_vec2_complex_div(a.raw, b.raw, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief treat the vector as a complex number and conjugate it as such.
|
||||
*
|
||||
* @param[in] a the number
|
||||
* @param[out] dest destination number
|
||||
*/
|
||||
CGLM_INLINE
|
||||
vec2s
|
||||
glms_vec2_complex_conjugate(vec2s a, vec2s dest) {
|
||||
glm_vec2_complex_conjugate(a.raw, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
#endif /* cglms_vec2s_ext_h */
|
||||
|
||||
@@ -47,6 +47,21 @@ typedef union vec2s {
|
||||
float x;
|
||||
float y;
|
||||
};
|
||||
|
||||
struct {
|
||||
float r;
|
||||
float i;
|
||||
};
|
||||
|
||||
struct {
|
||||
float u;
|
||||
float v;
|
||||
};
|
||||
|
||||
struct {
|
||||
float s;
|
||||
float t;
|
||||
};
|
||||
#endif
|
||||
} vec2s;
|
||||
|
||||
@@ -58,9 +73,40 @@ typedef union vec3s {
|
||||
float y;
|
||||
float z;
|
||||
};
|
||||
|
||||
struct {
|
||||
float r;
|
||||
float g;
|
||||
float b;
|
||||
};
|
||||
#endif
|
||||
} vec3s;
|
||||
|
||||
typedef union ivec2s {
|
||||
ivec2 raw;
|
||||
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||
struct {
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
struct {
|
||||
int r;
|
||||
int i;
|
||||
};
|
||||
|
||||
struct {
|
||||
int u;
|
||||
int v;
|
||||
};
|
||||
|
||||
struct {
|
||||
int s;
|
||||
int t;
|
||||
};
|
||||
#endif
|
||||
} ivec2s;
|
||||
|
||||
typedef union ivec3s {
|
||||
ivec3 raw;
|
||||
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||
@@ -69,9 +115,34 @@ typedef union ivec3s {
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
|
||||
struct {
|
||||
int r;
|
||||
int g;
|
||||
int b;
|
||||
};
|
||||
#endif
|
||||
} ivec3s;
|
||||
|
||||
typedef union ivec4s {
|
||||
ivec4 raw;
|
||||
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||
struct {
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
int w;
|
||||
};
|
||||
|
||||
struct {
|
||||
int r;
|
||||
int g;
|
||||
int b;
|
||||
int a;
|
||||
};
|
||||
#endif
|
||||
} ivec4s;
|
||||
|
||||
typedef union CGLM_ALIGN_IF(16) vec4s {
|
||||
vec4 raw;
|
||||
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||
@@ -81,6 +152,13 @@ typedef union CGLM_ALIGN_IF(16) vec4s {
|
||||
float z;
|
||||
float w;
|
||||
};
|
||||
|
||||
struct {
|
||||
float r;
|
||||
float g;
|
||||
float b;
|
||||
float a;
|
||||
};
|
||||
#endif
|
||||
} vec4s;
|
||||
|
||||
|
||||
@@ -42,9 +42,12 @@
|
||||
#define CGLM_CASTPTR_ASSUME_ALIGNED(expr, type) \
|
||||
((type*)CGLM_ASSUME_ALIGNED((expr), __alignof__(type)))
|
||||
|
||||
typedef int ivec2[2];
|
||||
typedef int ivec3[3];
|
||||
typedef int ivec4[4];
|
||||
|
||||
typedef float vec2[2];
|
||||
typedef float vec3[3];
|
||||
typedef int ivec3[3];
|
||||
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
||||
typedef vec4 versor; /* |x, y, z, w| -> w is the last */
|
||||
typedef vec3 mat3[3];
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
CGLM_INLINE bool glm_vec2_isvalid(vec2 v);
|
||||
CGLM_INLINE void glm_vec2_sign(vec2 v, vec2 dest);
|
||||
CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest);
|
||||
CGLM_INLINE void glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest)
|
||||
CGLM_INLINE void glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest)
|
||||
CGLM_INLINE void glm_vec2_complex_conjugate(vec2 a, vec2 dest)
|
||||
*/
|
||||
|
||||
#ifndef cglm_vec2_ext_h
|
||||
@@ -186,4 +189,53 @@ glm_vec2_sqrt(vec2 v, vec2 dest) {
|
||||
dest[1] = sqrtf(v[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief treat vectors as complex numbers and multiply them as such.
|
||||
*
|
||||
* @param[in] a left number
|
||||
* @param[in] b right number
|
||||
* @param[out] dest destination number
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) {
|
||||
float tr, ti;
|
||||
tr = a[0] * b[0] - a[1] * b[1];
|
||||
ti = a[0] * b[1] + a[1] * b[0];
|
||||
dest[0] = tr;
|
||||
dest[1] = ti;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief treat vectors as complex numbers and divide them as such.
|
||||
*
|
||||
* @param[in] a left number (numerator)
|
||||
* @param[in] b right number (denominator)
|
||||
* @param[out] dest destination number
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) {
|
||||
float tr, ti;
|
||||
float const ibnorm2 = 1.0f / (b[0] * b[0] + b[1] * b[1]);
|
||||
tr = ibnorm2 * (a[0] * b[0] + a[1] * b[1]);
|
||||
ti = ibnorm2 * (a[1] * b[0] - a[0] * b[1]);
|
||||
dest[0] = tr;
|
||||
dest[1] = ti;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief treat the vector as a complex number and conjugate it as such.
|
||||
*
|
||||
* @param[in] a the number
|
||||
* @param[out] dest destination number
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec2_complex_conjugate(vec2 a, vec2 dest) {
|
||||
dest[0] = a[0];
|
||||
dest[1] = -a[1];
|
||||
}
|
||||
|
||||
|
||||
#endif /* cglm_vec2_ext_h */
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
|
||||
#define CGLM_VERSION_MAJOR 0
|
||||
#define CGLM_VERSION_MINOR 8
|
||||
#define CGLM_VERSION_PATCH 4
|
||||
#define CGLM_VERSION_PATCH 5
|
||||
|
||||
#endif /* cglm_version_h */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
project('cglm', 'c',
|
||||
version : '0.8.4',
|
||||
version : '0.8.5',
|
||||
license : 'mit',
|
||||
default_options : [
|
||||
'c_std=c11',
|
||||
|
||||
18
src/vec2.c
18
src/vec2.c
@@ -211,3 +211,21 @@ void
|
||||
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) {
|
||||
glm_vec2_lerp(from, to, t, dest);
|
||||
}
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) {
|
||||
glm_vec2_complex_mul(a, b, dest);
|
||||
}
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_complex_div(vec2 a, vec2 b, vec2 dest) {
|
||||
glm_vec2_complex_div(a, b, dest);
|
||||
}
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_complex_conjugate(vec2 a, vec2 dest) {
|
||||
glm_vec2_complex_conjugate(a, dest);
|
||||
}
|
||||
|
||||
@@ -594,3 +594,32 @@ TEST_IMPL(GLM_PREFIX, vec2_lerp) {
|
||||
|
||||
TEST_SUCCESS
|
||||
}
|
||||
|
||||
TEST_IMPL(GLM_PREFIX, vec2_complex_mul) {
|
||||
vec2 v1 = { 3.0f, 5.0f },
|
||||
v2 = { 7.0f, 11.0f },
|
||||
v3 = { cosf(M_PI/4.0f), sinf(M_PI/4.0f) };
|
||||
|
||||
GLM(vec2_complex_mul)(v1, v2, v2);
|
||||
ASSERTIFY(test_assert_vec2_eq(v2, (vec2){ -34, 68 }))
|
||||
|
||||
GLM(vec2_complex_mul)(v3, v3, v3);
|
||||
ASSERTIFY(test_assert_vec2_eq(v3, (vec2){ 0.0f, 1.0f }))
|
||||
|
||||
TEST_SUCCESS
|
||||
}
|
||||
|
||||
TEST_IMPL(GLM_PREFIX, vec2_complex_div) {
|
||||
vec2 v1 = { -34.0f, 68.0f },
|
||||
v2 = { 3.0f, 5.0f },
|
||||
v3 = { cosf(M_PI/4.0f), sinf(M_PI/4.0f) },
|
||||
v4 = { cosf(M_PI/4.0f), -sinf(M_PI/4.0f) };
|
||||
|
||||
GLM(vec2_complex_div)(v1, v2, v2);
|
||||
ASSERTIFY(test_assert_vec2_eq(v2, (vec2){ 7.0f, 11.0f }))
|
||||
|
||||
GLM(vec2_complex_div)(v3, v4, v4);
|
||||
ASSERTIFY(test_assert_vec2_eq(v4, (vec2){ 0.0f, 1.0f }))
|
||||
|
||||
TEST_SUCCESS
|
||||
}
|
||||
|
||||
@@ -382,6 +382,8 @@ TEST_DECLARE(glm_vec2_maxv)
|
||||
TEST_DECLARE(glm_vec2_minv)
|
||||
TEST_DECLARE(glm_vec2_clamp)
|
||||
TEST_DECLARE(glm_vec2_lerp)
|
||||
TEST_DECLARE(glm_vec2_complex_mul)
|
||||
TEST_DECLARE(glm_vec2_complex_div)
|
||||
|
||||
|
||||
TEST_DECLARE(glmc_vec2)
|
||||
@@ -418,6 +420,8 @@ TEST_DECLARE(glmc_vec2_maxv)
|
||||
TEST_DECLARE(glmc_vec2_minv)
|
||||
TEST_DECLARE(glmc_vec2_clamp)
|
||||
TEST_DECLARE(glmc_vec2_lerp)
|
||||
TEST_DECLARE(glmc_vec2_complex_mul)
|
||||
TEST_DECLARE(glmc_vec2_complex_div)
|
||||
|
||||
/* vec3 */
|
||||
TEST_DECLARE(MACRO_GLM_VEC3_ONE_INIT)
|
||||
@@ -1112,6 +1116,8 @@ TEST_LIST {
|
||||
TEST_ENTRY(glm_vec2_minv)
|
||||
TEST_ENTRY(glm_vec2_clamp)
|
||||
TEST_ENTRY(glm_vec2_lerp)
|
||||
TEST_ENTRY(glm_vec2_complex_mul)
|
||||
TEST_ENTRY(glm_vec2_complex_div)
|
||||
|
||||
TEST_ENTRY(glmc_vec2)
|
||||
TEST_ENTRY(glmc_vec2_copy)
|
||||
@@ -1147,6 +1153,8 @@ TEST_LIST {
|
||||
TEST_ENTRY(glmc_vec2_minv)
|
||||
TEST_ENTRY(glmc_vec2_clamp)
|
||||
TEST_ENTRY(glmc_vec2_lerp)
|
||||
TEST_ENTRY(glmc_vec2_complex_mul)
|
||||
TEST_ENTRY(glmc_vec2_complex_div)
|
||||
|
||||
/* vec3 */
|
||||
/* Macros */
|
||||
|
||||
Reference in New Issue
Block a user