41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import { activeVibe } from '../settings';
|
|
import { hexToRgb } from '../utils/hex-to-rgb';
|
|
import { type VibeId } from '../vibes';
|
|
import { RenderInputs } from './game-loop-types';
|
|
|
|
export class RenderInputCache {
|
|
private cachedVibeId: VibeId | null = null;
|
|
private cachedRenderInputs?: RenderInputs;
|
|
private previousAccentColor = '';
|
|
|
|
public invalidate(): void {
|
|
this.cachedVibeId = null;
|
|
this.cachedRenderInputs = undefined;
|
|
}
|
|
|
|
public get(): RenderInputs {
|
|
if (this.cachedRenderInputs && this.cachedVibeId === activeVibe.id) {
|
|
return this.cachedRenderInputs;
|
|
}
|
|
|
|
this.cachedVibeId = activeVibe.id;
|
|
this.cachedRenderInputs = {
|
|
channelColors: activeVibe.colors.map(hexToRgb),
|
|
backgroundColor: hexToRgb(activeVibe.backgroundColor),
|
|
};
|
|
|
|
return this.cachedRenderInputs;
|
|
}
|
|
|
|
public updateAccentColor(color: [number, number, number]): void {
|
|
const accentColor = `rgb(${Math.round(color[0] * 255)},${Math.round(
|
|
color[1] * 255
|
|
)},${Math.round(color[2] * 255)})`;
|
|
if (this.previousAccentColor === accentColor) {
|
|
return;
|
|
}
|
|
|
|
this.previousAccentColor = accentColor;
|
|
document.documentElement.style.setProperty('--accent-color', accentColor);
|
|
}
|
|
}
|