🅼🆄🅽🆄🅼

μNum - Micro 3D Math Library


[![license: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) [![Docs.rs](https://docs.rs/munum/badge.svg)](https://docs.rs/munum) [![Crates.io](https://img.shields.io/crates/v/munum.svg)](https://crates.io/crates/munum) [![npm](https://img.shields.io/npm/v/munum.svg)](https://www.npmjs.com/package/munum) [![codecov](https://codecov.io/gh/andykswong/munum/branch/main/graph/badge.svg?token=68JPTUD7GZ)](https://codecov.io/gh/andykswong/munum) [![build](https://github.com/andykswong/munum/actions/workflows/build.yaml/badge.svg)](https://github.com/andykswong/munum/actions/workflows/build.yaml) ## Overview `munum` is a minimalistic numerical library for high-performance 3D math with Rust, WebAssembly and JavaScript bindings. ## Documentation - Docs.rs: https://docs.rs/munum - TSDoc: http://andykswong.github.io/munum ## Install [JavaScript] Install via npm: ```shell npm install --save munum ``` --- [Rust] Install as Cargo dependency: ```shell cargo add munum ``` Features: - `std` - enables `std` support. enabled by default. - `libm` - enables trigonometry related functions in `no_std` environment using `libm`. - `jsmath` - enables trigonometry related functions in `no_std` WebAssembly environment using JS Math binding. - `serde` - enables `serde` serialize/deserialize implementations - `wasm` - produces WebAssembly module and WebAssembly component (WIP) ## Usage (JavaScript WebAssembly binding) Sample usage to build a perspective camera view-projection matrix below: [(Try it yourself here)](https://codepen.io/andykswong/pen/yLbPzGy?editors=0011) ```javascript import { lookAt, perspective, Mat4, Vec3 } from 'munum'; // Or load from CDN, e.g. 'https://unpkg.com/munum@latest' using eye = new Vec3(1, 1, 1); using target = new Vec3(0, 0, 0); using up = new Vec3(0, 1, 0); const view = lookAt(eye, target, up); const aspectRatio = width / height; const yfov = Math.PI / 4; const znear = 1; const zfar = 100; using viewProj = perspective(aspectRatio, yfov, znear, zfar).mul(view); ``` Note the use of `using` (which automatically calls `.free()` when out of scope). When using JavaScript binding, `munum` resources are allocated on WebAssembly memory which need to be deallocated later. `munum` uses `FinalizationRegistry` for automatic memory management, so explicit memory management with `using` or `.free()` is not required through recommended. ## Usage (Pure JavaScript) Import from `munum/js` for pure JavaScript implementation. ## Usage (Rust) Sample usage to build a perspective camera view-projection matrix: ```rust use core::f32::{consts::PI, INFINITY}; use munum::{transform, vec3}; let eye = vec3(0_f32, 2., 0.); let target = vec3(0., 0.6, 0.); let up = vec3(0., 0., -1.); let view = transform::look_at(eye, target, up); let proj = transform::perspective(2., PI/2., 1., INFINITY); let view_proj = proj * view; ``` ## License This repository and the code inside it is licensed under the MIT License. Read [LICENSE](./LICENSE) for more information.