diff --git a/frontend/src/index.ts b/frontend/src/index.ts index 932350e..eb4ff8b 100644 --- a/frontend/src/index.ts +++ b/frontend/src/index.ts @@ -21,6 +21,8 @@ import { PlayerCharacterView } from './scripts/objects/player-character-view'; import '../static/settings.svg'; import '../static/minimize.svg'; import '../static/maximize.svg'; +import { handleInsights } from './scripts/handle-insights'; +import { getInsightsFromRenderer } from './scripts/get-insights-from-renderer'; glMatrix.setMatrixArrayType(Array); @@ -51,14 +53,48 @@ const main = async () => { const background = new LandingPageBackground(canvas); const joinHandler = new JoinFormHandler(joinGameForm, serverContainer); - handleFullScreen(minimize, maximize); + + let backgroundRenderer = await background.renderer; + let isInGame = false; + let game: Game; + const getFrameData = () => { + const { + fps, + renderScale, + lightScale, + canvasWidth, + canvasHeight, + } = getInsightsFromRenderer(isInGame ? game.renderer : backgroundRenderer); + + return { + isInGame, + fps, + renderScale, + lightScale, + canvasWidth, + canvasHeight, + }; + }; + const { vendor, renderer } = getInsightsFromRenderer(backgroundRenderer); + handleInsights( + { + vendor, + renderer, + referrer: document.referrer, + connection: (navigator as any)?.connection.effectiveType, + devicePixelRatio: devicePixelRatio, + }, + getFrameData, + ); + const playerDecision = await joinHandler.getPlayerDecision(); landingUI.style.display = 'none'; background.destroy(); - new Game(playerDecision, canvas, overlay); + game = new Game(playerDecision, canvas, overlay); + isInGame = true; } catch (e) { console.error(e); alert(e); diff --git a/frontend/src/scripts/get-insights-from-renderer.ts b/frontend/src/scripts/get-insights-from-renderer.ts new file mode 100644 index 0000000..cb9c3c0 --- /dev/null +++ b/frontend/src/scripts/get-insights-from-renderer.ts @@ -0,0 +1,21 @@ +import { Renderer } from 'sdf-2d'; + +export const getInsightsFromRenderer = ( + renderer?: Renderer, +): { + vendor?: string; + renderer?: string; + fps?: number; + renderScale?: number; + lightScale?: number; + canvasWidth?: number; + canvasHeight?: number; +} => ({ + fps: renderer?.insights?.fps, + vendor: renderer?.insights?.vendor, + renderer: renderer?.insights?.renderer, + renderScale: renderer?.insights?.renderPasses.distance.renderScale, + lightScale: renderer?.insights?.renderPasses.lights.renderScale, + canvasWidth: renderer?.canvasSize.x, + canvasHeight: renderer?.canvasSize.y, +}); diff --git a/frontend/src/scripts/handle-insights.ts b/frontend/src/scripts/handle-insights.ts new file mode 100644 index 0000000..ee84bc4 --- /dev/null +++ b/frontend/src/scripts/handle-insights.ts @@ -0,0 +1,28 @@ +const baseUri = 'https://insights.decla.red'; +const type = 'decla-red-frontend'; +const updateTime = 15000; + +export const handleInsights = async (initialData: any, getFrameData: () => any) => { + const sessionId = await createSession(initialData); + setInterval(() => createFrame(sessionId, getFrameData()), updateTime); +}; + +const createSession = async (data: any): Promise => { + const response = await sendPostRequest(`${baseUri}/${type}/sessions/`, data); + const { sessionId } = await response.json(); + return sessionId; +}; + +const createFrame = async (sessionId: string, data: any): Promise => + await sendPostRequest(`${baseUri}/${type}/sessions/${sessionId}`, data); + +const sendPostRequest = async (uri: string, data: any): Promise => + await fetch(uri, { + method: 'POST', + mode: 'cors', + redirect: 'follow', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data), + }); diff --git a/frontend/src/scripts/landing-page-background.ts b/frontend/src/scripts/landing-page-background.ts index ef9b3c2..368259e 100644 --- a/frontend/src/scripts/landing-page-background.ts +++ b/frontend/src/scripts/landing-page-background.ts @@ -20,9 +20,12 @@ const LangindPagePolygon = NoisyPolygonFactory( export class LandingPageBackground { private isActive = true; + public renderer: Promise; + private resolveRenderer!: (r: Renderer) => unknown; constructor(canvas: HTMLCanvasElement) { this.start(canvas); + this.renderer = new Promise((r) => (this.resolveRenderer = r)); } private async start(canvas: HTMLCanvasElement): Promise { @@ -65,6 +68,8 @@ export class LandingPageBackground { private gameLoop(renderer: Renderer, time: DOMHighResTimeStamp, _: number): boolean { Random.seed = 42; + this.resolveRenderer(renderer); + renderer.setViewArea(vec2.fromValues(0, renderer.canvasSize.y), renderer.canvasSize); const topPlanetPosition = vec2.fromValues(