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.
Files changed (84) hide show
  1. package/CHANGELOG +39 -0
  2. package/LICENSE +1 -1
  3. package/media/assets/janus-avatar-animations.glb +0 -0
  4. package/media/assets/janus-avatar-base.glb +0 -0
  5. package/media/assets/webui/apps/avatar/avatar.css +6 -2
  6. package/media/assets/webui/apps/avatar/avatar.js +99 -11
  7. package/media/assets/webui/apps/buttons/buttons.html +2 -2
  8. package/media/assets/webui/apps/buttons/buttons.js +3 -3
  9. package/media/assets/webui/apps/comms/comms.js +7 -4
  10. package/media/assets/webui/apps/comms/voip.js +133 -57
  11. package/media/assets/webui/apps/editor/codemirror/addon/hint/javascript-hint.js +162 -0
  12. package/media/assets/webui/apps/editor/codemirror/addon/hint/show-hint.css +36 -0
  13. package/media/assets/webui/apps/editor/codemirror/addon/hint/show-hint.js +529 -0
  14. package/media/assets/webui/apps/editor/codemirror/addon/hint/xml-hint.js +140 -0
  15. package/media/assets/webui/apps/editor/codemirror/keymap/vim.js +5734 -0
  16. package/media/assets/webui/apps/editor/codemirror/lib/codemirror.css +350 -0
  17. package/media/assets/webui/apps/editor/codemirror/lib/codemirror.js +9800 -0
  18. package/media/assets/webui/apps/editor/codemirror/lib/jmldark.css +33 -0
  19. package/media/assets/webui/apps/editor/codemirror/mode/css/css.js +864 -0
  20. package/media/assets/webui/apps/editor/codemirror/mode/htmlmixed/htmlmixed.js +153 -0
  21. package/media/assets/webui/apps/editor/codemirror/mode/javascript/javascript.js +942 -0
  22. package/media/assets/webui/apps/editor/codemirror/mode/xml/xml.js +413 -0
  23. package/media/assets/webui/apps/editor/editor.css +3 -0
  24. package/media/assets/webui/apps/editor/editor.js +409 -9
  25. package/media/assets/webui/apps/editor/editor.json +6 -3
  26. package/media/assets/webui/apps/inventory/inventory.html +7 -4
  27. package/media/assets/webui/apps/inventory/inventory.js +2 -2
  28. package/media/assets/webui/apps/locomotion/teleporter.js +10 -9
  29. package/media/assets/webui/apps/navigation/navigation.js +12 -12
  30. package/media/assets/webui/apps/settings/settings.html +1 -1
  31. package/media/assets/webui/apps/vfs/browserfs/browserfs.js +8 -0
  32. package/media/assets/webui/apps/vfs/vfs.css +52 -0
  33. package/media/assets/webui/apps/vfs/vfs.js +452 -0
  34. package/media/assets/webui/apps/vfs/vfs.json +10 -0
  35. package/media/assets/webui/apps/virtualgamepad/virtualgamepad.js +9 -7
  36. package/media/assets/webui/apps/xrmenu/xrmenu.js +13 -4
  37. package/media/assets/webui/default.json +2 -1
  38. package/media/assets/webui/none.json +1 -0
  39. package/media/assets/webui/themes/default.css +29 -2
  40. package/media/assets.json +2 -1
  41. package/media/index.html +1 -1
  42. package/media/lib/draco/README.md +32 -0
  43. package/media/lib/draco/draco_decoder.js +52 -0
  44. package/media/lib/draco/draco_decoder.wasm +0 -0
  45. package/media/lib/draco/draco_encoder.js +33 -0
  46. package/media/lib/draco/draco_wasm_wrapper.js +104 -0
  47. package/media/lib/draco/gltf/draco_decoder.js +48 -0
  48. package/media/lib/draco/gltf/draco_decoder.wasm +0 -0
  49. package/media/lib/draco/gltf/draco_encoder.js +33 -0
  50. package/media/lib/draco/gltf/draco_wasm_wrapper.js +104 -0
  51. package/media/lib/physx/physx.release.js +21 -0
  52. package/media/lib/physx/physx.release.wasm +0 -0
  53. package/media/manifest.json +5 -5
  54. package/media/service-worker.js +7 -0
  55. package/package.json +2 -9
  56. package/scripts/client.js +67 -46
  57. package/scripts/config.js +2 -0
  58. package/scripts/elements/linesegments.js +10 -3
  59. package/scripts/external/JanusFireboxParser.js +1 -0
  60. package/scripts/image.js +7 -1
  61. package/scripts/janusbase.js +104 -43
  62. package/scripts/janusghost.js +314 -16
  63. package/scripts/januslight.js +11 -2
  64. package/scripts/janusparagraph.js +8 -6
  65. package/scripts/janusparticle.js +26 -16
  66. package/scripts/janusplayer.js +126 -37
  67. package/scripts/janusweb.js +26 -2
  68. package/scripts/janusxrplayer.js +5 -3
  69. package/scripts/multiplayermanager.js +6 -4
  70. package/scripts/object.js +246 -88
  71. package/scripts/portal.js +23 -14
  72. package/scripts/remoteplayer.js +1 -25
  73. package/scripts/room.js +199 -77
  74. package/scripts/sound.js +8 -6
  75. package/scripts/text.js +13 -5
  76. package/scripts/translators/janusvfs.js +20 -0
  77. package/scripts/video.js +1 -1
  78. package/scripts/websurface.js +17 -3
  79. package/utils/build.sh +3 -0
  80. package/utils/init.sh +2 -2
  81. package/scripts/chat.js +0 -80
  82. package/scripts/ui.js +0 -265
  83. package/scripts/urlbar.js +0 -93
  84. 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-2016 James Baicoianu and JanusVR, Inc.
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
@@ -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
- <collection-jsonapi id="avatarlist" endpoint="${this.src}"></collection-jsonapi>
49
- <ui-list name="avatar" selectable="1" collection="avatarlist" itemcomponent="janus-avatar-picker-item"></ui-list>
50
- <ui-button name="confirm" disabled="1">Confirm</ui-button>
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 += '<ui-button name="reset">Reset</ui-button>';
80
+ tpl += `<ui-button name="reset">Reset</ui-button>`;
54
81
  }
55
82
  this.elements = elation.elements.fromString(tpl, this);
56
83
 
57
- elation.events.add(this.elements['avatar'], 'select', (ev) => this.handleAvatarSelect(ev));
58
- elation.events.add(this.elements['confirm'], 'click', (ev) => this.handleAvatarConfirm(ev));
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.disabled = false;
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.defaultAvatar);
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: true },
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: true },
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: ['plane-detection'], optionalFeatures: ['local-floor'] });
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
- room.loadNewAsset('image', {
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
- //collidable: true,
312
- //pickable: true,
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
- if (volume > .1) {
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);