A C++ maths library... you might find this useful for games and graphics dev, it has a lot of useful intersection, geometric test and conversion functions, vector swizzling, gjk implementation and other handy features.
There is a Live Demo via WebAssembly and WebGL.
Supported Compilers: MSVC 2017+, GCC 7.0+, Clang 6.0+, EMCC 2.0.
C++11 or later is required. Tested with C++20, C++17, C++14 and C++11.
The entire library is header only, add the maths directory to your include search path and simply include:
#include "maths.h" // intersection, geometric tests and conversion functions
#include "util.h" // min, max, swap, smoothstep, scalar functions.. etc
#include "vec.h" // vector of any dimension and type
#include "mat.h" // matrix of any dimension and type
#include "quat.h" // quaternion of any type
void maths() {
// templated by size and type
Vec<3, float> float3;
Vec<2, int> int3;
Mat<4, 4, double> double4x4;
Quat<float> q;
// common abbreviations for convenience
Vec<3, float> vec3f;
Vec<2, float> vec2f;
Mat<3, 3, float> mat3f;
// + common sizes and types for 2, 3, 4 dimensions, float, doubles, ints
// quick common constructors
vec3f zero = vec3f::zero();
vec3f one = vec3f::one();
vec3f red = vec3f::red();
mat4f identity = mat4f::identity();
// ... and so on
// arithmetic operators
vec3f result_add = zero + one;
vec3f result_mul = zero * one;
result_add += red;
mat4f mat_result = mata * matb;
// etc
// overloaded functions and operations that feel lightweight and expressive
vec3f norm = normalize(va);
f32 dp = dot(va, vb);
vec3f cp = cross(va, vb);
quat q = normalize(q2);
quat qd = dot(q, q);
// + more
// shader style funcs with scalar variants
vec3f lerp = lerp(va, vb, 0.5f);
f32 lerp = lerp(fa, fb, 0.75f);
vec3f sat = saturate(va);
quat q = slerp(qa, qb, 0.25f);
// yeah!
// cmath functions for vectors and swizzles
vec2f v2_sin = sin(result_add.xy);
vec3f v3_cos = cos(result_mul);
vec2f v2_floor = floor(v2);
// ... you get it!
// swizzles for that shader like feeling!
vec4f swizz = v.wzyx; // construct from swizzle
swizz = v.xxxx; // assign from swizzle
swizz.wyxz = v.xxyy; // assign swizzle to swizzle
vec2f v2 = swizz.yz; // construct truncated
swizz.wx = v.xy; // assign truncated
swizz.xyz *= swizz2.www; // arithmetic on swizzles
vec2 v2 = swizz.xy * 2.0f; // swizzle / scalar arithmetic
// sometimes you may need to cast from swizzle to vec if c++ cant apply implicit casts
f32 dp = dot((vec2f)swizz.xz, (vec2f)swizz.yy):
}
Plane Classification: point_vs_plane, aabb_vs_plane, sphere_vs_plane, capsule_vs_plane, cone_vs_plane
.
Overlaps: sphere_vs_sphere, sphere_vs_aabb, sphere_vs_obb, aabb_vs_aabb, aabb_vs_frustum, sphere_vs_frustum, sphere_vs_capsule, capsule_vs_capsule, obb_vs_obb, aabb_vs_obb, convex_hull_vs_convex_hull, gjk_2d, gjk_3d
.
Point Inside: point_inside_aabb, point_inside_sphere, point_inside_obb, point_inside_triangle, point_inside_cone, point_inside_convex_hull, point_inside_poly, point_inside_frustum
.
Closest Point: closest_point_on_aabb, closest_point_on_line, closest_point_on_plane, closest_point_on_obb, closest_point_on_sphere, closest_point_on_ray, closest_point_on_triangle, closest_point_on_polygon, closest_point_on_convex_hull, closest_point_on_cone
.
Point Distance: point_aabb_distance, point_segment_distance, point_triangle_distance, distance_on_line, point_plane_distance, plane_distance, point_sphere_distance, point_polygon_distance, point_convex_hull_distance, point_cone_distance, point_obb_distance
.
Ray / Line: ray_vs_plane, ray_vs_triangle, ray_vs_sphere, ray_vs_line_segment, ray_vs_aabb, ray_vs_obb, ray_vs_capsule, ray_vs_cylinder, line_vs_line, line_vs_poly, shortest_line_segment_between_lines, shortest_line_segment_between_line_segments
.
Shader Style Functions: dot, cross, normalize, mag, mag2, dist, dist2, triple, vector_triple, lerp, nlerp, slerp, saturate, clamp, normalize, chebyshev_normalize, all, any, min, max, min_union, max_union, smoothstep, step, round, floor, ceil, abs, frac, trunc, exp, exp2, log, log2, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh
.
Graph Functions: smooth_start, smooth_stop, impulse, cubic_pulse, exp_step, parabola, pcurve, exp_sustained_impulse, sinc, gain, almost_identity, integral_smoothstep, quad_impulse, poly_impulse
.
+ More included!
c++ --std=c++11 -Wno-braced-scalar-init .test/test.cpp -o .test/test && ./".test/test"
There is a provided display.natvis file which can be used with visual studio or vscode, this will display swizzles correctly when hovering in the debugger and prevent the huge union expansion from the swizzles.
Append the contents of display.lldb to your ~/.lldbinit
for improved readability in xcode or commandline lldb debugging.