Giter Club home page Giter Club logo

gl-matrix-wasm's Introduction

gl-matrix-wasm

Port gl-matrix to WebAssembly by rust, wasm-bindgen and wasm-pack.

Goals

  1. Complete: Support all functions in gl-matrix.
  2. Pure: Write by pure rust without any third-part dependencies.
  3. Small: 25K(gzip, separate files) / 32K (gzip, wasm buffer will be embedded js file).
  4. Reliable: Full unit tests as same as gl-matrix.
  5. Fast: Some tricks to speed up the performance in production version.
  6. LowCost: Lower CPU and memory cost than js version.
  7. Controllable: Predictable memory cost and linear performance(AOT).

Difference

Although this library supports all functions in gl-matrix, but there are a little difference:

  1. Namespace: this library use Vector2, Matrix4... as namespace, it is not as same as gl-matrix's vec2, mat4.
  2. Async: You must initialize this library asynchronous, it is painful, but was wasm required.
  3. Data storage: When you use some ways such as const vec2 = Vector2.create(); to create vectors and matrixes, you will get a Object contains pointer but not TypedArray. This is the largest difference between wasm and js version. In wasm version, all data are stored in wasm memory, and in js only store those pointers. If you want to get the real value of wasm object, please use object.elements, it will return a Float32Array that could be pass to GPU, or you can use object.elements[0], object.elements[1]... to get each element by index.

Usage

First, install it:

npm i gl-matrix-wasm --save

// or yarn add gl-matrix-wasm

Then you can use two ways to import and use it:

One JS file

In current time, this way is suggested. It combine wasm file and js wrapper file to one js file(as umd module) which embed a wasm buffer. That means you don't need any external tools, you can use it just as you use gl-matrix before.

import * as math from 'gl-matrix-wasm';

async function test() {
  // initialize
  await math.init();

  const vec3 = math.Vector3.create();
  console.log(vec3.elements);

  // don't want to free
  v1.free();
}

Separate files

This way faces the future, it provides a wasm file and a js(es6) file, in js file, it simply import the wasm file. It means you need some tools to compile it to es5 and split wasm file to your final results.

A common toolchain that support wasm is webpack(4.0+), your can put these config to your webpack.config.js file:

module: {
  rules: [
    ......
    {
      test: /\.wasm$/,
      type: 'webassembly/experimental'
    }
    ......
  ]
}

And you must not exclude node_modules/gl-matrix in your js loader.

Now, you can use this library is separate-files mode:

async function test() {
  const math = await import('gl-matrix-wasm/pkg/gl_matrix_wasm.split');

  const v1 = math.Vector4.fromValues(1, 0, 0, 0);
  console.log(vec3.elements);

  // don't want to free
  v1.free();
}

Performance

I did many tests to show how wasm version faster than js. But unfortunately, wasm does not run faster for all scene.

So, for evaluating performance reliably, I made two kinds of tests: benchmark and real-world.

PS: In current time, rust & wasm-bindgen version is slower than c++ & emscripten, see #1585.

Benchmark

See Benchmark(Matrix4, 2015 RMBP, Chrome)

Real World

Real world is different from benchmark, I made some tests for each matrix4's method with 10000 calling, and a "really real world" test is also provided, it supposes we will execute operations "Mul x 4 -> fromRTS x 1 -> getElements" 1000 times per frame and run it in 60fps.

You can run these tests yourself:

Matrix4 Performance Tests

CPU & Memory

Waiting...

Development

Welcome to contribute to this project, you can run this project in development environment follow this steps:

Install RUST

$ curl https://sh.rustup.rs -sSf | sh
$ rustup default nightly
$ rustup target add wasm32-unknown-unknown --toolchain nightly
$ cargo +nightly install wasm-pack
$ cargo update

Install node packages

$ npm i

Run

Develop rust

Low performance, but could be used to debug rust sources.

npm run dev

Develop demo

High performance, could be used to test the production.

