3 unstable releases

0.2.0 Mar 17, 2024
0.1.1 Apr 16, 2022
0.1.0 Apr 11, 2022

#642 in WebAssembly

Download history 25/week @ 2024-07-25 10/week @ 2024-09-19 7/week @ 2024-09-26

104 downloads per month
Used in 2 crates

MIT license

445KB
5.5K SLoC

TypeScript 3K SLoC // 0.1% comments Rust 2K SLoC // 0.0% comments JavaScript 71 SLoC // 0.2% comments

πŸ…ΌπŸ†„πŸ…½πŸ†„πŸ…Ό

ΞΌNum - Micro 3D Math Library


license: MIT Docs.rs Crates.io npm codecov build

Overview

munum is a minimalistic numerical library for high-performance 3D math with Rust, WebAssembly and JavaScript bindings.

Documentation

Install

[JavaScript] Install via npm:

npm install --save munum

[Rust] Install as Cargo dependency:

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)

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:

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 for more information.

Dependencies

~385–730KB
~15K SLoC