Compare commits

...

35 Commits

Author SHA1 Message Date
Recep Aslantas
e5d88f22a0 Update README.md 2021-05-30 15:31:06 +03:00
Recep Aslantas
8e10ab2b49 Update features.rst 2021-05-30 15:30:55 +03:00
Recep Aslantas
4ede0815d4 Update features.rst 2021-05-30 15:28:38 +03:00
Recep Aslantas
7d16e3583f Merge branch 'master' of https://github.com/recp/cglm 2021-05-30 15:23:38 +03:00
Recep Aslantas
6011baff06 Update opt.rst 2021-05-30 15:23:30 +03:00
Recep Aslantas
af92df4e84 ci: migrate cglm from tavis-ci.org to travis-ci.com 2021-05-30 15:17:33 +03:00
Recep Aslantas
94381d3067 struct: fix glms_perspective_resize
since struct param is copy-by-value, result was noop
2021-05-30 13:06:49 +03:00
Recep Aslantas
0e794f8f8f struct: fix glms_persp_move_far
since struct param is copy-by-value, result was noop
2021-05-30 13:02:10 +03:00
Recep Aslantas
b895e424b0 docs: add docs about clipspace configuration 2021-05-30 12:53:04 +03:00
Recep Aslantas
a2b8858e36 win: suppress warnings 2021-05-30 12:50:30 +03:00
Recep Aslantas
9d08407897 win: suppress warnings 2021-05-30 12:46:26 +03:00
Recep Aslantas
8898c3b471 win: add missing files to build 2021-05-30 12:43:17 +03:00
Recep Aslantas
f0c2860179 Merge pull request #203 from bwhmather/meson-fixes
Update lists of source files in meson.build
2021-05-29 14:31:41 +03:00
Ben Mather
f142e8e16e build: rebuild list of test files in meson.build 2021-05-29 10:43:29 +01:00
Ben Mather
5ac916236c build: fix lists broken by missing commas in meson.build 2021-05-29 10:43:29 +01:00
Ben Mather
4327935b9f style: fix trailing whitespace in meson.build 2021-05-29 10:43:23 +01:00
Recep Aslantas
086b40bf6a Merge pull request #201 from hartenfels/master
Add struct clipspace files to autoconf build
2021-05-24 22:31:33 +03:00
Carsten Hartenfels
af3b356762 Add struct clipspace files to autoconf build
They weren't being installed.

Fixes #200.
2021-05-24 21:20:27 +02:00
Recep Aslantas
9ac291c673 Merge pull request #198 from raedwulf/clipspace
Clipspace implementations for left/righted-handed coordinate systems and [-1,1] and [0,1] clipspace
2021-05-23 18:59:01 +03:00
Tai Chi Minh Ralph Eastwood
7f7e9f69da clipspace: add struct API implementations 2021-05-22 22:41:03 +02:00
Tai Chi Minh Ralph Eastwood
8ddb5d5740 build: fix incorrect include paths for libcglm 2021-05-14 16:58:48 +02:00
Tai Chi Minh Ralph Eastwood
56ec058c7d style: fix documentation consistency for describing clipspace 2021-05-14 16:55:16 +02:00
Tai Chi Minh Ralph Eastwood
a5af9e5eac build: fix Makefile.am missing clipspace source files 2021-05-14 16:49:18 +02:00
Tai Chi Minh Ralph Eastwood
4d20f97275 clipspace: fix typo'd clip control define 2021-05-14 16:33:16 +02:00
Tai Chi Minh Ralph Eastwood
89e8c352ec style: fix missing whitespace for alignment
Co-authored-by: Michael <michael.guyver@gmail.com>
2021-05-14 15:44:10 +02:00
Tai Chi Minh Ralph Eastwood
403097d56c build: fix duplicate line in CMakeLists.txt 2021-05-14 15:27:28 +02:00
Tai Chi Minh Ralph Eastwood
eddaf464ff style: fix missing whitespace for alignment
Co-authored-by: Michael <michael.guyver@gmail.com>
2021-05-14 15:25:29 +02:00
Tai Chi Minh Ralph Eastwood
7065011bf3 clipspace: add initial implementations LH, RH and NO, ZO
Add the initial implementations of the left-handed and right-handed
coordinate systems as well as clipspace depth values of [-1, 0] and
[0, 1].
2021-05-13 23:22:58 +02:00
michaelg
db46ea110a Updated README.md to remove ref to glm_cmp stub 2021-05-13 23:18:05 +02:00
michaelg
c013bd462c Add LH & RH_NO perspective functions
This commit adds functions `glm_perspective_lh_no` and
`glm_perspective_rh_no` to the code. Unit tests are added and this
commit follows the new pattern of adding the a new file per
coordinate-system and clip-space tuple.

. Makefile.am updated
. removed test/glm_cmp project stub
. unit tests include naive implementations to as well as magic number
  ref-data generated by the corresponding GLM functions.

No tests run yet on Windows or Mac.
2021-05-13 23:18:05 +02:00
michaelg
b3a18b8a15 Add glm_perspective_rh_zo function + tests
This commit adds the RH/ZO perspective function. It does so in the new
file `cam_rh_zo.h` and further refactors the LH variant into new file
`cam_lh_zo.h`. This creates some churn in the tests and configuration
files as new test files were added as well, and all these changes found
their way into the build files.

Tests passing on Linux.
2021-05-13 23:18:05 +02:00
michaelg
1bce62c371 Add function glm_perspective_lh_zo
This commit adds the function `glm_perspective_lh_zo`, modelled on the
implementation of glm_perspective, but amended to provide a left-hand
coordinate system expected by DirectX, Metal and Vulkan (per the GLM
project's `glm/detail/setup.hpp`). It uses a clip-space of zero-to-one.

The function is tested against a longhand version of the algorithm it
seeks to implement as well as against the output of the GLM project's
`glm::perspectiveLH_ZO` function. This commit adds a new subdirectory
`test/glm_cmp` which contains a basic CMake file and `main.cpp`. An
interested user should link or copy or clone the GLM project into this
directory. The `main` function can be used to print the reference data
used so others can verify behaviour in the future, or add new literal
reference values.
2021-05-13 23:18:05 +02:00
Recep Aslantas
a242d83805 style: rename nearVal, farVal to nearZ and farZ 2021-05-08 22:42:44 +03:00
Recep Aslantas
7760c709da build, meson: add so version to meson build 2021-05-08 15:44:14 +03:00
Recep Aslantas
919e3bcf4a Merge pull request #193 from recp/simd-3
SIMD and ILP Update
2021-05-08 14:14:22 +03:00
77 changed files with 7588 additions and 450 deletions

2
.gitignore vendored
View File

@@ -76,3 +76,5 @@ build/
conftest.dir/* conftest.dir/*
confdefs.h confdefs.h
*.xcuserdatad *.xcuserdatad
.idea
cmake-build-debug

View File

@@ -73,6 +73,18 @@ add_library(${PROJECT_NAME}
src/bezier.c src/bezier.c
src/ray.c src/ray.c
src/affine2d.c src/affine2d.c
src/clipspace/persp_lh_zo.c
src/clipspace/persp_rh_zo.c
src/clipspace/persp_lh_no.c
src/clipspace/persp_rh_no.c
src/clipspace/ortho_lh_zo.c
src/clipspace/ortho_rh_zo.c
src/clipspace/ortho_lh_no.c
src/clipspace/ortho_rh_no.c
src/clipspace/view_lh_zo.c
src/clipspace/view_rh_zo.c
src/clipspace/view_lh_no.c
src/clipspace/view_rh_no.c
) )
if(CGLM_SHARED) if(CGLM_SHARED)

View File

@@ -69,6 +69,23 @@ cglm_HEADERS = include/cglm/version.h \
include/cglm/ray.h \ include/cglm/ray.h \
include/cglm/affine2d.h include/cglm/affine2d.h
cglm_clipspacedir=$(includedir)/cglm/clipspace
cglm_clipspace_HEADERS = include/cglm/clipspace/persp.h \
include/cglm/clipspace/persp_lh_zo.h \
include/cglm/clipspace/persp_rh_zo.h \
include/cglm/clipspace/persp_lh_no.h \
include/cglm/clipspace/persp_rh_no.h \
include/cglm/clipspace/ortho_lh_zo.h \
include/cglm/clipspace/ortho_rh_zo.h \
include/cglm/clipspace/ortho_lh_no.h \
include/cglm/clipspace/ortho_rh_no.h \
include/cglm/clipspace/view_lh.h \
include/cglm/clipspace/view_rh.h \
include/cglm/clipspace/view_lh_zo.h \
include/cglm/clipspace/view_rh_zo.h \
include/cglm/clipspace/view_lh_no.h \
include/cglm/clipspace/view_rh_no.h
cglm_calldir=$(includedir)/cglm/call cglm_calldir=$(includedir)/cglm/call
cglm_call_HEADERS = include/cglm/call/mat4.h \ cglm_call_HEADERS = include/cglm/call/mat4.h \
include/cglm/call/mat3.h \ include/cglm/call/mat3.h \
@@ -138,6 +155,20 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
include/cglm/struct/curve.h \ include/cglm/struct/curve.h \
include/cglm/struct/affine2d.h include/cglm/struct/affine2d.h
cglm_struct_clipspacedir=$(includedir)/cglm/struct/clipspace
cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_zo.h \
include/cglm/struct/clipspace/persp_rh_zo.h \
include/cglm/struct/clipspace/persp_lh_no.h \
include/cglm/struct/clipspace/persp_rh_no.h \
include/cglm/struct/clipspace/ortho_lh_zo.h \
include/cglm/struct/clipspace/ortho_rh_zo.h \
include/cglm/struct/clipspace/ortho_lh_no.h \
include/cglm/struct/clipspace/ortho_rh_no.h \
include/cglm/struct/clipspace/view_lh_zo.h \
include/cglm/struct/clipspace/view_rh_zo.h \
include/cglm/struct/clipspace/view_lh_no.h \
include/cglm/struct/clipspace/view_rh_no.h
libcglm_la_SOURCES=\ libcglm_la_SOURCES=\
src/euler.c \ src/euler.c \
src/affine.c \ src/affine.c \
@@ -159,13 +190,29 @@ libcglm_la_SOURCES=\
src/curve.c \ src/curve.c \
src/bezier.c \ src/bezier.c \
src/ray.c \ src/ray.c \
src/affine2d.c src/affine2d.c \
src/clipspace/ortho_lh_no.c \
src/clipspace/ortho_lh_zo.c \
src/clipspace/ortho_rh_no.c \
src/clipspace/ortho_rh_zo.c \
src/clipspace/persp_lh_no.c \
src/clipspace/persp_lh_zo.c \
src/clipspace/persp_rh_no.c \
src/clipspace/persp_rh_zo.c \
src/clipspace/view_lh_no.c \
src/clipspace/view_lh_zo.c \
src/clipspace/view_rh_no.c \
src/clipspace/view_rh_zo.c
test_tests_SOURCES=\ test_tests_SOURCES=\
test/runner.c \ test/runner.c \
test/src/test_common.c \ test/src/test_common.c \
test/src/tests.c \ test/src/tests.c \
test/src/test_cam.c \ test/src/test_cam.c \
test/src/test_cam_lh_zo.c \
test/src/test_cam_rh_zo.c \
test/src/test_cam_lh_no.c \
test/src/test_cam_rh_no.c \
test/src/test_clamp.c \ test/src/test_clamp.c \
test/src/test_euler.c \ test/src/test_euler.c \
test/src/test_bezier.c \ test/src/test_bezier.c \

View File

@@ -1,5 +1,5 @@
# 🎥 OpenGL Mathematics (glm) for `C` # 🎥 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://travis-ci.com/recp/cglm.svg?branch=master)](https://travis-ci.com/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) [![Build status](https://ci.appveyor.com/api/projects/status/av7l3gc0yhfex8y4/branch/master?svg=true)](https://ci.appveyor.com/project/recp/cglm/branch/master)
[![Documentation Status](https://readthedocs.org/projects/cglm/badge/?version=latest)](http://cglm.readthedocs.io/en/latest/?badge=latest) [![Documentation Status](https://readthedocs.org/projects/cglm/badge/?version=latest)](http://cglm.readthedocs.io/en/latest/?badge=latest)
[![Coverage Status](https://coveralls.io/repos/github/recp/cglm/badge.svg?branch=master)](https://coveralls.io/github/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)
@@ -26,6 +26,7 @@ you have the latest version
- **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0 - **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0
- **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types - **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types
- **[major change]** by starting v0.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation) - **[major change]** by starting v0.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation)
- **[major change]** by starting v0.8.3, **cglm** supports alternative clipspace configuations e.g. Left Handed, Zero-to-One (_zo)... `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` is provided to control clipspace. You should be able to use **cglm** with Vulkan, DirectX and Metal now... see https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
#### Note for C++ developers: #### Note for C++ developers:
If you are not aware of the original GLM library yet, you may also want to look at: If you are not aware of the original GLM library yet, you may also want to look at:
@@ -69,6 +70,8 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
</table> </table>
## Features ## Features
- **scalar** and **simd** (sse, avx, neon...) optimizations
- option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default)
- array api and struct api, you can use arrays or structs. - array api and struct api, you can use arrays or structs.
- general purpose matrix operations (mat4, mat3) - general purpose matrix operations (mat4, mat3)
- chain matrix multiplication (square only) - chain matrix multiplication (square only)

View File

@@ -1,6 +1,8 @@
Features Features
================================================================================ ================================================================================
* **scalar** and **simd** (sse, avx, neon...) optimizations
* option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default)
* array api and struct api, you can use arrays or structs. * array api and struct api, you can use arrays or structs.
* general purpose matrix operations (mat4, mat3) * general purpose matrix operations (mat4, mat3)
* chain matrix multiplication (square only) * chain matrix multiplication (square only)

View File

@@ -35,6 +35,45 @@ have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
For instance if you set CGLM_ALL_UNALIGNED in a project then set it in other projects too For instance if you set CGLM_ALL_UNALIGNED in a project then set it in other projects too
Clipspace Option[s]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
By starting **v0.8.3** cglm provides options to switch between clipspace configurations.
Clipspace related files are located at `include/cglm/[struct]/clipspace.h` but
these are included in related files like `cam.h`. If you don't want to change your existing
clipspace configuration and want to use different clipspace function like `glm_lookat_zo` or `glm_lookat_lh_zo`...
then you can include individual headers or just define `CGLM_CLIPSPACE_INCLUDE_ALL` which will iclude all headers for you.
1. **CGLM_CLIPSPACE_INCLUDE_ALL**
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
3. **CGLM_FORCE_LEFT_HANDED**
1. **CGLM_CLIPSPACE_INCLUDE_ALL**:
By defining this macro, **cglm** will include all clipspace functions for you by just using
`#include cglm/cglm.h` or `#include cglm/struct.h` or `#include cglm/call.h`
Otherwise you need to include header you want manually e.g. `#include cglm/clipspace/view_rh_zo.h`
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
This is similar to **GLM**'s **GLM_FORCE_DEPTH_ZERO_TO_ONE** option.
This will set clip space between 0 to 1 which makes **cglm** Vulkan, Metal friendly.
You can use functions like `glm_lookat_lh_zo()` individually. By setting **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
functions in cam.h for instance will use `_zo` versions.
3. **CGLM_FORCE_LEFT_HANDED**
Force **cglm** to use the left handed coordinate system by default, currently **cglm** uses right handed coordinate system as default,
you can change this behavior with this option.
**VERY VERY IMPORTANT:**
Be careful if you include **cglm** in multiple projects.
SSE and SSE2 Shuffle Option SSE and SSE2 Shuffle Option
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same. **_mm_shuffle_ps** generates **shufps** instruction even if registers are same.

View File

@@ -15,22 +15,16 @@ extern "C" {
CGLM_EXPORT CGLM_EXPORT
void void
glmc_frustum(float left, glmc_frustum(float left, float right,
float right, float bottom, float top,
float bottom, float nearZ, float farZ,
float top,
float nearVal,
float farVal,
mat4 dest); mat4 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_ortho(float left, glmc_ortho(float left, float right,
float right, float bottom, float top,
float bottom, float nearZ, float farZ,
float top,
float nearVal,
float farVal,
mat4 dest); mat4 dest);
CGLM_EXPORT CGLM_EXPORT
@@ -55,11 +49,7 @@ glmc_ortho_default_s(float aspect, float size, mat4 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_perspective(float fovy, glmc_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest);
float aspect,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT CGLM_EXPORT
void void
@@ -88,8 +78,8 @@ glmc_look_anyup(vec3 eye, vec3 dir, mat4 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_persp_decomp(mat4 proj, glmc_persp_decomp(mat4 proj,
float * __restrict nearVal, float * __restrict nearZ,
float * __restrict farVal, float * __restrict farZ,
float * __restrict top, float * __restrict top,
float * __restrict bottom, float * __restrict bottom,
float * __restrict left, float * __restrict left,
@@ -114,16 +104,16 @@ glmc_persp_decomp_y(mat4 proj,
CGLM_EXPORT CGLM_EXPORT
void void
glmc_persp_decomp_z(mat4 proj, glmc_persp_decomp_z(mat4 proj,
float * __restrict nearVal, float * __restrict nearZ,
float * __restrict farVal); float * __restrict farZ);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_persp_decomp_far(mat4 proj, float * __restrict farVal); glmc_persp_decomp_far(mat4 proj, float * __restrict farZ);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_persp_decomp_near(mat4 proj, float * __restrict nearVal); glmc_persp_decomp_near(mat4 proj, float * __restrict nearZ);
CGLM_EXPORT CGLM_EXPORT
float float

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ortho_lh_no_h
#define cglmc_ortho_lh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_ortho_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_lh_no(vec3 box[2], mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_p_lh_no(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_pz_lh_no(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_lh_no(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_s_lh_no(float aspect, float size, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ortho_lh_no_h */

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ortho_lh_zo_h
#define cglmc_ortho_lh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_ortho_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_lh_zo(vec3 box[2], mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_p_lh_zo(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_pz_lh_zo(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_lh_zo(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_s_lh_zo(float aspect, float size, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ortho_lh_zo_h */

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ortho_rh_no_h
#define cglmc_ortho_rh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_ortho_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_rh_no(vec3 box[2], mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_p_rh_no(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_pz_rh_no(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_rh_no(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_s_rh_no(float aspect, float size, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ortho_rh_no_h */

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ortho_rh_zo_h
#define cglmc_ortho_rh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_ortho_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_rh_zo(vec3 box[2], mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_p_rh_zo(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_pz_rh_zo(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_rh_zo(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_s_rh_zo(float aspect, float size, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ortho_rh_zo_h */

View File

@@ -0,0 +1,87 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_persp_lh_no_h
#define cglmc_persp_lh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_frustum_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_lh_no(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_persp_move_far_lh_no(mat4 proj, float deltaFar);
CGLM_EXPORT
void
glmc_persp_decomp_lh_no(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decompv_lh_no(mat4 proj, float dest[6]);
CGLM_EXPORT
void
glmc_persp_decomp_x_lh_no(mat4 proj,
float * __restrict left,
float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decomp_y_lh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom);
CGLM_EXPORT
void
glmc_persp_decomp_z_lh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ);
CGLM_EXPORT
void
glmc_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest);
CGLM_EXPORT
float
glmc_persp_fovy_lh_no(mat4 proj);
CGLM_EXPORT
float
glmc_persp_aspect_lh_no(mat4 proj);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_persp_lh_no_h */

View File

@@ -0,0 +1,87 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_persp_lh_zo_h
#define cglmc_persp_lh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_frustum_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_lh_zo(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_persp_move_far_lh_zo(mat4 proj, float deltaFar);
CGLM_EXPORT
void
glmc_persp_decomp_lh_zo(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decompv_lh_zo(mat4 proj, float dest[6]);
CGLM_EXPORT
void
glmc_persp_decomp_x_lh_zo(mat4 proj,
float * __restrict left,
float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decomp_y_lh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom);
CGLM_EXPORT
void
glmc_persp_decomp_z_lh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ);
CGLM_EXPORT
void
glmc_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest);
CGLM_EXPORT
float
glmc_persp_fovy_lh_zo(mat4 proj);
CGLM_EXPORT
float
glmc_persp_aspect_lh_zo(mat4 proj);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_persp_lh_zo_h */

View File

@@ -0,0 +1,87 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_persp_rh_no_h
#define cglmc_persp_rh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_frustum_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_rh_no(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_persp_move_far_rh_no(mat4 proj, float deltaFar);
CGLM_EXPORT
void
glmc_persp_decomp_rh_no(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decompv_rh_no(mat4 proj, float dest[6]);
CGLM_EXPORT
void
glmc_persp_decomp_x_rh_no(mat4 proj,
float * __restrict left,
float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decomp_y_rh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom);
CGLM_EXPORT
void
glmc_persp_decomp_z_rh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ);
CGLM_EXPORT
void
glmc_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest);
CGLM_EXPORT
float
glmc_persp_fovy_rh_no(mat4 proj);
CGLM_EXPORT
float
glmc_persp_aspect_rh_no(mat4 proj);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_persp_rh_no_h */

View File

@@ -0,0 +1,87 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_persp_rh_zo_h
#define cglmc_persp_rh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_frustum_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_rh_zo(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_persp_move_far_rh_zo(mat4 proj, float deltaFar);
CGLM_EXPORT
void
glmc_persp_decomp_rh_zo(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decompv_rh_zo(mat4 proj, float dest[6]);
CGLM_EXPORT
void
glmc_persp_decomp_x_rh_zo(mat4 proj,
float * __restrict left,
float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decomp_y_rh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom);
CGLM_EXPORT
void
glmc_persp_decomp_z_rh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ);
CGLM_EXPORT
void
glmc_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest);
CGLM_EXPORT
float
glmc_persp_fovy_rh_zo(mat4 proj);
CGLM_EXPORT
float
glmc_persp_aspect_rh_zo(mat4 proj);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_persp_rh_zo_h */

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_view_lh_no_h
#define cglmc_view_lh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_lookat_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_view_lh_no_h */

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_view_lh_zo_h
#define cglmc_view_lh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_lookat_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_view_lh_zo_h */

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_view_rh_no_h
#define cglmc_view_rh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_lookat_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_view_rh_no_h */

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_view_rh_zo_h
#define cglmc_view_rh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_lookat_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_view_rh_zo_h */

