janusweb 1.5.29 → 1.5.33
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/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 +97 -10
- 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 +138 -55
- package/media/assets/webui/apps/editor/editor.js +2 -0
- package/media/assets/webui/apps/inventory/inventory.html +7 -4
- package/media/assets/webui/apps/inventory/inventory.js +1 -1
- package/media/assets/webui/apps/locomotion/teleporter.js +9 -8
- package/media/assets/webui/apps/settings/settings.html +1 -1
- package/media/assets/webui/apps/virtualgamepad/virtualgamepad.js +9 -7
- package/media/assets/webui/apps/xrmenu/xrmenu.js +13 -4
- package/media/assets/webui/none.json +1 -0
- 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 +1 -1
- package/scripts/client.js +4 -3
- package/scripts/config.js +2 -0
- package/scripts/elements/linesegments.js +5 -1
- package/scripts/external/JanusFireboxParser.js +1 -0
- package/scripts/image.js +7 -1
- package/scripts/janusbase.js +83 -34
- package/scripts/janusghost.js +314 -15
- package/scripts/januslight.js +11 -2
- package/scripts/janusparagraph.js +3 -3
- package/scripts/janusparticle.js +16 -5
- package/scripts/janusplayer.js +124 -35
- package/scripts/janusweb.js +5 -0
- package/scripts/janusxrplayer.js +2 -3
- package/scripts/multiplayermanager.js +3 -1
- package/scripts/object.js +106 -10
- package/scripts/portal.js +28 -12
- package/scripts/remoteplayer.js +1 -25
- package/scripts/room.js +116 -36
- package/scripts/sound.js +8 -5
- package/scripts/text.js +3 -3
- package/scripts/websurface.js +6 -1
- 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
|
@@ -163,6 +163,11 @@ console.log('leave room and remove all occupants', this.room);
|
|
|
163
163
|
elation.events.add(player._target, 'username_change', (ev) => this.handleUsernameChange(ev));
|
|
164
164
|
elation.events.fire({type: 'init', element: this});
|
|
165
165
|
}
|
|
166
|
+
disconnect() {
|
|
167
|
+
if (this.sfu) {
|
|
168
|
+
this.sfu.adapter.disconnect();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
166
171
|
initRoom(room) {
|
|
167
172
|
let sfu = this.sfu;
|
|
168
173
|
if (!room.private) {
|
|
@@ -197,21 +202,19 @@ elation.elements.define('janus-voip-client-hifi', class extends elation.elements
|
|
|
197
202
|
let localuser = this.parentNode.localuser;
|
|
198
203
|
this.remoteusers[localuser.userid] = localuser;
|
|
199
204
|
|
|
200
|
-
console.log('create hifi client', this);
|
|
201
205
|
elation.file.get('js', 'https://hifi-spatial-audio-api.s3.amazonaws.com/releases/latest/HighFidelityAudio-latest.js', (ev) => {
|
|
202
206
|
this.connect();
|
|
203
|
-
console.log('FIRE HIFI INIT');
|
|
204
207
|
elation.events.fire({type: 'init', element: this});
|
|
205
208
|
});
|
|
206
209
|
this.roomid = room.voipid || '2bfa2bd1-9338-46c3-b740-e339303a1225';
|
|
207
210
|
}
|
|
208
211
|
async connect() {
|
|
209
212
|
let currentPosition = new HighFidelityAudio.Point3D({ "x": 0, "y": 0, "z": 0 });
|
|
210
|
-
let currentOrientation = new HighFidelityAudio.
|
|
213
|
+
let currentOrientation = new HighFidelityAudio.Quaternion({ x: 0, y: 0, z: 0, w: 1});
|
|
211
214
|
|
|
212
215
|
let initialHiFiAudioAPIData = new HighFidelityAudio.HiFiAudioAPIData({
|
|
213
216
|
position: currentPosition,
|
|
214
|
-
|
|
217
|
+
orientation: currentOrientation,
|
|
215
218
|
providedUserID: player.getNetworkUsername(),
|
|
216
219
|
});
|
|
217
220
|
let hifiCommunicator = new HighFidelityAudio.HiFiCommunicator({ initialHiFiAudioAPIData });
|
|
@@ -231,7 +234,6 @@ console.log('voip picker select?', ev);
|
|
|
231
234
|
});
|
|
232
235
|
*/
|
|
233
236
|
|
|
234
|
-
console.log('new hifi client has existing input stream?', this.inputstream);
|
|
235
237
|
if (this.inputstream) {
|
|
236
238
|
hifiCommunicator.setInputAudioMediaStream(this.inputstream);
|
|
237
239
|
}
|
|
@@ -262,7 +264,7 @@ console.log('new hifi client has existing input stream?', this.inputstream);
|
|
|
262
264
|
let newUserDataSubscription = new HighFidelityAudio.UserDataSubscription({
|
|
263
265
|
components: [
|
|
264
266
|
HighFidelityAudio.AvailableUserDataSubscriptionComponents.Position,
|
|
265
|
-
HighFidelityAudio.AvailableUserDataSubscriptionComponents.
|
|
267
|
+
HighFidelityAudio.AvailableUserDataSubscriptionComponents.Orientation,
|
|
266
268
|
HighFidelityAudio.AvailableUserDataSubscriptionComponents.VolumeDecibels
|
|
267
269
|
],
|
|
268
270
|
callback: audioDataArray => this.handleUserDataSubscription(audioDataArray)
|
|
@@ -273,7 +275,7 @@ console.log('new hifi client has existing input stream?', this.inputstream);
|
|
|
273
275
|
/*
|
|
274
276
|
this.userData = {
|
|
275
277
|
position: currentPosition,
|
|
276
|
-
|
|
278
|
+
orientation: currentOrientation,
|
|
277
279
|
providedUserID: player.getNetworkUsername(),
|
|
278
280
|
};
|
|
279
281
|
*/
|
|
@@ -308,10 +310,10 @@ console.log('new hifi client has existing input stream?', this.inputstream);
|
|
|
308
310
|
this.userData.position.y = pos.y * scale;
|
|
309
311
|
this.userData.position.z = pos.z * scale;
|
|
310
312
|
|
|
311
|
-
this.userData.
|
|
312
|
-
this.userData.
|
|
313
|
-
this.userData.
|
|
314
|
-
this.userData.
|
|
313
|
+
this.userData.orientation.x = orientation.x;
|
|
314
|
+
this.userData.orientation.y = orientation.y;
|
|
315
|
+
this.userData.orientation.z = orientation.z;
|
|
316
|
+
this.userData.orientation.w = orientation.w;
|
|
315
317
|
|
|
316
318
|
if (this.hifiCommunicator._currentHiFiAudioAPIData) {
|
|
317
319
|
this.hifiCommunicator.updateUserDataAndTransmit(this.userData);
|
|
@@ -366,7 +368,7 @@ elation.elements.define('janus-voip-localuser', class extends elation.elements.b
|
|
|
366
368
|
this.defineAttribute('userid', { type: 'string', });
|
|
367
369
|
this.defineAttribute('muted', { type: 'boolean', default: true, });
|
|
368
370
|
this.defineAttribute('speaking', { type: 'boolean', default: false });
|
|
369
|
-
|
|
371
|
+
this.defineAttribute('threshold', { type: 'float', default: .2 });
|
|
370
372
|
}
|
|
371
373
|
create() {
|
|
372
374
|
this.userid = player.getNetworkUsername();
|
|
@@ -428,6 +430,30 @@ elation.elements.define('janus-voip-localuser', class extends elation.elements.b
|
|
|
428
430
|
*/
|
|
429
431
|
this.stream = data;
|
|
430
432
|
|
|
433
|
+
let listener = player.engine.systems.sound.getRealListener();
|
|
434
|
+
let context = listener.context;
|
|
435
|
+
let analyser = context.createAnalyser();
|
|
436
|
+
let source = context.createMediaStreamSource(this.stream);
|
|
437
|
+
source.connect(analyser);
|
|
438
|
+
|
|
439
|
+
analyser.fftSize = 32;
|
|
440
|
+
this.analyser = analyser;
|
|
441
|
+
this.audiobuffer = new Uint8Array(analyser.frequencyBinCount);
|
|
442
|
+
|
|
443
|
+
if (this.updateVolumeInterval) {
|
|
444
|
+
clearInterval(this.updateVolumeInterval);
|
|
445
|
+
this.updateVolumeInterval = false;
|
|
446
|
+
}
|
|
447
|
+
this.updateVolumeInterval = setInterval(() => {
|
|
448
|
+
analyser.getByteFrequencyData(this.audiobuffer);
|
|
449
|
+
let sum = 0;
|
|
450
|
+
for (let i = 0; i < this.audiobuffer.length; i++) {
|
|
451
|
+
sum += this.audiobuffer[i];
|
|
452
|
+
}
|
|
453
|
+
let avg = sum / this.audiobuffer.length;
|
|
454
|
+
this.updateVolume(avg / 100);
|
|
455
|
+
}, 20);
|
|
456
|
+
|
|
431
457
|
/*
|
|
432
458
|
player.createObject('object', {
|
|
433
459
|
id: 'cone',
|
|
@@ -457,15 +483,24 @@ elation.elements.define('janus-voip-localuser', class extends elation.elements.b
|
|
|
457
483
|
this.averagevolume = (percent * .6 + this.averagevolume * .4)
|
|
458
484
|
if (isNaN(this.averagevolume)) this.averagevolume = 0;
|
|
459
485
|
//this.style.opacity = percent;
|
|
460
|
-
if (this.averagevolume > .
|
|
486
|
+
if (this.averagevolume > this.threshold) {
|
|
461
487
|
this.speaking = true;
|
|
488
|
+
player.defaultanimation = 'speak';
|
|
462
489
|
if (this.colorreset) {
|
|
463
490
|
clearTimeout(this.colorreset);
|
|
464
491
|
}
|
|
465
492
|
this.colorreset = setTimeout(() => {
|
|
466
493
|
this.speaking = false;
|
|
467
494
|
this.colorreset = false;
|
|
495
|
+
player.defaultanimation = 'idle';
|
|
468
496
|
}, 200);
|
|
497
|
+
if (player.ghost) {
|
|
498
|
+
player.ghost.setSpeakingVolume(this.averagevolume);
|
|
499
|
+
}
|
|
500
|
+
} else {
|
|
501
|
+
if (player.ghost) {
|
|
502
|
+
player.ghost.setSpeakingVolume(0);
|
|
503
|
+
}
|
|
469
504
|
}
|
|
470
505
|
}
|
|
471
506
|
|
|
@@ -479,6 +514,7 @@ elation.elements.define('janus-voip-remoteuser', class extends elation.elements.
|
|
|
479
514
|
'hasvideo': { type: 'boolean', default: false },
|
|
480
515
|
'averagevolume': { type: 'float', default: 0 },
|
|
481
516
|
'speaking': { type: 'boolean', default: false },
|
|
517
|
+
'threshold': { type: 'float', default: .2 },
|
|
482
518
|
});
|
|
483
519
|
this.lastposition = V();
|
|
484
520
|
setTimeout(() => this.setAttribute('active', true), 100);
|
|
@@ -520,6 +556,30 @@ elation.elements.define('janus-voip-remoteuser', class extends elation.elements.
|
|
|
520
556
|
this.audio = audio;
|
|
521
557
|
this.appendChild(audio);
|
|
522
558
|
this.hasaudio = true;
|
|
559
|
+
|
|
560
|
+
let listener = player.engine.systems.sound.getRealListener();
|
|
561
|
+
let context = listener.context;
|
|
562
|
+
let analyser = context.createAnalyser();
|
|
563
|
+
let source = context.createMediaStreamSource(audio.srcObject);
|
|
564
|
+
source.connect(analyser);
|
|
565
|
+
|
|
566
|
+
analyser.fftSize = 32;
|
|
567
|
+
this.analyser = analyser;
|
|
568
|
+
this.audiobuffer = new Uint8Array(analyser.frequencyBinCount);
|
|
569
|
+
|
|
570
|
+
if (this.updateVolumeInterval) {
|
|
571
|
+
clearInterval(this.updateVolumeInterval);
|
|
572
|
+
this.updateVolumeInterval = false;
|
|
573
|
+
}
|
|
574
|
+
this.updateVolumeInterval = setInterval(() => {
|
|
575
|
+
analyser.getByteFrequencyData(this.audiobuffer);
|
|
576
|
+
let sum = 0;
|
|
577
|
+
for (let i = 0; i < this.audiobuffer.length; i++) {
|
|
578
|
+
sum += this.audiobuffer[i];
|
|
579
|
+
}
|
|
580
|
+
let avg = sum / this.audiobuffer.length;
|
|
581
|
+
this.updateVolume(avg / 100);
|
|
582
|
+
}, 20);
|
|
523
583
|
}
|
|
524
584
|
|
|
525
585
|
let remoteuser = janus.network.remoteplayers[this.id];
|
|
@@ -598,7 +658,9 @@ elation.elements.define('janus-voip-remoteuser', class extends elation.elements.
|
|
|
598
658
|
|
|
599
659
|
elation.events.add(this.remoteuser, 'update', ev => {
|
|
600
660
|
// Store user's last known position so we know where they were once they leave
|
|
601
|
-
|
|
661
|
+
if (this.lastposition) {
|
|
662
|
+
this.remoteuser.localToWorld(this.lastposition.set(0,0,0));
|
|
663
|
+
}
|
|
602
664
|
});
|
|
603
665
|
}
|
|
604
666
|
|
|
@@ -653,7 +715,7 @@ elation.elements.define('janus-voip-remoteuser', class extends elation.elements.
|
|
|
653
715
|
if (isNaN(this.averagevolume)) this.averagevolume = 0;
|
|
654
716
|
//this.style.opacity = percent;
|
|
655
717
|
//console.log('update volume', percent, this);
|
|
656
|
-
if (this.averagevolume > .
|
|
718
|
+
if (this.averagevolume > this.threshold) {
|
|
657
719
|
this.speaking = true;
|
|
658
720
|
if (this.colorreset) {
|
|
659
721
|
clearTimeout(this.colorreset);
|
|
@@ -664,10 +726,9 @@ elation.elements.define('janus-voip-remoteuser', class extends elation.elements.
|
|
|
664
726
|
}, 200);
|
|
665
727
|
}
|
|
666
728
|
|
|
667
|
-
let scale = 1 + this.averagevolume / 2.5;
|
|
668
729
|
if (this.label3d) {
|
|
669
730
|
this.label3d.setAudioVolume(this.averagevolume);
|
|
670
|
-
this.
|
|
731
|
+
this.remoteuser.setSpeakingVolume(this.averagevolume);
|
|
671
732
|
}
|
|
672
733
|
}
|
|
673
734
|
});
|
|
@@ -680,6 +741,9 @@ elation.elements.define('janus-voip-picker', class extends elation.elements.base
|
|
|
680
741
|
<!-- li><ui-togglebutton name="video" disabled="1">With my webcam</ui-togglebutton></li -->
|
|
681
742
|
</ul>
|
|
682
743
|
`, this);
|
|
744
|
+
this.defineAttributes({
|
|
745
|
+
'showvideo': { type: 'boolean', default: true },
|
|
746
|
+
});
|
|
683
747
|
|
|
684
748
|
elation.events.add(this.elements.none, 'click', (ev) => this.handleSelectNone());
|
|
685
749
|
elation.events.add(this.elements.audio, 'click', (ev) => this.handleSelectAudio(ev));
|
|
@@ -689,7 +753,7 @@ elation.elements.define('janus-voip-picker', class extends elation.elements.base
|
|
|
689
753
|
if (this.voipconfig) {
|
|
690
754
|
// FIXME - starting the audio without explicitly asking the user within this session is bad, but we want to resume across refreshes
|
|
691
755
|
// We should use a session cookie-based timeout in addition to the localStorage settings
|
|
692
|
-
|
|
756
|
+
this.handleSelectAudio({detail: 1});
|
|
693
757
|
}
|
|
694
758
|
console.log('voip picker loaded config', this.voipconfig);
|
|
695
759
|
}
|
|
@@ -710,7 +774,7 @@ elation.elements.define('janus-voip-picker', class extends elation.elements.base
|
|
|
710
774
|
console.log('selected audio', ev.detail, this.voipconfig);
|
|
711
775
|
//janus.engine.systems.sound.enableSound();
|
|
712
776
|
if (!this.subpicker) {
|
|
713
|
-
this.subpicker = elation.elements.create('janus-voip-picker-audio', { config: (this.voipconfig ? JSON.stringify(this.voipconfig) : false) });
|
|
777
|
+
this.subpicker = elation.elements.create('janus-voip-picker-audio', { config: (this.voipconfig ? JSON.stringify(this.voipconfig) : false), showvideo: this.showvideo });
|
|
714
778
|
elation.events.add(this.subpicker, 'select', ev => {
|
|
715
779
|
console.log('SELECTED', ev.detail);
|
|
716
780
|
document.dispatchEvent(new CustomEvent('voip-picker-select', { detail: ev.detail }));
|
|
@@ -734,8 +798,9 @@ elation.elements.define('janus-voip-picker-audio', class extends elation.element
|
|
|
734
798
|
create() {
|
|
735
799
|
this.defineAttributes({
|
|
736
800
|
'config': { type: 'object', default: false },
|
|
801
|
+
'showvideo': { type: 'boolean', default: true },
|
|
737
802
|
});
|
|
738
|
-
|
|
803
|
+
let tplstr = `
|
|
739
804
|
<div class="permissions" name="permissions">
|
|
740
805
|
<ui-spinner></ui-spinner>
|
|
741
806
|
Waiting for permission to be granted
|
|
@@ -747,20 +812,27 @@ elation.elements.define('janus-voip-picker-audio', class extends elation.element
|
|
|
747
812
|
<janus-voip-picker-mictest name="mictest" width="75" height="25"></janus-voip-picker-mictest>
|
|
748
813
|
</li>
|
|
749
814
|
<!-- li><ui-select name="outputDevice" label="Output"></ui-select></li -->
|
|
750
|
-
<li><ui-toggle name="echoCancellation" label="Echo Cancellation"></ui-toggle></li>
|
|
751
|
-
<li><ui-toggle name="noiseSuppression" label="Noise Reduction"></ui-toggle></li>
|
|
752
|
-
</ul>
|
|
753
|
-
<h3>Video</h3>
|
|
754
|
-
<ul>
|
|
755
|
-
<li><ui-toggle name="webcamEnabled" label="Webcam"></ui-toggle></li>
|
|
756
|
-
<li>
|
|
757
|
-
<ui-select name="videoDevice" label="Webcam" hidden="1"></ui-select>
|
|
758
|
-
<janus-voip-picker-videotest name="videotest" width="150" height="150"></janus-voip-picker-videotest>
|
|
759
|
-
</li>
|
|
815
|
+
<li><ui-toggle name="echoCancellation" label="Echo Cancellation" checked></ui-toggle></li>
|
|
816
|
+
<li><ui-toggle name="noiseSuppression" label="Noise Reduction" checked></ui-toggle></li>
|
|
760
817
|
</ul>
|
|
818
|
+
`;
|
|
819
|
+
|
|
820
|
+
if (this.showvideo && this.showvideo != 'false') {
|
|
821
|
+
tplstr += `<h3>Video</h3>
|
|
822
|
+
<ul>
|
|
823
|
+
<li><ui-toggle name="webcamEnabled" label="Webcam"></ui-toggle></li>
|
|
824
|
+
<li>
|
|
825
|
+
<ui-select name="videoDevice" label="Webcam" hidden="1"></ui-select>
|
|
826
|
+
<janus-voip-picker-videotest name="videotest" width="150" height="150"></janus-voip-picker-videotest>
|
|
827
|
+
</li>
|
|
828
|
+
</ul>
|
|
829
|
+
`;
|
|
830
|
+
}
|
|
831
|
+
tplstr += `
|
|
761
832
|
<ui-label name="error" hidden></ui-label>
|
|
762
833
|
<ui-button name="submit">Continue</ui-button>
|
|
763
|
-
|
|
834
|
+
`;
|
|
835
|
+
this.elements = elation.elements.fromString(tplstr, this);
|
|
764
836
|
|
|
765
837
|
if (this.config) {
|
|
766
838
|
console.log('I have a config!', this.config);
|
|
@@ -771,7 +843,9 @@ elation.elements.define('janus-voip-picker-audio', class extends elation.element
|
|
|
771
843
|
//this.getUserMedia();
|
|
772
844
|
|
|
773
845
|
this.elements.inputDevice.addEventListener('change', (ev) => this.getUserMedia());
|
|
774
|
-
this.elements.videoDevice
|
|
846
|
+
if (this.elements.videoDevice) {
|
|
847
|
+
this.elements.videoDevice.addEventListener('change', (ev) => this.getUserMedia());
|
|
848
|
+
}
|
|
775
849
|
//this.elements.outputDevice.addEventListener('change', (ev) => this.getUserMedia());
|
|
776
850
|
elation.events.add(this.elements.echoCancellation, 'toggle', (ev) => this.getUserMedia());
|
|
777
851
|
elation.events.add(this.elements.noiseSuppression, 'toggle', (ev) => this.getUserMedia());
|
|
@@ -803,11 +877,14 @@ elation.elements.define('janus-voip-picker-audio', class extends elation.element
|
|
|
803
877
|
|
|
804
878
|
// FIXME - I'm not really using these UI elements properly here, I shouldn't be mucking with the HTML elements directly
|
|
805
879
|
inputs.select.innerHTML = '';
|
|
806
|
-
cameras.select.innerHTML = '';
|
|
807
|
-
//outputs.select.innerHTML = '';
|
|
808
|
-
|
|
809
880
|
let hasWebcamPermission = true;
|
|
810
|
-
let webcamDisabled
|
|
881
|
+
let webcamDisabled;
|
|
882
|
+
if (cameras) {
|
|
883
|
+
cameras.select.innerHTML = '';
|
|
884
|
+
//outputs.select.innerHTML = '';
|
|
885
|
+
|
|
886
|
+
webcamDisabled = elation.elements.create('option', {innerHTML: 'Disabled', value: 'none', append: cameras.select});
|
|
887
|
+
}
|
|
811
888
|
devices.forEach(d => {
|
|
812
889
|
if (d.kind == 'audioinput') {
|
|
813
890
|
elation.elements.create('option', {innerHTML: d.label, value: d.deviceId, append: inputs.select});
|
|
@@ -821,16 +898,18 @@ elation.elements.define('janus-voip-picker-audio', class extends elation.element
|
|
|
821
898
|
elation.elements.create('option', {innerHTML: d.label, value: d.deviceId, append: outputs.select});
|
|
822
899
|
}
|
|
823
900
|
});
|
|
824
|
-
if (
|
|
825
|
-
this.elements.
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
901
|
+
if (this.elements.videoDevice) {
|
|
902
|
+
if (hasWebcamPermission && this.elements.videoDevice.hidden ) {
|
|
903
|
+
this.elements.webcamEnabled.hide();
|
|
904
|
+
this.elements.videoDevice.show();
|
|
905
|
+
let option = this.elements.videoDevice.select.childNodes[0];
|
|
906
|
+
option.selected = true;
|
|
907
|
+
this.elements.videoDevice.select.value = option.value;
|
|
908
|
+
} else {
|
|
909
|
+
console.log('NO WEBCAM PERMISSION');
|
|
910
|
+
this.elements.webcamEnabled.show();
|
|
911
|
+
this.elements.videoDevice.hide();
|
|
912
|
+
}
|
|
834
913
|
}
|
|
835
914
|
this.elements.permissions.style.display = 'none';
|
|
836
915
|
|
|
@@ -840,7 +919,7 @@ elation.elements.define('janus-voip-picker-audio', class extends elation.element
|
|
|
840
919
|
//this.elements.inputDevice.select.value = this.voipconfig.inputDevice;
|
|
841
920
|
this.elements.inputDevice.setSelected(voipconfig.inputDevice);
|
|
842
921
|
}
|
|
843
|
-
if (voipconfig.videoDevice) {
|
|
922
|
+
if (voipconfig.videoDevice && this.elements.videoDevice) {
|
|
844
923
|
this.elements.videoDevice.setSelected(voipconfig.videoDevice);
|
|
845
924
|
}
|
|
846
925
|
//this.dispatchEvent(new CustomEvent('select', {detail: this.stream}));
|
|
@@ -862,7 +941,7 @@ elation.elements.define('janus-voip-picker-audio', class extends elation.element
|
|
|
862
941
|
console.log('input!', this.elements.inputDevice.value);
|
|
863
942
|
constraints.audio.deviceId = { exact: this.elements.inputDevice.value };
|
|
864
943
|
}
|
|
865
|
-
if (this.elements.videoDevice.value && this.elements.videoDevice.value != 'none') {
|
|
944
|
+
if (this.elements.videoDevice && this.elements.videoDevice.value && this.elements.videoDevice.value != 'none') {
|
|
866
945
|
console.log('video!', this.elements.videoDevice.value);
|
|
867
946
|
constraints.video = {
|
|
868
947
|
deviceId: { exact: this.elements.videoDevice.value },
|
|
@@ -886,7 +965,9 @@ elation.elements.define('janus-voip-picker-audio', class extends elation.element
|
|
|
886
965
|
.then(stream => {
|
|
887
966
|
this.elements.submit.disabled = false;
|
|
888
967
|
this.elements.mictest.setStream(stream);
|
|
889
|
-
this.elements.videotest
|
|
968
|
+
if (this.elements.videotest) {
|
|
969
|
+
this.elements.videotest.setStream(stream);
|
|
970
|
+
}
|
|
890
971
|
if (this.stream) {
|
|
891
972
|
let tracks = this.stream.getTracks();
|
|
892
973
|
tracks.forEach(t => {
|
|
@@ -923,10 +1004,12 @@ elation.elements.define('janus-voip-picker-audio', class extends elation.element
|
|
|
923
1004
|
];
|
|
924
1005
|
keys.forEach(k => {
|
|
925
1006
|
let el = this.elements[k];
|
|
926
|
-
if (
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
1007
|
+
if (this.elements[k]) {
|
|
1008
|
+
if (el instanceof elation.elements.ui.toggle) {
|
|
1009
|
+
settings[k] = this.elements[k].checked;
|
|
1010
|
+
} else {
|
|
1011
|
+
settings[k] = this.elements[k].value;
|
|
1012
|
+
}
|
|
930
1013
|
}
|
|
931
1014
|
});
|
|
932
1015
|
return settings;
|
|
@@ -949,8 +1032,8 @@ elation.elements.define('janus-voip-picker-audio', class extends elation.element
|
|
|
949
1032
|
if ('inputDevice' in settings) this.elements['inputDevice'].setSelected(settings['inputDevice']);
|
|
950
1033
|
if ('echoCancellation' in settings) this.elements['echoCancellation'].checked = settings['echoCancellation'];
|
|
951
1034
|
if ('noiseSuppression' in settings) this.elements['noiseSuppression'].checked = settings['noiseSuppression'];
|
|
952
|
-
if ('webcamEnabled' in settings) this.elements['webcamEnabled'].checked = settings['webcamEnabled'];
|
|
953
|
-
if ('videoDevice' in settings) this.elements['videoDevice'].setSelected(settings['videoDevice']);
|
|
1035
|
+
if ('webcamEnabled' in settings && this.elements['webcamEnabled']) this.elements['webcamEnabled'].checked = settings['webcamEnabled'];
|
|
1036
|
+
if ('videoDevice' in settings && this.elements['videoDevice']) this.elements['videoDevice'].setSelected(settings['videoDevice']);
|
|
954
1037
|
|
|
955
1038
|
this.currentsettings = settings;
|
|
956
1039
|
}
|
|
@@ -1104,9 +1104,11 @@ console.log('change color', obj.col, vec);
|
|
|
1104
1104
|
}
|
|
1105
1105
|
}
|
|
1106
1106
|
this.history.push({type: 'addobjects', objects: objects});
|
|
1107
|
+
/*
|
|
1107
1108
|
if (janus.engine.systems.admin.hidden) {
|
|
1108
1109
|
janus.engine.systems.controls.requestPointerLock();
|
|
1109
1110
|
}
|
|
1111
|
+
*/
|
|
1110
1112
|
}
|
|
1111
1113
|
handleThingAdd(ev) {
|
|
1112
1114
|
setTimeout(() => {
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
<ui-tab label="Room Assets">
|
|
38
38
|
<janus-ui-inventory-roomassets></janus-ui-inventory-roomassets>
|
|
39
39
|
</ui-tab>
|
|
40
|
+
<!-- Disabled Google Poly - maybe one day ICOSA Gallery or someone else will offer the old Google Blocks API again
|
|
40
41
|
<ui-tab label="Google Poly">
|
|
41
42
|
<ui-flexpanel id="poly" vertical>
|
|
42
43
|
<ui-input noflex placeholder="Search for Google Poly models" onaccept="let models = document.getElementById('models'); models.apiargs.keywords = this.value; delete models.apiargs.pageToken; document.getElementById('itemlist').clear(); models.load(); pagination.disabled = false;"></ui-input>
|
|
@@ -44,16 +45,18 @@
|
|
|
44
45
|
<ui-button noflex id="pagination" onclick="let models = document.getElementById('models'); if (models.rawdata.nextPageToken) { models.apiargs.pageToken = models.rawdata.nextPageToken; models.append(); } else { this.disabled = true; }">Load More</ui-button>
|
|
45
46
|
</ui-flexpanel>
|
|
46
47
|
</ui-tab>
|
|
47
|
-
|
|
48
|
+
-->
|
|
48
49
|
<ui-tab label="Vesta">
|
|
49
50
|
<h3>Vesta integration coming soon!</h3>
|
|
50
51
|
<p>When it's ready, you'll be able to access assets you've stored on your Vesta account, and bring them with you anywhere you go.</p>
|
|
51
52
|
<p><a href="https://vesta.janusvr.com/">Sign up for a vesta account today</a></p>
|
|
52
53
|
</ui-tab>
|
|
53
54
|
<ui-tab label="Import">
|
|
54
|
-
<
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
<div>
|
|
56
|
+
<h3>Did you know!?</h3>
|
|
57
|
+
<p>You can drag 3d models, images, videos, and sounds into Janus rooms from other websites, or even your local hard drive!</p>
|
|
58
|
+
<p>Just select the files, drag them over, and drop them into the world. Then use our in-world editing tools to place it where you want it to be.</p>
|
|
59
|
+
</div>
|
|
57
60
|
</ui-tab>
|
|
58
61
|
</ui-tabs>
|
|
59
62
|
|
|
@@ -6,7 +6,7 @@ elation.elements.define('janus.ui.inventory', class extends elation.elements.bas
|
|
|
6
6
|
console.log('INVENTORY ELEMENTS', elements);
|
|
7
7
|
if (elements.primitives) {
|
|
8
8
|
elation.events.add(elements.primitives, 'select', (ev) => this.handlePrimitiveSelect(ev));
|
|
9
|
-
elation.events.add(elements.polyobjects, 'select', (ev) => this.handleAssetSelect(ev));
|
|
9
|
+
//elation.events.add(elements.polyobjects, 'select', (ev) => this.handleAssetSelect(ev));
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
addSource(name, collection) {
|
|
@@ -18,7 +18,7 @@ janus.registerElement('locomotion_teleporter', {
|
|
|
18
18
|
shadow: false,
|
|
19
19
|
shadow_cast: false,
|
|
20
20
|
shadow_receive: false,
|
|
21
|
-
renderorder:
|
|
21
|
+
renderorder: 51,
|
|
22
22
|
depth_test: false,
|
|
23
23
|
depth_write: false,
|
|
24
24
|
});
|
|
@@ -31,7 +31,7 @@ janus.registerElement('locomotion_teleporter', {
|
|
|
31
31
|
shadow: false,
|
|
32
32
|
shadow_cast: false,
|
|
33
33
|
shadow_receive: false,
|
|
34
|
-
renderorder:
|
|
34
|
+
renderorder: 50,
|
|
35
35
|
});
|
|
36
36
|
this.pointer = this.marker.createObject('Object', {
|
|
37
37
|
id: 'pyramid',
|
|
@@ -44,6 +44,7 @@ janus.registerElement('locomotion_teleporter', {
|
|
|
44
44
|
shadow: false,
|
|
45
45
|
shadow_cast: false,
|
|
46
46
|
shadow_receive: false,
|
|
47
|
+
renderorder: 52,
|
|
47
48
|
});
|
|
48
49
|
/*
|
|
49
50
|
this.light = this.createObject('Light', {
|
|
@@ -82,7 +83,7 @@ janus.registerElement('locomotion_teleporter', {
|
|
|
82
83
|
depth_write: false,
|
|
83
84
|
shadow_cast: false,
|
|
84
85
|
shadow_receive: false,
|
|
85
|
-
renderorder:
|
|
86
|
+
renderorder: 1000,
|
|
86
87
|
visible: false,
|
|
87
88
|
});
|
|
88
89
|
|
|
@@ -124,8 +125,8 @@ janus.registerElement('locomotion_teleporter', {
|
|
|
124
125
|
});
|
|
125
126
|
this.activateControlContext('teleporter');
|
|
126
127
|
|
|
127
|
-
room.addEventListener('mousedown', (ev) => this.handleMouseDown(ev));
|
|
128
|
-
room.addEventListener('mouseup', (ev) => this.handleMouseUp(ev));
|
|
128
|
+
//room.addEventListener('mousedown', (ev) => this.handleMouseDown(ev));
|
|
129
|
+
//room.addEventListener('mouseup', (ev) => this.handleMouseUp(ev));
|
|
129
130
|
elation.events.add(janus._target, 'room_change', (ev) => this.handleRoomChange(ev));
|
|
130
131
|
},
|
|
131
132
|
update() {
|
|
@@ -184,7 +185,7 @@ janus.registerElement('locomotion_teleporter', {
|
|
|
184
185
|
}
|
|
185
186
|
}
|
|
186
187
|
this.laser.updateLine();
|
|
187
|
-
if (this.laser.room !== room) room.appendChild(this.laser);
|
|
188
|
+
if (this.laser.room !== room._target) room.appendChild(this.laser);
|
|
188
189
|
this.pointer.orientation._target.setFromEuler(new THREE.Euler(Math.PI/2, this.teleportangle, 0, "YXZ"));
|
|
189
190
|
} else {
|
|
190
191
|
if (this.shroud.visible) {
|
|
@@ -327,8 +328,8 @@ janus.registerElement('locomotion_teleporter', {
|
|
|
327
328
|
if (!room.teleport) return;
|
|
328
329
|
this.visible = true;
|
|
329
330
|
this.particles.visible = true;
|
|
330
|
-
if (this.laser.room !== room) room.appendChild(this.laser);
|
|
331
|
-
if (this.particles.room !== room) room.appendChild(this.particles);
|
|
331
|
+
if (this.laser.room !== room._target) room.appendChild(this.laser);
|
|
332
|
+
if (this.particles.room !== room._target) room.appendChild(this.particles);
|
|
332
333
|
this.laser.visible = true;
|
|
333
334
|
this.active = true;
|
|
334
335
|
this.particles.start();
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<ui-tab label="Identity">
|
|
3
3
|
<ui-formgroup>
|
|
4
4
|
<janus-username-picker></janus-username-picker>
|
|
5
|
-
|
|
5
|
+
<!-- ui-textarea label="Avatar"></ui-textarea -->
|
|
6
6
|
<janus-avatar-picker src="https://janusxr.org/vrto2020/avatars.json"></janus-avatar-picker>
|
|
7
7
|
</ui-formgroup>
|
|
8
8
|
<!-- janus-viewer-avatar src="https://kool.website/avatars/chibii/1/1.txt" width="500" height="200"></janus-viewer-avatar -->
|
|
@@ -97,13 +97,15 @@ this.debug.style.zIndex = '1000';
|
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
let janus = elation.component.fetch(this.queryParentSelector('[data-elation-component="janusweb.client"]'))
|
|
100
|
-
janus
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
100
|
+
if (janus) {
|
|
101
|
+
janus.engine.systems.controls.addVirtualGamepad(this);
|
|
102
|
+
this.hide();
|
|
103
|
+
janus.engine.systems.render.renderer.domElement.addEventListener('touchstart', (ev) => {
|
|
104
|
+
this.show();
|
|
105
|
+
this.reset();
|
|
106
|
+
if (!player.enabled) player.enable();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
107
109
|
}
|
|
108
110
|
reset() {
|
|
109
111
|
for (let i = 0; i < this.axes.length; i++) {
|
|
@@ -14,6 +14,10 @@ janus.registerElement('xrmenu', {
|
|
|
14
14
|
});
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
this.worldpos = V();
|
|
18
|
+
this.worlddir = V();
|
|
19
|
+
this.playervec = V();
|
|
20
|
+
|
|
17
21
|
let xrmenu = janus.ui.apps.default.apps.xrmenu;
|
|
18
22
|
let asseturl = xrmenu.resolveFullURL('./xrmenu-assets.json');
|
|
19
23
|
fetch(asseturl).then(res => res.json()).then(assetlist => {
|
|
@@ -66,10 +70,11 @@ janus.registerElement('xrmenu', {
|
|
|
66
70
|
button.pos.x = (-width / 2) + (this.buttonwidth * this.buttonmargin * (i + .5)) ;
|
|
67
71
|
}
|
|
68
72
|
},
|
|
73
|
+
/*
|
|
69
74
|
update() {
|
|
70
|
-
let worldpos = this.localToWorld(
|
|
71
|
-
let worlddir = this.localToWorld(
|
|
72
|
-
let playervec = player.head.localToWorld(
|
|
75
|
+
let worldpos = this.localToWorld(this.worldpos.set(0,0,0));
|
|
76
|
+
let worlddir = this.localToWorld(this.worlddir.set(0,0,1)).sub(worldpos).normalize();
|
|
77
|
+
let playervec = player.head.localToWorld(this.playervec.set(0,0,0)).sub(worldpos).normalize();
|
|
73
78
|
let dot = playervec.dot(worlddir);
|
|
74
79
|
let opacity = Math.max(0, dot);
|
|
75
80
|
for (let k in this.buttons) {
|
|
@@ -79,6 +84,7 @@ janus.registerElement('xrmenu', {
|
|
|
79
84
|
}
|
|
80
85
|
//this.backing.opacity = opacity;
|
|
81
86
|
},
|
|
87
|
+
*/
|
|
82
88
|
});
|
|
83
89
|
janus.registerElement('xrmenu-button', {
|
|
84
90
|
onactivate: null,
|
|
@@ -122,6 +128,8 @@ janus.registerElement('xrmenu-popup', {
|
|
|
122
128
|
element: null,
|
|
123
129
|
width: 512,
|
|
124
130
|
height: 512,
|
|
131
|
+
depth_test: true,
|
|
132
|
+
renderorder: 0,
|
|
125
133
|
|
|
126
134
|
create() {
|
|
127
135
|
|
|
@@ -160,7 +168,6 @@ container.style.opacity = 0;
|
|
|
160
168
|
this.elementcontainer = container;
|
|
161
169
|
|
|
162
170
|
setTimeout(() => {
|
|
163
|
-
console.log('my element', element);
|
|
164
171
|
let canvas = element.toCanvas(this.width, this.height, 1);
|
|
165
172
|
/*
|
|
166
173
|
document.body.appendChild(canvas);
|
|
@@ -186,6 +193,8 @@ canvas.style.border = '1px solid red';
|
|
|
186
193
|
lighting: false,
|
|
187
194
|
//image_id: 'xrmenu-element-canvas',
|
|
188
195
|
scale: V(1, this.height / this.width, 1),
|
|
196
|
+
depth_test: this.depth_test,
|
|
197
|
+
renderorder: this.renderorder,
|
|
189
198
|
});
|
|
190
199
|
this.element = element;
|
|
191
200
|
this.plane.addEventListener('mousemove', ev => this.handleMouse(ev));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
package/media/assets.json
CHANGED
|
@@ -101,7 +101,8 @@
|
|
|
101
101
|
|
|
102
102
|
{ "assettype":"model", "name":"avatar", "src":"assets/avatar.obj", "tex0": "avatar_tex0" },
|
|
103
103
|
{ "assettype":"model", "name":"avatar_head", "src":"assets/avatar_head.obj", "tex0": "avatar_head_tex0" },
|
|
104
|
-
{ "assettype":"model", "name":"avatar_gltf", "src":"assets/
|
|
104
|
+
{ "assettype":"model", "name":"avatar_gltf", "src":"assets/janus-avatar-base.glb" },
|
|
105
|
+
{ "assettype":"model", "name":"avatar_animations", "src":"assets/janus-avatar-animations.glb" },
|
|
105
106
|
|
|
106
107
|
{ "assettype":"image", "name":"avatar_tex0", "src":"assets/avatar.png", "preload": false },
|
|
107
108
|
{ "assettype":"image", "name":"avatar_head_tex0", "src":"assets/avatar_head.png", "preload": false },
|