From 19bc48159eaec880a32edd83e756081456e31e9a Mon Sep 17 00:00:00 2001 From: Marco Gomez Date: Thu, 21 Nov 2024 15:08:19 +0000 Subject: [PATCH] implements customization for the loading screen (#182) * implements customization for the loading screen * replaces dev address accidentally left on client index * Loading screen styling * overlay styling --------- Co-authored-by: Marcus Longmuir --- example/assets/images/loading-bg.jpg | Bin 0 -> 69329 bytes .../client/src/index.ts | 9 + packages/3d-web-client-core/src/index.ts | 2 +- .../src/loading-screen/LoadingScreen.ts | 236 ++++++++++++++---- .../src/Networked3dWebExperienceClient.ts | 4 +- 5 files changed, 196 insertions(+), 55 deletions(-) create mode 100644 example/assets/images/loading-bg.jpg diff --git a/example/assets/images/loading-bg.jpg b/example/assets/images/loading-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54fc5814fef8cc9517ad5896b854b32c4b9783ea GIT binary patch literal 69329 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

T^}Aw#2h~H!6nZy*5)V1g1R<-khc( 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 literal 0 HcmV?d00001 diff --git a/example/multi-user-3d-web-experience/client/src/index.ts b/example/multi-user-3d-web-experience/client/src/index.ts index 6711141c..9bf80df7 100644 --- a/example/multi-user-3d-web-experience/client/src/index.ts +++ b/example/multi-user-3d-web-experience/client/src/index.ts @@ -1,6 +1,7 @@ import { Networked3dWebExperienceClient } from "@mml-io/3d-web-experience-client"; import hdrJpgUrl from "../../../assets/hdr/puresky_2k.jpg"; +import loadingBackground from "../../../assets/images/loading-bg.jpg"; import airAnimationFileUrl from "../../../assets/models/anim_air.glb"; import doubleJumpAnimationFileUrl from "../../../assets/models/anim_double_jump.glb"; import idleAnimationFileUrl from "../../../assets/models/anim_idle.glb"; @@ -33,6 +34,14 @@ const app = new Networked3dWebExperienceClient(holder, { avatarConfiguration: { availableAvatars: [], }, + loadingScreen: { + background: "#424242", + color: "#ffffff", + backgroundImageUrl: loadingBackground, + backgroundBlurAmount: 12, + title: "3D Web Experience", + subtitle: "Powered by Metaverse Markup Language", + }, }); app.update(); diff --git a/packages/3d-web-client-core/src/index.ts b/packages/3d-web-client-core/src/index.ts index 631b53f6..71954aad 100644 --- a/packages/3d-web-client-core/src/index.ts +++ b/packages/3d-web-client-core/src/index.ts @@ -14,6 +14,6 @@ export { TimeManager } from "./time/TimeManager"; export { CollisionsManager } from "./collisions/CollisionsManager"; export { Sun } from "./sun/Sun"; export { GroundPlane } from "./ground-plane/GroundPlane"; -export { LoadingScreen } from "./loading-screen/LoadingScreen"; +export { LoadingScreenConfig, LoadingScreen } from "./loading-screen/LoadingScreen"; export { ErrorScreen } from "./error-screen/ErrorScreen"; export { EnvironmentConfiguration } from "./rendering/composer"; diff --git a/packages/3d-web-client-core/src/loading-screen/LoadingScreen.ts b/packages/3d-web-client-core/src/loading-screen/LoadingScreen.ts index e0d9ac5a..804cac39 100644 --- a/packages/3d-web-client-core/src/loading-screen/LoadingScreen.ts +++ b/packages/3d-web-client-core/src/loading-screen/LoadingScreen.ts @@ -1,9 +1,29 @@ import { LoadingProgressManager } from "mml-web"; +export type LoadingScreenConfig = { + background?: string; + backgroundImageUrl?: string; + backgroundBlurAmount?: number; + overlayLayers?: Array<{ + overlayImageUrl: string; + overlayAnchor: "top-left" | "top-right" | "bottom-left" | "bottom-right"; + overlayOffset?: { x: number; y: number }; + }>; + title?: string; + subtitle?: string; + color?: string; +}; + export class LoadingScreen { public readonly element: HTMLDivElement; - private loadingBannerText: HTMLDivElement; + private readonly backgroundBlur: HTMLDivElement; + + private overlayLayers: HTMLDivElement[] = []; + + private loadingBanner: HTMLDivElement; + private loadingBannerTitle: HTMLDivElement; + private loadingBannerSubtitle: HTMLDivElement; private progressBarBackground: HTMLDivElement; private progressBarHolder: HTMLDivElement; @@ -21,57 +41,148 @@ export class LoadingScreen { private loadingCallback: () => void; private disposed: boolean = false; - constructor(private loadingProgressManager: LoadingProgressManager) { + constructor( + private loadingProgressManager: LoadingProgressManager, + private config?: LoadingScreenConfig, + ) { + const defaultBackground = "linear-gradient(45deg, #28284B 0%, #303056 100%)"; this.element = document.createElement("div"); + this.element.id = "loading-screen"; + this.element.style.position = "absolute"; this.element.style.top = "0"; this.element.style.left = "0"; this.element.style.width = "100%"; this.element.style.height = "100%"; - this.element.style.background = "linear-gradient(45deg, #28284B 0%, #303056 100%)"; - this.element.style.color = "white"; - this.element.addEventListener("click", (event) => { - event.stopPropagation(); - }); - this.element.addEventListener("mousedown", (event) => { - event.stopPropagation(); - }); - this.element.addEventListener("mousemove", (event) => { - event.stopPropagation(); - }); - this.element.addEventListener("mouseup", (event) => { - event.stopPropagation(); - }); + this.element.style.backgroundColor = this.config?.background || defaultBackground; + this.element.style.background = this.config?.background || defaultBackground; + this.element.style.zIndex = "10001"; + + this.backgroundBlur = document.createElement("div"); + this.backgroundBlur.id = "loading-screen-blur"; + this.backgroundBlur.style.position = "absolute"; + this.backgroundBlur.style.top = "0"; + this.backgroundBlur.style.left = "0"; + this.backgroundBlur.style.width = "100%"; + this.backgroundBlur.style.height = "100%"; + this.backgroundBlur.style.display = "flex"; + if (this.config?.backgroundBlurAmount) { + this.backgroundBlur.style.backdropFilter = `blur(${this.config.backgroundBlurAmount}px)`; + } + this.element.append(this.backgroundBlur); + + if (this.config?.backgroundImageUrl) { + this.element.style.backgroundImage = `url(${this.config.backgroundImageUrl})`; + this.element.style.backgroundPosition = "center"; + this.element.style.backgroundSize = "cover"; + } + + if (this.config?.overlayLayers) { + const logLoadError = (imageUrl: string) => { + console.error(`Failed to load overlay image: ${imageUrl}`); + }; + + for (const layer of this.config.overlayLayers) { + const overlayLayer = document.createElement("div"); + overlayLayer.style.position = "absolute"; + overlayLayer.style.background = `url(${layer.overlayImageUrl}) no-repeat`; + overlayLayer.style.backgroundSize = "contain"; + + const anchor = layer.overlayAnchor; + const offsetX = layer.overlayOffset?.x || 0; + const offsetY = layer.overlayOffset?.y || 0; + + if (anchor.includes("top")) { + overlayLayer.style.top = `${offsetY}px`; + } else if (anchor.includes("bottom")) { + overlayLayer.style.bottom = `${offsetY}px`; + } + + if (anchor.includes("left")) { + overlayLayer.style.left = `${offsetX}px`; + } else if (anchor.includes("right")) { + overlayLayer.style.right = `${offsetX}px`; + } + + const image = new Image(); + image.src = layer.overlayImageUrl; + image.onload = () => { + const naturalWidth = image.naturalWidth; + const naturalHeight = image.naturalHeight; + + overlayLayer.style.width = `${naturalWidth}px`; + overlayLayer.style.height = `${naturalHeight}px`; + }; + + image.onerror = () => logLoadError(layer.overlayImageUrl); + + this.overlayLayers.push(overlayLayer); + this.backgroundBlur.append(overlayLayer); + } + } + + this.element.style.color = this.config?.color || "white"; + + this.loadingBanner = document.createElement("div"); + this.loadingBanner.style.position = "absolute"; + this.loadingBanner.style.display = "flex"; + this.loadingBanner.style.flexDirection = "column"; + this.loadingBanner.style.left = "0"; + this.loadingBanner.style.bottom = "0"; + this.loadingBanner.style.padding = "0"; + this.loadingBanner.style.width = "100%"; + this.loadingBanner.style.justifyContent = "flex-end"; + this.backgroundBlur.append(this.loadingBanner); - this.loadingBannerText = document.createElement("div"); - this.loadingBannerText.textContent = "Loading..."; - this.loadingBannerText.style.position = "absolute"; - this.loadingBannerText.style.display = "flex"; - this.loadingBannerText.style.top = "0"; - this.loadingBannerText.style.left = "0"; - this.loadingBannerText.style.width = "100%"; - this.loadingBannerText.style.height = "100%"; - this.loadingBannerText.style.color = "white"; - this.loadingBannerText.style.fontSize = "80px"; - this.loadingBannerText.style.fontWeight = "bold"; - this.loadingBannerText.style.fontFamily = "sans-serif"; - this.loadingBannerText.style.alignItems = "center"; - this.loadingBannerText.style.justifyContent = "center"; - this.element.append(this.loadingBannerText); + if (this.config?.title) { + this.loadingBannerTitle = document.createElement("div"); + this.loadingBannerTitle.textContent = this.config.title; + this.loadingBannerTitle.style.color = this.config?.color || "white"; + this.loadingBannerTitle.style.paddingLeft = "40px"; + this.loadingBannerTitle.style.paddingRight = "40px"; + this.loadingBannerTitle.style.fontSize = "42px"; + this.loadingBannerTitle.style.fontWeight = "bold"; + this.loadingBannerTitle.style.fontFamily = "sans-serif"; + if (this.config?.background) { + this.loadingBannerTitle.style.textShadow = `0px 0px 80px ${this.config.background}`; + } + this.loadingBanner.append(this.loadingBannerTitle); + } + + if (this.config?.subtitle) { + this.loadingBannerSubtitle = document.createElement("div"); + this.loadingBannerSubtitle.style.color = this.config?.color || "white"; + this.loadingBannerSubtitle.style.paddingLeft = "40px"; + this.loadingBannerSubtitle.style.paddingRight = "40px"; + this.loadingBannerSubtitle.style.fontSize = "16px"; + this.loadingBannerSubtitle.style.fontWeight = "400"; + this.loadingBannerSubtitle.style.fontFamily = "sans-serif"; + this.loadingBannerSubtitle.style.marginTop = "12px"; + if (this.config?.background) { + this.loadingBannerSubtitle.style.textShadow = `0px 0px 40px ${this.config.background}`; + } + + this.loadingBannerSubtitle.textContent = this.config.subtitle; + this.loadingBanner.append(this.loadingBannerSubtitle); + } this.progressDebugViewHolder = document.createElement("div"); - this.progressDebugViewHolder.style.display = "flex"; + this.progressDebugViewHolder.style.display = "none"; this.progressDebugViewHolder.style.position = "absolute"; - this.progressDebugViewHolder.style.maxHeight = "calc(100% - 74px)"; - this.progressDebugViewHolder.style.left = "0"; - this.progressDebugViewHolder.style.bottom = "74px"; - this.progressDebugViewHolder.style.width = "100%"; + this.progressDebugViewHolder.style.width = "calc(100% - 80px)"; + this.progressDebugViewHolder.style.maxHeight = "calc(100% - 120px)"; + this.progressDebugViewHolder.style.left = "40px"; + this.progressDebugViewHolder.style.bottom = "60px"; + this.progressDebugViewHolder.style.alignItems = "center"; this.progressDebugViewHolder.style.justifyContent = "center"; + this.progressDebugViewHolder.style.zIndex = "10003"; this.element.append(this.progressDebugViewHolder); this.progressDebugView = document.createElement("div"); - this.progressDebugView.style.backgroundColor = "rgba(128, 128, 128, 0.25)"; + this.progressDebugView.style.backgroundColor = "rgba(128, 128, 128, 0.5)"; this.progressDebugView.style.border = "1px solid black"; + this.progressDebugView.style.borderRadius = "7px"; + this.progressDebugView.style.width = "100%"; this.progressDebugView.style.maxWidth = "100%"; this.progressDebugView.style.overflow = "auto"; this.progressDebugViewHolder.append(this.progressDebugView); @@ -81,6 +192,8 @@ export class LoadingScreen { this.debugCheckbox.checked = false; this.debugCheckbox.addEventListener("change", () => { this.progressDebugElement.style.display = this.debugCheckbox.checked ? "block" : "none"; + this.loadingBannerTitle.style.display = this.debugCheckbox.checked ? "none" : "flex"; + this.loadingBannerSubtitle.style.display = this.debugCheckbox.checked ? "none" : "flex"; if (this.hasCompleted) { this.dispose(); } @@ -102,24 +215,37 @@ export class LoadingScreen { this.progressBarHolder = document.createElement("div"); this.progressBarHolder.style.display = "flex"; - this.progressBarHolder.style.alignItems = "center"; - this.progressBarHolder.style.justifyContent = "center"; - this.progressBarHolder.style.position = "absolute"; - this.progressBarHolder.style.bottom = "20px"; - this.progressBarHolder.style.left = "0"; + this.progressBarHolder.style.alignItems = "start"; + this.progressBarHolder.style.justifyContent = "flex-start"; this.progressBarHolder.style.width = "100%"; - this.element.append(this.progressBarHolder); + this.progressBarHolder.style.marginLeft = "40px"; + this.progressBarHolder.style.marginBottom = "40px"; + this.progressBarHolder.style.cursor = "pointer"; + this.progressBarHolder.style.marginTop = "24px"; + this.loadingBanner.append(this.progressBarHolder); this.progressBarBackground = document.createElement("div"); this.progressBarBackground.style.position = "relative"; - this.progressBarBackground.style.width = "500px"; - this.progressBarBackground.style.maxWidth = "80%"; - this.progressBarBackground.style.backgroundColor = "gray"; - this.progressBarBackground.style.height = "50px"; - this.progressBarBackground.style.lineHeight = "50px"; - this.progressBarBackground.style.borderRadius = "25px"; - this.progressBarBackground.style.border = "2px solid white"; + this.progressBarBackground.style.width = "80%"; + this.progressBarBackground.style.maxWidth = "400px"; + this.progressBarBackground.style.minWidth = "240px"; + this.progressBarBackground.style.backgroundColor = "rgba(32,32,32, 0.25)"; + this.progressBarBackground.style.backdropFilter = "blur(4px)"; + this.progressBarBackground.style.height = "16px"; + this.progressBarBackground.style.lineHeight = "16px"; + this.progressBarBackground.style.borderRadius = "16px"; this.progressBarBackground.style.overflow = "hidden"; + this.progressBarBackground.addEventListener("click", () => { + const display = this.progressDebugViewHolder.style.display; + if (display === "none") { + this.progressDebugViewHolder.style.display = "flex"; + } else { + this.progressDebugViewHolder.style.display = "none"; + this.debugCheckbox.checked = false; + this.progressDebugElement.style.display = this.debugCheckbox.checked ? "block" : "none"; + this.loadingBannerTitle.style.display = this.debugCheckbox.checked ? "none" : "flex"; + } + }); this.progressBarHolder.append(this.progressBarBackground); this.progressBar = document.createElement("div"); @@ -128,7 +254,8 @@ export class LoadingScreen { this.progressBar.style.left = "0"; this.progressBar.style.width = "0"; this.progressBar.style.height = "100%"; - this.progressBar.style.backgroundColor = "#0050a4"; + this.progressBar.style.pointerEvents = "none"; + this.progressBar.style.backgroundColor = this.config?.color || "#0050a4"; this.progressBarBackground.append(this.progressBar); this.loadingStatusText = document.createElement("div"); @@ -137,11 +264,14 @@ export class LoadingScreen { this.loadingStatusText.style.left = "0"; this.loadingStatusText.style.width = "100%"; this.loadingStatusText.style.height = "100%"; - this.loadingStatusText.style.color = "white"; + this.loadingStatusText.style.color = "rgba(200,200,200,0.9)"; + this.loadingStatusText.style.fontSize = "10px"; this.loadingStatusText.style.textAlign = "center"; this.loadingStatusText.style.verticalAlign = "middle"; + this.loadingStatusText.style.mixBlendMode = "difference"; this.loadingStatusText.style.fontFamily = "sans-serif"; this.loadingStatusText.style.fontWeight = "bold"; + this.loadingStatusText.style.userSelect = "none"; this.loadingStatusText.textContent = "Loading..."; this.progressBarBackground.append(this.loadingStatusText); @@ -157,7 +287,7 @@ export class LoadingScreen { this.loadingStatusText.textContent = "Completed"; this.progressBar.style.width = "100%"; } else { - this.loadingStatusText.textContent = `Loading... ${(loadingRatio * 100).toFixed(2)}%`; + this.loadingStatusText.textContent = `${(loadingRatio * 100).toFixed(2)}%`; this.progressBar.style.width = `${loadingRatio * 100}%`; } this.progressDebugElement.textContent = LoadingProgressManager.LoadingProgressSummaryToString( diff --git a/packages/3d-web-experience-client/src/Networked3dWebExperienceClient.ts b/packages/3d-web-experience-client/src/Networked3dWebExperienceClient.ts index fed1713d..bb79b61e 100644 --- a/packages/3d-web-experience-client/src/Networked3dWebExperienceClient.ts +++ b/packages/3d-web-experience-client/src/Networked3dWebExperienceClient.ts @@ -19,6 +19,7 @@ import { GroundPlane, KeyInputManager, LoadingScreen, + LoadingScreenConfig, MMLCompositionScene, TimeManager, TweakPane, @@ -81,6 +82,7 @@ export type Networked3dWebExperienceClientConfig = { voiceChatAddress?: string; updateURLLocation?: boolean; onServerBroadcast?: (broadcast: { broadcastType: string; payload: any }) => void; + loadingScreen?: LoadingScreenConfig; } & UpdatableConfig; export type UpdatableConfig = { @@ -276,7 +278,7 @@ export class Networked3dWebExperienceClient { this.setupMMLScene(); - this.loadingScreen = new LoadingScreen(this.loadingProgressManager); + this.loadingScreen = new LoadingScreen(this.loadingProgressManager, this.config.loadingScreen); this.element.append(this.loadingScreen.element); this.loadingProgressManager.addProgressCallback(() => {