Compare commits

..

77 Commits

Author SHA1 Message Date
Recep Aslantas
3f616ce6a3 update version 2017-12-27 16:32:49 +03:00
Recep Aslantas
35d078a1ed avoid using far and near names because windows uses it as macro!!! 2017-12-27 16:31:26 +03:00
Recep Aslantas
034371c689 Merge pull request #11 from winduptoy/master
Fixed GLM_QUAT_IDENTITY_INIT (wxyz) instead of (xyzw). Addresses #10.
2017-12-26 17:44:03 +03:00
Matt Reyer
b797863ba3 Fixed GLM_QUAT_IDENTITY_INIT (wxyz) instead of (xyzw). Addresses #10. 2017-12-26 08:51:21 -05:00
Recep Aslantas
63eaee5049 vec: implement min and max 2017-12-17 16:55:04 +03:00
Recep Aslantas
ef0dd289bb update version 2017-12-17 15:56:16 +03:00
Recep Aslantas
4052943a0d matrix: make accurate inv version default
* now the glm_mat4_inv_precise is deault, because I don't think all people are aware of this func
* the old behavior (fast) replaced with new func: glm_mat4_inv_fast

if fast version is desired then glm_mat4_inv_fast must be used.
2017-12-17 15:49:00 +03:00
Recep Aslantas
33fefb9454 ci, travis: fix coveralls installation 2017-12-07 20:57:53 +03:00
Recep Aslantas
008de93d03 decompose projection matrix into near, far, left, right, top and bottom 2017-11-24 11:07:26 +03:00
Recep Aslantas
171668085d fix decompose near / far values from projection 2017-11-23 17:44:51 +03:00
Recep Aslantas
1907ba1046 decompose perspective near and far values 2017-11-23 17:16:29 +03:00
Recep Aslantas
39e1c35c79 convenient macros for UP vector for lookAt 2017-11-22 10:44:17 +03:00
Recep Aslantas
be605e6100 update ignore file 2017-11-22 10:42:01 +03:00
Recep Aslantas
b8897befa6 test: fix mat4 tests 2017-11-18 11:38:13 +03:00
Recep Aslantas
1b872375ab test: fix generating random matrix 2017-11-17 20:57:36 +03:00
Recep Aslantas
c998ec13d8 test: fix comparing matrix results 2017-11-17 19:05:33 +03:00
Recep Aslantas
b9c135baf2 test: fix generating random matrix
* use affine matrix for testing
2017-11-17 18:50:24 +03:00
Recep Aslantas
efb37ab0f7 vec: helper / special macros for initializing white and black colors 2017-11-11 15:51:17 +03:00
Recep Aslantas
b4cfc2a84a Merge branch 'master' of https://github.com/recp/cglm 2017-10-27 00:21:11 +03:00
Recep Aslantas
9fe48b34a7 inverse (opposite) of vectors 2017-10-27 00:20:41 +03:00
Recep Aslantas
8955a22059 Merge pull request #8 from smx-smx/master
Fixed missing alignment on MinGW + GCC
2017-08-26 23:42:09 +03:00
smx-smx
02ec0a1948 Fixed missing alignment on MinGW + GCC 2017-08-26 21:04:06 +02:00
Recep Aslantas
48977a012b test: add some tests for mat4 2017-07-12 20:46:05 +03:00
Recep Aslantas
208c1d92f2 Update README.md 2017-07-11 18:37:21 +03:00
Recep Aslantas
9d61668e04 re-organise files, remove cglm prefix from file to make them more clean 2017-07-11 18:05:10 +03:00
Recep Aslantas
3b159cdf02 neon: implement matrix multiplication for ARM Neon 2017-07-11 16:33:41 +03:00
Recep Aslantas
46303a2fb1 define common SIMD flags in common header 2017-07-11 16:31:55 +03:00
Recep Aslantas
a55b0ab5db re-organise test structure 2017-07-11 12:30:02 +03:00
Recep Aslantas
71d731173a fix parameter docs 2017-07-06 17:00:04 +03:00
Recep Aslantas
abbb8de0e3 Create CONTRIBUTING.md 2017-07-04 15:45:01 +03:00
Recep Aslantas
56f84f0d49 add function, type and macros in header to top of header 2017-06-27 12:17:03 +03:00
Recep Aslantas
f6959b99c6 fix pre-compiled vector header and suppress warnings 2017-06-15 20:06:00 +03:00
Recep Aslantas
991833ab77 fix precise matrix inv 2017-06-15 19:56:51 +03:00
Recep Aslantas
95cedccbd0 fix ending statement 2017-06-15 19:53:49 +03:00
Recep Aslantas
50b8b18560 add guard to SIMD header 2017-06-15 19:51:44 +03:00
Recep Aslantas
877f1d04bb suppress "Possible misuse of comma operator" warnings 2017-06-15 19:50:12 +03:00
Recep Aslantas
237e91fcad update README 2017-06-13 21:06:16 +03:00
Recep Aslantas
30ef6d93aa doc: getting started 2017-06-11 17:44:42 +03:00
Recep Aslantas
cfdb86b5fc add epsilon version to compare vector with vector( or with value ) 2017-06-11 16:53:18 +03:00
Recep Aslantas
1e32edea65 docs: building cglm 2017-06-06 22:55:52 +03:00
Recep Aslantas
3fbf590d39 func for make matrix identity 2017-05-29 20:52:38 +03:00
Recep Aslantas
3728102644 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
2017-05-21 21:34:50 +03:00
Recep Aslantas
eafcd1d103 improve and add comments to matrix decompositions 2017-05-21 20:48:17 +03:00
Recep Aslantas
ed5ffc43cb optimize projection functions 2017-05-21 19:30:38 +03:00
Recep Aslantas
e47cc22300 build: fix make install include path
* now we can include library headers like this: #include <cglm/cglm.h>
2017-05-21 13:39:38 +03:00
Recep Aslantas
8aa80d3e9b win: add version header to project 2017-05-21 12:36:31 +03:00
Recep Aslantas
f90d3f5faf add removed functions as macro as DEPRECATED 2017-05-21 12:28:06 +03:00
Recep Aslantas
02513b77c1 add version info 2017-05-21 01:31:25 +03:00
Recep Aslantas
fb444203b6 fix inlining exported function 2017-05-21 01:29:10 +03:00
Recep Aslantas
38632b2dd4 Update README.md 2017-05-21 00:34:56 +03:00
Recep Aslantas
1214a566b6 translate and scale make util 2017-05-15 22:27:20 +03:00
Recep Aslantas
41c874aa97 fix linking test lib 2017-04-25 23:56:58 +03:00
Recep Aslantas
38be538342 test: test mat4_mul 2017-04-25 23:27:15 +03:00
Recep Aslantas
4d55510ff0 ignore: ignore test files 2017-04-25 23:25:10 +03:00
Recep Aslantas
e789186889 zero initializer for matrix 2017-04-25 23:22:29 +03:00
Recep Aslantas
24b9992f19 deps: add cmocka as submodule for unit testing 2017-04-22 16:56:16 +03:00
Recep Aslantas
e7f35704ca fix identity quat initialization for C++ / Windows 2017-04-22 15:57:08 +03:00
Recep Aslantas
24ab1ff621 add badges to README 2017-04-22 15:39:08 +03:00
Recep Aslantas
f1b55589ac ci: fix build script for travis ci 2017-04-22 15:29:08 +03:00
Recep Aslantas
ef5a8549e2 add missing file for windows 2017-04-22 15:20:38 +03:00
Recep Aslantas
d5371f10a1 ci: set appveyor image 2017-04-22 15:17:36 +03:00
Recep Aslantas
cab370d1c7 ci: add travis and appveyor 2017-04-22 15:02:12 +03:00
Recep Aslantas
76107064d7 add build instructions for Windows 2017-04-22 14:59:18 +03:00
Recep Aslantas
12ea809e0a enable code analysis for windows 2017-04-22 14:59:18 +03:00
Recep Aslantas
e2fcf80e48 build for windows (dll) 2017-04-22 14:59:18 +03:00
Recep Aslantas
8a34e74b87 Add TODO list to README 2017-04-21 00:38:00 +03:00
Recep Aslantas
33770b9181 add missing docs to vector header 2017-04-15 02:08:43 +03:00
Recep Aslantas
cb6d5c1f7e center point of to vectors 2017-04-15 02:05:06 +03:00
Recep Aslantas
4ffc01655e optimize quat to matrix 2017-04-10 19:52:08 +03:00
Recep Aslantas
25feab7860 use multiplication instead of division for 1 / 2 2017-04-10 18:52:32 +03:00
Recep Aslantas
bf18ca647e distance between two vectors 2017-04-09 21:14:26 +03:00
Recep Aslantas
86c585b9e5 vec-ext: fix vec4 min 2017-03-23 19:34:51 +03:00
Recep Aslantas
d6cae07602 vec-ext: fix vec param type 2017-03-23 19:34:36 +03:00
Recep Aslantas
ba0973054e styles 2017-02-27 16:54:59 +03:00
Recep Aslantas
ec371099bc doc: add documentations to view, projection functions 2017-02-27 16:48:10 +03:00
Recep Aslantas
a3b66f5b4c drop platform (OpenGL) specific codes 2017-02-27 16:30:32 +03:00
Recep Aslantas
4462a84f4a rename _dup (duplicate) to _copy
I think _copy is better and COMMON  name for duplicating/copying
vector, matrices
2017-02-23 09:57:28 +03:00
79 changed files with 3576 additions and 1057 deletions

14
.gitignore vendored
View File

@@ -41,10 +41,22 @@ packages/
.anjuta/*
*.anjuta*
config.h.*
config.h
/config.h
stamp*
COPYING
.idea/*
*.VC.db
cscope.*
*-git-ignored-file.*
test/*.trs
test/test_*
*.log
test-*
test/.libs/*
test/tests
cglm_arm/*
cglm_test_ios/*
cglm_test_iosTests/*
docs/build/*
win/cglm_test_*
* copy.*

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "test/lib/cmocka"]
path = test/lib/cmocka
url = git://git.cryptomilk.org/projects/cmocka.git

59
.travis.yml Normal file
View File

@@ -0,0 +1,59 @@
language: c
os:
- linux
- osx
sudo: required
dist: trusty
compiler:
- clang
- gcc
matrix:
fast_finish: true
exclude:
# Skip GCC builds on macOS.
- os: osx
compiler: gcc
include:
# Additional GCC builds for code coverage.
- os: linux
compiler: gcc
env: CODE_COVERAGE=ON
cache:
apt: true
addons:
apt:
packages:
- clang-3.6
- lcov
branches:
only:
- master
script:
- sh ./build-deps.sh
- sh ./autogen.sh
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
./configure CFLAGS="-ftest-coverage -fprofile-arcs";
else
./configure;
fi
- make
- make check
after_success:
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
pip install --user cpp-coveralls
coveralls
--build-root .
--exclude lib
--exclude test
--gcov-options '\-lp'
--verbose;
fi

53
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,53 @@
# CONTRIBUTING
Any contributions (code, documentation, ...) are welcome. This project uses [cmocka](http://cmocka.org) for testing, you may need to check their documentation
# New Features
- This library may not accept all new features, it is better to create an issue and get approval before coding
- You must add test for every new feature
- The feature must be compiled in both UNIX/POSIX systems (e.g. macos, linux...) and Windows
# Code Style
This library is written with C99, don't try to add C++ files (yes it can compiled into lib),
if you have enough reason to add C++ files than create an issue and get approval before coding,
- All functions must have `glm` prefix
- Lines should be wrapped at 80 characters.
- Don't invent new style for existing ones
- Use C89 style comments (`/* comments */`) not C++ style comments (`// comments`)
- Don't use TABs instead use 2 spaces for TABs
- All indents must be 2 spaces, not 1 nor 4 space
- All functions in `include` folder must be exported by `CGLM_EXPORT` and wrapped by `extern "C" {` for C++
- Crate new line for return type, attribs:
```C
CGLM_INLINE
void
glm_mul(mat4 m1, mat4 m2, mat4 dest)
```
not acceptable:
```C
CGLM_INLINE void glm_mul(mat4 m1, mat4 m2, mat4 dest)
```
- Variables must be declared at the top of a scope before usage:
```C
int x;
int y;
x = y = 0;
```
not acceptable:
```C
int x;
x = 0;
int y = 0;
```
- All files must retain same LICENSE statement
- Code with warnings will not be accepted, please suppress them (not by disabling them)
- Run code anaylysis before submitting pull requests, if you use Xcode you can enable Sanitizer in scheme, you can use valgrind in linux

View File

