Add insights
This commit is contained in:
parent
49ea5f3e86
commit
b445961ad5
8 changed files with 94 additions and 1 deletions
21
src/helper/get-insights-from-renderer.ts
Normal file
21
src/helper/get-insights-from-renderer.ts
Normal 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,
|
||||||
|
});
|
||||||
27
src/helper/handle-insights.ts
Normal file
27
src/helper/handle-insights.ts
Normal 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),
|
||||||
|
});
|
||||||
32
src/index.ts
32
src/index.ts
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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]);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue