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.
- package/examples/games/jamb/html-content.js +123 -0
- package/examples/games/jamb/jamb.js +240 -87
- package/examples/unlit-textures.js +18 -17
- package/main.js +503 -453
- package/package.json +1 -1
- package/public/app.js +706 -192
- package/public/css/style.css +229 -80
- package/public/examples.js +609 -187
- package/public/index.html +0 -3
- package/public/res/audios/kenney/Kenney.url +2 -0
- package/public/res/audios/kenney/License.txt +22 -0
- package/public/res/audios/kenney/Patreon.url +2 -0
- package/public/res/audios/kenney/audios/back_001.ogg +0 -0
- package/public/res/audios/kenney/audios/back_002.ogg +0 -0
- package/public/res/audios/kenney/audios/back_003.ogg +0 -0
- package/public/res/audios/kenney/audios/back_004.ogg +0 -0
- package/public/res/audios/kenney/audios/bong_001.ogg +0 -0
- package/public/res/audios/kenney/audios/click_001.ogg +0 -0
- package/public/res/audios/kenney/audios/click_002.ogg +0 -0
- package/public/res/audios/kenney/audios/click_003.ogg +0 -0
- package/public/res/audios/kenney/audios/click_004.ogg +0 -0
- package/public/res/audios/kenney/audios/click_005.ogg +0 -0
- package/public/res/audios/kenney/audios/close_001.ogg +0 -0
- package/public/res/audios/kenney/audios/close_002.ogg +0 -0
- package/public/res/audios/kenney/audios/close_003.ogg +0 -0
- package/public/res/audios/kenney/audios/close_004.ogg +0 -0
- package/public/res/audios/kenney/audios/confirmation_001.ogg +0 -0
- package/public/res/audios/kenney/audios/confirmation_002.ogg +0 -0
- package/public/res/audios/kenney/audios/confirmation_003.ogg +0 -0
- package/public/res/audios/kenney/audios/confirmation_004.ogg +0 -0
- package/public/res/audios/kenney/audios/drop_001.ogg +0 -0
- package/public/res/audios/kenney/audios/drop_002.ogg +0 -0
- package/public/res/audios/kenney/audios/drop_003.ogg +0 -0
- package/public/res/audios/kenney/audios/drop_004.ogg +0 -0
- package/public/res/audios/kenney/audios/error_001.ogg +0 -0
- package/public/res/audios/kenney/audios/error_002.ogg +0 -0
- package/public/res/audios/kenney/audios/error_003.ogg +0 -0
- package/public/res/audios/kenney/audios/error_004.ogg +0 -0
- package/public/res/audios/kenney/audios/error_005.ogg +0 -0
- package/public/res/audios/kenney/audios/error_006.ogg +0 -0
- package/public/res/audios/kenney/audios/error_007.ogg +0 -0
- package/public/res/audios/kenney/audios/error_008.ogg +0 -0
- package/public/res/audios/kenney/audios/glass_001.ogg +0 -0
- package/public/res/audios/kenney/audios/glass_002.ogg +0 -0
- package/public/res/audios/kenney/audios/glass_003.ogg +0 -0
- package/public/res/audios/kenney/audios/glass_004.ogg +0 -0
- package/public/res/audios/kenney/audios/glass_005.ogg +0 -0
- package/public/res/audios/kenney/audios/glass_006.ogg +0 -0
- package/public/res/audios/kenney/audios/glitch_001.ogg +0 -0
- package/public/res/audios/kenney/audios/glitch_002.ogg +0 -0
- package/public/res/audios/kenney/audios/glitch_003.ogg +0 -0
- package/public/res/audios/kenney/audios/glitch_004.ogg +0 -0
- package/public/res/audios/kenney/audios/maximize_001.ogg +0 -0
- package/public/res/audios/kenney/audios/maximize_002.ogg +0 -0
- package/public/res/audios/kenney/audios/maximize_003.ogg +0 -0
- package/public/res/audios/kenney/audios/maximize_004.ogg +0 -0
- package/public/res/audios/kenney/audios/maximize_005.ogg +0 -0
- package/public/res/audios/kenney/audios/maximize_006.ogg +0 -0
- package/public/res/audios/kenney/audios/maximize_007.ogg +0 -0
- package/public/res/audios/kenney/audios/maximize_008.ogg +0 -0
- package/public/res/audios/kenney/audios/maximize_009.ogg +0 -0
- package/public/res/audios/kenney/audios/minimize_001.ogg +0 -0
- package/public/res/audios/kenney/audios/minimize_002.ogg +0 -0
- package/public/res/audios/kenney/audios/minimize_003.ogg +0 -0
- package/public/res/audios/kenney/audios/minimize_004.ogg +0 -0
- package/public/res/audios/kenney/audios/minimize_005.ogg +0 -0
- package/public/res/audios/kenney/audios/minimize_006.ogg +0 -0
- package/public/res/audios/kenney/audios/minimize_007.ogg +0 -0
- package/public/res/audios/kenney/audios/minimize_008.ogg +0 -0
- package/public/res/audios/kenney/audios/minimize_009.ogg +0 -0
- package/public/res/audios/kenney/audios/open_001.ogg +0 -0
- package/public/res/audios/kenney/audios/open_002.ogg +0 -0
- package/public/res/audios/kenney/audios/open_003.ogg +0 -0
- package/public/res/audios/kenney/audios/open_004.ogg +0 -0
- package/public/res/audios/kenney/audios/pluck_001.ogg +0 -0
- package/public/res/audios/kenney/audios/pluck_002.ogg +0 -0
- package/public/res/audios/kenney/audios/question_001.ogg +0 -0
- package/public/res/audios/kenney/audios/question_002.ogg +0 -0
- package/public/res/audios/kenney/audios/question_003.ogg +0 -0
- package/public/res/audios/kenney/audios/question_004.ogg +0 -0
- package/public/res/audios/kenney/audios/scratch_001.ogg +0 -0
- package/public/res/audios/kenney/audios/scratch_002.ogg +0 -0
- package/public/res/audios/kenney/audios/scratch_003.ogg +0 -0
- package/public/res/audios/kenney/audios/scratch_004.ogg +0 -0
- package/public/res/audios/kenney/audios/scratch_005.ogg +0 -0
- package/public/res/audios/kenney/audios/scroll_001.ogg +0 -0
- package/public/res/audios/kenney/audios/scroll_002.ogg +0 -0
- package/public/res/audios/kenney/audios/scroll_003.ogg +0 -0
- package/public/res/audios/kenney/audios/scroll_004.ogg +0 -0
- package/public/res/audios/kenney/audios/scroll_005.ogg +0 -0
- package/public/res/audios/kenney/audios/select_001.ogg +0 -0
- package/public/res/audios/kenney/audios/select_002.ogg +0 -0
- package/public/res/audios/kenney/audios/select_003.ogg +0 -0
- package/public/res/audios/kenney/audios/select_004.ogg +0 -0
- package/public/res/audios/kenney/audios/select_005.ogg +0 -0
- package/public/res/audios/kenney/audios/select_006.ogg +0 -0
- package/public/res/audios/kenney/audios/select_007.ogg +0 -0
- package/public/res/audios/kenney/audios/select_008.ogg +0 -0
- package/public/res/audios/kenney/audios/switch_001.ogg +0 -0
- package/public/res/audios/kenney/audios/switch_002.ogg +0 -0
- package/public/res/audios/kenney/audios/switch_003.ogg +0 -0
- package/public/res/audios/kenney/audios/switch_004.ogg +0 -0
- package/public/res/audios/kenney/audios/switch_005.ogg +0 -0
- package/public/res/audios/kenney/audios/switch_006.ogg +0 -0
- package/public/res/audios/kenney/audios/switch_007.ogg +0 -0
- package/public/res/audios/kenney/audios/tick_001.ogg +0 -0
- package/public/res/audios/kenney/audios/tick_002.ogg +0 -0
- package/public/res/audios/kenney/audios/tick_004.ogg +0 -0
- package/public/res/audios/kenney/audios/toggle_001.ogg +0 -0
- package/public/res/audios/kenney/audios/toggle_002.ogg +0 -0
- package/public/res/audios/kenney/audios/toggle_003.ogg +0 -0
- package/public/res/audios/kenney/audios/toggle_004.ogg +0 -0
- package/public/res/audios/toggle_002.mp3 +0 -0
- package/public/res/meshes/shapes/star1.obj +60 -0
- package/public/res/multilang/en.json +8 -1
- package/public/res/multilang/sr.json +7 -1
- package/readme.md +16 -0
- package/src/engine/ball.js +0 -3
- package/src/engine/cube.js +0 -1
- package/src/engine/mesh-obj.js +0 -7
- package/src/engine/utils.js +71 -1
- package/src/physics/matrix-ammo.js +64 -26
- package/src/sounds/sounds.js +32 -10
- package/src/world.js +361 -307
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
|
|
2
|
+
export let settingsBox = `
|
|
3
|
+
<div>
|
|
4
|
+
<span style="font-size:170%" data-label="settings"></span>
|
|
5
|
+
<div style="margin:20px;" >
|
|
6
|
+
<div>
|
|
7
|
+
<span data-label="sounds"></span>
|
|
8
|
+
<label class="switch">
|
|
9
|
+
<input id="settingsAudios" type="checkbox">
|
|
10
|
+
<span class="sliderSwitch round"></span>
|
|
11
|
+
</label>
|
|
12
|
+
</div>
|
|
13
|
+
<div>
|
|
14
|
+
<div>
|
|
15
|
+
<span data-label="graphics"></span>
|
|
16
|
+
|
|
17
|
+
<select id="physicsSpeed" class="setting-select">
|
|
18
|
+
<option value="1">Slow</option>
|
|
19
|
+
<option value="2">Normal</option>
|
|
20
|
+
<option value="3">Fast</option>
|
|
21
|
+
</select>
|
|
22
|
+
|
|
23
|
+
<select id="blurControl">
|
|
24
|
+
<option value="0px">Blur: 0</option>
|
|
25
|
+
<option value="1px">Blur: 1</option>
|
|
26
|
+
<option value="2px">Blur: 2</option>
|
|
27
|
+
<option value="3px">Blur: 3</option>
|
|
28
|
+
</select>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div>
|
|
32
|
+
<select id="grayscaleControl">
|
|
33
|
+
<option value="0%">Grayscale: 0%</option>
|
|
34
|
+
<option value="25%">Grayscale: 25%</option>
|
|
35
|
+
<option value="50%">Grayscale: 50%</option>
|
|
36
|
+
<option value="75%">Grayscale: 75%</option>
|
|
37
|
+
<option value="100%">Grayscale: 100%</option>
|
|
38
|
+
</select>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<div>
|
|
42
|
+
<label>Brightness:</label>
|
|
43
|
+
<select id="brightnessControl">
|
|
44
|
+
<option value="100%">100%</option>
|
|
45
|
+
<option value="150%">150%</option>
|
|
46
|
+
<option value="200%">200%</option>
|
|
47
|
+
</select>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<div>
|
|
51
|
+
<label>Contrast:</label>
|
|
52
|
+
<select id="contrastControl">
|
|
53
|
+
<option value="100%">100%</option>
|
|
54
|
+
<option value="150%">150%</option>
|
|
55
|
+
<option value="200%">200%</option>
|
|
56
|
+
</select>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div>
|
|
60
|
+
<label>Saturate:</label>
|
|
61
|
+
<select id="saturateControl">
|
|
62
|
+
<option value="100%">100%</option>
|
|
63
|
+
<option value="150%">150%</option>
|
|
64
|
+
<option value="200%">200%</option>
|
|
65
|
+
</select>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div>
|
|
69
|
+
<label>Sepia:</label>
|
|
70
|
+
<select id="sepiaControl">
|
|
71
|
+
<option value="0%">0%</option>
|
|
72
|
+
<option value="50%">50%</option>
|
|
73
|
+
<option value="100%">100%</option>
|
|
74
|
+
</select>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div>
|
|
78
|
+
<label>Invert:</label>
|
|
79
|
+
<select id="invertControl">
|
|
80
|
+
<option value="0%">0%</option>
|
|
81
|
+
<option value="50%">50%</option>
|
|
82
|
+
<option value="100%">100%</option>
|
|
83
|
+
</select>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<div>
|
|
87
|
+
<label>Hue Rotate:</label>
|
|
88
|
+
<select id="hueControl">
|
|
89
|
+
<option value="0deg">0°</option>
|
|
90
|
+
<option value="90deg">90°</option>
|
|
91
|
+
<option value="180deg">180°</option>
|
|
92
|
+
<option value="270deg">270°</option>
|
|
93
|
+
</select>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
</div>
|
|
97
|
+
<div>
|
|
98
|
+
<button class="btn" onclick="app.myDom.hideSettings()">
|
|
99
|
+
<span data-label="hide"></span>
|
|
100
|
+
</button>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
</div>`;
|
|
104
|
+
|
|
105
|
+
export let welcomeBoxHTML =
|
|
106
|
+
`<span class="fancy-title" data-label="welcomeMsg"></span>
|
|
107
|
+
<a href="https://github.com/zlatnaspirala/matrix-engine-wgpu">zlatnaspirala/matrix-engine-wgpu</a><br><br>
|
|
108
|
+
<div style="display:flex;flex-direction:column;align-items: center;margin:20px;padding: 10px;">
|
|
109
|
+
<span style="width:100%" data-label="choosename"></span>
|
|
110
|
+
<input style="text-align: center;height:50px;font-size:100%;width:250px" class="fancy-label" type="text" value="Guest" />
|
|
111
|
+
</div>
|
|
112
|
+
<button id="startFromWelcome" class="btn" ><span style="font-size:30px;margin:15px;padding:10px" data-label="startGame"></span></button> <br>
|
|
113
|
+
<div><span class="fancy-label" data-label="changeLang"></span></div>
|
|
114
|
+
<button class="btn" onclick="
|
|
115
|
+
app.label.loadMultilang('en').then(r => {
|
|
116
|
+
app.label.get = r;
|
|
117
|
+
app.label.update()
|
|
118
|
+
});
|
|
119
|
+
" ><span data-label="english"></span></button>
|
|
120
|
+
<button class="btn" onclick="app.label.loadMultilang('sr').then(r => {
|
|
121
|
+
app.label.get = r
|
|
122
|
+
app.label.update() })" ><span data-label="serbian"></span></button>
|
|
123
|
+
`;
|
|
@@ -1,36 +1,165 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {LOG_FUNNY, LOG_INFO, LOG_MATRIX, byId, mb} from "../../../src/engine/utils.js";
|
|
1
|
+
import {LOG_FUNNY, LOG_INFO, LOG_MATRIX, byId, mb, setupCanvasFilters, typeText} from "../../../src/engine/utils.js";
|
|
2
|
+
import {settingsBox, welcomeBoxHTML} from "./html-content.js";
|
|
4
3
|
|
|
5
4
|
export let dices = {
|
|
6
5
|
C: 0,
|
|
7
6
|
STATUS: 'FREE_TO_PLAY',
|
|
8
|
-
STATUS_H2: 'WAIT',
|
|
9
|
-
STATUS_H3: 'WAIT',
|
|
10
7
|
R: {},
|
|
8
|
+
SAVED_DICES: {},
|
|
9
|
+
pickDice: function(dice) {
|
|
10
|
+
if(Object.keys(this.SAVED_DICES).length >= 5) {
|
|
11
|
+
console.log("⚠️ You can only select up to 5 dice!");
|
|
12
|
+
return; // prevent adding more
|
|
13
|
+
}
|
|
14
|
+
this.SAVED_DICES[dice] = this.R[dice]
|
|
15
|
+
this.refreshSelectedBox()
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
setStartUpPosition: () => {
|
|
19
|
+
//
|
|
20
|
+
let currentIndex = 0;
|
|
21
|
+
for(var x = 1;x < 7;x++) {
|
|
22
|
+
app.matrixAmmo.getBodyByName(('CubePhysics' + x)).MEObject.position.setPosition(-5 + currentIndex * 5, 2, -15);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
refreshSelectedBox: function(arg) {
|
|
27
|
+
let currentIndex = 0;
|
|
28
|
+
for(var key in this.SAVED_DICES) {
|
|
29
|
+
let B = app.matrixAmmo.getBodyByName(key);
|
|
30
|
+
this.deactivatePhysics(B);
|
|
31
|
+
const transform = new Ammo.btTransform();
|
|
32
|
+
transform.setIdentity();
|
|
33
|
+
transform.setOrigin(new Ammo.btVector3(0, 0, 0));
|
|
34
|
+
B.setWorldTransform(transform);
|
|
35
|
+
B.MEObject.position.setPosition(-5 + currentIndex, 5, -16);
|
|
36
|
+
currentIndex += 3;
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
deactivatePhysics: function(body) {
|
|
41
|
+
const CF_KINEMATIC_OBJECT = 2;
|
|
42
|
+
const DISABLE_DEACTIVATION = 4;
|
|
43
|
+
// 1. Remove from world
|
|
44
|
+
app.matrixAmmo.dynamicsWorld.removeRigidBody(body);
|
|
45
|
+
// 2. Set body to kinematic
|
|
46
|
+
const flags = body.getCollisionFlags();
|
|
47
|
+
body.setCollisionFlags(flags | CF_KINEMATIC_OBJECT);
|
|
48
|
+
body.setActivationState(DISABLE_DEACTIVATION); // no auto-wakeup
|
|
49
|
+
// 3. Clear motion
|
|
50
|
+
const zero = new Ammo.btVector3(0, 0, 0);
|
|
51
|
+
body.setLinearVelocity(zero);
|
|
52
|
+
body.setAngularVelocity(zero);
|
|
53
|
+
// 4. Reset transform to current position (optional — preserves pose)
|
|
54
|
+
const currentTransform = body.getWorldTransform();
|
|
55
|
+
body.setWorldTransform(currentTransform);
|
|
56
|
+
body.getMotionState().setWorldTransform(currentTransform);
|
|
57
|
+
// 5. Add back to physics world
|
|
58
|
+
app.matrixAmmo.dynamicsWorld.addRigidBody(body);
|
|
59
|
+
// 6. Mark it manually (logic flag)
|
|
60
|
+
body.isKinematic = true;
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
resetBodyAboveFloor: function(body, z = -14) {
|
|
64
|
+
const transform = new Ammo.btTransform();
|
|
65
|
+
transform.setIdentity();
|
|
66
|
+
transform.setOrigin(new Ammo.btVector3(-1 + Math.random(), 3, z));
|
|
67
|
+
body.setWorldTransform(transform);
|
|
68
|
+
body.getMotionState().setWorldTransform(transform);
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
activatePhysics: function(body) {
|
|
72
|
+
// 1. Make it dynamic again
|
|
73
|
+
body.setCollisionFlags(body.getCollisionFlags() & ~2); // remove kinematic
|
|
74
|
+
body.setActivationState(1); // ACTIVE_TAG
|
|
75
|
+
body.isKinematic = false;
|
|
76
|
+
|
|
77
|
+
// 2. Reset position ABOVE the floor — force it out of collision
|
|
78
|
+
// const newY = 3 + Math.random(); // ensure it’s above the floor
|
|
79
|
+
const transform = new Ammo.btTransform();
|
|
80
|
+
transform.setIdentity();
|
|
81
|
+
const newX = (Math.random() - 0.5) * 4; // spread from -2 to +2 on X
|
|
82
|
+
const newY = 3; // fixed height above floor
|
|
83
|
+
transform.setOrigin(new Ammo.btVector3(newX, newY, 0));
|
|
84
|
+
body.setWorldTransform(transform);
|
|
85
|
+
|
|
86
|
+
// 3. Clear velocities
|
|
87
|
+
body.setLinearVelocity(new Ammo.btVector3(0, 0, 0));
|
|
88
|
+
body.setAngularVelocity(new Ammo.btVector3(0, 0, 0));
|
|
89
|
+
|
|
90
|
+
// 4. Enable CCD (to prevent tunneling)
|
|
91
|
+
const size = 1; // cube side length
|
|
92
|
+
body.setCcdMotionThreshold(1e-7);
|
|
93
|
+
body.setCcdSweptSphereRadius(size * 0.5);
|
|
94
|
+
|
|
95
|
+
// Re-add to world if needed
|
|
96
|
+
// Optionally: remove and re-add if not responding
|
|
97
|
+
app.matrixAmmo.dynamicsWorld.removeRigidBody(body);
|
|
98
|
+
app.matrixAmmo.dynamicsWorld.addRigidBody(body);
|
|
99
|
+
|
|
100
|
+
// 5. Reactivate it
|
|
101
|
+
body.activate(true);
|
|
102
|
+
|
|
103
|
+
this.resetBodyAboveFloor(body);
|
|
104
|
+
},
|
|
11
105
|
|
|
12
|
-
|
|
106
|
+
activateAllDicesPhysics: function() {
|
|
107
|
+
this.getAllDices()
|
|
108
|
+
// .filter((item) => {
|
|
109
|
+
// let test = app.matrixAmmo.getBodyByName(item.name)?.isKinematicObject();
|
|
110
|
+
// if(test === true) {
|
|
111
|
+
// return true;
|
|
112
|
+
// } else {
|
|
113
|
+
// return false;
|
|
114
|
+
// }
|
|
115
|
+
// })
|
|
116
|
+
.forEach((dice) => {
|
|
117
|
+
const body = app.matrixAmmo.getBodyByName(dice.name);
|
|
118
|
+
if(body) {
|
|
119
|
+
this.activatePhysics(body); // <--- FIX: pass the physics body, not the dice object
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
getAllDices: function() {
|
|
125
|
+
return app.mainRenderBundle.filter(item => item.name.indexOf("CubePhysics") !== -1);
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
getDiceByName: function(name) {
|
|
129
|
+
return app.mainRenderBundle.find(item => item.name === name);
|
|
130
|
+
},
|
|
13
131
|
|
|
14
|
-
pickDice: (dice) => {
|
|
15
|
-
this.SAVED_DICES[dice] = this.R[dice]
|
|
16
|
-
},
|
|
17
132
|
checkAll: function() {
|
|
18
133
|
this.C++;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
134
|
+
|
|
135
|
+
let activeRollingCount = 0;
|
|
136
|
+
let allReady = true;
|
|
137
|
+
|
|
138
|
+
for(let i = 1;i <= 6;i++) {
|
|
139
|
+
const key = "CubePhysics" + i;
|
|
140
|
+
if(key in this.SAVED_DICES) continue; // skip saved ones
|
|
141
|
+
activeRollingCount++; // count how many are still active
|
|
142
|
+
if(typeof this.R[key] === 'undefined') {
|
|
143
|
+
allReady = false;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Dynamic threshold: min wait time based on rolling dice
|
|
148
|
+
const minWait = Math.max(200, activeRollingCount * 200); // e.g. 1 die => 200, 5 dice => 1000, 6 dice => 1200
|
|
149
|
+
if(allReady && this.C > minWait) {
|
|
150
|
+
dispatchEvent(new CustomEvent('all-done', {detail: {}}));
|
|
26
151
|
this.C = 0;
|
|
27
152
|
}
|
|
28
153
|
},
|
|
29
154
|
validatePass: function() {
|
|
30
|
-
if(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
155
|
+
if(Object.keys(this.SAVED_DICES).length !== 5) {
|
|
156
|
+
console.log('%cBLOCK', LOG_FUNNY)
|
|
157
|
+
mb.error(`Must select (minimum) 5 dices before add results...`);
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
if(dices.STATUS != "FINISHED") {
|
|
161
|
+
console.log('%cBLOCK', LOG_FUNNY)
|
|
162
|
+
mb.error(`STATUS IS ${dices.STATUS}, please wait for results...`);
|
|
34
163
|
app.matrixSounds.play('block')
|
|
35
164
|
return false;
|
|
36
165
|
} else {
|
|
@@ -62,44 +191,38 @@ export let myDom = {
|
|
|
62
191
|
|
|
63
192
|
var help = document.createElement('div')
|
|
64
193
|
help.id = 'HELP';
|
|
65
|
-
help.classList.add('
|
|
194
|
+
help.classList.add('btn')
|
|
66
195
|
help.innerHTML = `<span data-label="help"></span>`;
|
|
67
196
|
|
|
68
197
|
var settings = document.createElement('div')
|
|
69
198
|
settings.id = 'settings';
|
|
70
|
-
settings.classList.add('
|
|
199
|
+
settings.classList.add('btn')
|
|
71
200
|
settings.innerHTML = `<span data-label="settings"></span>`;
|
|
72
201
|
settings.addEventListener('click', () => {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
<div>
|
|
80
|
-
<span data-label="sounds"></span>
|
|
81
|
-
|
|
82
|
-
<label class="switch">
|
|
83
|
-
<input type="checkbox">
|
|
84
|
-
<span class="sliderSwitch round"></span>
|
|
85
|
-
</label>
|
|
86
|
-
|
|
87
|
-
</div>
|
|
88
|
-
|
|
89
|
-
<div>
|
|
90
|
-
<button class="btn2" onclick="app.myDom.hideSettings()">
|
|
91
|
-
<span data-label="hide"></span>
|
|
92
|
-
</button>
|
|
93
|
-
</div>
|
|
94
|
-
|
|
95
|
-
</div>
|
|
96
|
-
</div>
|
|
97
|
-
`;
|
|
98
|
-
|
|
202
|
+
if(document.getElementById('messageBox').getAttribute('data-loaded') != null) {
|
|
203
|
+
byId('blocker').style.display = 'flex';
|
|
204
|
+
byId('messageBox').style.display = 'unset';
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
byId('messageBox').innerHTML = settingsBox;
|
|
99
208
|
byId('blocker').style.display = 'flex';
|
|
100
|
-
byId('messageBox').style.display = '
|
|
101
|
-
|
|
209
|
+
byId('messageBox').style.display = 'unset';
|
|
102
210
|
dispatchEvent(new CustomEvent('updateLang', {}))
|
|
211
|
+
|
|
212
|
+
byId('settingsAudios').click()
|
|
213
|
+
byId('settingsAudios').addEventListener('change', (e) => {
|
|
214
|
+
if(e.target.checked == true) {
|
|
215
|
+
app.matrixSounds.unmuteAll();
|
|
216
|
+
} else {
|
|
217
|
+
app.matrixSounds.muteAll();
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
setupCanvasFilters();
|
|
221
|
+
byId('messageBox').setAttribute('data-loaded', 'loaded')
|
|
222
|
+
byId("physicsSpeed").addEventListener("change", (e) => {
|
|
223
|
+
app.matrixAmmo.speedUpSimulation = parseInt(e.target.value);
|
|
224
|
+
});
|
|
225
|
+
|
|
103
226
|
})
|
|
104
227
|
|
|
105
228
|
var roll = document.createElement('div')
|
|
@@ -111,7 +234,7 @@ export let myDom = {
|
|
|
111
234
|
})
|
|
112
235
|
|
|
113
236
|
var separator = document.createElement('div')
|
|
114
|
-
separator.innerHTML =
|
|
237
|
+
separator.innerHTML = `✨maximumroulette.com✨`;
|
|
115
238
|
|
|
116
239
|
root.append(settings)
|
|
117
240
|
root.append(help)
|
|
@@ -133,21 +256,7 @@ export let myDom = {
|
|
|
133
256
|
messageBox.id = 'messageBox';
|
|
134
257
|
|
|
135
258
|
// console.log('TEST', app.label.get)
|
|
136
|
-
messageBox.innerHTML =
|
|
137
|
-
<span data-label="welcomeMsg"></span>
|
|
138
|
-
<a href="https://github.com/zlatnaspirala/matrix-engine-wgpu">zlatnaspirala/matrix-engine-wgpu</a><br><br>
|
|
139
|
-
<button class="btn" ><span style="font-size:30px;margin:15px;padding:10px" data-label="startGame"></span></button> <br>
|
|
140
|
-
<div><span data-label="changeLang"></span></div>
|
|
141
|
-
<button class="btn" onclick="
|
|
142
|
-
app.label.loadMultilang('en').then(r => {
|
|
143
|
-
app.label.get = r;
|
|
144
|
-
app.label.update()
|
|
145
|
-
});
|
|
146
|
-
" ><span data-label="english"></span></button>
|
|
147
|
-
<button class="btn" onclick="app.label.loadMultilang('sr').then(r => {
|
|
148
|
-
app.label.get = r
|
|
149
|
-
app.label.update() })" ><span data-label="serbian"></span></button>
|
|
150
|
-
`;
|
|
259
|
+
messageBox.innerHTML = welcomeBoxHTML;
|
|
151
260
|
|
|
152
261
|
|
|
153
262
|
let initialMsgBoxEvent = function() {
|
|
@@ -156,25 +265,31 @@ export let myDom = {
|
|
|
156
265
|
byId('blocker').style.display = 'none';
|
|
157
266
|
myDom.createMenu();
|
|
158
267
|
messageBox.removeEventListener('click', initialMsgBoxEvent)
|
|
159
|
-
};
|
|
160
268
|
|
|
161
|
-
|
|
269
|
+
document.querySelectorAll('.btn, .fancy-label, .fancy-title').forEach(el => {
|
|
270
|
+
el.addEventListener('mouseenter', () => {
|
|
271
|
+
app.matrixSounds.play('hover');
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
};
|
|
162
275
|
root.append(messageBox)
|
|
163
|
-
|
|
164
276
|
document.body.appendChild(root);
|
|
165
|
-
|
|
166
277
|
app.label.update();
|
|
278
|
+
document.querySelectorAll('.btn, .fancy-label, .fancy-title').forEach(el => {
|
|
279
|
+
el.addEventListener('mouseenter', () => {
|
|
280
|
+
app.matrixSounds.play('hover');
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
setTimeout(() => {
|
|
285
|
+
byId('startFromWelcome').addEventListener('click', initialMsgBoxEvent)
|
|
286
|
+
}, 200);
|
|
167
287
|
},
|
|
168
288
|
|
|
169
289
|
createJamb: function() {
|
|
170
290
|
var root = document.createElement('div')
|
|
171
291
|
root.id = 'jambTable';
|
|
172
292
|
root.style.position = 'absolute';
|
|
173
|
-
root.style.display = 'flex';
|
|
174
|
-
root.style.top = '10px';
|
|
175
|
-
root.style.left = '10px';
|
|
176
|
-
root.style.width = '200px';
|
|
177
|
-
root.style.background = '#7d7d7d8c';
|
|
178
293
|
|
|
179
294
|
var rowHeader = document.createElement('div')
|
|
180
295
|
rowHeader.id = 'rowHeader';
|
|
@@ -183,15 +298,16 @@ export let myDom = {
|
|
|
183
298
|
rowHeader.style.width = '200px';
|
|
184
299
|
rowHeader.innerHTML = '<span data-label="cornerText"></span><span id="user-points">0</span>';
|
|
185
300
|
root.appendChild(rowHeader);
|
|
186
|
-
rowHeader.classList.add('
|
|
301
|
+
rowHeader.classList.add('fancy-label')
|
|
187
302
|
|
|
188
303
|
var rowDown = document.createElement('div')
|
|
189
304
|
rowDown.id = 'rowDown';
|
|
190
305
|
rowDown.style.top = '10px';
|
|
191
306
|
rowDown.style.left = '10px';
|
|
192
307
|
rowDown.style.width = '200px';
|
|
193
|
-
rowDown.innerHTML = '
|
|
194
|
-
rowDown.classList.add('
|
|
308
|
+
rowDown.innerHTML = '↓<span data-label="down"></span>';
|
|
309
|
+
rowDown.classList.add('fancy-label')
|
|
310
|
+
rowDown.classList.add('btn')
|
|
195
311
|
root.appendChild(rowDown);
|
|
196
312
|
|
|
197
313
|
var rowFree = document.createElement('div')
|
|
@@ -199,8 +315,9 @@ export let myDom = {
|
|
|
199
315
|
rowFree.style.top = '10px';
|
|
200
316
|
rowFree.style.left = '10px';
|
|
201
317
|
rowFree.style.width = '200px';
|
|
202
|
-
rowFree.innerHTML = '
|
|
203
|
-
rowFree.classList.add('
|
|
318
|
+
rowFree.innerHTML = '↕<span data-label="free"></span>';
|
|
319
|
+
rowFree.classList.add('fancy-label')
|
|
320
|
+
rowFree.classList.add('btn')
|
|
204
321
|
root.appendChild(rowFree);
|
|
205
322
|
|
|
206
323
|
var rowUp = document.createElement('div')
|
|
@@ -208,8 +325,9 @@ export let myDom = {
|
|
|
208
325
|
rowUp.style.top = '10px';
|
|
209
326
|
rowUp.style.left = '10px';
|
|
210
327
|
rowUp.style.width = '200px';
|
|
211
|
-
rowUp.innerHTML = '
|
|
212
|
-
rowUp.classList.add('
|
|
328
|
+
rowUp.innerHTML = '↑<span data-label="up"></span>';
|
|
329
|
+
rowUp.classList.add('fancy-label')
|
|
330
|
+
rowUp.classList.add('btn')
|
|
213
331
|
root.appendChild(rowUp);
|
|
214
332
|
|
|
215
333
|
var rowHand = document.createElement('div')
|
|
@@ -218,7 +336,8 @@ export let myDom = {
|
|
|
218
336
|
rowHand.style.left = '10px';
|
|
219
337
|
rowHand.style.width = '200px';
|
|
220
338
|
rowHand.innerHTML = '<span data-label="hand"></span>';
|
|
221
|
-
rowHand.classList.add('
|
|
339
|
+
rowHand.classList.add('fancy-label')
|
|
340
|
+
rowHand.classList.add('btn')
|
|
222
341
|
root.appendChild(rowHand);
|
|
223
342
|
|
|
224
343
|
// INJECT TABLE HEADER ROW
|
|
@@ -228,12 +347,45 @@ export let myDom = {
|
|
|
228
347
|
this.createRow(rowUp);
|
|
229
348
|
this.createRow(rowHand);
|
|
230
349
|
|
|
350
|
+
this.createSelectedBox();
|
|
351
|
+
|
|
231
352
|
document.body.appendChild(root);
|
|
232
353
|
// console.log('JambTable added.')
|
|
233
354
|
},
|
|
234
355
|
|
|
235
|
-
|
|
356
|
+
showHideJambTable: () => {
|
|
357
|
+
const panel = document.getElementById('jambTable');
|
|
358
|
+
if(panel.classList.contains('show')) {
|
|
359
|
+
panel.classList.remove('show');
|
|
360
|
+
panel.classList.add('hide');
|
|
361
|
+
// Delay actual hiding from layout to finish animation
|
|
362
|
+
setTimeout(() => {
|
|
363
|
+
panel.style.display = 'none';
|
|
364
|
+
}, 300);
|
|
365
|
+
} else {
|
|
366
|
+
panel.style.display = 'flex';
|
|
367
|
+
setTimeout(() => {
|
|
368
|
+
panel.classList.remove('hide');
|
|
369
|
+
panel.classList.add('show');
|
|
370
|
+
}, 10); // allow repaint
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
createSelectedBox: function() {
|
|
374
|
+
var topTitleDOM = document.createElement('div')
|
|
375
|
+
topTitleDOM.id = 'topTitleDOM';
|
|
376
|
+
topTitleDOM.style.width = 'auto';
|
|
377
|
+
topTitleDOM.style.position = 'absolute';
|
|
378
|
+
topTitleDOM.style.left = '35%';
|
|
379
|
+
topTitleDOM.style.top = '5%';
|
|
380
|
+
topTitleDOM.style.background = '#7d7d7d8c';
|
|
381
|
+
topTitleDOM.innerHTML = app.label.get.ready + ", " + app.userState.name + '.';
|
|
382
|
+
document.body.appendChild(topTitleDOM);
|
|
383
|
+
addEventListener('updateTitle', (e) => {
|
|
384
|
+
typeText('topTitleDOM', e.detail);
|
|
385
|
+
})
|
|
386
|
+
},
|
|
236
387
|
|
|
388
|
+
createLeftHeaderRow: function(myRoot) {
|
|
237
389
|
for(var x = 1;x < 7;x++) {
|
|
238
390
|
var rowNumber = document.createElement('div')
|
|
239
391
|
rowNumber.id = 'rowNumber' + x;
|
|
@@ -433,7 +585,7 @@ export let myDom = {
|
|
|
433
585
|
var getName = e.target.id;
|
|
434
586
|
getName = getName.replace('free-rowNumber', '')
|
|
435
587
|
var count23456 = 0;
|
|
436
|
-
for(let key in dices.
|
|
588
|
+
for(let key in dices.SAVED_DICES) {
|
|
437
589
|
if(parseInt(dices.R[key]) == parseInt(getName)) {
|
|
438
590
|
count23456++;
|
|
439
591
|
}
|
|
@@ -535,6 +687,7 @@ export let myDom = {
|
|
|
535
687
|
rowNumber.style.left = '10px';
|
|
536
688
|
rowNumber.style.width = 'auto';
|
|
537
689
|
rowNumber.style.background = '#7d7d7d8c';
|
|
690
|
+
rowNumber.style.cursor = 'pointer';
|
|
538
691
|
rowNumber.innerHTML = `-`;
|
|
539
692
|
|
|
540
693
|
this.memoNumberRow.push(rowNumber)
|
|
@@ -553,7 +706,7 @@ export let myDom = {
|
|
|
553
706
|
console.log('LOG ', getName)
|
|
554
707
|
if(parseInt(getName) == 1) {
|
|
555
708
|
var count1 = 0;
|
|
556
|
-
for(let key in dices.
|
|
709
|
+
for(let key in dices.SAVED_DICES) {
|
|
557
710
|
if(parseInt(dices.R[key]) == 1) {
|
|
558
711
|
console.log('yeap', dices.R)
|
|
559
712
|
count1++;
|
|
@@ -574,7 +727,7 @@ export let myDom = {
|
|
|
574
727
|
if(parseInt(getName) == this.state.rowDown.length + 1) {
|
|
575
728
|
console.log('moze za ', parseInt(getName))
|
|
576
729
|
var count23456 = 0;
|
|
577
|
-
for(let key in dices.
|
|
730
|
+
for(let key in dices.SAVED_DICES) {
|
|
578
731
|
if(parseInt(dices.R[key]) == parseInt(getName)) {
|
|
579
732
|
console.log('yeap', dices.R)
|
|
580
733
|
count23456++;
|
|
@@ -5,24 +5,25 @@ export var unlitTextures = function() {
|
|
|
5
5
|
useSingleRenderPass: false,
|
|
6
6
|
canvasSize: 'fullscreen'
|
|
7
7
|
}, () => {
|
|
8
|
+
addEventListener('AmmoReady', () => {
|
|
9
|
+
let c = {
|
|
10
|
+
scale: 2,
|
|
11
|
+
position: {x: -3, y: 0, z: -10},
|
|
12
|
+
rotation: {x: 0, y: 0, z: 0},
|
|
13
|
+
rotationSpeed: {x: 10, y: 0, z: 0},
|
|
14
|
+
texturesPaths: ['./res/textures/rust.jpg']
|
|
15
|
+
};
|
|
8
16
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
position: {x: 3, y: 0, z: -10},
|
|
20
|
-
rotation: {x: 0, y: 0, z: 0},
|
|
21
|
-
rotationSpeed: {x: 10, y: 0, z: 0},
|
|
22
|
-
texturesPaths: ['./res/textures/default.png']
|
|
23
|
-
};
|
|
24
|
-
unlitTextures.addBall(c)
|
|
25
|
-
unlitTextures.addCube(o)
|
|
17
|
+
let o = {
|
|
18
|
+
scale: 2,
|
|
19
|
+
position: {x: 3, y: 0, z: -10},
|
|
20
|
+
rotation: {x: 0, y: 0, z: 0},
|
|
21
|
+
rotationSpeed: {x: 10, y: 0, z: 0},
|
|
22
|
+
texturesPaths: ['./res/textures/default.png']
|
|
23
|
+
};
|
|
24
|
+
unlitTextures.addCube(o)
|
|
25
|
+
unlitTextures.addBall(c)
|
|
26
|
+
});
|
|
26
27
|
})
|
|
27
28
|
|
|
28
29
|
window.app = unlitTextures;
|