@@ -1,7 +1,22 @@
# 🎥 OpenGL Mathematics (glm) for `C`
[![Build Status](https://travis-ci.org/recp/cglm.svg?branch=master)](https://travis-ci.org/recp/cglm)
[![Build status](https://ci.appveyor.com/api/projects/status/av7l3gc0yhfex8y4/branch/master?svg=true)](https://ci.appveyor.com/project/recp/cglm/branch/master)
[![Coverage Status](https://coveralls.io/repos/github/recp/cglm/badge.svg?branch=master)](https://coveralls.io/github/recp/cglm?branch=master)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/6a62b37d5f214f178ebef269dc4a6bf1)](https://www.codacy.com/app/recp/cglm?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=recp/cglm&amp;utm_campaign=Badge_Grade)
The original glm library is for C++ only (templates, namespaces, classes...), this library targeted to C99 but currently you can use it for C89 safely by language extensions e.g `__register`
#### Documentation
Almost all functions (inline versions) and parameters are documented inside related headers. <br />
Complete documentation is in progress: http://cglm.readthedocs.io
#### Note for previous versions:
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec_copy`
- OpenGL related functions are dropped to make this lib platform/third-party independent
- make sure you have latest version and feel free to report bugs, troubles
#### Note for C++ developers:
If you don't aware about original GLM library yet, you may also want to look at:
https://github.com/g-truc/glm
@@ -22,7 +37,7 @@ https://github.com/g-truc/glm
</tbody>
</table>
##Features
## Features
- general purpose matrix operations (mat4, mat3)
- chain matrix multiplication (square only)
- general purpose vector operations (cross, dot, rotate, proj, angle...)
@@ -39,12 +54,12 @@ https://github.com/g-truc/glm
<hr />
You have two option to call a function/operation: inline or library call (link)
Almost all functions are marked inline (always_inline) so compiler probably will inline.
To call pre-compiled version, just use `glmc_` (c stands for 'call') instead of `glm_`.
Almost all functions are marked inline (always_inline) so compiler probably will inline.
To call pre-compiled version, just use `glmc_` (c stands for 'call') instead of `glm_`.
```C
#include <cglm.h> /* for inline */
#include <cglm-call.h> /* for library call (this also includes cglm.h) */
#include <cglm/cglm.h> /* for inline */
#include <cglm/call.h> /* for library call (this also includes cglm.h) */
mat4 rot, trans, rt;
/* ... */
@@ -76,7 +91,7 @@ glm_mul(T, R, modelMat);
glm_inv_tr(modelMat);
```
##License
## License
MIT. check the LICENSE file
## Build
@@ -84,6 +99,8 @@ MIT. check the LICENSE file
### Unix (Autotools)
```text
$ sh ./build-deps.sh # run only once (dependencies)
$
$ sh autogen.sh
$ ./configure
$ make
@@ -92,14 +109,23 @@ $ [sudo] make install
```
### Windows (MSBuild)
Windows related build files, project files are located in `win` folder,
make sure you are inside `cglm/win` folder.
Code Analysis are enabled, it may take awhile to build
```text
TODO:
```Powershell
$ cd win
$ .\build.bat
```
##How to use
if `msbuild` won't work (because of multi version VS) then try to build with `devenv`:
```Powershell
$ devenv cglm.sln /Build Release
```
## How to use
If you want to use inline versions of funcstions then; include main header
```C
#include <cglm.h>
#include <cglm/cglm.h>
```
the haeder will include all headers. Then call func you want e.g. rotate vector by axis:
```C
@@ -118,7 +144,7 @@ like this function you may see `_to` postfix, this functions store results to an
to call pre-compiled versions include header with `c` postfix, c means call. Pre-compiled versions are just wrappers.
```C
#include <cglm-call.h>
#include <cglm/call.h>
```
this header will include all heaers with c postfix. You need to call functions with c posfix:
```C
@@ -126,7 +152,15 @@ glmc_vec_normalize(vec);
```
Function usage and parameters are documented inside related headers.
##Notes
## Notes
- This library uses float types only, does not support Integers, Double... yet
- If headers are not working properly with your compiler, IDE please open an issue, because I'm using GCC and clang to test it maybe sometimes MSVC
**TODO:**
- [ ] Unit tests (In Progress)
- [ ] Unit tests for comparing cglm with glm results
- [x] Add version info
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
- [ ] Extra documentation
- [ ] ARM Neon Arch (In Progress)

7
appveyor.yml Normal file
View File

@@ -0,0 +1,7 @@
image: Visual Studio 2017
build_script:
- ps: >-
cd win
.\build.bat

View File

@@ -6,12 +6,15 @@
# Full license can be found in the LICENSE file
#
cd `dirname "$0"`
cd $(dirname "$0")
if [ "`uname`" = "Darwin" ]; then
libtoolBin=$(which glibtoolize)
libtoolBinDir=$(dirname "${libtoolBin}")
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
if [ "$(uname)" = "Darwin" ]; then
libtoolBin=$(which glibtoolize)
libtoolBinDir=$(dirname "${libtoolBin}")
if [ ! -f "${libtoolBinDir}/libtoolize" ]; then
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
fi
fi
autoheader

30
build-deps.sh Normal file
View File

@@ -0,0 +1,30 @@
#! /bin/sh
#
# Copyright (c), Recep Aslantas.
#
# MIT License (MIT), http://opensource.org/licenses/MIT
# Full license can be found in the LICENSE file
#
# check if deps are pulled
git submodule update --init --recursive
# fix glibtoolize
cd $(dirname "$0")
if [ "$(uname)" = "Darwin" ]; then
libtoolBin=$(which glibtoolize)
libtoolBinDir=$(dirname "${libtoolBin}")
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
fi
# general deps: gcc make autoconf automake libtool cmake
# test - cmocka
cd ./test/lib/cmocka
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
make -j8
cd ../../../../

View File

@@ -7,7 +7,7 @@
#*****************************************************************************
AC_PREREQ([2.69])
AC_INIT([cglm], [0.1.0], [info@recp.me])
AC_INIT([cglm], [0.2.1], [info@recp.me])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
AC_CONFIG_MACRO_DIR([m4])

36
docs/make.bat Normal file
View File

@@ -0,0 +1,36 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=python -msphinx
)
set SOURCEDIR=source
set BUILDDIR=build
set SPHINXPROJ=cglm
if "%1" == "" goto help
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The Sphinx module was not found. Make sure you have Sphinx installed,
echo.then set the SPHINXBUILD environment variable to point to the full
echo.path of the 'sphinx-build' executable. Alternatively you may add the
echo.Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
:end
popd

52
docs/source/build.rst Normal file
View File

@@ -0,0 +1,52 @@
Building cglm
================================
| **cglm** does not have external dependencies except for unit testing.
| When you pulled cglm repo with submodules all dependencies will be pulled too.
| `build-deps.sh` will pull all dependencies/submodules and build for you.
External dependencies:
* cmocka - for unit testing
**NOTE:**
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
**Unix (Autotools):**
.. code-block:: bash
:linenos:
$ sh ./build-deps.sh # run this only once (dependencies)
$ sh autogen.sh
$ ./configure
$ make
$ make check # run tests (optional)
$ [sudo] make install # install to system (optional)
**make** will build cglm to **.libs** sub folder in project folder.
If you don't want to install cglm to your system's folder you can get static and dynamic libs in this folder.
**Build dependencies (windows):**
Windows related build files, project files are located in win folder,
make sure you are inside in cglm/win folder.
Code Analysis are enabled, it may take awhile to build.
.. code-block:: bash
:linenos:
$ cd win
$ .\build.bat
if *msbuild* is not worked (because of multi versions of Visual Studio)
then try to build with *devenv*:
.. code-block:: bash
:linenos:
$ devenv cglm.sln /Build Release
Currently tests are not available on Windows.

163
docs/source/conf.py Normal file
View File

@@ -0,0 +1,163 @@
# -*- coding: utf-8 -*-
#
# cglm documentation build configuration file, created by
# sphinx-quickstart on Tue Jun 6 20:31:05 2017.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'cglm'
copyright = u'2017, Recep Aslantas'
author = u'Recep Aslantas'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = u'0.2.1'
# The full version, including alpha/beta/rc tags.
release = u'0.2.1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = []
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
html_theme_options = {
'github_banner': 'true',
'github_button': 'true',
'github_user': 'recp',
'github_repo': 'cglm',
'travis_button': 'true',
'show_related': 'true',
'fixed_sidebar': 'true'
}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# -- Options for HTMLHelp output ------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'cglmdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'cglm.tex', u'cglm Documentation',
u'Recep Aslantas', 'manual'),
]
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'cglm', u'cglm Documentation',
[author], 1)
]
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'cglm', u'cglm Documentation',
author, 'cglm', 'One line description of project.',
'Miscellaneous'),
]

View File

@@ -0,0 +1,66 @@
Getting Started
================================
**cglm** uses **glm** prefix for all functions e.g. glm_lookat. You can see supported types in common header file:
.. code-block:: c
:linenos:
typedef float vec3[3];
typedef int ivec3[3];
typedef CGLM_ALIGN(16) float vec4[4];
typedef vec3 mat3[3];
typedef vec4 mat4[4];
typedef vec4 versor;
As you can see types don't store extra informations in favor of space.
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
*vec4* and *mat4* requires 16 byte aligment because vec4 and mat4 operations are
vectorized by SIMD instructions (SSE/AVX).
**NOTE:** Unaligned vec4 and unaligned mat4 operations will be supported in the future. Check todo list.
Because you may want to multiply a CGLM matrix with external matrix.
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
cglm provides a few way to call a function to do same operation.
* Inline - *glm_, glm_u*
* aligned
* unaligned (todo)
* Pre-compiled - *glmc_, glmc_u*
* aligned
* unaligned (todo)
For instance **glm_mat4_mul** is inline (all *glm_* functions are inline), to make it non-inline (pre-compiled)
call it as **glmc_mat4_mul** from library, to use unaligned version use **glm_umat4_mul** (todo).
Most functions have **dest** parameter for output. For instance mat4_mul func looks like this:
.. code-block:: c
CGLM_INLINE
void
glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest)
The dest parameter is out parameter. Result will be stored in **dest**.
Also in this case matrix multiplication order is dest = m1 * m2.
* Changing parameter order will change the multiplication order.
* You can pass all parameter same (this is similar to m1 `*=` m1), you can pass **dest** as m1 or m2 (this is similar to m1 `*=` m2)
**v** postfix in function names
-------------------------------
You may see **v** postfix in some function names, v stands for vector.
For instance consider a function that accepts three parameters x, y, z.
This function may be overloaded by **v** postfix to accept vector (vec3) instead of separate parameters.
In some places the v means that it will be apply to a vector.
**_to** postfix in function names
---------------------------------
*_to* version of function will store the result in specified parameter instead of in-out parameter.
Some functions don't have _to prefix but they still behave like this e.g. glm_mat4_mul.

45
docs/source/index.rst Normal file
View File

@@ -0,0 +1,45 @@
.. cglm documentation master file, created by
sphinx-quickstart on Tue Jun 6 20:31:05 2017.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to cglm's documentation!
================================
**cglm** is optimized 3D math library written in C99 (compatible with C89).
It is similar to original **glm** library except this is mainly for **C**
This library stores matrices as row-major order but in the future column-major
is considered to be supported as optional.
Also currently only **float** type is supported for most operations.
**Features**
* general purpose matrix operations (mat4, mat3)
* chain matrix multiplication (square only)
* general purpose vector operations (cross, dot, rotate, proj, angle...)
* affine transforms
* matrix decomposition (extract rotation, scaling factor)
* optimized affine transform matrices (mul, rigid-body inverse)
* camera (lookat)
* projections (ortho, perspective)
* quaternions
* euler angles / yaw-pitch-roll to matrix
* extract euler angles
* inline or pre-compiled function call
* more features (todo)
.. toctree::
:maxdepth: 2
:caption: Table Of Contents:
build
getting_started
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

@@ -1,36 +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_intrin_h
#define cglm_intrin_h
#if defined( _WIN32 )
# if (defined(_M_AMD64) || defined(_M_X64)) || _M_IX86_FP == 2
# define __SSE2__
# elif _M_IX86_FP == 1
# define __SSE__
# endif
#endif
#if defined( __SSE__ ) || defined( __SSE2__ )
#include <xmmintrin.h>
#include <emmintrin.h>
/* float */
#define _mm_shuffle1_ps(a, z, y, x, w) \
_mm_shuffle_ps(a, a, _MM_SHUFFLE(z, y, x, w))
#define _mm_shuffle1_ps1(a, x) \
_mm_shuffle_ps(a, a, _MM_SHUFFLE(x, x, x, x))
#define _mm_shuffle2_ps(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
_mm_shuffle1_ps(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
z1, y1, x1, w1)
#endif
#endif /* cglm_intrin_h */

View File

@@ -1,200 +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_vcam_h
#define cglm_vcam_h
#include "cglm-common.h"
#include "cglm-platform.h"
CGLM_INLINE
void
glm_frustum(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
mat4 dest) {
float rl, tb, fn;
glm__memzero(float, dest, sizeof(mat4));
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn = 1.0f / (farVal - nearVal);
dest[0][0] = 2.0f * nearVal * rl;
dest[1][1] = 2.0f * nearVal * tb;
dest[2][0] = (right + left) * rl;
dest[2][1] = (top + bottom) * tb;
dest[2][2] = -(farVal + nearVal) * fn;
dest[2][3] = -1.0f;
dest[3][2] = -2.0f * farVal * nearVal * fn;
}
CGLM_INLINE
void
glm_ortho(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
mat4 dest) {
float rl, tb, fn;
glm__memzero(float, dest, sizeof(mat4));
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn = 1.0f / (farVal - nearVal);
dest[0][0] = 2.0f * rl;
dest[1][1] = 2.0f * tb;
dest[2][2] =-2.0f * fn;
dest[3][0] =-(right + left) * rl;
dest[3][1] =-(top + bottom) * tb;
dest[3][2] =-(farVal + nearVal) * fn;
dest[3][3] = 1.0f;
}
CGLM_INLINE
void
glm_ortho_default(mat4 dest) {
int32_t rect[4];
float aspectRatio;
glm_platfom_get_viewport_rect(rect);
aspectRatio = (float)rect[2]/rect[3];
if (rect[2] >= rect[3]) {
glm_ortho(-1.0f * aspectRatio,
1.0f * aspectRatio,
-1.0f,
1.0f,
-100.0f,
100.0f,
dest);
} else {
glm_ortho(-1.0f,
1.0f,
-1.0f / aspectRatio,
1.0f / aspectRatio,
-100.0f,
100.0f,
dest);
}
}
CGLM_INLINE
void
glm_ortho_default_s(float size, mat4 dest) {
int32_t rect[4];
float aspectRatio;
glm_platfom_get_viewport_rect(rect);
aspectRatio = (float)rect[2]/rect[3];
if (rect[2] >= rect[3]) {
glm_ortho(-size * aspectRatio,
size * aspectRatio,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
} else {
glm_ortho(-size,
size,
-size / aspectRatio,
size / aspectRatio,
-size - 100.0f,
size + 100.0f,
dest);
}
}
CGLM_INLINE
void
glm_perspective(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest) {
float f, fn;
glm__memzero(float, dest, sizeof(mat4));
f = cosf(fovy * 0.5f) / sinf(fovy * 0.5f);
fn = 1.0f / (nearVal - farVal);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] = (nearVal + farVal) * fn;
dest[2][3] =-1.0f;
dest[3][2] = 2 * nearVal * farVal * fn;
}
CGLM_INLINE
void
glm_perspective_default(mat4 dest) {
int32_t rect[4];
glm_platfom_get_viewport_rect(rect);
glm_perspective((float)CGLM_PI_4,
(float)rect[2]/rect[3],
0.01f,
100.0f,
dest);
}
CGLM_INLINE
void
glm_perspective_resize(mat4 proj) {
int32_t rect[4];
if (proj[0][0] == 0)
return;
glm_platfom_get_viewport_rect(rect);
proj[0][0] = (float)proj[1][1] * rect[3] / rect[2];
}
CGLM_INLINE
void
glm_lookat(vec3 eye,
vec3 center,
vec3 up,
mat4 dest) {
vec3 f, u, s;
glm_vec_sub(center, eye, f);
glm_vec_normalize(f);
glm_vec_cross(f, up, s);
glm_vec_normalize(s);
glm_vec_cross(s, f, u);
dest[0][0] = s[0];
dest[0][1] = u[0];
dest[0][2] =-f[0];
dest[1][0] = s[1];
dest[1][1] = u[1];
dest[1][2] =-f[1];
dest[2][0] = s[2];
dest[2][1] = u[2];
dest[2][2] =-f[2];
dest[3][0] =-glm_vec_dot(s, eye);
dest[3][1] =-glm_vec_dot(u, eye);
dest[3][2] = glm_vec_dot(f, eye);
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
dest[3][3] = 1.0f;
}
#endif /* cglm_vcam_h */

View File

@@ -1,20 +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_mat_opengl_h
#define cglm_mat_opengl_h
#include "cglm-common.h"
#include "cglm-platform.h"
CGLM_INLINE
void
glm_uniform(int32_t location, mat4 m) {
glm_platform_uniform_mat4fv(location, m[0]);
}
#endif /* cglm_mat_opengl_h */

View File

@@ -1,45 +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_platform_h
#define cglm_platform_h
#include "cglm-common.h"
#ifdef __APPLE__
# include <OpenGL/gl3.h>
#else
# ifdef _WIN32
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# endif
# include <GL/gl.h>
#endif
#ifdef _WIN32
extern
void
glUniformMatrix4fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
#endif
CGLM_INLINE
void
glm_platform_uniform_mat4fv(int32_t location,
const float *value) {
glUniformMatrix4fv(location, 1, GL_FALSE, value);
}
CGLM_INLINE
void
glm_platfom_get_viewport_rect(int32_t *rect) {
glGetIntegerv(GL_VIEWPORT, rect);
}
#endif /* cglm_platform_h */

View File

@@ -1,158 +0,0 @@
/*
* 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
*/
#ifndef cglm_vec_ext_h
#define cglm_vec_ext_h
#include "cglm-common.h"
#include "arch/simd/cglm-intrin.h"
#include <stdbool.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
*
* @param a v1
* @param b v2
* @param d v3 = (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2], v1[3] * v2[3])
*/
CGLM_INLINE
void
glm_vec4_mulv(vec4 a, vec4 b, vec4 d) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(d, _mm_mul_ps(_mm_load_ps(a), _mm_load_ps(b)));
#else
d[0] = a[0] * b[0];
d[1] = a[1] * b[1];
d[2] = a[2] * b[2];
d[3] = a[3] * b[3];
#endif
}
CGLM_INLINE
void
glm_vec_broadcast(float val, vec3 d) {
d[0] = d[1] = d[2] = val;
}
CGLM_INLINE
void
glm_vec4_broadcast(float val, vec3 d) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(d, _mm_set1_ps(val));
#else
d[0] = d[1] = d[2] = d[3] = val;
#endif
}
CGLM_INLINE
bool
glm_vec_eq(vec3 v, float val) {
return v[0] == val && v[0] == v[1] && v[0] == v[2];
}
CGLM_INLINE
bool
glm_vec_eq_all(vec3 v) {
return v[0] == v[1] && v[0] == v[2];
}
CGLM_INLINE
bool
glm_vec_eqv(vec3 v1, vec3 v2) {
return v1[0] == v2[0] && v1[1] == v2[1] && v1[2] == v2[2];
}
CGLM_INLINE
bool
glm_vec4_eq(vec4 v, float val) {
return v[0] == val && v[0] == v[1] && v[0] == v[2] && v[0] == v[3];
}
CGLM_INLINE
bool
glm_vec4_eq_all(vec4 v) {
return v[0] == v[1] && v[0] == v[2] && v[0] == v[3];
}
CGLM_INLINE
bool
glm_vec4_eqv(vec4 v1, vec4 v2) {
return v1[0] == v2[0] && v1[1] == v2[1] && v1[2] == v2[2] && v1[3] == v2[3];
}
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;
}
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;
}
CGLM_INLINE
float
glm_vec4_max(vec4 v) {
float max;
max = glm_vec_max(v);
if (v[3] > max)
max = v[3];
return max;
}
CGLM_INLINE
float
glm_vec4_min(vec4 v) {
float min;
min = glm_vec_max(v);
if (v[3] < min)
min = v[3];
return min;
}
#endif /* cglm_vec_ext_h */

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

@@ -5,14 +5,25 @@
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_mul(mat4 m1, mat4 m2, mat4 dest);
CGLM_INLINE void glm_inv_tr(mat4 mat);
*/
#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>
@@ -24,20 +35,15 @@ glm_mul(mat4 m1, mat4 m2, mat4 dest) {
#elif defined( __SSE__ ) || defined( __SSE2__ )
glm_mul_sse2(m1, m2, dest);
#else
float a00, a01, a02, a03, b00, b01, b02,
a10, a11, a12, a13, b10, b11, b12,
a20, a21, a22, a23, b20, b21, b22,
a30, a31, a32, a33, b30, b31, b32, b33;
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], a23 = m1[2][3],
a30 = m1[3][0], a31 = m1[3][1], a32 = m1[3][2], a33 = m1[3][3],
a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], a23 = m1[2][3],
a30 = m1[3][0], a31 = m1[3][1], a32 = m1[3][2], a33 = m1[3][3];
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2],
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2],
b30 = m2[3][0], b31 = m2[3][1], b32 = m2[3][2], b33 = m2[3][3];
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2],
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2],
b30 = m2[3][0], b31 = m2[3][1], b32 = m2[3][2], b33 = m2[3][3];
dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02;
dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02;
@@ -87,7 +93,7 @@ glm_inv_tr(mat4 mat) {
/* translate */
glm_mat3_mulv(r, mat[3], t);
glm_vec_flipsign(t);
glm_vec_dup(t, mat[3]);
glm_vec_copy(t, mat[3]);
#endif
}

View File

@@ -5,13 +5,38 @@
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_translate_to(mat4 m, vec3 v, mat4 dest);
CGLM_INLINE void glm_translate(mat4 m, vec3 v);
CGLM_INLINE void glm_translate_x(mat4 m, float to);
CGLM_INLINE void glm_translate_y(mat4 m, float to);
CGLM_INLINE void glm_translate_z(mat4 m, float to);
CGLM_INLINE void glm_translate_make(mat4 m, vec3 v);
CGLM_INLINE void glm_scale_to(mat4 m, vec3 v, mat4 dest);
CGLM_INLINE void glm_scale_make(mat4 m, vec3 v);
CGLM_INLINE void glm_scale(mat4 m, vec3 v);
CGLM_INLINE void glm_scale1(mat4 m, float s);
CGLM_INLINE void glm_rotate_x(mat4 m, float rad, mat4 dest);
CGLM_INLINE void glm_rotate_y(mat4 m, float rad, mat4 dest);
CGLM_INLINE void glm_rotate_z(mat4 m, float rad, mat4 dest);
CGLM_INLINE void glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc);
CGLM_INLINE void glm_rotate_make(mat4 m, float angle, vec3 axis);
CGLM_INLINE void glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc);
CGLM_INLINE void glm_rotate(mat4 m, float angle, vec3 axis);
CGLM_INLINE void glm_decompose_scalev(mat4 m, vec3 s);
CGLM_INLINE bool glm_uniscaled(mat4 m);
CGLM_INLINE void glm_decompose_rs(mat4 m, mat4 r, vec3 s);
CGLM_INLINE void glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s);
*/
#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
@@ -121,6 +146,13 @@ glm_translate_z(mat4 m, float to) {
#endif
}
CGLM_INLINE
void
glm_translate_make(mat4 m, vec3 v) {
mat4 t = GLM_MAT4_IDENTITY_INIT;
glm_translate_to(t, v, m);
}
/* scale */
CGLM_INLINE
@@ -130,7 +162,14 @@ glm_scale_to(mat4 m, vec3 v, mat4 dest) {
glm_vec4_scale(m[1], v[1], dest[1]);
glm_vec4_scale(m[2], v[2], dest[2]);
glm_vec4_dup(m[3], dest[3]);
glm_vec4_copy(m[3], dest[3]);
}
CGLM_INLINE
void
glm_scale_make(mat4 m, vec3 v) {
mat4 t = GLM_MAT4_IDENTITY_INIT;
glm_scale_to(t, v, m);
}
CGLM_INLINE
@@ -267,9 +306,9 @@ glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc) {
glm_vec4_scale(m[2], rot[2][2], tmp[0]);
glm_vec4_add(tmp[3], tmp[0], tmp[3]);
glm_vec4_dup(tmp[1], m[0]);
glm_vec4_dup(tmp[2], m[1]);
glm_vec4_dup(tmp[3], m[2]);
glm_vec4_copy(tmp[1], m[0]);
glm_vec4_copy(tmp[2], m[1]);
glm_vec4_copy(tmp[3], m[2]);
}
CGLM_INLINE
@@ -299,7 +338,7 @@ glm_decompose_scalev(mat4 m, vec3 s) {
* @brief returns true if matrix is uniform scaled. This is helpful for
* creating normal matrix.
*
* @param m[in] m
* @param[in] m m
*
* @return boolean
*/
@@ -314,10 +353,11 @@ glm_uniscaled(mat4 m) {
/*!
* @brief decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
* DON'T pass projected matrix here
*
* @param[in] m affine transform
* @param[out] r rotation matrix
* @param[out] r scale matrix
* @param[out] s scale matrix
*/
CGLM_INLINE
void
@@ -325,10 +365,10 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
vec4 t = {0.0f, 0.0f, 0.0f, 1.0f};
vec3 v;
glm_vec4_dup(m[0], r[0]);
glm_vec4_dup(m[1], r[1]);
glm_vec4_dup(m[2], r[2]);
glm_vec4_dup(t, r[3]);
glm_vec4_copy(m[0], r[0]);
glm_vec4_copy(m[1], r[1]);
glm_vec4_copy(m[2], r[2]);
glm_vec4_copy(t, r[3]);
s[0] = glm_vec_norm(m[0]);
s[1] = glm_vec_norm(m[1]);
@@ -338,18 +378,21 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
glm_vec4_scale(r[1], 1.0f/s[1], r[1]);
glm_vec4_scale(r[2], 1.0f/s[2], r[2]);
/* Note from Apple Open Source (asume that the matrix is orthonormal):
check for a coordinate system flip. If the determinant
is -1, then negate the matrix and the scaling factors. */
glm_vec_cross(m[0], m[1], v);
if (glm_vec_dot(v, m[2]) < 0.0f) {
glm_vec4_scale(r[0], -1.0f, r[0]);
glm_vec4_scale(r[1], -1.0f, r[1]);
glm_vec4_scale(r[2], -1.0f, r[2]);
glm_vec_scale(s, -1.0f, s);
glm_vec4_flipsign(r[0]);
glm_vec4_flipsign(r[1]);
glm_vec4_flipsign(r[2]);
glm_vec_flipsign(s);
}
}
/*!
* @brief decompose affine transform
* @brief decompose affine transform, TODO: extract shear factors.
* DON'T pass projected matrix here
*
* @param[in] m affine transfrom
* @param[out] t translation vector
@@ -359,7 +402,7 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
CGLM_INLINE
void
glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s) {
glm_vec4_dup(m[3], t);
glm_vec4_copy(m[3], t);
glm_decompose_rs(m, r, s);
}

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 glmc_euler_h
#define glmc_euler_h
#ifndef cglmc_euler_h
#define cglmc_euler_h
#ifdef __cplusplus
extern "C" {
#endif
@@ -48,4 +48,4 @@ glmc_euler_by_order(vec3 angles, glm_euler_sq axis, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* glmc_euler_h */
#endif /* cglmc_euler_h */

View File

@@ -13,9 +13,16 @@ extern "C" {
#include "../cglm.h"
/* DEPRECATED! use _copy, _ucopy versions */
#define glmc_mat3_dup(mat, dest) glmc_mat3_copy(mat, dest)
CGLM_EXPORT
void
glmc_mat3_dup(mat3 mat, mat3 dest);
glmc_mat3_copy(mat3 mat, mat3 dest);
CGLM_EXPORT
void
glmc_mat3_identity(mat3 mat);
CGLM_EXPORT
void

View File

@@ -13,13 +13,21 @@ extern "C" {
#include "../cglm.h"
CGLM_EXPORT
void
glmc_mat4_udup(mat4 mat, mat4 dest);
/* DEPRECATED! use _copy, _ucopy versions */
#define glmc_mat4_udup(mat, dest) glmc_mat4_ucopy(mat, dest)
#define glmc_mat4_dup(mat, dest) glmc_mat4_copy(mat, dest)
CGLM_EXPORT
void
glmc_mat4_dup(mat4 mat, mat4 dest);
glmc_mat4_ucopy(mat4 mat, mat4 dest);
CGLM_EXPORT
void
glmc_mat4_copy(mat4 mat, mat4 dest);
CGLM_EXPORT
void
glmc_mat4_identity(mat4 mat);
CGLM_EXPORT
void

View File

@@ -5,34 +5,25 @@
* Full license can be found in the LICENSE file
*/
#ifndef cglm_vec_h
#define cglm_vec_h
#ifndef cglmc_vec3_h
#define cglmc_vec3_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_vec_dup(vec3 a, vec3 dest);
/* DEPRECATED! use _copy, _ucopy versions */
#define glmc_vec_dup(v, dest) glmc_vec_copy(v, dest)
CGLM_EXPORT
void
glmc_vec4_dup3(vec4 a, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_dup(vec4 v, vec4 dest);
glmc_vec_copy(vec3 a, vec3 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);
@@ -41,69 +32,49 @@ 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_vec_scale_as(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec_flipsign(vec3 v);
CGLM_EXPORT
void
glmc_vec4_flipsign(vec4 v);
glmc_vec_inv(vec3 v);
CGLM_EXPORT
void
glmc_vec4_scale(vec4 v, float s, vec4 dest);
glmc_vec_inv_to(vec3 v, vec3 dest);
CGLM_EXPORT
float
glmc_vec_angle(vec3 v1, vec3 v2)
glmc_vec_angle(vec3 v1, vec3 v2);
CGLM_EXPORT
void
@@ -117,7 +88,23 @@ CGLM_EXPORT
void
glmc_vec_proj(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec_center(vec3 v1, vec3 v2, vec3 dest);
CGLM_EXPORT
float
glmc_vec_distance(vec3 v1, vec3 v2);
CGLM_EXPORT
void
glmc_vec_maxv(vec3 v1, vec3 v2, vec3 dest);
CGLM_EXPORT
void
glmc_vec_minv(vec3 v1, vec3 v2, vec3 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglm_vec_h */
#endif /* cglmc_vec3_h */

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

@@ -0,0 +1,92 @@
/*
* 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
void
glmc_vec4_inv(vec4 v);
CGLM_EXPORT
void
glmc_vec4_inv_to(vec4 v, vec4 dest);
CGLM_EXPORT
float
glmc_vec4_distance(vec4 v1, vec4 v2);
CGLM_EXPORT
void
glmc_vec4_maxv(vec4 v1, vec4 v2, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_minv(vec4 v1, vec4 v2, vec4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_vec4_h */

425
include/cglm/cam.h Normal file
View File

@@ -0,0 +1,425 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_frustum(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
mat4 dest);
CGLM_INLINE void glm_ortho(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
mat4 dest);
CGLM_INLINE void glm_ortho_default(float aspect, mat4 dest);
CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest);
CGLM_INLINE void glm_perspective(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest);
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest);
CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj);
CGLM_INLINE void glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest);
CGLM_INLINE void glm_persp_decomp(mat4 proj,
float * __restrict nearVal,
float * __restrict farVal,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right);
CGLM_INLINE void glm_persp_decompv(mat4 proj, float dest[6]);
CGLM_INLINE void glm_persp_decomp_x(mat4 proj,
float * __restrict left,
float * __restrict right);
CGLM_INLINE void glm_persp_decomp_y(mat4 proj,
float * __restrict top,
float * __restrict bottom);
CGLM_INLINE void glm_persp_decomp_z(mat4 proj,
float * __restrict nearVal,
float * __restrict farVal);
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float * __restrict farVal);
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *__restrict nearVal);
*/
#ifndef cglm_vcam_h
#define cglm_vcam_h
#include "common.h"
/*!
* @brief set up perspective peprojection matrix
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearVal near clipping plane
* @param[in] farVal far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_frustum(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
mat4 dest) {
float rl, tb, fn, nv;
glm__memzero(float, dest, sizeof(mat4));
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farVal - nearVal);
nv = 2.0f * nearVal;
dest[0][0] = nv * rl;
dest[1][1] = nv * tb;
dest[2][0] = (right + left) * rl;
dest[2][1] = (top + bottom) * tb;
dest[2][2] = (farVal + nearVal) * fn;
dest[2][3] =-1.0f;
dest[3][2] = farVal * nv * fn;
}
/*!
* @brief set up orthographic projection matrix
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearVal near clipping plane
* @param[in] farVal far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
mat4 dest) {
float rl, tb, fn;
glm__memzero(float, dest, sizeof(mat4));
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farVal - nearVal);
dest[0][0] = 2.0f * rl;
dest[1][1] = 2.0f * tb;
dest[2][2] = 2.0f * fn;
dest[3][0] =-(right + left) * rl;
dest[3][1] =-(top + bottom) * tb;
dest[3][2] = (farVal + nearVal) * fn;
dest[3][3] = 1.0f;
}
/*!
* @brief set up unit orthographic projection matrix
*
* @param[in] aspect aspect ration ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default(float aspect,
mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho(-1.0f * aspect,
1.0f * aspect,
-1.0f,
1.0f,
-100.0f,
100.0f,
dest);
return;
}
glm_ortho(-1.0f,
1.0f,
-1.0f / aspect,
1.0f / aspect,
-100.0f,
100.0f,
dest);
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_s(float aspect,
float size,
mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho(-size * aspect,
size * aspect,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
return;
}
glm_ortho(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
}
/*!
* @brief set up perspective projection matrix
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearVal near clipping plane
* @param[in] farVal far clipping planes
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest) {
float f, fn;
glm__memzero(float, dest, sizeof(mat4));
f = 1.0f / tanf(fovy * 0.5f);
fn = 1.0f / (nearVal - farVal);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] = (nearVal + farVal) * fn;
dest[2][3] =-1.0f;
dest[3][2] = 2.0f * nearVal * farVal * fn;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values
*
* @param[in] aspect aspect ratio ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_default(float aspect,
mat4 dest) {
glm_perspective((float)CGLM_PI_4,
aspect,
0.01f,
100.0f,
dest);
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this very make easy to resize proj matrix when window, viewport
* reized
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in, out] proj perspective projection matrix
*/
CGLM_INLINE
void
glm_perspective_resize(float aspect,
mat4 proj) {
if (proj[0][0] == 0.0f)
return;
proj[0][0] = proj[1][1] / aspect;
}
/*!
* @brief set up view matrix
*
* @param[in] eye eye vector
* @param[in] center center vector
* @param[in] up up vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_lookat(vec3 eye,
vec3 center,
vec3 up,
mat4 dest) {
vec3 f, u, s;
glm_vec_sub(center, eye, f);
glm_vec_normalize(f);
glm_vec_cross(f, up, s);
glm_vec_normalize(s);
glm_vec_cross(s, f, u);
dest[0][0] = s[0];
dest[0][1] = u[0];
dest[0][2] =-f[0];
dest[1][0] = s[1];
dest[1][1] = u[1];
dest[1][2] =-f[1];
dest[2][0] = s[2];
dest[2][1] = u[2];
dest[2][2] =-f[2];
dest[3][0] =-glm_vec_dot(s, eye);
dest[3][1] =-glm_vec_dot(u, eye);
dest[3][2] = glm_vec_dot(f, eye);
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
dest[3][3] = 1.0f;
}
/*!
* @brief decomposes frustum values of perspective projection.
*
* @param[in] proj perspective projection matrix
* @param[out] nearVal near
* @param[out] farVal far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp(mat4 proj,
float * __restrict nearVal,
float * __restrict farVal,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right) {
*nearVal = proj[3][2] / (proj[2][2] - 1);
*farVal = proj[3][2] / (proj[2][2] + 1);
*bottom = *nearVal * (proj[2][1] - 1) / proj[1][1];
*top = *nearVal * (proj[2][1] + 1) / proj[1][1];
*left = *nearVal * (proj[2][0] - 1) / proj[0][0];
*right = *nearVal * (proj[2][0] + 1) / proj[0][0];
}
/*!
* @brief decomposes frustum values of perspective projection.
* this makes easy to get all values at once
*
* @param[in] proj perspective projection matrix
* @param[out] dest array
*/
CGLM_INLINE
void
glm_persp_decompv(mat4 proj, float dest[6]) {
glm_persp_decomp(proj, &dest[0], &dest[1], &dest[2],
&dest[3], &dest[4], &dest[5]);
}
/*!
* @brief decomposes left and right values of perspective projection.
* x stands for x axis (left / right axis)
*
* @param[in] proj perspective projection matrix
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_x(mat4 proj,
float * __restrict left,
float * __restrict right) {
float nearVal;
nearVal = proj[3][2] / (proj[3][3] - 1);
*left = nearVal * (proj[2][0] - 1) / proj[0][0];
*right = nearVal * (proj[2][0] + 1) / proj[0][0];
}
/*!
* @brief decomposes top and bottom values of perspective projection.
* y stands for y axis (top / botom axis)
*
* @param[in] proj perspective projection matrix
* @param[out] top top
* @param[out] bottom bottom
*/
CGLM_INLINE
void
glm_persp_decomp_y(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
float nearVal;
nearVal = proj[3][2] / (proj[3][3] - 1);
*bottom = nearVal * (proj[2][1] - 1) / proj[1][1];
*top = nearVal * (proj[2][1] + 1) / proj[1][1];
}
/*!
* @brief decomposes near and far values of perspective projection.
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearVal near
* @param[out] farVal far
*/
CGLM_INLINE
void
glm_persp_decomp_z(mat4 proj,
float * __restrict nearVal,
float * __restrict farVal) {
*nearVal = proj[3][2] / (proj[2][2] - 1);
*farVal = proj[3][2] / (proj[2][2] + 1);
}
/*!
* @brief decomposes far value of perspective projection.
*
* @param[in] proj perspective projection matrix
* @param[out] farVal far
*/
CGLM_INLINE
void
glm_persp_decomp_far(mat4 proj, float * __restrict farVal) {
*farVal = proj[3][2] / (proj[2][2] + 1);
}
/*!
* @brief decomposes near value of perspective projection.
*
* @param[in] proj perspective projection matrix
* @param[out] nearVal near
*/
CGLM_INLINE
void
glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) {
*nearVal = proj[3][2] / (proj[2][2] - 1);
}
#endif /* cglm_vcam_h */

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,6 +53,7 @@
#define glm__memzero(type, dest, size) glm__memset(type, dest, size, 0)
#include "cglm-types.h"
#include "types.h"
#include "simd/intrin.h"
#endif /* cglm_common_h */

View File

@@ -5,10 +5,28 @@
* Full license can be found in the LICENSE file
*/
/*
Types:
enum glm_euler_sq
Functions:
CGLM_INLINE glm_euler_sq glm_euler_order(int newOrder[3]);
CGLM_INLINE void glm_euler_angles(mat4 m, vec3 dest);
CGLM_INLINE void glm_euler(vec3 angles, mat4 dest);
CGLM_INLINE void glm_euler_zyx(vec3 angles, mat4 dest);
CGLM_INLINE void glm_euler_zxy(vec3 angles, mat4 dest);
CGLM_INLINE void glm_euler_xzy(vec3 angles, mat4 dest);
CGLM_INLINE void glm_euler_yzx(vec3 angles, mat4 dest);
CGLM_INLINE void glm_euler_yxz(vec3 angles, mat4 dest);
CGLM_INLINE void glm_euler_by_order(vec3 angles,
glm_euler_sq axis,
mat4 dest);
*/
#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]...
@@ -37,8 +55,8 @@ glm_euler_order(int newOrder[3]) {
/*!
* @brief euler angles (in radian) using xyz sequence
*
* @param[in] m affine transform
* @param[out] v angles vector [x, y, z]
* @param[in] m affine transform
* @param[out] dest angles vector [x, y, z]
*/
CGLM_INLINE
void
@@ -64,7 +82,7 @@ glm_euler_angles(mat4 m, vec3 dest) {
path = (fabsf(a[0][0]) + fabsf(a[0][1]) + fabsf(a[0][2])) >=
(fabsf(a[1][0]) + fabsf(a[1][1]) + fabsf(a[1][2]));
glm_vec_dup(a[path], dest);
glm_vec_copy(a[path], dest);
} else {
dest[0] = atan2f(m[1][0], m[2][0]);
dest[1] = CGLM_PI_2;

View File

@@ -5,10 +5,20 @@
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_mat4_print(mat4 matrix, FILE *ostream);
CGLM_INLINE void glm_mat3_print(mat3 matrix, FILE *ostream);
CGLM_INLINE void glm_vec4_print(vec4 vec, FILE *ostream);
CGLM_INLINE void glm_vec3_print(vec3 vec, FILE *ostream);
CGLM_INLINE void glm_ivec3_print(ivec3 vec, FILE *ostream);
CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream);
*/
#ifndef cglm_io_h
#define cglm_io_h
#include "cglm-common.h"
#include "common.h"
#include <stdio.h>
#include <stdlib.h>

View File

@@ -5,18 +5,51 @@
* Full license can be found in the LICENSE file
*/
/*
Macros:
GLM_MAT3_IDENTITY_INIT
GLM_MAT3_ZERO_INIT
GLM_MAT3_IDENTITY
GLM_MAT3_ZERO
glm_mat3_dup(mat, dest)
Functions:
CGLM_INLINE void glm_mat3_copy(mat3 mat, mat3 dest);
CGLM_INLINE void glm_mat3_identity(mat3 mat);
CGLM_INLINE void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
CGLM_INLINE void glm_mat3_transpose_to(mat3 m, mat3 dest);
CGLM_INLINE void glm_mat3_transpose(mat3 m);
CGLM_INLINE void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest);
CGLM_INLINE void glm_mat3_scale(mat3 m, float s);
CGLM_INLINE float glm_mat3_det(mat3 mat);
CGLM_INLINE void glm_mat3_inv(mat3 mat, mat3 dest);
CGLM_INLINE void glm_mat3_swap_col(mat3 mat, int col1, int col2);
CGLM_INLINE void glm_mat3_swap_row(mat3 mat, int row1, int row2);
*/
#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}, \
{0.0f, 0.0f, 1.0f}}
#define GLM_MAT3_ZERO_INIT {{0.0f, 0.0f, 0.0f}, \
{0.0f, 0.0f, 0.0f}, \
{0.0f, 0.0f, 0.0f}}
/* for C only */
#define GLM_MAT3_IDENTITY (mat3)GLM_MAT3_IDENTITY_INIT
#define GLM_MAT3_ZERO (mat3)GLM_MAT3_ZERO_INIT
/* DEPRECATED! use _copy, _ucopy versions */
#define glm_mat3_dup(mat, dest) glm_mat3_copy(mat, dest)
/*!
* @brief copy all members of [mat] to [dest]
@@ -26,10 +59,31 @@
*/
CGLM_INLINE
void
glm_mat3_dup(mat3 mat, mat3 dest) {
glm_mat3_copy(mat3 mat, mat3 dest) {
glm__memcpy(float, dest, mat, sizeof(mat3));
}
/*!
* @brief make given matrix identity. It is identical with below,
* but it is more easy to do that with this func especially for members
* e.g. glm_mat3_identity(aStruct->aMatrix);
*
* @code
* glm_mat3_copy(GLM_MAT3_IDENTITY, mat); // C only
*
* // or
* mat3 mat = GLM_MAT3_IDENTITY_INIT;
* @endcode
*
* @param[in, out] mat destination
*/
CGLM_INLINE
void
glm_mat3_identity(mat3 mat) {
mat3 t = GLM_MAT3_IDENTITY_INIT;
glm_mat3_copy(t, mat);
}
/*!
* @brief multiply m1 and m2 to dest
*
@@ -50,17 +104,13 @@ glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glm_mat3_mul_sse2(m1, m2, dest);
#else
float a00, a01, a02, b00, b01, b02,
a10, a11, a12, b10, b11, b12,
a20, a21, a22, b20, b21, b22;
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2],
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2],
a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2],
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2],
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2],
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2],
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2],
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2];
dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02;
dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02;
@@ -79,8 +129,8 @@ glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest) {
*
* source matrix will not be transposed unless dest is m
*
* @param m[in] matrix
* @param dest[out] result
* @param[in] m matrix
* @param[out] dest result
*/
CGLM_INLINE
void
@@ -162,13 +212,9 @@ glm_mat3_scale(mat3 m, float s) {
CGLM_INLINE
float
glm_mat3_det(mat3 mat) {
float a, b, c,
d, e, f,
g, h, i;
a = mat[0][0], b = mat[0][1], c = mat[0][2],
d = mat[1][0], e = mat[1][1], f = mat[1][2],
g = mat[2][0], h = mat[2][1], i = mat[2][2];
float a = mat[0][0], b = mat[0][1], c = mat[0][2],
d = mat[1][0], e = mat[1][1], f = mat[1][2],
g = mat[2][0], h = mat[2][1], i = mat[2][2];
return a * (e * i - h * f) - d * (b * i - c * h) + g * (b * f - c * e);
}
@@ -183,13 +229,9 @@ CGLM_INLINE
void
glm_mat3_inv(mat3 mat, mat3 dest) {
float det;
float a, b, c,
d, e, f,
g, h, i;
a = mat[0][0], b = mat[0][1], c = mat[0][2],
d = mat[1][0], e = mat[1][1], f = mat[1][2],
g = mat[2][0], h = mat[2][1], i = mat[2][2];
float a = mat[0][0], b = mat[0][1], c = mat[0][2],
d = mat[1][0], e = mat[1][1], f = mat[1][2],
g = mat[2][0], h = mat[2][1], i = mat[2][2];
dest[0][0] = e * i - f * h;
dest[0][1] = -(b * i - h * c);
@@ -217,17 +259,17 @@ CGLM_INLINE
void
glm_mat3_swap_col(mat3 mat, int col1, int col2) {
vec3 tmp;
glm_vec_dup(mat[col1], tmp);
glm_vec_dup(mat[col2], mat[col1]);
glm_vec_dup(tmp, mat[col2]);
glm_vec_copy(mat[col1], tmp);
glm_vec_copy(mat[col2], mat[col1]);
glm_vec_copy(tmp, mat[col2]);
}
/*!
* @brief swap two matrix rows
*
* @param[in,out] mat matrix
* @param[in] col1 col1
* @param[in] col2 col2
* @param[in] row1 row1
* @param[in] row2 row2
*/
CGLM_INLINE
void

View File

@@ -10,12 +10,53 @@
* if available. You dont need to call/incude SIMD headers manually
*/
/*
Macros:
GLM_MAT4_IDENTITY_INIT
GLM_MAT4_ZERO_INIT
GLM_MAT4_IDENTITY
GLM_MAT4_ZERO
glm_mat4_udup(mat, dest)
glm_mat4_dup(mat, dest)
Functions:
CGLM_INLINE void glm_mat4_ucopy(mat4 mat, mat4 dest);
CGLM_INLINE void glm_mat4_copy(mat4 mat, mat4 dest);
CGLM_INLINE void glm_mat4_identity(mat4 mat);
CGLM_INLINE void glm_mat4_pick3(mat4 mat, mat3 dest);
CGLM_INLINE void glm_mat4_pick3t(mat4 mat, mat3 dest);
CGLM_INLINE void glm_mat4_ins3(mat3 mat, mat4 dest);
CGLM_INLINE void glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
CGLM_INLINE void glm_mat4_mulN(mat4 *matrices[], int len, mat4 dest);
CGLM_INLINE void glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
CGLM_INLINE void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest);
CGLM_INLINE void glm_mat4_transpose_to(mat4 m, mat4 dest);
CGLM_INLINE void glm_mat4_transpose(mat4 m);
CGLM_INLINE void glm_mat4_scale_p(mat4 m, float s);
CGLM_INLINE void glm_mat4_scale(mat4 m, float s);
CGLM_INLINE float glm_mat4_det(mat4 mat);
CGLM_INLINE void glm_mat4_inv(mat4 mat, mat4 dest);
CGLM_INLINE void glm_mat4_inv_fast(mat4 mat, mat4 dest);
CGLM_INLINE void glm_mat4_swap_col(mat4 mat, int col1, int col2);
CGLM_INLINE void glm_mat4_swap_row(mat4 mat, int row1, int row2);
*/
#ifndef cglm_mat_h
#define cglm_mat_h
#include "cglm-common.h"
#include "arch/simd/cglm-mat-simd-sse2.h"
#include "arch/simd/cglm-mat-simd-avx.h"
#include "common.h"
#ifdef CGLM_SSE_FP
# include "simd/sse2/mat4.h"
#endif
#ifdef CGLM_AVX_FP
# include "simd/avx/mat4.h"
#endif
#ifdef CGLM_NEON_FP
# include "simd/neon/mat4.h"
#endif
#include <assert.h>
@@ -24,8 +65,21 @@
{0.0f, 0.0f, 1.0f, 0.0f}, \
{0.0f, 0.0f, 0.0f, 1.0f}}
#define GLM_MAT4_ZERO_INIT {{0.0f, 0.0f, 0.0f, 0.0f}, \
{0.0f, 0.0f, 0.0f, 0.0f}, \
{0.0f, 0.0f, 0.0f, 0.0f}, \
{0.0f, 0.0f, 0.0f, 0.0f}}
/* for C only */
#define GLM_MAT4_IDENTITY (mat4)GLM_MAT4_IDENTITY_INIT
#define GLM_MAT4_ZERO (mat4)GLM_MAT4_ZERO_INIT
/* DEPRECATED! use _copy, _ucopy versions */
#define glm_mat4_udup(mat, dest) glm_mat4_ucopy(mat, dest)
#define glm_mat4_dup(mat, dest) glm_mat4_copy(mat, dest)
/* DEPRECATED! default is precise now. */
#define glm_mat4_inv_precise(mat, dest) glm_mat4_inv(mat, dest)
/*!
* @brief copy all members of [mat] to [dest]
@@ -38,7 +92,7 @@
*/
CGLM_INLINE
void
glm_mat4_udup(mat4 mat, mat4 dest) {
glm_mat4_ucopy(mat4 mat, mat4 dest) {
glm__memcpy(float, dest, mat, sizeof(mat4));
}
@@ -50,7 +104,7 @@ glm_mat4_udup(mat4 mat, mat4 dest) {
*/
CGLM_INLINE
void
glm_mat4_dup(mat4 mat, mat4 dest) {
glm_mat4_copy(mat4 mat, mat4 dest) {
#ifdef __AVX__
_mm256_store_ps(dest[0], _mm256_load_ps(mat[0]));
_mm256_store_ps(dest[2], _mm256_load_ps(mat[2]));
@@ -60,10 +114,31 @@ glm_mat4_dup(mat4 mat, mat4 dest) {
_mm_store_ps(dest[2], _mm_load_ps(mat[2]));
_mm_store_ps(dest[3], _mm_load_ps(mat[3]));
#else
glm_mat4_udup(mat, dest);
glm_mat4_ucopy(mat, dest);
#endif
}
/*!
* @brief make given matrix identity. It is identical with below,
* but it is more easy to do that with this func especially for members
* e.g. glm_mat4_identity(aStruct->aMatrix);
*
* @code
* glm_mat4_copy(GLM_MAT4_IDENTITY, mat); // C only
*
* // or
* mat4 mat = GLM_MAT4_IDENTITY_INIT;
* @endcode
*
* @param[in, out] mat destination
*/
CGLM_INLINE
void
glm_mat4_identity(mat4 mat) {
mat4 t = GLM_MAT4_IDENTITY_INIT;
glm_mat4_copy(t, mat);
}
/*!
* @brief copy upper-left of mat4 to mat3
*
@@ -153,21 +228,18 @@ glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest) {
glm_mat4_mul_avx(m1, m2, dest);
#elif defined( __SSE__ ) || defined( __SSE2__ )
glm_mat4_mul_sse2(m1, m2, dest);
#elif defined( __ARM_NEON_FP )
glm_mat4_mul_neon(m1, m2, dest);
#else
float a00, a01, a02, a03, b00, b01, b02, b03,
a10, a11, a12, a13, b10, b11, b12, b13,
a20, a21, a22, a23, b20, b21, b22, b23,
a30, a31, a32, a33, b30, b31, b32, b33;
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], a23 = m1[2][3],
a30 = m1[3][0], a31 = m1[3][1], a32 = m1[3][2], a33 = m1[3][3],
a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], a23 = m1[2][3],
a30 = m1[3][0], a31 = m1[3][1], a32 = m1[3][2], a33 = m1[3][3];
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2], b03 = m2[0][3],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2], b13 = m2[1][3],
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2], b23 = m2[2][3],
b30 = m2[3][0], b31 = m2[3][1], b32 = m2[3][2], b33 = m2[3][3];
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2], b03 = m2[0][3],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2], b13 = m2[1][3],
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2], b23 = m2[2][3],
b30 = m2[3][0], b31 = m2[3][1], b32 = m2[3][2], b33 = m2[3][3];
dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03;
dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03;
@@ -242,7 +314,7 @@ glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
res[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1] * v[3];
res[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2] * v[3];
res[3] = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3] * v[3];
glm_vec4_dup(res, dest);
glm_vec4_copy(res, dest);
#endif
}
@@ -260,7 +332,7 @@ glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest) {
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
res[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
res[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
glm_vec_dup(res, dest);
glm_vec_copy(res, dest);
}
/*!
@@ -268,8 +340,8 @@ glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest) {
*
* source matrix will not be transposed unless dest is m
*
* @param m[in] matrix
* @param dest[out] result
* @param[in] m matrix
* @param[out] dest result
*/
CGLM_INLINE
void
@@ -357,15 +429,10 @@ glm_mat4_det(mat4 mat) {
#else
/* [square] det(A) = det(At) */
float t[6];
float a, b, c, d,
e, f, g, h,
i, j, k, l,
m, n, o, p;
a = mat[0][0], b = mat[0][1], c = mat[0][2], d = mat[0][3],
e = mat[1][0], f = mat[1][1], g = mat[1][2], h = mat[1][3],
i = mat[2][0], j = mat[2][1], k = mat[2][2], l = mat[2][3],
m = mat[3][0], n = mat[3][1], o = mat[3][2], p = mat[3][3];
float a = mat[0][0], b = mat[0][1], c = mat[0][2], d = mat[0][3],
e = mat[1][0], f = mat[1][1], g = mat[1][2], h = mat[1][3],
i = mat[2][0], j = mat[2][1], k = mat[2][2], l = mat[2][3],
m = mat[3][0], n = mat[3][1], o = mat[3][2], p = mat[3][3];
t[0] = k * p - o * l;
t[1] = j * p - n * l;
@@ -384,10 +451,6 @@ glm_mat4_det(mat4 mat) {
/*!
* @brief inverse mat4 and store in dest
*
* this func uses reciprocal approximation without extra corrections
* e.g Newton-Raphson. this should work faster than _precise,
* to get precise value use _precise version
*
* @param[in] mat matrix
* @param[out] dest inverse matrix
*/
@@ -399,15 +462,10 @@ glm_mat4_inv(mat4 mat, mat4 dest) {
#else
float t[6];
float det;
float a, b, c, d,
e, f, g, h,
i, j, k, l,
m, n, o, p;
a = mat[0][0], b = mat[0][1], c = mat[0][2], d = mat[0][3],
e = mat[1][0], f = mat[1][1], g = mat[1][2], h = mat[1][3],
i = mat[2][0], j = mat[2][1], k = mat[2][2], l = mat[2][3],
m = mat[3][0], n = mat[3][1], o = mat[3][2], p = mat[3][3];
float a = mat[0][0], b = mat[0][1], c = mat[0][2], d = mat[0][3],
e = mat[1][0], f = mat[1][1], g = mat[1][2], h = mat[1][3],
i = mat[2][0], j = mat[2][1], k = mat[2][2], l = mat[2][3],
m = mat[3][0], n = mat[3][1], o = mat[3][2], p = mat[3][3];
t[0] = k * p - o * l; t[1] = j * p - n * l; t[2] = j * o - n * k;
t[3] = i * p - m * l; t[4] = i * o - m * k; t[5] = i * n - m * j;
@@ -445,24 +503,25 @@ glm_mat4_inv(mat4 mat, mat4 dest) {
#endif
}
/*!
* @brief inverse mat4 precisely and store in dest
* @brief inverse mat4 and store in dest
*
* this do same thing as glm_mat4_inv did. the only diff is this func uses
* division instead of reciprocal approximation. Due to division this might
* work slower than glm_mat4_inv
* this func uses reciprocal approximation without extra corrections
* e.g Newton-Raphson. this should work faster than normal,
* to get more precise use glm_mat4_inv version.
*
* NOTE: You will lose precision, glm_mat4_inv is more accurate
*
* @param[in] mat matrix
* @param[out] dest inverse matrix
*/
CGLM_INLINE
void
glm_mat4_inv_precise(mat4 mat, mat4 dest) {
glm_mat4_inv_fast(mat4 mat, mat4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glm_mat4_inv_precise_sse2(mat, dest);
glm_mat4_inv_fast_sse2(mat, dest);
#else
glm_mat4_inv_precise(mat, dest);
glm_mat4_inv(mat, dest);
#endif
}
@@ -477,17 +536,17 @@ CGLM_INLINE
void
glm_mat4_swap_col(mat4 mat, int col1, int col2) {
vec4 tmp;
glm_vec4_dup(mat[col1], tmp);
glm_vec4_dup(mat[col2], mat[col1]);
glm_vec4_dup(tmp, mat[col2]);
glm_vec4_copy(mat[col1], tmp);
glm_vec4_copy(mat[col2], mat[col1]);
glm_vec4_copy(tmp, mat[col2]);
}
/*!
* @brief swap two matrix rows
*
* @param[in,out] mat matrix
* @param[in] col1 col1
* @param[in] col2 col2
* @param[in] row1 row1
* @param[in] row2 row2
*/
CGLM_INLINE
void

View File

@@ -5,21 +5,41 @@
* Full license can be found in the LICENSE file
*/
/*
Macros:
GLM_QUAT_IDENTITY_INIT
GLM_QUAT_IDENTITY
Functions:
CGLM_INLINE void glm_quat_identity(versor q);
CGLM_INLINE void glm_quat(versor q, float angle, float x, float y, float z);
CGLM_INLINE void glm_quatv(versor q, float angle, vec3 v);
CGLM_INLINE float glm_quat_norm(versor q);
CGLM_INLINE void glm_quat_normalize(versor q);
CGLM_INLINE float glm_quat_dot(versor q, versor r);
CGLM_INLINE void glm_quat_mulv(versor q1, versor q2, versor dest);
CGLM_INLINE void glm_quat_mat4(versor q, mat4 dest);
CGLM_INLINE void glm_quat_slerp(versor q, versor r, float t, versor dest);
*/
#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"
#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}
#ifdef CGLM_SSE_FP
# include "simd/sse2/quat.h"
#endif
#define GLM_QUAT_IDENTITY_INIT {1.0f, 0.0f, 0.0f, 0.0f}
#define GLM_QUAT_IDENTITY (versor){1.0f, 0.0f, 0.0f, 0.0f}
CGLM_INLINE
void
glm_quat_identity(versor q) {
glm_vec4_dup(GLM_QUAT_IDENTITY, q);
versor v = GLM_QUAT_IDENTITY_INIT;
glm_vec4_copy(v, q);
}
CGLM_INLINE
@@ -31,7 +51,7 @@ glm_quat(versor q,
float z) {
float a, c, s;
a = angle / 2.0f;
a = angle * 0.5f;
c = cosf(a);
s = sinf(a);
@@ -48,7 +68,7 @@ glm_quatv(versor q,
vec3 v) {
float a, c, s;
a = angle / 2.0f;
a = angle * 0.5f;
c = cosf(a);
s = sinf(a);
@@ -99,23 +119,33 @@ CGLM_INLINE
void
glm_quat_mat4(versor q, mat4 dest) {
float w, x, y, z;
float xx, yy, zz;
float xy, yz, xz;
float wx, wy, wz;
w = q[0];
x = q[1];
y = q[2];
z = q[3];
dest[0][0] = 1.0f - 2.0f * (y * y + z * z);
dest[0][1] = 2.0f * (x * y + w * z);
dest[0][2] = 2.0f * (x * z - w * y);
dest[0][3] = 0.0f;
dest[1][0] = 2.0f * (x * y - w * z);
dest[1][1] = 1.0f - 2.0f * (x * x + z * z);
dest[1][2] = 2.0f * (y * z + w * x);
xx = 2.0f * x * x; xy = 2.0f * x * y; wx = 2.0f * w * x;
yy = 2.0f * y * y; yz = 2.0f * y * z; wy = 2.0f * w * y;
zz = 2.0f * z * z; xz = 2.0f * x * z; wz = 2.0f * w * z;
dest[0][0] = 1.0f - yy - zz;
dest[1][1] = 1.0f - xx - zz;
dest[2][2] = 1.0f - xx - yy;
dest[0][1] = xy + wz;
dest[1][2] = yz + wx;
dest[2][0] = xz + wy;
dest[1][0] = xy - wz;
dest[2][1] = yz - wx;
dest[0][2] = xz - wy;
dest[1][3] = 0.0f;
dest[2][0] = 2.0f * (x * z + w * y);
dest[2][1] = 2.0f * (y * z - w * x);
dest[2][2] = 1.0f - 2.0f * (x * x + y * y);
dest[0][3] = 0.0f;
dest[2][3] = 0.0f;
dest[3][0] = 0.0f;
dest[3][1] = 0.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

@@ -0,0 +1,52 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_intrin_h
#define cglm_intrin_h
#if defined( _WIN32 )
# if (defined(_M_AMD64) || defined(_M_X64)) || _M_IX86_FP == 2
# define __SSE2__
# elif _M_IX86_FP == 1
# define __SSE__
# endif
#endif
#if defined( __SSE__ ) || defined( __SSE2__ )
# include <xmmintrin.h>
# include <emmintrin.h>
/* float */
# define _mm_shuffle1_ps(a, z, y, x, w) \
_mm_shuffle_ps(a, a, _MM_SHUFFLE(z, y, x, w))
# define _mm_shuffle1_ps1(a, x) \
_mm_shuffle_ps(a, a, _MM_SHUFFLE(x, x, x, x))
# define _mm_shuffle2_ps(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
_mm_shuffle1_ps(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
z1, y1, x1, w1)
#endif
/* x86, x64 */
#if defined( __SSE__ ) || defined( __SSE2__ )
# define CGLM_SSE_FP 1
#endif
#ifdef __AVX__
# define CGLM_AVX_FP 1
#endif
/* ARM Neon */
#if defined(__ARM_NEON) && defined(__ARM_NEON_FP)
# include <arm_neon.h>
# define CGLM_NEON_FP 1
#else
# undef CGLM_NEON_FP
#endif
#endif /* cglm_intrin_h */

View File

@@ -0,0 +1,57 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_mat4_neon_h
#define cglm_mat4_neon_h
#if defined(__ARM_NEON_FP)
#include "../../common.h"
#include "../intrin.h"
CGLM_INLINE
void
glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
/* D = R * L (Column-Major) */
float32x4_t l0, l1, l2, l3, r, d0, d1, d2, d3;
l0 = vld1q_f32(m2[0]);
l1 = vld1q_f32(m2[1]);
l2 = vld1q_f32(m2[2]);
l3 = vld1q_f32(m2[3]);
r = vld1q_f32(m1[0]);
d0 = vmulq_lane_f32(r, vget_low_f32(l0), 0);
d1 = vmulq_lane_f32(r, vget_low_f32(l1), 0);
d2 = vmulq_lane_f32(r, vget_low_f32(l2), 0);
d3 = vmulq_lane_f32(r, vget_low_f32(l3), 0);
r = vld1q_f32(m1[1]);
d0 = vmlaq_lane_f32(d0, r, vget_low_f32(l0), 1);
d1 = vmlaq_lane_f32(d1, r, vget_low_f32(l1), 1);
d2 = vmlaq_lane_f32(d2, r, vget_low_f32(l2), 1);
d3 = vmlaq_lane_f32(d3, r, vget_low_f32(l3), 1);
r = vld1q_f32(m1[2]);
d0 = vmlaq_lane_f32(d0, r, vget_high_f32(l0), 0);
d1 = vmlaq_lane_f32(d1, r, vget_high_f32(l1), 0);
d2 = vmlaq_lane_f32(d2, r, vget_high_f32(l2), 0);
d3 = vmlaq_lane_f32(d3, r, vget_high_f32(l3), 0);
r = vld1q_f32(m1[3]);
d0 = vmlaq_lane_f32(d0, r, vget_high_f32(l0), 1);
d1 = vmlaq_lane_f32(d1, r, vget_high_f32(l1), 1);
d2 = vmlaq_lane_f32(d2, r, vget_high_f32(l2), 1);
d3 = vmlaq_lane_f32(d3, r, vget_high_f32(l3), 1);
vst1q_f32(dest[0], d0);
vst1q_f32(dest[1], d1);
vst1q_f32(dest[2], d2);
vst1q_f32(dest[3], d3);
}
#endif
#endif /* cglm_mat4_neon_h */

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,10 @@
#define cglm_mat_sse_h
#if defined( __SSE__ ) || defined( __SSE2__ )
#include "../../cglm-common.h"
#include "cglm-intrin.h"
#include "../../common.h"
#include "../intrin.h"
#define glm_mat4_inv_precise_sse2(mat, dest) glm_mat4_inv_sse2(mat, dest)
CGLM_INLINE
void
@@ -157,7 +159,7 @@ glm_mat4_det_sse2(mat4 mat) {
CGLM_INLINE
void
glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
__m128 r0, r1, r2, r3,
v0, v1, v2, v3,
t0, t1, t2, t3, t4, t5,
@@ -281,7 +283,7 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
CGLM_INLINE
void
glm_mat4_inv_precise_sse2(mat4 mat, mat4 dest) {
glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
__m128 r0, r1, r2, r3,
v0, v1, v2, v3,
t0, t1, t2, t3, t4, t5,

View File

@@ -7,9 +7,10 @@
#ifndef cglm_quat_simd_h
#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
@@ -64,4 +65,5 @@ glm_quat_slerp_sse2(versor q,
_mm_set1_ps(sinTheta)));
}
#endif
#endif /* cglm_quat_simd_h */

View File

@@ -8,7 +8,7 @@
#ifndef cglm_types_h
#define cglm_types_h
#if defined(_WIN32)
#if defined(_MSC_VER)
# define CGLM_ALIGN(X) /* __declspec(align(X)) */
#else
# define CGLM_ALIGN(X) __attribute((aligned(X)))

View File

@@ -5,15 +5,25 @@
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE int glm_sign(int val);
CGLM_INLINE float glm_rad(float deg);
CGLM_INLINE float glm_deg(float rad);
CGLM_INLINE void glm_make_rad(float *deg);
CGLM_INLINE void glm_make_deg(float *rad);
CGLM_INLINE float glm_pow2(float x);
*/
#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
*
* @param X integer value
* @param val integer value
*/
CGLM_INLINE
int
@@ -45,4 +55,10 @@ glm_make_deg(float *rad) {
*rad = *rad * 180.0f / CGLM_PI;
}
CGLM_INLINE
float
glm_pow2(float x) {
return x * x;
}
#endif /* cglm_util_h */

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

@@ -10,12 +10,56 @@
* all functions without suffix are vec3 functions
*/
#ifndef cglm_vec_h
#define cglm_vec_h
/*
Macros:
glm_vec_dup(v, dest)
GLM_VEC3_ONE_INIT
GLM_VEC3_ONE
GLM_YUP
GLM_ZUP
GLM_XUP
#include "cglm-common.h"
#include "cglm-vec-ext.h"
#include "arch/simd/cglm-intrin.h"
Functions:
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);
CGLM_INLINE float glm_vec_norm2(vec3 v);
CGLM_INLINE float glm_vec_norm(vec3 vec);
CGLM_INLINE void glm_vec_add(vec3 v1, vec3 v2, vec3 dest);
CGLM_INLINE void glm_vec_sub(vec3 v1, vec3 v2, vec3 dest);
CGLM_INLINE void glm_vec_scale(vec3 v, float s, vec3 dest);
CGLM_INLINE void glm_vec_scale_as(vec3 v, float s, vec3 dest);
CGLM_INLINE void glm_vec_flipsign(vec3 v);
CGLM_INLINE void glm_vec_inv(vec3 v);
CGLM_INLINE void glm_vec_inv_to(vec3 v, vec3 dest);
CGLM_INLINE void glm_vec_normalize(vec3 v);
CGLM_INLINE void glm_vec_normalize_to(vec3 vec, vec3 dest);
CGLM_INLINE float glm_vec_distance(vec3 v1, vec3 v2);
CGLM_INLINE float glm_vec_angle(vec3 v1, vec3 v2);
CGLM_INLINE void glm_vec_rotate(vec3 v, float angle, vec3 axis);
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);
CGLM_INLINE void glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest);
CGLM_INLINE void glm_vec_minv(vec3 v1, vec3 v2, vec3 dest);
*/
#ifndef cglm_vec3_h
#define cglm_vec3_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_VEC3_ONE_INIT {1.0f, 1.0f, 1.0f}
#define GLM_VEC3_ONE (vec3)GLM_VEC3_ONE_INIT
#define GLM_YUP (vec3){0.0f, 1.0f, 0.0f}
#define GLM_ZUP (vec3){0.0f, 0.0f, 1.0f}
#define GLM_XUP (vec3){1.0f, 0.0f, 0.0f}
/*!
* @brief copy all members of [a] to [dest]
@@ -25,50 +69,17 @@
*/
CGLM_INLINE
void
glm_vec_dup(vec3 a, vec3 dest) {
glm_vec_copy(vec3 a, vec3 dest) {
dest[0] = a[0];
dest[1] = a[1];
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_dup3(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] a source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec4_dup(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
*
* @param[in] a
* @param[in] b
* @param[in] a vector1
* @param[in] b vector2
*
* @return dot product
*/
@@ -78,20 +89,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
* @param[in] b
*
* @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
*
@@ -115,7 +112,7 @@ glm_vec_cross(vec3 a, vec3 b, vec3 d) {
* sqrtf fuction twice but with this func we can avoid func call, maybe this is
* not good name for this func
*
* @param[in] vec vec
* @param[in] v vector
*
* @return norm * norm
*/
@@ -128,7 +125,7 @@ glm_vec_norm2(vec3 v) {
/*!
* @brief norm (magnitude) of vec3
*
* @param[in] vec
* @param[in] vec vector
*
* @return norm
*/
@@ -138,41 +135,11 @@ 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] vec 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
*
* @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
* @param[in] v2
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest destination vector
*/
CGLM_INLINE
@@ -183,33 +150,11 @@ 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
* @param[in] v2
* @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
* @param[in] v2
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest destination vector
*/
CGLM_INLINE
@@ -221,29 +166,7 @@ glm_vec_sub(vec3 v1, vec3 v2, vec3 dest) {
}
/*!
* @brief subtract v2 vector from v1 vector store result in dest
*
* @param[in] v1
* @param[in] v2
* @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 vec3 vector with scalar
* @brief multiply/scale vec3 vector with scalar: result = v * s
*
* @param[in] v vector
* @param[in] s scalar
@@ -258,7 +181,7 @@ glm_vec_scale(vec3 v, float s, vec3 dest) {
}
/*!
* @brief flip sign of all vec3 members
* @brief make vec3 vector scale as specified: result = unit(v) * s
*
* @param[in] v vector
* @param[in] s scalar
@@ -266,6 +189,25 @@ glm_vec_scale(vec3 v, float s, vec3 dest) {
*/
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 flip sign of all vec3 members
*
* @param[in, out] v vector
*/
CGLM_INLINE
void
glm_vec_flipsign(vec3 v) {
v[0] = -v[0];
v[1] = -v[1];
@@ -273,46 +215,27 @@ glm_vec_flipsign(vec3 v) {
}
/*!
* @brief flip sign of all vec4 members
* @brief make vector as inverse/opposite of itself
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination vector
* @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
glm_vec_inv(vec3 v) {
glm_vec_flipsign(v);
}
/*!
* @brief multiply vec4 vector with scalar
* @brief inverse/opposite vector
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination vector
* @param[in] v source
* @param[out] dest destination
*/
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
glm_vec_inv_to(vec3 v, vec3 dest) {
glm_vec_copy(v, dest);
glm_vec_flipsign(dest);
}
/*!
@@ -335,26 +258,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
*
@@ -376,27 +279,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
*
@@ -475,14 +357,14 @@ glm_vec_rotate_m4(mat4 m, vec3 v, vec3 dest) {
res[1] = x[1] * v[0] + y[1] * v[1] + z[1] * v[2];
res[2] = x[2] * v[0] + y[2] * v[1] + z[2] * v[2];
glm_vec_dup(res, dest);
glm_vec_copy(res, dest);
}
/*!
* @brief project a vector onto b vector
*
* @param[in] a
* @param[in] b
* @param[in] a vector1
* @param[in] b vector2
* @param[out] dest projected vector
*/
CGLM_INLINE
@@ -493,4 +375,85 @@ glm_vec_proj(vec3 a, vec3 b, vec3 dest) {
dest);
}
#endif /* cglm_vec_h */
/**
* @brief find center point of two vector
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest center point
*/
CGLM_INLINE
void
glm_vec_center(vec3 v1, vec3 v2, vec3 dest) {
glm_vec_add(v1, v2, dest);
glm_vec_scale(dest, 0.5f, dest);
}
/**
* @brief distance between two vectors
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @return returns distance
*/
CGLM_INLINE
float
glm_vec_distance(vec3 v1, vec3 v2) {
return sqrtf(glm_pow2(v2[0] - v1[0])
+ glm_pow2(v2[1] - v1[1])
+ glm_pow2(v2[2] - v1[2]));
}
/*!
* @brief max values of vectors
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest) {
if (v1[0] > v2[0])
dest[0] = v1[0];
else
dest[0] = v2[0];
if (v1[1] > v2[1])
dest[1] = v1[1];
else
dest[1] = v2[1];
if (v1[2] > v2[2])
dest[2] = v1[2];
else
dest[2] = v2[2];
}
/*!
* @brief min values of vectors
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec_minv(vec3 v1, vec3 v2, vec3 dest) {
if (v1[0] < v2[0])
dest[0] = v1[0];
else
dest[0] = v2[0];
if (v1[1] < v2[1])
dest[1] = v1[1];
else
dest[1] = v2[1];
if (v1[2] < v2[2])
dest[2] = v1[2];
else
dest[2] = v2[2];
}
#endif /* cglm_vec3_h */

178
include/cglm/vec4-ext.h Normal file
View File

@@ -0,0 +1,178 @@
/*
* 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_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);
CGLM_INLINE bool glm_vec4_eq_eps(vec4 v, float val);
CGLM_INLINE bool glm_vec4_eq_all(vec4 v);
CGLM_INLINE bool glm_vec4_eqv(vec4 v1, vec4 v2);
CGLM_INLINE bool glm_vec4_eqv_eps(vec3 v1, vec3 v2);
CGLM_INLINE float glm_vec4_max(vec4 v);
CGLM_INLINE float glm_vec4_min(vec4 v);
*/
#ifndef cglm_vec4_ext_h
#define cglm_vec4_ext_h
#include "common.h"
#include "vec3-ext.h"
#include <stdbool.h>
#include <math.h>
#include <float.h>
/*!
* @brief multiplies individual items, just for convenient like SIMD
*
* @param a v1
* @param b v2
* @param d v3 = (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2], v1[3] * v2[3])
*/
CGLM_INLINE
void
glm_vec4_mulv(vec4 a, vec4 b, vec4 d) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(d, _mm_mul_ps(_mm_load_ps(a), _mm_load_ps(b)));
#else
d[0] = a[0] * b[0];
d[1] = a[1] * b[1];
d[2] = a[2] * b[2];
d[3] = a[3] * b[3];
#endif
}
/*!
* @brief fill a vector with specified value
*
* @param val value
* @param d dest
*/
CGLM_INLINE
void
glm_vec4_broadcast(float val, vec4 d) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(d, _mm_set1_ps(val));
#else
d[0] = d[1] = d[2] = d[3] = val;
#endif
}
/*!
* @brief check if vector is equal to value (without epsilon)
*
* @param v vector
* @param val value
*/
CGLM_INLINE
bool
glm_vec4_eq(vec4 v, float val) {
return v[0] == val
&& v[0] == v[1]
&& v[0] == v[2]
&& v[0] == v[3];
}
/*!
* @brief check if vector is equal to value (with epsilon)
*
* @param v vector
* @param val value
*/
CGLM_INLINE
bool
glm_vec4_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
&& fabsf(v[3] - val) <= FLT_EPSILON;
}
/*!
* @brief check if vectors members are equal (without epsilon)
*
* @param v vector
*/
CGLM_INLINE
bool
glm_vec4_eq_all(vec4 v) {
return v[0] == v[1]
&& v[0] == v[2]
&& v[0] == v[3];
}
/*!
* @brief check if vector is equal to another (without epsilon)
*
* @param v1 vector
* @param v2 vector
*/
CGLM_INLINE
bool
glm_vec4_eqv(vec4 v1, vec4 v2) {
return v1[0] == v2[0]
&& v1[1] == v2[1]
&& v1[2] == v2[2]
&& v1[3] == v2[3];
}
/*!
* @brief check if vector is equal to another (with epsilon)
*
* @param v1 vector
* @param v2 vector
*/
CGLM_INLINE
bool
glm_vec4_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
&& fabsf(v1[3] - v2[3]) <= FLT_EPSILON;
}
/*!
* @brief max value of vector
*
* @param v vector
*/
CGLM_INLINE
float
glm_vec4_max(vec4 v) {
float max;
max = glm_vec_max(v);
if (v[3] > max)
max = v[3];
return max;
}
/*!
* @brief min value of vector
*
* @param v vector
*/
CGLM_INLINE
float
glm_vec4_min(vec4 v) {
float min;
min = glm_vec_min(v);
if (v[3] < min)
min = v[3];
return min;
}
#endif /* cglm_vec4_ext_h */

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

@@ -0,0 +1,385 @@
/*
* 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)
GLM_VEC4_ONE_INIT
GLM_VEC4_BLACK_INIT
GLM_VEC4_ONE
GLM_VEC4_BLACK
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_inv(vec4 v);
CGLM_INLINE void glm_vec4_inv_to(vec4 v, vec4 dest);
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);
CGLM_INLINE void glm_vec4_maxv(vec4 v1, vec4 v2, vec4 dest);
CGLM_INLINE void glm_vec4_minv(vec4 v1, vec4 v2, vec4 dest);
*/
#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)
#define GLM_VEC4_ONE_INIT {1.0f, 1.0f, 1.0f, 1.0f}
#define GLM_VEC4_BLACK_INIT {0.0f, 0.0f, 0.0f, 1.0f}
#define GLM_VEC4_ONE (vec4)GLM_VEC4_ONE_INIT
#define GLM_VEC4_BLACK (vec4)GLM_VEC4_BLACK_INIT
/*!
* @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 make vector as inverse/opposite of itself
*
* @param[in, out] v vector
*/
CGLM_INLINE
void
glm_vec4_inv(vec4 v) {
glm_vec4_flipsign(v);
}
/*!
* @brief inverse/opposite vector
*
* @param[in] v source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec4_inv_to(vec4 v, vec4 dest) {
glm_vec4_copy(v, dest);
glm_vec4_flipsign(dest);
}
/*!
* @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]));
}
/*!
* @brief max values of vectors
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec4_maxv(vec4 v1, vec4 v2, vec4 dest) {
if (v1[0] > v2[0])
dest[0] = v1[0];
else
dest[0] = v2[0];
if (v1[1] > v2[1])
dest[1] = v1[1];
else
dest[1] = v2[1];
if (v1[2] > v2[2])
dest[2] = v1[2];
else
dest[2] = v2[2];
if (v1[3] > v2[3])
dest[3] = v1[3];
else
dest[3] = v2[3];
}
/*!
* @brief min values of vectors
*
* @param[in] v1 vector1
* @param[in] v2 vector2
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_vec4_minv(vec4 v1, vec4 v2, vec4 dest) {
if (v1[0] < v2[0])
dest[0] = v1[0];
else
dest[0] = v2[0];
if (v1[1] < v2[1])
dest[1] = v1[1];
else
dest[1] = v2[1];
if (v1[2] < v2[2])
dest[2] = v1[2];
else
dest[2] = v2[2];
if (v1[3] < v2[3])
dest[3] = v1[3];
else
dest[3] = v2[3];
}
#endif /* cglm_vec4_h */

15
include/cglm/version.h Normal file
View File

@@ -0,0 +1,15 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_version_h
#define cglm_version_h
#define CGLM_VERSION_MAJOR 0
#define CGLM_VERSION_MINOR 3
#define CGLM_VERSION_PATCH 3
#endif /* cglm_version_h */

View File

@@ -18,44 +18,82 @@ AM_CFLAGS = -Wall \
lib_LTLIBRARIES = libcglm.la
libcglm_la_LDFLAGS = -no-undefined -version-info 0:1:0
nobase_include_HEADERS = include/cglm.h \
include/cglm-call.h \
include/cglm-cam.h \
include/cglm-io.h \
include/cglm-mat3.h \
include/cglm-types.h \
include/cglm-common.h \
include/cglm-affine.h \
include/cglm-vec.h \
include/cglm-euler.h \
include/cglm-util.h \
include/cglm-quat.h \
include/cglm-mat.h \
include/cglm-affine-mat.h \
include/cglm-platform.h \
include/cglm-opengl.h \
include/arch/simd/cglm-mat-simd-avx.h \
include/arch/simd/cglm-affine-mat-avx.h \
include/arch/simd/cglm-quat-simd.h \
include/arch/simd/cglm-affine-mat-sse2.h \
include/arch/simd/cglm-mat3-simd-sse2.h \
include/arch/simd/cglm-mat-simd-sse2.h \
include/arch/simd/cglm-intrin.h \
include/call/cglmc-euler.h \
include/call/cglmc-quat.h \
include/call/cglmc-cam.h \
include/call/cglmc-io.h \
include/call/cglmc-affine.h \
include/call/cglmc-vec.h \
include/call/cglmc-mat3.h \
include/call/cglmc-mat.h
checkLDFLAGS = -L./.libs \
-L./test/lib/cmocka/build/src \
-lcmocka \
-lm \
-lcglm
checkCFLAGS = -I./test/lib/cmocka/include \
-I./include
check_PROGRAMS = test/tests
TESTS = $(check_PROGRAMS)
test_tests_LDFLAGS = $(checkLDFLAGS)
test_tests_CFLAGS = $(checkCFLAGS)
cglmdir=$(includedir)/cglm
cglm_HEADERS = include/cglm/version.h \
include/cglm/cglm.h \
include/cglm/call.h \
include/cglm/cam.h \
include/cglm/io.h \
include/cglm/mat4.h \
include/cglm/mat3.h \
include/cglm/types.h \
include/cglm/common.h \
include/cglm/affine.h \
include/cglm/vec3.h \
include/cglm/vec3-ext.h \
include/cglm/vec4.h \
include/cglm/vec4-ext.h \
include/cglm/euler.h \
include/cglm/util.h \
include/cglm/quat.h \
include/cglm/affine-mat.h
cglm_calldir=$(includedir)/cglm/call
cglm_call_HEADERS = include/cglm/call/mat4.h \
include/cglm/call/mat3.h \
include/cglm/call/vec3.h \
include/cglm/call/vec4.h \
include/cglm/call/affine.h \
include/cglm/call/io.h \
include/cglm/call/cam.h \
include/cglm/call/quat.h \
include/cglm/call/euler.h
cglm_simddir=$(includedir)/cglm/simd
cglm_simd_HEADERS = include/cglm/simd/intrin.h
cglm_simd_sse2dir=$(includedir)/cglm/simd/sse2
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
include/cglm/simd/sse2/mat4.h \
include/cglm/simd/sse2/mat3.h \
include/cglm/simd/sse2/quat.h
cglm_simd_avxdir=$(includedir)/cglm/simd/avx
cglm_simd_avx_HEADERS = include/cglm/simd/avx/mat4.h \
include/cglm/simd/avx/affine.h
cglm_simd_neondir=$(includedir)/cglm/simd/neon
cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.h
libcglm_la_SOURCES=\
src/cglm-euler.c \
src/clgm-affine.c \
src/cglm-io.c \
src/cglm-quat.c \
src/cglm-cam.c \
src/cglm-vec.c \
src/cglm-mat3.c \
src/cglm-mat.c
src/euler.c \
src/affine.c \
src/io.c \
src/quat.c \
src/cam.c \
src/vec3.c \
src/vec4.c \
src/mat3.c \
src/mat4.c
test_tests_SOURCES=\
test/src/test_common.c \
test/src/test_main.c \
test/src/test_mat4.c
all-local:
sh ./post-build.sh

19
post-build.sh Normal file
View File

@@ -0,0 +1,19 @@
#! /bin/sh
#
# Copyright (c), Recep Aslantas.
#
# MIT License (MIT), http://opensource.org/licenses/MIT
# Full license can be found in the LICENSE file
#
cd $(dirname "$0")
mkdir -p .libs
if [ "$(uname)" = "Darwin" ]; then
ln -sf $(pwd)/test/lib/cmocka/build/src/libcmocka.0.dylib \
.libs/libcmocka.0.dylib;
else
ln -sf $(pwd)/test/lib/cmocka/build/src/libcmocka.so.0 \
.libs/libcmocka.so.0;
fi

View File

@@ -5,7 +5,8 @@
* Full license can be found in the LICENSE file
*/
#include "../include/cglm.h"
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void

View File

@@ -5,7 +5,8 @@
* Full license can be found in the LICENSE file
*/
#include "../include/cglm.h"
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void

22
src/config.h Normal file
View File

@@ -0,0 +1,22 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm__config__h_
#define cglm__config__h_
#if defined(_WIN32) || defined(WIN32)
/* Exclude rarely-used stuff from Windows headers */
# define WIN32_LEAN_AND_MEAN
# include <SDKDDKVer.h>
/* Windows Header Files: */
# include <windows.h>
#endif
#endif /* cglm__config__h_ */

23
src/dllmain.c 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
*/
#include "config.h"
BOOL
APIENTRY
DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

View File

@@ -5,7 +5,8 @@
* Full license can be found in the LICENSE file
*/
#include "../include/cglm.h"
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void

View File

@@ -5,7 +5,8 @@
* Full license can be found in the LICENSE file
*/
#include "../include/cglm.h"
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void

View File

@@ -5,12 +5,19 @@
* Full license can be found in the LICENSE file
*/
#include "../include/cglm.h"
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void
glmc_mat3_dup(mat3 mat, mat3 dest) {
glm_mat3_dup(mat, dest);
glmc_mat3_copy(mat3 mat, mat3 dest) {
glm_mat3_copy(mat, dest);
}
CGLM_EXPORT
void
glmc_mat3_identity(mat3 mat) {
glm_mat3_identity(mat);
}
CGLM_EXPORT

View File

@@ -5,18 +5,25 @@
* Full license can be found in the LICENSE file
*/
#include "../include/cglm.h"
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void
glmc_mat4_udup(mat4 mat, mat4 dest) {
glm_mat4_dup(mat, dest);
glmc_mat4_ucopy(mat4 mat, mat4 dest) {
glm_mat4_copy(mat, dest);
}
CGLM_EXPORT
void
glmc_mat4_dup(mat4 mat, mat4 dest) {
glm_mat4_dup(mat, dest);
glmc_mat4_copy(mat4 mat, mat4 dest) {
glm_mat4_copy(mat, dest);
}
CGLM_EXPORT
void
glmc_mat4_identity(mat4 mat) {
glm_mat4_identity(mat);
}
CGLM_EXPORT

View File

@@ -5,7 +5,8 @@
* Full license can be found in the LICENSE file
*/
#include "../include/cglm.h"
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void

View File

@@ -5,24 +5,13 @@
* Full license can be found in the LICENSE file
*/
#include "../include/cglm.h"
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void
glmc_vec_dup(vec3 a, vec3 dest) {
glm_vec_dup(a, dest);
}
CGLM_EXPORT
void
glmc_vec4_dup3(vec4 a, vec3 dest) {
glm_vec4_dup3(a, dest);
}
CGLM_EXPORT
void
glmc_vec4_dup(vec4 v, vec4 dest) {
glm_vec4_dup(v, dest);
glmc_vec_copy(vec3 a, vec3 dest) {
glm_vec_copy(a, dest);
}
CGLM_EXPORT
@@ -31,12 +20,6 @@ glmc_vec_dot(vec3 a, vec3 b) {
return glm_vec_dot(a, b);
}
CGLM_EXPORT
float
glmc_vec4_dot(vec4 a, vec4 b) {
return glm_vec4_dot(a, b);
}
CGLM_EXPORT
void
glmc_vec_cross(vec3 a, vec3 b, vec3 d) {
@@ -49,78 +32,48 @@ glmc_vec_norm(vec3 vec) {
return glm_vec_norm(vec);
}
CGLM_EXPORT
float
glmc_vec4_norm(vec4 vec) {
return glm_vec4_norm(vec);
}
CGLM_EXPORT
void
glmc_vec_normalize_to(vec3 vec, vec3 dest) {
glm_vec_normalize_to(vec, dest);
}
CGLM_EXPORT
void
glmc_vec4_normalize_to(vec4 vec, vec4 dest) {
glm_vec4_normalize_to(vec, dest);
}
CGLM_EXPORT
void
glmc_vec_normalize(vec3 v) {
glm_vec_normalize(v);
}
CGLM_EXPORT
void
glmc_vec4_normalize(vec4 v) {
glm_vec4_normalize(v);
}
CGLM_EXPORT
float
glmc_vec_norm2(vec3 vec) {
return glm_vec_norm2(vec);
}
CGLM_EXPORT
float
glmc_vec4_norm2(vec4 vec) {
return glm_vec4_norm2(vec);
}
CGLM_EXPORT
void
glmc_vec_add(vec3 v1, vec3 v2, vec3 dest) {
glm_vec_add(v1, v2, dest);
}
CGLM_EXPORT
void
glmc_vec4_add(vec4 v1, vec4 v2, vec4 dest) {
glm_vec4_add(v1, v2, dest);
}
CGLM_EXPORT
void
glmc_vec_sub(vec3 v1, vec3 v2, vec3 dest) {
glm_vec_sub(v1, v2, dest);
}
CGLM_EXPORT
void
glmc_vec4_sub(vec4 v1, vec4 v2, vec4 dest) {
glm_vec4_sub(v1, v2, dest);
}
CGLM_EXPORT
void
glmc_vec_scale(vec3 v, float s, vec3 dest) {
glm_vec_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_vec_flipsign(vec3 v) {
@@ -129,14 +82,14 @@ glmc_vec_flipsign(vec3 v) {
CGLM_EXPORT
void
glmc_vec4_flipsign(vec4 v) {
glm_vec4_flipsign(v);
glmc_vec_inv(vec3 v) {
glm_vec_inv(v);
}
CGLM_EXPORT
void
glmc_vec4_scale(vec4 v, float s, vec4 dest) {
glm_vec4_scale(v, s, dest);
glmc_vec_inv_to(vec3 v, vec3 dest) {
glm_vec_inv_to(v, dest);
}
CGLM_EXPORT
@@ -162,3 +115,27 @@ void
glmc_vec_proj(vec3 a, vec3 b, vec3 dest) {
glm_vec_proj(a, b, dest);
}
CGLM_EXPORT
void
glmc_vec_center(vec3 v1, vec3 v2, vec3 dest) {
glm_vec_center(v1, v2, dest);
}
CGLM_EXPORT
float
glmc_vec_distance(vec3 v1, vec3 v2) {
return glm_vec_distance(v1, v2);
}
CGLM_EXPORT
void
glmc_vec_maxv(vec3 v1, vec3 v2, vec3 dest) {
glm_vec_minv(v1, v2, dest);
}
CGLM_EXPORT
void
glmc_vec_minv(vec3 v1, vec3 v2, vec3 dest) {
glm_vec_maxv(v1, v2, dest);
}

111
src/vec4.c Normal file
View File

@@ -0,0 +1,111 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void
glmc_vec4_copy3(vec4 a, vec3 dest) {
glm_vec4_copy3(a, dest);
}
CGLM_EXPORT
void
glmc_vec4_copy(vec4 v, vec4 dest) {
glm_vec4_copy(v, dest);
}
CGLM_EXPORT
float
glmc_vec4_dot(vec4 a, vec4 b) {
return glm_vec4_dot(a, b);
}
CGLM_EXPORT
float
glmc_vec4_norm(vec4 vec) {
return glm_vec4_norm(vec);
}
CGLM_EXPORT
void
glmc_vec4_normalize_to(vec4 vec, vec4 dest) {
glm_vec4_normalize_to(vec, dest);
}
CGLM_EXPORT
void
glmc_vec4_normalize(vec4 v) {
glm_vec4_normalize(v);
}
CGLM_EXPORT
float
glmc_vec4_norm2(vec4 vec) {
return glm_vec4_norm2(vec);
}
CGLM_EXPORT
void
glmc_vec4_add(vec4 v1, vec4 v2, vec4 dest) {
glm_vec4_add(v1, v2, dest);
}
CGLM_EXPORT
void
glmc_vec4_sub(vec4 v1, vec4 v2, vec4 dest) {
glm_vec4_sub(v1, v2, dest);
}
CGLM_EXPORT
void
glmc_vec4_scale(vec4 v, float s, vec4 dest) {
glm_vec4_scale(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_vec4_flipsign(vec4 v) {
glm_vec4_flipsign(v);
}
CGLM_EXPORT
void
glmc_vec4_inv(vec4 v) {
glm_vec4_inv(v);
}
CGLM_EXPORT
void
glmc_vec4_inv_to(vec4 v, vec4 dest) {
glm_vec4_inv_to(v, dest);
}
CGLM_EXPORT
float
glmc_vec4_distance(vec4 v1, vec4 v2) {
return glm_vec4_distance(v1, v2);
}
CGLM_EXPORT
void
glmc_vec4_maxv(vec4 v1, vec4 v2, vec4 dest) {
glm_vec4_minv(v1, v2, dest);
}
CGLM_EXPORT
void
glmc_vec4_minv(vec4 v1, vec4 v2, vec4 dest) {
glm_vec4_maxv(v1, v2, dest);
}

1
test/lib/cmocka Submodule

Submodule test/lib/cmocka added at 5f61d2f188

52
test/src/test_common.c Normal file
View File

@@ -0,0 +1,52 @@
/*
* Copyright (c), Recep Aslantas.
* MIT License (MIT), http://opensource.org/licenses/MIT
*/
#include "test_common.h"
#include <stdlib.h>
#define m 4
#define n 4
void
test_rand_mat4(mat4 dest) {
glm_mat4_copy(GLM_MAT4_IDENTITY, dest);
srand((unsigned int)time(NULL));
/* random position */
dest[3][0] = drand48();
dest[3][1] = drand48();
dest[3][2] = drand48();
/* random rotatation around random axis with random angle */
glm_rotate(dest, drand48(), (vec3){drand48(), drand48(), drand48()});
/* random scale */
/* glm_scale(dest, (vec3){drand48(), drand48(), drand48()}); */
}
void
test_assert_mat4_eq(mat4 m1, mat4 m2) {
int i, j, k;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
for (k = 0; k < m; k++)
assert_true(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009);
}
}
}
void
test_assert_mat4_eq2(mat4 m1, mat4 m2, float eps) {
int i, j, k;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
for (k = 0; k < m; k++)
assert_true(fabsf(m1[i][j] - m2[i][j]) <= eps);
}
}
}

34
test/src/test_common.h Normal file
View File

@@ -0,0 +1,34 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef test_common_h
#define test_common_h
#include <stdarg.h>
#include <stdint.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#include <stdbool.h>
#include <cglm/cglm.h>
#include <cglm/call.h>
void
test_rand_mat4(mat4 dest);
void
test_assert_mat4_eq(mat4 m1, mat4 m2);
void
test_assert_mat4_eq2(mat4 m1, mat4 m2, float eps);
#endif /* test_common_h */

19
test/src/test_main.c Normal file
View File

@@ -0,0 +1,19 @@
/*
* Copyright (c), Recep Aslantas.
* MIT License (MIT), http://opensource.org/licenses/MIT
*/
#include "test_common.h"
#include "test_tests.h"
int
main(int argc, const char * argv[]) {
const struct CMUnitTest tests[] = {
/* mat4 */
cmocka_unit_test(test_mat4),
};
return cmocka_run_group_tests(tests,
NULL,
NULL);
}

94
test/src/test_mat4.c Normal file
View File

@@ -0,0 +1,94 @@
/*
* 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"
#define m 4
#define n 4
void
test_mat4(void **state) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
mat4 m3;
mat4 m4 = GLM_MAT4_ZERO_INIT;
mat4 m5;
int i, j, k;
/* test identity matrix multiplication */
glm_mat4_mul(m1, m2, m3);
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
if (i == j)
assert_true(m3[i][j] == 1.0f);
else
assert_true(m3[i][j] == 0.0f);
}
}
/* test random matrices */
/* random matrices */
test_rand_mat4(m1);
test_rand_mat4(m2);
glm_mat4_mul(m1, m2, m3);
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
for (k = 0; k < m; k++)
/* column-major */
m4[i][j] += m1[k][j] * m2[i][k];
}
}
test_assert_mat4_eq(m3, m4);
/* test pre compiled */
glmc_mat4_mul(m1, m2, m3);
test_assert_mat4_eq(m3, m4);
for (i = 0; i < 100000; i++) {
test_rand_mat4(m3);
test_rand_mat4(m4);
/* test inverse precise */
glm_mat4_inv_precise(m3, m4);
glm_mat4_inv_precise(m4, m5);
test_assert_mat4_eq(m3, m5);
test_rand_mat4(m3);
test_rand_mat4(m4);
glmc_mat4_inv_precise(m3, m4);
glmc_mat4_inv_precise(m4, m5);
test_assert_mat4_eq(m3, m5);
/* test inverse rcp */
test_rand_mat4(m3);
test_rand_mat4(m4);
glm_mat4_inv_fast(m3, m4);
glm_mat4_inv_fast(m4, m5);
test_assert_mat4_eq2(m3, m5, 0.0009f);
test_rand_mat4(m3);
test_rand_mat4(m4);
glmc_mat4_inv(m3, m4);
glmc_mat4_inv(m4, m5);
test_assert_mat4_eq2(m3, m5, 0.0009f);
}
/* print */
glm_mat4_print(m3, stderr);
glm_mat4_print(m4, stderr);
/* test determinant */
assert_int_equal(glm_mat4_det(m1), glmc_mat4_det(m1));
#if defined( __SSE2__ )
assert_int_equal(glmc_mat4_det(m1), glm_mat4_det_sse2(m1));
#endif
}

12
test/src/test_tests.h Normal file
View File

@@ -0,0 +1,12 @@
/*
* Copyright (c), Recep Aslantas.
* MIT License (MIT), http://opensource.org/licenses/MIT
*/
#ifndef test_tests_h
#define test_tests_h
/* mat4 */
void test_mat4(void **state);
#endif /* test_tests_h */

4
win/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
!cglm.sln
!cglm.vcxproj
!cglm.vcxproj.filters
!packages.config

1
win/build.bat Normal file
View File

@@ -0,0 +1 @@
msbuild cglm.vcxproj /p:Configuration=Release

28
win/cglm.sln Normal file
View File

@@ -0,0 +1,28 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26403.7
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cglm", "cglm.vcxproj", "{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Debug|x64.ActiveCfg = Debug|x64
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Debug|x64.Build.0 = Debug|x64
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Debug|x86.ActiveCfg = Debug|Win32
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Debug|x86.Build.0 = Debug|Win32
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Release|x64.ActiveCfg = Release|x64
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Release|x64.Build.0 = Release|x64
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Release|x86.ActiveCfg = Release|Win32
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

218
win/cglm.vcxproj Normal file
View File

@@ -0,0 +1,218 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\affine.c" />
<ClCompile Include="..\src\cam.c" />
<ClCompile Include="..\src\dllmain.c" />
<ClCompile Include="..\src\euler.c" />
<ClCompile Include="..\src\io.c" />
<ClCompile Include="..\src\mat3.c" />
<ClCompile Include="..\src\mat4.c" />
<ClCompile Include="..\src\quat.c" />
<ClCompile Include="..\src\vec3.c" />
<ClCompile Include="..\src\vec4.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\include\cglm\affine-mat.h" />
<ClInclude Include="..\include\cglm\affine.h" />
<ClInclude Include="..\include\cglm\call.h" />
<ClInclude Include="..\include\cglm\call\affine.h" />
<ClInclude Include="..\include\cglm\call\cam.h" />
<ClInclude Include="..\include\cglm\call\euler.h" />
<ClInclude Include="..\include\cglm\call\io.h" />
<ClInclude Include="..\include\cglm\call\mat3.h" />
<ClInclude Include="..\include\cglm\call\mat4.h" />
<ClInclude Include="..\include\cglm\call\quat.h" />
<ClInclude Include="..\include\cglm\call\vec3.h" />
<ClInclude Include="..\include\cglm\call\vec4.h" />
<ClInclude Include="..\include\cglm\cam.h" />
<ClInclude Include="..\include\cglm\cglm.h" />
<ClInclude Include="..\include\cglm\common.h" />
<ClInclude Include="..\include\cglm\euler.h" />
<ClInclude Include="..\include\cglm\io.h" />
<ClInclude Include="..\include\cglm\mat3.h" />
<ClInclude Include="..\include\cglm\mat4.h" />
<ClInclude Include="..\include\cglm\quat.h" />
<ClInclude Include="..\include\cglm\simd\avx\affine.h" />
<ClInclude Include="..\include\cglm\simd\avx\mat4.h" />
<ClInclude Include="..\include\cglm\simd\intrin.h" />
<ClInclude Include="..\include\cglm\simd\neon\mat4.h" />
<ClInclude Include="..\include\cglm\simd\sse2\affine.h" />
<ClInclude Include="..\include\cglm\simd\sse2\mat3.h" />
<ClInclude Include="..\include\cglm\simd\sse2\mat4.h" />
<ClInclude Include="..\include\cglm\simd\sse2\quat.h" />
<ClInclude Include="..\include\cglm\types.h" />
<ClInclude Include="..\include\cglm\util.h" />
<ClInclude Include="..\include\cglm\vec3-ext.h" />
<ClInclude Include="..\include\cglm\vec3.h" />
<ClInclude Include="..\include\cglm\vec4-ext.h" />
<ClInclude Include="..\include\cglm\vec4.h" />
<ClInclude Include="..\include\cglm\version.h" />
<ClInclude Include="..\src\config.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>cglm</RootNamespace>
<WindowsTargetPlatformVersion>10.0.14393.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<CodeAnalysisRuleSet>NativeRecommendedRules.ruleset</CodeAnalysisRuleSet>
<RunCodeAnalysis>true</RunCodeAnalysis>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<CodeAnalysisRuleSet>NativeRecommendedRules.ruleset</CodeAnalysisRuleSet>
<RunCodeAnalysis>true</RunCodeAnalysis>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<CodeAnalysisRuleSet>NativeRecommendedRules.ruleset</CodeAnalysisRuleSet>
<RunCodeAnalysis>true</RunCodeAnalysis>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<CodeAnalysisRuleSet>NativeRecommendedRules.ruleset</CodeAnalysisRuleSet>
<RunCodeAnalysis>true</RunCodeAnalysis>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
<DebugInformationFormat>None</DebugInformationFormat>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<PrecompiledHeaderFile />
<CompileAs>CompileAsC</CompileAs>
<WholeProgramOptimization>true</WholeProgramOptimization>
<EnablePREfast>true</EnablePREfast>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<IntrinsicFunctions>true</IntrinsicFunctions>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PrecompiledHeaderFile />
<CompileAs>CompileAsC</CompileAs>
<DebugInformationFormat>None</DebugInformationFormat>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<EnablePREfast>true</EnablePREfast>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
<DebugInformationFormat>None</DebugInformationFormat>
<PrecompiledHeaderFile />
<CompileAs>CompileAsC</CompileAs>
<EnablePREfast>true</EnablePREfast>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
<DebugInformationFormat>None</DebugInformationFormat>
<PrecompiledHeaderFile />
<CompileAs>CompileAsC</CompileAs>
<EnablePREfast>true</EnablePREfast>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

180
win/cglm.vcxproj.filters Normal file
View File

@@ -0,0 +1,180 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="src">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="include">
<UniqueIdentifier>{f46634e5-c098-41a0-afb3-45afb6a53593}</UniqueIdentifier>
</Filter>
<Filter Include="include\cglm">
<UniqueIdentifier>{b982cbd3-03d9-4557-bed8-8224e4d95945}</UniqueIdentifier>
</Filter>
<Filter Include="include\cglm\call">
<UniqueIdentifier>{6a2a4ebb-ac68-4ed6-a4a1-f6d2243814e9}</UniqueIdentifier>
</Filter>
<Filter Include="include\cglm\simd">
<UniqueIdentifier>{4bcb64d3-e522-48f7-85ef-3ddfacf50874}</UniqueIdentifier>
</Filter>
<Filter Include="include\cglm\simd\sse2">
<UniqueIdentifier>{ccf6244c-614c-4016-a5d9-8a78ffc7765a}</UniqueIdentifier>
</Filter>
<Filter Include="include\cglm\simd\avx">
<UniqueIdentifier>{8607b04c-6eb6-49af-8ac2-e534ba78bf76}</UniqueIdentifier>
</Filter>
<Filter Include="include\cglm\simd\neon">
<UniqueIdentifier>{fb97f276-fe14-47ba-8a9f-01032f065a19}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\affine.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\cam.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\dllmain.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\euler.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\io.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\mat3.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\mat4.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\quat.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\vec3.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\vec4.c">
<Filter>src</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\config.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\affine.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\cam.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\euler.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\io.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\mat3.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\mat4.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\quat.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\vec3.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\vec4.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\avx\affine.h">
<Filter>include\cglm\simd\avx</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\avx\mat4.h">
<Filter>include\cglm\simd\avx</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\neon\mat4.h">
<Filter>include\cglm\simd\neon</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\sse2\affine.h">
<Filter>include\cglm\simd\sse2</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\sse2\mat3.h">
<Filter>include\cglm\simd\sse2</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\sse2\mat4.h">
<Filter>include\cglm\simd\sse2</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\sse2\quat.h">
<Filter>include\cglm\simd\sse2</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\intrin.h">
<Filter>include\cglm\simd</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\affine.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\affine-mat.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\cam.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\cglm.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\common.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\euler.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\io.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\mat3.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\mat4.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\quat.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\types.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\util.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\vec3.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\vec3-ext.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\vec4.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\vec4-ext.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\version.h">
<Filter>include\cglm</Filter>
</ClInclude>
</ItemGroup>
</Project>