View File

@@ -9,11 +9,11 @@
Functions: Functions:
CGLM_INLINE void glm_frustum(float left, float right, CGLM_INLINE void glm_frustum(float left, float right,
float bottom, float top, float bottom, float top,
float nearVal, float farVal, float nearZ, float farZ,
mat4 dest) mat4 dest)
CGLM_INLINE void glm_ortho(float left, float right, CGLM_INLINE void glm_ortho(float left, float right,
float bottom, float top, float bottom, float top,
float nearVal, float farVal, float nearZ, float farZ,
mat4 dest) mat4 dest)
CGLM_INLINE void glm_ortho_aabb(vec3 box[2], mat4 dest) CGLM_INLINE void glm_ortho_aabb(vec3 box[2], mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) CGLM_INLINE void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
@@ -22,8 +22,8 @@
CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest) CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest)
CGLM_INLINE void glm_perspective(float fovy, CGLM_INLINE void glm_perspective(float fovy,
float aspect, float aspect,
float nearVal, float nearZ,
float farVal, float farZ,
mat4 dest) mat4 dest)
CGLM_INLINE void glm_perspective_default(float aspect, 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_perspective_resize(float aspect, mat4 proj)
@@ -31,26 +31,61 @@
CGLM_INLINE void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) CGLM_INLINE void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) CGLM_INLINE void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest)
CGLM_INLINE void glm_persp_decomp(mat4 proj, CGLM_INLINE void glm_persp_decomp(mat4 proj,
float *nearVal, float *farVal, float *nearZ, float *farZ,
float *top, float *bottom, float *top, float *bottom,
float *left, float *right) float *left, float *right)
CGLM_INLINE void glm_persp_decompv(mat4 proj, float dest[6]) CGLM_INLINE void glm_persp_decompv(mat4 proj, float dest[6])
CGLM_INLINE void glm_persp_decomp_x(mat4 proj, float *left, float *right) CGLM_INLINE void glm_persp_decomp_x(mat4 proj, float *left, float *right)
CGLM_INLINE void glm_persp_decomp_y(mat4 proj, float *top, float *bottom) CGLM_INLINE void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
CGLM_INLINE void glm_persp_decomp_z(mat4 proj, float *nearv, float *farv) CGLM_INLINE void glm_persp_decomp_z(mat4 proj, float *nearv, float *farv)
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farVal) CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farZ)
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearVal) CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearZ)
CGLM_INLINE float glm_persp_fovy(mat4 proj) CGLM_INLINE float glm_persp_fovy(mat4 proj)
CGLM_INLINE float glm_persp_aspect(mat4 proj) CGLM_INLINE float glm_persp_aspect(mat4 proj)
CGLM_INLINE void glm_persp_sizes(mat4 proj, float fovy, vec4 dest) CGLM_INLINE void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
*/ */
#ifndef cglm_vcam_h #ifndef cglm_cam_h
#define cglm_vcam_h #define cglm_cam_h
#include "common.h" #include "common.h"
#include "plane.h" #include "plane.h"
#include "clipspace/persp.h"
#ifndef CGLM_CLIPSPACE_INCLUDE_ALL
# if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
# include "clipspace/ortho_lh_zo.h"
# include "clipspace/persp_lh_zo.h"
# include "clipspace/view_lh_zo.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
# include "clipspace/ortho_lh_no.h"
# include "clipspace/persp_lh_no.h"
# include "clipspace/view_lh_no.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
# include "clipspace/ortho_rh_zo.h"
# include "clipspace/persp_rh_zo.h"
# include "clipspace/view_rh_zo.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
# include "clipspace/ortho_rh_no.h"
# include "clipspace/persp_rh_no.h"
# include "clipspace/view_rh_no.h"
# endif
#else
# include "clipspace/ortho_lh_zo.h"
# include "clipspace/persp_lh_zo.h"
# include "clipspace/ortho_lh_no.h"
# include "clipspace/persp_lh_no.h"
# include "clipspace/ortho_rh_zo.h"
# include "clipspace/persp_rh_zo.h"
# include "clipspace/ortho_rh_no.h"
# include "clipspace/persp_rh_no.h"
# include "clipspace/view_lh_zo.h"
# include "clipspace/view_lh_no.h"
# include "clipspace/view_rh_zo.h"
# include "clipspace/view_rh_no.h"
#endif
/*! /*!
* @brief set up perspective peprojection matrix * @brief set up perspective peprojection matrix
* *
@@ -58,32 +93,25 @@
* @param[in] right viewport.right * @param[in] right viewport.right
* @param[in] bottom viewport.bottom * @param[in] bottom viewport.bottom
* @param[in] top viewport.top * @param[in] top viewport.top
* @param[in] nearVal near clipping plane * @param[in] nearZ near clipping plane
* @param[in] farVal far clipping plane * @param[in] farZ far clipping plane
* @param[out] dest result matrix * @param[out] dest result matrix
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_frustum(float left, float right, glm_frustum(float left, float right,
float bottom, float top, float bottom, float top,
float nearVal, float farVal, float nearZ, float farZ,
mat4 dest) { mat4 dest) {
float rl, tb, fn, nv; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_frustum_lh_zo(left, right, bottom, top, nearZ, farZ, dest);
glm_mat4_zero(dest); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_frustum_lh_no(left, right, bottom, top, nearZ, farZ, dest);
rl = 1.0f / (right - left); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
tb = 1.0f / (top - bottom); glm_frustum_rh_zo(left, right, bottom, top, nearZ, farZ, dest);
fn =-1.0f / (farVal - nearVal); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
nv = 2.0f * nearVal; glm_frustum_rh_no(left, right, bottom, top, nearZ, farZ, dest);
#endif
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;
} }
/*! /*!
@@ -93,31 +121,25 @@ glm_frustum(float left, float right,
* @param[in] right viewport.right * @param[in] right viewport.right
* @param[in] bottom viewport.bottom * @param[in] bottom viewport.bottom
* @param[in] top viewport.top * @param[in] top viewport.top
* @param[in] nearVal near clipping plane * @param[in] nearZ near clipping plane
* @param[in] farVal far clipping plane * @param[in] farZ far clipping plane
* @param[out] dest result matrix * @param[out] dest result matrix
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_ortho(float left, float right, glm_ortho(float left, float right,
float bottom, float top, float bottom, float top,
float nearVal, float farVal, float nearZ, float farZ,
mat4 dest) { mat4 dest) {
float rl, tb, fn; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho_lh_zo(left, right, bottom, top, nearZ, farZ, dest);
glm_mat4_zero(dest); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_ortho_lh_no(left, right, bottom, top, nearZ, farZ, dest);
rl = 1.0f / (right - left); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
tb = 1.0f / (top - bottom); glm_ortho_rh_zo(left, right, bottom, top, nearZ, farZ, dest);
fn =-1.0f / (farVal - nearVal); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho_rh_no(left, right, bottom, top, nearZ, farZ, dest);
dest[0][0] = 2.0f * rl; #endif
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;
} }
/*! /*!
@@ -131,10 +153,15 @@ glm_ortho(float left, float right,
CGLM_INLINE CGLM_INLINE
void void
glm_ortho_aabb(vec3 box[2], mat4 dest) { glm_ortho_aabb(vec3 box[2], mat4 dest) {
glm_ortho(box[0][0], box[1][0], #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
box[0][1], box[1][1], glm_ortho_aabb_lh_zo(box, dest);
-box[1][2], -box[0][2], #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
dest); glm_ortho_aabb_lh_no(box, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_ortho_aabb_rh_zo(box, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho_aabb_rh_no(box, dest);
#endif
} }
/*! /*!
@@ -149,10 +176,15 @@ glm_ortho_aabb(vec3 box[2], mat4 dest) {
CGLM_INLINE CGLM_INLINE
void void
glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) { glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) {
glm_ortho(box[0][0] - padding, box[1][0] + padding, #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
box[0][1] - padding, box[1][1] + padding, glm_ortho_aabb_p_lh_zo(box, padding, dest);
-(box[1][2] + padding), -(box[0][2] - padding), #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
dest); glm_ortho_aabb_p_lh_no(box, padding, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_ortho_aabb_p_rh_zo(box, padding, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho_aabb_p_rh_no(box, padding, dest);
#endif
} }
/*! /*!
@@ -167,10 +199,15 @@ glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) {
CGLM_INLINE CGLM_INLINE
void void
glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) { glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
glm_ortho(box[0][0], box[1][0], #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
box[0][1], box[1][1], glm_ortho_aabb_pz_lh_zo(box, padding, dest);
-(box[1][2] + padding), -(box[0][2] - padding), #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
dest); glm_ortho_aabb_pz_lh_no(box, padding, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_ortho_aabb_pz_rh_zo(box, padding, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho_aabb_pz_rh_no(box, padding, dest);
#endif
} }
/*! /*!
@@ -182,14 +219,15 @@ glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
CGLM_INLINE CGLM_INLINE
void void
glm_ortho_default(float aspect, mat4 dest) { glm_ortho_default(float aspect, mat4 dest) {
if (aspect >= 1.0f) { #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest); glm_ortho_default_lh_zo(aspect, dest);
return; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
} glm_ortho_default_lh_no(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
aspect = 1.0f / aspect; glm_ortho_default_rh_zo(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest); glm_ortho_default_rh_no(aspect, dest);
#endif
} }
/*! /*!
@@ -202,24 +240,15 @@ glm_ortho_default(float aspect, mat4 dest) {
CGLM_INLINE CGLM_INLINE
void void
glm_ortho_default_s(float aspect, float size, mat4 dest) { glm_ortho_default_s(float aspect, float size, mat4 dest) {
if (aspect >= 1.0f) { #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho(-size * aspect, glm_ortho_default_s_lh_zo(aspect, size, dest);
size * aspect, #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
-size, glm_ortho_default_s_lh_no(aspect, size, dest);
size, #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
-size - 100.0f, glm_ortho_default_s_rh_zo(aspect, size, dest);
size + 100.0f, #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
dest); glm_ortho_default_s_rh_no(aspect, size, dest);
return; #endif
}
glm_ortho(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
} }
/*! /*!
@@ -227,29 +256,22 @@ glm_ortho_default_s(float aspect, float size, mat4 dest) {
* *
* @param[in] fovy field of view angle * @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height ) * @param[in] aspect aspect ratio ( width / height )
* @param[in] nearVal near clipping plane * @param[in] nearZ near clipping plane
* @param[in] farVal far clipping planes * @param[in] farZ far clipping planes
* @param[out] dest result matrix * @param[out] dest result matrix
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_perspective(float fovy, glm_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest) {
float aspect, #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
float nearVal, glm_perspective_lh_zo(fovy, aspect, nearZ, farZ, dest);
float farVal, #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
mat4 dest) { glm_perspective_lh_no(fovy, aspect, nearZ, farZ, dest);
float f, fn; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_perspective_rh_zo(fovy, aspect, nearZ, farZ, dest);
glm_mat4_zero(dest); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_perspective_rh_no(fovy, aspect, nearZ, farZ, dest);
f = 1.0f / tanf(fovy * 0.5f); #endif
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;
} }
/*! /*!
@@ -263,17 +285,15 @@ glm_perspective(float fovy,
CGLM_INLINE CGLM_INLINE
void void
glm_persp_move_far(mat4 proj, float deltaFar) { glm_persp_move_far(mat4 proj, float deltaFar) {
float fn, farVal, nearVal, p22, p32; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_move_far_lh_zo(proj, deltaFar);
p22 = proj[2][2]; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
p32 = proj[3][2]; glm_persp_move_far_lh_no(proj, deltaFar);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
nearVal = p32 / (p22 - 1.0f); glm_persp_move_far_rh_zo(proj, deltaFar);
farVal = p32 / (p22 + 1.0f) + deltaFar; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
fn = 1.0f / (nearVal - farVal); glm_persp_move_far_rh_no(proj, deltaFar);
#endif
proj[2][2] = (nearVal + farVal) * fn;
proj[3][2] = 2.0f * nearVal * farVal * fn;
} }
/*! /*!
@@ -286,7 +306,15 @@ glm_persp_move_far(mat4 proj, float deltaFar) {
CGLM_INLINE CGLM_INLINE
void void
glm_perspective_default(float aspect, mat4 dest) { glm_perspective_default(float aspect, mat4 dest) {
glm_perspective(GLM_PI_4f, aspect, 0.01f, 100.0f, dest); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_perspective_default_lh_zo(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_perspective_default_lh_no(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_perspective_default_rh_zo(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_perspective_default_rh_no(aspect, dest);
#endif
} }
/*! /*!
@@ -320,28 +348,11 @@ glm_perspective_resize(float aspect, mat4 proj) {
CGLM_INLINE CGLM_INLINE
void void
glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) { glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) {
CGLM_ALIGN(8) vec3 f, u, s; #if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
glm_lookat_lh(eye, center, up, dest);
glm_vec3_sub(center, eye, f); #elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
glm_vec3_normalize(f); glm_lookat_rh(eye, center, up, dest);
#endif
glm_vec3_crossn(f, up, s);
glm_vec3_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_vec3_dot(s, eye);
dest[3][1] =-glm_vec3_dot(u, eye);
dest[3][2] = glm_vec3_dot(f, eye);
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
dest[3][3] = 1.0f;
} }
/*! /*!
@@ -361,9 +372,11 @@ glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) {
CGLM_INLINE CGLM_INLINE
void void
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) { glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
CGLM_ALIGN(8) vec3 target; #if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
glm_vec3_add(eye, dir, target); glm_look_lh(eye, dir, up, dest);
glm_lookat(eye, target, up, dest); #elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
glm_look_rh(eye, dir, up, dest);
#endif
} }
/*! /*!
@@ -379,17 +392,19 @@ glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
CGLM_INLINE CGLM_INLINE
void void
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) { glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
CGLM_ALIGN(8) vec3 up; #if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
glm_vec3_ortho(dir, up); glm_look_anyup_lh(eye, dir, dest);
glm_look(eye, dir, up, dest); #elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
glm_look_anyup_rh(eye, dir, dest);
#endif
} }
/*! /*!
* @brief decomposes frustum values of perspective projection. * @brief decomposes frustum values of perspective projection.
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] nearVal near * @param[out] nearZ near
* @param[out] farVal far * @param[out] farZ far
* @param[out] top top * @param[out] top top
* @param[out] bottom bottom * @param[out] bottom bottom
* @param[out] left left * @param[out] left left
@@ -398,31 +413,18 @@ glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
CGLM_INLINE CGLM_INLINE
void void
glm_persp_decomp(mat4 proj, glm_persp_decomp(mat4 proj,
float * __restrict nearVal, float * __restrict farVal, float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom, float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) { float * __restrict left, float * __restrict right) {
float m00, m11, m20, m21, m22, m32, n, f; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
float n_m11, n_m00; glm_persp_decomp_lh_zo(proj, nearZ, farZ, top, bottom, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
m00 = proj[0][0]; glm_persp_decomp_lh_no(proj, nearZ, farZ, top, bottom, left, right);
m11 = proj[1][1]; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
m20 = proj[2][0]; glm_persp_decomp_rh_zo(proj, nearZ, farZ, top, bottom, left, right);
m21 = proj[2][1]; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
m22 = proj[2][2]; glm_persp_decomp_rh_no(proj, nearZ, farZ, top, bottom, left, right);
m32 = proj[3][2]; #endif
n = m32 / (m22 - 1.0f);
f = m32 / (m22 + 1.0f);
n_m11 = n / m11;
n_m00 = n / m00;
*nearVal = n;
*farVal = f;
*bottom = n_m11 * (m21 - 1.0f);
*top = n_m11 * (m21 + 1.0f);
*left = n_m00 * (m20 - 1.0f);
*right = n_m00 * (m20 + 1.0f);
} }
/*! /*!
@@ -435,8 +437,15 @@ glm_persp_decomp(mat4 proj,
CGLM_INLINE CGLM_INLINE
void void
glm_persp_decompv(mat4 proj, float dest[6]) { glm_persp_decompv(mat4 proj, float dest[6]) {
glm_persp_decomp(proj, &dest[0], &dest[1], &dest[2], #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
&dest[3], &dest[4], &dest[5]); glm_persp_decompv_lh_zo(proj, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_decompv_lh_no(proj, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_decompv_rh_zo(proj, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_decompv_rh_no(proj, dest);
#endif
} }
/*! /*!
@@ -452,14 +461,15 @@ void
glm_persp_decomp_x(mat4 proj, glm_persp_decomp_x(mat4 proj,
float * __restrict left, float * __restrict left,
float * __restrict right) { float * __restrict right) {
float nearVal, m20, m00; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_decomp_x_lh_zo(proj, left, right);
m00 = proj[0][0]; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
m20 = proj[2][0]; glm_persp_decomp_x_lh_no(proj, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
nearVal = proj[3][2] / (proj[3][3] - 1.0f); glm_persp_decomp_x_rh_zo(proj, left, right);
*left = nearVal * (m20 - 1.0f) / m00; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
*right = nearVal * (m20 + 1.0f) / m00; glm_persp_decomp_x_rh_no(proj, left, right);
#endif
} }
/*! /*!
@@ -475,14 +485,15 @@ void
glm_persp_decomp_y(mat4 proj, glm_persp_decomp_y(mat4 proj,
float * __restrict top, float * __restrict top,
float * __restrict bottom) { float * __restrict bottom) {
float nearVal, m21, m11; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_decomp_y_lh_zo(proj, top, bottom);
m21 = proj[2][1]; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
m11 = proj[1][1]; glm_persp_decomp_y_lh_no(proj, top, bottom);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
nearVal = proj[3][2] / (proj[3][3] - 1.0f); glm_persp_decomp_y_rh_zo(proj, top, bottom);
*bottom = nearVal * (m21 - 1) / m11; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
*top = nearVal * (m21 + 1) / m11; glm_persp_decomp_y_rh_no(proj, top, bottom);
#endif
} }
/*! /*!
@@ -490,70 +501,61 @@ glm_persp_decomp_y(mat4 proj,
* z stands for z axis (near / far axis) * z stands for z axis (near / far axis)
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] nearVal near * @param[out] nearZ near
* @param[out] farVal far * @param[out] farZ far
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_persp_decomp_z(mat4 proj, glm_persp_decomp_z(mat4 proj, float * __restrict nearZ, float * __restrict farZ) {
float * __restrict nearVal, #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
float * __restrict farVal) { glm_persp_decomp_z_lh_zo(proj, nearZ, farZ);
float m32, m22; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_decomp_z_lh_no(proj, nearZ, farZ);
m32 = proj[3][2]; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
m22 = proj[2][2]; glm_persp_decomp_z_rh_zo(proj, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
*nearVal = m32 / (m22 - 1.0f); glm_persp_decomp_z_rh_no(proj, nearZ, farZ);
*farVal = m32 / (m22 + 1.0f); #endif
} }
/*! /*!
* @brief decomposes far value of perspective projection. * @brief decomposes far value of perspective projection.
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] farVal far * @param[out] farZ far
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_persp_decomp_far(mat4 proj, float * __restrict farVal) { glm_persp_decomp_far(mat4 proj, float * __restrict farZ) {
*farVal = proj[3][2] / (proj[2][2] + 1.0f); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_decomp_far_lh_zo(proj, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_decomp_far_lh_no(proj, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_decomp_far_rh_zo(proj, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_decomp_far_rh_no(proj, farZ);
#endif
} }
/*! /*!
* @brief decomposes near value of perspective projection. * @brief decomposes near value of perspective projection.
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] nearVal near * @param[out] nearZ near
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) { glm_persp_decomp_near(mat4 proj, float * __restrict nearZ) {
*nearVal = proj[3][2] / (proj[2][2] - 1.0f); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
} glm_persp_decomp_near_lh_zo(proj, nearZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
/*! glm_persp_decomp_near_lh_no(proj, nearZ);
* @brief returns field of view angle along the Y-axis (in radians) #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
* glm_persp_decomp_near_rh_zo(proj, nearZ);
* if you need to degrees, use glm_deg to convert it or use this: #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix)) glm_persp_decomp_near_rh_no(proj, nearZ);
* #endif
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy(mat4 proj) {
return 2.0f * atanf(1.0f / proj[1][1]);
}
/*!
* @brief returns aspect ratio of perspective projection
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect(mat4 proj) {
return proj[1][1] / proj[0][0];
} }
/*! /*!
@@ -566,17 +568,15 @@ glm_persp_aspect(mat4 proj) {
CGLM_INLINE CGLM_INLINE
void void
glm_persp_sizes(mat4 proj, float fovy, vec4 dest) { glm_persp_sizes(mat4 proj, float fovy, vec4 dest) {
float t, a, nearVal, farVal; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_sizes_lh_zo(proj, fovy, dest);
t = 2.0f * tanf(fovy * 0.5f); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
a = glm_persp_aspect(proj); glm_persp_sizes_lh_no(proj, fovy, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_decomp_z(proj, &nearVal, &farVal); glm_persp_sizes_rh_zo(proj, fovy, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
dest[1] = t * nearVal; glm_persp_sizes_rh_no(proj, fovy, dest);
dest[3] = t * farVal; #endif
dest[0] = a * dest[1];
dest[2] = a * dest[3];
} }
#endif /* cglm_vcam_h */ #endif /* cglm_cam_h */

View File

@@ -0,0 +1,182 @@
/*
* 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_ortho_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_lh_no(vec3 box[2], mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p_lh_no(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_pz_lh_no(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_default_lh_no(float aspect,
mat4 dest)
CGLM_INLINE void glm_ortho_default_s_lh_no(float aspect,
float size,
mat4 dest)
*/
#ifndef cglm_ortho_lh_no_h
#define cglm_ortho_lh_no_h
#include "../common.h"
#include "../plane.h"
/*!
* @brief set up orthographic projection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
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] = (farZ + nearZ) * fn;
dest[3][3] = 1.0f;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_lh_no(vec3 box[2], mat4 dest) {
glm_ortho_lh_no(box[0][0], box[1][0],
box[0][1], box[1][1],
-box[1][2], -box[0][2],
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_p_lh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_lh_no(box[0][0] - padding, box[1][0] + padding,
box[0][1] - padding, box[1][1] + padding,
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_pz_lh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_lh_no(box[0][0], box[1][0],
box[0][1], box[1][1],
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up unit orthographic projection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_lh_no(float aspect, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_lh_no(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
return;
}
aspect = 1.0f / aspect;
glm_ortho_lh_no(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_s_lh_no(float aspect, float size, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_lh_no(-size * aspect,
size * aspect,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
return;
}
glm_ortho_lh_no(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
}
#endif /*cglm_ortho_lh_no_h*/

View File

@@ -0,0 +1,176 @@
/*
* 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_ortho_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_lh_zo(vec3 box[2], mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p_lh_zo(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_pz_lh_zo(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_default_lh_zo(float aspect,
mat4 dest)
CGLM_INLINE void glm_ortho_default_s_lh_zo(float aspect,
float size,
mat4 dest)
*/
#ifndef cglm_ortho_lh_zo_h
#define cglm_ortho_lh_zo_h
#include "../common.h"
#include "../plane.h"
/*!
* @brief set up orthographic projection matrix with a left-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
dest[0][0] = 2.0f * rl;
dest[1][1] = 2.0f * tb;
dest[2][2] =-fn;
dest[3][0] =-(right + left) * rl;
dest[3][1] =-(top + bottom) * tb;
dest[3][2] = nearZ * fn;
dest[3][3] = 1.0f;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_lh_zo(vec3 box[2], mat4 dest) {
glm_ortho_lh_zo(box[0][0], box[1][0],
box[0][1], box[1][1],
-box[1][2], -box[0][2],
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_p_lh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_lh_zo(box[0][0] - padding, box[1][0] + padding,
box[0][1] - padding, box[1][1] + padding,
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_pz_lh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_lh_zo(box[0][0], box[1][0],
box[0][1], box[1][1],
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up unit orthographic projection matrix
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_lh_zo(float aspect, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_lh_zo(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
return;
}
aspect = 1.0f / aspect;
glm_ortho_lh_zo(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_s_lh_zo(float aspect, float size, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_lh_zo(-size * aspect,
size * aspect,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
return;
}
glm_ortho_lh_zo(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
}
#endif /*cglm_ortho_lh_zo_h*/

View File

@@ -0,0 +1,182 @@
/*
* 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_ortho_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_rh_no(vec3 box[2], mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p_rh_no(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_pz_rh_no(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_default_rh_no(float aspect,
mat4 dest)
CGLM_INLINE void glm_ortho_default_s_rh_no(float aspect,
float size,
mat4 dest)
*/
#ifndef cglm_ortho_rh_no_h
#define cglm_ortho_rh_no_h
#include "../common.h"
#include "../plane.h"
/*!
* @brief set up orthographic projection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
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] = (farZ + nearZ) * fn;
dest[3][3] = 1.0f;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_rh_no(vec3 box[2], mat4 dest) {
glm_ortho_rh_no(box[0][0], box[1][0],
box[0][1], box[1][1],
-box[1][2], -box[0][2],
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_p_rh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_rh_no(box[0][0] - padding, box[1][0] + padding,
box[0][1] - padding, box[1][1] + padding,
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_pz_rh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_rh_no(box[0][0], box[1][0],
box[0][1], box[1][1],
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up unit orthographic projection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_rh_no(float aspect, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_rh_no(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
return;
}
aspect = 1.0f / aspect;
glm_ortho_rh_no(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_s_rh_no(float aspect, float size, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_rh_no(-size * aspect,
size * aspect,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
return;
}
glm_ortho_rh_no(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
}
#endif /*cglm_ortho_rh_no_h*/

View File

@@ -0,0 +1,180 @@
/*
* 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_ortho_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_rh_zo(vec3 box[2], mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p_rh_zo(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_pz_rh_zo(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_default_rh_zo(float aspect,
mat4 dest)
CGLM_INLINE void glm_ortho_default_s_rh_zo(float aspect,
float size,
mat4 dest)
*/
#ifndef cglm_ortho_rh_zo_h
#define cglm_ortho_rh_zo_h
#include "../common.h"
#include "../plane.h"
/*!
* @brief set up orthographic projection matrix with a right-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
dest[0][0] = 2.0f * rl;
dest[1][1] = 2.0f * tb;
dest[2][2] = fn;
dest[3][0] =-(right + left) * rl;
dest[3][1] =-(top + bottom) * tb;
dest[3][2] = nearZ * fn;
dest[3][3] = 1.0f;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a clip-space with depth
* values from zero to one.
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_rh_zo(vec3 box[2], mat4 dest) {
glm_ortho_rh_zo(box[0][0], box[1][0],
box[0][1], box[1][1],
-box[1][2], -box[0][2],
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a clip-space with depth
* values from zero to one.
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_p_rh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_rh_zo(box[0][0] - padding, box[1][0] + padding,
box[0][1] - padding, box[1][1] + padding,
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a clip-space with depth
* values from zero to one.
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_pz_rh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_rh_zo(box[0][0], box[1][0],
box[0][1], box[1][1],
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up unit orthographic projection matrix with a right-hand
* coordinate system and a clip-space of [0, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_rh_zo(float aspect, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_rh_zo(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
return;
}
aspect = 1.0f / aspect;
glm_ortho_rh_zo(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a right-hand coordinate system and a clip-space with depth
* values from zero to one.
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_s_rh_zo(float aspect, float size, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_rh_zo(-size * aspect,
size * aspect,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
return;
}
glm_ortho_rh_zo(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
}
#endif /*cglm_ortho_rh_zo_h*/

View File

@@ -0,0 +1,48 @@
/*
* 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_persp_decomp_far(mat4 proj, float *farZ)
CGLM_INLINE float glm_persp_fovy(mat4 proj)
CGLM_INLINE float glm_persp_aspect(mat4 proj)
CGLM_INLINE void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_persp_h
#define cglm_persp_h
#include "../common.h"
#include "../plane.h"
#include "../mat4.h"
/*!
* @brief returns field of view angle along the Y-axis (in radians)
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy(mat4 proj) {
return 2.0f * atanf(1.0f / proj[1][1]);
}
/*!
* @brief returns aspect ratio of perspective projection
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect(mat4 proj) {
return proj[1][1] / proj[0][0];
}
#endif /* cglm_persp_h */

View File

@@ -0,0 +1,396 @@
/*
* 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_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_lh_no(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_default_lh_no(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize_lh_no(float aspect, mat4 proj)
CGLM_INLINE void glm_persp_move_far_lh_no(mat4 proj,
float deltaFar)
CGLM_INLINE void glm_persp_decomp_lh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decompv_lh_no(mat4 proj,
float dest[6])
CGLM_INLINE void glm_persp_decomp_x_lh_no(mat4 proj,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decomp_y_lh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom)
CGLM_INLINE void glm_persp_decomp_z_lh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ)
CGLM_INLINE void glm_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_persp_lh_no_h
#define cglm_persp_lh_no_h
#include "../common.h"
#include "../plane.h"
#include "persp.h"
/*!
* @brief set up perspective peprojection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_frustum_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn, nv;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
nv = 2.0f * nearZ;
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] =-(farZ + nearZ) * fn;
dest[2][3] = 1.0f;
dest[3][2] = farZ * nv * fn;
}
/*!
* @brief set up perspective projection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_lh_no(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest) {
float f, fn;
glm_mat4_zero(dest);
f = 1.0f / tanf(fovy * 0.5f);
fn = 1.0f / (nearZ - farZ);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] =-(nearZ + farZ) * fn;
dest[2][3] = 1.0f;
dest[3][2] = 2.0f * nearZ * farZ * fn;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_default_lh_no(float aspect, mat4 dest) {
glm_perspective_lh_no(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* resized with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in, out] proj perspective projection matrix
*/
CGLM_INLINE
void
glm_perspective_resize_lh_no(float aspect, mat4 proj) {
if (proj[0][0] == 0.0f)
return;
proj[0][0] = proj[1][1] / aspect;
}
/*!
* @brief extend perspective projection matrix's far distance
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* this function does not guarantee far >= near, be aware of that!
*
* @param[in, out] proj projection matrix to extend
* @param[in] deltaFar distance from existing far (negative to shink)
*/
CGLM_INLINE
void
glm_persp_move_far_lh_no(mat4 proj, float deltaFar) {
float fn, farZ, nearZ, p22, p32;
p22 = -proj[2][2];
p32 = proj[3][2];
nearZ = p32 / (p22 - 1.0f);
farZ = p32 / (p22 + 1.0f) + deltaFar;
fn = 1.0f / (nearZ - farZ);
proj[2][2] = -(farZ + nearZ) * fn;
proj[3][2] = 2.0f * nearZ * farZ * fn;
}
/*!
* @brief decomposes frustum values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_lh_no(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
float m00, m11, m20, m21, m22, m32, n, f;
float n_m11, n_m00;
m00 = proj[0][0];
m11 = proj[1][1];
m20 = proj[2][0];
m21 = proj[2][1];
m22 =-proj[2][2];
m32 = proj[3][2];
n = m32 / (m22 - 1.0f);
f = m32 / (m22 + 1.0f);
n_m11 = n / m11;
n_m00 = n / m00;
*nearZ = n;
*farZ = f;
*bottom = n_m11 * (m21 - 1.0f);
*top = n_m11 * (m21 + 1.0f);
*left = n_m00 * (m20 - 1.0f);
*right = n_m00 * (m20 + 1.0f);
}
/*!
* @brief decomposes frustum values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* 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_lh_no(mat4 proj, float dest[6]) {
glm_persp_decomp_lh_no(proj, &dest[0], &dest[1], &dest[2],
&dest[3], &dest[4], &dest[5]);
}
/*!
* @brief decomposes left and right values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* 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_lh_no(mat4 proj,
float * __restrict left,
float * __restrict right) {
float nearZ, m20, m00, m22;
m00 = proj[0][0];
m20 = proj[2][0];
m22 =-proj[2][2];
nearZ = proj[3][2] / (m22 - 1.0f);
*left = nearZ * (m20 - 1.0f) / m00;
*right = nearZ * (m20 + 1.0f) / m00;
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* 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_lh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
float nearZ, m21, m11, m22;
m21 = proj[2][1];
m11 = proj[1][1];
m22 =-proj[2][2];
nearZ = proj[3][2] / (m22 - 1.0f);
*bottom = nearZ * (m21 - 1.0f) / m11;
*top = nearZ * (m21 + 1.0f) / m11;
}
/*!
* @brief decomposes near and far values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_z_lh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
float m32, m22;
m32 = proj[3][2];
m22 =-proj[2][2];
*nearZ = m32 / (m22 - 1.0f);
*farZ = m32 / (m22 + 1.0f);
}
/*!
* @brief decomposes far value of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ) {
*farZ = proj[3][2] / (-proj[2][2] + 1.0f);
}
/*!
* @brief decomposes near value of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glm_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ) {
*nearZ = proj[3][2] / (-proj[2][2] - 1.0f);
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
void
glm_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest) {
float t, a, nearZ, farZ;
t = 2.0f * tanf(fovy * 0.5f);
a = glm_persp_aspect(proj);
glm_persp_decomp_z_lh_no(proj, &nearZ, &farZ);
dest[1] = t * nearZ;
dest[3] = t * farZ;
dest[0] = a * dest[1];
dest[2] = a * dest[3];
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a left-hand coordinate system and a clip-space of [-1, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy_lh_no(mat4 proj) {
return glm_persp_fovy(proj);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a left-hand coordinate system and a clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect_lh_no(mat4 proj) {
return glm_persp_aspect(proj);
}
#endif /*cglm_cam_lh_no_h*/

View File

@@ -0,0 +1,388 @@
/*
* 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_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_lh_zo(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_default_lh_zo(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize_lh_zo(float aspect, mat4 proj)
CGLM_INLINE void glm_persp_move_far_lh_zo(mat4 proj,
float deltaFar)
CGLM_INLINE void glm_persp_decomp_lh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decompv_lh_zo(mat4 proj,
float dest[6])
CGLM_INLINE void glm_persp_decomp_x_lh_zo(mat4 proj,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decomp_y_lh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom)
CGLM_INLINE void glm_persp_decomp_z_lh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ)
CGLM_INLINE void glm_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_persp_lh_zo_h
#define cglm_persp_lh_zo_h
#include "../common.h"
#include "../plane.h"
#include "persp.h"
/*!
* @brief set up perspective peprojection matrix with a left-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_frustum_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn, nv;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
nv = 2.0f * nearZ;
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] =-farZ * fn;
dest[2][3] = 1.0f;
dest[3][2] = farZ * nearZ * fn;
}
/*!
* @brief set up perspective projection matrix with a left-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_lh_zo(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest) {
float f, fn;
glm_mat4_zero(dest);
f = 1.0f / tanf(fovy * 0.5f);
fn = 1.0f / (nearZ - farZ);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] =-farZ * fn;
dest[2][3] = 1.0f;
dest[3][2] = nearZ * farZ * fn;
}
/*!
* @brief extend perspective projection matrix's far distance with a
* left-hand coordinate system and a clip-space with depth values
* from zero to one.
*
* this function does not guarantee far >= near, be aware of that!
*
* @param[in, out] proj projection matrix to extend
* @param[in] deltaFar distance from existing far (negative to shink)
*/
CGLM_INLINE
void
glm_persp_move_far_lh_zo(mat4 proj, float deltaFar) {
float fn, farZ, nearZ, p22, p32;
p22 = -proj[2][2];
p32 = proj[3][2];
nearZ = p32 / p22;
farZ = p32 / (p22 + 1.0f) + deltaFar;
fn = 1.0f / (nearZ - farZ);
proj[2][2] = -farZ * fn;
proj[3][2] = nearZ * farZ * fn;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_default_lh_zo(float aspect, mat4 dest) {
glm_perspective_lh_zo(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very 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_lh_zo(float aspect, mat4 proj) {
if (proj[0][0] == 0.0f)
return;
proj[0][0] = proj[1][1] / aspect;
}
/*!
* @brief decomposes frustum values of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_lh_zo(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
float m00, m11, m20, m21, m22, m32, n, f;
float n_m11, n_m00;
m00 = proj[0][0];
m11 = proj[1][1];
m20 = proj[2][0];
m21 = proj[2][1];
m22 =-proj[2][2];
m32 = proj[3][2];
n = m32 / m22;
f = m32 / (m22 + 1.0f);
n_m11 = n / m11;
n_m00 = n / m00;
*nearZ = n;
*farZ = f;
*bottom = n_m11 * (m21 - 1.0f);
*top = n_m11 * (m21 + 1.0f);
*left = n_m00 * (m20 - 1.0f);
*right = n_m00 * (m20 + 1.0f);
}
/*!
* @brief decomposes frustum values of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
* 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_lh_zo(mat4 proj, float dest[6]) {
glm_persp_decomp_lh_zo(proj, &dest[0], &dest[1], &dest[2],
&dest[3], &dest[4], &dest[5]);
}
/*!
* @brief decomposes left and right values of perspective projection (ZO).
* 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_lh_zo(mat4 proj,
float * __restrict left,
float * __restrict right) {
float nearZ, m20, m00;
m00 = proj[0][0];
m20 = proj[2][0];
nearZ = proj[3][2] / (proj[3][3]);
*left = nearZ * (m20 - 1.0f) / m00;
*right = nearZ * (m20 + 1.0f) / m00;
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
* y stands for y axis (top / bottom axis)
*
* @param[in] proj perspective projection matrix
* @param[out] top top
* @param[out] bottom bottom
*/
CGLM_INLINE
void
glm_persp_decomp_y_lh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
float nearZ, m21, m11;
m21 = proj[2][1];
m11 = proj[1][1];
nearZ = proj[3][2] / (proj[3][3]);
*bottom = nearZ * (m21 - 1) / m11;
*top = nearZ * (m21 + 1) / m11;
}
/*!
* @brief decomposes near and far values of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_z_lh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
float m32, m22;
m32 = proj[3][2];
m22 = -proj[2][2];
*nearZ = m32 / m22;
*farZ = m32 / (m22 + 1.0f);
}
/*!
* @brief decomposes far value of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ) {
*farZ = proj[3][2] / (-proj[2][2] + 1.0f);
}
/*!
* @brief decomposes near value of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glm_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ) {
*nearZ = proj[3][2] / -proj[2][2];
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
void
glm_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest) {
float t, a, nearZ, farZ;
t = 2.0f * tanf(fovy * 0.5f);
a = glm_persp_aspect(proj);
glm_persp_decomp_z_lh_zo(proj, &nearZ, &farZ);
dest[1] = t * nearZ;
dest[3] = t * farZ;
dest[0] = a * dest[1];
dest[2] = a * dest[3];
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy_lh_zo(mat4 proj) {
return glm_persp_fovy(proj);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect_lh_zo(mat4 proj) {
return glm_persp_aspect(proj);
}
#endif /*cglm_persp_lh_zo_h*/

View File

@@ -0,0 +1,396 @@
/*
* 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_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_rh_no(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_default_rh_no(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize_rh_no(float aspect, mat4 proj)
CGLM_INLINE void glm_persp_move_far_rh_no(mat4 proj,
float deltaFar)
CGLM_INLINE void glm_persp_decomp_rh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decompv_rh_no(mat4 proj,
float dest[6])
CGLM_INLINE void glm_persp_decomp_x_rh_no(mat4 proj,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decomp_y_rh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom)
CGLM_INLINE void glm_persp_decomp_z_rh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ)
CGLM_INLINE void glm_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_persp_rh_no_h
#define cglm_persp_rh_no_h
#include "../common.h"
#include "../plane.h"
#include "persp.h"
/*!
* @brief set up perspective peprojection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_frustum_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn, nv;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
nv = 2.0f * nearZ;
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] = (farZ + nearZ) * fn;
dest[2][3] =-1.0f;
dest[3][2] = farZ * nv * fn;
}
/*!
* @brief set up perspective projection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_rh_no(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest) {
float f, fn;
glm_mat4_zero(dest);
f = 1.0f / tanf(fovy * 0.5f);
fn = 1.0f / (nearZ - farZ);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] = (nearZ + farZ) * fn;
dest[2][3] =-1.0f;
dest[3][2] = 2.0f * nearZ * farZ * fn;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_default_rh_no(float aspect, mat4 dest) {
glm_perspective_rh_no(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* resized with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in, out] proj perspective projection matrix
*/
CGLM_INLINE
void
glm_perspective_resize_rh_no(float aspect, mat4 proj) {
if (proj[0][0] == 0.0f)
return;
proj[0][0] = proj[1][1] / aspect;
}
/*!
* @brief extend perspective projection matrix's far distance
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* this function does not guarantee far >= near, be aware of that!
*
* @param[in, out] proj projection matrix to extend
* @param[in] deltaFar distance from existing far (negative to shink)
*/
CGLM_INLINE
void
glm_persp_move_far_rh_no(mat4 proj, float deltaFar) {
float fn, farZ, nearZ, p22, p32;
p22 = proj[2][2];
p32 = proj[3][2];
nearZ = p32 / (p22 - 1.0f);
farZ = p32 / (p22 + 1.0f) + deltaFar;
fn = 1.0f / (nearZ - farZ);
proj[2][2] = (farZ + nearZ) * fn;
proj[3][2] = 2.0f * nearZ * farZ * fn;
}
/*!
* @brief decomposes frustum values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_rh_no(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
float m00, m11, m20, m21, m22, m32, n, f;
float n_m11, n_m00;
m00 = proj[0][0];
m11 = proj[1][1];
m20 = proj[2][0];
m21 = proj[2][1];
m22 = proj[2][2];
m32 = proj[3][2];
n = m32 / (m22 - 1.0f);
f = m32 / (m22 + 1.0f);
n_m11 = n / m11;
n_m00 = n / m00;
*nearZ = n;
*farZ = f;
*bottom = n_m11 * (m21 - 1.0f);
*top = n_m11 * (m21 + 1.0f);
*left = n_m00 * (m20 - 1.0f);
*right = n_m00 * (m20 + 1.0f);
}
/*!
* @brief decomposes frustum values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* 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_rh_no(mat4 proj, float dest[6]) {
glm_persp_decomp_rh_no(proj, &dest[0], &dest[1], &dest[2],
&dest[3], &dest[4], &dest[5]);
}
/*!
* @brief decomposes left and right values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* 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_rh_no(mat4 proj,
float * __restrict left,
float * __restrict right) {
float nearZ, m20, m00, m22;
m00 = proj[0][0];
m20 = proj[2][0];
m22 = proj[2][2];
nearZ = proj[3][2] / (m22 - 1.0f);
*left = nearZ * (m20 - 1.0f) / m00;
*right = nearZ * (m20 + 1.0f) / m00;
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* 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_rh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
float nearZ, m21, m11, m22;
m21 = proj[2][1];
m11 = proj[1][1];
m22 = proj[2][2];
nearZ = proj[3][2] / (m22 - 1.0f);
*bottom = nearZ * (m21 - 1.0f) / m11;
*top = nearZ * (m21 + 1.0f) / m11;
}
/*!
* @brief decomposes near and far values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_z_rh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
float m32, m22;
m32 = proj[3][2];
m22 = proj[2][2];
*nearZ = m32 / (m22 - 1.0f);
*farZ = m32 / (m22 + 1.0f);
}
/*!
* @brief decomposes far value of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ) {
*farZ = proj[3][2] / (proj[2][2] + 1.0f);
}
/*!
* @brief decomposes near value of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glm_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ) {
*nearZ = proj[3][2] / (proj[2][2] - 1.0f);
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
void
glm_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest) {
float t, a, nearZ, farZ;
t = 2.0f * tanf(fovy * 0.5f);
a = glm_persp_aspect(proj);
glm_persp_decomp_z_rh_no(proj, &nearZ, &farZ);
dest[1] = t * nearZ;
dest[3] = t * farZ;
dest[0] = a * dest[1];
dest[2] = a * dest[3];
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a right-hand coordinate system and a clip-space of [-1, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy_rh_no(mat4 proj) {
return glm_persp_fovy(proj);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a right-hand coordinate system and a clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect_rh_no(mat4 proj) {
return glm_persp_aspect(proj);
}
#endif /*cglm_cam_rh_no_h*/

View File

@@ -0,0 +1,390 @@
/*
* 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_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_rh_zo(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_default_rh_zo(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize_rh_zo(float aspect, mat4 proj)
CGLM_INLINE void glm_persp_move_far_rh_zo(mat4 proj,
float deltaFar)
CGLM_INLINE void glm_persp_decomp_rh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decompv_rh_zo(mat4 proj,
float dest[6])
CGLM_INLINE void glm_persp_decomp_x_rh_zo(mat4 proj,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decomp_y_rh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom)
CGLM_INLINE void glm_persp_decomp_z_rh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ)
CGLM_INLINE void glm_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_persp_rh_zo_h
#define cglm_persp_rh_zo_h
#include "../common.h"
#include "../plane.h"
#include "persp.h"
/*!
* @brief set up perspective peprojection matrix with a right-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_frustum_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn, nv;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
nv = 2.0f * nearZ;
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] = farZ * fn;
dest[2][3] =-1.0f;
dest[3][2] = farZ * nearZ * fn;
}
/*!
* @brief set up perspective projection matrix with a right-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_rh_zo(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest) {
float f, fn;
glm_mat4_zero(dest);
f = 1.0f / tanf(fovy * 0.5f);
fn = 1.0f / (nearZ - farZ);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] = farZ * fn;
dest[2][3] =-1.0f;
dest[3][2] = nearZ * farZ * fn;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_default_rh_zo(float aspect, mat4 dest) {
glm_perspective_rh_zo(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* resized with a right-hand coordinate system and a clip-space of
* [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in, out] proj perspective projection matrix
*/
CGLM_INLINE
void
glm_perspective_resize_rh_zo(float aspect, mat4 proj) {
if (proj[0][0] == 0.0f)
return;
proj[0][0] = proj[1][1] / aspect;
}
/*!
* @brief extend perspective projection matrix's far distance with a
* right-hand coordinate system and a clip-space of [0, 1].
*
* this function does not guarantee far >= near, be aware of that!
*
* @param[in, out] proj projection matrix to extend
* @param[in] deltaFar distance from existing far (negative to shink)
*/
CGLM_INLINE
void
glm_persp_move_far_rh_zo(mat4 proj, float deltaFar) {
float fn, farZ, nearZ, p22, p32;
p22 = proj[2][2];
p32 = proj[3][2];
nearZ = p32 / p22;
farZ = p32 / (p22 + 1.0f) + deltaFar;
fn = 1.0f / (nearZ - farZ);
proj[2][2] = farZ * fn;
proj[3][2] = nearZ * farZ * fn;
}
/*!
* @brief decomposes frustum values of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_rh_zo(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
float m00, m11, m20, m21, m22, m32, n, f;
float n_m11, n_m00;
m00 = proj[0][0];
m11 = proj[1][1];
m20 = proj[2][0];
m21 = proj[2][1];
m22 = proj[2][2];
m32 = proj[3][2];
n = m32 / m22;
f = m32 / (m22 + 1.0f);
n_m11 = n / m11;
n_m00 = n / m00;
*nearZ = n;
*farZ = f;
*bottom = n_m11 * (m21 - 1.0f);
*top = n_m11 * (m21 + 1.0f);
*left = n_m00 * (m20 - 1.0f);
*right = n_m00 * (m20 + 1.0f);
}
/*!
* @brief decomposes frustum values of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
* 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_rh_zo(mat4 proj, float dest[6]) {
glm_persp_decomp_rh_zo(proj, &dest[0], &dest[1], &dest[2],
&dest[3], &dest[4], &dest[5]);
}
/*!
* @brief decomposes left and right values of perspective projection (ZO).
* 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_rh_zo(mat4 proj,
float * __restrict left,
float * __restrict right) {
float nearZ, m20, m00, m22;
m00 = proj[0][0];
m20 = proj[2][0];
m22 = proj[2][2];
nearZ = proj[3][2] / m22;
*left = nearZ * (m20 - 1.0f) / m00;
*right = nearZ * (m20 + 1.0f) / m00;
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
* y stands for y axis (top / bottom axis)
*
* @param[in] proj perspective projection matrix
* @param[out] top top
* @param[out] bottom bottom
*/
CGLM_INLINE
void
glm_persp_decomp_y_rh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
float nearZ, m21, m11, m22;
m21 = proj[2][1];
m11 = proj[1][1];
m22 = proj[2][2];
nearZ = proj[3][2] / m22;
*bottom = nearZ * (m21 - 1) / m11;
*top = nearZ * (m21 + 1) / m11;
}
/*!
* @brief decomposes near and far values of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_z_rh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
float m32, m22;
m32 = proj[3][2];
m22 = proj[2][2];
*nearZ = m32 / m22;
*farZ = m32 / (m22 + 1.0f);
}
/*!
* @brief decomposes far value of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ) {
*farZ = proj[3][2] / (proj[2][2] + 1.0f);
}
/*!
* @brief decomposes near value of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glm_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ) {
*nearZ = proj[3][2] / proj[2][2];
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
void
glm_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest) {
float t, a, nearZ, farZ;
t = 2.0f * tanf(fovy * 0.5f);
a = glm_persp_aspect(proj);
glm_persp_decomp_z_rh_zo(proj, &nearZ, &farZ);
dest[1] = t * nearZ;
dest[3] = t * farZ;
dest[0] = a * dest[1];
dest[2] = a * dest[3];
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a right-hand coordinate system and a clip-space of [0, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy_rh_zo(mat4 proj) {
return glm_persp_fovy(proj);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a right-hand coordinate system and a clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect_rh_zo(mat4 proj) {
return glm_persp_aspect(proj);
}
#endif /*cglm_persp_rh_zo_h*/

View File

@@ -0,0 +1,99 @@
/*
* 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_lookat_lh(vec3 eye, vec3 center, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_lh(vec3 eye, vec3 dir, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_anyup_lh(vec3 eye, vec3 dir, mat4 dest)
*/
#ifndef cglm_view_lh_h
#define cglm_view_lh_h
#include "../common.h"
#include "../plane.h"
/*!
* @brief set up view matrix (LH)
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @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_lh(vec3 eye, vec3 center, vec3 up, mat4 dest) {
CGLM_ALIGN(8) vec3 f, u, s;
glm_vec3_sub(center, eye, f);
glm_vec3_normalize(f);
glm_vec3_crossn(f, up, s);
glm_vec3_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_vec3_dot(s, eye);
dest[3][1] =-glm_vec3_dot(u, eye);
dest[3][2] =-glm_vec3_dot(f, eye);
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
dest[3][3] = 1.0f;
}
/*!
* @brief set up view matrix with left handed coordinate system
*
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_lh(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
CGLM_ALIGN(8) vec3 target;
glm_vec3_add(eye, dir, target);
glm_lookat_lh(eye, target, up, dest);
}
/*!
* @brief set up view matrix with left handed coordinate system
*
* convenient wrapper for look: if you only have direction and if you don't
* care what UP vector is then this might be useful to create view matrix
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_anyup_lh(vec3 eye, vec3 dir, mat4 dest) {
CGLM_ALIGN(8) vec3 up;
glm_vec3_ortho(dir, up);
glm_look_lh(eye, dir, up, dest);
}
#endif /*cglm_view_lh_h*/

View File

@@ -0,0 +1,73 @@
/*
* 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_lookat_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest)
*/
#ifndef cglm_view_lh_no_h
#define cglm_view_lh_no_h
#include "view_lh.h"
/*!
* @brief set up view matrix with left handed coordinate system.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @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_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest) {
glm_lookat_lh(eye, center, up, dest);
}
/*!
* @brief set up view matrix with left handed coordinate system.
*
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
glm_look_lh(eye, dir, up, dest);
}
/*!
* @brief set up view matrix with left handed coordinate system.
*
* convenient wrapper for look: if you only have direction and if you don't
* care what UP vector is then this might be useful to create view matrix
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest) {
glm_look_anyup_lh(eye, dir, dest);
}
#endif /*cglm_view_lh_no_h*/

View File

@@ -0,0 +1,73 @@
/*
* 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_lookat_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest)
*/
#ifndef cglm_view_lh_zo_h
#define cglm_view_lh_zo_h
#include "view_lh.h"
/*!
* @brief set up view matrix with left handed coordinate system.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @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_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest) {
glm_lookat_lh(eye, center, up, dest);
}
/*!
* @brief set up view matrix with left handed coordinate system.
*
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
glm_look_lh(eye, dir, up, dest);
}
/*!
* @brief set up view matrix with left handed coordinate system.
*
* convenient wrapper for look: if you only have direction and if you don't
* care what UP vector is then this might be useful to create view matrix
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest) {
glm_look_anyup_lh(eye, dir, dest);
}
#endif /*cglm_view_lh_zo_h*/

View File

@@ -0,0 +1,99 @@
/*
* 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_lookat_rh(vec3 eye, vec3 center, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_rh(vec3 eye, vec3 dir, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_anyup_rh(vec3 eye, vec3 dir, mat4 dest)
*/
#ifndef cglm_view_rh_h
#define cglm_view_rh_h
#include "../common.h"
#include "../plane.h"
/*!
* @brief set up view matrix with right handed coordinate system.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @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_rh(vec3 eye, vec3 center, vec3 up, mat4 dest) {
CGLM_ALIGN(8) vec3 f, u, s;
glm_vec3_sub(center, eye, f);
glm_vec3_normalize(f);
glm_vec3_crossn(f, up, s);
glm_vec3_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_vec3_dot(s, eye);
dest[3][1] =-glm_vec3_dot(u, eye);
dest[3][2] = glm_vec3_dot(f, eye);
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
dest[3][3] = 1.0f;
}
/*!
* @brief set up view matrix with right handed coordinate system.
*
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_rh(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
CGLM_ALIGN(8) vec3 target;
glm_vec3_add(eye, dir, target);
glm_lookat_rh(eye, target, up, dest);
}
/*!
* @brief set up view matrix with right handed coordinate system.
*
* convenient wrapper for look: if you only have direction and if you don't
* care what UP vector is then this might be useful to create view matrix
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_anyup_rh(vec3 eye, vec3 dir, mat4 dest) {
CGLM_ALIGN(8) vec3 up;
glm_vec3_ortho(dir, up);
glm_look_rh(eye, dir, up, dest);
}
#endif /*cglm_view_rh_h*/

View File

@@ -0,0 +1,73 @@
/*
* 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_lookat_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest)
*/
#ifndef cglm_view_rh_no_h
#define cglm_view_rh_no_h
#include "view_rh.h"
/*!
* @brief set up view matrix with right handed coordinate system.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @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_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest) {
glm_lookat_rh(eye, center, up, dest);
}
/*!
* @brief set up view matrix with right handed coordinate system.
*
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
glm_look_rh(eye, dir, up, dest);
}
/*!
* @brief set up view matrix with right handed coordinate system.
*
* convenient wrapper for look: if you only have direction and if you don't
* care what UP vector is then this might be useful to create view matrix
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest) {
glm_look_anyup_rh(eye, dir, dest);
}
#endif /*cglm_view_rh_no_h*/

View File

@@ -0,0 +1,73 @@
/*
* 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_lookat_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest)
*/
#ifndef cglm_view_rh_zo_h
#define cglm_view_rh_zo_h
#include "view_rh.h"
/*!
* @brief set up view matrix with right handed coordinate system.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @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_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest) {
glm_lookat_rh(eye, center, up, dest);
}
/*!
* @brief set up view matrix with right handed coordinate system.
*
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
glm_look_rh(eye, dir, up, dest);
}
/*!
* @brief set up view matrix with right handed coordinate system.
*
* convenient wrapper for look: if you only have direction and if you don't
* care what UP vector is then this might be useful to create view matrix
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest) {
glm_look_anyup_rh(eye, dir, dest);
}
#endif /*cglm_view_rh_zo_h*/

View File

@@ -50,4 +50,35 @@
# define GLM_FLT_EPSILON FLT_EPSILON # define GLM_FLT_EPSILON FLT_EPSILON
#endif #endif
/*
* Clip control: define GLM_FORCE_DEPTH_ZERO_TO_ONE before including
* CGLM to use a clip space between 0 to 1.
* Coordinate system: define GLM_FORCE_LEFT_HANDED before including
* CGLM to use the left handed coordinate system by default.
*/
#define CGLM_CLIP_CONTROL_ZO_BIT (1 << 0) /* ZERO_TO_ONE */
#define CGLM_CLIP_CONTROL_NO_BIT (1 << 1) /* NEGATIVE_ONE_TO_ONE */
#define CGLM_CLIP_CONTROL_LH_BIT (1 << 2) /* LEFT_HANDED, For DirectX, Metal, Vulkan */
#define CGLM_CLIP_CONTROL_RH_BIT (1 << 3) /* RIGHT_HANDED, For OpenGL, default in GLM */
#define CGLM_CLIP_CONTROL_LH_ZO (CGLM_CLIP_CONTROL_LH_BIT | CGLM_CLIP_CONTROL_ZO_BIT)
#define CGLM_CLIP_CONTROL_LH_NO (CGLM_CLIP_CONTROL_LH_BIT | CGLM_CLIP_CONTROL_NO_BIT)
#define CGLM_CLIP_CONTROL_RH_ZO (CGLM_CLIP_CONTROL_RH_BIT | CGLM_CLIP_CONTROL_ZO_BIT)
#define CGLM_CLIP_CONTROL_RH_NO (CGLM_CLIP_CONTROL_RH_BIT | CGLM_CLIP_CONTROL_NO_BIT)
#ifdef CGLM_FORCE_DEPTH_ZERO_TO_ONE
# ifdef CGLM_FORCE_LEFT_HANDED
# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_LH_ZO
# else
# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_RH_ZO
# endif
#else
# ifdef CGLM_FORCE_LEFT_HANDED
# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_LH_NO
# else
# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_RH_NO
# endif
#endif
#endif /* cglm_common_h */ #endif /* cglm_common_h */

View File

@@ -9,6 +9,7 @@
#define cglm_plane_h #define cglm_plane_h
#include "common.h" #include "common.h"
#include "vec3.h"
#include "vec4.h" #include "vec4.h"
/* /*

View File

@@ -642,9 +642,12 @@ glm_quat_lerpc(versor from, versor to, float t, versor dest) {
CGLM_INLINE CGLM_INLINE
void void
glm_quat_nlerp(versor from, versor to, float t, versor dest) { glm_quat_nlerp(versor from, versor to, float t, versor dest) {
float dot = glm_vec4_dot(from, to);
versor target; versor target;
glm_vec4_scale(to, (dot >= 0) ? 1 : -1, target); float dot;
dot = glm_vec4_dot(from, to);
glm_vec4_scale(to, (dot >= 0) ? 1.0f : -1.0f, target);
glm_quat_lerp(from, target, t, dest); glm_quat_lerp(from, target, t, dest);
glm_quat_normalize(dest); glm_quat_normalize(dest);
} }

View File

@@ -9,10 +9,10 @@
Functions: Functions:
CGLM_INLINE mat4s glms_frustum(float left, float right, CGLM_INLINE mat4s glms_frustum(float left, float right,
float bottom, float top, float bottom, float top,
float nearVal, float farVal) float nearZ, float farZ)
CGLM_INLINE mat4s glms_ortho(float left, float right, CGLM_INLINE mat4s glms_ortho(float left, float right,
float bottom, float top, float bottom, float top,
float nearVal, float farVal) float nearZ, float farZ)
CGLM_INLINE mat4s glms_ortho_aabb(vec3s box[2]); CGLM_INLINE mat4s glms_ortho_aabb(vec3s box[2]);
CGLM_INLINE mat4s glms_ortho_aabb_p(vec3s box[2], float padding); CGLM_INLINE mat4s glms_ortho_aabb_p(vec3s box[2], float padding);
CGLM_INLINE mat4s glms_ortho_aabb_pz(vec3s box[2], float padding); CGLM_INLINE mat4s glms_ortho_aabb_pz(vec3s box[2], float padding);
@@ -20,8 +20,8 @@
CGLM_INLINE mat4s glms_ortho_default_s(float aspect, float size) CGLM_INLINE mat4s glms_ortho_default_s(float aspect, float size)
CGLM_INLINE mat4s glms_perspective(float fovy, CGLM_INLINE mat4s glms_perspective(float fovy,
float aspect, float aspect,
float nearVal, float nearZ,
float farVal) float farZ)
CGLM_INLINE void glms_persp_move_far(mat4s proj, float deltaFar) CGLM_INLINE void glms_persp_move_far(mat4s proj, float deltaFar)
CGLM_INLINE mat4s glms_perspective_default(float aspect) CGLM_INLINE mat4s glms_perspective_default(float aspect)
CGLM_INLINE void glms_perspective_resize(mat4s proj, float aspect) CGLM_INLINE void glms_perspective_resize(mat4s proj, float aspect)
@@ -36,8 +36,8 @@
CGLM_INLINE void glms_persp_decomp_x(mat4s proj, float *left, float *right) CGLM_INLINE void glms_persp_decomp_x(mat4s proj, float *left, float *right)
CGLM_INLINE void glms_persp_decomp_y(mat4s proj, float *top, float *bottom) CGLM_INLINE void glms_persp_decomp_y(mat4s proj, float *top, float *bottom)
CGLM_INLINE void glms_persp_decomp_z(mat4s proj, float *nearv, float *farv) CGLM_INLINE void glms_persp_decomp_z(mat4s proj, float *nearv, float *farv)
CGLM_INLINE void glms_persp_decomp_far(mat4s proj, float *farVal) CGLM_INLINE void glms_persp_decomp_far(mat4s proj, float *farZ)
CGLM_INLINE void glms_persp_decomp_near(mat4s proj, float *nearVal) CGLM_INLINE void glms_persp_decomp_near(mat4s proj, float *nearZ)
CGLM_INLINE float glms_persp_fovy(mat4s proj) CGLM_INLINE float glms_persp_fovy(mat4s proj)
CGLM_INLINE float glms_persp_aspect(mat4s proj) CGLM_INLINE float glms_persp_aspect(mat4s proj)
CGLM_INLINE vec4s glms_persp_sizes(mat4s proj, float fovy) CGLM_INLINE vec4s glms_persp_sizes(mat4s proj, float fovy)
@@ -51,6 +51,39 @@
#include "../plane.h" #include "../plane.h"
#include "../cam.h" #include "../cam.h"
#ifndef CGLM_CLIPSPACE_INCLUDE_ALL
# if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
# include "clipspace/ortho_lh_zo.h"
# include "clipspace/persp_lh_zo.h"
# include "clipspace/view_lh_zo.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
# include "clipspace/ortho_lh_no.h"
# include "clipspace/persp_lh_no.h"
# include "clipspace/view_lh_no.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
# include "clipspace/ortho_rh_zo.h"
# include "clipspace/persp_rh_zo.h"
# include "clipspace/view_rh_zo.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
# include "clipspace/ortho_rh_no.h"
# include "clipspace/persp_rh_no.h"
# include "clipspace/view_rh_no.h"
# endif
#else
# include "clipspace/ortho_lh_zo.h"
# include "clipspace/persp_lh_zo.h"
# include "clipspace/ortho_lh_no.h"
# include "clipspace/persp_lh_no.h"
# include "clipspace/ortho_rh_zo.h"
# include "clipspace/persp_rh_zo.h"
# include "clipspace/ortho_rh_no.h"
# include "clipspace/persp_rh_no.h"
# include "clipspace/view_lh_zo.h"
# include "clipspace/view_lh_no.h"
# include "clipspace/view_rh_zo.h"
# include "clipspace/view_rh_no.h"
#endif
/*! /*!
* @brief set up perspective peprojection matrix * @brief set up perspective peprojection matrix
* *
@@ -58,18 +91,24 @@
* @param[in] right viewport.right * @param[in] right viewport.right
* @param[in] bottom viewport.bottom * @param[in] bottom viewport.bottom
* @param[in] top viewport.top * @param[in] top viewport.top
* @param[in] nearVal near clipping plane * @param[in] nearZ near clipping plane
* @param[in] farVal far clipping plane * @param[in] farZ far clipping plane
* @returns result matrix * @returns result matrix
*/ */
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_frustum(float left, float right, glms_frustum(float left, float right,
float bottom, float top, float bottom, float top,
float nearVal, float farVal) { float nearZ, float farZ) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_frustum(left, right, bottom, top, nearVal, farVal, dest.raw); return glms_frustum_lh_zo(left, right, bottom, top, nearZ, farZ);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_frustum_lh_no(left, right, bottom, top, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_frustum_rh_zo(left, right, bottom, top, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_frustum_rh_no(left, right, bottom, top, nearZ, farZ);
#endif
} }
/*! /*!
@@ -79,18 +118,24 @@ glms_frustum(float left, float right,
* @param[in] right viewport.right * @param[in] right viewport.right
* @param[in] bottom viewport.bottom * @param[in] bottom viewport.bottom
* @param[in] top viewport.top * @param[in] top viewport.top
* @param[in] nearVal near clipping plane * @param[in] nearZ near clipping plane
* @param[in] farVal far clipping plane * @param[in] farZ far clipping plane
* @returns result matrix * @returns result matrix
*/ */
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_ortho(float left, float right, glms_ortho(float left, float right,
float bottom, float top, float bottom, float top,
float nearVal, float farVal) { float nearZ, float farZ) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho(left, right, bottom, top, nearVal, farVal, dest.raw); return glms_ortho_lh_zo(left, right, bottom, top, nearZ, farZ);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_ortho_lh_no(left, right, bottom, top, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_ortho_rh_zo(left, right, bottom, top, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_ortho_rh_no(left, right, bottom, top, nearZ, farZ);
#endif
} }
/*! /*!
@@ -104,13 +149,15 @@ glms_ortho(float left, float right,
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_ortho_aabb(vec3s box[2]) { glms_ortho_aabb(vec3s box[2]) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
vec3 rawBox[2]; return glms_ortho_aabb_lh_zo(box);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glms_vec3_unpack(rawBox, box, 2); return glms_ortho_aabb_lh_no(box);
glm_ortho_aabb(rawBox, dest.raw); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_ortho_aabb_rh_zo(box);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_ortho_aabb_rh_no(box);
#endif
} }
/*! /*!
@@ -125,13 +172,15 @@ glms_ortho_aabb(vec3s box[2]) {
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_ortho_aabb_p(vec3s box[2], float padding) { glms_ortho_aabb_p(vec3s box[2], float padding) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
vec3 rawBox[2]; return glms_ortho_aabb_p_lh_zo(box, padding);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glms_vec3_unpack(rawBox, box, 2); return glms_ortho_aabb_p_lh_no(box, padding);
glm_ortho_aabb_p(rawBox, padding, dest.raw); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_ortho_aabb_p_rh_zo(box, padding);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_ortho_aabb_p_rh_no(box, padding);
#endif
} }
/*! /*!
@@ -146,13 +195,15 @@ glms_ortho_aabb_p(vec3s box[2], float padding) {
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_ortho_aabb_pz(vec3s box[2], float padding) { glms_ortho_aabb_pz(vec3s box[2], float padding) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
vec3 rawBox[2]; return glms_ortho_aabb_pz_lh_zo(box, padding);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glms_vec3_unpack(rawBox, box, 2); return glms_ortho_aabb_pz_lh_no(box, padding);
glm_ortho_aabb_pz(rawBox, padding, dest.raw); #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_ortho_aabb_pz_rh_zo(box, padding);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_ortho_aabb_pz_rh_no(box, padding);
#endif
} }
/*! /*!
@@ -164,9 +215,15 @@ glms_ortho_aabb_pz(vec3s box[2], float padding) {
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_ortho_default(float aspect) { glms_ortho_default(float aspect) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho_default(aspect, dest.raw); return glms_ortho_default_lh_zo(aspect);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_ortho_default_lh_no(aspect);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_ortho_default_rh_zo(aspect);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_ortho_default_rh_no(aspect);
#endif
} }
/*! /*!
@@ -179,9 +236,15 @@ glms_ortho_default(float aspect) {
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_ortho_default_s(float aspect, float size) { glms_ortho_default_s(float aspect, float size) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho_default_s(aspect, size, dest.raw); return glms_ortho_default_s_lh_zo(aspect, size);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_ortho_default_s_lh_no(aspect, size);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_ortho_default_s_rh_zo(aspect, size);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_ortho_default_s_rh_no(aspect, size);
#endif
} }
/*! /*!
@@ -189,30 +252,48 @@ glms_ortho_default_s(float aspect, float size) {
* *
* @param[in] fovy field of view angle * @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height ) * @param[in] aspect aspect ratio ( width / height )
* @param[in] nearVal near clipping plane * @param[in] nearZ near clipping plane
* @param[in] farVal far clipping planes * @param[in] farZ far clipping planes
* @returns result matrix * @returns result matrix
*/ */
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_perspective(float fovy, float aspect, float nearVal, float farVal) { glms_perspective(float fovy, float aspect, float nearZ, float farZ) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_perspective(fovy, aspect, nearVal, farVal, dest.raw); return glms_perspective_lh_zo(fovy, aspect, nearZ, farZ);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_perspective_lh_no(fovy, aspect, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_perspective_rh_zo(fovy, aspect, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_perspective_rh_no(fovy, aspect, nearZ, farZ);
#endif
} }
/*! /*!
* @brief extend perspective projection matrix's far distance * @brief extend perspective projection matrix's far distance
* *
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
* like glm_persp_move_far(prooj.raw, deltaFar) to avoid create new mat4
* each time
*
* this function does not guarantee far >= near, be aware of that! * this function does not guarantee far >= near, be aware of that!
* *
* @param[in, out] proj projection matrix to extend * @param[in, out] proj projection matrix to extend
* @param[in] deltaFar distance from existing far (negative to shink) * @param[in] deltaFar distance from existing far (negative to shink)
*/ */
CGLM_INLINE CGLM_INLINE
void mat4s
glms_persp_move_far(mat4s proj, float deltaFar) { glms_persp_move_far(mat4s proj, float deltaFar) {
glm_persp_move_far(proj.raw, deltaFar); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
return glms_persp_move_far_lh_zo(proj, deltaFar);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_persp_move_far_lh_no(proj, deltaFar);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_persp_move_far_rh_zo(proj, deltaFar);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_persp_move_far_rh_no(proj, deltaFar);
#endif
} }
/*! /*!
@@ -225,9 +306,15 @@ glms_persp_move_far(mat4s proj, float deltaFar) {
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_perspective_default(float aspect) { glms_perspective_default(float aspect) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_perspective_default(aspect, dest.raw); return glms_perspective_default_lh_zo(aspect);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_perspective_default_lh_no(aspect);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_perspective_default_rh_zo(aspect);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_perspective_default_rh_no(aspect);
#endif
} }
/*! /*!
@@ -235,13 +322,25 @@ glms_perspective_default(float aspect) {
* this makes very easy to resize proj matrix when window /viewport * this makes very easy to resize proj matrix when window /viewport
* reized * reized
* *
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
* like glms_perspective_resize(proj.raw, aspect) to avoid create new mat4
* each time
*
* @param[in, out] proj perspective projection matrix * @param[in, out] proj perspective projection matrix
* @param[in] aspect aspect ratio ( width / height ) * @param[in] aspect aspect ratio ( width / height )
*/ */
CGLM_INLINE CGLM_INLINE
void mat4s
glms_perspective_resize(mat4s proj, float aspect) { glms_perspective_resize(mat4s proj, float aspect) {
glm_perspective_resize(aspect, proj.raw); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
return glms_perspective_resize_lh_zo(proj, aspect);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_perspective_resize_lh_no(proj, aspect);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_perspective_resize_rh_zo(proj, aspect);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_perspective_resize_rh_no(proj, aspect);
#endif
} }
/*! /*!
@@ -258,9 +357,15 @@ glms_perspective_resize(mat4s proj, float aspect) {
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_lookat(vec3s eye, vec3s center, vec3s up) { glms_lookat(vec3s eye, vec3s center, vec3s up) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_lookat(eye.raw, center.raw, up.raw, dest.raw); return glms_lookat_lh_zo(eye, center, up);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_lookat_lh_no(eye, center, up);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_lookat_rh_zo(eye, center, up);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_lookat_rh_no(eye, center, up);
#endif
} }
/*! /*!
@@ -280,9 +385,15 @@ glms_lookat(vec3s eye, vec3s center, vec3s up) {
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_look(vec3s eye, vec3s dir, vec3s up) { glms_look(vec3s eye, vec3s dir, vec3s up) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_look(eye.raw, dir.raw, up.raw, dest.raw); return glms_look_lh_zo(eye, dir, up);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_look_lh_no(eye, dir, up);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_look_rh_zo(eye, dir, up);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_look_rh_no(eye, dir, up);
#endif
} }
/*! /*!
@@ -298,17 +409,23 @@ glms_look(vec3s eye, vec3s dir, vec3s up) {
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_look_anyup(vec3s eye, vec3s dir) { glms_look_anyup(vec3s eye, vec3s dir) {
mat4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_look_anyup(eye.raw, dir.raw, dest.raw); return glms_look_anyup_lh_zo(eye, dir);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_look_anyup_lh_no(eye, dir);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_look_anyup_rh_zo(eye, dir);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_look_anyup_rh_no(eye, dir);
#endif
} }
/*! /*!
* @brief decomposes frustum values of perspective projection. * @brief decomposes frustum values of perspective projection.
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] nearVal near * @param[out] nearZ near
* @param[out] farVal far * @param[out] farZ far
* @param[out] top top * @param[out] top top
* @param[out] bottom bottom * @param[out] bottom bottom
* @param[out] left left * @param[out] left left
@@ -317,10 +434,18 @@ glms_look_anyup(vec3s eye, vec3s dir) {
CGLM_INLINE CGLM_INLINE
void void
glms_persp_decomp(mat4s proj, glms_persp_decomp(mat4s proj,
float * __restrict nearVal, float * __restrict farVal, float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom, float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) { float * __restrict left, float * __restrict right) {
glm_persp_decomp(proj.raw, nearVal, farVal, top, bottom, left, right); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glms_persp_decomp_lh_zo(proj, nearZ, farZ, top, bottom, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glms_persp_decomp_lh_no(proj, nearZ, farZ, top, bottom, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glms_persp_decomp_rh_zo(proj, nearZ, farZ, top, bottom, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glms_persp_decomp_rh_no(proj, nearZ, farZ, top, bottom, left, right);
#endif
} }
/*! /*!
@@ -333,7 +458,15 @@ glms_persp_decomp(mat4s proj,
CGLM_INLINE CGLM_INLINE
void void
glms_persp_decompv(mat4s proj, float dest[6]) { glms_persp_decompv(mat4s proj, float dest[6]) {
glm_persp_decompv(proj.raw, dest); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glms_persp_decompv_lh_zo(proj, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glms_persp_decompv_lh_no(proj, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glms_persp_decompv_rh_zo(proj, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glms_persp_decompv_rh_no(proj, dest);
#endif
} }
/*! /*!
@@ -349,7 +482,15 @@ void
glms_persp_decomp_x(mat4s proj, glms_persp_decomp_x(mat4s proj,
float * __restrict left, float * __restrict left,
float * __restrict right) { float * __restrict right) {
glm_persp_decomp_x(proj.raw, left, right); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glms_persp_decomp_x_lh_zo(proj, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glms_persp_decomp_x_lh_no(proj, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glms_persp_decomp_x_rh_zo(proj, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glms_persp_decomp_x_rh_no(proj, left, right);
#endif
} }
/*! /*!
@@ -365,7 +506,15 @@ void
glms_persp_decomp_y(mat4s proj, glms_persp_decomp_y(mat4s proj,
float * __restrict top, float * __restrict top,
float * __restrict bottom) { float * __restrict bottom) {
glm_persp_decomp_y(proj.raw, top, bottom); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glms_persp_decomp_y_lh_zo(proj, top, bottom);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glms_persp_decomp_y_lh_no(proj, top, bottom);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glms_persp_decomp_y_rh_zo(proj, top, bottom);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glms_persp_decomp_y_rh_no(proj, top, bottom);
#endif
} }
/*! /*!
@@ -373,39 +522,63 @@ glms_persp_decomp_y(mat4s proj,
* z stands for z axis (near / far axis) * z stands for z axis (near / far axis)
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] nearVal near * @param[out] nearZ near
* @param[out] farVal far * @param[out] farZ far
*/ */
CGLM_INLINE CGLM_INLINE
void void
glms_persp_decomp_z(mat4s proj, glms_persp_decomp_z(mat4s proj,
float * __restrict nearVal, float * __restrict nearZ,
float * __restrict farVal) { float * __restrict farZ) {
glm_persp_decomp_z(proj.raw, nearVal, farVal); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glms_persp_decomp_z_lh_zo(proj, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glms_persp_decomp_z_lh_no(proj, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glms_persp_decomp_z_rh_zo(proj, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glms_persp_decomp_z_rh_no(proj, nearZ, farZ);
#endif
} }
/*! /*!
* @brief decomposes far value of perspective projection. * @brief decomposes far value of perspective projection.
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] farVal far * @param[out] farZ far
*/ */
CGLM_INLINE CGLM_INLINE
void void
glms_persp_decomp_far(mat4s proj, float * __restrict farVal) { glms_persp_decomp_far(mat4s proj, float * __restrict farZ) {
glm_persp_decomp_far(proj.raw, farVal); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glms_persp_decomp_far_lh_zo(proj, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glms_persp_decomp_far_lh_no(proj, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glms_persp_decomp_far_rh_zo(proj, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glms_persp_decomp_far_rh_no(proj, farZ);
#endif
} }
/*! /*!
* @brief decomposes near value of perspective projection. * @brief decomposes near value of perspective projection.
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] nearVal near * @param[out] nearZ near
*/ */
CGLM_INLINE CGLM_INLINE
void void
glms_persp_decomp_near(mat4s proj, float * __restrict nearVal) { glms_persp_decomp_near(mat4s proj, float * __restrict nearZ) {
glm_persp_decomp_near(proj.raw, nearVal); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glms_persp_decomp_near_lh_zo(proj, nearZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glms_persp_decomp_near_lh_no(proj, nearZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glms_persp_decomp_near_rh_zo(proj, nearZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glms_persp_decomp_near_rh_no(proj, nearZ);
#endif
} }
/*! /*!
@@ -419,7 +592,15 @@ glms_persp_decomp_near(mat4s proj, float * __restrict nearVal) {
CGLM_INLINE CGLM_INLINE
float float
glms_persp_fovy(mat4s proj) { glms_persp_fovy(mat4s proj) {
return glm_persp_fovy(proj.raw); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
return glms_persp_fovy_lh_zo(proj);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_persp_fovy_lh_no(proj);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_persp_fovy_rh_zo(proj);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_persp_fovy_rh_no(proj);
#endif
} }
/*! /*!
@@ -430,7 +611,15 @@ glms_persp_fovy(mat4s proj) {
CGLM_INLINE CGLM_INLINE
float float
glms_persp_aspect(mat4s proj) { glms_persp_aspect(mat4s proj) {
return glm_persp_aspect(proj.raw); #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
return glms_persp_aspect_lh_zo(proj);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_persp_aspect_lh_no(proj);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_persp_aspect_rh_zo(proj);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_persp_aspect_rh_no(proj);
#endif
} }
/*! /*!
@@ -443,9 +632,15 @@ glms_persp_aspect(mat4s proj) {
CGLM_INLINE CGLM_INLINE
vec4s vec4s
glms_persp_sizes(mat4s proj, float fovy) { glms_persp_sizes(mat4s proj, float fovy) {
vec4s dest; #if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_sizes(proj.raw, fovy, dest.raw); return glms_persp_sizes_lh_zo(proj, fovy);
return dest; #elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
return glms_persp_sizes_lh_no(proj, fovy);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
return glms_persp_sizes_rh_zo(proj, fovy);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
return glms_persp_sizes_rh_no(proj, fovy);
#endif
} }
#endif /* cglms_cam_h */ #endif /* cglms_cam_h */

View File

@@ -0,0 +1,152 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_ortho_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ)
CGLM_INLINE mat4s glms_ortho_aabb_lh_no(vec3s box[2]);
CGLM_INLINE mat4s glms_ortho_aabb_p_lh_no(vec3s box[2], float padding);
CGLM_INLINE mat4s glms_ortho_aabb_pz_lh_no(vec3s box[2], float padding);
CGLM_INLINE mat4s glms_ortho_default_lh_no(float aspect)
CGLM_INLINE mat4s glms_ortho_default_s_lh_no(float aspect, float size)
*/
#ifndef cglms_ortho_lh_no_h
#define cglms_ortho_lh_no_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up orthographic projection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ) {
mat4s dest;
glm_ortho_lh_no(left, right, bottom, top, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_lh_no(vec3s box[2]) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_lh_no(rawBox, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_p_lh_no(vec3s box[2], float padding) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_p_lh_no(rawBox, padding, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_pz_lh_no(vec3s box[2], float padding) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_pz_lh_no(rawBox, padding, dest.raw);
return dest;
}
/*!
* @brief set up unit orthographic projection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_default_lh_no(float aspect) {
mat4s dest;
glm_ortho_default_lh_no(aspect, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_default_s_lh_no(float aspect, float size) {
mat4s dest;
glm_ortho_default_s_lh_no(aspect, size, dest.raw);
return dest;
}
#endif /* cglms_ortho_lh_no_h */

View File

@@ -0,0 +1,152 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_ortho_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ)
CGLM_INLINE mat4s glms_ortho_aabb_lh_zo(vec3s box[2]);
CGLM_INLINE mat4s glms_ortho_aabb_p_lh_zo(vec3s box[2], float padding);
CGLM_INLINE mat4s glms_ortho_aabb_pz_lh_zo(vec3s box[2], float padding);
CGLM_INLINE mat4s glms_ortho_default_lh_zo(float aspect)
CGLM_INLINE mat4s glms_ortho_default_s_lh_zo(float aspect, float size)
*/
#ifndef cglms_ortho_lh_zo_h
#define cglms_ortho_lh_zo_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up orthographic projection matrix
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ) {
mat4s dest;
glm_ortho_lh_zo(left, right, bottom, top, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_lh_zo(vec3s box[2]) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_lh_zo(rawBox, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_p_lh_zo(vec3s box[2], float padding) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_p_lh_zo(rawBox, padding, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_pz_lh_zo(vec3s box[2], float padding) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_pz_lh_zo(rawBox, padding, dest.raw);
return dest;
}
/*!
* @brief set up unit orthographic projection matrix
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_default_lh_zo(float aspect) {
mat4s dest;
glm_ortho_default_lh_zo(aspect, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_default_s_lh_zo(float aspect, float size) {
mat4s dest;
glm_ortho_default_s_lh_zo(aspect, size, dest.raw);
return dest;
}
#endif /* cglms_ortho_lh_zo_h */

View File

@@ -0,0 +1,152 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_ortho_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ)
CGLM_INLINE mat4s glms_ortho_aabb_rh_no(vec3s box[2]);
CGLM_INLINE mat4s glms_ortho_aabb_p_rh_no(vec3s box[2], float padding);
CGLM_INLINE mat4s glms_ortho_aabb_pz_rh_no(vec3s box[2], float padding);
CGLM_INLINE mat4s glms_ortho_default_rh_no(float aspect)
CGLM_INLINE mat4s glms_ortho_default_s_rh_no(float aspect, float size)
*/
#ifndef cglms_ortho_rh_no_h
#define cglms_ortho_rh_no_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up orthographic projection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ) {
mat4s dest;
glm_ortho_rh_no(left, right, bottom, top, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_rh_no(vec3s box[2]) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_rh_no(rawBox, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_p_rh_no(vec3s box[2], float padding) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_p_rh_no(rawBox, padding, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_pz_rh_no(vec3s box[2], float padding) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_pz_rh_no(rawBox, padding, dest.raw);
return dest;
}
/*!
* @brief set up unit orthographic projection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_default_rh_no(float aspect) {
mat4s dest;
glm_ortho_default_rh_no(aspect, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_default_s_rh_no(float aspect, float size) {
mat4s dest;
glm_ortho_default_s_rh_no(aspect, size, dest.raw);
return dest;
}
#endif /* cglms_ortho_rh_no_h */

View File

@@ -0,0 +1,152 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_ortho_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ)
CGLM_INLINE mat4s glms_ortho_aabb_rh_zo(vec3s box[2]);
CGLM_INLINE mat4s glms_ortho_aabb_p_rh_zo(vec3s box[2], float padding);
CGLM_INLINE mat4s glms_ortho_aabb_pz_rh_zo(vec3s box[2], float padding);
CGLM_INLINE mat4s glms_ortho_default_rh_zo(float aspect)
CGLM_INLINE mat4s glms_ortho_default_s_rh_zo(float aspect, float size)
*/
#ifndef cglms_ortho_rh_zo_h
#define cglms_ortho_rh_zo_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up orthographic projection matrix
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ) {
mat4s dest;
glm_ortho_rh_zo(left, right, bottom, top, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_rh_zo(vec3s box[2]) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_rh_zo(rawBox, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_p_rh_zo(vec3s box[2], float padding) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_p_rh_zo(rawBox, padding, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_aabb_pz_rh_zo(vec3s box[2], float padding) {
mat4s dest;
vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2);
glm_ortho_aabb_pz_rh_zo(rawBox, padding, dest.raw);
return dest;
}
/*!
* @brief set up unit orthographic projection matrix
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_default_rh_zo(float aspect) {
mat4s dest;
glm_ortho_default_rh_zo(aspect, dest.raw);
return dest;
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_ortho_default_s_rh_zo(float aspect, float size) {
mat4s dest;
glm_ortho_default_s_rh_zo(aspect, size, dest.raw);
return dest;
}
#endif /* cglms_ortho_rh_zo_h */

View File

@@ -0,0 +1,311 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_frustum_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ)
CGLM_INLINE mat4s glms_perspective_lh_no(float fovy,
float aspect,
float nearZ,
float farZ)
CGLM_INLINE void glms_persp_move_far_lh_no(mat4s proj, float deltaFar)
CGLM_INLINE mat4s glms_perspective_default_lh_no(float aspect)
CGLM_INLINE void glms_perspective_resize_lh_no(mat4s proj, float aspect)
CGLM_INLINE void glms_persp_decomp_lh_no(mat4s proj,
float *nearv, float *farv,
float *top, float *bottom,
float *left, float *right)
CGLM_INLINE void glms_persp_decompv_lh_no(mat4s proj, float dest[6])
CGLM_INLINE void glms_persp_decomp_x_lh_no(mat4s proj, float *left, float *right)
CGLM_INLINE void glms_persp_decomp_y_lh_no(mat4s proj, float *top, float *bottom)
CGLM_INLINE void glms_persp_decomp_z_lh_no(mat4s proj, float *nearv, float *farv)
CGLM_INLINE void glms_persp_decomp_far_lh_no(mat4s proj, float *farZ)
CGLM_INLINE void glms_persp_decomp_near_lh_no(mat4s proj, float *nearZ)
CGLM_INLINE float glms_persp_fovy_lh_no(mat4s proj)
CGLM_INLINE float glms_persp_aspect_lh_no(mat4s proj)
CGLM_INLINE vec4s glms_persp_sizes_lh_no(mat4s proj, float fovy)
*/
#ifndef cglms_persp_lh_no_h
#define cglms_persp_lh_no_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up perspective peprojection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_frustum_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ) {
mat4s dest;
glm_frustum_lh_no(left, right, bottom, top, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief set up perspective projection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_perspective_lh_no(float fovy, float aspect, float nearZ, float farZ) {
mat4s dest;
glm_perspective_lh_no(fovy, aspect, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief extend perspective projection matrix's far distance
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
* like glms_persp_move_far_lh_no(prooj.raw, deltaFar) to avoid create new mat4
* each time
*
* this function does not guarantee far >= near, be aware of that!
*
* @param[in, out] proj projection matrix to extend
* @param[in] deltaFar distance from existing far (negative to shink)
*/
CGLM_INLINE
mat4s
glms_persp_move_far_lh_no(mat4s proj, float deltaFar) {
mat4s dest;
dest = proj;
glm_persp_move_far_lh_no(dest.raw, deltaFar);
return dest;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_perspective_default_lh_no(float aspect) {
mat4s dest;
glm_perspective_default_lh_no(aspect, dest.raw);
return dest;
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* reized with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
* like glm_perspective_resize_lh_no(proj.raw, aspect) to avoid create new mat4
* each time
*
* @param[in, out] proj perspective projection matrix
* @param[in] aspect aspect ratio ( width / height )
*/
CGLM_INLINE
mat4s
glms_perspective_resize_lh_no(mat4s proj, float aspect) {
mat4s dest;
dest = proj;
glm_perspective_resize_lh_no(aspect, dest.raw);
return dest;
}
/*!
* @brief decomposes frustum values of perspective projection.
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glms_persp_decomp_lh_no(mat4s proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
glm_persp_decomp_lh_no(proj.raw, nearZ, farZ, top, bottom, left, right);
}
/*!
* @brief decomposes frustum values of perspective projection.
* this makes easy to get all values at once
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] dest array
*/
CGLM_INLINE
void
glms_persp_decompv_lh_no(mat4s proj, float dest[6]) {
glm_persp_decompv_lh_no(proj.raw, dest);
}
/*!
* @brief decomposes left and right values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* 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
glms_persp_decomp_x_lh_no(mat4s proj,
float * __restrict left,
float * __restrict right) {
glm_persp_decomp_x_lh_no(proj.raw, left, right);
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* 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
glms_persp_decomp_y_lh_no(mat4s proj,
float * __restrict top,
float * __restrict bottom) {
glm_persp_decomp_y_lh_no(proj.raw, top, bottom);
}
/*!
* @brief decomposes near and far values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glms_persp_decomp_z_lh_no(mat4s proj,
float * __restrict nearZ,
float * __restrict farZ) {
glm_persp_decomp_z_lh_no(proj.raw, nearZ, farZ);
}
/*!
* @brief decomposes far value of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glms_persp_decomp_far_lh_no(mat4s proj, float * __restrict farZ) {
glm_persp_decomp_far_lh_no(proj.raw, farZ);
}
/*!
* @brief decomposes near value of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glms_persp_decomp_near_lh_no(mat4s proj, float * __restrict nearZ) {
glm_persp_decomp_near_lh_no(proj.raw, nearZ);
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glms_persp_fovy_lh_no(mat4s proj) {
return glm_persp_fovy_lh_no(proj.raw);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glms_persp_aspect_lh_no(mat4s proj) {
return glm_persp_aspect_lh_no(proj.raw);
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @returns sizes as vector, sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
vec4s
glms_persp_sizes_lh_no(mat4s proj, float fovy) {
vec4s dest;
glm_persp_sizes_lh_no(proj.raw, fovy, dest.raw);
return dest;
}
#endif /* cglms_persp_lh_no_h */

View File

@@ -0,0 +1,311 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_frustum_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ)
CGLM_INLINE mat4s glms_perspective_lh_zo(float fovy,
float aspect,
float nearZ,
float farZ)
CGLM_INLINE void glms_persp_move_far_lh_zo(mat4s proj, float deltaFar)
CGLM_INLINE mat4s glms_perspective_default_lh_zo(float aspect)
CGLM_INLINE void glms_perspective_resize_lh_zo(mat4s proj, float aspect)
CGLM_INLINE void glms_persp_decomp_lh_zo(mat4s proj,
float *nearv, float *farv,
float *top, float *bottom,
float *left, float *right)
CGLM_INLINE void glms_persp_decompv_lh_zo(mat4s proj, float dest[6])
CGLM_INLINE void glms_persp_decomp_x_lh_zo(mat4s proj, float *left, float *right)
CGLM_INLINE void glms_persp_decomp_y_lh_zo(mat4s proj, float *top, float *bottom)
CGLM_INLINE void glms_persp_decomp_z_lh_zo(mat4s proj, float *nearv, float *farv)
CGLM_INLINE void glms_persp_decomp_far_lh_zo(mat4s proj, float *farZ)
CGLM_INLINE void glms_persp_decomp_near_lh_zo(mat4s proj, float *nearZ)
CGLM_INLINE float glms_persp_fovy_lh_zo(mat4s proj)
CGLM_INLINE float glms_persp_aspect_lh_zo(mat4s proj)
CGLM_INLINE vec4s glms_persp_sizes_lh_zo(mat4s proj, float fovy)
*/
#ifndef cglms_persp_lh_zo_h
#define cglms_persp_lh_zo_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up perspective peprojection matrix
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_frustum_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ) {
mat4s dest;
glm_frustum_lh_zo(left, right, bottom, top, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief set up perspective projection matrix
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_perspective_lh_zo(float fovy, float aspect, float nearZ, float farZ) {
mat4s dest;
glm_perspective_lh_zo(fovy, aspect, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief extend perspective projection matrix's far distance
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
* like glms_persp_move_far_lh_zo(prooj.raw, deltaFar) to avoid create new mat4
* each time
*
* this function does not guarantee far >= near, be aware of that!
*
* @param[in, out] proj projection matrix to extend
* @param[in] deltaFar distance from existing far (negative to shink)
*/
CGLM_INLINE
mat4s
glms_persp_move_far_lh_zo(mat4s proj, float deltaFar) {
mat4s dest;
dest = proj;
glm_persp_move_far_lh_zo(dest.raw, deltaFar);
return dest;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_perspective_default_lh_zo(float aspect) {
mat4s dest;
glm_perspective_default_lh_zo(aspect, dest.raw);
return dest;
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* reized with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
* like glms_perspective_resize_lh_zo(proj.raw, aspect) to avoid create new mat4
* each time
*
* @param[in, out] proj perspective projection matrix
* @param[in] aspect aspect ratio ( width / height )
*/
CGLM_INLINE
mat4s
glms_perspective_resize_lh_zo(mat4s proj, float aspect) {
mat4s dest;
dest = proj;
glm_perspective_resize_lh_zo(aspect, dest.raw);
return dest;
}
/*!
* @brief decomposes frustum values of perspective projection.
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glms_persp_decomp_lh_zo(mat4s proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
glm_persp_decomp_lh_zo(proj.raw, nearZ, farZ, top, bottom, left, right);
}
/*!
* @brief decomposes frustum values of perspective projection.
* this makes easy to get all values at once
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] dest array
*/
CGLM_INLINE
void
glms_persp_decompv_lh_zo(mat4s proj, float dest[6]) {
glm_persp_decompv_lh_zo(proj.raw, dest);
}
/*!
* @brief decomposes left and right values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [0, 1].
* 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
glms_persp_decomp_x_lh_zo(mat4s proj,
float * __restrict left,
float * __restrict right) {
glm_persp_decomp_x_lh_zo(proj.raw, left, right);
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [0, 1].
* 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
glms_persp_decomp_y_lh_zo(mat4s proj,
float * __restrict top,
float * __restrict bottom) {
glm_persp_decomp_y_lh_zo(proj.raw, top, bottom);
}
/*!
* @brief decomposes near and far values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [0, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glms_persp_decomp_z_lh_zo(mat4s proj,
float * __restrict nearZ,
float * __restrict farZ) {
glm_persp_decomp_z_lh_zo(proj.raw, nearZ, farZ);
}
/*!
* @brief decomposes far value of perspective projection
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glms_persp_decomp_far_lh_zo(mat4s proj, float * __restrict farZ) {
glm_persp_decomp_far_lh_zo(proj.raw, farZ);
}
/*!
* @brief decomposes near value of perspective projection
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glms_persp_decomp_near_lh_zo(mat4s proj, float * __restrict nearZ) {
glm_persp_decomp_near_lh_zo(proj.raw, nearZ);
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glms_persp_fovy_lh_zo(mat4s proj) {
return glm_persp_fovy_lh_zo(proj.raw);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glms_persp_aspect_lh_zo(mat4s proj) {
return glm_persp_aspect_lh_zo(proj.raw);
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @returns sizes as vector, sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
vec4s
glms_persp_sizes_lh_zo(mat4s proj, float fovy) {
vec4s dest;
glm_persp_sizes_lh_zo(proj.raw, fovy, dest.raw);
return dest;
}
#endif /* cglms_persp_lh_zo_h */

View File

@@ -0,0 +1,311 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_frustum_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ)
CGLM_INLINE mat4s glms_perspective_rh_no(float fovy,
float aspect,
float nearZ,
float farZ)
CGLM_INLINE void glms_persp_move_far_rh_no(mat4s proj, float deltaFar)
CGLM_INLINE mat4s glms_perspective_default_rh_no(float aspect)
CGLM_INLINE void glms_perspective_resize_rh_no(mat4s proj, float aspect)
CGLM_INLINE void glms_persp_decomp_rh_no(mat4s proj,
float *nearv, float *farv,
float *top, float *bottom,
float *left, float *right)
CGLM_INLINE void glms_persp_decompv_rh_no(mat4s proj, float dest[6])
CGLM_INLINE void glms_persp_decomp_x_rh_no(mat4s proj, float *left, float *right)
CGLM_INLINE void glms_persp_decomp_y_rh_no(mat4s proj, float *top, float *bottom)
CGLM_INLINE void glms_persp_decomp_z_rh_no(mat4s proj, float *nearv, float *farv)
CGLM_INLINE void glms_persp_decomp_far_rh_no(mat4s proj, float *farZ)
CGLM_INLINE void glms_persp_decomp_near_rh_no(mat4s proj, float *nearZ)
CGLM_INLINE float glms_persp_fovy_rh_no(mat4s proj)
CGLM_INLINE float glms_persp_aspect_rh_no(mat4s proj)
CGLM_INLINE vec4s glms_persp_sizes_rh_no(mat4s proj, float fovy)
*/
#ifndef cglms_persp_rh_no_h
#define cglms_persp_rh_no_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up perspective peprojection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_frustum_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ) {
mat4s dest;
glm_frustum_rh_no(left, right, bottom, top, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief set up perspective projection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_perspective_rh_no(float fovy, float aspect, float nearZ, float farZ) {
mat4s dest;
glm_perspective_rh_no(fovy, aspect, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief extend perspective projection matrix's far distance
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
* like glms_persp_move_far_rh_no(prooj.raw, deltaFar) to avoid create new mat4
* each time
* s
* this function does not guarantee far >= near, be aware of that!
*
* @param[in, out] proj projection matrix to extend
* @param[in] deltaFar distance from existing far (negative to shink)
*/
CGLM_INLINE
mat4s
glms_persp_move_far_rh_no(mat4s proj, float deltaFar) {
mat4s dest;
dest = proj;
glm_persp_move_far_rh_no(dest.raw, deltaFar);
return dest;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_perspective_default_rh_no(float aspect) {
mat4s dest;
glm_perspective_default_rh_no(aspect, dest.raw);
return dest;
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* reized with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
* like glm_perspective_resize_rh_no(proj.raw, aspect) to avoid create new mat4
* each time
*
* @param[in, out] proj perspective projection matrix
* @param[in] aspect aspect ratio ( width / height )
*/
CGLM_INLINE
mat4s
glms_perspective_resize_rh_no(mat4s proj, float aspect) {
mat4s dest;
dest = proj;
glm_perspective_resize_rh_no(aspect, dest.raw);
return dest;
}
/*!
* @brief decomposes frustum values of perspective projection.
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glms_persp_decomp_rh_no(mat4s proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
glm_persp_decomp_rh_no(proj.raw, nearZ, farZ, top, bottom, left, right);
}
/*!
* @brief decomposes frustum values of perspective projection.
* this makes easy to get all values at once
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] dest array
*/
CGLM_INLINE
void
glms_persp_decompv_rh_no(mat4s proj, float dest[6]) {
glm_persp_decompv_rh_no(proj.raw, dest);
}
/*!
* @brief decomposes left and right values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* 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
glms_persp_decomp_x_rh_no(mat4s proj,
float * __restrict left,
float * __restrict right) {
glm_persp_decomp_x_rh_no(proj.raw, left, right);
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* 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
glms_persp_decomp_y_rh_no(mat4s proj,
float * __restrict top,
float * __restrict bottom) {
glm_persp_decomp_y_rh_no(proj.raw, top, bottom);
}
/*!
* @brief decomposes near and far values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glms_persp_decomp_z_rh_no(mat4s proj,
float * __restrict nearZ,
float * __restrict farZ) {
glm_persp_decomp_z_rh_no(proj.raw, nearZ, farZ);
}
/*!
* @brief decomposes far value of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glms_persp_decomp_far_rh_no(mat4s proj, float * __restrict farZ) {
glm_persp_decomp_far_rh_no(proj.raw, farZ);
}
/*!
* @brief decomposes near value of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glms_persp_decomp_near_rh_no(mat4s proj, float * __restrict nearZ) {
glm_persp_decomp_near_rh_no(proj.raw, nearZ);
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glms_persp_fovy_rh_no(mat4s proj) {
return glm_persp_fovy_rh_no(proj.raw);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glms_persp_aspect_rh_no(mat4s proj) {
return glm_persp_aspect_rh_no(proj.raw);
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @returns sizes as vector, sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
vec4s
glms_persp_sizes_rh_no(mat4s proj, float fovy) {
vec4s dest;
glm_persp_sizes_rh_no(proj.raw, fovy, dest.raw);
return dest;
}
#endif /* cglms_persp_rh_no_h */

View File

@@ -0,0 +1,311 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_frustum_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ)
CGLM_INLINE mat4s glms_perspective_rh_zo(float fovy,
float aspect,
float nearZ,
float farZ)
CGLM_INLINE void glms_persp_move_far_rh_zo(mat4s proj, float deltaFar)
CGLM_INLINE mat4s glms_perspective_default_rh_zo(float aspect)
CGLM_INLINE void glms_perspective_resize_rh_zo(mat4s proj, float aspect)
CGLM_INLINE void glms_persp_decomp_rh_zo(mat4s proj,
float *nearv, float *farv,
float *top, float *bottom,
float *left, float *right)
CGLM_INLINE void glms_persp_decompv_rh_zo(mat4s proj, float dest[6])
CGLM_INLINE void glms_persp_decomp_x_rh_zo(mat4s proj, float *left, float *right)
CGLM_INLINE void glms_persp_decomp_y_rh_zo(mat4s proj, float *top, float *bottom)
CGLM_INLINE void glms_persp_decomp_z_rh_zo(mat4s proj, float *nearv, float *farv)
CGLM_INLINE void glms_persp_decomp_far_rh_zo(mat4s proj, float *farZ)
CGLM_INLINE void glms_persp_decomp_near_rh_zo(mat4s proj, float *nearZ)
CGLM_INLINE float glms_persp_fovy_rh_zo(mat4s proj)
CGLM_INLINE float glms_persp_aspect_rh_zo(mat4s proj)
CGLM_INLINE vec4s glms_persp_sizes_rh_zo(mat4s proj, float fovy)
*/
#ifndef cglms_persp_rh_zo_h
#define cglms_persp_rh_zo_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up perspective peprojection matrix
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_frustum_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ) {
mat4s dest;
glm_frustum_rh_zo(left, right, bottom, top, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief set up perspective projection matrix
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_perspective_rh_zo(float fovy, float aspect, float nearZ, float farZ) {
mat4s dest;
glm_perspective_rh_zo(fovy, aspect, nearZ, farZ, dest.raw);
return dest;
}
/*!
* @brief extend perspective projection matrix's far distance
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
* like glms_persp_move_far_rh_zo(prooj.raw, deltaFar) to avoid create new mat4
* each time
*
* this function does not guarantee far >= near, be aware of that!
*
* @param[in, out] proj projection matrix to extend
* @param[in] deltaFar distance from existing far (negative to shink)
*/
CGLM_INLINE
mat4s
glms_persp_move_far_rh_zo(mat4s proj, float deltaFar) {
mat4s dest;
dest = proj;
glm_persp_move_far_rh_zo(dest.raw, deltaFar);
return dest;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_perspective_default_rh_zo(float aspect) {
mat4s dest;
glm_perspective_default_rh_zo(aspect, dest.raw);
return dest;
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* reized with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
* like glm_perspective_resize_rh_zo(proj.raw, aspect) to avoid create new mat4
* each time
*
* @param[in, out] proj perspective projection matrix
* @param[in] aspect aspect ratio ( width / height )
*/
CGLM_INLINE
mat4s
glms_perspective_resize_rh_zo(mat4s proj, float aspect) {
mat4s dest;
dest = proj;
glm_perspective_resize_rh_zo(aspect, dest.raw);
return dest;
}
/*!
* @brief decomposes frustum values of perspective projection.
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glms_persp_decomp_rh_zo(mat4s proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
glm_persp_decomp_rh_zo(proj.raw, nearZ, farZ, top, bottom, left, right);
}
/*!
* @brief decomposes frustum values of perspective projection.
* this makes easy to get all values at once
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] dest array
*/
CGLM_INLINE
void
glms_persp_decompv_rh_zo(mat4s proj, float dest[6]) {
glm_persp_decompv_rh_zo(proj.raw, dest);
}
/*!
* @brief decomposes left and right values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [0, 1].
* 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
glms_persp_decomp_x_rh_zo(mat4s proj,
float * __restrict left,
float * __restrict right) {
glm_persp_decomp_x_rh_zo(proj.raw, left, right);
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [0, 1].
* 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
glms_persp_decomp_y_rh_zo(mat4s proj,
float * __restrict top,
float * __restrict bottom) {
glm_persp_decomp_y_rh_zo(proj.raw, top, bottom);
}
/*!
* @brief decomposes near and far values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [0, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glms_persp_decomp_z_rh_zo(mat4s proj,
float * __restrict nearZ,
float * __restrict farZ) {
glm_persp_decomp_z_rh_zo(proj.raw, nearZ, farZ);
}
/*!
* @brief decomposes far value of perspective projection
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glms_persp_decomp_far_rh_zo(mat4s proj, float * __restrict farZ) {
glm_persp_decomp_far_rh_zo(proj.raw, farZ);
}
/*!
* @brief decomposes near value of perspective projection
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glms_persp_decomp_near_rh_zo(mat4s proj, float * __restrict nearZ) {
glm_persp_decomp_near_rh_zo(proj.raw, nearZ);
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glms_persp_fovy_rh_zo(mat4s proj) {
return glm_persp_fovy_rh_zo(proj.raw);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glms_persp_aspect_rh_zo(mat4s proj) {
return glm_persp_aspect_rh_zo(proj.raw);
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @returns sizes as vector, sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
vec4s
glms_persp_sizes_rh_zo(mat4s proj, float fovy) {
vec4s dest;
glm_persp_sizes_rh_zo(proj.raw, fovy, dest.raw);
return dest;
}
#endif /* cglms_persp_rh_zo_h */

View File

@@ -0,0 +1,88 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_lookat_lh_no(vec3s eye, vec3s center, vec3s up)
CGLM_INLINE mat4s glms_look_lh_no(vec3s eye, vec3s dir, vec3s up)
CGLM_INLINE mat4s glms_look_anyup_lh_no(vec3s eye, vec3s dir)
*/
#ifndef cglms_view_lh_no_h
#define cglms_view_lh_no_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up view matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] center center vector
* @param[in] up up vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_lookat_lh_no(vec3s eye, vec3s center, vec3s up) {
mat4s dest;
glm_lookat_lh_no(eye.raw, center.raw, up.raw, dest.raw);
return dest;
}
/*!
* @brief set up view matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_look_lh_no(vec3s eye, vec3s dir, vec3s up) {
mat4s dest;
glm_look_lh_no(eye.raw, dir.raw, up.raw, dest.raw);
return dest;
}
/*!
* @brief set up view matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* convenient wrapper for look: if you only have direction and if you don't
* care what UP vector is then this might be useful to create view matrix
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_look_anyup_lh_no(vec3s eye, vec3s dir) {
mat4s dest;
glm_look_anyup_lh_no(eye.raw, dir.raw, dest.raw);
return dest;
}
#endif /* cglms_view_lh_no_h */

View File

@@ -0,0 +1,88 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_lookat_lh_zo(vec3s eye, vec3s center, vec3s up)
CGLM_INLINE mat4s glms_look_lh_zo(vec3s eye, vec3s dir, vec3s up)
CGLM_INLINE mat4s glms_look_anyup_lh_zo(vec3s eye, vec3s dir)
*/
#ifndef cglms_view_lh_zo_h
#define cglms_view_lh_zo_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up view matrix
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] center center vector
* @param[in] up up vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_lookat_lh_zo(vec3s eye, vec3s center, vec3s up) {
mat4s dest;
glm_lookat_lh_zo(eye.raw, center.raw, up.raw, dest.raw);
return dest;
}
/*!
* @brief set up view matrix
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_look_lh_zo(vec3s eye, vec3s dir, vec3s up) {
mat4s dest;
glm_look_lh_zo(eye.raw, dir.raw, up.raw, dest.raw);
return dest;
}
/*!
* @brief set up view matrix
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* convenient wrapper for look: if you only have direction and if you don't
* care what UP vector is then this might be useful to create view matrix
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_look_anyup_lh_zo(vec3s eye, vec3s dir) {
mat4s dest;
glm_look_anyup_lh_zo(eye.raw, dir.raw, dest.raw);
return dest;
}
#endif /* cglms_view_lh_zo_h */

View File

@@ -0,0 +1,88 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_lookat_rh_no(vec3s eye, vec3s center, vec3s up)
CGLM_INLINE mat4s glms_look_rh_no(vec3s eye, vec3s dir, vec3s up)
CGLM_INLINE mat4s glms_look_anyup_rh_no(vec3s eye, vec3s dir)
*/
#ifndef cglms_view_rh_no_h
#define cglms_view_rh_no_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up view matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] center center vector
* @param[in] up up vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_lookat_rh_no(vec3s eye, vec3s center, vec3s up) {
mat4s dest;
glm_lookat_rh_no(eye.raw, center.raw, up.raw, dest.raw);
return dest;
}
/*!
* @brief set up view matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_look_rh_no(vec3s eye, vec3s dir, vec3s up) {
mat4s dest;
glm_look_rh_no(eye.raw, dir.raw, up.raw, dest.raw);
return dest;
}
/*!
* @brief set up view matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* convenient wrapper for look: if you only have direction and if you don't
* care what UP vector is then this might be useful to create view matrix
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_look_anyup_rh_no(vec3s eye, vec3s dir) {
mat4s dest;
glm_look_anyup_rh_no(eye.raw, dir.raw, dest.raw);
return dest;
}
#endif /* cglms_view_rh_no_h */

View File

@@ -0,0 +1,88 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), htt../opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE mat4s glms_lookat_rh_zo(vec3s eye, vec3s center, vec3s up)
CGLM_INLINE mat4s glms_look_rh_zo(vec3s eye, vec3s dir, vec3s up)
CGLM_INLINE mat4s glms_look_anyup_rh_zo(vec3s eye, vec3s dir)
*/
#ifndef cglms_view_rh_zo_h
#define cglms_view_rh_zo_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief set up view matrix
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] center center vector
* @param[in] up up vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_lookat_rh_zo(vec3s eye, vec3s center, vec3s up) {
mat4s dest;
glm_lookat_rh_zo(eye.raw, center.raw, up.raw, dest.raw);
return dest;
}
/*!
* @brief set up view matrix
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_look_rh_zo(vec3s eye, vec3s dir, vec3s up) {
mat4s dest;
glm_look_rh_zo(eye.raw, dir.raw, up.raw, dest.raw);
return dest;
}
/*!
* @brief set up view matrix
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* convenient wrapper for look: if you only have direction and if you don't
* care what UP vector is then this might be useful to create view matrix
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @returns result matrix
*/
CGLM_INLINE
mat4s
glms_look_anyup_rh_zo(vec3s eye, vec3s dir) {
mat4s dest;
glm_look_anyup_rh_zo(eye.raw, dir.raw, dest.raw);
return dest;
}
#endif /* cglms_view_rh_zo_h */

View File

@@ -48,14 +48,28 @@ cglm_src = files(
'src/sphere.c', 'src/sphere.c',
'src/vec2.c', 'src/vec2.c',
'src/vec3.c', 'src/vec3.c',
'src/vec4.c' 'src/vec4.c',
'src/clipspace/ortho_lh_no.c',
'src/clipspace/ortho_lh_zo.c',
'src/clipspace/ortho_rh_no.c',
'src/clipspace/ortho_rh_zo.c',
'src/clipspace/persp_lh_no.c',
'src/clipspace/persp_lh_zo.c',
'src/clipspace/persp_rh_no.c',
'src/clipspace/persp_rh_zo.c',
'src/clipspace/view_lh_no.c',
'src/clipspace/view_lh_zo.c',
'src/clipspace/view_rh_no.c',
'src/clipspace/view_rh_zo.c',
) )
cglm_lib = library('cglm', cglm_lib = library('cglm',
cglm_src, cglm_src,
install : cglm_install, install : cglm_install,
dependencies : cglm_deps, dependencies : cglm_deps,
c_args : [ build_args, cglm_args ] c_args : [ build_args, cglm_args ],
version : meson.project_version(),
soversion : '0'
) )
cglm_dep = declare_dependency( cglm_dep = declare_dependency(
@@ -88,13 +102,17 @@ if get_option('build_tests') == true
test_src = files( test_src = files(
'test/runner.c', 'test/runner.c',
'test/src/test_euler.c',
'test/src/test_bezier.c', 'test/src/test_bezier.c',
'test/src/test_cam.c', 'test/src/test_cam.c',
'test/src/test_struct.c', 'test/src/test_cam_lh_no.c',
'test/src/test_cam_lh_zo.c',
'test/src/test_cam_rh_no.c',
'test/src/test_cam_rh_zo.c',
'test/src/test_clamp.c', 'test/src/test_clamp.c',
'test/src/test_common.c', 'test/src/test_common.c',
'test/src/tests.c' 'test/src/test_euler.c',
'test/src/tests.c',
'test/src/test_struct.c',
) )
test_exe = executable('tests', test_exe = executable('tests',

View File

@@ -10,38 +10,20 @@
CGLM_EXPORT CGLM_EXPORT
void void
glmc_frustum(float left, glmc_frustum(float left, float right,
float right, float bottom, float top,
float bottom, float nearZ, float farZ,
float top,
float nearVal,
float farVal,
mat4 dest) { mat4 dest) {
glm_frustum(left, glm_frustum(left, right, bottom, top, nearZ, farZ, dest);
right,
bottom,
top,
nearVal,
farVal,
dest);
} }
CGLM_EXPORT CGLM_EXPORT
void void
glmc_ortho(float left, glmc_ortho(float left, float right,
float right, float bottom, float top,
float bottom, float nearZ, float farZ,
float top,
float nearVal,
float farVal,
mat4 dest) { mat4 dest) {
glm_ortho(left, glm_ortho(left, right, bottom, top, nearZ, farZ, dest);
right,
bottom,
top,
nearVal,
farVal,
dest);
} }
CGLM_EXPORT CGLM_EXPORT
@@ -76,16 +58,8 @@ glmc_ortho_default_s(float aspect, float size, mat4 dest) {
CGLM_EXPORT CGLM_EXPORT
void void
glmc_perspective(float fovy, glmc_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest) {
float aspect, glm_perspective(fovy, aspect, nearZ, farZ, dest);
float nearVal,
float farVal,
mat4 dest) {
glm_perspective(fovy,
aspect,
nearVal,
farVal,
dest);
} }
CGLM_EXPORT CGLM_EXPORT
@@ -108,10 +82,7 @@ glmc_perspective_resize(float aspect, mat4 proj) {
CGLM_EXPORT CGLM_EXPORT
void void
glmc_lookat(vec3 eye, glmc_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) {
vec3 center,
vec3 up,
mat4 dest) {
glm_lookat(eye, center, up, dest); glm_lookat(eye, center, up, dest);
} }
@@ -130,13 +101,13 @@ glmc_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
CGLM_EXPORT CGLM_EXPORT
void void
glmc_persp_decomp(mat4 proj, glmc_persp_decomp(mat4 proj,
float * __restrict nearVal, float * __restrict nearZ,
float * __restrict farVal, float * __restrict farZ,
float * __restrict top, float * __restrict top,
float * __restrict bottom, float * __restrict bottom,
float * __restrict left, float * __restrict left,
float * __restrict right) { float * __restrict right) {
glm_persp_decomp(proj, nearVal, farVal, top, bottom, left, right); glm_persp_decomp(proj, nearZ, farZ, top, bottom, left, right);
} }
CGLM_EXPORT CGLM_EXPORT
@@ -164,21 +135,21 @@ glmc_persp_decomp_y(mat4 proj,
CGLM_EXPORT CGLM_EXPORT
void void
glmc_persp_decomp_z(mat4 proj, glmc_persp_decomp_z(mat4 proj,
float * __restrict nearVal, float * __restrict nearZ,
float * __restrict farVal) { float * __restrict farZ) {
glm_persp_decomp_z(proj, nearVal, farVal); glm_persp_decomp_z(proj, nearZ, farZ);
} }
CGLM_EXPORT CGLM_EXPORT
void void
glmc_persp_decomp_far(mat4 proj, float * __restrict farVal) { glmc_persp_decomp_far(mat4 proj, float * __restrict farZ) {
glm_persp_decomp_far(proj, farVal); glm_persp_decomp_far(proj, farZ);
} }
CGLM_EXPORT CGLM_EXPORT
void void
glmc_persp_decomp_near(mat4 proj, float * __restrict nearVal) { glmc_persp_decomp_near(mat4 proj, float * __restrict nearZ) {
glm_persp_decomp_near(proj, nearVal); glm_persp_decomp_near(proj, nearZ);
} }
CGLM_EXPORT CGLM_EXPORT

View File

@@ -0,0 +1,51 @@
/*
* 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/clipspace/ortho_lh_no.h"
CGLM_EXPORT
void
glmc_ortho_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
glm_ortho_lh_no(left, right,
bottom, top,
nearZ, farZ,
dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_lh_no(vec3 box[2], mat4 dest) {
glm_ortho_aabb_lh_no(box, dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_p_lh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_aabb_p_lh_no(box, padding, dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_pz_lh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_aabb_pz_lh_no(box, padding, dest);
}
CGLM_EXPORT
void
glmc_ortho_default_lh_no(float aspect, mat4 dest) {
glm_ortho_default_lh_no(aspect, dest);
}
CGLM_EXPORT
void
glmc_ortho_default_s_lh_no(float aspect, float size, mat4 dest) {
glm_ortho_default_s_lh_no(aspect, size, dest);
}

View File

@@ -0,0 +1,51 @@
/*
* 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/clipspace/ortho_lh_zo.h"
CGLM_EXPORT
void
glmc_ortho_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
glm_ortho_lh_zo(left, right,
bottom, top,
nearZ, farZ,
dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_lh_zo(vec3 box[2], mat4 dest) {
glm_ortho_aabb_lh_zo(box, dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_p_lh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_aabb_p_lh_zo(box, padding, dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_pz_lh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_aabb_pz_lh_zo(box, padding, dest);
}
CGLM_EXPORT
void
glmc_ortho_default_lh_zo(float aspect, mat4 dest) {
glm_ortho_default_lh_zo(aspect, dest);
}
CGLM_EXPORT
void
glmc_ortho_default_s_lh_zo(float aspect, float size, mat4 dest) {
glm_ortho_default_s_lh_zo(aspect, size, dest);
}

View File

@@ -0,0 +1,51 @@
/*
* 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/clipspace/ortho_rh_no.h"
CGLM_EXPORT
void
glmc_ortho_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
glm_ortho_rh_no(left, right,
bottom, top,
nearZ, farZ,
dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_rh_no(vec3 box[2], mat4 dest) {
glm_ortho_aabb_rh_no(box, dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_p_rh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_aabb_p_rh_no(box, padding, dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_pz_rh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_aabb_pz_rh_no(box, padding, dest);
}
CGLM_EXPORT
void
glmc_ortho_default_rh_no(float aspect, mat4 dest) {
glm_ortho_default_rh_no(aspect, dest);
}
CGLM_EXPORT
void
glmc_ortho_default_s_rh_no(float aspect, float size, mat4 dest) {
glm_ortho_default_s_rh_no(aspect, size, dest);
}

View File

@@ -0,0 +1,51 @@
/*
* 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/clipspace/ortho_rh_zo.h"
CGLM_EXPORT
void
glmc_ortho_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
glm_ortho_rh_zo(left, right,
bottom, top,
nearZ, farZ,
dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_rh_zo(vec3 box[2], mat4 dest) {
glm_ortho_aabb_rh_zo(box, dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_p_rh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_aabb_p_rh_zo(box, padding, dest);
}
CGLM_EXPORT
void
glmc_ortho_aabb_pz_rh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_aabb_pz_rh_zo(box, padding, dest);
}
CGLM_EXPORT
void
glmc_ortho_default_rh_zo(float aspect, mat4 dest) {
glm_ortho_default_rh_zo(aspect, dest);
}
CGLM_EXPORT
void
glmc_ortho_default_s_rh_zo(float aspect, float size, mat4 dest) {
glm_ortho_default_s_rh_zo(aspect, size, dest);
}

109
src/clipspace/persp_lh_no.c Normal file
View File

@@ -0,0 +1,109 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "../../include/cglm/clipspace/persp_lh_no.h"
CGLM_EXPORT
void
glmc_frustum_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
glm_frustum_lh_no(left, right,
bottom, top,
nearZ, farZ,
dest);
}
CGLM_EXPORT
void
glmc_perspective_lh_no(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest) {
glm_perspective_lh_no(fovy,
aspect,
nearVal,
farVal,
dest);
}
CGLM_EXPORT
void
glmc_persp_move_far_lh_no(mat4 proj, float deltaFar) {
glm_persp_move_far_lh_no(proj, deltaFar);
}
CGLM_EXPORT
void
glmc_persp_decomp_lh_no(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
glm_persp_decomp_lh_no(proj, nearZ, farZ, top, bottom, left, right);
}
CGLM_EXPORT
void
glmc_persp_decompv_lh_no(mat4 proj, float dest[6]) {
glm_persp_decompv_lh_no(proj, dest);
}
CGLM_EXPORT
void
glmc_persp_decomp_x_lh_no(mat4 proj,
float * __restrict left,
float * __restrict right) {
glm_persp_decomp_x_lh_no(proj, left, right);
}
CGLM_EXPORT
void
glmc_persp_decomp_y_lh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
glm_persp_decomp_y_lh_no(proj, top, bottom);
}
CGLM_EXPORT
void
glmc_persp_decomp_z_lh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
glm_persp_decomp_z_lh_no(proj, nearZ, farZ);
}
CGLM_EXPORT
void
glmc_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ) {
glm_persp_decomp_far_lh_no(proj, farZ);
}
CGLM_EXPORT
void
glmc_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ) {
glm_persp_decomp_near_lh_no(proj, nearZ);
}
CGLM_EXPORT
void
glmc_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest) {
glm_persp_sizes_lh_no(proj, fovy, dest);
}
CGLM_EXPORT
float
glmc_persp_fovy_lh_no(mat4 proj) {
return glm_persp_fovy_lh_no(proj);
}
CGLM_EXPORT
float
glmc_persp_aspect_lh_no(mat4 proj) {
return glm_persp_aspect_lh_no(proj);
}

109
src/clipspace/persp_lh_zo.c Normal file
View File

@@ -0,0 +1,109 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "../../include/cglm/clipspace/persp_lh_zo.h"
CGLM_EXPORT
void
glmc_frustum_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
glm_frustum_lh_zo(left, right,
bottom, top,
nearZ, farZ,
dest);
}
CGLM_EXPORT
void
glmc_perspective_lh_zo(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest) {
glm_perspective_lh_zo(fovy,
aspect,
nearVal,
farVal,
dest);
}
CGLM_EXPORT
void
glmc_persp_move_far_lh_zo(mat4 proj, float deltaFar) {
glm_persp_move_far_lh_zo(proj, deltaFar);
}
CGLM_EXPORT
void
glmc_persp_decomp_lh_zo(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
glm_persp_decomp_lh_zo(proj, nearZ, farZ, top, bottom, left, right);
}
CGLM_EXPORT
void
glmc_persp_decompv_lh_zo(mat4 proj, float dest[6]) {
glm_persp_decompv_lh_zo(proj, dest);
}
CGLM_EXPORT
void
glmc_persp_decomp_x_lh_zo(mat4 proj,
float * __restrict left,
float * __restrict right) {
glm_persp_decomp_x_lh_zo(proj, left, right);
}
CGLM_EXPORT
void
glmc_persp_decomp_y_lh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
glm_persp_decomp_y_lh_zo(proj, top, bottom);
}
CGLM_EXPORT
void
glmc_persp_decomp_z_lh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
glm_persp_decomp_z_lh_zo(proj, nearZ, farZ);
}
CGLM_EXPORT
void
glmc_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ) {
glm_persp_decomp_far_lh_zo(proj, farZ);
}
CGLM_EXPORT
void
glmc_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ) {
glm_persp_decomp_near_lh_zo(proj, nearZ);
}
CGLM_EXPORT
void
glmc_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest) {
glm_persp_sizes_lh_zo(proj, fovy, dest);
}
CGLM_EXPORT
float
glmc_persp_fovy_lh_zo(mat4 proj) {
return glm_persp_fovy_lh_zo(proj);
}
CGLM_EXPORT
float
glmc_persp_aspect_lh_zo(mat4 proj) {
return glm_persp_aspect_lh_zo(proj);
}

109
src/clipspace/persp_rh_no.c Normal file
View File

@@ -0,0 +1,109 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "../../include/cglm/clipspace/persp_rh_no.h"
CGLM_EXPORT
void
glmc_frustum_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
glm_frustum_rh_no(left, right,
bottom, top,
nearZ, farZ,
dest);
}
CGLM_EXPORT
void
glmc_perspective_rh_no(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest) {
glm_perspective_rh_no(fovy,
aspect,
nearVal,
farVal,
dest);
}
CGLM_EXPORT
void
glmc_persp_move_far_rh_no(mat4 proj, float deltaFar) {
glm_persp_move_far_rh_no(proj, deltaFar);
}
CGLM_EXPORT
void
glmc_persp_decomp_rh_no(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
glm_persp_decomp_rh_no(proj, nearZ, farZ, top, bottom, left, right);
}
CGLM_EXPORT
void
glmc_persp_decompv_rh_no(mat4 proj, float dest[6]) {
glm_persp_decompv_rh_no(proj, dest);
}
CGLM_EXPORT
void
glmc_persp_decomp_x_rh_no(mat4 proj,
float * __restrict left,
float * __restrict right) {
glm_persp_decomp_x_rh_no(proj, left, right);
}
CGLM_EXPORT
void
glmc_persp_decomp_y_rh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
glm_persp_decomp_y_rh_no(proj, top, bottom);
}
CGLM_EXPORT
void
glmc_persp_decomp_z_rh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
glm_persp_decomp_z_rh_no(proj, nearZ, farZ);
}
CGLM_EXPORT
void
glmc_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ) {
glm_persp_decomp_far_rh_no(proj, farZ);
}
CGLM_EXPORT
void
glmc_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ) {
glm_persp_decomp_near_rh_no(proj, nearZ);
}
CGLM_EXPORT
void
glmc_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest) {
glm_persp_sizes_rh_no(proj, fovy, dest);
}
CGLM_EXPORT
float
glmc_persp_fovy_rh_no(mat4 proj) {
return glm_persp_fovy_rh_no(proj);
}
CGLM_EXPORT
float
glmc_persp_aspect_rh_no(mat4 proj) {
return glm_persp_aspect_rh_no(proj);
}

109
src/clipspace/persp_rh_zo.c Normal file
View File

@@ -0,0 +1,109 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "../../include/cglm/clipspace/persp_rh_zo.h"
CGLM_EXPORT
void
glmc_frustum_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
glm_frustum_rh_zo(left, right,
bottom, top,
nearZ, farZ,
dest);
}
CGLM_EXPORT
void
glmc_perspective_rh_zo(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest) {
glm_perspective_rh_zo(fovy,
aspect,
nearVal,
farVal,
dest);
}
CGLM_EXPORT
void
glmc_persp_move_far_rh_zo(mat4 proj, float deltaFar) {
glm_persp_move_far_rh_zo(proj, deltaFar);
}
CGLM_EXPORT
void
glmc_persp_decomp_rh_zo(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
glm_persp_decomp_rh_zo(proj, nearZ, farZ, top, bottom, left, right);
}
CGLM_EXPORT
void
glmc_persp_decompv_rh_zo(mat4 proj, float dest[6]) {
glm_persp_decompv_rh_zo(proj, dest);
}
CGLM_EXPORT
void
glmc_persp_decomp_x_rh_zo(mat4 proj,
float * __restrict left,
float * __restrict right) {
glm_persp_decomp_x_rh_zo(proj, left, right);
}
CGLM_EXPORT
void
glmc_persp_decomp_y_rh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
glm_persp_decomp_y_rh_zo(proj, top, bottom);
}
CGLM_EXPORT
void
glmc_persp_decomp_z_rh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
glm_persp_decomp_z_rh_zo(proj, nearZ, farZ);
}
CGLM_EXPORT
void
glmc_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ) {
glm_persp_decomp_far_rh_zo(proj, farZ);
}
CGLM_EXPORT
void
glmc_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ) {
glm_persp_decomp_near_rh_zo(proj, nearZ);
}
CGLM_EXPORT
void
glmc_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest) {
glm_persp_sizes_rh_zo(proj, fovy, dest);
}
CGLM_EXPORT
float
glmc_persp_fovy_rh_zo(mat4 proj) {
return glm_persp_fovy_rh_zo(proj);
}
CGLM_EXPORT
float
glmc_persp_aspect_rh_zo(mat4 proj) {
return glm_persp_aspect_rh_zo(proj);
}

View File

@@ -0,0 +1,27 @@
/*
* 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/clipspace/view_lh_no.h"
CGLM_EXPORT
void
glmc_lookat_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest) {
glm_lookat_lh_no(eye, center, up, dest);
}
CGLM_EXPORT
void
glmc_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
glm_look_lh_no(eye, dir, up, dest);
}
CGLM_EXPORT
void
glmc_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest) {
glm_look_anyup_lh_no(eye, dir, dest);
}

View File

@@ -0,0 +1,27 @@
/*
* 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/clipspace/view_lh_zo.h"
CGLM_EXPORT
void
glmc_lookat_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest) {
glm_lookat_lh_zo(eye, center, up, dest);
}
CGLM_EXPORT
void
glmc_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
glm_look_lh_zo(eye, dir, up, dest);
}
CGLM_EXPORT
void
glmc_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest) {
glm_look_anyup_lh_zo(eye, dir, dest);
}

View File

@@ -0,0 +1,27 @@
/*
* 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/clipspace/view_rh_no.h"
CGLM_EXPORT
void
glmc_lookat_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest) {
glm_lookat_rh_no(eye, center, up, dest);
}
CGLM_EXPORT
void
glmc_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
glm_look_rh_no(eye, dir, up, dest);
}
CGLM_EXPORT
void
glmc_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest) {
glm_look_anyup_rh_no(eye, dir, dest);
}

View File

@@ -0,0 +1,27 @@
/*
* 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/clipspace/view_rh_zo.h"
CGLM_EXPORT
void
glmc_lookat_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest) {
glm_lookat_rh_zo(eye, center, up, dest);
}
CGLM_EXPORT
void
glmc_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
glm_look_rh_zo(eye, dir, up, dest);
}
CGLM_EXPORT
void
glmc_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest) {
glm_look_anyup_rh_zo(eye, dir, dest);
}

View File

@@ -6,6 +6,10 @@ set(TESTFILES
src/test_euler.c src/test_euler.c
src/test_bezier.c src/test_bezier.c
src/test_cam.c src/test_cam.c
src/test_cam_lh_zo.c
src/test_cam_rh_zo.c
src/test_cam_lh_no.c
src/test_cam_rh_no.c
src/test_struct.c src/test_struct.c
src/test_clamp.c src/test_clamp.c
src/test_common.c src/test_common.c

View File

@@ -20,6 +20,10 @@
# define _GNU_SOURCE /* for drand48() */ # define _GNU_SOURCE /* for drand48() */
#endif #endif
#ifndef CGLM_CLIPSPACE_INCLUDE_ALL
# define CGLM_CLIPSPACE_INCLUDE_ALL
#endif
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>

View File

@@ -27,14 +27,14 @@ TEST_IMPL(camera_lookat) {
TEST_IMPL(camera_decomp) { TEST_IMPL(camera_decomp) {
mat4 proj, proj2; mat4 proj, proj2;
vec4 sizes; vec4 sizes;
float aspect, fovy, nearVal, farVal; float aspect, fovy, nearZ, farZ;
aspect = 0.782f; aspect = 0.782f;
fovy = glm_rad(49.984f); fovy = glm_rad(49.984f);
nearVal = 0.1f; nearZ = 0.1f;
farVal = 100.0f; farZ = 100.0f;
glm_perspective(fovy, aspect, nearVal, farVal, proj); glm_perspective(fovy, aspect, nearZ, farZ, proj);
ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < GLM_FLT_EPSILON) ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < GLM_FLT_EPSILON)
ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < GLM_FLT_EPSILON) ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < GLM_FLT_EPSILON)
ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < GLM_FLT_EPSILON) ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < GLM_FLT_EPSILON)
@@ -45,8 +45,8 @@ TEST_IMPL(camera_decomp) {
sizes[0] * 0.5f, sizes[0] * 0.5f,
-sizes[1] * 0.5f, -sizes[1] * 0.5f,
sizes[1] * 0.5f, sizes[1] * 0.5f,
nearVal, nearZ,
farVal, farZ,
proj2); proj2);
ASSERTIFY(test_assert_mat4_eq(proj, proj2)) ASSERTIFY(test_assert_mat4_eq(proj, proj2))

36
test/src/test_cam_lh_no.c Normal file
View File

@@ -0,0 +1,36 @@
/*
* 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"
TEST_IMPL(perspective_lh_no) {
mat4 dst;
const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f;
const float zNearVal = 0.1f;
const float zFarVal = 100.0f;
glm_perspective_lh_no(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect)))
ASSERT(test_eq(dst[1][1], 1.0f / tanf(fovy / 2)))
ASSERT(test_eq(dst[2][2], (zFarVal + zNearVal) / (zFarVal - zNearVal)))
ASSERT(test_eq(dst[2][3], 1.0f))
ASSERT(test_eq(dst[3][2], -2 * zFarVal * zNearVal / (zFarVal - zNearVal)))
/* Sanity mk. II */
/*reference test data for glm_perspective_lh_no*/
mat4 cmp = {0};
cmp[0][0] = 1.8106601f;
cmp[1][1] = 2.4142134f;
cmp[2][2] = 1.0020020f;
cmp[2][3] = 1.0000000f;
cmp[3][2] = -0.2002002f;
return test_assert_mat4_eq(dst, cmp);
}

36
test/src/test_cam_lh_zo.c Normal file
View File

@@ -0,0 +1,36 @@
/*
* 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"
TEST_IMPL(perspective_lh_zo) {
mat4 dst;
const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f;
const float zNearVal = 0.1f;
const float zFarVal = 100.0f;
glm_perspective_lh_zo(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect)))
ASSERT(test_eq(dst[1][1], 1.0f / tanf(fovy / 2)))
ASSERT(test_eq(dst[2][2], zFarVal / (zFarVal - zNearVal)))
ASSERT(test_eq(dst[2][3], 1.0f))
ASSERT(test_eq(dst[3][2], -1 * zFarVal * zNearVal / (zFarVal - zNearVal)))
/* Sanity mk. II */
/* "Reference values" generated by GLM's glm::perspectiveLH_ZO */
mat4 cmp = {0};
cmp[0][0] = 1.8106601f;
cmp[1][1] = 2.4142134f;
cmp[2][2] = 1.0010010f;
cmp[2][3] = 1.0000000f;
cmp[3][2] = -0.1001001f;
return test_assert_mat4_eq(dst, cmp);
}

36
test/src/test_cam_rh_no.c Normal file
View File

@@ -0,0 +1,36 @@
/*
* 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"
TEST_IMPL(perspective_rh_no) {
mat4 dst;
const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f;
const float zNearVal = 0.1f;
const float zFarVal = 100.0f;
glm_perspective_rh_no(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect)))
ASSERT(test_eq(dst[1][1], 1.0f / tanf(fovy / 2)))
ASSERT(test_eq(dst[2][2], -1.0f * (zFarVal + zNearVal) / (zFarVal - zNearVal)))
ASSERT(test_eq(dst[2][3], -1.0f))
ASSERT(test_eq(dst[3][2], -2 * zFarVal * zNearVal / (zFarVal - zNearVal)))
/* Sanity mk. II */
/*reference test data for glm_perspective_rh_no*/
mat4 cmp = {0};
cmp[0][0] = 1.8106601f;
cmp[1][1] = 2.4142134f;
cmp[2][2] = -1.0020020f;
cmp[2][3] = -1.0000000f;
cmp[3][2] = -0.2002002f;
return test_assert_mat4_eq(dst, cmp);
}

36
test/src/test_cam_rh_zo.c Normal file
View File

@@ -0,0 +1,36 @@
/*
* 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"
TEST_IMPL(perspective_rh_zo) {
mat4 dst;
const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f;
const float zNearVal = 0.1f;
const float zFarVal = 100.0f;
glm_perspective_rh_zo(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1 / (tanf(fovy / 2) * aspect)))
ASSERT(test_eq(dst[1][1], 1 / tanf(fovy / 2)))
ASSERT(test_eq(dst[2][2], zFarVal / (zNearVal - zFarVal)))
ASSERT(test_eq(dst[2][3], -1.0f))
ASSERT(test_eq(dst[3][2], -1 * zFarVal * zNearVal / (zFarVal - zNearVal)))
/* Sanity mk. II */
/*reference test data for glm_perspective_rh_zo*/
mat4 cmp = {0};
cmp[0][0] = 1.8106601f;
cmp[1][1] = 2.4142134f;
cmp[2][2] = -1.0010010f;
cmp[2][3] = -1.0000000f;
cmp[3][2] = -0.1001001f;
return test_assert_mat4_eq(dst, cmp);
}

View File

@@ -222,7 +222,11 @@ TEST_DECLARE(glmc_mat2_swap_col)
TEST_DECLARE(glmc_mat2_swap_row) TEST_DECLARE(glmc_mat2_swap_row)
TEST_DECLARE(glmc_mat2_rmc) TEST_DECLARE(glmc_mat2_rmc)
/* camera */ /* camera (incl [LR]H cross [NZ]O) */
TEST_DECLARE(perspective_lh_zo)
TEST_DECLARE(perspective_rh_zo)
TEST_DECLARE(perspective_lh_no)
TEST_DECLARE(perspective_rh_no)
TEST_DECLARE(camera_lookat) TEST_DECLARE(camera_lookat)
TEST_DECLARE(camera_decomp) TEST_DECLARE(camera_decomp)
@@ -946,7 +950,11 @@ TEST_LIST {
TEST_ENTRY(glmc_mat2_swap_row) TEST_ENTRY(glmc_mat2_swap_row)
TEST_ENTRY(glmc_mat2_rmc) TEST_ENTRY(glmc_mat2_rmc)
/* camera */ /* camera (incl [LR]H cross [NZ]O) */
TEST_ENTRY(perspective_lh_zo)
TEST_ENTRY(perspective_rh_zo)
TEST_ENTRY(perspective_lh_no)
TEST_ENTRY(perspective_rh_no)
TEST_ENTRY(camera_lookat) TEST_ENTRY(camera_lookat)
TEST_ENTRY(camera_decomp) TEST_ENTRY(camera_decomp)

View File

@@ -23,6 +23,10 @@
<ClCompile Include="..\test\src\tests.c" /> <ClCompile Include="..\test\src\tests.c" />
<ClCompile Include="..\test\src\test_bezier.c" /> <ClCompile Include="..\test\src\test_bezier.c" />
<ClCompile Include="..\test\src\test_cam.c" /> <ClCompile Include="..\test\src\test_cam.c" />
<ClCompile Include="..\test\src\test_cam_lh_no.c" />
<ClCompile Include="..\test\src\test_cam_lh_zo.c" />
<ClCompile Include="..\test\src\test_cam_rh_no.c" />
<ClCompile Include="..\test\src\test_cam_rh_zo.c" />
<ClCompile Include="..\test\src\test_clamp.c" /> <ClCompile Include="..\test\src\test_clamp.c" />
<ClCompile Include="..\test\src\test_common.c" /> <ClCompile Include="..\test\src\test_common.c" />
<ClCompile Include="..\test\src\test_euler.c" /> <ClCompile Include="..\test\src\test_euler.c" />

View File

@@ -35,6 +35,18 @@
<ClCompile Include="..\test\src\tests.c"> <ClCompile Include="..\test\src\tests.c">
<Filter>src</Filter> <Filter>src</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\test\src\test_cam_lh_no.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\test\src\test_cam_lh_zo.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\test\src\test_cam_rh_no.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\test\src\test_cam_rh_zo.c">
<Filter>src</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\test\tests.h"> <ClInclude Include="..\test\tests.h">

View File

@@ -24,6 +24,18 @@
<ClCompile Include="..\src\bezier.c" /> <ClCompile Include="..\src\bezier.c" />
<ClCompile Include="..\src\box.c" /> <ClCompile Include="..\src\box.c" />
<ClCompile Include="..\src\cam.c" /> <ClCompile Include="..\src\cam.c" />
<ClCompile Include="..\src\clipspace\ortho_lh_no.c" />
<ClCompile Include="..\src\clipspace\ortho_lh_zo.c" />
<ClCompile Include="..\src\clipspace\ortho_rh_no.c" />
<ClCompile Include="..\src\clipspace\ortho_rh_zo.c" />
<ClCompile Include="..\src\clipspace\persp_lh_no.c" />
<ClCompile Include="..\src\clipspace\persp_lh_zo.c" />
<ClCompile Include="..\src\clipspace\persp_rh_no.c" />
<ClCompile Include="..\src\clipspace\persp_rh_zo.c" />
<ClCompile Include="..\src\clipspace\view_lh_no.c" />
<ClCompile Include="..\src\clipspace\view_lh_zo.c" />
<ClCompile Include="..\src\clipspace\view_rh_no.c" />
<ClCompile Include="..\src\clipspace\view_rh_zo.c" />
<ClCompile Include="..\src\curve.c" /> <ClCompile Include="..\src\curve.c" />
<ClCompile Include="..\src\ease.c" /> <ClCompile Include="..\src\ease.c" />
<ClCompile Include="..\src\euler.c" /> <ClCompile Include="..\src\euler.c" />
@@ -54,6 +66,18 @@
<ClInclude Include="..\include\cglm\call\bezier.h" /> <ClInclude Include="..\include\cglm\call\bezier.h" />
<ClInclude Include="..\include\cglm\call\box.h" /> <ClInclude Include="..\include\cglm\call\box.h" />
<ClInclude Include="..\include\cglm\call\cam.h" /> <ClInclude Include="..\include\cglm\call\cam.h" />
<ClInclude Include="..\include\cglm\call\clipspace\ortho_lh_no.h" />
<ClInclude Include="..\include\cglm\call\clipspace\ortho_lh_zo.h" />
<ClInclude Include="..\include\cglm\call\clipspace\ortho_rh_no.h" />
<ClInclude Include="..\include\cglm\call\clipspace\ortho_rh_zo.h" />
<ClInclude Include="..\include\cglm\call\clipspace\persp_lh_no.h" />
<ClInclude Include="..\include\cglm\call\clipspace\persp_lh_zo.h" />
<ClInclude Include="..\include\cglm\call\clipspace\persp_rh_no.h" />
<ClInclude Include="..\include\cglm\call\clipspace\persp_rh_zo.h" />
<ClInclude Include="..\include\cglm\call\clipspace\view_lh_no.h" />
<ClInclude Include="..\include\cglm\call\clipspace\view_lh_zo.h" />
<ClInclude Include="..\include\cglm\call\clipspace\view_rh_no.h" />
<ClInclude Include="..\include\cglm\call\clipspace\view_rh_zo.h" />
<ClInclude Include="..\include\cglm\call\curve.h" /> <ClInclude Include="..\include\cglm\call\curve.h" />
<ClInclude Include="..\include\cglm\call\ease.h" /> <ClInclude Include="..\include\cglm\call\ease.h" />
<ClInclude Include="..\include\cglm\call\euler.h" /> <ClInclude Include="..\include\cglm\call\euler.h" />
@@ -72,6 +96,21 @@
<ClInclude Include="..\include\cglm\call\vec4.h" /> <ClInclude Include="..\include\cglm\call\vec4.h" />
<ClInclude Include="..\include\cglm\cam.h" /> <ClInclude Include="..\include\cglm\cam.h" />
<ClInclude Include="..\include\cglm\cglm.h" /> <ClInclude Include="..\include\cglm\cglm.h" />
<ClInclude Include="..\include\cglm\clipspace\ortho_lh_no.h" />
<ClInclude Include="..\include\cglm\clipspace\ortho_lh_zo.h" />
<ClInclude Include="..\include\cglm\clipspace\ortho_rh_no.h" />
<ClInclude Include="..\include\cglm\clipspace\ortho_rh_zo.h" />
<ClInclude Include="..\include\cglm\clipspace\persp.h" />
<ClInclude Include="..\include\cglm\clipspace\persp_lh_no.h" />
<ClInclude Include="..\include\cglm\clipspace\persp_lh_zo.h" />
<ClInclude Include="..\include\cglm\clipspace\persp_rh_no.h" />
<ClInclude Include="..\include\cglm\clipspace\persp_rh_zo.h" />
<ClInclude Include="..\include\cglm\clipspace\view_lh.h" />
<ClInclude Include="..\include\cglm\clipspace\view_lh_no.h" />
<ClInclude Include="..\include\cglm\clipspace\view_lh_zo.h" />
<ClInclude Include="..\include\cglm\clipspace\view_rh.h" />
<ClInclude Include="..\include\cglm\clipspace\view_rh_no.h" />
<ClInclude Include="..\include\cglm\clipspace\view_rh_zo.h" />
<ClInclude Include="..\include\cglm\color.h" /> <ClInclude Include="..\include\cglm\color.h" />
<ClInclude Include="..\include\cglm\common.h" /> <ClInclude Include="..\include\cglm\common.h" />
<ClInclude Include="..\include\cglm\curve.h" /> <ClInclude Include="..\include\cglm\curve.h" />
@@ -106,6 +145,18 @@
<ClInclude Include="..\include\cglm\struct\affine2d.h" /> <ClInclude Include="..\include\cglm\struct\affine2d.h" />
<ClInclude Include="..\include\cglm\struct\box.h" /> <ClInclude Include="..\include\cglm\struct\box.h" />
<ClInclude Include="..\include\cglm\struct\cam.h" /> <ClInclude Include="..\include\cglm\struct\cam.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\ortho_lh_no.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\ortho_lh_zo.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\ortho_rh_no.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\ortho_rh_zo.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\persp_lh_no.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\persp_lh_zo.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\persp_rh_no.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\persp_rh_zo.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\view_lh_no.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\view_lh_zo.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\view_rh_no.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\view_rh_zo.h" />
<ClInclude Include="..\include\cglm\struct\color.h" /> <ClInclude Include="..\include\cglm\struct\color.h" />
<ClInclude Include="..\include\cglm\struct\curve.h" /> <ClInclude Include="..\include\cglm\struct\curve.h" />
<ClInclude Include="..\include\cglm\struct\euler.h" /> <ClInclude Include="..\include\cglm\struct\euler.h" />

View File

@@ -1,10 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <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="src"> <Filter Include="src">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
@@ -33,6 +29,18 @@
<Filter Include="include\cglm\struct"> <Filter Include="include\cglm\struct">
<UniqueIdentifier>{0b5febe7-a88d-4330-94ae-305897a5e957}</UniqueIdentifier> <UniqueIdentifier>{0b5febe7-a88d-4330-94ae-305897a5e957}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="include\cglm\clipspace">
<UniqueIdentifier>{8044a657-123d-4a0e-8de1-f348fad7dadb}</UniqueIdentifier>
</Filter>
<Filter Include="include\cglm\call\clipspace">
<UniqueIdentifier>{842a48fc-5c7e-4951-9623-64af96dfb95a}</UniqueIdentifier>
</Filter>
<Filter Include="include\cglm\struct\clipspace">
<UniqueIdentifier>{86101de1-0722-4c88-92a0-e6d71158354e}</UniqueIdentifier>
</Filter>
<Filter Include="src\clipspace">
<UniqueIdentifier>{98a166bb-ba2d-4649-a20f-ba6bf4ce6383}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\src\affine.c"> <ClCompile Include="..\src\affine.c">
@@ -98,6 +106,42 @@
<ClCompile Include="..\src\affine2d.c"> <ClCompile Include="..\src\affine2d.c">
<Filter>src</Filter> <Filter>src</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\clipspace\ortho_lh_no.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\ortho_lh_zo.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\ortho_rh_no.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\ortho_rh_zo.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\persp_lh_no.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\persp_lh_zo.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\persp_rh_no.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\persp_rh_zo.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\view_lh_no.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\view_lh_zo.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\view_rh_no.c">
<Filter>src\clipspace</Filter>
</ClCompile>
<ClCompile Include="..\src\clipspace\view_rh_zo.c">
<Filter>src\clipspace</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\src\config.h"> <ClInclude Include="..\src\config.h">
@@ -379,5 +423,122 @@
<ClInclude Include="..\include\cglm\simd\neon\quat.h"> <ClInclude Include="..\include\cglm\simd\neon\quat.h">
<Filter>include\cglm\simd\neon</Filter> <Filter>include\cglm\simd\neon</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\include\cglm\clipspace\ortho_lh_no.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\ortho_lh_zo.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\ortho_rh_no.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\ortho_rh_zo.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\persp.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\persp_lh_no.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\persp_lh_zo.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\persp_rh_no.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\persp_rh_zo.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\view_lh.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\view_lh_no.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\view_lh_zo.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\view_rh.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\view_rh_no.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\clipspace\view_rh_zo.h">
<Filter>include\cglm\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\ortho_lh_no.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\ortho_lh_zo.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\ortho_rh_no.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\ortho_rh_zo.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\persp_lh_no.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\persp_lh_zo.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\persp_rh_no.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\persp_rh_zo.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\view_lh_no.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\view_lh_zo.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\view_rh_no.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\clipspace\view_rh_zo.h">
<Filter>include\cglm\call\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\ortho_lh_no.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\ortho_lh_zo.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\ortho_rh_no.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\ortho_rh_zo.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\persp_lh_no.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\persp_lh_zo.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\persp_rh_no.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\persp_rh_zo.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\view_lh_no.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\view_lh_zo.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\view_rh_no.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\view_rh_zo.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>