mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec852c7682 | ||
|
|
5433c9ed6c | ||
|
|
2a2d51624b | ||
|
|
5fa908602f | ||
|
|
9da74f9654 | ||
|
|
dddb077b13 | ||
|
|
6107287c9a | ||
|
|
7dccbef6e3 | ||
|
|
d920a62be2 | ||
|
|
73f32b9ef7 | ||
|
|
2e5257bcc1 | ||
|
|
65b0b461ab | ||
|
|
e34601f578 | ||
|
|
fa01a3077b | ||
|
|
54f805a62d | ||
|
|
a05b282fad |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -75,3 +75,4 @@ Default-568h@2x.png
|
||||
build/
|
||||
conftest.dir/*
|
||||
confdefs.h
|
||||
*.xcuserdatad
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.8.2)
|
||||
project(cglm VERSION 0.7.8 LANGUAGES C)
|
||||
project(cglm VERSION 0.7.9 LANGUAGES C)
|
||||
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_C_STANDARD_REQUIRED YES)
|
||||
|
||||
5
CREDITS
5
CREDITS
@@ -70,4 +70,7 @@ Möller–Trumbore ray-triangle intersection algorithm, from "Fast, Minimum Stor
|
||||
Authors:
|
||||
Thomas Möller (tompa@clarus.se)
|
||||
Ben Trumbore (wbt@graphics.cornell.edu)
|
||||
Link to paper: http://webserver2.tecgraf.puc-rio.br/~mgattass/cg/trbRR/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf
|
||||
Link to paper: http://webserver2.tecgraf.puc-rio.br/~mgattass/cg/trbRR/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf
|
||||
|
||||
14. ARM NEON: Matrix Vector Multiplication
|
||||
https://stackoverflow.com/a/57793352/2676533
|
||||
|
||||
44
Package.swift
Normal file
44
Package.swift
Normal file
@@ -0,0 +1,44 @@
|
||||
// swift-tools-version:5.2
|
||||
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "cglm",
|
||||
products: [
|
||||
.library(name: "cglm", type: .static, targets: ["cglmHeader"]),
|
||||
.library(name: "cglmc", targets: ["cglmCompiled"]),
|
||||
],
|
||||
dependencies: [],
|
||||
targets: [
|
||||
.target(
|
||||
name: "cglmCompiled",
|
||||
path: "./",
|
||||
exclude: [
|
||||
"./docs",
|
||||
"./src/swift",
|
||||
"./include",
|
||||
"./test",
|
||||
"./win",
|
||||
],
|
||||
sources: [
|
||||
"./src",
|
||||
],
|
||||
publicHeadersPath: "./include"
|
||||
),
|
||||
.target(
|
||||
name: "cglmHeader",
|
||||
path: "./",
|
||||
exclude: [
|
||||
"./docs",
|
||||
"./include",
|
||||
"./test",
|
||||
"./win",
|
||||
],
|
||||
sources: [
|
||||
"./src/swift",
|
||||
],
|
||||
publicHeadersPath: "./include"
|
||||
),
|
||||
],
|
||||
cLanguageStandard: .c11
|
||||
)
|
||||
32
README.md
32
README.md
@@ -212,6 +212,38 @@ cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
|
||||
executable('exe', 'src/main.c', dependencies : cglm_dep)
|
||||
```
|
||||
|
||||
### Swift (Swift Package Manager)
|
||||
|
||||
Currently only default build options are supported. Add **cglm** dependency to your project:
|
||||
|
||||
```swift
|
||||
...
|
||||
Package(
|
||||
...
|
||||
dependencies: [
|
||||
...
|
||||
.package(url: "https://github.com/recp/cglm", .branch("master")),
|
||||
]
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
Now add **cgml** as a dependency to your target. Product choices are:
|
||||
- **cglm** for inlined version of the library which can be linked only statically
|
||||
- **cglmc** for a compiled version of the library with no linking limitation
|
||||
|
||||
```swift
|
||||
...
|
||||
.target(
|
||||
...
|
||||
dependencies: [
|
||||
...
|
||||
.product(name: "cglm", package: "cglm"),
|
||||
]
|
||||
...
|
||||
)
|
||||
...
|
||||
```
|
||||
|
||||
### Unix (Autotools)
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#*****************************************************************************
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([cglm], [0.7.8], [info@recp.me])
|
||||
AC_INIT([cglm], [0.7.9], [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.7.8'
|
||||
version = u'0.7.9'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.7.8'
|
||||
release = u'0.7.9'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -55,12 +55,12 @@ Functions:
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_vec2(vec4 v4, vec2 dest)
|
||||
.. c:function:: void glm_vec2(float \*v, vec2 dest)
|
||||
|
||||
init vec2 using vec3
|
||||
init vec2 using vec3 or vec4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v3** vector3
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec2_copy(vec2 a, vec2 dest)
|
||||
|
||||
@@ -358,6 +358,8 @@ void
|
||||
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mat4_mulv_sse2(m, v, dest);
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
glm_mat4_mulv_neon(m, v, dest);
|
||||
#else
|
||||
vec4 res;
|
||||
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3];
|
||||
@@ -476,6 +478,8 @@ void
|
||||
glm_mat4_transpose_to(mat4 m, mat4 dest) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mat4_transp_sse2(m, dest);
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
glm_mat4_transp_neon(m, dest);
|
||||
#else
|
||||
dest[0][0] = m[0][0]; dest[1][0] = m[0][1];
|
||||
dest[0][1] = m[1][0]; dest[1][1] = m[1][1];
|
||||
@@ -498,6 +502,8 @@ void
|
||||
glm_mat4_transpose(mat4 m) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mat4_transp_sse2(m, m);
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
glm_mat4_transp_neon(m, m);
|
||||
#else
|
||||
mat4 d;
|
||||
glm_mat4_transpose_to(m, d);
|
||||
@@ -536,12 +542,7 @@ glm_mat4_scale(mat4 m, float s) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mat4_scale_sse2(m, s);
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
float32x4_t v0;
|
||||
v0 = vdupq_n_f32(s);
|
||||
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), v0));
|
||||
vst1q_f32(m[1], vmulq_f32(vld1q_f32(m[1]), v0));
|
||||
vst1q_f32(m[2], vmulq_f32(vld1q_f32(m[2]), v0));
|
||||
vst1q_f32(m[3], vmulq_f32(vld1q_f32(m[3]), v0));
|
||||
glm_mat4_scale_neon(m, s);
|
||||
#else
|
||||
glm_mat4_scale_p(m, s);
|
||||
#endif
|
||||
|
||||
@@ -12,6 +12,32 @@
|
||||
#include "../../common.h"
|
||||
#include "../intrin.h"
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_scale_neon(mat4 m, float s) {
|
||||
float32x4_t v0;
|
||||
|
||||
v0 = vdupq_n_f32(s);
|
||||
|
||||
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), v0));
|
||||
vst1q_f32(m[1], vmulq_f32(vld1q_f32(m[1]), v0));
|
||||
vst1q_f32(m[2], vmulq_f32(vld1q_f32(m[2]), v0));
|
||||
vst1q_f32(m[3], vmulq_f32(vld1q_f32(m[3]), v0));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_transp_neon(mat4 m, mat4 dest) {
|
||||
float32x4x4_t vmat;
|
||||
|
||||
vmat = vld4q_f32(m[0]);
|
||||
|
||||
vst1q_f32(dest[0], vmat.val[0]);
|
||||
vst1q_f32(dest[1], vmat.val[1]);
|
||||
vst1q_f32(dest[2], vmat.val[2]);
|
||||
vst1q_f32(dest[3], vmat.val[3]);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
||||
@@ -53,5 +79,27 @@ glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
||||
vst1q_f32(dest[3], d3);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_mulv_neon(mat4 m, vec4 v, vec4 dest) {
|
||||
float32x4_t l0, l1, l2, l3;
|
||||
float32x2_t vlo, vhi;
|
||||
|
||||
l0 = vld1q_f32(m[0]);
|
||||
l1 = vld1q_f32(m[1]);
|
||||
l2 = vld1q_f32(m[2]);
|
||||
l3 = vld1q_f32(m[3]);
|
||||
|
||||
vlo = vld1_f32(&v[0]);
|
||||
vhi = vld1_f32(&v[2]);
|
||||
|
||||
l0 = vmulq_lane_f32(l0, vlo, 0);
|
||||
l0 = vmlaq_lane_f32(l0, l1, vlo, 1);
|
||||
l0 = vmlaq_lane_f32(l0, l2, vhi, 0);
|
||||
l0 = vmlaq_lane_f32(l0, l3, vhi, 1);
|
||||
|
||||
vst1q_f32(dest, l0);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* cglm_mat4_neon_h */
|
||||
|
||||
@@ -175,7 +175,7 @@ glmm_load3(float v[3]) {
|
||||
__m128i xy;
|
||||
__m128 z;
|
||||
|
||||
xy = _mm_loadl_epi64((const __m128i *)v);
|
||||
xy = _mm_loadl_epi64(CGLM_CASTPTR_ASSUME_ALIGNED(v, const __m128i));
|
||||
z = _mm_load_ss(&v[2]);
|
||||
|
||||
return _mm_movelh_ps(_mm_castsi128_ps(xy), z);
|
||||
@@ -184,7 +184,7 @@ glmm_load3(float v[3]) {
|
||||
static inline
|
||||
void
|
||||
glmm_store3(float v[3], __m128 vx) {
|
||||
_mm_storel_pi((__m64 *)&v[0], vx);
|
||||
_mm_storel_pi(CGLM_CASTPTR_ASSUME_ALIGNED(v, __m64), vx);
|
||||
_mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2));
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,16 @@
|
||||
# define CGLM_ALIGN_MAT CGLM_ALIGN(16)
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
# define CGLM_ASSUME_ALIGNED(expr, alignment) \
|
||||
__builtin_assume_aligned((expr), (alignment))
|
||||
#else
|
||||
# define CGLM_ASSUME_ALIGNED(expr, alignment) (expr)
|
||||
#endif
|
||||
|
||||
#define CGLM_CASTPTR_ASSUME_ALIGNED(expr, type) \
|
||||
((type*)CGLM_ASSUME_ALIGNED((expr), __alignof__(type)))
|
||||
|
||||
typedef float vec2[2];
|
||||
typedef float vec3[3];
|
||||
typedef int ivec3[3];
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
|
||||
#define CGLM_VERSION_MAJOR 0
|
||||
#define CGLM_VERSION_MINOR 7
|
||||
#define CGLM_VERSION_PATCH 8
|
||||
#define CGLM_VERSION_PATCH 9
|
||||
|
||||
#endif /* cglm_version_h */
|
||||
|
||||
14
include/module.modulemap
Normal file
14
include/module.modulemap
Normal file
@@ -0,0 +1,14 @@
|
||||
module cglm {
|
||||
header "cglm/cglm.h"
|
||||
header "cglm/struct.h"
|
||||
|
||||
export *
|
||||
}
|
||||
|
||||
module cglmc {
|
||||
header "cglm/cglm.h"
|
||||
header "cglm/struct.h"
|
||||
header "cglm/call.h"
|
||||
|
||||
export *
|
||||
}
|
||||
29
meson.build
29
meson.build
@@ -1,5 +1,5 @@
|
||||
project('cglm', 'c',
|
||||
version : '0.7.8',
|
||||
version : '0.7.9',
|
||||
license : 'mit',
|
||||
default_options : [
|
||||
'c_std=c11',
|
||||
@@ -11,6 +11,7 @@ project('cglm', 'c',
|
||||
|
||||
cc = meson.get_compiler('c')
|
||||
|
||||
cglm_install = get_option('install')
|
||||
cglm_deps = cc.find_library('m', required : false)
|
||||
|
||||
cglm_args = []
|
||||
@@ -50,11 +51,9 @@ cglm_src = files(
|
||||
'src/vec4.c'
|
||||
)
|
||||
|
||||
install_subdir('include/cglm', install_dir : get_option('includedir'))
|
||||
|
||||
cglm_lib = library('cglm',
|
||||
cglm_src,
|
||||
install : true,
|
||||
install : cglm_install,
|
||||
dependencies : cglm_deps,
|
||||
c_args : [ build_args, cglm_args ]
|
||||
)
|
||||
@@ -71,17 +70,19 @@ if meson.version().version_compare('>= 0.54.0')
|
||||
meson.override_dependency('cglm', cglm_dep)
|
||||
endif
|
||||
|
||||
if cglm_install
|
||||
install_subdir('include/cglm', install_dir : get_option('includedir'))
|
||||
|
||||
pkg = import('pkgconfig')
|
||||
|
||||
pkg.generate(
|
||||
name : 'cglm',
|
||||
libraries : cglm_lib,
|
||||
extra_cflags : cglm_args,
|
||||
version : meson.project_version(),
|
||||
url : 'https://github.com/recp/cglm',
|
||||
description : 'OpenGL Mathematics (glm) for C'
|
||||
)
|
||||
pkg = import('pkgconfig')
|
||||
pkg.generate(
|
||||
name : 'cglm',
|
||||
libraries : cglm_lib,
|
||||
extra_cflags : cglm_args,
|
||||
version : meson.project_version(),
|
||||
url : 'https://github.com/recp/cglm',
|
||||
description : 'OpenGL Mathematics (glm) for C'
|
||||
)
|
||||
endif
|
||||
|
||||
if get_option('build_tests') == true
|
||||
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
option('build_tests', type : 'boolean', value : false, description : 'Build tests')
|
||||
option('build_tests', type : 'boolean', value : false, description : 'Build tests')
|
||||
option('install', type : 'boolean', value : true, description : 'Include the library, headers, and pkg-config file in the install target')
|
||||
|
||||
1
src/swift/empty.c
Normal file
1
src/swift/empty.c
Normal file
@@ -0,0 +1 @@
|
||||
// This empty file is needed to trick swiftpm to build the header-only version of cglm as swiftpm itself does not support C targets that have no source code files
|
||||
Reference in New Issue
Block a user