0
0
Fork 0
mirror of https://github.com/liabru/matter-js.git synced 2025-01-11 16:00:48 -05:00

merge branch master

This commit is contained in:
liabru 2020-12-30 13:51:56 +00:00
commit 2f5e304f7b
42 changed files with 17792 additions and 12817 deletions

3
.gitignore vendored
View file

@ -1,12 +1,11 @@
.idea
node_modules
npm-debug.log
doc
docs
matter-doc-theme
build/matter-dev.js
build/matter-dev.min.js
demo/js/lib/matter-dev.js
demo/js/Examples.js
demo/js/Examples.min.js
examples/build
test/browser/diffs

View file

@ -1,3 +1,57 @@
## 0.15.0 (2020-12-24)
* add window global, stub require and handle bad values in test tools ([497ac80](https://github.com/liabru/matter-js/commit/497ac80))
* added Body.setCentre, closes #684, closes #461, closes #679 ([2ec247b](https://github.com/liabru/matter-js/commit/2ec247b)), closes [#684](https://github.com/liabru/matter-js/issues/684) [#461](https://github.com/liabru/matter-js/issues/461) [#679](https://github.com/liabru/matter-js/issues/679)
* added browser tests ([ceb7cd5](https://github.com/liabru/matter-js/commit/ceb7cd5))
* Added build comparison tools and tests ([b7c938a](https://github.com/liabru/matter-js/commit/b7c938a))
* added check for window in Common.now ([9ef9d02](https://github.com/liabru/matter-js/commit/9ef9d02))
* added comparison output file option to test tools ([45aae25](https://github.com/liabru/matter-js/commit/45aae25))
* Added config and test files to lint ([21e4ea6](https://github.com/liabru/matter-js/commit/21e4ea6))
* added Constraint.pointAWorld and Constraint.pointBWorld ([3c32969](https://github.com/liabru/matter-js/commit/3c32969))
* added examples to dev server bundle and commit built examples ([fe80478](https://github.com/liabru/matter-js/commit/fe80478))
* added module export to examples ([f9ea799](https://github.com/liabru/matter-js/commit/f9ea799))
* added overlap metric to test tools ([3fd674d](https://github.com/liabru/matter-js/commit/3fd674d))
* added release scripts ([341c247](https://github.com/liabru/matter-js/commit/341c247))
* added tag push to release task ([060283b](https://github.com/liabru/matter-js/commit/060283b))
* added timing to engine snapshot ([e0cdbb8](https://github.com/liabru/matter-js/commit/e0cdbb8))
* Added watch content base to dev server ([f471d4e](https://github.com/liabru/matter-js/commit/f471d4e))
* added webpack build script ([046013e](https://github.com/liabru/matter-js/commit/046013e))
* changed alpha build configuration ([182c84a](https://github.com/liabru/matter-js/commit/182c84a))
* changed demo to auto populate examples with sourceLink and init ([5b0d34b](https://github.com/liabru/matter-js/commit/5b0d34b))
* changed demo to serve without sub-directory ([823bbc0](https://github.com/liabru/matter-js/commit/823bbc0))
* changed docs build config ([864452d](https://github.com/liabru/matter-js/commit/864452d))
* changed example tests to use jest ([104d319](https://github.com/liabru/matter-js/commit/104d319))
* fix decomp import in Bodies.fromVertices ([94e9614](https://github.com/liabru/matter-js/commit/94e9614))
* fix decomp require ([0af1645](https://github.com/liabru/matter-js/commit/0af1645))
* fix issues with render pixel ratio, closes #686, closes #687 ([d577477](https://github.com/liabru/matter-js/commit/d577477)), closes [#686](https://github.com/liabru/matter-js/issues/686) [#687](https://github.com/liabru/matter-js/issues/687)
* fix lint ([5a0079d](https://github.com/liabru/matter-js/commit/5a0079d))
* fix lint issues ([9ca21c1](https://github.com/liabru/matter-js/commit/9ca21c1))
* fix path to build in test worker ([fcdb4fa](https://github.com/liabru/matter-js/commit/fcdb4fa))
* fix preversion script ([c368c14](https://github.com/liabru/matter-js/commit/c368c14))
* fix terrain example module export ([4a967ec](https://github.com/liabru/matter-js/commit/4a967ec))
* Fix typo in docs ([c486635](https://github.com/liabru/matter-js/commit/c486635))
* fixed plugins in compare ([82bb415](https://github.com/liabru/matter-js/commit/82bb415))
* implemented threaded comparison testing ([285d70d](https://github.com/liabru/matter-js/commit/285d70d))
* Optimized Body's hidden class ([b3220cf](https://github.com/liabru/matter-js/commit/b3220cf))
* Optimized Events.trigger method when no event is emitted ([b17cb48](https://github.com/liabru/matter-js/commit/b17cb48))
* remove gulp ([6a28090](https://github.com/liabru/matter-js/commit/6a28090))
* remove old demo libs ([13c7eb5](https://github.com/liabru/matter-js/commit/13c7eb5))
* removed unused gulp release tasks ([e5a7311](https://github.com/liabru/matter-js/commit/e5a7311))
* removed yuidocjs dev dependency ([ee848d2](https://github.com/liabru/matter-js/commit/ee848d2))
* Set loose build version on dev server ([1fcf292](https://github.com/liabru/matter-js/commit/1fcf292))
* update build script ([90abab6](https://github.com/liabru/matter-js/commit/90abab6))
* update default render theme ([d258411](https://github.com/liabru/matter-js/commit/d258411))
* update demo and example render styles ([6dd5ec5](https://github.com/liabru/matter-js/commit/6dd5ec5))
* update dependencies ([e1e058c](https://github.com/liabru/matter-js/commit/e1e058c)) ([5f5b8a1](https://github.com/liabru/matter-js/commit/5f5b8a1))
* update examples build config and scripts ([69afb11](https://github.com/liabru/matter-js/commit/69afb11))
* update package lock ([ac3da07](https://github.com/liabru/matter-js/commit/ac3da07))
* updated build scripts ([6b698ea](https://github.com/liabru/matter-js/commit/6b698ea))
* updated ci ([288b9cd](https://github.com/liabru/matter-js/commit/288b9cd))
* updated docs ([50cf171](https://github.com/liabru/matter-js/commit/50cf171))
* updated readme ([ea5c012](https://github.com/liabru/matter-js/commit/ea5c012)) ([61b1963](https://github.com/liabru/matter-js/commit/61b1963))
<a name="0.14.2"></a>
## <small>0.14.2 (2018-06-11)</small>

View file

@ -6,7 +6,7 @@ By providing any kind of contribution to this project, **you must agree and be l
## Contributions
Contributions by pull request or issues are welcome. Please ensure they follow the same style and architecture as the rest of the code. Use `npm run lint` before submitting. Please **do not include** any changes to the files in the `build` directory.
Contributions by pull request or issues are welcome. Please ensure they follow the same style and architecture as the rest of the code. Use `npm run lint` and see [Testing](#Testing) below before submitting. Please **do not include** any changes to the files in the `build` directory.
Before contributing please read the license agreement described at the beginning of this document.
@ -22,6 +22,16 @@ which will install the required build dependencies, then run
which will run the development server and opens `http://localhost:8000/` in your browser. Any changes you make to the source will automatically rebuild and reload the page.
## Testing
All contributions should pass when running the commands
- `npm run lint`
- `npm run test`
- `npm run test-browser`
The output of `npm run test` also includes a [comparison report](https://github.com/liabru/matter-js/pull/794), which highlights changes in results, performance and accuracy against the last release build.
## Commands
The following development commands can be run at the terminal
@ -33,8 +43,8 @@ creates a release build
- **npm run lint**
runs the linter
- **npm run test**
runs the tests
- **npm run compare**
compares the output of examples for current source against release build
runs the tests and compares results
- **npm run test-browser**
runs the browser tests
- **npm run doc**
builds the documentation

View file

@ -1,90 +0,0 @@
/* eslint-env es6 */
"use strict";
const gulp = require('gulp');
const bump = require('gulp-bump');
const changelog = require('gulp-conventional-changelog');
const tag = require('gulp-tag-version');
const sequence = require('run-sequence');
const gutil = require('gulp-util');
const pkg = require('./package.json');
const exec = require('child_process').exec;
const shellExec = (command, callback) => {
const args = process.argv.slice(3).join(' '),
proc = exec(command + ' ' + args, (err, stdout, stderr) => {
callback(err, stdout, stderr, proc);
});
proc.stdout.on('data', data => process.stdout.write(data));
proc.stderr.on('data', data => process.stderr.write(data));
};
const shell = command => (callback => { shellExec(command, callback); });
const hint = command => (callback => {
gutil.log(gutil.colors.red('Error'), 'use', gutil.colors.yellow(command), 'instead.');
callback();
});
gulp.task('default', hint('npm run build'));
gulp.task('dev', hint('npm run dev'));
gulp.task('build', hint('npm run build'));
gulp.task('test', hint('npm run test'));
gulp.task('lint', hint('npm run lint'));
gulp.task('doc', callback => {
shellExec(`yuidoc --config yuidoc.json --project-version ${pkg.version}`, callback);
});
gulp.task('bump', () => {
return gulp.src(['package.json', 'bower.json'])
.pipe(bump({ type: process.argv[4] || 'minor' }))
.pipe(gulp.dest('.'));
});
gulp.task('tag', () => {
return gulp.src('package.json')
.pipe(tag({ prefix: '' }));
});
gulp.task('changelog', () => {
return gulp.src('CHANGELOG.md')
.pipe(changelog())
.pipe(gulp.dest('.'));
});
gulp.task('release', callback => {
shellExec('git status --porcelain', (err, stdout) => {
if (stdout && stdout.trim()) {
throw new gutil.PluginError({
plugin: 'release',
message: 'cannot build release as there are uncomitted changes'
});
} else {
sequence(
'release:lint', 'bump', 'release:build', 'release:test',
'doc', 'changelog', callback
);
}
});
});
gulp.task('release:lint', shell('npm run lint'));
gulp.task('release:build', shell('npm run build'));
gulp.task('release:test', shell('TEST_BUILD=true npm run test'));
gulp.task('release:push:git', shell('git push origin && git push origin --tags'));
gulp.task('release:push:npm', shell('npm publish'));
gulp.task('release:push', callback => {
shellExec('git status --porcelain', (err, stdout) => {
if (stdout && stdout.trim()) {
throw new gutil.PluginError({
plugin: 'release',
message: 'cannot push release as it has not yet been committed'
});
} else {
sequence('tag', 'release:push:git', 'release:push:npm', callback);
}
});
});

122
README.md
View file

@ -1,10 +1,10 @@
<img alt="Matter.js" src="http://brm.io/matter-js/img/matter-js.svg" width="300">
<img alt="Matter.js" src="https://brm.io/matter-js/img/matter-js.svg" width="300">
> *Matter.js* is a JavaScript 2D rigid body physics engine for the web
[brm.io/matter-js](http://brm.io/matter-js/)
[brm.io/matter-js](https://brm.io/matter-js/)
[Demos](#demos) - [Gallery](#gallery) - [Features](#features) - [Plugins](#plugins) - [Install](#install) - [Usage](#usage) - [Examples](#examples) - [Docs](#documentation) - [Wiki](https://github.com/liabru/matter-js/wiki) - [References](#references) - [License](#license)
[Demos](#demos) ・ [Gallery](#gallery) ・ [Features](#features) ・ [Plugins](#plugins) ・ [Install](#install) ・ [Usage](#usage) ・ [Examples](#examples) ・ [Docs](#documentation) ・ [Wiki](https://github.com/liabru/matter-js/wiki) ・ [References](#references) ・ [License](#license)
[![Build Status](https://travis-ci.org/liabru/matter-js.png?branch=master)](https://travis-ci.org/liabru/matter-js)
@ -14,51 +14,55 @@
<tr>
<td>
<ul>
<li><a href="http://brm.io/matter-js/demo/#mixed">Mixed Shapes</a></li>
<li><a href="http://brm.io/matter-js/demo/#mixedSolid">Solid Shapes</a></li>
<li><a href="http://brm.io/matter-js/demo/#svg">Concave SVG Paths</a></li>
<li><a href="http://brm.io/matter-js/demo/#terrain">Concave Terrain</a></li>
<li><a href="http://brm.io/matter-js/demo/#concave">Concave Bodies</a></li>
<li><a href="http://brm.io/matter-js/demo/#compound">Compound Bodies</a></li>
<li><a href="http://brm.io/matter-js/demo/#newtonsCradle">Newton's Cradle</a></li>
<li><a href="http://brm.io/matter-js/demo/#wreckingBall">Wrecking Ball</a></li>
<li><a href="http://brm.io/matter-js/demo/#slingshot">Slingshot Game</a></li>
<li><a href="http://brm.io/matter-js/demo/#rounded">Rounded Corners</a></li>
<li><a href="http://brm.io/matter-js/demo/#views">Views</a></li>
<li><a href="http://brm.io/matter-js/demo/#timescale">Time Scaling</a></li>
<li><a href="http://brm.io/matter-js/demo/#manipulation">Body Manipulation</a></li>
<li><a href="http://brm.io/matter-js/demo/#compositeManipulation">Composite Manipulation</a></li>
<li><a href="http://brm.io/matter-js/demo/#raycasting">Raycasting</a></li>
<li><a href="http://brm.io/matter-js/demo/#sprites">Sprites</a></li>
<li><a href="http://brm.io/matter-js/demo/#pyramid">Pyramid</a></li>
<li><a href="http://brm.io/matter-js/demo/#car">Car</a></li>
<li><a href="http://brm.io/matter-js/demo/#catapult">Catapult</a></li>
<li><a href="http://brm.io/matter-js/demo/#gravity">Reverse Gravity</a></li>
<li><a href="https://brm.io/matter-js/demo/#mixed">Mixed Shapes</a></li>
<li><a href="https://brm.io/matter-js/demo/#mixedSolid">Solid Shapes</a></li>
<li><a href="https://brm.io/matter-js/demo/#svg">Concave SVG Paths</a></li>
<li><a href="https://brm.io/matter-js/demo/#terrain">Concave Terrain</a></li>
<li><a href="https://brm.io/matter-js/demo/#concave">Concave Bodies</a></li>
<li><a href="https://brm.io/matter-js/demo/#compound">Compound Bodies</a></li>
<li><a href="https://brm.io/matter-js/demo/#newtonsCradle">Newton's Cradle</a></li>
<li><a href="https://brm.io/matter-js/demo/#wreckingBall">Wrecking Ball</a></li>
<li><a href="https://brm.io/matter-js/demo/#slingshot">Slingshot Game</a></li>
<li><a href="https://brm.io/matter-js/demo/#rounded">Rounded Corners</a></li>
<li><a href="https://brm.io/matter-js/demo/#views">Views</a></li>
<li><a href="https://brm.io/matter-js/demo/#timescale">Time Scaling</a></li>
<li><a href="https://brm.io/matter-js/demo/#manipulation">Body Manipulation</a></li>
<li><a href="https://brm.io/matter-js/demo/#compositeManipulation">Composite Manipulation</a></li>
</ul>
</td>
<td>
<ul>
<li><a href="http://brm.io/matter-js/demo/#bridge">Bridge</a></li>
<li><a href="http://brm.io/matter-js/demo/#avalanche">Avalanche</a></li>
<li><a href="http://brm.io/matter-js/demo/#softBody">Basic Soft Bodies</a></li>
<li><a href="http://brm.io/matter-js/demo/#cloth">Cloth</a></li>
<li><a href="http://brm.io/matter-js/demo/#events">Events</a></li>
<li><a href="http://brm.io/matter-js/demo/#collisionFiltering">Collision Filtering</a></li>
<li><a href="http://brm.io/matter-js/demo/#chains">Chains</a></li>
<li><a href="http://brm.io/matter-js/demo/#ballPool">Ball Pool</a></li>
<li><a href="http://brm.io/matter-js/demo/#stack">Stack</a></li>
<li><a href="http://brm.io/matter-js/demo/#circleStack">Circle Stack</a></li>
<li><a href="http://brm.io/matter-js/demo/#compoundStack">Compound Stack</a></li>
<li><a href="http://brm.io/matter-js/demo/#restitution">Restitution</a></li>
<li><a href="http://brm.io/matter-js/demo/#friction">Friction</a></li>
<li><a href="http://brm.io/matter-js/demo/#airFriction">Air Friction</a></li>
<li><a href="http://brm.io/matter-js/demo/#staticFriction">Static Friction</a></li>
<li><a href="http://brm.io/matter-js/demo/#sleeping">Sleeping</a></li>
<li><a href="http://brm.io/matter-js/demo/#broadphase">Grid Broadphase</a></li>
<li><a href="http://brm.io/matter-js/demo/#beachBalls">Beach Balls</a></li>
<li><a href="http://brm.io/matter-js/demo/#stress">Stress 1</a></li>
<li><a href="http://brm.io/matter-js/demo/#stress2">Stress 2</a></li>
<li><a href="http://brm.io/matter-js/demo/#sensors">Sensors</a></li>
<li><a href="https://brm.io/matter-js/demo/#raycasting">Raycasting</a></li>
<li><a href="https://brm.io/matter-js/demo/#sprites">Sprites</a></li>
<li><a href="https://brm.io/matter-js/demo/#pyramid">Pyramid</a></li>
<li><a href="https://brm.io/matter-js/demo/#car">Car</a></li>
<li><a href="https://brm.io/matter-js/demo/#catapult">Catapult</a></li>
<li><a href="https://brm.io/matter-js/demo/#gravity">Reverse Gravity</a></li>
<li><a href="https://brm.io/matter-js/demo/#bridge">Bridge</a></li>
<li><a href="https://brm.io/matter-js/demo/#avalanche">Avalanche</a></li>
<li><a href="https://brm.io/matter-js/demo/#softBody">Basic Soft Bodies</a></li>
<li><a href="https://brm.io/matter-js/demo/#cloth">Cloth</a></li>
<li><a href="https://brm.io/matter-js/demo/#events">Events</a></li>
<li><a href="https://brm.io/matter-js/demo/#collisionFiltering">Collision Filtering</a></li>
<li><a href="https://brm.io/matter-js/demo/#chains">Chains</a></li>
<li><a href="https://brm.io/matter-js/demo/#ballPool">Ball Pool</a></li>
</ul>
</td>
<td>
<ul>
<li><a href="https://brm.io/matter-js/demo/#stack">Stack</a></li>
<li><a href="https://brm.io/matter-js/demo/#circleStack">Circle Stack</a></li>
<li><a href="https://brm.io/matter-js/demo/#compoundStack">Compound Stack</a></li>
<li><a href="https://brm.io/matter-js/demo/#restitution">Restitution</a></li>
<li><a href="https://brm.io/matter-js/demo/#friction">Friction</a></li>
<li><a href="https://brm.io/matter-js/demo/#airFriction">Air Friction</a></li>
<li><a href="https://brm.io/matter-js/demo/#staticFriction">Static Friction</a></li>
<li><a href="https://brm.io/matter-js/demo/#sleeping">Sleeping</a></li>
<li><a href="https://brm.io/matter-js/demo/#broadphase">Grid Broadphase</a></li>
<li><a href="https://brm.io/matter-js/demo/#beachBalls">Beach Balls</a></li>
<li><a href="https://brm.io/matter-js/demo/#stress">Stress 1</a></li>
<li><a href="https://brm.io/matter-js/demo/#stress2">Stress 2</a></li>
<li><a href="https://brm.io/matter-js/demo/#sensors">Sensors</a></li>
</ul>
<br>
</td>
@ -69,16 +73,18 @@
See how others are using matter.js physics
- [Les métamorphoses de Mr. Kalia](http://lab212.org/Les-metamorphoses-de-Mr-Kalia) by Lab212 for Google
- [4ify](http://pauliescanlon.io/4ify-channel-4-rebrand-2/) by Supernatural for Channel 4
- [Adobe Analytics Live Stream](http://adobefirehose.mediarain.com/) by Rain for Adobe
- [Blood Sweat & Tools Interactive](http://bloodsweatandtools.discovery.ca/gamebench/) by Jam3 for Discovery
- [Oracle OpenWorld Experiment](http://theappslab.com/2016/10/10/how-i-attended-oracle-openworld-2016/) by Ed Jones for Oracle
- [Pablo The Flamingo](http://pablotheflamingo.com/) by Nathan Gordon
- [Goblins and Grottos](http://store.steampowered.com/app/389190) by Psychic Software
- [masQueLaCara](https://www.instagram.com/p/BCFqCs6JNsq/) by Zach Lieberman for Art Blocks Houston
- [#GIFMYLIVE](http://bonhommeparis.com/en/projects/arte-gifmylive) by Bonhomme for Arte
- [Hype](http://tumult.com/hype/pro/) by Tumult
- [Patrick Heng](https://patrickheng.com/) by Patrick Heng
- [USELESS](https://useless.london/) by Nice and Serious
- [Secret 7](https://secret-7.com/) by Goodness
- [New Company](https://www.new.company/) by New Company
- [Game of The Year](https://gameoftheyear.withgoogle.com/) by Google
- [Pablo The Flamingo](https://pablotheflamingo.com/) by Nathan Gordon
- [Les métamorphoses de Mr. Kalia](https://lab212.org/oeuvres/2:art/18/Les-metamorphoses-de-Mr-Kalia) by Lab212
- [Phaser](https://phaser.io/) by Photon Storm
- [Sorry I Have No Filter](https://sorryihavenofilter.com/pages/about/) by Jessica Walsh
- [Fuse](https://fuse.blog/) by Fuse
- [Glyphfinder](https://www.glyphfinder.com/) by überdosis
- [Isolation](https://isolation.is/postcards/my-week) by sabato studio
- [more...](https://github.com/liabru/matter-js/wiki/Gallery)
### Features
@ -131,7 +137,7 @@ See the list of [tutorials](https://github.com/liabru/matter-js/wiki/Tutorials).
### Examples
See the [examples](https://github.com/liabru/matter-js/tree/master/examples) directory which contains the source for all [demos](#demos).
There are even more examples on [codepen](http://codepen.io/collection/Fuagy/).
There are even more examples on [codepen](https://codepen.io/collection/Fuagy/).
### Plugins
@ -144,11 +150,11 @@ The engine can be extended through plugins, see these resources:
### Documentation
See the [API Documentation](http://brm.io/matter-js/docs/) and the [wiki](https://github.com/liabru/matter-js/wiki)
See the [API Documentation](https://brm.io/matter-js/docs/) and the [wiki](https://github.com/liabru/matter-js/wiki)
### Building and Contributing
To build you must first install [node.js](http://nodejs.org/), then run
To build you must first install [node.js](https://nodejs.org/), then run
npm install
@ -168,7 +174,7 @@ See the wiki page on [References](https://github.com/liabru/matter-js/wiki/Refer
### License
Matter.js is licensed under [The MIT License (MIT)](http://opensource.org/licenses/MIT)
Matter.js is licensed under [The MIT License (MIT)](https://opensource.org/licenses/MIT)
Copyright (c) 2014 Liam Brummitt
This license is also supplied with the release and source code.

42
RELEASE.md Normal file
View file

@ -0,0 +1,42 @@
## ▲.●matter.js`0.15.0`
Release notes for `0.15.0`. See the release [readme](https://github.com/liabru/matter-js/blob/0.15.0/README.md) for further information.
### Highlights
- __Optimised performance up to ~30% boost vs. `0.14.2`__ ([#528](https://github.com/liabru/matter-js/pull/528)) ([#522](https://github.com/liabru/matter-js/pull/522)) ([#553](https://github.com/liabru/matter-js/pull/553))
- Added `Body.setCentre` ([2ec247b](https://github.com/liabru/matter-js/commit/2ec247b))
- Added `Constraint.pointAWorld` and `Constraint.pointBWorld` ([3c32969](https://github.com/liabru/matter-js/commit/3c32969))
- Changed default colour scheme ([d258411](https://github.com/liabru/matter-js/commit/d258411)) ([6dd5ec5](https://github.com/liabru/matter-js/commit/6dd5ec5))
- Fixed issues with decomp require ([0af1645](https://github.com/liabru/matter-js/commit/0af1645))
- Fixed issues with render pixel ratio ([d577477](https://github.com/liabru/matter-js/commit/d577477))
### Changes
See the release [compare page](https://github.com/liabru/matter-js/compare/0.14.2...0.15.0) and the [changelog](https://github.com/liabru/matter-js/blob/0.15.0/CHANGELOG.md) for a detailed list of all changes.
### Comparison
Differences in behaviour, quality and performance against the previous release `0.14.2`. For more information see [comparison method](https://github.com/liabru/matter-js/pull/794).
```ocaml
Output comparison of 41 examples against matter-js@0.14.2 build on last run
Similarity 100% Performance +33.6% Overlap +0.00%
airFriction · · avalanche · · ballPool · · bridge · · broadphase · · car · ·
catapult · · chains · · circleStack · · cloth · · collisionFiltering · ·
compositeManipulation · · compound · · compoundStack · · concave · · constraints · ·
doublePendulum · · events · · friction · · gravity · · gyro · ·
manipulation · · mixed · · newtonsCradle · · pyramid · · ragdoll · ·
raycasting · · restitution · · rounded · · sensors · · sleeping · ·
slingshot · · softBody · · sprites · · stack · · staticFriction · ·
stress · · stress2 · · timescale · · views · · wreckingBall · ·
where · no change ● extrinsics changed ◆ intrinsics changed
```
### Contributors
Many thanks to the [contributors](https://github.com/liabru/matter-js/compare/0.14.2...0.15.0) of this release, [past contributors](https://github.com/liabru/matter-js/graphs/contributors) as well those involved in the [community](https://github.com/liabru/matter-js/issues) for your input and support.

View file

@ -1,27 +0,0 @@
{
"name": "Matter",
"version": "0.14.2",
"homepage": "https://github.com/liabru/matter-js",
"authors": [
"Liam Brummitt <liam@brm.io> (http://brm.io/)"
],
"description": "a 2D rigid body physics engine for the web",
"main": "build/matter.js",
"keywords": [
"javascript",
"canvas",
"html5",
"physics",
"physics engine",
"game engine",
"rigid body physics"
],
"license": "MIT",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
]
}

File diff suppressed because it is too large Load diff

102
build/matter.min.js vendored

File diff suppressed because one or more lines are too long

View file

@ -16,6 +16,9 @@
<script type="text/javascript" src="./lib/decomp.js"></script>
<script type="text/javascript" src="./lib/pathseg.js"></script>
<!-- Examples -->
<script src="./js/Examples.js"></script>
<!-- Matter -->
<script src="../build/matter.js"></script>
@ -104,6 +107,10 @@
opacity: 0.5;
background: transparent !important;
}
.matter-demo canvas {
border: 1px solid rgba(255, 255, 255, 0.07);
}
</style>
</head>
<body>

View file

@ -100,6 +100,8 @@
examples: examples
});
window.MatterDemo = demo;
document.body.appendChild(demo.dom.root);
MatterTools.Demo.start(demo);

5699
demo/js/Examples.js Normal file

File diff suppressed because it is too large Load diff

3
demo/js/Server.js Normal file
View file

@ -0,0 +1,3 @@
// bundle entry point for the development server
Example = require('../../examples/index.js');
module.exports = require('../../src/module/main.js');

File diff suppressed because one or more lines are too long

View file

@ -41,13 +41,13 @@ Example.avalanche = function() {
var stack = Composites.stack(20, 20, 20, 5, 0, 0, function(x, y) {
return Bodies.circle(x, y, Common.random(10, 20), { friction: 0.00001, restitution: 0.5, density: 0.001 });
});
World.add(world, stack);
World.add(world, [
Bodies.rectangle(200, 150, 700, 20, { isStatic: true, angle: Math.PI * 0.06 }),
Bodies.rectangle(500, 350, 700, 20, { isStatic: true, angle: -Math.PI * 0.06 }),
Bodies.rectangle(340, 580, 700, 20, { isStatic: true, angle: Math.PI * 0.04 })
Bodies.rectangle(200, 150, 700, 20, { isStatic: true, angle: Math.PI * 0.06, render: { fillStyle: '#060a19' } }),
Bodies.rectangle(500, 350, 700, 20, { isStatic: true, angle: -Math.PI * 0.06, render: { fillStyle: '#060a19' } }),
Bodies.rectangle(340, 580, 700, 20, { isStatic: true, angle: Math.PI * 0.04, render: { fillStyle: '#060a19' } })
]);
// add mouse control

View file

@ -39,7 +39,7 @@ Example.ballPool = function() {
// add bodies
World.add(world, [
Bodies.rectangle(400, 600, 1200, 50.5, { isStatic: true })
Bodies.rectangle(400, 600, 1200, 50.5, { isStatic: true, render: { fillStyle: '#060a19' } })
]);
var stack = Composites.stack(100, 0, 10, 8, 10, 10, function(x, y) {

View file

@ -44,7 +44,7 @@ Example.bridge = function() {
density: 0.005,
frictionAir: 0.05,
render: {
fillStyle: '#575375'
fillStyle: '#060a19'
}
});
});

View file

@ -48,9 +48,9 @@ Example.car = function() {
World.add(world, Composites.car(350, 300, 150 * scale, 30 * scale, 30 * scale));
World.add(world, [
Bodies.rectangle(200, 150, 400, 20, { isStatic: true, angle: Math.PI * 0.06 }),
Bodies.rectangle(500, 350, 650, 20, { isStatic: true, angle: -Math.PI * 0.06 }),
Bodies.rectangle(300, 560, 600, 20, { isStatic: true, angle: Math.PI * 0.04 })
Bodies.rectangle(200, 150, 400, 20, { isStatic: true, angle: Math.PI * 0.06, render: { fillStyle: '#060a19' }}),
Bodies.rectangle(500, 350, 650, 20, { isStatic: true, angle: -Math.PI * 0.06, render: { fillStyle: '#060a19' }}),
Bodies.rectangle(300, 560, 600, 20, { isStatic: true, angle: Math.PI * 0.04, render: { fillStyle: '#060a19' }})
]);
// add mouse control

View file

@ -48,9 +48,9 @@ Example.catapult = function() {
World.add(world, [
stack,
catapult,
Bodies.rectangle(400, 600, 800, 50.5, { isStatic: true }),
Bodies.rectangle(250, 555, 20, 50, { isStatic: true }),
Bodies.rectangle(400, 535, 20, 80, { isStatic: true, collisionFilter: { group: group } }),
Bodies.rectangle(400, 600, 800, 50.5, { isStatic: true, render: { fillStyle: '#060a19' } }),
Bodies.rectangle(250, 555, 20, 50, { isStatic: true, render: { fillStyle: '#060a19' } }),
Bodies.rectangle(400, 535, 20, 80, { isStatic: true, collisionFilter: { group: group }, render: { fillStyle: '#060a19' } }),
Bodies.circle(560, 100, 50, { density: 0.005 }),
Constraint.create({
bodyA: catapult,

View file

@ -43,8 +43,8 @@ Example.cloth = function() {
World.add(world, [
cloth,
Bodies.circle(300, 500, 80, { isStatic: true }),
Bodies.rectangle(500, 480, 80, 80, { isStatic: true }),
Bodies.circle(300, 500, 80, { isStatic: true, render: { fillStyle: '#060a19' }}),
Bodies.rectangle(500, 480, 80, 80, { isStatic: true, render: { fillStyle: '#060a19' }}),
Bodies.rectangle(400, 609, 800, 50, { isStatic: true })
]);

View file

@ -23,8 +23,7 @@ Example.collisionFiltering = function() {
options: {
width: 800,
height: 600,
wireframes: false,
background: '#111'
wireframes: false
}
});
@ -40,9 +39,9 @@ Example.collisionFiltering = function() {
greenCategory = 0x0004,
blueCategory = 0x0008;
var redColor = '#C44D58',
blueColor = '#4ECDC4',
greenColor = '#C7F464';
var colorA = '#f55a3c',
colorB = '#063e7b',
colorC = '#f5d259';
// add floor
World.add(world, Bodies.rectangle(400, 600, 900, 50, {
@ -57,14 +56,14 @@ Example.collisionFiltering = function() {
World.add(world,
Composites.stack(275, 100, 5, 9, 10, 10, function(x, y, column, row) {
var category = redCategory,
color = redColor;
color = colorA;
if (row > 5) {
category = blueCategory;
color = blueColor;
color = colorB;
} else if (row > 2) {
category = greenCategory;
color = greenColor;
color = colorC;
}
return Bodies.circle(x, y, 20, {
@ -87,7 +86,7 @@ Example.collisionFiltering = function() {
mask: defaultCategory | greenCategory
},
render: {
fillStyle: greenColor
fillStyle: colorC
}
})
);
@ -99,7 +98,7 @@ Example.collisionFiltering = function() {
mask: defaultCategory | redCategory
},
render: {
fillStyle: redColor
fillStyle: colorA
}
})
);
@ -111,7 +110,7 @@ Example.collisionFiltering = function() {
mask: defaultCategory | blueCategory
},
render: {
fillStyle: blueColor
fillStyle: colorB
}
})
);

View file

@ -47,7 +47,7 @@ Example.concave = function() {
horseShoe = Vertices.fromPath('35 7 19 17 14 38 14 58 25 79 45 85 65 84 65 66 46 67 34 59 30 44 33 29 45 23 66 23 66 7 53 7');
var stack = Composites.stack(50, 50, 6, 4, 10, 10, function(x, y) {
var color = Common.choose(['#556270', '#4ECDC4', '#C7F464', '#FF6B6B', '#C44D58']);
var color = Common.choose(['#f19648', '#f5d259', '#f55a3c', '#063e7b', '#ececd1']);
return Bodies.fromVertices(x, y, Common.choose([arrow, chevron, star, horseShoe]), {
render: {
fillStyle: color,

View file

@ -26,8 +26,7 @@ Example.doublePendulum = function() {
options: {
width: 800,
height: 600,
wireframes: false,
background: '#0f0f13'
wireframes: false
}
});
@ -54,9 +53,6 @@ Example.doublePendulum = function() {
});
});
pendulum.bodies[0].render.strokeStyle = '#4a485b';
pendulum.bodies[1].render.strokeStyle = '#4a485b';
world.gravity.scale = 0.002;
Composites.chain(pendulum, 0.45, 0, -0.45, 0, {

View file

@ -40,17 +40,17 @@ Example.friction = function() {
]);
World.add(world, [
Bodies.rectangle(300, 180, 700, 20, { isStatic: true, angle: Math.PI * 0.06 }),
Bodies.rectangle(300, 180, 700, 20, { isStatic: true, angle: Math.PI * 0.06, render: { fillStyle: '#060a19' } }),
Bodies.rectangle(300, 70, 40, 40, { friction: 0.001 })
]);
World.add(world, [
Bodies.rectangle(300, 350, 700, 20, { isStatic: true, angle: Math.PI * 0.06 }),
Bodies.rectangle(300, 350, 700, 20, { isStatic: true, angle: Math.PI * 0.06, render: { fillStyle: '#060a19' } }),
Bodies.rectangle(300, 250, 40, 40, { friction: 0.0005 })
]);
World.add(world, [
Bodies.rectangle(300, 520, 700, 20, { isStatic: true, angle: Math.PI * 0.06 }),
Bodies.rectangle(300, 520, 700, 20, { isStatic: true, angle: Math.PI * 0.06, render: { fillStyle: '#060a19' } }),
Bodies.rectangle(300, 430, 40, 40, { friction: 0 })
]);

View file

@ -35,15 +35,15 @@ Example.manipulation = function() {
Runner.run(runner, engine);
// add bodies
var bodyA = Bodies.rectangle(100, 200, 50, 50, { isStatic: true }),
var bodyA = Bodies.rectangle(100, 200, 50, 50, { isStatic: true, render: { fillStyle: '#060a19' } }),
bodyB = Bodies.rectangle(200, 200, 50, 50),
bodyC = Bodies.rectangle(300, 200, 50, 50),
bodyD = Bodies.rectangle(400, 200, 50, 50),
bodyE = Bodies.rectangle(550, 200, 50, 50),
bodyF = Bodies.rectangle(700, 200, 50, 50),
bodyG = Bodies.circle(400, 100, 25),
partA = Bodies.rectangle(600, 200, 120, 50),
partB = Bodies.rectangle(660, 200, 50, 190),
bodyG = Bodies.circle(400, 100, 25, { render: { fillStyle: '#060a19' } }),
partA = Bodies.rectangle(600, 200, 120, 50, { render: { fillStyle: '#060a19' } }),
partB = Bodies.rectangle(660, 200, 50, 190, { render: { fillStyle: '#060a19' } }),
compound = Body.create({
parts: [partA, partB],
isStatic: true

View file

@ -27,8 +27,7 @@ Example.ragdoll = function() {
options: {
width: 800,
height: 600,
showAngleIndicator: true,
background: '#0f0f13'
showAngleIndicator: true
}
});
@ -45,7 +44,9 @@ Example.ragdoll = function() {
return Bodies.rectangle(x - 50, y + column * 50, 100, 1000, {
isStatic: true,
render: {
fillStyle: '#222'
fillStyle: '#060a19',
strokeStyle: '#ffffff',
lineWidth: 1
}
});
});
@ -55,7 +56,7 @@ Example.ragdoll = function() {
var sides = Math.round(Common.random(1, 8)),
options = {
render: {
fillStyle: Common.choose(['#006BA6', '#0496FF', '#D81159', '#8F2D56'])
fillStyle: Common.choose(['#f19648', '#f5d259', '#f55a3c', '#063e7b', '#ececd1'])
}
};

View file

@ -21,8 +21,7 @@ Example.sensors = function() {
options: {
width: 800,
height: 600,
wireframes: false,
background: '#111'
wireframes: false
}
});
@ -33,14 +32,14 @@ Example.sensors = function() {
Runner.run(runner, engine);
// add bodies
var redColor = '#C44D58',
greenColor = '#C7F464';
var colorA = '#f55a3c',
colorB = '#f5d259';
var collider = Bodies.rectangle(400, 300, 500, 50, {
isSensor: true,
isStatic: true,
render: {
strokeStyle: redColor,
strokeStyle: colorA,
fillStyle: 'transparent',
lineWidth: 1
}
@ -48,11 +47,11 @@ Example.sensors = function() {
World.add(world, [
collider,
Bodies.rectangle(400, 620, 800, 50, {
Bodies.rectangle(400, 600, 800, 50, {
isStatic: true,
render: {
fillStyle: 'transparent',
lineWidth: 1
fillStyle: '#060a19',
lineWidth: 0
}
})
]);
@ -60,7 +59,7 @@ Example.sensors = function() {
World.add(world,
Bodies.circle(400, 40, 30, {
render: {
strokeStyle: greenColor,
strokeStyle: colorB,
fillStyle: 'transparent',
lineWidth: 1
}
@ -74,9 +73,9 @@ Example.sensors = function() {
var pair = pairs[i];
if (pair.bodyA === collider) {
pair.bodyB.render.strokeStyle = redColor;
pair.bodyB.render.strokeStyle = colorA;
} else if (pair.bodyB === collider) {
pair.bodyA.render.strokeStyle = redColor;
pair.bodyA.render.strokeStyle = colorA;
}
}
});
@ -88,9 +87,9 @@ Example.sensors = function() {
var pair = pairs[i];
if (pair.bodyA === collider) {
pair.bodyB.render.strokeStyle = greenColor;
pair.bodyB.render.strokeStyle = colorB;
} else if (pair.bodyB === collider) {
pair.bodyA.render.strokeStyle = greenColor;
pair.bodyA.render.strokeStyle = colorB;
}
}
});

View file

@ -34,7 +34,7 @@ Example.slingshot = function() {
Runner.run(runner, engine);
// add bodies
var ground = Bodies.rectangle(395, 600, 815, 50, { isStatic: true }),
var ground = Bodies.rectangle(395, 600, 815, 50, { isStatic: true, render: { fillStyle: '#060a19' } }),
rockOptions = { density: 0.004 },
rock = Bodies.polygon(170, 450, 8, 20, rockOptions),
anchor = { x: 170, y: 450 },
@ -48,7 +48,7 @@ Example.slingshot = function() {
return Bodies.rectangle(x, y, 25, 40);
});
var ground2 = Bodies.rectangle(610, 250, 200, 20, { isStatic: true });
var ground2 = Bodies.rectangle(610, 250, 200, 20, { isStatic: true, render: { fillStyle: '#060a19' } });
var pyramid2 = Composites.pyramid(550, 0, 5, 10, 0, 0, function(x, y) {
return Bodies.rectangle(x, y, 25, 40);

View file

@ -22,7 +22,6 @@ Example.sprites = function() {
options: {
width: 800,
height: 600,
background: '#0f0f13',
showAngleIndicator: false,
wireframes: false
}

View file

@ -34,7 +34,7 @@ Example.staticFriction = function() {
Runner.run(runner, engine);
// add bodies
var body = Bodies.rectangle(400, 500, 200, 60, { isStatic: true, chamfer: 10 }),
var body = Bodies.rectangle(400, 500, 200, 60, { isStatic: true, chamfer: 10, render: { fillStyle: '#060a19' } }),
size = 50,
counter = -1;

View file

@ -45,7 +45,7 @@ Example.svg = function() {
(function(i) {
$.get('./svg/' + svgs[i] + '.svg').done(function(data) {
var vertexSets = [],
color = Common.choose(['#556270', '#4ECDC4', '#C7F464', '#FF6B6B', '#C44D58']);
color = Common.choose(['#f19648', '#f5d259', '#f55a3c', '#063e7b', '#ececd1']);
$(data).find('path').each(function(i, path) {
var points = Svg.pathToVertices(path, 30);
@ -65,7 +65,7 @@ Example.svg = function() {
$.get('./svg/svg.svg').done(function(data) {
var vertexSets = [],
color = Common.choose(['#556270', '#4ECDC4', '#C7F464', '#FF6B6B', '#C44D58']);
color = Common.choose(['#f19648', '#f5d259', '#f55a3c', '#063e7b', '#ececd1']);
$(data).find('path').each(function(i, path) {
vertexSets.push(Svg.pathToVertices(path, 30));

View file

@ -47,8 +47,8 @@ Example.terrain = function() {
terrain = Bodies.fromVertices(400, 350, vertexSets, {
isStatic: true,
render: {
fillStyle: '#2e2b44',
strokeStyle: '#2e2b44',
fillStyle: '#060a19',
strokeStyle: '#060a19',
lineWidth: 1
}
}, true);
@ -106,5 +106,5 @@ Example.terrain = function() {
};
if (typeof module !== 'undefined') {
module.exports = Example;
module.exports = Example[Object.keys(Example)[0]];
}

10350
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{
"name": "matter-js",
"version": "0.14.2",
"version": "0.15.0",
"license": "MIT",
"homepage": "http://brm.io/matter-js/",
"author": "Liam Brummitt <liam@brm.io> (http://brm.io/)",
@ -20,30 +20,35 @@
"rigid body physics"
],
"devDependencies": {
"conventional-changelog-cli": "^2.1.1",
"eslint": "^6.8.0",
"gulp": "^4.0.2",
"gulp-bump": "^2.6.1",
"gulp-conventional-changelog": "^1.1.0",
"gulp-tag-version": "^1.3.0",
"gulp-util": "^3.0.8",
"jest": "^25.1.0",
"jest-worker": "^24.9.0",
"json-stringify-pretty-compact": "^2.0.0",
"run-sequence": "^1.1.4",
"webpack": "^4.42.0",
"puppeteer-core": "^5.5.0",
"run-sequence": "^2.2.1",
"webpack": "^4.44.2",
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3"
"webpack-dev-server": "^3.11.0"
},
"scripts": {
"dev": "webpack-dev-server --watch-content-base",
"build": "webpack --mode=production & webpack --mode=production --env.MINIMIZE",
"build-alpha": "webpack --mode=production --env.ALPHA & webpack --mode=production --env.MINIMIZE --env.ALPHA",
"build-examples": "webpack --config webpack.examples.config.js --mode=production --env.ALPHA & webpack --config webpack.examples.config.js --mode=production --env.MINIMIZE --env.ALPHA",
"lint": "eslint 'src/**/*.js' 'demo/js/Demo.js' 'demo/js/Compare.js' 'examples/*.js' 'webpack.*.js' 'Gulpfile.js'",
"doc": "gulp doc",
"test": "jest",
"test-save": "SAVE=true jest",
"test-watch": "jest --watch"
"build-examples": "webpack --config webpack.examples.config.js --mode=production & webpack --config webpack.examples.config.js --mode=production --env.MINIMIZE",
"build-examples-alpha": "webpack --config webpack.examples.config.js --mode=production --env.ALPHA & webpack --config webpack.examples.config.js --mode=production --env.MINIMIZE --env.ALPHA",
"lint": "eslint 'src/**/*.js' 'demo/js/Demo.js' 'demo/js/Compare.js' 'examples/*.js' 'webpack.*.js'",
"doc": "yuidoc --config yuidoc.json --project-version $npm_package_version",
"test": "npm run test-node",
"test-all": "jest",
"test-save": "SAVE=true npm run test-node",
"test-watch": "npm run test-node -- --watch",
"test-node": "jest ./test/Examples.spec.js",
"test-browser": "jest ./test/Browser.spec.js",
"changelog": "conventional-changelog -i CHANGELOG.md -s -r",
"release": "npm version --no-git-tag-version",
"preversion": "git checkout master && npm run lint && SAVE=true npm run test-all",
"version": "git checkout -b release/$npm_package_version && npm run build"
},
"dependencies": {},
"files": [

View file

@ -75,13 +75,15 @@ var Axes = require('../geometry/Axes');
render: {
visible: true,
opacity: 1,
strokeStyle: null,
fillStyle: null,
lineWidth: null,
sprite: {
xScale: 1,
yScale: 1,
xOffset: 0,
yOffset: 0
},
lineWidth: 0
}
},
events: null,
bounds: null,
@ -165,10 +167,12 @@ var Axes = require('../geometry/Axes');
});
// render properties
var defaultFillStyle = (body.isStatic ? '#2e2b44' : Common.choose(['#006BA6', '#0496FF', '#FFBC42', '#D81159', '#8F2D56'])),
defaultStrokeStyle = '#000';
var defaultFillStyle = (body.isStatic ? '#14151f' : Common.choose(['#f19648', '#f5d259', '#f55a3c', '#063e7b', '#ececd1'])),
defaultStrokeStyle = body.isStatic ? '#555' : '#ccc',
defaultLineWidth = body.isStatic && body.render.fillStyle === null ? 1 : 0;
body.render.fillStyle = body.render.fillStyle || defaultFillStyle;
body.render.strokeStyle = body.render.strokeStyle || defaultStrokeStyle;
body.render.lineWidth = body.render.lineWidth || defaultLineWidth;
body.render.sprite.xOffset += -(body.bounds.min.x - body.position.x) / (body.bounds.max.x - body.bounds.min.x);
body.render.sprite.yOffset += -(body.bounds.min.y - body.position.y) / (body.bounds.max.y - body.bounds.min.y);
};

View file

@ -196,7 +196,8 @@ var Vector = require('../geometry/Vector');
* @return {body}
*/
Bodies.fromVertices = function(x, y, vertexSets, options, flagInternal, removeCollinear, minimumArea) {
var decomp = global.decomp || require('poly-decomp'),
var globals = typeof global !== 'undefined' ? global : window,
decomp,
body,
parts,
isConvex,
@ -207,6 +208,12 @@ var Vector = require('../geometry/Vector');
v,
z;
try {
decomp = globals.decomp || require('poly-decomp');
} catch (e) {
// decomp is undefined
}
options = options || {};
parts = [];

View file

@ -52,8 +52,8 @@ var Mouse = require('../core/Mouse');
width: 800,
height: 600,
pixelRatio: 1,
background: '#18181d',
wireframeBackground: '#0f0f13',
background: '#14151f',
wireframeBackground: '#14151f',
hasBounds: !!options.bounds,
enabled: true,
wireframes: true,

90
test/Browser.spec.js Normal file
View file

@ -0,0 +1,90 @@
/* eslint-env es6 */
"use strict";
jest.setTimeout(120 * 1000);
const puppeteer = require('puppeteer-core');
const Example = require('../examples/index');
const fs = require('fs');
const examples = Object.keys(Example);
const browserPath = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome';
const demoPagePath = 'http://localhost:8000/';
const totalUpdates = 5;
if (!fs.existsSync(browserPath)) {
// Skip if browser is missing
console.warn('Could not find browser. Browser tests skipped.');
describe.skip('Browser integration tests');
} else {
describe('Browser integration tests', () => {
let results;
// Set up the environment and run examples
beforeAll(async () => results = await runExamplesBrowser(totalUpdates));
it('all examples run without throwing error', () => {
if (results.error) {
console.error(results.error);
expect(!results.error).toBe(true);
} else {
for (const example of examples) {
expect(results[example].id).toBe(example);
expect(results[example].timestamp).toBeGreaterThan(0);
}
}
});
});
}
const runExamplesBrowser = async updates => {
// Set up browser environment
const browser = await puppeteer.launch({ executablePath: browserPath });
const page = await browser.newPage();
const results = {};
// Load local demo page and catch errors
let pageError;
const onPageError = error => pageError = error;
page.addListener('pageerror', onPageError);
await page.goto(demoPagePath).catch(onPageError);
// For every example
for (const example of examples) {
// Bail on error
if (pageError) {
break;
}
// In the demo page context
results[example] = await page.evaluate(async (example, updates) => {
// Set the current example
MatterTools.Demo.setExampleById(MatterDemo, example);
const instance = MatterDemo.example.instance;
let ticks = 0;
// Wait while running
await new Promise((resolve) => {
Matter.Events.on(instance.runner, 'tick', () => {
// Stop after enough updates
if (ticks >= updates) {
Matter.Runner.stop(instance.runner);
resolve();
}
ticks += 1;
});
});
// Return results
return {
id: MatterDemo.example.id,
timestamp: instance.engine.timing.timestamp
};
}, example, updates);
}
// Tear down
await browser.close();
return pageError ? { error: pageError } : results;
};

View file

@ -145,13 +145,18 @@ const captureSimilarityExtrinsic = (currentCaptures, referenceCaptures) => {
return result;
};
const writeCaptures = (name, obj) => {
const writeResult = (name, obj) => {
try {
fs.mkdirSync(comparePath, { recursive: true });
} catch (err) {
if (err.code !== 'EEXIST') throw err;
}
fs.writeFileSync(`${comparePath}/${name}.json`, compactStringify(obj, { maxLength: 100 }), 'utf8');
if (typeof obj === 'string') {
fs.writeFileSync(`${comparePath}/${name}.md`, obj, 'utf8');
} else {
fs.writeFileSync(`${comparePath}/${name}.json`, compactStringify(obj, { maxLength: 100 }), 'utf8');
}
};
const toMatchExtrinsics = {
@ -242,34 +247,37 @@ const comparisonReport = (capturesDev, capturesBuild, buildVersion, save) => {
const overlapChange = (totalOverlapDev / (totalOverlapBuild || 1)) - 1;
if (save) {
writeCaptures('examples-dev', devIntrinsicsChanged);
writeCaptures('examples-build', buildIntrinsicsChanged);
}
return [
const report = (breakEvery, format) => [
[`Output comparison of ${similarityEntries.length}`,
`examples against ${color('matter-js@' + buildVersion, colors.Yellow)} build on last run`
`examples against ${format('matter-js@' + buildVersion, colors.Yellow)} build on last run`
].join(' '),
`\n\n${color('Similarity', colors.White)}`,
`${color(toPercent(similarityAvg), similarityAvg === 1 ? colors.Green : colors.Yellow)}%`,
`${color('Performance', colors.White)}`,
`${color((perfChange >= 0 ? '+' : '') + toPercent(perfChange), perfChange >= 0 ? colors.Green : colors.Red)}%`,
`${color('Overlap', colors.White)}`,
`${color((overlapChange >= 0 ? '+' : '') + toPercent(overlapChange), overlapChange > 0 ? colors.Red : colors.Green)}%`,
`\n\n${format('Similarity', colors.White)}`,
`${format(toPercent(similarityAvg), similarityAvg === 1 ? colors.Green : colors.Yellow)}%`,
`${format('Performance', colors.White)}`,
`${format((perfChange >= 0 ? '+' : '') + toPercent(perfChange), perfChange >= 0 ? colors.Green : colors.Red)}%`,
`${format('Overlap', colors.White)}`,
`${format((overlapChange >= 0 ? '+' : '') + toPercent(overlapChange), overlapChange > 0 ? colors.Red : colors.Green)}%`,
capturePerformance.reduce((output, p, i) => {
output += `${p.name} `;
output += `${similarityRatings(similaritys[p.name])} `;
output += `${changeRatings(capturesDev[p.name].changedIntrinsics)} `;
if (i > 0 && i < capturePerformance.length && i % 5 === 0) {
if (i > 0 && i < capturePerformance.length && breakEvery > 0 && i % breakEvery === 0) {
output += '\n';
}
return output;
}, '\n\n'),
`\nwhere · no change ● extrinsics changed ◆ intrinsics changed\n`,
similarityAvg < 1 ? `\n${color('▶', colors.White)} ${color(compareCommand + '=' + 120 + '#' + similarityEntries[0][0], colors.BrightCyan)}` : '',
intrinsicChangeCount > 0 ? `\n${color('▶', colors.White)} ${color((save ? diffCommand : diffSaveCommand), colors.BrightCyan)}` : ''
similarityAvg < 1 ? `\n${format('▶', colors.White)} ${format(compareCommand + '=' + 120 + '#' + similarityEntries[0][0], colors.BrightCyan)}` : '',
intrinsicChangeCount > 0 ? `\n${format('▶', colors.White)} ${format((save ? diffCommand : diffSaveCommand), colors.BrightCyan)}` : ''
].join(' ');
if (save) {
writeResult('examples-dev', devIntrinsicsChanged);
writeResult('examples-build', buildIntrinsicsChanged);
writeResult('examples-report', report(5, s => s));
}
return report(5, color);
};
module.exports = {

View file

@ -4,6 +4,7 @@
const webpack = require('webpack');
const path = require('path');
const pkg = require('./package.json');
const fs = require('fs');
const execSync = require('child_process').execSync;
module.exports = (env = {}) => {
@ -14,16 +15,19 @@ module.exports = (env = {}) => {
const commitHash = execSync('git rev-parse --short HEAD').toString().trim();
const version = !alpha ? pkg.version : `${pkg.version}-alpha+${commitHash}`;
const license = fs.readFileSync('LICENSE', 'utf8');
const date = new Date().toISOString().slice(0, 10);
const name = 'matter';
const alphaInfo = 'Experimental pre-release build.\n ';
const banner =
` ${pkg.name} ${version} by @liabru (c) ${date}
${alpha ? alphaInfo : ''}${pkg.homepage}
License ${pkg.license}`;
`${pkg.name} ${version} by @liabru ${date}
${alpha ? alphaInfo : ''}${pkg.homepage}
License ${pkg.license}${!minimize ? '\n\n' + license : ''}`;
const entry = isDevServer ? './demo/js/Server.js' : './src/module/main.js';
return {
entry: { [name]: './src/module/main.js' },
entry: { [name]: entry },
output: {
library: 'Matter',
libraryTarget: 'umd',

View file

@ -4,20 +4,24 @@
const webpack = require('webpack');
const path = require('path');
const pkg = require('./package.json');
const fs = require('fs');
const execSync = require('child_process').execSync;
module.exports = (env = {}) => {
const minimize = env.MINIMIZE || false;
const edge = env.EDGE || false;
const alpha = env.ALPHA || false;
const maxSize = minimize ? 100 * 1024 : 512 * 1024;
const commitHash = execSync('git rev-parse --short HEAD').toString().trim();
const version = !edge ? pkg.version : `${pkg.version}-alpha-${commitHash}`;
const version = !alpha ? pkg.version : `${pkg.version}-alpha+${commitHash}`;
const license = fs.readFileSync('LICENSE', 'utf8');
const date = new Date().toISOString().slice(0, 10);
const name = 'matter-examples';
const banner = `${name} ${version} by @liabru ${date}
${pkg.homepage}
License ${pkg.license}`;
const name = 'matter-js-examples';
const alphaInfo = 'Experimental pre-release build.\n ';
const banner =
`${name} ${version} by @liabru ${date}
${alpha ? alphaInfo : ''}${pkg.homepage}
License ${pkg.license}${!minimize ? '\n\n' + license : ''}`;
return {
entry: './examples/index.js',

View file

@ -4,7 +4,7 @@
"url": "http://brm.io/matter-js/",
"options": {
"linkNatives": true,
"outdir": "doc/build",
"outdir": "docs",
"themedir": "matter-doc-theme",
"paths": "src"
}