matrix-engine-wgpu 1.1.1 → 1.2.0

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 (124) hide show
  1. package/examples/games/jamb/html-content.js +123 -0
  2. package/examples/games/jamb/jamb.js +240 -87
  3. package/examples/unlit-textures.js +18 -17
  4. package/main.js +503 -453
  5. package/package.json +1 -1
  6. package/public/app.js +706 -192
  7. package/public/css/style.css +229 -80
  8. package/public/examples.js +609 -187
  9. package/public/index.html +0 -3
  10. package/public/res/audios/kenney/Kenney.url +2 -0
  11. package/public/res/audios/kenney/License.txt +22 -0
  12. package/public/res/audios/kenney/Patreon.url +2 -0
  13. package/public/res/audios/kenney/audios/back_001.ogg +0 -0
  14. package/public/res/audios/kenney/audios/back_002.ogg +0 -0
  15. package/public/res/audios/kenney/audios/back_003.ogg +0 -0
  16. package/public/res/audios/kenney/audios/back_004.ogg +0 -0
  17. package/public/res/audios/kenney/audios/bong_001.ogg +0 -0
  18. package/public/res/audios/kenney/audios/click_001.ogg +0 -0
  19. package/public/res/audios/kenney/audios/click_002.ogg +0 -0
  20. package/public/res/audios/kenney/audios/click_003.ogg +0 -0
  21. package/public/res/audios/kenney/audios/click_004.ogg +0 -0
  22. package/public/res/audios/kenney/audios/click_005.ogg +0 -0
  23. package/public/res/audios/kenney/audios/close_001.ogg +0 -0
  24. package/public/res/audios/kenney/audios/close_002.ogg +0 -0
  25. package/public/res/audios/kenney/audios/close_003.ogg +0 -0
  26. package/public/res/audios/kenney/audios/close_004.ogg +0 -0
  27. package/public/res/audios/kenney/audios/confirmation_001.ogg +0 -0
  28. package/public/res/audios/kenney/audios/confirmation_002.ogg +0 -0
  29. package/public/res/audios/kenney/audios/confirmation_003.ogg +0 -0
  30. package/public/res/audios/kenney/audios/confirmation_004.ogg +0 -0
  31. package/public/res/audios/kenney/audios/drop_001.ogg +0 -0
  32. package/public/res/audios/kenney/audios/drop_002.ogg +0 -0
  33. package/public/res/audios/kenney/audios/drop_003.ogg +0 -0
  34. package/public/res/audios/kenney/audios/drop_004.ogg +0 -0
  35. package/public/res/audios/kenney/audios/error_001.ogg +0 -0
  36. package/public/res/audios/kenney/audios/error_002.ogg +0 -0
  37. package/public/res/audios/kenney/audios/error_003.ogg +0 -0
  38. package/public/res/audios/kenney/audios/error_004.ogg +0 -0
  39. package/public/res/audios/kenney/audios/error_005.ogg +0 -0
  40. package/public/res/audios/kenney/audios/error_006.ogg +0 -0
  41. package/public/res/audios/kenney/audios/error_007.ogg +0 -0
  42. package/public/res/audios/kenney/audios/error_008.ogg +0 -0
  43. package/public/res/audios/kenney/audios/glass_001.ogg +0 -0
  44. package/public/res/audios/kenney/audios/glass_002.ogg +0 -0
  45. package/public/res/audios/kenney/audios/glass_003.ogg +0 -0
  46. package/public/res/audios/kenney/audios/glass_004.ogg +0 -0
  47. package/public/res/audios/kenney/audios/glass_005.ogg +0 -0
  48. package/public/res/audios/kenney/audios/glass_006.ogg +0 -0
  49. package/public/res/audios/kenney/audios/glitch_001.ogg +0 -0
  50. package/public/res/audios/kenney/audios/glitch_002.ogg +0 -0
  51. package/public/res/audios/kenney/audios/glitch_003.ogg +0 -0
  52. package/public/res/audios/kenney/audios/glitch_004.ogg +0 -0
  53. package/public/res/audios/kenney/audios/maximize_001.ogg +0 -0
  54. package/public/res/audios/kenney/audios/maximize_002.ogg +0 -0
  55. package/public/res/audios/kenney/audios/maximize_003.ogg +0 -0
  56. package/public/res/audios/kenney/audios/maximize_004.ogg +0 -0
  57. package/public/res/audios/kenney/audios/maximize_005.ogg +0 -0
  58. package/public/res/audios/kenney/audios/maximize_006.ogg +0 -0
  59. package/public/res/audios/kenney/audios/maximize_007.ogg +0 -0
  60. package/public/res/audios/kenney/audios/maximize_008.ogg +0 -0
  61. package/public/res/audios/kenney/audios/maximize_009.ogg +0 -0
  62. package/public/res/audios/kenney/audios/minimize_001.ogg +0 -0
  63. package/public/res/audios/kenney/audios/minimize_002.ogg +0 -0
  64. package/public/res/audios/kenney/audios/minimize_003.ogg +0 -0
  65. package/public/res/audios/kenney/audios/minimize_004.ogg +0 -0
  66. package/public/res/audios/kenney/audios/minimize_005.ogg +0 -0
  67. package/public/res/audios/kenney/audios/minimize_006.ogg +0 -0
  68. package/public/res/audios/kenney/audios/minimize_007.ogg +0 -0
  69. package/public/res/audios/kenney/audios/minimize_008.ogg +0 -0
  70. package/public/res/audios/kenney/audios/minimize_009.ogg +0 -0
  71. package/public/res/audios/kenney/audios/open_001.ogg +0 -0
  72. package/public/res/audios/kenney/audios/open_002.ogg +0 -0
  73. package/public/res/audios/kenney/audios/open_003.ogg +0 -0
  74. package/public/res/audios/kenney/audios/open_004.ogg +0 -0
  75. package/public/res/audios/kenney/audios/pluck_001.ogg +0 -0
  76. package/public/res/audios/kenney/audios/pluck_002.ogg +0 -0
  77. package/public/res/audios/kenney/audios/question_001.ogg +0 -0
  78. package/public/res/audios/kenney/audios/question_002.ogg +0 -0
  79. package/public/res/audios/kenney/audios/question_003.ogg +0 -0
  80. package/public/res/audios/kenney/audios/question_004.ogg +0 -0
  81. package/public/res/audios/kenney/audios/scratch_001.ogg +0 -0
  82. package/public/res/audios/kenney/audios/scratch_002.ogg +0 -0
  83. package/public/res/audios/kenney/audios/scratch_003.ogg +0 -0
  84. package/public/res/audios/kenney/audios/scratch_004.ogg +0 -0
  85. package/public/res/audios/kenney/audios/scratch_005.ogg +0 -0
  86. package/public/res/audios/kenney/audios/scroll_001.ogg +0 -0
  87. package/public/res/audios/kenney/audios/scroll_002.ogg +0 -0
  88. package/public/res/audios/kenney/audios/scroll_003.ogg +0 -0
  89. package/public/res/audios/kenney/audios/scroll_004.ogg +0 -0
  90. package/public/res/audios/kenney/audios/scroll_005.ogg +0 -0
  91. package/public/res/audios/kenney/audios/select_001.ogg +0 -0
  92. package/public/res/audios/kenney/audios/select_002.ogg +0 -0
  93. package/public/res/audios/kenney/audios/select_003.ogg +0 -0
  94. package/public/res/audios/kenney/audios/select_004.ogg +0 -0
  95. package/public/res/audios/kenney/audios/select_005.ogg +0 -0
  96. package/public/res/audios/kenney/audios/select_006.ogg +0 -0
  97. package/public/res/audios/kenney/audios/select_007.ogg +0 -0
  98. package/public/res/audios/kenney/audios/select_008.ogg +0 -0
  99. package/public/res/audios/kenney/audios/switch_001.ogg +0 -0
  100. package/public/res/audios/kenney/audios/switch_002.ogg +0 -0
  101. package/public/res/audios/kenney/audios/switch_003.ogg +0 -0
  102. package/public/res/audios/kenney/audios/switch_004.ogg +0 -0
  103. package/public/res/audios/kenney/audios/switch_005.ogg +0 -0
  104. package/public/res/audios/kenney/audios/switch_006.ogg +0 -0
  105. package/public/res/audios/kenney/audios/switch_007.ogg +0 -0
  106. package/public/res/audios/kenney/audios/tick_001.ogg +0 -0
  107. package/public/res/audios/kenney/audios/tick_002.ogg +0 -0
  108. package/public/res/audios/kenney/audios/tick_004.ogg +0 -0
  109. package/public/res/audios/kenney/audios/toggle_001.ogg +0 -0
  110. package/public/res/audios/kenney/audios/toggle_002.ogg +0 -0
  111. package/public/res/audios/kenney/audios/toggle_003.ogg +0 -0
  112. package/public/res/audios/kenney/audios/toggle_004.ogg +0 -0
  113. package/public/res/audios/toggle_002.mp3 +0 -0
  114. package/public/res/meshes/shapes/star1.obj +60 -0
  115. package/public/res/multilang/en.json +8 -1
  116. package/public/res/multilang/sr.json +7 -1
  117. package/readme.md +16 -0
  118. package/src/engine/ball.js +0 -3
  119. package/src/engine/cube.js +0 -1
  120. package/src/engine/mesh-obj.js +0 -7
  121. package/src/engine/utils.js +71 -1
  122. package/src/physics/matrix-ammo.js +64 -26
  123. package/src/sounds/sounds.js +32 -10
  124. package/src/world.js +361 -307
