janusweb 1.5.51 → 1.5.53
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/css/janusweb.css +7 -0
- package/media/assets/webui/apps/avatar/avatar.js +49 -15
- package/media/assets/webui/apps/comms/comms.js +12 -1
- package/media/assets/webui/apps/comms/external/naf-shim.js +7 -2
- package/media/assets/webui/apps/comms/status.html +2 -2
- package/media/assets/webui/apps/comms/voip.css +53 -8
- package/media/assets/webui/apps/comms/voip.js +193 -77
- package/media/assets/webui/apps/editor/editor.css +5 -0
- package/media/assets/webui/apps/editor/editor.js +12 -1
- package/media/assets/webui/apps/locomotion/teleporter.js +4 -3
- package/media/assets/webui/apps/settings/settings.js +1 -1
- package/media/assets/webui/themes/default.css +93 -2
- package/package.json +1 -1
- package/scripts/client.js +42 -19
- package/scripts/elements/linesegments.js +1 -1
- package/scripts/external/JanusClientConnection.js +5 -2
- package/scripts/external/JanusFireboxParser.js +1 -0
- package/scripts/janusbase.js +8 -1
- package/scripts/janusghost.js +11 -9
- package/scripts/januslight.js +4 -1
- package/scripts/janusparticle.js +1 -0
- package/scripts/janusplayer.js +47 -20
- package/scripts/multiplayermanager.js +2 -0
- package/scripts/object.js +2 -2
- package/scripts/parts.js +5 -1
- package/scripts/portal.js +13 -2
- package/scripts/room.js +45 -5
package/css/janusweb.css
CHANGED
|
@@ -67,7 +67,7 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
|
|
|
67
67
|
<ui-list name="avatar" selectable="1" collection="avatarlist" itemcomponent="janus-avatar-picker-item"></ui-list>
|
|
68
68
|
</ui-tab>
|
|
69
69
|
<ui-tab label="Ready Player Me">
|
|
70
|
-
<iframe data-src="https://demo.readyplayer.me/avatar" allow="camera"></iframe>
|
|
70
|
+
<iframe data-src="https://demo.readyplayer.me/avatar?frameApi" allow="camera"></iframe>
|
|
71
71
|
</ui-tab>
|
|
72
72
|
</ui-tabs>
|
|
73
73
|
`;
|
|
@@ -226,20 +226,54 @@ this.appendChild(this.previewwindow);
|
|
|
226
226
|
}
|
|
227
227
|
handleWindowMessage(ev) {
|
|
228
228
|
if (ev.origin.match(/https:\/\/.*\.readyplayer\.me/)) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
<
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
229
|
+
if (ev.data.indexOf('https:') == 0) {
|
|
230
|
+
// raw URL
|
|
231
|
+
let avatarurl = ev.data;
|
|
232
|
+
let avatarstr = `
|
|
233
|
+
<FireBoxRoom>
|
|
234
|
+
<assets>
|
|
235
|
+
<assetobject id="body" src="${avatarurl}" />
|
|
236
|
+
<assetobject id="avatar_animations" src="https://assets.metacade.com/james/readyplayerme/animations.glb" />
|
|
237
|
+
</assets>
|
|
238
|
+
<room>
|
|
239
|
+
<ghost body_id="body" bone_head="Head" morphtarget_mouth="mouthOpen" morphtarget_eyes="eyesClosed" />
|
|
240
|
+
</room>
|
|
241
|
+
</FireBoxRoom>
|
|
242
|
+
`;
|
|
243
|
+
player.setAvatar(avatarstr);
|
|
244
|
+
this.handleAvatarSelect({data: { url: 'data:text/plain,' + avatarstr } });
|
|
245
|
+
} else if (ev.data[0] == '{') {
|
|
246
|
+
// frame API
|
|
247
|
+
let apimsg = JSON.parse(ev.data);
|
|
248
|
+
let frame = this.querySelector('iframe'); // FIXME - hacky
|
|
249
|
+
if (apimsg.eventName == 'v1.frame.ready' && frame && frame.contentWindow) {
|
|
250
|
+
frame.contentWindow.postMessage(JSON.stringify({
|
|
251
|
+
target: 'readyplayerme',
|
|
252
|
+
type: 'subscribe',
|
|
253
|
+
eventName: 'v2.**'
|
|
254
|
+
}), '*');
|
|
255
|
+
} else if (apimsg.eventName == 'v2.avatar.exported') {
|
|
256
|
+
let avatarurl = apimsg.data.url;
|
|
257
|
+
let animurl = 'https://assets.metacade.com/james/readyplayerme/animations.glb';
|
|
258
|
+
if (apimsg.data.metadata.gender == 'female') {
|
|
259
|
+
animurl = 'https://assets.metacade.com/james/readyplayerme/animations-rpm-female.glb';
|
|
260
|
+
}
|
|
261
|
+
// TODO - select avatar pack based on metadata.gender
|
|
262
|
+
let avatarstr = `
|
|
263
|
+
<FireBoxRoom>
|
|
264
|
+
<assets>
|
|
265
|
+
<assetobject id="body" src="${avatarurl}" />
|
|
266
|
+
<assetobject id="avatar_animations" src="${animurl}" />
|
|
267
|
+
</assets>
|
|
268
|
+
<room>
|
|
269
|
+
<ghost body_id="body" bone_head="Head" morphtarget_mouth="mouthOpen" morphtarget_eyes="eyesClosed" />
|
|
270
|
+
</room>
|
|
271
|
+
</FireBoxRoom>
|
|
272
|
+
`;
|
|
273
|
+
player.setAvatar(avatarstr);
|
|
274
|
+
this.handleAvatarSelect({data: { url: 'data:text/plain,' + avatarstr } });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
243
277
|
}
|
|
244
278
|
}
|
|
245
279
|
});
|
|
@@ -30,6 +30,7 @@ elation.elements.define('janus-comms-status', class extends elation.elements.bas
|
|
|
30
30
|
}
|
|
31
31
|
create() {
|
|
32
32
|
this.player = player;
|
|
33
|
+
this.userid = player.getNetworkUsername();
|
|
33
34
|
if (typeof room != 'undefined') {
|
|
34
35
|
this.room = room;
|
|
35
36
|
}
|
|
@@ -100,6 +101,7 @@ elation.elements.define('janus-comms-userlist', class extends elation.elements.u
|
|
|
100
101
|
this.usermarkers = {};
|
|
101
102
|
|
|
102
103
|
elation.events.add(this.janusweb, 'room_load_start', (ev) => { this.updateRoom(ev.data || ev.element); });
|
|
104
|
+
elation.events.add(this.janusweb, 'room_change', (ev) => { let newroom = this.janusweb.rooms[this.janusweb.getRoomId(ev.data)]; if (newroom) this.updateRoom(newroom); });
|
|
103
105
|
elation.events.add(this.janusweb.network, 'janusweb_user_joined,janusweb_user_left,janusweb_user_disconnected', (ev) => this.updateUsers());
|
|
104
106
|
setTimeout(() => {
|
|
105
107
|
//this.updateUsers();
|
|
@@ -132,10 +134,16 @@ elation.elements.define('janus-comms-userlist', class extends elation.elements.u
|
|
|
132
134
|
this.elements.userlist_details.open = true;
|
|
133
135
|
}
|
|
134
136
|
this.updateUsers();
|
|
137
|
+
elation.events.add(this.room, 'join', ev => {
|
|
138
|
+
setTimeout(() => {
|
|
139
|
+
this.updateUsers();
|
|
140
|
+
}, 1000);
|
|
141
|
+
});
|
|
142
|
+
elation.events.add(this.room, 'room_active', ev => { this.updateUsers(); });
|
|
135
143
|
}
|
|
136
144
|
updateUsers() {
|
|
137
145
|
if (!janus.network) return;
|
|
138
|
-
var remoteplayers =
|
|
146
|
+
var remoteplayers = this.room.players;
|
|
139
147
|
var users = Object.keys(remoteplayers);
|
|
140
148
|
//users.unshift(player.userid);
|
|
141
149
|
|
|
@@ -213,6 +221,9 @@ elation.elements.define('janus-comms-chat', class extends elation.elements.base
|
|
|
213
221
|
// FIXME - first element with the current design is a <detail> element, but this is fragile if that changes
|
|
214
222
|
this.elements[0].addEventListener('toggle', (ev) => this.elements.chatinput.focus());
|
|
215
223
|
this.updateRoom(room);
|
|
224
|
+
if (window.innerWidth < 760) {
|
|
225
|
+
this.elements.toggle.open = false;
|
|
226
|
+
}
|
|
216
227
|
}
|
|
217
228
|
scrollToBottom() {
|
|
218
229
|
setTimeout(() => {
|
|
@@ -150,7 +150,7 @@ console.log('occupants received', Object.keys(occupantList), Object.keys(this.co
|
|
|
150
150
|
'credential': 'turn',
|
|
151
151
|
'realm': 'turn',
|
|
152
152
|
'urls': [
|
|
153
|
-
'turns:
|
|
153
|
+
'turns:voip.janusxr.org:3478',
|
|
154
154
|
]
|
|
155
155
|
},
|
|
156
156
|
]
|
|
@@ -166,6 +166,11 @@ console.log('occupants received', Object.keys(occupantList), Object.keys(this.co
|
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
setRoom(roomId) {
|
|
169
|
-
this.
|
|
169
|
+
this.connectedClients = {};
|
|
170
|
+
//this.adapter.disconnect();
|
|
171
|
+
if (roomId != this.adapter.room) {
|
|
172
|
+
this.adapter.setRoom(roomId);
|
|
173
|
+
this.adapter.reconnect();
|
|
174
|
+
}
|
|
170
175
|
}
|
|
171
176
|
}
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
<span class="statuslabel">Disconnecting...</span>
|
|
11
11
|
{/eq}
|
|
12
12
|
{@eq key=state value="connecting"}
|
|
13
|
-
<span class="statuslabel">Connecting</span> <!-- to <strong name="serverlabel">{server._host}</strong>--> as <strong name="useridlabel">{
|
|
13
|
+
<span class="statuslabel">Connecting</span> <!-- to <strong name="serverlabel">{server._host}</strong>--> as <strong name="useridlabel">{userid}</strong>
|
|
14
14
|
{/eq}
|
|
15
15
|
{@eq key=state value="connected"}
|
|
16
|
-
<span class="statuslabel">Connected</span> <!-- to <strong name="serverlabel">{server._host}</strong>--> as <strong name="useridlabel">{
|
|
16
|
+
<span class="statuslabel">Connected</span> <!-- to <strong name="serverlabel">{server._host}</strong>--> as <strong name="useridlabel">{userid}</strong>
|
|
17
17
|
{/eq}
|
|
18
18
|
|
|
19
19
|
</span>
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
janus-voip-client {
|
|
2
|
-
border: 1px solid black;
|
|
3
2
|
position: relative;
|
|
4
3
|
max-width: 75vh;
|
|
5
4
|
flex-wrap: wrap;
|
|
@@ -11,29 +10,55 @@ janus-voip-client-janus {
|
|
|
11
10
|
janus-voip-localuser {
|
|
12
11
|
display: block;
|
|
13
12
|
bottom: 0px;
|
|
14
|
-
border: 2px solid black;
|
|
15
13
|
padding: 0px;
|
|
16
|
-
box-shadow: 0 0 5px black;
|
|
17
14
|
z-index: 10;
|
|
18
15
|
}
|
|
16
|
+
janus-voip-localuser:empty {
|
|
17
|
+
border: none;
|
|
18
|
+
box-shadow: none;
|
|
19
|
+
}
|
|
19
20
|
janus-voip-localuser video {
|
|
20
21
|
max-width: 128px;
|
|
21
22
|
height: 128px;
|
|
22
23
|
display: block;
|
|
23
24
|
margin: 1px 0 0 1px;
|
|
25
|
+
border: 1px solid #aaa;
|
|
26
|
+
border-radius: 50%;
|
|
27
|
+
box-shadow: 0 0 2px 2px white;
|
|
24
28
|
}
|
|
25
29
|
janus-voip-remoteuser {
|
|
26
30
|
xdisplay: inline-block;
|
|
27
|
-
border: 2px solid black;
|
|
28
31
|
position: relative;
|
|
29
32
|
font-family: monospace;
|
|
30
33
|
transition: transform 250ms ease;
|
|
31
34
|
transform: scale(0, 0);
|
|
32
35
|
min-width: 5em;
|
|
36
|
+
min-width: 32px;
|
|
37
|
+
min-height: 32px;
|
|
38
|
+
text-align: center;
|
|
39
|
+
}
|
|
40
|
+
janus-voip-remoteuser audio {
|
|
41
|
+
display: inline-block;
|
|
33
42
|
}
|
|
34
43
|
janus-voip-remoteuser video {
|
|
35
|
-
|
|
36
|
-
|
|
44
|
+
width: 32px;
|
|
45
|
+
height: 32px;
|
|
46
|
+
border: 1px solid #aaa;
|
|
47
|
+
border-radius: 50%;
|
|
48
|
+
box-shadow: 0 0 2px 2px white;
|
|
49
|
+
display: inline-block;
|
|
50
|
+
background: url(images/mic-disabled.png);
|
|
51
|
+
background-size: contain;
|
|
52
|
+
background-position: center center;
|
|
53
|
+
transition: all 200ms ease-out;
|
|
54
|
+
}
|
|
55
|
+
janus-voip-remoteuser[hasaudio] video {
|
|
56
|
+
background: url(images/mic-enabled.png);
|
|
57
|
+
background-size: contain;
|
|
58
|
+
background-position: center center;
|
|
59
|
+
}
|
|
60
|
+
janus-voip-remoteuser[hasvideo] video {
|
|
61
|
+
width: 128px;
|
|
37
62
|
height: 128px;
|
|
38
63
|
}
|
|
39
64
|
janus-voip-remoteuser video.active {
|
|
@@ -55,12 +80,13 @@ janus-voip-remoteuser h2 {
|
|
|
55
80
|
text-shadow: 0 0 5px black;
|
|
56
81
|
color: white;
|
|
57
82
|
font-size: .8em;
|
|
83
|
+
margin-bottom: .5em;
|
|
58
84
|
}
|
|
59
85
|
janus-voip-remoteuser {
|
|
60
86
|
}
|
|
61
87
|
janus-voip-localuser[speaking],
|
|
62
88
|
janus-voip-remoteuser[speaking] {
|
|
63
|
-
|
|
89
|
+
xborder: 2px solid #0f0;
|
|
64
90
|
}
|
|
65
91
|
janus-voip-localuser ui-button {
|
|
66
92
|
position: absolute;
|
|
@@ -76,7 +102,7 @@ janus-voip-localuser ui-button {
|
|
|
76
102
|
janus-voip-remoteuser ui-button {
|
|
77
103
|
font-size: 0;
|
|
78
104
|
width: auto;
|
|
79
|
-
opacity:
|
|
105
|
+
opacity: 0;
|
|
80
106
|
}
|
|
81
107
|
janus-voip-localuser ui-button:before,
|
|
82
108
|
janus-voip-remoteuser ui-button:before {
|
|
@@ -200,3 +226,22 @@ janus-voip-client-incomingcall ui-button[action="reject"] {
|
|
|
200
226
|
janus-voip-client-incomingcall ui-button[action="reject"]:hover {
|
|
201
227
|
background: #a00;
|
|
202
228
|
}
|
|
229
|
+
ui-panel[top]:not([left]):not([right]):has(janus-voip-client[spatialized]) {
|
|
230
|
+
top: 0;
|
|
231
|
+
left: 0;
|
|
232
|
+
}
|
|
233
|
+
ui-panel[top]:has(janus-voip-client[spatialized])::after {
|
|
234
|
+
position: absolute;
|
|
235
|
+
width: 80vh;
|
|
236
|
+
height: 80vh;
|
|
237
|
+
display: block;
|
|
238
|
+
content: '';
|
|
239
|
+
left: calc(50vw - 40vh);
|
|
240
|
+
top: 10vh;
|
|
241
|
+
border: 2px solid rgba(128,128,128,.5);
|
|
242
|
+
border-radius: 50%;
|
|
243
|
+
pointer-events: none;
|
|
244
|
+
}
|
|
245
|
+
janus-voip-remoteuser[spatialized] {
|
|
246
|
+
position: absolute;
|
|
247
|
+
}
|