mage-engine 3.17.2 → 3.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/mage.js +174 -47
  2. package/package.json +1 -1
package/dist/mage.js CHANGED
@@ -55693,7 +55693,48 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
55693
55693
 
55694
55694
  return Physics;
55695
55695
  }(EventDispatcher);
55696
- var Physics$1 = new Physics();var Scene = /*#__PURE__*/function () {
55696
+ var Physics$1 = new Physics();var ENTITY_TYPES = {
55697
+ SCENE: 'SCENE',
55698
+ CAMERA: 'CAMERA',
55699
+ MESH: 'MESH',
55700
+ LIGHT: {
55701
+ DEFAULT: 'LIGHT.DEFAULT',
55702
+ AMBIENT: 'LIGHT.AMBIENT',
55703
+ SUN: 'LIGHT.SUN',
55704
+ HEMISPHERE: 'LIGHT.HEMISPHERE',
55705
+ POINT: 'LIGHT.POINT',
55706
+ SPOT: 'LIGHT.SPOT'
55707
+ },
55708
+ AUDIO: {
55709
+ DEFAULT: 'AUDIO.DEFAULT',
55710
+ AMBIENT: 'AUDIO.AMBIENT',
55711
+ DIRECTIONAL: 'AUDIO.DIRECTIONAL',
55712
+ BACKGROUND: 'AUDIO.BACKGROUND'
55713
+ },
55714
+ MODEL: 'MODEL',
55715
+ SPRITE: 'SPRITE',
55716
+ PARTICLE: 'PARTICLE',
55717
+ EFFECT: {
55718
+ PARTICLE: 'EFFECT.PARTICLE',
55719
+ SCENERY: 'EFFECT.SCENERY'
55720
+ },
55721
+ HELPER: {
55722
+ GRID: 'HELPER.GRID'
55723
+ },
55724
+ UNKNOWN: 'UNKNOWN'
55725
+ };
55726
+ var FLAT_ENTITY_TYPES = ['SCENE', 'CAMERA', 'MESH', 'LIGHT.DEFAULT', 'LIGHT.AMBIENT', 'LIGHT.SUN', 'LIGHT.HEMISPHERE', 'LIGHT.POINT', 'LIGHT.SPOT', 'AUDIO.DEFAULT', 'AUDIO.AMBIENT', 'AUDIO.DIRECTIONAL', 'AUDIO.BACKGROUND', 'MODEL', 'SPRITE', 'PARTICLE', 'EFFECT.PARTICLE', 'EFFECT.SCENERY', 'HELPER.GRID', 'UNKNOWN'];
55727
+ var ENTITY_EVENTS = {
55728
+ DISPOSE: 'DISPOSE',
55729
+ STATE_MACHINE: {
55730
+ CHANGE: 'STATE_MACHINE_CHANGE'
55731
+ },
55732
+ ANIMATION: {
55733
+ LOOP: 'LOOP',
55734
+ FINISHED: 'FINISHED'
55735
+ }
55736
+ };
55737
+ var DEFAULT_TAG = 'all';var Scene = /*#__PURE__*/function () {
55697
55738
  function Scene() {
55698
55739
  var _this = this;
55699
55740
 
@@ -55756,14 +55797,21 @@ var Physics$1 = new Physics();var Scene = /*#__PURE__*/function () {
55756
55797
 
55757
55798
  this.clock = new Clock();
55758
55799
  this.rendererElements = {};
55800
+ this.elements = [];
55759
55801
  this.clearColor = 0x000000;
55760
55802
  this.alpha = 1.0;
55761
55803
  this.shadowType = mapShadowTypeToShadowMap(DEFAULT_SHADOWTYPE);
55762
55804
  }
55763
55805
 
55764
55806
  _createClass(Scene, [{
55807
+ key: "getEntityType",
55808
+ value: function getEntityType() {
55809
+ return ENTITY_TYPES.SCENE;
55810
+ }
55811
+ }, {
55765
55812
  key: "createScene",
55766
- value: function createScene(name) {
55813
+ value: function createScene() {
55814
+ var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "LevelScene_".concat(Math.random());
55767
55815
  var fog = Config$1.fog();
55768
55816
  this.scene = new Scene$2();
55769
55817
  this.scene.name = name; // this.scene.overrideMaterial = null; // should be null by default, but it's not.
@@ -55772,6 +55820,16 @@ var Physics$1 = new Physics();var Scene = /*#__PURE__*/function () {
55772
55820
  this.fog(fog.color, fog.density);
55773
55821
  }
55774
55822
  }
55823
+ }, {
55824
+ key: "uuid",
55825
+ value: function uuid() {
55826
+ return this.scene.uuid;
55827
+ }
55828
+ }, {
55829
+ key: "getName",
55830
+ value: function getName() {
55831
+ return this.scene.name;
55832
+ }
55775
55833
  }, {
55776
55834
  key: "getScene",
55777
55835
  value: function getScene() {
@@ -55797,11 +55855,28 @@ var Physics$1 = new Physics();var Scene = /*#__PURE__*/function () {
55797
55855
  var addUniverse = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
55798
55856
  this.scene.add(body);
55799
55857
 
55858
+ if (element) {
55859
+ this.elements.push(element);
55860
+ }
55861
+
55800
55862
  if (addUniverse) {
55801
- Universe$1.set(element.getName(), element);
55802
- Universe$1.storeUUIDToElementNameReference(body.uuid, element.getName());
55863
+ var name = element.getName();
55864
+ Universe$1.set(name, element);
55865
+ Universe$1.storeUUIDToElementNameReference(body.uuid, name);
55803
55866
  }
55804
55867
  }
55868
+ }, {
55869
+ key: "getHierarchy",
55870
+ value: function getHierarchy() {
55871
+ return [{
55872
+ element: this,
55873
+ children: [this.getCamera().getHierarchy()].concat(_toConsumableArray(this.elements.filter(function (e) {
55874
+ return !e.hasParent() && !e.isHelper();
55875
+ }).map(function (e) {
55876
+ return e.getHierarchy();
55877
+ })))
55878
+ }];
55879
+ }
55805
55880
  }, {
55806
55881
  key: "remove",
55807
55882
  value: function remove(body) {
@@ -57128,7 +57203,7 @@ function applyMiddleware() {
57128
57203
 
57129
57204
  var thunk = createThunkMiddleware();
57130
57205
  thunk.withExtraArgument = createThunkMiddleware;var name = "mage-engine";
57131
- var version = "3.17.2";
57206
+ var version = "3.17.3";
57132
57207
  var description = "A WebGL Javascript Game Engine, built on top of THREE.js and many other libraries.";
57133
57208
  var main = "dist/mage.js";
57134
57209
  var author$1 = {
@@ -58665,25 +58740,7 @@ var Scripts = /*#__PURE__*/function () {
58665
58740
 
58666
58741
  return Scripts;
58667
58742
  }();
58668
- var Scripts$1 = new Scripts();var ENTITY_TYPES = {
58669
- MESH: 'MESH',
58670
- LIGHT: 'LIGHT',
58671
- MODEL: 'MODEL',
58672
- SPRITE: 'SPRITE',
58673
- PARTICLE: 'PARTICLE',
58674
- UNKNOWN: 'UNKNOWN'
58675
- };
58676
- var ENTITY_EVENTS = {
58677
- DISPOSE: 'DISPOSE',
58678
- STATE_MACHINE: {
58679
- CHANGE: 'STATE_MACHINE_CHANGE'
58680
- },
58681
- ANIMATION: {
58682
- LOOP: 'LOOP',
58683
- FINISHED: 'FINISHED'
58684
- }
58685
- };
58686
- var DEFAULT_TAG = 'all';var Entity = /*#__PURE__*/function (_EventDispatcher) {
58743
+ var Scripts$1 = new Scripts();var Entity = /*#__PURE__*/function (_EventDispatcher) {
58687
58744
  _inherits(Entity, _EventDispatcher);
58688
58745
 
58689
58746
  var _super = _createSuper(Entity);
@@ -58738,10 +58795,6 @@ var DEFAULT_TAG = 'all';var Entity = /*#__PURE__*/function (_EventDispatcher) {
58738
58795
  return _this.getEntityType() === ENTITY_TYPES.MESH;
58739
58796
  });
58740
58797
 
58741
- _defineProperty$1(_assertThisInitialized(_this), "isLight", function () {
58742
- return _this.getEntityType() === ENTITY_TYPES.LIGHT;
58743
- });
58744
-
58745
58798
  _defineProperty$1(_assertThisInitialized(_this), "isModel", function () {
58746
58799
  return _this.getEntityType() === ENTITY_TYPES.MODEL;
58747
58800
  });
@@ -58750,6 +58803,18 @@ var DEFAULT_TAG = 'all';var Entity = /*#__PURE__*/function (_EventDispatcher) {
58750
58803
  return _this.getEntityType() === ENTITY_TYPES.SPRITE;
58751
58804
  });
58752
58805
 
58806
+ _defineProperty$1(_assertThisInitialized(_this), "isLight", function () {
58807
+ return Object.values(ENTITY_TYPES.LIGHT).includes(_this.getEntityType());
58808
+ });
58809
+
58810
+ _defineProperty$1(_assertThisInitialized(_this), "isHelper", function () {
58811
+ return Object.values(ENTITY_TYPES.HELPER).includes(_this.getEntityType());
58812
+ });
58813
+
58814
+ _defineProperty$1(_assertThisInitialized(_this), "isEffect", function () {
58815
+ return Object.values(ENTITY_TYPES.EFFECT).includes(_this.getEntityType());
58816
+ });
58817
+
58753
58818
  _defineProperty$1(_assertThisInitialized(_this), "setQuaternion", function (_ref2) {
58754
58819
  var x = _ref2.x,
58755
58820
  y = _ref2.y,
@@ -58797,6 +58862,21 @@ var DEFAULT_TAG = 'all';var Entity = /*#__PURE__*/function (_EventDispatcher) {
58797
58862
  value: function setBody(body) {
58798
58863
  this.body = body;
58799
58864
  }
58865
+ }, {
58866
+ key: "hasParent",
58867
+ value: function hasParent() {
58868
+ return !!this.parent;
58869
+ }
58870
+ }, {
58871
+ key: "getParent",
58872
+ value: function getParent() {
58873
+ return this.parent;
58874
+ }
58875
+ }, {
58876
+ key: "setParent",
58877
+ value: function setParent(parent) {
58878
+ this.parent = parent;
58879
+ }
58800
58880
  }, {
58801
58881
  key: "add",
58802
58882
  value: function add(element) {
@@ -58806,6 +58886,8 @@ var DEFAULT_TAG = 'all';var Entity = /*#__PURE__*/function (_EventDispatcher) {
58806
58886
  var _add = function _add(toAdd) {
58807
58887
  _this2.children.push(toAdd);
58808
58888
 
58889
+ toAdd.setParent(_this2);
58890
+
58809
58891
  _this2.getBody().add(toAdd.getBody());
58810
58892
  };
58811
58893
 
@@ -58851,6 +58933,16 @@ var DEFAULT_TAG = 'all';var Entity = /*#__PURE__*/function (_EventDispatcher) {
58851
58933
  this.children.splice(index, 1);
58852
58934
  }
58853
58935
  }
58936
+ }, {
58937
+ key: "getHierarchy",
58938
+ value: function getHierarchy() {
58939
+ return {
58940
+ element: this,
58941
+ children: this.children.map(function (e) {
58942
+ return e.getHierarchy();
58943
+ })
58944
+ };
58945
+ }
58854
58946
  }, {
58855
58947
  key: "addTags",
58856
58948
  value: function addTags() {
@@ -59071,7 +59163,7 @@ var DEFAULT_TAG = 'all';var Entity = /*#__PURE__*/function (_EventDispatcher) {
59071
59163
  }, {
59072
59164
  key: "setEntityType",
59073
59165
  value: function setEntityType(type) {
59074
- if (Object.values(ENTITY_TYPES).includes(type)) {
59166
+ if (FLAT_ENTITY_TYPES.includes(type)) {
59075
59167
  this.entityType = type;
59076
59168
  } else {
59077
59169
  console.log(ENTITY_TYPE_NOT_ALLOWED);
@@ -59085,7 +59177,7 @@ var DEFAULT_TAG = 'all';var Entity = /*#__PURE__*/function (_EventDispatcher) {
59085
59177
  }
59086
59178
  }, {
59087
59179
  key: "addLight",
59088
- // TODO: sounds should become like particle emitters
59180
+ // TODO: sounds should become entities
59089
59181
  // addSound(name, options) {
59090
59182
  // const { autoplay = false, ...opts } = options;
59091
59183
  // this.isPlayingSound = autoplay;
@@ -61004,6 +61096,10 @@ var Element = /*#__PURE__*/function (_Entity) {
61004
61096
 
61005
61097
  _this.setBody(new PerspectiveCamera(fov, ratio, near, far));
61006
61098
 
61099
+ _this.setEntityType(ENTITY_TYPES.CAMERA);
61100
+
61101
+ _this.setName(name);
61102
+
61007
61103
  return _this;
61008
61104
  }
61009
61105
 
@@ -61057,7 +61153,8 @@ var Element = /*#__PURE__*/function (_Entity) {
61057
61153
  size: size,
61058
61154
  division: division,
61059
61155
  color1: color1,
61060
- color2: color2
61156
+ color2: color2,
61157
+ name: "GridHelper_".concat(Math.random())
61061
61158
  };
61062
61159
  _this = _super.call(this, null, null, options);
61063
61160
  var body = new GridHelper(size, division, color1, color2);
@@ -61066,7 +61163,7 @@ var Element = /*#__PURE__*/function (_Entity) {
61066
61163
  body: body
61067
61164
  });
61068
61165
 
61069
- _this.setEntityType(ENTITY_TYPES.MESH);
61166
+ _this.setEntityType(ENTITY_TYPES.HELPER.GRID);
61070
61167
 
61071
61168
  return _this;
61072
61169
  }
@@ -73662,7 +73759,7 @@ var Light = /*#__PURE__*/function (_Entity) {
73662
73759
 
73663
73760
  _this.target = undefined;
73664
73761
 
73665
- _this.setEntityType(ENTITY_TYPES.LIGHT);
73762
+ _this.setEntityType(ENTITY_TYPES.LIGHT.DEFAULT);
73666
73763
 
73667
73764
  Lights$1.add(_assertThisInitialized(_this));
73668
73765
  return _this;
@@ -73837,7 +73934,8 @@ var SunLight = /*#__PURE__*/function (_Light) {
73837
73934
  color = _options$color === void 0 ? WHITE$3 : _options$color,
73838
73935
  _options$intensity = options.intensity,
73839
73936
  intensity = _options$intensity === void 0 ? DEFAULT_INTENSITY$4 : _options$intensity,
73840
- name = options.name;
73937
+ _options$name = options.name,
73938
+ name = _options$name === void 0 ? "SunLight_".concat(Math.random()) : _options$name;
73841
73939
  _this = _super.call(this, {
73842
73940
  color: color,
73843
73941
  intensity: intensity,
@@ -73850,6 +73948,10 @@ var SunLight = /*#__PURE__*/function (_Light) {
73850
73948
  intensity: intensity
73851
73949
  });
73852
73950
 
73951
+ _this.setEntityType(ENTITY_TYPES.LIGHT.SUN);
73952
+
73953
+ _this.setName(name);
73954
+
73853
73955
  return _this;
73854
73956
  }
73855
73957
 
@@ -74000,7 +74102,8 @@ var AmbientLight = /*#__PURE__*/function (_Light) {
74000
74102
  color = _options$color === void 0 ? WHITE$2 : _options$color,
74001
74103
  _options$intensity = options.intensity,
74002
74104
  intensity = _options$intensity === void 0 ? DEFAULT_INTENSITY$3 : _options$intensity,
74003
- name = options.name;
74105
+ _options$name = options.name,
74106
+ name = _options$name === void 0 ? "AmbientLight_".concat(Math.random()) : _options$name;
74004
74107
  _this = _super.call(this, {
74005
74108
  color: color,
74006
74109
  intensity: intensity,
@@ -74013,6 +74116,10 @@ var AmbientLight = /*#__PURE__*/function (_Light) {
74013
74116
  intensity: intensity
74014
74117
  });
74015
74118
 
74119
+ _this.setEntityType(ENTITY_TYPES.LIGHT.AMBIENT);
74120
+
74121
+ _this.setName(name);
74122
+
74016
74123
  return _this;
74017
74124
  }
74018
74125
 
@@ -74099,7 +74206,8 @@ var PointLight = /*#__PURE__*/function (_Light) {
74099
74206
  color = _options$color === void 0 ? WHITE$1 : _options$color,
74100
74207
  _options$intensity = options.intensity,
74101
74208
  intensity = _options$intensity === void 0 ? DEFAULT_INTENSITY$2 : _options$intensity,
74102
- name = options.name,
74209
+ _options$name = options.name,
74210
+ name = _options$name === void 0 ? "PointLight_".concat(Math.random()) : _options$name,
74103
74211
  distance = options.distance,
74104
74212
  decay = options.decay;
74105
74213
  _this = _super.call(this, {
@@ -74116,6 +74224,10 @@ var PointLight = /*#__PURE__*/function (_Light) {
74116
74224
  decay: decay
74117
74225
  });
74118
74226
 
74227
+ _this.setEntityType(ENTITY_TYPES.LIGHT.POINT);
74228
+
74229
+ _this.setName(name);
74230
+
74119
74231
  return _this;
74120
74232
  }
74121
74233
 
@@ -76458,7 +76570,7 @@ var index$1=/*#__PURE__*/Object.freeze({__proto__:null,Emitter:k,Particle:P,Part
76458
76570
 
76459
76571
  _this.setName(name);
76460
76572
 
76461
- _this.setEntityType(ENTITY_TYPES.PARTICLE);
76573
+ _this.setEntityType(ENTITY_TYPES.EFFECT.PARTICLE);
76462
76574
 
76463
76575
  return _this;
76464
76576
  }
@@ -78402,7 +78514,7 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
78402
78514
  _this.scaleHandleGeometry = new BoxGeometry(0.125, 0.125, 0.125);
78403
78515
  _this.lineGeometry = new BufferGeometry();
78404
78516
 
78405
- _this.lineGeometry.addAttribute('position', new Float32BufferAttribute([0, 0, 0, 1, 0, 0], 3)); // Make unique material for each axis/color
78517
+ _this.lineGeometry.setAttribute('position', new Float32BufferAttribute([0, 0, 0, 1, 0, 0], 3)); // Make unique material for each axis/color
78406
78518
 
78407
78519
 
78408
78520
  _this.matInvisible = _this.gizmoMaterial.clone();
@@ -78521,14 +78633,14 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
78521
78633
  vertices.push(0, Math.cos(i / 32 * Math.PI) * radius, Math.sin(i / 32 * Math.PI) * radius);
78522
78634
  }
78523
78635
 
78524
- geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3));
78636
+ geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));
78525
78637
  return geometry;
78526
78638
  }
78527
78639
  }, {
78528
78640
  key: "createTranslateHelperGeometry",
78529
78641
  value: function createTranslateHelperGeometry(radius, arc) {
78530
78642
  var geometry = new BufferGeometry();
78531
- geometry.addAttribute('position', new Float32BufferAttribute([0, 0, 0, 1, 1, 1], 3));
78643
+ geometry.setAttribute('position', new Float32BufferAttribute([0, 0, 0, 1, 1, 1], 3));
78532
78644
  return geometry;
78533
78645
  }
78534
78646
  }, {
@@ -78667,7 +78779,7 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
78667
78779
 
78668
78780
  object.updateMatrix();
78669
78781
  var tempGeometry = object.geometry.clone();
78670
- tempGeometry.applyMatrix(object.matrix);
78782
+ tempGeometry.applyMatrix4(object.matrix);
78671
78783
  object.geometry = tempGeometry;
78672
78784
  object.position.set(0, 0, 0);
78673
78785
  object.rotation.set(0, 0, 0);
@@ -79359,7 +79471,7 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
79359
79471
  _this._quaternionStart = new Quaternion();
79360
79472
  _this._scaleStart = new Vector3$1();
79361
79473
  _this.isTransformControls = true;
79362
- Scene$1.add(_assertThisInitialized(_this), _assertThisInitialized(_this), false);
79474
+ Scene$1.add(_assertThisInitialized(_this), null, false);
79363
79475
  return _this;
79364
79476
  }
79365
79477
 
@@ -80677,8 +80789,8 @@ var Level = /*#__PURE__*/function (_EventDispatcher) {
80677
80789
  });
80678
80790
 
80679
80791
  _defineProperty$1(_assertThisInitialized(_this), "init", function () {
80680
- var path = _this.options.path;
80681
- Scene$1.create(path);
80792
+ _this.options.path;
80793
+ Scene$1.create(_this.getName());
80682
80794
  Scene$1.createCamera(new Camera());
80683
80795
 
80684
80796
  _this.enableInput();
@@ -80724,6 +80836,11 @@ var Level = /*#__PURE__*/function (_EventDispatcher) {
80724
80836
  }
80725
80837
 
80726
80838
  _createClass(Level, [{
80839
+ key: "getName",
80840
+ value: function getName() {
80841
+ return this.name;
80842
+ }
80843
+ }, {
80727
80844
  key: "prepareScene",
80728
80845
  value: function prepareScene() {}
80729
80846
  }, {
@@ -86560,7 +86677,8 @@ var SpotLight = /*#__PURE__*/function (_Light) {
86560
86677
  color = _options$color === void 0 ? WHITE : _options$color,
86561
86678
  _options$intensity = options.intensity,
86562
86679
  intensity = _options$intensity === void 0 ? DEFAULT_INTENSITY$1 : _options$intensity,
86563
- name = options.name;
86680
+ _options$name = options.name,
86681
+ name = _options$name === void 0 ? "SpotLight_".concat(Math.random()) : _options$name;
86564
86682
  _this = _super.call(this, {
86565
86683
  color: color,
86566
86684
  intensity: intensity,
@@ -86573,6 +86691,10 @@ var SpotLight = /*#__PURE__*/function (_Light) {
86573
86691
  intensity: intensity
86574
86692
  });
86575
86693
 
86694
+ _this.setEntityType(ENTITY_TYPES.LIGHT.SPOT);
86695
+
86696
+ _this.setName(name);
86697
+
86576
86698
  return _this;
86577
86699
  }
86578
86700
 
@@ -86728,7 +86850,8 @@ var HemisphereLight = /*#__PURE__*/function (_Light) {
86728
86850
  } : _options$color,
86729
86851
  _options$intensity = options.intensity,
86730
86852
  intensity = _options$intensity === void 0 ? DEFAULT_INTENSITY : _options$intensity,
86731
- name = options.name;
86853
+ _options$name = options.name,
86854
+ name = _options$name === void 0 ? "HemisphereLight_".concat(Math.random()) : _options$name;
86732
86855
  _this = _super.call(this, {
86733
86856
  color: color,
86734
86857
  intensity: intensity,
@@ -86741,6 +86864,10 @@ var HemisphereLight = /*#__PURE__*/function (_Light) {
86741
86864
  intensity: intensity
86742
86865
  });
86743
86866
 
86867
+ _this.setEntityType(ENTITY_TYPES.LIGHT.HEMISPHERE);
86868
+
86869
+ _this.setName(name);
86870
+
86744
86871
  return _this;
86745
86872
  }
86746
86873
 
@@ -88187,7 +88314,7 @@ var Sky = /*#__PURE__*/function (_Element) {
88187
88314
  body: body
88188
88315
  });
88189
88316
 
88190
- _this.setEntityType(ENTITY_TYPES.MESH);
88317
+ _this.setEntityType(ENTITY_TYPES.EFFECT.SCENERY);
88191
88318
 
88192
88319
  _this.setScale({
88193
88320
  x: scale,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mage-engine",
3
- "version": "3.17.2",
3
+ "version": "3.17.3",
4
4
  "description": "A WebGL Javascript Game Engine, built on top of THREE.js and many other libraries.",
5
5
  "main": "dist/mage.js",
6
6
  "author": {