janusweb 1.5.30 → 1.5.34
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/CHANGELOG +39 -0
- package/LICENSE +1 -1
- package/media/assets/janus-avatar-animations.glb +0 -0
- package/media/assets/janus-avatar-base.glb +0 -0
- package/media/assets/webui/apps/avatar/avatar.css +6 -2
- package/media/assets/webui/apps/avatar/avatar.js +99 -11
- package/media/assets/webui/apps/buttons/buttons.html +2 -2
- package/media/assets/webui/apps/buttons/buttons.js +3 -3
- package/media/assets/webui/apps/comms/comms.js +7 -4
- package/media/assets/webui/apps/comms/voip.js +133 -57
- package/media/assets/webui/apps/editor/codemirror/addon/hint/javascript-hint.js +162 -0
- package/media/assets/webui/apps/editor/codemirror/addon/hint/show-hint.css +36 -0
- package/media/assets/webui/apps/editor/codemirror/addon/hint/show-hint.js +529 -0
- package/media/assets/webui/apps/editor/codemirror/addon/hint/xml-hint.js +140 -0
- package/media/assets/webui/apps/editor/codemirror/keymap/vim.js +5734 -0
- package/media/assets/webui/apps/editor/codemirror/lib/codemirror.css +350 -0
- package/media/assets/webui/apps/editor/codemirror/lib/codemirror.js +9800 -0
- package/media/assets/webui/apps/editor/codemirror/lib/jmldark.css +33 -0
- package/media/assets/webui/apps/editor/codemirror/mode/css/css.js +864 -0
- package/media/assets/webui/apps/editor/codemirror/mode/htmlmixed/htmlmixed.js +153 -0
- package/media/assets/webui/apps/editor/codemirror/mode/javascript/javascript.js +942 -0
- package/media/assets/webui/apps/editor/codemirror/mode/xml/xml.js +413 -0
- package/media/assets/webui/apps/editor/editor.css +3 -0
- package/media/assets/webui/apps/editor/editor.js +409 -9
- package/media/assets/webui/apps/editor/editor.json +6 -3
- package/media/assets/webui/apps/inventory/inventory.html +7 -4
- package/media/assets/webui/apps/inventory/inventory.js +2 -2
- package/media/assets/webui/apps/locomotion/teleporter.js +10 -9
- package/media/assets/webui/apps/navigation/navigation.js +12 -12
- package/media/assets/webui/apps/settings/settings.html +1 -1
- package/media/assets/webui/apps/vfs/browserfs/browserfs.js +8 -0
- package/media/assets/webui/apps/vfs/vfs.css +52 -0
- package/media/assets/webui/apps/vfs/vfs.js +452 -0
- package/media/assets/webui/apps/vfs/vfs.json +10 -0
- package/media/assets/webui/apps/virtualgamepad/virtualgamepad.js +9 -7
- package/media/assets/webui/apps/xrmenu/xrmenu.js +13 -4
- package/media/assets/webui/default.json +2 -1
- package/media/assets/webui/none.json +1 -0
- package/media/assets/webui/themes/default.css +29 -2
- package/media/assets.json +2 -1
- package/media/index.html +1 -1
- package/media/lib/draco/README.md +32 -0
- package/media/lib/draco/draco_decoder.js +52 -0
- package/media/lib/draco/draco_decoder.wasm +0 -0
- package/media/lib/draco/draco_encoder.js +33 -0
- package/media/lib/draco/draco_wasm_wrapper.js +104 -0
- package/media/lib/draco/gltf/draco_decoder.js +48 -0
- package/media/lib/draco/gltf/draco_decoder.wasm +0 -0
- package/media/lib/draco/gltf/draco_encoder.js +33 -0
- package/media/lib/draco/gltf/draco_wasm_wrapper.js +104 -0
- package/media/lib/physx/physx.release.js +21 -0
- package/media/lib/physx/physx.release.wasm +0 -0
- package/media/manifest.json +5 -5
- package/media/service-worker.js +7 -0
- package/package.json +2 -9
- package/scripts/client.js +67 -46
- package/scripts/config.js +2 -0
- package/scripts/elements/linesegments.js +10 -3
- package/scripts/external/JanusFireboxParser.js +1 -0
- package/scripts/image.js +7 -1
- package/scripts/janusbase.js +104 -43
- package/scripts/janusghost.js +314 -16
- package/scripts/januslight.js +11 -2
- package/scripts/janusparagraph.js +8 -6
- package/scripts/janusparticle.js +26 -16
- package/scripts/janusplayer.js +126 -37
- package/scripts/janusweb.js +26 -2
- package/scripts/janusxrplayer.js +5 -3
- package/scripts/multiplayermanager.js +6 -4
- package/scripts/object.js +246 -88
- package/scripts/portal.js +23 -14
- package/scripts/remoteplayer.js +1 -25
- package/scripts/room.js +199 -77
- package/scripts/sound.js +8 -6
- package/scripts/text.js +13 -5
- package/scripts/translators/janusvfs.js +20 -0
- package/scripts/video.js +1 -1
- package/scripts/websurface.js +17 -3
- package/utils/build.sh +3 -0
- package/utils/init.sh +2 -2
- package/scripts/chat.js +0 -80
- package/scripts/ui.js +0 -265
- package/scripts/urlbar.js +0 -93
- package/templates/janusweb.tpl +0 -3
package/CHANGELOG
CHANGED
|
@@ -1,3 +1,42 @@
|
|
|
1
|
+
JanusWeb 1.5
|
|
2
|
+
============
|
|
3
|
+
- Threejs upgrade to r133
|
|
4
|
+
- Skeletal and morphtarget animation support
|
|
5
|
+
- Lighting and material improvements
|
|
6
|
+
- Transmission
|
|
7
|
+
- Clearcoat
|
|
8
|
+
- HDRI envmaps (EXR)
|
|
9
|
+
- Improved shadow mapping
|
|
10
|
+
- light_style parameter for Quake-style light patterns
|
|
11
|
+
- DRACO glTF compression
|
|
12
|
+
- Avatar improvements
|
|
13
|
+
- Ready Player Me
|
|
14
|
+
- Animation packs
|
|
15
|
+
- Morph targets for speaking, blinking, etc
|
|
16
|
+
- Smarter fading
|
|
17
|
+
- Third person camera option
|
|
18
|
+
- WebXR improvements
|
|
19
|
+
- Stripped out all legacy WebVR and draft WebXR code
|
|
20
|
+
- Optimized performance
|
|
21
|
+
- WebXR Layers for equi video playback
|
|
22
|
+
- WebXR Navigation
|
|
23
|
+
- In-VR UI
|
|
24
|
+
- Collision improvements
|
|
25
|
+
- New collision combos: sphere/mesh, capsule/mesh, capsule/capsule
|
|
26
|
+
- Audio Improvements
|
|
27
|
+
- Room audio graph support
|
|
28
|
+
- HiFi VOIP backend support
|
|
29
|
+
- Configurable VOIP backend per room
|
|
30
|
+
- Experimental / future Stuff
|
|
31
|
+
- AR with plane detection and lighting estimation
|
|
32
|
+
- Swappable physics backends
|
|
33
|
+
- NVIDIA PhysX / multi-threaded physics
|
|
34
|
+
- TensorFlow.js integration - BlazePose full-body tracking, FacePose, HandPose
|
|
35
|
+
- Hybrid standalone XR HMD + desktop processing using local network WebRTC
|
|
36
|
+
- Continued performance improvements
|
|
37
|
+
- iOS support
|
|
38
|
+
- Patreon and Gitcoin donation pages
|
|
39
|
+
|
|
1
40
|
JanusWeb 1.3
|
|
2
41
|
============
|
|
3
42
|
- Engine improvements
|
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2013-
|
|
3
|
+
Copyright (c) 2013-2021 James Baicoianu and JanusVR, Inc.
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
|
Binary file
|
|
Binary file
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
janus-avatar-picker {
|
|
2
2
|
display: block;
|
|
3
3
|
width: 100%;
|
|
4
|
-
max-width: 40em;
|
|
5
|
-
text-align: center;
|
|
6
4
|
}
|
|
7
5
|
janus-avatar-picker ui-list {
|
|
8
6
|
height: 20vh;
|
|
@@ -48,3 +46,9 @@ janus-avatar-picker-item h2 {
|
|
|
48
46
|
janus-avatar-picker ui-button {
|
|
49
47
|
font-size: 2em;
|
|
50
48
|
}
|
|
49
|
+
janus-avatar-picker iframe {
|
|
50
|
+
width: 100%;
|
|
51
|
+
height: 38em;
|
|
52
|
+
max-height: 80%;
|
|
53
|
+
border: 0;
|
|
54
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/*
|
|
1
2
|
janus.registerElement('avatar_simple', {
|
|
2
3
|
headsrc: 'media/assets/hoverscreen.obj',
|
|
3
4
|
bodysrc: '',
|
|
@@ -35,27 +36,57 @@ janus.registerElement('avatar_rigged', {
|
|
|
35
36
|
updateXR(pose, referenceSpace) {
|
|
36
37
|
}
|
|
37
38
|
});
|
|
38
|
-
|
|
39
|
+
*/
|
|
39
40
|
elation.elements.define('janus-avatar-picker', class extends elation.elements.base {
|
|
40
41
|
init() {
|
|
41
42
|
this.defineAttribute('src', { type: 'string' });
|
|
43
|
+
this.defineAttribute('sources', { type: 'object' });
|
|
42
44
|
this.defineAttribute('previewpos', { type: 'vector3', default: V(-2, 0, -3) });
|
|
45
|
+
this.defineAttribute('hideconfirm', { type: 'boolean', default: false });
|
|
43
46
|
this.defineAttribute('hidereset', { type: 'boolean', default: false });
|
|
44
47
|
this.selected = false;
|
|
45
48
|
}
|
|
46
49
|
create() {
|
|
47
|
-
let tpl =
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
let tpl = '';
|
|
51
|
+
if (this.sources) {
|
|
52
|
+
let sources = (elation.utils.isString(this.sources) ? JSON.parse(this.sources) : this.sources);
|
|
53
|
+
console.log('HI YES', sources);
|
|
54
|
+
if (sources.length > 1) {
|
|
55
|
+
tpl += '<ui-tabs>';
|
|
56
|
+
sources.forEach(source => {
|
|
57
|
+
let sourcestr = this.getSourceString(source);
|
|
58
|
+
tpl += `<ui-tab label="${source.name}">${sourcestr}</ui-tab>`;
|
|
59
|
+
});
|
|
60
|
+
} else {
|
|
61
|
+
tpl = this.getSourceString(sources[0]);
|
|
62
|
+
}
|
|
63
|
+
} else {
|
|
64
|
+
tpl = `
|
|
65
|
+
<ui-tabs>
|
|
66
|
+
<ui-tab label="Chibis">
|
|
67
|
+
<collection-jsonapi id="avatarlist" endpoint="${this.src}"></collection-jsonapi>
|
|
68
|
+
<ui-list name="avatar" selectable="1" collection="avatarlist" itemcomponent="janus-avatar-picker-item"></ui-list>
|
|
69
|
+
</ui-tab>
|
|
70
|
+
<ui-tab label="Ready Player Me">
|
|
71
|
+
<iframe src="https://demo.readyplayer.me/avatar" allow="camera"></iframe>
|
|
72
|
+
</ui-tab>
|
|
73
|
+
</ui-tabs>
|
|
74
|
+
`;
|
|
75
|
+
}
|
|
76
|
+
if (!this.hideconfirm) {
|
|
77
|
+
tpl += `<ui-button name="confirm" disabled="1">Confirm</ui-button>`;
|
|
78
|
+
}
|
|
52
79
|
if (!this.hidereset) {
|
|
53
|
-
tpl +=
|
|
80
|
+
tpl += `<ui-button name="reset">Reset</ui-button>`;
|
|
54
81
|
}
|
|
55
82
|
this.elements = elation.elements.fromString(tpl, this);
|
|
56
83
|
|
|
57
|
-
|
|
58
|
-
|
|
84
|
+
if (this.elements['avatar']) {
|
|
85
|
+
elation.events.add(this.elements['avatar'], 'select', (ev) => this.handleAvatarSelect(ev));
|
|
86
|
+
}
|
|
87
|
+
if (this.elements['confirm']) {
|
|
88
|
+
elation.events.add(this.elements['confirm'], 'click', (ev) => this.handleAvatarConfirm(ev));
|
|
89
|
+
}
|
|
59
90
|
if (this.elements['reset']) {
|
|
60
91
|
elation.events.add(this.elements['reset'], 'click', (ev) => this.handleAvatarReset(ev));
|
|
61
92
|
}
|
|
@@ -66,6 +97,19 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
66
97
|
let observer = new IntersectionObserver(ev => this.handleIntersectionChange(ev), { root: document, rootMargin: '0px', threshold: threshold });
|
|
67
98
|
observer.observe(this);
|
|
68
99
|
document.addEventListener('scroll', ev => this.handleScroll(ev));
|
|
100
|
+
window.addEventListener('message', ev => this.handleWindowMessage(ev));
|
|
101
|
+
}
|
|
102
|
+
getSourceString(source) {
|
|
103
|
+
let tpl = '';
|
|
104
|
+
if (source.type == 'list') {
|
|
105
|
+
tpl = `
|
|
106
|
+
<collection-jsonapi id="avatarlist" endpoint="${source.src}"></collection-jsonapi>
|
|
107
|
+
<ui-list name="avatar" selectable="1" collection="avatarlist" itemcomponent="janus-avatar-picker-item"></ui-list>
|
|
108
|
+
`;
|
|
109
|
+
} else if (source.type == 'iframe') {
|
|
110
|
+
tpl = `<iframe src="${source.src}" allow="camera"></iframe>`;
|
|
111
|
+
}
|
|
112
|
+
return tpl;
|
|
69
113
|
}
|
|
70
114
|
selectAvatar(avatar) {
|
|
71
115
|
let items = this.elements.avatarlist.items,
|
|
@@ -83,6 +127,7 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
83
127
|
}
|
|
84
128
|
}
|
|
85
129
|
showPreview(src) {
|
|
130
|
+
/*
|
|
86
131
|
if (!src) {
|
|
87
132
|
src = 'data:text/plain,' + escape(player.getCurrentAvatarData());
|
|
88
133
|
}
|
|
@@ -99,6 +144,28 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
99
144
|
});
|
|
100
145
|
}
|
|
101
146
|
this.updatePreviewPosition();
|
|
147
|
+
*/
|
|
148
|
+
/*
|
|
149
|
+
let preview = this.previewwindow;
|
|
150
|
+
if (!preview) {
|
|
151
|
+
console.log('append preview', this);
|
|
152
|
+
let avatarPreviewRoom = `
|
|
153
|
+
<fireboxroom>
|
|
154
|
+
<assets>
|
|
155
|
+
</assets>
|
|
156
|
+
<room skybox_left_id="black" skybox_right_id="black" skybox_up_id="black" skybox_down_id="black" skybox_front_id="black" skybox_back_id="black" use_local_asset="room_plane" zdir="0 0 -1">
|
|
157
|
+
<ghost id="{userid}" avatar_src="{src}" lighting="true" pos="0 0 4" rotate_deg_per_sec="20" />
|
|
158
|
+
</room>
|
|
159
|
+
</fireboxroom>`;
|
|
160
|
+
this.previewwindow = elation.elements.create('janus-viewer-avatar', {
|
|
161
|
+
src: 'data:text/plain,' + avatarPreviewRoom, //escape(player.getCurrentAvatarData()),
|
|
162
|
+
shownavigation: false,
|
|
163
|
+
uiconfig: 'https://baicoianu.com/~bai/janusweb/build/media/assets/webui/none.json',
|
|
164
|
+
});
|
|
165
|
+
console.log('bleh', this.previewwindow);
|
|
166
|
+
this.appendChild(this.previewwindow);
|
|
167
|
+
}
|
|
168
|
+
*/
|
|
102
169
|
}
|
|
103
170
|
updatePreviewPosition() {
|
|
104
171
|
if (this.avatarpreview) {
|
|
@@ -112,7 +179,10 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
112
179
|
console.log('selected an avatar', ev.data);
|
|
113
180
|
this.selected = ev.data;
|
|
114
181
|
this.showPreview(ev.data.url);
|
|
115
|
-
this.elements.confirm
|
|
182
|
+
if (this.elements.confirm) {
|
|
183
|
+
this.elements.confirm.disabled = false;
|
|
184
|
+
}
|
|
185
|
+
this.dispatchEvent(new CustomEvent("select", { detail: this.selected }));
|
|
116
186
|
}
|
|
117
187
|
handleAvatarConfirm(ev) {
|
|
118
188
|
this.hidePreview(true);
|
|
@@ -126,7 +196,7 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
126
196
|
}
|
|
127
197
|
}
|
|
128
198
|
handleAvatarReset(ev) {
|
|
129
|
-
player.setAvatar(player.
|
|
199
|
+
player.setAvatar(player.defaultavatar);
|
|
130
200
|
}
|
|
131
201
|
handleIntersectionChange(intersections) {
|
|
132
202
|
if (this.avatarpreview && !intersections[0].isIntersecting) {
|
|
@@ -138,6 +208,24 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
138
208
|
handleScroll(ev) {
|
|
139
209
|
this.updatePreviewPosition();
|
|
140
210
|
}
|
|
211
|
+
handleWindowMessage(ev) {
|
|
212
|
+
if (ev.origin.match(/https:\/\/.*\.readyplayer\.me/)) {
|
|
213
|
+
let avatarurl = ev.data;
|
|
214
|
+
let avatarstr = `
|
|
215
|
+
<FireBoxRoom>
|
|
216
|
+
<assets>
|
|
217
|
+
<assetobject id="body" src="${avatarurl}" />
|
|
218
|
+
<assetobject id="avatar_animations" src="https://assets.metacade.com/james/readyplayerme/animations.glb" />
|
|
219
|
+
</assets>
|
|
220
|
+
<room>
|
|
221
|
+
<ghost body_id="body" bone_head="Head" morphtarget_mouth="mouthOpen" morphtarget_eyes="eyesClosed" />
|
|
222
|
+
</room>
|
|
223
|
+
</FireBoxRoom>
|
|
224
|
+
`;
|
|
225
|
+
player.setAvatar(avatarstr);
|
|
226
|
+
this.handleAvatarSelect({data: { url: 'data:text/plain,' + avatarstr } });
|
|
227
|
+
}
|
|
228
|
+
}
|
|
141
229
|
});
|
|
142
230
|
elation.elements.define('janus-avatar-picker-item', class extends elation.elements.ui.item {
|
|
143
231
|
create() {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<ui-buttonbar>
|
|
2
2
|
{#showedit}<janus-ui-editor-button title="Edit">Edit</janus-ui-editor-button>{/showedit}
|
|
3
|
-
{#showshare}<janus-button-share title="Share Link">Share</janus-button-share>{/showshare}
|
|
3
|
+
<!-- {#showshare}<janus-button-share title="Share Link">Share</janus-button-share>{/showshare} -->
|
|
4
4
|
{#showfullscreen}<ui-button name="fullscreen" onclick="janus.engine.client.toggleFullscreen()" title="Fullscreen">⛶</ui-button>{/showfullscreen}
|
|
5
5
|
{#showvr}<janus-button-webvr title="Enter VR"></janus-button-webvr>{/showvr}
|
|
6
6
|
{#showar}<janus-button-webar title="Enter AR"></janus-button-webar>{/showar}
|
|
7
7
|
{#showaudio}<janus-button-audio title="Audio Settings">Audio</janus-button-audio>{/showaudio}
|
|
8
8
|
{#showvoip}<janus-button-voip title="Voice Settings">Voice</janus-button-voip>{/showvoip}
|
|
9
9
|
{#showsettings}<janus-ui-settings-button title="Settings">Config</janus-ui-settings-button>{/showsettings}
|
|
10
|
-
{#showdebug}<janus-button-debug title="Debug">Debug</janus-button-debug>{/showdebug}
|
|
10
|
+
<!-- {#showdebug}<janus-button-debug title="Debug">Debug</janus-button-debug>{/showdebug} -->
|
|
11
11
|
</ui-buttonbar>
|
|
12
12
|
|
|
@@ -3,14 +3,14 @@ elation.elements.define('janus.ui.buttons', class extends elation.elements.base
|
|
|
3
3
|
super.init();
|
|
4
4
|
this.defineAttributes({
|
|
5
5
|
showedit: { type: 'boolean', default: true },
|
|
6
|
-
showshare: { type: 'boolean', default:
|
|
6
|
+
showshare: { type: 'boolean', default: false },
|
|
7
7
|
showfullscreen: { type: 'boolean', default: true },
|
|
8
8
|
showvr: { type: 'boolean', default: true },
|
|
9
9
|
showar: { type: 'boolean', default: true },
|
|
10
10
|
showsettings: { type: 'boolean', default: true },
|
|
11
11
|
showaudio: { type: 'boolean', default: true },
|
|
12
12
|
showvoip: { type: 'boolean', default: true },
|
|
13
|
-
showdebug: { type: 'boolean', default:
|
|
13
|
+
showdebug: { type: 'boolean', default: false },
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
16
|
create() {
|
|
@@ -162,7 +162,7 @@ elation.elements.define('janus-button-webar', class extends elation.elements.ui.
|
|
|
162
162
|
onactivate(ev) {
|
|
163
163
|
this.label = this.activelabel;
|
|
164
164
|
if (this.xr) {
|
|
165
|
-
janus.engine.client.startXR('immersive-ar', { requiredFeatures: [
|
|
165
|
+
janus.engine.client.startXR('immersive-ar', { requiredFeatures: [], optionalFeatures: ['local-floor', 'plane-detection'] });
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
ondeactivate(ev) {
|
|
@@ -290,6 +290,7 @@ elation.elements.define('janus-comms-voip', class extends elation.elements.base
|
|
|
290
290
|
janus.registerElement('playerlabel', {
|
|
291
291
|
player_name: '',
|
|
292
292
|
font: 'monospace',
|
|
293
|
+
threshold: .2,
|
|
293
294
|
|
|
294
295
|
create() {
|
|
295
296
|
this.currentcolor = V(255,255,255);
|
|
@@ -297,7 +298,7 @@ janus.registerElement('playerlabel', {
|
|
|
297
298
|
this.canvas.width = 512;
|
|
298
299
|
this.canvas.height = 64;
|
|
299
300
|
let imageid = this.player_name + '_playerlabel';
|
|
300
|
-
|
|
301
|
+
this.loadNewAsset('image', {
|
|
301
302
|
id: imageid,
|
|
302
303
|
canvas: this.canvas,
|
|
303
304
|
hasalpha: true,
|
|
@@ -308,8 +309,8 @@ janus.registerElement('playerlabel', {
|
|
|
308
309
|
//collision_id: 'cube',
|
|
309
310
|
collision_scale: V(.85,7,.1),
|
|
310
311
|
collision_pos: V(0,-3,0),
|
|
311
|
-
|
|
312
|
-
|
|
312
|
+
collidable: false,
|
|
313
|
+
pickable: true,
|
|
313
314
|
scale: V(2,.25,1),
|
|
314
315
|
image_id: imageid,
|
|
315
316
|
billboard: 'y',
|
|
@@ -375,7 +376,9 @@ janus.registerElement('playerlabel', {
|
|
|
375
376
|
console.log('got an audio source', source);
|
|
376
377
|
},
|
|
377
378
|
setAudioVolume(volume) {
|
|
378
|
-
|
|
379
|
+
let scale = 1 + (volume > this.threshold ? volume / 2.5 : 0);
|
|
380
|
+
this.scale.set(scale, scale, scale);
|
|
381
|
+
if (volume > this.threshold) {
|
|
379
382
|
this.label.col = '#0f0';
|
|
380
383
|
if (this.colorreset) {
|
|
381
384
|
clearTimeout(this.colorreset);
|