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.
Files changed (60) hide show
  1. package/LICENSE +1 -1
  2. package/media/assets/janus-avatar-animations.glb +0 -0
  3. package/media/assets/janus-avatar-base.glb +0 -0
  4. package/media/assets/webui/apps/avatar/avatar.css +6 -2
  5. package/media/assets/webui/apps/avatar/avatar.js +97 -10
  6. package/media/assets/webui/apps/buttons/buttons.html +2 -2
  7. package/media/assets/webui/apps/buttons/buttons.js +3 -3
  8. package/media/assets/webui/apps/comms/comms.js +7 -4
  9. package/media/assets/webui/apps/comms/voip.js +138 -55
  10. package/media/assets/webui/apps/editor/editor.js +2 -0
  11. package/media/assets/webui/apps/inventory/inventory.html +7 -4
  12. package/media/assets/webui/apps/inventory/inventory.js +1 -1
  13. package/media/assets/webui/apps/locomotion/teleporter.js +9 -8
  14. package/media/assets/webui/apps/settings/settings.html +1 -1
  15. package/media/assets/webui/apps/virtualgamepad/virtualgamepad.js +9 -7
  16. package/media/assets/webui/apps/xrmenu/xrmenu.js +13 -4
  17. package/media/assets/webui/none.json +1 -0
  18. package/media/assets.json +2 -1
  19. package/media/index.html +1 -1
  20. package/media/lib/draco/README.md +32 -0
  21. package/media/lib/draco/draco_decoder.js +52 -0
  22. package/media/lib/draco/draco_decoder.wasm +0 -0
  23. package/media/lib/draco/draco_encoder.js +33 -0
  24. package/media/lib/draco/draco_wasm_wrapper.js +104 -0
  25. package/media/lib/draco/gltf/draco_decoder.js +48 -0
  26. package/media/lib/draco/gltf/draco_decoder.wasm +0 -0
  27. package/media/lib/draco/gltf/draco_encoder.js +33 -0
  28. package/media/lib/draco/gltf/draco_wasm_wrapper.js +104 -0
  29. package/media/lib/physx/physx.release.js +21 -0
  30. package/media/lib/physx/physx.release.wasm +0 -0
  31. package/media/manifest.json +5 -5
  32. package/media/service-worker.js +7 -0
  33. package/package.json +1 -1
  34. package/scripts/client.js +4 -3
  35. package/scripts/config.js +2 -0
  36. package/scripts/elements/linesegments.js +5 -1
  37. package/scripts/external/JanusFireboxParser.js +1 -0
  38. package/scripts/image.js +7 -1
  39. package/scripts/janusbase.js +83 -34
  40. package/scripts/janusghost.js +314 -15
  41. package/scripts/januslight.js +11 -2
  42. package/scripts/janusparagraph.js +3 -3
  43. package/scripts/janusparticle.js +16 -5
  44. package/scripts/janusplayer.js +124 -35
  45. package/scripts/janusweb.js +5 -0
  46. package/scripts/janusxrplayer.js +2 -3
  47. package/scripts/multiplayermanager.js +3 -1
  48. package/scripts/object.js +106 -10
  49. package/scripts/portal.js +28 -12
  50. package/scripts/remoteplayer.js +1 -25
  51. package/scripts/room.js +116 -36
  52. package/scripts/sound.js +8 -5
  53. package/scripts/text.js +3 -3
  54. package/scripts/websurface.js +6 -1
  55. package/utils/build.sh +3 -0
  56. package/utils/init.sh +2 -2
  57. package/scripts/chat.js +0 -80
  58. package/scripts/ui.js +0 -265
  59. package/scripts/urlbar.js +0 -93
  60. 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.OrientationQuat3D({ x: 0, y: 0, z: 0, w: 1});
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
- orientationQuat: currentOrientation,
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.OrientationQuat,
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
- orientationQuat: currentOrientation,
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.orientationQuat.x = orientation.x;
312
- this.userData.orientationQuat.y = orientation.y;
313
- this.userData.orientationQuat.z = orientation.z;
314
- this.userData.orientationQuat.w = orientation.w;
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 > .1) {
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
- this.remoteuser.localToWorld(this.lastposition.set(0,0,0));
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 > .1) {
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.label3d.scale.set(scale, scale, scale);
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
- //this.handleSelectAudio({detail: 1});
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
- this.elements = elation.elements.fromString(`
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
- `, this);
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.addEventListener('change', (ev) => this.getUserMedia());
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 = elation.elements.create('option', {innerHTML: 'Disabled', value: 'none', append: cameras.select});
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 (hasWebcamPermission && this.elements.videoDevice.hidden ) {
825
- this.elements.webcamEnabled.hide();
826
- this.elements.videoDevice.show();
827
- let option = this.elements.videoDevice.select.childNodes[0];
828
- option.selected = true;
829
- this.elements.videoDevice.select.value = option.value;
830
- } else {
831
- console.log('NO WEBCAM PERMISSION');
832
- this.elements.webcamEnabled.show();
833
- this.elements.videoDevice.hide();
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.setStream(stream);
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 (el instanceof elation.elements.ui.toggle) {
927
- settings[k] = this.elements[k].checked;
928
- } else {
929
- settings[k] = this.elements[k].value;
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
- <h3>Did you know?</h3>
55
- <p>You can drag 3d models, images, videos, and sounds into Janus rooms from other websites, or even your local hard drive!</p>
56
- <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>
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: 20,
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: 10,
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: 100,
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
- <ui-textarea label="Avatar"></ui-textarea>
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.engine.systems.controls.addVirtualGamepad(this);
101
- this.hide();
102
- janus.engine.systems.render.renderer.domElement.addEventListener('touchstart', (ev) => {
103
- this.show();
104
- this.reset();
105
- if (!player.enabled) player.enable();
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(V());
71
- let worlddir = this.localToWorld(V(0, 0, 1)).sub(worldpos).normalize();
72
- let playervec = player.head.localToWorld(V()).sub(worldpos).normalize();
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/Beta.gltf/Beta.gltf" },
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 },
package/media/index.html CHANGED
@@ -34,7 +34,7 @@
34
34
  <script src="janusweb.js"></script>
35
35
  </head>
36
36
  <body>
37
- <janus-viewer src="https://vesta.janusxr.org/"></janus-viewer>
37
+ <janus-viewer src="https://www.janusxr.org/"></janus-viewer>
38
38
  </body>
39
39
  </html>
40
40