Add insights

This commit is contained in:
schmelczerandras 2020-10-20 23:09:53 +02:00
parent 49ea5f3e86
commit b445961ad5
8 changed files with 94 additions and 1 deletions

View file

@ -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,
});

View file

@ -0,0 +1,27 @@
const baseUri = 'https://insights.decla.red';
const type = 'sdf-2d-demo';
export const handleInsights = async (initialData: any): Promise<(data: any) => void> => {
const sessionId = await createSession(initialData);
return (data) => createFrame(sessionId, data);
};
const createSession = async (data: any): Promise<string> => {
const response = await sendPostRequest(`${baseUri}/${type}/sessions/`, data);
const { sessionId } = await response.json();
return sessionId;
};
const createFrame = async (sessionId: string, data: any): Promise<unknown> =>
await sendPostRequest(`${baseUri}/${type}/sessions/${sessionId}`, data);
const sendPostRequest = async (uri: string, data: any): Promise<Response> =>
await fetch(uri, {
method: 'POST',
mode: 'cors',
redirect: 'follow',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
});

View file

@ -1,4 +1,5 @@
import { glMatrix } from 'gl-matrix'; import { glMatrix } from 'gl-matrix';
import { compile } from 'sdf-2d';
import '../static/favicons/apple-touch-icon.png'; import '../static/favicons/apple-touch-icon.png';
import '../static/favicons/favicon-16x16.png'; import '../static/favicons/favicon-16x16.png';
import '../static/favicons/favicon-32x32.png'; import '../static/favicons/favicon-32x32.png';
@ -7,6 +8,8 @@ import '../static/logo-white.svg';
import '../static/no-change/404.html'; import '../static/no-change/404.html';
import '../static/no-change/robots.txt'; import '../static/no-change/robots.txt';
import '../static/og-image.png'; import '../static/og-image.png';
import { getInsightsFromRenderer } from './helper/get-insights-from-renderer';
import { handleInsights } from './helper/handle-insights';
import { removeUnnecessaryOutlines } from './helper/remove-unnecessary-outlines'; import { removeUnnecessaryOutlines } from './helper/remove-unnecessary-outlines';
import { BlobScene } from './scenes/blob/blob-scene'; import { BlobScene } from './scenes/blob/blob-scene';
import { MetaballScene } from './scenes/metaball/metaball-scene'; import { MetaballScene } from './scenes/metaball/metaball-scene';
@ -39,13 +42,40 @@ const handleTextToggle = () => {
toggleButton.addEventListener('click', handleTextToggle); toggleButton.addEventListener('click', handleTextToggle);
handleTextToggle(); handleTextToggle();
const startInsightsSession = async (): Promise<(data: any) => unknown> => {
const { vendor, renderer } = getInsightsFromRenderer(await compile(canvas, []));
return await handleInsights({
vendor,
renderer,
referrer: document.referrer,
connection: (navigator as any)?.connection.effectiveType,
devicePixelRatio: window.devicePixelRatio,
});
};
const main = async () => { const main = async () => {
const sendFramePromise = startInsightsSession();
try { try {
let i = 0; let i = 0;
for (;;) { for (;;) {
const currentScene = new scenes[i++ % scenes.length](); const currentScene = new scenes[i++ % scenes.length]();
await currentScene.run(canvas, overlay); await currentScene.run(canvas, overlay);
const {
fps,
renderScale,
lightScale,
canvasWidth,
canvasHeight,
} = getInsightsFromRenderer(currentScene.renderer);
(await sendFramePromise)({
fps,
renderScale,
lightScale,
canvasWidth,
canvasHeight,
});
} }
} catch (e) { } catch (e) {
console.error(e); console.error(e);

View file

@ -10,6 +10,7 @@ const Circle = CircleFactory(rgb255(119, 143, 120));
export class BlobScene implements Scene { export class BlobScene implements Scene {
private canvas: HTMLCanvasElement; private canvas: HTMLCanvasElement;
private overlay: HTMLDivElement; private overlay: HTMLDivElement;
public renderer?: Renderer;
public async run(canvas: HTMLCanvasElement, overlay: HTMLDivElement): Promise<void> { public async run(canvas: HTMLCanvasElement, overlay: HTMLDivElement): Promise<void> {
this.canvas = canvas; this.canvas = canvas;
@ -52,6 +53,8 @@ export class BlobScene implements Scene {
currentTime: DOMHighResTimeStamp, currentTime: DOMHighResTimeStamp,
deltaTime: DOMHighResTimeStamp deltaTime: DOMHighResTimeStamp
): boolean { ): boolean {
this.renderer = renderer;
const { width, height } = this.canvas.getBoundingClientRect(); const { width, height } = this.canvas.getBoundingClientRect();
renderer.setViewArea([0, height], [width, height]); renderer.setViewArea([0, height], [width, height]);

View file

@ -11,6 +11,7 @@ export class MetaballScene implements Scene {
private canvas: HTMLCanvasElement; private canvas: HTMLCanvasElement;
private overlay: HTMLDivElement; private overlay: HTMLDivElement;
public renderer?: Renderer;
public async run(canvas: HTMLCanvasElement, overlay: HTMLDivElement): Promise<void> { public async run(canvas: HTMLCanvasElement, overlay: HTMLDivElement): Promise<void> {
this.canvas = canvas; this.canvas = canvas;
@ -57,6 +58,8 @@ export class MetaballScene implements Scene {
currentTime: DOMHighResTimeStamp, currentTime: DOMHighResTimeStamp,
deltaTime: DOMHighResTimeStamp deltaTime: DOMHighResTimeStamp
): boolean { ): boolean {
this.renderer = renderer;
const { width, height } = this.canvas.getBoundingClientRect(); const { width, height } = this.canvas.getBoundingClientRect();
const viewAreaWidth = width / Math.max(width, height); const viewAreaWidth = width / Math.max(width, height);
const viewAreaHeight = height / Math.max(width, height); const viewAreaHeight = height / Math.max(width, height);

View file

@ -12,6 +12,7 @@ export class RainScene implements Scene {
private canvas: HTMLCanvasElement; private canvas: HTMLCanvasElement;
private overlay: HTMLDivElement; private overlay: HTMLDivElement;
public renderer?: Renderer;
public async run(canvas: HTMLCanvasElement, overlay: HTMLDivElement): Promise<void> { public async run(canvas: HTMLCanvasElement, overlay: HTMLDivElement): Promise<void> {
this.canvas = canvas; this.canvas = canvas;
@ -46,6 +47,8 @@ export class RainScene implements Scene {
currentTime: DOMHighResTimeStamp, currentTime: DOMHighResTimeStamp,
deltaTime: DOMHighResTimeStamp deltaTime: DOMHighResTimeStamp
): boolean { ): boolean {
this.renderer = renderer;
const { width, height } = this.canvas.getBoundingClientRect(); const { width, height } = this.canvas.getBoundingClientRect();
renderer.setViewArea(vec2.fromValues(0, height), vec2.fromValues(width, height)); renderer.setViewArea(vec2.fromValues(0, height), vec2.fromValues(width, height));
this.overlay.innerText = prettyPrint(renderer.insights); this.overlay.innerText = prettyPrint(renderer.insights);

View file

@ -1,3 +1,6 @@
import { Renderer } from 'sdf-2d';
export interface Scene { export interface Scene {
run(canvas: HTMLCanvasElement, overlay: HTMLDivElement): Promise<void>; run(canvas: HTMLCanvasElement, overlay: HTMLDivElement): Promise<void>;
readonly renderer?: Renderer;
} }

View file

@ -24,6 +24,7 @@ export class TunnelScene implements Scene {
private tunnels: Array<InstanceType<typeof InvertedTunnel>> = []; private tunnels: Array<InstanceType<typeof InvertedTunnel>> = [];
private lights: Array<CircleLight> = []; private lights: Array<CircleLight> = [];
public renderer?: Renderer;
private generateTunnel() { private generateTunnel() {
const canvasSize = this.canvas.getBoundingClientRect(); const canvasSize = this.canvas.getBoundingClientRect();
@ -116,6 +117,8 @@ export class TunnelScene implements Scene {
currentTime: DOMHighResTimeStamp, currentTime: DOMHighResTimeStamp,
deltaTime: DOMHighResTimeStamp deltaTime: DOMHighResTimeStamp
): boolean { ): boolean {
this.renderer = renderer;
const { width, height } = this.canvas.getBoundingClientRect(); const { width, height } = this.canvas.getBoundingClientRect();
this.deltaSinceStart += deltaTime; this.deltaSinceStart += deltaTime;
const startX = this.deltaSinceStart / 3; const startX = this.deltaSinceStart / 3;