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
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
|
+
}
|
|
@@ -39,23 +39,53 @@ janus.registerElement('avatar_rigged', {
|
|
|
39
39
|
elation.elements.define('janus-avatar-picker', class extends elation.elements.base {
|
|
40
40
|
init() {
|
|
41
41
|
this.defineAttribute('src', { type: 'string' });
|
|
42
|
+
this.defineAttribute('sources', { type: 'object' });
|
|
42
43
|
this.defineAttribute('previewpos', { type: 'vector3', default: V(-2, 0, -3) });
|
|
44
|
+
this.defineAttribute('hideconfirm', { type: 'boolean', default: false });
|
|
43
45
|
this.defineAttribute('hidereset', { type: 'boolean', default: false });
|
|
44
46
|
this.selected = false;
|
|
45
47
|
}
|
|
46
48
|
create() {
|
|
47
|
-
let tpl =
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
let tpl = '';
|
|
50
|
+
if (this.sources) {
|
|
51
|
+
let sources = (elation.utils.isString(this.sources) ? JSON.parse(this.sources) : this.sources);
|
|
52
|
+
console.log('HI YES', sources);
|
|
53
|
+
if (sources.length > 1) {
|
|
54
|
+
tpl += '<ui-tabs>';
|
|
55
|
+
sources.forEach(source => {
|
|
56
|
+
let sourcestr = this.getSourceString(source);
|
|
57
|
+
tpl += `<ui-tab label="${source.name}">${sourcestr}</ui-tab>`;
|
|
58
|
+
});
|
|
59
|
+
} else {
|
|
60
|
+
tpl = this.getSourceString(sources[0]);
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
tpl = `
|
|
64
|
+
<ui-tabs>
|
|
65
|
+
<ui-tab label="Chibis">
|
|
66
|
+
<collection-jsonapi id="avatarlist" endpoint="${this.src}"></collection-jsonapi>
|
|
67
|
+
<ui-list name="avatar" selectable="1" collection="avatarlist" itemcomponent="janus-avatar-picker-item"></ui-list>
|
|
68
|
+
</ui-tab>
|
|
69
|
+
<ui-tab label="Ready Player Me">
|
|
70
|
+
<iframe src="https://demo.readyplayer.me/avatar" allow="camera"></iframe>
|
|
71
|
+
</ui-tab>
|
|
72
|
+
</ui-tabs>
|
|
73
|
+
`;
|
|
74
|
+
}
|
|
75
|
+
if (!this.hideconfirm) {
|
|
76
|
+
tpl += `<ui-button name="confirm" disabled="1">Confirm</ui-button>`;
|
|
77
|
+
}
|
|
52
78
|
if (!this.hidereset) {
|
|
53
|
-
tpl +=
|
|
79
|
+
tpl += `<ui-button name="reset">Reset</ui-button>`;
|
|
54
80
|
}
|
|
55
81
|
this.elements = elation.elements.fromString(tpl, this);
|
|
56
82
|
|
|
57
|
-
|
|
58
|
-
|
|
83
|
+
if (this.elements['avatar']) {
|
|
84
|
+
elation.events.add(this.elements['avatar'], 'select', (ev) => this.handleAvatarSelect(ev));
|
|
85
|
+
}
|
|
86
|
+
if (this.elements['confirm']) {
|
|
87
|
+
elation.events.add(this.elements['confirm'], 'click', (ev) => this.handleAvatarConfirm(ev));
|
|
88
|
+
}
|
|
59
89
|
if (this.elements['reset']) {
|
|
60
90
|
elation.events.add(this.elements['reset'], 'click', (ev) => this.handleAvatarReset(ev));
|
|
61
91
|
}
|
|
@@ -66,6 +96,19 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
66
96
|
let observer = new IntersectionObserver(ev => this.handleIntersectionChange(ev), { root: document, rootMargin: '0px', threshold: threshold });
|
|
67
97
|
observer.observe(this);
|
|
68
98
|
document.addEventListener('scroll', ev => this.handleScroll(ev));
|
|
99
|
+
window.addEventListener('message', ev => this.handleWindowMessage(ev));
|
|
100
|
+
}
|
|
101
|
+
getSourceString(source) {
|
|
102
|
+
let tpl = '';
|
|
103
|
+
if (source.type == 'list') {
|
|
104
|
+
tpl = `
|
|
105
|
+
<collection-jsonapi id="avatarlist" endpoint="${source.src}"></collection-jsonapi>
|
|
106
|
+
<ui-list name="avatar" selectable="1" collection="avatarlist" itemcomponent="janus-avatar-picker-item"></ui-list>
|
|
107
|
+
`;
|
|
108
|
+
} else if (source.type == 'iframe') {
|
|
109
|
+
tpl = `<iframe src="${source.src}" allow="camera"></iframe>`;
|
|
110
|
+
}
|
|
111
|
+
return tpl;
|
|
69
112
|
}
|
|
70
113
|
selectAvatar(avatar) {
|
|
71
114
|
let items = this.elements.avatarlist.items,
|
|
@@ -83,6 +126,7 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
83
126
|
}
|
|
84
127
|
}
|
|
85
128
|
showPreview(src) {
|
|
129
|
+
/*
|
|
86
130
|
if (!src) {
|
|
87
131
|
src = 'data:text/plain,' + escape(player.getCurrentAvatarData());
|
|
88
132
|
}
|
|
@@ -99,6 +143,28 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
99
143
|
});
|
|
100
144
|
}
|
|
101
145
|
this.updatePreviewPosition();
|
|
146
|
+
*/
|
|
147
|
+
/*
|
|
148
|
+
let preview = this.previewwindow;
|
|
149
|
+
if (!preview) {
|
|
150
|
+
console.log('append preview', this);
|
|
151
|
+
let avatarPreviewRoom = `
|
|
152
|
+
<fireboxroom>
|
|
153
|
+
<assets>
|
|
154
|
+
</assets>
|
|
155
|
+
<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">
|
|
156
|
+
<ghost id="{userid}" avatar_src="{src}" lighting="true" pos="0 0 4" rotate_deg_per_sec="20" />
|
|
157
|
+
</room>
|
|
158
|
+
</fireboxroom>`;
|
|
159
|
+
this.previewwindow = elation.elements.create('janus-viewer-avatar', {
|
|
160
|
+
src: 'data:text/plain,' + avatarPreviewRoom, //escape(player.getCurrentAvatarData()),
|
|
161
|
+
shownavigation: false,
|
|
162
|
+
uiconfig: 'https://baicoianu.com/~bai/janusweb/build/media/assets/webui/none.json',
|
|
163
|
+
});
|
|
164
|
+
console.log('bleh', this.previewwindow);
|
|
165
|
+
this.appendChild(this.previewwindow);
|
|
166
|
+
}
|
|
167
|
+
*/
|
|
102
168
|
}
|
|
103
169
|
updatePreviewPosition() {
|
|
104
170
|
if (this.avatarpreview) {
|
|
@@ -112,7 +178,10 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
112
178
|
console.log('selected an avatar', ev.data);
|
|
113
179
|
this.selected = ev.data;
|
|
114
180
|
this.showPreview(ev.data.url);
|
|
115
|
-
this.elements.confirm
|
|
181
|
+
if (this.elements.confirm) {
|
|
182
|
+
this.elements.confirm.disabled = false;
|
|
183
|
+
}
|
|
184
|
+
this.dispatchEvent(new CustomEvent("select", { detail: this.selected }));
|
|
116
185
|
}
|
|
117
186
|
handleAvatarConfirm(ev) {
|
|
118
187
|
this.hidePreview(true);
|
|
@@ -126,7 +195,7 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
126
195
|
}
|
|
127
196
|
}
|
|
128
197
|
handleAvatarReset(ev) {
|
|
129
|
-
player.setAvatar(player.
|
|
198
|
+
player.setAvatar(player.defaultavatar);
|
|
130
199
|
}
|
|
131
200
|
handleIntersectionChange(intersections) {
|
|
132
201
|
if (this.avatarpreview && !intersections[0].isIntersecting) {
|
|
@@ -138,6 +207,24 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
138
207
|
handleScroll(ev) {
|
|
139
208
|
this.updatePreviewPosition();
|
|
140
209
|
}
|
|
210
|
+
handleWindowMessage(ev) {
|
|
211
|
+
if (ev.origin.match(/https:\/\/.*\.readyplayer\.me/)) {
|
|
212
|
+
let avatarurl = ev.data;
|
|
213
|
+
let avatarstr = `
|
|
214
|
+
<FireBoxRoom>
|
|
215
|
+
<assets>
|
|
216
|
+
<assetobject id="body" src="${avatarurl}" />
|
|
217
|
+
<assetobject id="avatar_animations" src="https://assets.metacade.com/james/readyplayerme/animations.glb" />
|
|
218
|
+
</assets>
|
|
219
|
+
<room>
|
|
220
|
+
<ghost body_id="body" bone_head="Head" morphtarget_mouth="mouthOpen" morphtarget_eyes="eyesClosed" />
|
|
221
|
+
</room>
|
|
222
|
+
</FireBoxRoom>
|
|
223
|
+
`;
|
|
224
|
+
player.setAvatar(avatarstr);
|
|
225
|
+
this.handleAvatarSelect({data: { url: 'data:text/plain,' + avatarstr } });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
141
228
|
});
|
|
142
229
|
elation.elements.define('janus-avatar-picker-item', class extends elation.elements.ui.item {
|
|
143
230
|
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);
|