@mml-io/3d-web-experience-client 0.16.0 → 0.18.0
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/build/Networked3dWebExperienceClient.d.ts +27 -3
- package/build/index.js +175 -35
- package/build/index.js.map +2 -2
- package/package.json +9 -7
@@ -1,4 +1,6 @@
|
|
1
|
-
import {
|
1
|
+
import { AvatarType } from "@mml-io/3d-web-avatar-selection-ui";
|
2
|
+
import { AnimationConfig, EnvironmentConfiguration } from "@mml-io/3d-web-client-core";
|
3
|
+
import { StringToHslOptions } from "@mml-io/3d-web-text-chat";
|
2
4
|
type MMLDocumentConfiguration = {
|
3
5
|
url: string;
|
4
6
|
position?: {
|
@@ -17,21 +19,33 @@ type MMLDocumentConfiguration = {
|
|
17
19
|
z: number;
|
18
20
|
};
|
19
21
|
};
|
22
|
+
export type AvatarConfiguration = {
|
23
|
+
availableAvatars?: Array<AvatarType>;
|
24
|
+
allowCustomAvatars?: boolean;
|
25
|
+
};
|
20
26
|
export type Networked3dWebExperienceClientConfig = {
|
21
27
|
sessionToken: string;
|
22
28
|
chatNetworkAddress?: string;
|
29
|
+
chatVisibleByDefault?: boolean;
|
30
|
+
userNameToColorOptions?: StringToHslOptions;
|
31
|
+
voiceChatAddress?: string;
|
23
32
|
userNetworkAddress: string;
|
24
33
|
mmlDocuments?: Array<MMLDocumentConfiguration>;
|
25
34
|
animationConfig: AnimationConfig;
|
26
|
-
|
35
|
+
environmentConfiguration?: EnvironmentConfiguration;
|
36
|
+
skyboxHdrJpgUrl: string;
|
37
|
+
enableTweakPane?: boolean;
|
38
|
+
updateURLLocation?: boolean;
|
39
|
+
avatarConfiguration?: AvatarConfiguration;
|
27
40
|
};
|
28
41
|
export declare class Networked3dWebExperienceClient {
|
29
42
|
private holderElement;
|
30
43
|
private config;
|
31
44
|
private element;
|
45
|
+
private canvasHolder;
|
32
46
|
private scene;
|
33
47
|
private composer;
|
34
|
-
private tweakPane
|
48
|
+
private tweakPane?;
|
35
49
|
private audioListener;
|
36
50
|
private cameraManager;
|
37
51
|
private collisionsManager;
|
@@ -41,26 +55,36 @@ export declare class Networked3dWebExperienceClient {
|
|
41
55
|
private keyInputManager;
|
42
56
|
private virtualJoystick;
|
43
57
|
private mmlCompositionScene;
|
58
|
+
private mmlFrames;
|
44
59
|
private clientId;
|
45
60
|
private networkClient;
|
46
61
|
private remoteUserStates;
|
47
62
|
private userProfiles;
|
48
63
|
private networkChat;
|
49
64
|
private textChatUI;
|
65
|
+
private avatarSelectionUI;
|
50
66
|
private voiceChatManager;
|
51
67
|
private readonly latestCharacterObject;
|
68
|
+
private characterControllerPaneSet;
|
52
69
|
private initialLoadCompleted;
|
53
70
|
private loadingProgressManager;
|
54
71
|
private loadingScreen;
|
72
|
+
private errorScreen?;
|
73
|
+
private currentRequestAnimationFrame;
|
55
74
|
constructor(holderElement: HTMLElement, config: Networked3dWebExperienceClientConfig);
|
56
75
|
static createFullscreenHolder(): HTMLDivElement;
|
57
76
|
private resolveCharacterData;
|
58
77
|
private updateUserProfile;
|
78
|
+
private updateUserAvatar;
|
59
79
|
private sendChatMessageToServer;
|
80
|
+
private sendIdentityUpdateToServer;
|
60
81
|
private connectToVoiceChat;
|
61
82
|
private connectToTextChat;
|
83
|
+
private mountAvatarSelectionUI;
|
62
84
|
update(): void;
|
63
85
|
private spawnCharacter;
|
86
|
+
private disposeWithError;
|
87
|
+
dispose(): void;
|
64
88
|
private setupMMLScene;
|
65
89
|
}
|
66
90
|
export {};
|
package/build/index.js
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
// src/Networked3dWebExperienceClient.ts
|
2
|
+
import { AvatarSelectionUI } from "@mml-io/3d-web-avatar-selection-ui";
|
2
3
|
import {
|
3
4
|
CameraManager,
|
4
5
|
CharacterManager,
|
@@ -6,17 +7,24 @@ import {
|
|
6
7
|
CollisionsManager,
|
7
8
|
Composer,
|
8
9
|
decodeCharacterAndCamera,
|
10
|
+
ErrorScreen,
|
9
11
|
getSpawnPositionInsideCircle,
|
12
|
+
GroundPlane,
|
10
13
|
KeyInputManager,
|
14
|
+
LoadingScreen,
|
11
15
|
MMLCompositionScene,
|
12
16
|
TimeManager,
|
13
17
|
TweakPane,
|
14
|
-
GroundPlane,
|
15
|
-
LoadingScreen,
|
16
18
|
VirtualJoystick
|
17
19
|
} from "@mml-io/3d-web-client-core";
|
18
|
-
import { ChatNetworkingClient, TextChatUI } from "@mml-io/3d-web-text-chat";
|
19
20
|
import {
|
21
|
+
ChatNetworkingClient,
|
22
|
+
TextChatUI
|
23
|
+
} from "@mml-io/3d-web-text-chat";
|
24
|
+
import {
|
25
|
+
AUTHENTICATION_FAILED_ERROR_TYPE,
|
26
|
+
CONNECTION_LIMIT_REACHED_ERROR_TYPE,
|
27
|
+
USER_UPDATE_MESSAGE_TYPE,
|
20
28
|
UserNetworkingClient,
|
21
29
|
WebsocketStatus
|
22
30
|
} from "@mml-io/3d-web-user-networking";
|
@@ -37,17 +45,22 @@ var Networked3dWebExperienceClient = class {
|
|
37
45
|
this.characterModelLoader = new CharacterModelLoader();
|
38
46
|
this.timeManager = new TimeManager();
|
39
47
|
this.keyInputManager = new KeyInputManager();
|
48
|
+
this.mmlFrames = [];
|
40
49
|
this.clientId = null;
|
41
50
|
this.remoteUserStates = /* @__PURE__ */ new Map();
|
42
51
|
this.userProfiles = /* @__PURE__ */ new Map();
|
43
52
|
this.networkChat = null;
|
44
53
|
this.textChatUI = null;
|
54
|
+
this.avatarSelectionUI = null;
|
45
55
|
this.voiceChatManager = null;
|
46
56
|
this.latestCharacterObject = {
|
47
57
|
characterState: null
|
48
58
|
};
|
59
|
+
this.characterControllerPaneSet = false;
|
49
60
|
this.initialLoadCompleted = false;
|
50
61
|
this.loadingProgressManager = new LoadingProgressManager();
|
62
|
+
this.currentRequestAnimationFrame = null;
|
63
|
+
var _a;
|
51
64
|
this.element = document.createElement("div");
|
52
65
|
this.element.style.position = "absolute";
|
53
66
|
this.element.style.width = "100%";
|
@@ -58,7 +71,12 @@ var Networked3dWebExperienceClient = class {
|
|
58
71
|
this.audioListener.context.resume();
|
59
72
|
}
|
60
73
|
});
|
61
|
-
this.
|
74
|
+
this.canvasHolder = document.createElement("div");
|
75
|
+
this.canvasHolder.style.position = "absolute";
|
76
|
+
this.canvasHolder.style.width = "100%";
|
77
|
+
this.canvasHolder.style.height = "100%";
|
78
|
+
this.element.appendChild(this.canvasHolder);
|
79
|
+
this.cameraManager = new CameraManager(this.canvasHolder, this.collisionsManager);
|
62
80
|
this.cameraManager.camera.add(this.audioListener);
|
63
81
|
this.virtualJoystick = new VirtualJoystick(this.element, {
|
64
82
|
radius: 70,
|
@@ -67,16 +85,24 @@ var Networked3dWebExperienceClient = class {
|
|
67
85
|
y: 0,
|
68
86
|
mouse_support: false
|
69
87
|
});
|
70
|
-
this.composer = new Composer(
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
this.
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
)
|
79
|
-
|
88
|
+
this.composer = new Composer({
|
89
|
+
scene: this.scene,
|
90
|
+
camera: this.cameraManager.camera,
|
91
|
+
spawnSun: true,
|
92
|
+
environmentConfiguration: this.config.environmentConfiguration
|
93
|
+
});
|
94
|
+
this.composer.useHDRJPG(this.config.skyboxHdrJpgUrl);
|
95
|
+
this.canvasHolder.appendChild(this.composer.renderer.domElement);
|
96
|
+
if (this.config.enableTweakPane !== false) {
|
97
|
+
this.tweakPane = new TweakPane(
|
98
|
+
this.element,
|
99
|
+
this.composer.renderer,
|
100
|
+
this.scene,
|
101
|
+
this.composer.effectComposer
|
102
|
+
);
|
103
|
+
this.cameraManager.setupTweakPane(this.tweakPane);
|
104
|
+
this.composer.setupTweakPane(this.tweakPane);
|
105
|
+
}
|
80
106
|
const resizeObserver = new ResizeObserver(() => {
|
81
107
|
this.composer.fitContainer();
|
82
108
|
});
|
@@ -115,6 +141,16 @@ var Networked3dWebExperienceClient = class {
|
|
115
141
|
username,
|
116
142
|
characterDescription
|
117
143
|
});
|
144
|
+
},
|
145
|
+
onServerError: (error) => {
|
146
|
+
switch (error.errorType) {
|
147
|
+
case AUTHENTICATION_FAILED_ERROR_TYPE:
|
148
|
+
this.disposeWithError(error.message);
|
149
|
+
break;
|
150
|
+
case CONNECTION_LIMIT_REACHED_ERROR_TYPE:
|
151
|
+
this.disposeWithError(error.message);
|
152
|
+
break;
|
153
|
+
}
|
118
154
|
}
|
119
155
|
});
|
120
156
|
this.characterManager = new CharacterManager({
|
@@ -133,21 +169,25 @@ var Networked3dWebExperienceClient = class {
|
|
133
169
|
animationConfig: this.config.animationConfig,
|
134
170
|
characterResolve: (characterId) => {
|
135
171
|
return this.resolveCharacterData(characterId);
|
136
|
-
}
|
172
|
+
},
|
173
|
+
updateURLLocation: this.config.updateURLLocation !== false
|
137
174
|
});
|
138
175
|
this.scene.add(this.characterManager.group);
|
139
|
-
|
140
|
-
|
141
|
-
|
176
|
+
if (((_a = this.config.environmentConfiguration) == null ? void 0 : _a.groundPlane) !== false) {
|
177
|
+
const groundPlane = new GroundPlane();
|
178
|
+
this.collisionsManager.addMeshesGroup(groundPlane);
|
179
|
+
this.scene.add(groundPlane);
|
180
|
+
}
|
142
181
|
this.setupMMLScene();
|
143
182
|
this.loadingScreen = new LoadingScreen(this.loadingProgressManager);
|
144
|
-
|
183
|
+
this.element.append(this.loadingScreen.element);
|
145
184
|
this.loadingProgressManager.addProgressCallback(() => {
|
146
185
|
const [, completed] = this.loadingProgressManager.toRatio();
|
147
186
|
if (completed && !this.initialLoadCompleted) {
|
148
187
|
this.initialLoadCompleted = true;
|
149
188
|
this.connectToVoiceChat();
|
150
189
|
this.connectToTextChat();
|
190
|
+
this.mountAvatarSelectionUI();
|
151
191
|
this.spawnCharacter();
|
152
192
|
}
|
153
193
|
});
|
@@ -179,22 +219,63 @@ var Networked3dWebExperienceClient = class {
|
|
179
219
|
this.userProfiles.set(id, userData);
|
180
220
|
this.characterManager.respawnIfPresent(id);
|
181
221
|
}
|
222
|
+
updateUserAvatar(avatar) {
|
223
|
+
if (this.clientId === null) {
|
224
|
+
throw new Error("Client ID not set");
|
225
|
+
}
|
226
|
+
const user = this.userProfiles.get(this.clientId);
|
227
|
+
if (!user) {
|
228
|
+
throw new Error("User not found");
|
229
|
+
}
|
230
|
+
const newUser = {
|
231
|
+
...user,
|
232
|
+
characterDescription: {
|
233
|
+
meshFileUrl: avatar.meshFileUrl ?? void 0,
|
234
|
+
mmlCharacterUrl: avatar.mmlCharacterUrl ?? void 0,
|
235
|
+
mmlCharacterString: avatar.mmlCharacterString ?? void 0
|
236
|
+
}
|
237
|
+
};
|
238
|
+
this.userProfiles.set(this.clientId, newUser);
|
239
|
+
this.updateUserProfile(this.clientId, newUser);
|
240
|
+
}
|
182
241
|
sendChatMessageToServer(message) {
|
183
242
|
this.mmlCompositionScene.onChatMessage(message);
|
184
243
|
if (this.clientId === null || this.networkChat === null)
|
185
244
|
return;
|
186
245
|
this.networkChat.sendChatMessage(message);
|
187
246
|
}
|
247
|
+
sendIdentityUpdateToServer(avatar) {
|
248
|
+
if (!this.clientId) {
|
249
|
+
throw new Error("Client ID not set");
|
250
|
+
}
|
251
|
+
const userProfile = this.userProfiles.get(this.clientId);
|
252
|
+
if (!userProfile) {
|
253
|
+
throw new Error("User profile not found");
|
254
|
+
}
|
255
|
+
this.networkClient.sendMessage({
|
256
|
+
type: USER_UPDATE_MESSAGE_TYPE,
|
257
|
+
userIdentity: {
|
258
|
+
username: userProfile.username,
|
259
|
+
characterDescription: {
|
260
|
+
mmlCharacterString: avatar.mmlCharacterString,
|
261
|
+
mmlCharacterUrl: avatar.mmlCharacterUrl,
|
262
|
+
meshFileUrl: avatar.meshFileUrl
|
263
|
+
}
|
264
|
+
}
|
265
|
+
});
|
266
|
+
}
|
188
267
|
connectToVoiceChat() {
|
189
268
|
if (this.clientId === null)
|
190
269
|
return;
|
191
|
-
if (this.voiceChatManager === null) {
|
192
|
-
this.voiceChatManager = new VoiceChatManager(
|
193
|
-
this.
|
194
|
-
this.
|
195
|
-
this.
|
196
|
-
this.
|
197
|
-
|
270
|
+
if (this.voiceChatManager === null && this.config.voiceChatAddress) {
|
271
|
+
this.voiceChatManager = new VoiceChatManager({
|
272
|
+
url: this.config.voiceChatAddress,
|
273
|
+
holderElement: this.element,
|
274
|
+
userId: this.clientId,
|
275
|
+
remoteUserStates: this.remoteUserStates,
|
276
|
+
latestCharacterObj: this.latestCharacterObject,
|
277
|
+
autoJoin: false
|
278
|
+
});
|
198
279
|
}
|
199
280
|
}
|
200
281
|
connectToTextChat() {
|
@@ -207,17 +288,20 @@ var Networked3dWebExperienceClient = class {
|
|
207
288
|
throw new Error("User not found");
|
208
289
|
}
|
209
290
|
if (this.textChatUI === null) {
|
210
|
-
|
211
|
-
this.element,
|
212
|
-
user.username,
|
213
|
-
this.sendChatMessageToServer.bind(this)
|
214
|
-
|
291
|
+
const textChatUISettings = {
|
292
|
+
holderElement: this.element,
|
293
|
+
clientname: user.username,
|
294
|
+
sendMessageToServerMethod: this.sendChatMessageToServer.bind(this),
|
295
|
+
visibleByDefault: this.config.chatVisibleByDefault,
|
296
|
+
stringToHslOptions: this.config.userNameToColorOptions
|
297
|
+
};
|
298
|
+
this.textChatUI = new TextChatUI(textChatUISettings);
|
215
299
|
this.textChatUI.init();
|
216
300
|
}
|
217
301
|
this.networkChat = new ChatNetworkingClient({
|
218
302
|
url: this.config.chatNetworkAddress,
|
219
303
|
sessionToken: this.config.sessionToken,
|
220
|
-
websocketFactory: (url) => new WebSocket(
|
304
|
+
websocketFactory: (url) => new WebSocket(url),
|
221
305
|
statusUpdateCallback: (status) => {
|
222
306
|
if (status === WebsocketStatus.Disconnected || status === WebsocketStatus.Reconnecting) {
|
223
307
|
}
|
@@ -232,8 +316,30 @@ var Networked3dWebExperienceClient = class {
|
|
232
316
|
});
|
233
317
|
}
|
234
318
|
}
|
319
|
+
mountAvatarSelectionUI() {
|
320
|
+
var _a, _b, _c, _d, _e;
|
321
|
+
if (!((_b = (_a = this.config.avatarConfiguration) == null ? void 0 : _a.availableAvatars) == null ? void 0 : _b.length) && !((_c = this.config.avatarConfiguration) == null ? void 0 : _c.allowCustomAvatars)) {
|
322
|
+
return;
|
323
|
+
}
|
324
|
+
if (this.clientId === null) {
|
325
|
+
throw new Error("Client ID not set");
|
326
|
+
}
|
327
|
+
const ownIdentity = this.userProfiles.get(this.clientId);
|
328
|
+
if (!ownIdentity) {
|
329
|
+
throw new Error("Own identity not found");
|
330
|
+
}
|
331
|
+
this.avatarSelectionUI = new AvatarSelectionUI({
|
332
|
+
holderElement: this.element,
|
333
|
+
clientId: this.clientId,
|
334
|
+
visibleByDefault: false,
|
335
|
+
availableAvatars: ((_d = this.config.avatarConfiguration) == null ? void 0 : _d.availableAvatars) ?? [],
|
336
|
+
sendMessageToServerMethod: this.sendIdentityUpdateToServer.bind(this),
|
337
|
+
enableCustomAvatar: (_e = this.config.avatarConfiguration) == null ? void 0 : _e.allowCustomAvatars
|
338
|
+
});
|
339
|
+
this.avatarSelectionUI.init();
|
340
|
+
}
|
235
341
|
update() {
|
236
|
-
var _a, _b, _c;
|
342
|
+
var _a, _b, _c, _d;
|
237
343
|
this.timeManager.update();
|
238
344
|
this.characterManager.update();
|
239
345
|
(_a = this.voiceChatManager) == null ? void 0 : _a.speakingParticipants.forEach((value, id) => {
|
@@ -242,10 +348,19 @@ var Networked3dWebExperienceClient = class {
|
|
242
348
|
this.cameraManager.update();
|
243
349
|
(_c = this.composer.sun) == null ? void 0 : _c.updateCharacterPosition((_b = this.characterManager.localCharacter) == null ? void 0 : _b.position);
|
244
350
|
this.composer.render(this.timeManager);
|
245
|
-
if (this.tweakPane.guiVisible) {
|
351
|
+
if ((_d = this.tweakPane) == null ? void 0 : _d.guiVisible) {
|
246
352
|
this.tweakPane.updateStats(this.timeManager);
|
353
|
+
this.tweakPane.updateCameraData(this.cameraManager);
|
354
|
+
if (this.characterManager.localCharacter && this.characterManager.localController) {
|
355
|
+
if (!this.characterControllerPaneSet) {
|
356
|
+
this.characterControllerPaneSet = true;
|
357
|
+
this.characterManager.setupTweakPane(this.tweakPane);
|
358
|
+
} else {
|
359
|
+
this.tweakPane.updateCharacterData(this.characterManager.localController);
|
360
|
+
}
|
361
|
+
}
|
247
362
|
}
|
248
|
-
requestAnimationFrame(() => {
|
363
|
+
this.currentRequestAnimationFrame = requestAnimationFrame(() => {
|
249
364
|
this.update();
|
250
365
|
});
|
251
366
|
}
|
@@ -281,6 +396,30 @@ var Networked3dWebExperienceClient = class {
|
|
281
396
|
this.cameraManager.reverseUpdateFromPositions();
|
282
397
|
}
|
283
398
|
}
|
399
|
+
disposeWithError(message) {
|
400
|
+
this.dispose();
|
401
|
+
this.errorScreen = new ErrorScreen("An error occurred", message);
|
402
|
+
this.element.append(this.errorScreen.element);
|
403
|
+
}
|
404
|
+
dispose() {
|
405
|
+
var _a, _b, _c;
|
406
|
+
this.networkClient.stop();
|
407
|
+
(_a = this.networkChat) == null ? void 0 : _a.stop();
|
408
|
+
for (const mmlFrame of this.mmlFrames) {
|
409
|
+
mmlFrame.remove();
|
410
|
+
}
|
411
|
+
this.mmlFrames = [];
|
412
|
+
this.mmlCompositionScene.dispose();
|
413
|
+
this.composer.dispose();
|
414
|
+
(_b = this.tweakPane) == null ? void 0 : _b.dispose();
|
415
|
+
if (this.currentRequestAnimationFrame !== null) {
|
416
|
+
cancelAnimationFrame(this.currentRequestAnimationFrame);
|
417
|
+
this.currentRequestAnimationFrame = null;
|
418
|
+
}
|
419
|
+
this.cameraManager.dispose();
|
420
|
+
this.loadingScreen.dispose();
|
421
|
+
(_c = this.errorScreen) == null ? void 0 : _c.dispose();
|
422
|
+
}
|
284
423
|
setupMMLScene() {
|
285
424
|
registerCustomElementsToWindow(window);
|
286
425
|
this.mmlCompositionScene = new MMLCompositionScene({
|
@@ -322,6 +461,7 @@ var Networked3dWebExperienceClient = class {
|
|
322
461
|
}
|
323
462
|
}
|
324
463
|
document.body.appendChild(frameElement);
|
464
|
+
this.mmlFrames.push(frameElement);
|
325
465
|
}
|
326
466
|
}
|
327
467
|
const mmlProgressManager = this.mmlCompositionScene.mmlScene.getLoadingProgressManager();
|
package/build/index.js.map
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"version": 3,
|
3
3
|
"sources": ["../src/Networked3dWebExperienceClient.ts"],
|
4
|
-
"sourcesContent": ["import {\n AnimationConfig,\n CameraManager,\n CharacterDescription,\n CharacterManager,\n CharacterModelLoader,\n CharacterState,\n CollisionsManager,\n Composer,\n decodeCharacterAndCamera,\n getSpawnPositionInsideCircle,\n KeyInputManager,\n MMLCompositionScene,\n TimeManager,\n TweakPane,\n GroundPlane,\n LoadingScreen,\n VirtualJoystick,\n} from \"@mml-io/3d-web-client-core\";\nimport { ChatNetworkingClient, FromClientChatMessage, TextChatUI } from \"@mml-io/3d-web-text-chat\";\nimport {\n UserData,\n UserNetworkingClient,\n UserNetworkingClientUpdate,\n WebsocketStatus,\n} from \"@mml-io/3d-web-user-networking\";\nimport { VoiceChatManager } from \"@mml-io/3d-web-voice-chat\";\nimport {\n IMMLScene,\n LoadingProgressManager,\n registerCustomElementsToWindow,\n setGlobalMMLScene,\n} from \"mml-web\";\nimport { AudioListener, Euler, Scene, Vector3 } from \"three\";\n\ntype MMLDocumentConfiguration = {\n url: string;\n position?: {\n x: number;\n y: number;\n z: number;\n };\n rotation?: {\n x: number;\n y: number;\n z: number;\n };\n scale?: {\n x: number;\n y: number;\n z: number;\n };\n};\n\nexport type Networked3dWebExperienceClientConfig = {\n sessionToken: string;\n chatNetworkAddress?: string;\n userNetworkAddress: string;\n mmlDocuments?: Array<MMLDocumentConfiguration>;\n animationConfig: AnimationConfig;\n hdrJpgUrl: string;\n};\n\nexport class Networked3dWebExperienceClient {\n private element: HTMLDivElement;\n\n private scene = new Scene();\n private composer: Composer;\n private tweakPane: TweakPane;\n private audioListener = new AudioListener();\n\n private cameraManager: CameraManager;\n\n private collisionsManager = new CollisionsManager(this.scene);\n\n private characterModelLoader = new CharacterModelLoader();\n private characterManager: CharacterManager;\n\n private timeManager = new TimeManager();\n\n private keyInputManager = new KeyInputManager();\n private virtualJoystick: VirtualJoystick;\n\n private mmlCompositionScene: MMLCompositionScene;\n\n private clientId: number | null = null;\n private networkClient: UserNetworkingClient;\n private remoteUserStates = new Map<number, CharacterState>();\n private userProfiles = new Map<number, UserData>();\n\n private networkChat: ChatNetworkingClient | null = null;\n private textChatUI: TextChatUI | null = null;\n\n private voiceChatManager: VoiceChatManager | null = null;\n private readonly latestCharacterObject = {\n characterState: null as null | CharacterState,\n };\n\n private initialLoadCompleted = false;\n private loadingProgressManager = new LoadingProgressManager();\n private loadingScreen: LoadingScreen;\n\n constructor(\n private holderElement: HTMLElement,\n private config: Networked3dWebExperienceClientConfig,\n ) {\n this.element = document.createElement(\"div\");\n this.element.style.position = \"absolute\";\n this.element.style.width = \"100%\";\n this.element.style.height = \"100%\";\n this.holderElement.appendChild(this.element);\n\n document.addEventListener(\"mousedown\", () => {\n if (this.audioListener.context.state === \"suspended\") {\n this.audioListener.context.resume();\n }\n });\n\n this.cameraManager = new CameraManager(this.element, this.collisionsManager);\n this.cameraManager.camera.add(this.audioListener);\n\n this.virtualJoystick = new VirtualJoystick(this.element, {\n radius: 70,\n inner_radius: 20,\n x: 70,\n y: 0,\n mouse_support: false,\n });\n\n this.composer = new Composer(this.scene, this.cameraManager.camera, true);\n this.composer.useHDRJPG(this.config.hdrJpgUrl);\n this.element.appendChild(this.composer.renderer.domElement);\n\n this.tweakPane = new TweakPane(\n this.element,\n this.composer.renderer,\n this.scene,\n this.composer.effectComposer,\n );\n this.composer.setupTweakPane(this.tweakPane);\n\n const resizeObserver = new ResizeObserver(() => {\n this.composer.fitContainer();\n });\n resizeObserver.observe(this.element);\n\n const initialNetworkLoadRef = {};\n this.loadingProgressManager.addLoadingAsset(initialNetworkLoadRef, \"network\", \"network\");\n this.networkClient = new UserNetworkingClient({\n url: this.config.userNetworkAddress,\n sessionToken: this.config.sessionToken,\n websocketFactory: (url: string) => new WebSocket(url),\n statusUpdateCallback: (status: WebsocketStatus) => {\n if (status === WebsocketStatus.Disconnected || status === WebsocketStatus.Reconnecting) {\n // The connection was lost after being established - the connection may be re-established with a different client ID\n this.characterManager.clear();\n this.remoteUserStates.clear();\n this.clientId = null;\n }\n },\n assignedIdentity: (clientId: number) => {\n console.log(`Assigned ID: ${clientId}`);\n this.clientId = clientId;\n if (this.initialLoadCompleted) {\n // Already loaded - respawn the character\n this.spawnCharacter();\n } else {\n this.loadingProgressManager.completedLoadingAsset(initialNetworkLoadRef);\n }\n },\n clientUpdate: (\n remoteClientId: number,\n userNetworkingClientUpdate: null | UserNetworkingClientUpdate,\n ) => {\n if (userNetworkingClientUpdate === null) {\n this.remoteUserStates.delete(remoteClientId);\n } else {\n this.remoteUserStates.set(remoteClientId, userNetworkingClientUpdate);\n }\n },\n clientProfileUpdated: (\n clientId: number,\n username: string,\n characterDescription: CharacterDescription,\n ): void => {\n this.updateUserProfile(clientId, {\n username,\n characterDescription,\n });\n },\n });\n\n this.characterManager = new CharacterManager({\n composer: this.composer,\n characterModelLoader: this.characterModelLoader,\n collisionsManager: this.collisionsManager,\n cameraManager: this.cameraManager,\n timeManager: this.timeManager,\n keyInputManager: this.keyInputManager,\n virtualJoystick: this.virtualJoystick,\n remoteUserStates: this.remoteUserStates,\n sendUpdate: (characterState: CharacterState) => {\n this.latestCharacterObject.characterState = characterState;\n this.networkClient.sendUpdate(characterState);\n },\n animationConfig: this.config.animationConfig,\n characterResolve: (characterId: number) => {\n return this.resolveCharacterData(characterId);\n },\n });\n this.scene.add(this.characterManager.group);\n\n const groundPlane = new GroundPlane();\n this.collisionsManager.addMeshesGroup(groundPlane);\n this.scene.add(groundPlane);\n\n this.setupMMLScene();\n\n this.loadingScreen = new LoadingScreen(this.loadingProgressManager);\n document.body.append(this.loadingScreen.element);\n\n this.loadingProgressManager.addProgressCallback(() => {\n const [, completed] = this.loadingProgressManager.toRatio();\n if (completed && !this.initialLoadCompleted) {\n this.initialLoadCompleted = true;\n /*\n When all content (in particular MML) has loaded, spawn the character (this is to avoid the character falling\n through as-yet-unloaded geometry)\n */\n this.connectToVoiceChat();\n this.connectToTextChat();\n this.spawnCharacter();\n }\n });\n this.loadingProgressManager.setInitialLoad(true);\n }\n\n static createFullscreenHolder(): HTMLDivElement {\n document.body.style.margin = \"0\";\n document.body.style.overflow = \"hidden\";\n\n const holder = document.createElement(\"div\");\n holder.style.position = \"absolute\";\n holder.style.width = \"100%\";\n holder.style.height = \"100%\";\n holder.style.overflow = \"hidden\";\n document.body.appendChild(holder);\n return holder;\n }\n\n private resolveCharacterData(clientId: number): {\n username: string;\n characterDescription: CharacterDescription;\n } {\n const user = this.userProfiles.get(clientId)!;\n if (!user) {\n throw new Error(`Failed to resolve user for clientId ${clientId}`);\n }\n\n return {\n username: user.username,\n characterDescription: user.characterDescription,\n };\n }\n\n private updateUserProfile(id: number, userData: UserData) {\n console.log(`Update user_profile for id=${id} (username=${userData.username})`);\n\n this.userProfiles.set(id, userData);\n\n this.characterManager.respawnIfPresent(id);\n }\n\n private sendChatMessageToServer(message: string): void {\n this.mmlCompositionScene.onChatMessage(message);\n if (this.clientId === null || this.networkChat === null) return;\n this.networkChat.sendChatMessage(message);\n }\n\n private connectToVoiceChat() {\n if (this.clientId === null) return;\n\n if (this.voiceChatManager === null) {\n this.voiceChatManager = new VoiceChatManager(\n this.element,\n this.clientId,\n this.remoteUserStates,\n this.latestCharacterObject,\n );\n }\n }\n\n private connectToTextChat() {\n if (this.clientId === null) {\n return;\n }\n if (this.networkChat === null && this.config.chatNetworkAddress) {\n const user = this.userProfiles.get(this.clientId);\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n if (this.textChatUI === null) {\n this.textChatUI = new TextChatUI(\n this.element,\n user.username,\n this.sendChatMessageToServer.bind(this),\n );\n this.textChatUI.init();\n }\n\n this.networkChat = new ChatNetworkingClient({\n url: this.config.chatNetworkAddress,\n sessionToken: this.config.sessionToken,\n websocketFactory: (url: string) => new WebSocket(`${url}?id=${this.clientId}`),\n statusUpdateCallback: (status: WebsocketStatus) => {\n if (status === WebsocketStatus.Disconnected || status === WebsocketStatus.Reconnecting) {\n // The connection was lost after being established - the connection may be re-established with a different client ID\n }\n },\n clientChatUpdate: (\n clientId: number,\n chatNetworkingUpdate: null | FromClientChatMessage,\n ) => {\n if (chatNetworkingUpdate !== null && this.textChatUI !== null) {\n const username = this.userProfiles.get(clientId)?.username || \"Unknown\";\n this.textChatUI.addTextMessage(username, chatNetworkingUpdate.text);\n }\n },\n });\n }\n }\n\n public update(): void {\n this.timeManager.update();\n this.characterManager.update();\n this.voiceChatManager?.speakingParticipants.forEach((value: boolean, id: number) => {\n this.characterManager.setSpeakingCharacter(id, value);\n });\n this.cameraManager.update();\n this.composer.sun?.updateCharacterPosition(this.characterManager.localCharacter?.position);\n this.composer.render(this.timeManager);\n if (this.tweakPane.guiVisible) {\n this.tweakPane.updateStats(this.timeManager);\n }\n requestAnimationFrame(() => {\n this.update();\n });\n }\n\n private spawnCharacter() {\n if (this.clientId === null) {\n throw new Error(\"Client ID not set\");\n }\n const spawnPosition = getSpawnPositionInsideCircle(3, 30, this.clientId!, 0.4);\n const spawnRotation = new Euler(0, 0, 0);\n let cameraPosition: Vector3 | null = null;\n if (window.location.hash && window.location.hash.length > 1) {\n const urlParams = decodeCharacterAndCamera(window.location.hash.substring(1));\n spawnPosition.copy(urlParams.character.position);\n spawnRotation.setFromQuaternion(urlParams.character.quaternion);\n cameraPosition = urlParams.camera.position;\n }\n const ownIdentity = this.userProfiles.get(this.clientId);\n if (!ownIdentity) {\n throw new Error(\"Own identity not found\");\n }\n\n this.characterManager.spawnLocalCharacter(\n this.clientId!,\n ownIdentity.username,\n ownIdentity.characterDescription,\n spawnPosition,\n spawnRotation,\n );\n if (cameraPosition !== null) {\n this.cameraManager.camera.position.copy(cameraPosition);\n this.cameraManager.setTarget(\n new Vector3().add(spawnPosition).add(this.characterManager.headTargetOffset),\n );\n this.cameraManager.reverseUpdateFromPositions();\n }\n }\n\n private setupMMLScene() {\n registerCustomElementsToWindow(window);\n this.mmlCompositionScene = new MMLCompositionScene({\n targetElement: this.element,\n renderer: this.composer.renderer,\n scene: this.scene,\n camera: this.cameraManager.camera,\n audioListener: this.audioListener,\n collisionsManager: this.collisionsManager,\n getUserPositionAndRotation: () => {\n return this.characterManager.getLocalCharacterPositionAndRotation();\n },\n });\n this.scene.add(this.mmlCompositionScene.group);\n setGlobalMMLScene(this.mmlCompositionScene.mmlScene as IMMLScene);\n\n if (this.config.mmlDocuments) {\n for (const mmlDocument of this.config.mmlDocuments) {\n const frameElement = document.createElement(\"m-frame\");\n frameElement.setAttribute(\"src\", mmlDocument.url);\n if (mmlDocument.position) {\n frameElement.setAttribute(\"x\", mmlDocument.position.x.toString());\n frameElement.setAttribute(\"y\", mmlDocument.position.y.toString());\n frameElement.setAttribute(\"z\", mmlDocument.position.z.toString());\n }\n if (mmlDocument.rotation) {\n frameElement.setAttribute(\"rx\", mmlDocument.rotation.x.toString());\n frameElement.setAttribute(\"ry\", mmlDocument.rotation.y.toString());\n frameElement.setAttribute(\"rz\", mmlDocument.rotation.z.toString());\n }\n if (mmlDocument.scale) {\n if (mmlDocument.scale.x !== undefined) {\n frameElement.setAttribute(\"sx\", mmlDocument.scale.x.toString());\n }\n if (mmlDocument.scale.y !== undefined) {\n frameElement.setAttribute(\"sy\", mmlDocument.scale.y.toString());\n }\n if (mmlDocument.scale.z !== undefined) {\n frameElement.setAttribute(\"sz\", mmlDocument.scale.z.toString());\n }\n }\n document.body.appendChild(frameElement);\n }\n }\n\n const mmlProgressManager = this.mmlCompositionScene.mmlScene.getLoadingProgressManager!()!;\n this.loadingProgressManager.addLoadingDocument(mmlProgressManager, \"mml\", mmlProgressManager);\n mmlProgressManager.addProgressCallback(() => {\n this.loadingProgressManager.updateDocumentProgress(mmlProgressManager);\n });\n mmlProgressManager.setInitialLoad(true);\n }\n}\n"],
|
5
|
-
"mappings": "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",
|
4
|
+
"sourcesContent": ["import { AvatarSelectionUI, AvatarType } from \"@mml-io/3d-web-avatar-selection-ui\";\nimport {\n AnimationConfig,\n CameraManager,\n CharacterDescription,\n CharacterManager,\n CharacterModelLoader,\n CharacterState,\n CollisionsManager,\n Composer,\n decodeCharacterAndCamera,\n EnvironmentConfiguration,\n ErrorScreen,\n getSpawnPositionInsideCircle,\n GroundPlane,\n KeyInputManager,\n LoadingScreen,\n MMLCompositionScene,\n TimeManager,\n TweakPane,\n VirtualJoystick,\n} from \"@mml-io/3d-web-client-core\";\nimport {\n ChatNetworkingClient,\n FromClientChatMessage,\n StringToHslOptions,\n TextChatUI,\n TextChatUIProps,\n} from \"@mml-io/3d-web-text-chat\";\nimport {\n AUTHENTICATION_FAILED_ERROR_TYPE,\n CONNECTION_LIMIT_REACHED_ERROR_TYPE,\n ServerErrorType,\n USER_UPDATE_MESSAGE_TYPE,\n UserData,\n UserNetworkingClient,\n UserNetworkingClientUpdate,\n WebsocketStatus,\n} from \"@mml-io/3d-web-user-networking\";\nimport { VoiceChatManager } from \"@mml-io/3d-web-voice-chat\";\nimport {\n IMMLScene,\n LoadingProgressManager,\n registerCustomElementsToWindow,\n setGlobalMMLScene,\n} from \"mml-web\";\nimport { AudioListener, Euler, Scene, Vector3 } from \"three\";\n\ntype MMLDocumentConfiguration = {\n url: string;\n position?: {\n x: number;\n y: number;\n z: number;\n };\n rotation?: {\n x: number;\n y: number;\n z: number;\n };\n scale?: {\n x: number;\n y: number;\n z: number;\n };\n};\n\nexport type AvatarConfiguration = {\n availableAvatars?: Array<AvatarType>;\n allowCustomAvatars?: boolean;\n};\n\nexport type Networked3dWebExperienceClientConfig = {\n sessionToken: string;\n chatNetworkAddress?: string;\n chatVisibleByDefault?: boolean;\n userNameToColorOptions?: StringToHslOptions;\n voiceChatAddress?: string;\n userNetworkAddress: string;\n mmlDocuments?: Array<MMLDocumentConfiguration>;\n animationConfig: AnimationConfig;\n environmentConfiguration?: EnvironmentConfiguration;\n skyboxHdrJpgUrl: string;\n enableTweakPane?: boolean;\n updateURLLocation?: boolean;\n avatarConfiguration?: AvatarConfiguration;\n};\n\nexport class Networked3dWebExperienceClient {\n private element: HTMLDivElement;\n private canvasHolder: HTMLDivElement;\n\n private scene = new Scene();\n private composer: Composer;\n private tweakPane?: TweakPane;\n private audioListener = new AudioListener();\n\n private cameraManager: CameraManager;\n\n private collisionsManager = new CollisionsManager(this.scene);\n\n private characterModelLoader = new CharacterModelLoader();\n private characterManager: CharacterManager;\n\n private timeManager = new TimeManager();\n\n private keyInputManager = new KeyInputManager();\n private virtualJoystick: VirtualJoystick;\n\n private mmlCompositionScene: MMLCompositionScene;\n private mmlFrames: Array<HTMLElement> = [];\n\n private clientId: number | null = null;\n private networkClient: UserNetworkingClient;\n private remoteUserStates = new Map<number, CharacterState>();\n private userProfiles = new Map<number, UserData>();\n\n private networkChat: ChatNetworkingClient | null = null;\n private textChatUI: TextChatUI | null = null;\n\n private avatarSelectionUI: AvatarSelectionUI | null = null;\n\n private voiceChatManager: VoiceChatManager | null = null;\n private readonly latestCharacterObject = {\n characterState: null as null | CharacterState,\n };\n private characterControllerPaneSet: boolean = false;\n\n private initialLoadCompleted = false;\n private loadingProgressManager = new LoadingProgressManager();\n private loadingScreen: LoadingScreen;\n private errorScreen?: ErrorScreen;\n private currentRequestAnimationFrame: number | null = null;\n\n constructor(\n private holderElement: HTMLElement,\n private config: Networked3dWebExperienceClientConfig,\n ) {\n this.element = document.createElement(\"div\");\n this.element.style.position = \"absolute\";\n this.element.style.width = \"100%\";\n this.element.style.height = \"100%\";\n this.holderElement.appendChild(this.element);\n\n document.addEventListener(\"mousedown\", () => {\n if (this.audioListener.context.state === \"suspended\") {\n this.audioListener.context.resume();\n }\n });\n\n this.canvasHolder = document.createElement(\"div\");\n this.canvasHolder.style.position = \"absolute\";\n this.canvasHolder.style.width = \"100%\";\n this.canvasHolder.style.height = \"100%\";\n this.element.appendChild(this.canvasHolder);\n\n this.cameraManager = new CameraManager(this.canvasHolder, this.collisionsManager);\n this.cameraManager.camera.add(this.audioListener);\n\n this.virtualJoystick = new VirtualJoystick(this.element, {\n radius: 70,\n inner_radius: 20,\n x: 70,\n y: 0,\n mouse_support: false,\n });\n\n this.composer = new Composer({\n scene: this.scene,\n camera: this.cameraManager.camera,\n spawnSun: true,\n environmentConfiguration: this.config.environmentConfiguration,\n });\n\n this.composer.useHDRJPG(this.config.skyboxHdrJpgUrl);\n this.canvasHolder.appendChild(this.composer.renderer.domElement);\n\n if (this.config.enableTweakPane !== false) {\n this.tweakPane = new TweakPane(\n this.element,\n this.composer.renderer,\n this.scene,\n this.composer.effectComposer,\n );\n this.cameraManager.setupTweakPane(this.tweakPane);\n this.composer.setupTweakPane(this.tweakPane);\n }\n\n const resizeObserver = new ResizeObserver(() => {\n this.composer.fitContainer();\n });\n resizeObserver.observe(this.element);\n\n const initialNetworkLoadRef = {};\n this.loadingProgressManager.addLoadingAsset(initialNetworkLoadRef, \"network\", \"network\");\n this.networkClient = new UserNetworkingClient({\n url: this.config.userNetworkAddress,\n sessionToken: this.config.sessionToken,\n websocketFactory: (url: string) => new WebSocket(url),\n statusUpdateCallback: (status: WebsocketStatus) => {\n if (status === WebsocketStatus.Disconnected || status === WebsocketStatus.Reconnecting) {\n // The connection was lost after being established - the connection may be re-established with a different client ID\n this.characterManager.clear();\n this.remoteUserStates.clear();\n this.clientId = null;\n }\n },\n assignedIdentity: (clientId: number) => {\n console.log(`Assigned ID: ${clientId}`);\n this.clientId = clientId;\n if (this.initialLoadCompleted) {\n // Already loaded - respawn the character\n this.spawnCharacter();\n } else {\n this.loadingProgressManager.completedLoadingAsset(initialNetworkLoadRef);\n }\n },\n clientUpdate: (\n remoteClientId: number,\n userNetworkingClientUpdate: null | UserNetworkingClientUpdate,\n ) => {\n if (userNetworkingClientUpdate === null) {\n this.remoteUserStates.delete(remoteClientId);\n } else {\n this.remoteUserStates.set(remoteClientId, userNetworkingClientUpdate);\n }\n },\n clientProfileUpdated: (\n clientId: number,\n username: string,\n characterDescription: CharacterDescription,\n ): void => {\n this.updateUserProfile(clientId, {\n username,\n characterDescription,\n });\n },\n onServerError: (error: { message: string; errorType: ServerErrorType }) => {\n switch (error.errorType) {\n case AUTHENTICATION_FAILED_ERROR_TYPE:\n this.disposeWithError(error.message);\n break;\n case CONNECTION_LIMIT_REACHED_ERROR_TYPE:\n this.disposeWithError(error.message);\n break;\n }\n },\n });\n\n this.characterManager = new CharacterManager({\n composer: this.composer,\n characterModelLoader: this.characterModelLoader,\n collisionsManager: this.collisionsManager,\n cameraManager: this.cameraManager,\n timeManager: this.timeManager,\n keyInputManager: this.keyInputManager,\n virtualJoystick: this.virtualJoystick,\n remoteUserStates: this.remoteUserStates,\n sendUpdate: (characterState: CharacterState) => {\n this.latestCharacterObject.characterState = characterState;\n this.networkClient.sendUpdate(characterState);\n },\n animationConfig: this.config.animationConfig,\n characterResolve: (characterId: number) => {\n return this.resolveCharacterData(characterId);\n },\n updateURLLocation: this.config.updateURLLocation !== false,\n });\n this.scene.add(this.characterManager.group);\n\n if (this.config.environmentConfiguration?.groundPlane !== false) {\n const groundPlane = new GroundPlane();\n this.collisionsManager.addMeshesGroup(groundPlane);\n this.scene.add(groundPlane);\n }\n\n this.setupMMLScene();\n\n this.loadingScreen = new LoadingScreen(this.loadingProgressManager);\n this.element.append(this.loadingScreen.element);\n\n this.loadingProgressManager.addProgressCallback(() => {\n const [, completed] = this.loadingProgressManager.toRatio();\n if (completed && !this.initialLoadCompleted) {\n this.initialLoadCompleted = true;\n /*\n When all content (in particular MML) has loaded, spawn the character (this is to avoid the character falling\n through as-yet-unloaded geometry)\n */\n this.connectToVoiceChat();\n this.connectToTextChat();\n this.mountAvatarSelectionUI();\n this.spawnCharacter();\n }\n });\n this.loadingProgressManager.setInitialLoad(true);\n }\n\n static createFullscreenHolder(): HTMLDivElement {\n document.body.style.margin = \"0\";\n document.body.style.overflow = \"hidden\";\n\n const holder = document.createElement(\"div\");\n holder.style.position = \"absolute\";\n holder.style.width = \"100%\";\n holder.style.height = \"100%\";\n holder.style.overflow = \"hidden\";\n document.body.appendChild(holder);\n return holder;\n }\n\n private resolveCharacterData(clientId: number): {\n username: string;\n characterDescription: CharacterDescription;\n } {\n const user = this.userProfiles.get(clientId)!;\n\n if (!user) {\n throw new Error(`Failed to resolve user for clientId ${clientId}`);\n }\n\n return {\n username: user.username,\n characterDescription: user.characterDescription,\n };\n }\n\n private updateUserProfile(id: number, userData: UserData) {\n console.log(`Update user_profile for id=${id} (username=${userData.username})`);\n\n this.userProfiles.set(id, userData);\n\n this.characterManager.respawnIfPresent(id);\n }\n\n private updateUserAvatar(avatar: AvatarType) {\n if (this.clientId === null) {\n throw new Error(\"Client ID not set\");\n }\n const user = this.userProfiles.get(this.clientId);\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n const newUser = {\n ...user,\n characterDescription: {\n meshFileUrl: avatar.meshFileUrl ?? undefined,\n mmlCharacterUrl: avatar.mmlCharacterUrl ?? undefined,\n mmlCharacterString: avatar.mmlCharacterString ?? undefined,\n },\n } as UserData;\n\n this.userProfiles.set(this.clientId, newUser);\n this.updateUserProfile(this.clientId, newUser);\n }\n\n private sendChatMessageToServer(message: string): void {\n this.mmlCompositionScene.onChatMessage(message);\n if (this.clientId === null || this.networkChat === null) return;\n this.networkChat.sendChatMessage(message);\n }\n\n private sendIdentityUpdateToServer(avatar: AvatarType) {\n if (!this.clientId) {\n throw new Error(\"Client ID not set\");\n }\n\n const userProfile = this.userProfiles.get(this.clientId);\n\n if (!userProfile) {\n throw new Error(\"User profile not found\");\n }\n\n this.networkClient.sendMessage({\n type: USER_UPDATE_MESSAGE_TYPE,\n userIdentity: {\n username: userProfile.username,\n characterDescription: {\n mmlCharacterString: avatar.mmlCharacterString,\n mmlCharacterUrl: avatar.mmlCharacterUrl,\n meshFileUrl: avatar.meshFileUrl,\n } as CharacterDescription,\n },\n });\n }\n\n private connectToVoiceChat() {\n if (this.clientId === null) return;\n\n if (this.voiceChatManager === null && this.config.voiceChatAddress) {\n this.voiceChatManager = new VoiceChatManager({\n url: this.config.voiceChatAddress,\n holderElement: this.element,\n userId: this.clientId,\n remoteUserStates: this.remoteUserStates,\n latestCharacterObj: this.latestCharacterObject,\n autoJoin: false,\n });\n }\n }\n\n private connectToTextChat() {\n if (this.clientId === null) {\n return;\n }\n if (this.networkChat === null && this.config.chatNetworkAddress) {\n const user = this.userProfiles.get(this.clientId);\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n if (this.textChatUI === null) {\n const textChatUISettings: TextChatUIProps = {\n holderElement: this.element,\n clientname: user.username,\n sendMessageToServerMethod: this.sendChatMessageToServer.bind(this),\n visibleByDefault: this.config.chatVisibleByDefault,\n stringToHslOptions: this.config.userNameToColorOptions,\n };\n this.textChatUI = new TextChatUI(textChatUISettings);\n this.textChatUI.init();\n }\n\n this.networkChat = new ChatNetworkingClient({\n url: this.config.chatNetworkAddress,\n sessionToken: this.config.sessionToken,\n websocketFactory: (url: string) => new WebSocket(url),\n statusUpdateCallback: (status: WebsocketStatus) => {\n if (status === WebsocketStatus.Disconnected || status === WebsocketStatus.Reconnecting) {\n // The connection was lost after being established - the connection may be re-established with a different client ID\n }\n },\n clientChatUpdate: (\n clientId: number,\n chatNetworkingUpdate: null | FromClientChatMessage,\n ) => {\n if (chatNetworkingUpdate !== null && this.textChatUI !== null) {\n const username = this.userProfiles.get(clientId)?.username || \"Unknown\";\n this.textChatUI.addTextMessage(username, chatNetworkingUpdate.text);\n }\n },\n });\n }\n }\n\n private mountAvatarSelectionUI() {\n if (\n !this.config.avatarConfiguration?.availableAvatars?.length &&\n !this.config.avatarConfiguration?.allowCustomAvatars\n ) {\n return;\n }\n\n if (this.clientId === null) {\n throw new Error(\"Client ID not set\");\n }\n const ownIdentity = this.userProfiles.get(this.clientId);\n if (!ownIdentity) {\n throw new Error(\"Own identity not found\");\n }\n\n this.avatarSelectionUI = new AvatarSelectionUI({\n holderElement: this.element,\n clientId: this.clientId,\n visibleByDefault: false,\n availableAvatars: this.config.avatarConfiguration?.availableAvatars ?? [],\n sendMessageToServerMethod: this.sendIdentityUpdateToServer.bind(this),\n enableCustomAvatar: this.config.avatarConfiguration?.allowCustomAvatars,\n });\n this.avatarSelectionUI.init();\n }\n\n public update(): void {\n this.timeManager.update();\n this.characterManager.update();\n this.voiceChatManager?.speakingParticipants.forEach((value: boolean, id: number) => {\n this.characterManager.setSpeakingCharacter(id, value);\n });\n this.cameraManager.update();\n this.composer.sun?.updateCharacterPosition(this.characterManager.localCharacter?.position);\n this.composer.render(this.timeManager);\n if (this.tweakPane?.guiVisible) {\n this.tweakPane.updateStats(this.timeManager);\n this.tweakPane.updateCameraData(this.cameraManager);\n if (this.characterManager.localCharacter && this.characterManager.localController) {\n if (!this.characterControllerPaneSet) {\n this.characterControllerPaneSet = true;\n this.characterManager.setupTweakPane(this.tweakPane);\n } else {\n this.tweakPane.updateCharacterData(this.characterManager.localController);\n }\n }\n }\n this.currentRequestAnimationFrame = requestAnimationFrame(() => {\n this.update();\n });\n }\n\n private spawnCharacter() {\n if (this.clientId === null) {\n throw new Error(\"Client ID not set\");\n }\n const spawnPosition = getSpawnPositionInsideCircle(3, 30, this.clientId!, 0.4);\n const spawnRotation = new Euler(0, 0, 0);\n let cameraPosition: Vector3 | null = null;\n if (window.location.hash && window.location.hash.length > 1) {\n const urlParams = decodeCharacterAndCamera(window.location.hash.substring(1));\n spawnPosition.copy(urlParams.character.position);\n spawnRotation.setFromQuaternion(urlParams.character.quaternion);\n cameraPosition = urlParams.camera.position;\n }\n const ownIdentity = this.userProfiles.get(this.clientId);\n if (!ownIdentity) {\n throw new Error(\"Own identity not found\");\n }\n\n this.characterManager.spawnLocalCharacter(\n this.clientId!,\n ownIdentity.username,\n ownIdentity.characterDescription,\n spawnPosition,\n spawnRotation,\n );\n\n if (cameraPosition !== null) {\n this.cameraManager.camera.position.copy(cameraPosition);\n this.cameraManager.setTarget(\n new Vector3().add(spawnPosition).add(this.characterManager.headTargetOffset),\n );\n this.cameraManager.reverseUpdateFromPositions();\n }\n }\n\n private disposeWithError(message: string) {\n this.dispose();\n this.errorScreen = new ErrorScreen(\"An error occurred\", message);\n this.element.append(this.errorScreen.element);\n }\n\n public dispose() {\n this.networkClient.stop();\n this.networkChat?.stop();\n for (const mmlFrame of this.mmlFrames) {\n mmlFrame.remove();\n }\n this.mmlFrames = [];\n this.mmlCompositionScene.dispose();\n this.composer.dispose();\n this.tweakPane?.dispose();\n if (this.currentRequestAnimationFrame !== null) {\n cancelAnimationFrame(this.currentRequestAnimationFrame);\n this.currentRequestAnimationFrame = null;\n }\n this.cameraManager.dispose();\n this.loadingScreen.dispose();\n this.errorScreen?.dispose();\n }\n\n private setupMMLScene() {\n registerCustomElementsToWindow(window);\n this.mmlCompositionScene = new MMLCompositionScene({\n targetElement: this.element,\n renderer: this.composer.renderer,\n scene: this.scene,\n camera: this.cameraManager.camera,\n audioListener: this.audioListener,\n collisionsManager: this.collisionsManager,\n getUserPositionAndRotation: () => {\n return this.characterManager.getLocalCharacterPositionAndRotation();\n },\n });\n this.scene.add(this.mmlCompositionScene.group);\n setGlobalMMLScene(this.mmlCompositionScene.mmlScene as IMMLScene);\n\n if (this.config.mmlDocuments) {\n for (const mmlDocument of this.config.mmlDocuments) {\n const frameElement = document.createElement(\"m-frame\");\n frameElement.setAttribute(\"src\", mmlDocument.url);\n if (mmlDocument.position) {\n frameElement.setAttribute(\"x\", mmlDocument.position.x.toString());\n frameElement.setAttribute(\"y\", mmlDocument.position.y.toString());\n frameElement.setAttribute(\"z\", mmlDocument.position.z.toString());\n }\n if (mmlDocument.rotation) {\n frameElement.setAttribute(\"rx\", mmlDocument.rotation.x.toString());\n frameElement.setAttribute(\"ry\", mmlDocument.rotation.y.toString());\n frameElement.setAttribute(\"rz\", mmlDocument.rotation.z.toString());\n }\n if (mmlDocument.scale) {\n if (mmlDocument.scale.x !== undefined) {\n frameElement.setAttribute(\"sx\", mmlDocument.scale.x.toString());\n }\n if (mmlDocument.scale.y !== undefined) {\n frameElement.setAttribute(\"sy\", mmlDocument.scale.y.toString());\n }\n if (mmlDocument.scale.z !== undefined) {\n frameElement.setAttribute(\"sz\", mmlDocument.scale.z.toString());\n }\n }\n document.body.appendChild(frameElement);\n this.mmlFrames.push(frameElement);\n }\n }\n\n const mmlProgressManager = this.mmlCompositionScene.mmlScene.getLoadingProgressManager!()!;\n this.loadingProgressManager.addLoadingDocument(mmlProgressManager, \"mml\", mmlProgressManager);\n mmlProgressManager.addProgressCallback(() => {\n this.loadingProgressManager.updateDocumentProgress(mmlProgressManager);\n });\n mmlProgressManager.setInitialLoad(true);\n }\n}\n"],
|
5
|
+
"mappings": "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",
|
6
6
|
"names": []
|
7
7
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@mml-io/3d-web-experience-client",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.18.0",
|
4
4
|
"publishConfig": {
|
5
5
|
"access": "public"
|
6
6
|
},
|
@@ -18,15 +18,17 @@
|
|
18
18
|
"lint-fix": "eslint \"./{src,test}/**/*.{js,jsx,ts,tsx}\" --fix"
|
19
19
|
},
|
20
20
|
"dependencies": {
|
21
|
-
"@mml-io/3d-web-
|
22
|
-
"@mml-io/3d-web-
|
23
|
-
"@mml-io/3d-web-
|
24
|
-
"@mml-io/3d-web-
|
21
|
+
"@mml-io/3d-web-avatar-selection-ui": "^0.18.0",
|
22
|
+
"@mml-io/3d-web-client-core": "^0.18.0",
|
23
|
+
"@mml-io/3d-web-text-chat": "^0.18.0",
|
24
|
+
"@mml-io/3d-web-user-networking": "^0.18.0",
|
25
|
+
"@mml-io/3d-web-voice-chat": "^0.18.0",
|
26
|
+
"mml-web": "^0.16.1",
|
25
27
|
"three": "0.163.0"
|
26
28
|
},
|
27
29
|
"devDependencies": {
|
28
|
-
"@types/node": "^20.
|
30
|
+
"@types/node": "^20.14.10",
|
29
31
|
"@types/three": "0.163.0"
|
30
32
|
},
|
31
|
-
"gitHead": "
|
33
|
+
"gitHead": "8eb8acbdc767b15eacf3e8d62c5a0c92d2690f37"
|
32
34
|
}
|