npm run dev-build

Unit test

I use karma for testing.

npm run test

Next

SIMD on WebAssembly.

License

Copyright © 2019, 戴天宇, Tianyu Dai (dtysky < [email protected] >). All Rights Reserved. This project is free software and released under the MIT License.

gl-matrix-wasm's People

Contributors

dtysky avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

gl-matrix-wasm's Issues

Critical dependency error

Hello, @dtysky !

I've came across this lib and would like to use it as a replacement for gl-matrix on one of our projects. Currently facing the issue right after the installation via npm:

Critical dependency: require function is used in a way in which dependencies cannot be statically extracted

Could you please hint me on what am I doing wrong?

gl-matrix-wasm version: 0.8.0

Webpack confing:

module.exports = (env, argv) => {
  return {
    target: 'web',
    module: {
      rules: [
      ...
        {
          test: /\.wasm$/,
          type: 'webassembly/async'
        }
      ]
    },
    experiments: {
      asyncWebAssembly: true,
    },
   ...
  };
};

Can't install dependencies

I'm trying to run this project but I've a problem with npm install on windows.

the error message is:

npm ERR! code 1
npm ERR! path C:\Projects\test\gl-matrix-wasm-master\node_modules\node-sass
npm ERR! command failed
npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node scripts/build.js
npm ERR! Building: C:\Program Files\nodejs\node.exe C:\Projects\test\gl-matrix-wasm-master\node_modules\node-gyp\bin\node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= 
--libsass_ldflags= --libsass_library=
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp verb cli [
npm ERR! gyp verb cli   'C:\\Program Files\\nodejs\\node.exe',
npm ERR! gyp verb cli   'C:\\Projects\\test\\gl-matrix-wasm-master\\node_modules\\node-gyp\\bin\\node-gyp.js',
npm ERR! gyp verb cli   'rebuild',
npm ERR! gyp verb cli   '--verbose',
npm ERR! gyp verb cli   '--libsass_ext=',
npm ERR! gyp verb cli   '--libsass_cflags=',
npm ERR! gyp verb cli   '--libsass_ldflags=',
npm ERR! gyp verb cli   '--libsass_library='
npm ERR! gyp verb cli ]
npm ERR! gyp info using [email protected]
npm ERR! gyp info using [email protected] | win32 | x64
npm ERR! gyp verb command rebuild []
npm ERR! gyp verb command clean []
npm ERR! gyp verb clean removing "build" directory
npm ERR! gyp verb command configure []
npm ERR! gyp verb check python checking for Python executable "python2" in the PATH
npm ERR! gyp verb `which` failed Error: not found: python2
npm ERR! gyp verb `which` failed     at getNotFoundError (C:\Projects\test\gl-matrix-wasm-master\node_modules\which\which.js:13:12)
npm ERR! gyp verb `which` failed     at F (C:\Projects\test\gl-matrix-wasm-master\node_modules\which\which.js:68:19)
npm ERR! gyp verb `which` failed     at E (C:\Projects\test\gl-matrix-wasm-master\node_modules\which\which.js:80:29)
npm ERR! gyp verb `which` failed     at C:\Projects\test\gl-matrix-wasm-master\node_modules\which\which.js:89:16
npm ERR! gyp verb `which` failed     at C:\Projects\test\gl-matrix-wasm-master\node_modules\isexe\index.js:42:5
npm ERR! gyp verb `which` failed     at C:\Projects\test\gl-matrix-wasm-master\node_modules\isexe\windows.js:36:5
npm ERR! gyp verb `which` failed     at FSReqCallback.oncomplete (node:fs:198:21)
npm ERR! gyp verb `which` failed  python2 Error: not found: python2
npm ERR! gyp verb `which` failed     at getNotFoundError (C:\Projects\test\gl-matrix-wasm-master\node_modules\which\which.js:13:12)
npm ERR! gyp verb `which` failed     at F (C:\Projects\test\gl-matrix-wasm-master\node_modules\which\which.js:68:19)
npm ERR! gyp verb `which` failed     at E (C:\Projects\test\gl-matrix-wasm-master\node_modules\which\which.js:80:29)
npm ERR! gyp verb `which` failed     at C:\Projects\test\gl-matrix-wasm-master\node_modules\which\which.js:89:16
npm ERR! gyp verb `which` failed     at C:\Projects\test\gl-matrix-wasm-master\node_modules\isexe\index.js:42:5
npm ERR! gyp verb `which` failed     at C:\Projects\test\gl-matrix-wasm-master\node_modules\isexe\windows.js:36:5
npm ERR! gyp verb `which` failed     at FSReqCallback.oncomplete (node:fs:198:21) {
npm ERR! gyp verb `which` failed   code: 'ENOENT'
npm ERR! gyp verb `which` failed }
npm ERR! gyp verb check python checking for Python executable "python" in the PATH
npm ERR! gyp verb `which` succeeded python C:\SDK\Python27\python.EXE
npm ERR! gyp verb check python version `C:\SDK\Python27\python.EXE -c "import sys; print "2.7.18
npm ERR! gyp verb check python version .%s.%s" % sys.version_info[:3];"` returned: %j
npm ERR! gyp verb get node dir no --target version specified, falling back to host node version: 16.15.1
npm ERR! gyp verb command install [ '16.15.1' ]
npm ERR! gyp verb install input version string "16.15.1"
npm ERR! gyp verb install installing version: 16.15.1
npm ERR! gyp verb install --ensure was passed, so won't reinstall if already installed
npm ERR! gyp verb install version is already installed, need to check "installVersion"
npm ERR! gyp verb got "installVersion" 9
npm ERR! gyp verb needs "installVersion" 9
npm ERR! gyp verb install version is good
npm ERR! gyp verb get node dir target node version installed: 16.15.1
npm ERR! gyp verb build dir attempting to create "build" dir: C:\Projects\test\gl-matrix-wasm-master\node_modules\node-sass\build
npm ERR! gyp verb build dir "build" dir needed to be created? C:\Projects\test\gl-matrix-wasm-master\node_modules\node-sass\build
npm ERR! gyp verb find vs2017 Found installation at: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
npm ERR! gyp verb find vs2017   - Found Microsoft.VisualStudio.Component.VC.Tools.x86.x64
npm ERR! gyp verb find vs2017   - Found Microsoft.VisualStudio.Component.Windows10SDK.18362
npm ERR! gyp verb find vs2017   - Found Microsoft.VisualStudio.VC.MSBuild.Base
npm ERR! gyp verb find vs2017   - Using this installation with Windows 10 SDK
npm ERR! gyp verb find vs2017 using installation: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
npm ERR! gyp verb build/config.gypi creating config file
npm ERR! gyp verb build/config.gypi writing out config file: C:\Projects\test\gl-matrix-wasm-master\node_modules\node-sass\build\config.gypi
npm ERR! (node:13360) [DEP0150] DeprecationWarning: Setting process.config is deprecated. In the future the property will be read-only.
npm ERR! (Use `node --trace-deprecation ...` to show where the warning was created)
npm ERR! gyp verb config.gypi checking for gypi file: C:\Projects\test\gl-matrix-wasm-master\node_modules\node-sass\config.gypi
npm ERR! gyp verb common.gypi checking for gypi file: C:\Projects\test\gl-matrix-wasm-master\node_modules\node-sass\common.gypi
npm ERR! gyp verb gyp gyp format was not specified; forcing "msvs"
npm ERR! gyp info spawn C:\SDK\Python27\python.EXE
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args   'C:\\Projects\\test\\gl-matrix-wasm-master\\node_modules\\node-gyp\\gyp\\gyp_main.py',
npm ERR! gyp info spawn args   'binding.gyp',
npm ERR! gyp info spawn args   '-f',
npm ERR! gyp info spawn args   'msvs',
npm ERR! gyp info spawn args   '-G',
npm ERR! gyp info spawn args   'msvs_version=2015',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   'C:\\Projects\\test\\gl-matrix-wasm-master\\node_modules\\node-sass\\build\\config.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   'C:\\Projects\\test\\gl-matrix-wasm-master\\node_modules\\node-gyp\\addon.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   'C:\\Users\\shawn\\.node-gyp\\16.15.1\\include\\node\\common.gypi',
npm ERR! gyp info spawn args   '-Dlibrary=shared_library',
npm ERR! gyp info spawn args   '-Dvisibility=default',
npm ERR! gyp info spawn args   '-Dnode_root_dir=C:\\Users\\shawn\\.node-gyp\\16.15.1',
npm ERR! gyp info spawn args   '-Dnode_gyp_dir=C:\\Projects\\test\\gl-matrix-wasm-master\\node_modules\\node-gyp',
npm ERR! gyp info spawn args   '-Dnode_lib_file=C:\\Users\\shawn\\.node-gyp\\16.15.1\\<(target_arch)\\node.lib',
npm ERR! gyp info spawn args   '-Dmodule_root_dir=C:\\Projects\\test\\gl-matrix-wasm-master\\node_modules\\node-sass',
npm ERR! gyp info spawn args   '-Dnode_engine=v8',
npm ERR! gyp info spawn args   '--depth=.',
npm ERR! gyp info spawn args   '--no-parallel',
npm ERR! gyp info spawn args   '--generator-output',
npm ERR! gyp info spawn args   'C:\\Projects\\test\\gl-matrix-wasm-master\\node_modules\\node-sass\\build',
npm ERR! gyp info spawn args   '-Goutput_dir=.'
npm ERR! gyp info spawn args ]
npm ERR! gyp verb command build []
npm ERR! gyp verb build type Release
npm ERR! gyp verb architecture x64
npm ERR! gyp verb node dev dir C:\Users\shawn\.node-gyp\16.15.1
npm ERR! gyp verb found first Solution file build/binding.sln
npm ERR! gyp verb using MSBuild: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\15.0\Bin\MSBuild.exe
npm ERR! gyp info spawn C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\15.0\Bin\MSBuild.exe
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args   'build/binding.sln',
npm ERR! gyp info spawn args   '/nologo',
npm ERR! gyp info spawn args   '/p:Configuration=Release;Platform=x64'
npm ERR! gyp info spawn args ]
npm ERR! gyp ERR! UNCAUGHT EXCEPTION
npm ERR! gyp ERR! stack Error: spawn C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\15.0\Bin\MSBuild.exe ENOENT
npm ERR! gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
npm ERR! gyp ERR! stack     at onErrorNT (node:internal/child_process:478:16)
npm ERR! gyp ERR! stack     at processTicksAndRejections (node:internal/process/task_queues:83:21)
npm ERR! gyp ERR! System Windows_NT 10.0.19044
npm ERR! gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Projects\\test\\gl-matrix-wasm-master\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
npm ERR! gyp ERR! cwd C:\Projects\test\gl-matrix-wasm-master\node_modules\node-sass
npm ERR! gyp ERR! node -v v16.15.1
npm ERR! gyp ERR! node-gyp -v v3.8.0
npm ERR! gyp ERR! This is a bug in `node-gyp`.
npm ERR! gyp ERR! Try to update node-gyp and file an Issue if it does not help:
npm ERR! gyp ERR!     <https://github.com/nodejs/node-gyp/issues>
npm ERR! Build failed with error code: 7

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\shawn\AppData\Local\npm-cache\_logs\2022-06-02T09_20_35_890Z-debug-0.log

It appears some dependencies are too old to compile?

Please help me out with it.

可以加入 nodejs 版本

const {TextDecoder}=require('util');
 if (module instanceof URL || typeof module === 'string' || module instanceof Request) {}

=>

 if (!module.buffer) {} 

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.