@@ -11,9 +11,9 @@ export default class MatrixAmmo {
11
11
  undefined,
12
12
  this.init,
13
13
  );
14
-
15
14
  this.lastRoll = '';
16
15
  this.presentScore = '';
16
+ this.speedUpSimulation = 1;
17
17
  }
18
18
 
19
19
  init = () => {
@@ -86,6 +86,8 @@ export default class MatrixAmmo {
86
86
  rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, myMotionState, colShape, localInertia),
87
87
  body = new Ammo.btRigidBody(rbInfo);
88
88
 
89
+ console.log("TEST ADDING PHYSICS ");
90
+
89
91
  body.MEObject = MEObject;
90
92
  this.dynamicsWorld.addRigidBody(body);
91
93
  this.rigidBodies.push(body);
@@ -159,8 +161,6 @@ export default class MatrixAmmo {
159
161
  pos.setX(pos.x() + x)
160
162
  pos.setY(pos.y() + y)
161
163
  pos.setZ(pos.z() + z)
162
- // console.log('position kinematic move : ', pos)
163
- // console.log('position localRot : ', localRot)
164
164
  localRot.setX(rx)
165
165
  localRot.setY(ry)
166
166
  localRot.setZ(rz)
@@ -168,14 +168,12 @@ export default class MatrixAmmo {
168
168
  let ms = physicsBody.getMotionState();
169
169
  if(ms) {
170
170
  var tmpTrans = new Ammo.btTransform();
171
-
172
171
  // quat.setValue(quat.x(), quat.y(), quat.z(), quat.w());
173
172
  tmpTrans.setIdentity();
174
173
  tmpTrans.setOrigin(pos);
175
174
  tmpTrans.setRotation(localRot);
176
175
  ms.setWorldTransform(tmpTrans);
177
176
  }
178
- // console.log('body, ', body)
179
177
  }
180
178
 
181
179
  getBodyByName(name) {
@@ -266,28 +264,68 @@ export default class MatrixAmmo {
266
264
  }
267
265
 
268
266
  updatePhysics() {
269
- // Step world
270
- this.dynamicsWorld.stepSimulation(1 / 60, 10);
271
- // Update rigid bodies
272
- var trans = new Ammo.btTransform();
267
+ if(!Ammo) return;
268
+ const trans = new Ammo.btTransform();
269
+ const transform = new Ammo.btTransform();
270
+
273
271
  this.rigidBodies.forEach(function(body) {
274
- if(body.getMotionState()) {
272
+ if(body.isKinematic) {
273
+ transform.setIdentity();
274
+ transform.setOrigin(new Ammo.btVector3(
275
+ body.MEObject.position.x,
276
+ body.MEObject.position.y,
277
+ body.MEObject.position.z
278
+ ));
279
+ const quat = new Ammo.btQuaternion();
280
+ quat.setRotation(
281
+ new Ammo.btVector3(
282
+ body.MEObject.rotation.axis.x,
283
+ body.MEObject.rotation.axis.y,
284
+ body.MEObject.rotation.axis.z
285
+ ),
286
+ degToRad(body.MEObject.rotation.angle)
287
+ );
288
+ transform.setRotation(quat);
289
+
290
+ body.setWorldTransform(transform);
291
+ const ms = body.getMotionState();
292
+ if(ms) ms.setWorldTransform(transform);
293
+ }
294
+ });
295
+
296
+ Ammo.destroy(transform);
297
+
298
+ // Step simulation AFTER setting kinematic transforms
299
+ const timeStep = 1 / 60;
300
+ const maxSubSteps = 10;
301
+
302
+ for(let i = 0;i < this.speedUpSimulation;i++) {
303
+ this.dynamicsWorld.stepSimulation(timeStep, maxSubSteps);
304
+ }
305
+
306
+ this.rigidBodies.forEach(function(body) {
307
+ if(!body.isKinematic && body.getMotionState()) {
275
308
  body.getMotionState().getWorldTransform(trans);
276
- var _x = trans.getOrigin().x().toFixed(2);
277
- var _y = trans.getOrigin().y().toFixed(2);
278
- var _z = trans.getOrigin().z().toFixed(2);
279
- body.MEObject.position.setPosition(_x, _y, _z)
280
- var test = trans.getRotation();
281
- var testAxis = test.getAxis();
282
- test.normalize()
283
- body.MEObject.rotation.axis.x = testAxis.x()
284
- body.MEObject.rotation.axis.y = testAxis.y()
285
- body.MEObject.rotation.axis.z = testAxis.z()
286
- body.MEObject.rotation.matrixRotation = quaternion_rotation_matrix(test);
287
- body.MEObject.rotation.angle = radToDeg(parseFloat(test.getAngle().toFixed(2)))
309
+
310
+ const _x = +trans.getOrigin().x().toFixed(2);
311
+ const _y = +trans.getOrigin().y().toFixed(2);
312
+ const _z = +trans.getOrigin().z().toFixed(2);
313
+
314
+ body.MEObject.position.setPosition(_x, _y, _z);
315
+
316
+ const rot = trans.getRotation();
317
+ const rotAxis = rot.getAxis();
318
+ rot.normalize();
319
+
320
+ body.MEObject.rotation.axis.x = rotAxis.x();
321
+ body.MEObject.rotation.axis.y = rotAxis.y();
322
+ body.MEObject.rotation.axis.z = rotAxis.z();
323
+ body.MEObject.rotation.matrixRotation = quaternion_rotation_matrix(rot);
324
+ body.MEObject.rotation.angle = radToDeg(parseFloat(rot.getAngle().toFixed(2)));
288
325
  }
289
- })
290
- // collision detect
291
- this.detectCollision()
326
+ });
327
+
328
+ Ammo.destroy(trans);
329
+ this.detectCollision();
292
330
  }
293
- }
331
+ }
@@ -1,14 +1,23 @@
1
-
2
1
  export class MatrixSounds {
3
2
 
4
3
  constructor() {
5
4
  this.volume = 0.5;
6
5
  this.audios = {};
6
+ this.enabled = true; // 🔇 global flag to mute/allow audio
7
+ }
8
+
9
+ muteAll() {
10
+ this.enabled = false;
11
+ Object.values(this.audios).forEach(audio => audio.pause());
12
+ }
13
+
14
+ unmuteAll() {
15
+ this.enabled = true;
7
16
  }
8
17
 
9
18
  createClones(c, name, path) {
10
- for(var x = 1;x < c;x++) {
11
- let a = new Audio(path);
19
+ for(let x = 1;x < c;x++) {
20
+ const a = new Audio(path);
12
21
  a.id = name + x;
13
22
  a.volume = this.volume;
14
23
  this.audios[name + x] = a;
@@ -17,7 +26,7 @@ export class MatrixSounds {
17
26
  }
18
27
 
19
28
  createAudio(name, path, useClones) {
20
- let a = new Audio(path);
29
+ const a = new Audio(path);
21
30
  a.id = name;
22
31
  a.volume = this.volume;
23
32
  this.audios[name] = a;
@@ -28,20 +37,33 @@ export class MatrixSounds {
28
37
  }
29
38
 
30
39
  play(name) {
31
- if(this.audios[name].paused == true) {
32
- this.audios[name].play()
40
+ if(!this.enabled) return; // 🔇 prevent playing if muted
41
+
42
+ const audio = this.audios[name];
43
+ if(!audio) return;
44
+
45
+ if(audio.paused) {
46
+ audio.play().catch((e) => {
47
+ if(e.name !== 'NotAllowedError') console.warn("sounds error:", e);
48
+ });
33
49
  } else {
34
50
  this.tryClone(name);
35
51
  }
36
52
  }
37
53
 
38
54
  tryClone(name) {
39
- var cc = 1;
55
+ if(!this.enabled) return; // 🔇 prevent playing clones
56
+
57
+ let cc = 1;
40
58
  try {
41
- while(this.audios[name + cc].paused == false) {
59
+ while(this.audios[name + cc] && this.audios[name + cc].paused === false) {
42
60
  cc++;
43
61
  }
44
- if (this.audios[name + cc]) this.audios[name + cc].play();
45
- } catch(err) {}
62
+ if(this.audios[name + cc]) {
63
+ this.audios[name + cc].play();
64
+ }
65
+ } catch(err) {
66
+ console.warn("Clone play failed:", err);
67
+ }
46
68
  }
47
69
  }