ants/src/GUI.ts

65 lines
1.5 KiB
TypeScript

import GUI from "lil-gui";
import Config from "./Config";
type EventHandler = () => void;
class GUIController {
private gui: GUI = new GUI({
width: 400,
});
private listeners: Map<string, EventHandler[]> = new Map();
constructor() {
const simFolder = this.gui.addFolder("Simulation");
simFolder
.add(Config, "worldSize", 256, 4096)
.name("World size")
.step(1)
.onChange(() => this.emit("reset"));
simFolder
.add(Config, "antsCount", 0, 22)
.name("Ants count 2^")
.step(1)
.onChange(() => this.emit("reset"));
simFolder
.add(Config, "scentFadeOutFactor", 0, 0.01)
.name("Pheromone evaporation factor")
.step(0.0001)
.onChange(() => this.emit("reset"));
simFolder
.add(Config, "scentBlurRadius", 0, 0.5)
.name("Pheromone diffusion factor")
.step(0.01)
.onChange(() => this.emit("reset"));
simFolder
.add(Config, "simulationStepsPerSecond", 1, 500)
.name("Simulation steps per second")
.step(1);
const controlsFolder = this.gui.addFolder("Controls");
controlsFolder.add(Config, "brushRadius", 1, 100).name("Brush radius");
simFolder.open();
controlsFolder.open();
}
on(event: string, handler: EventHandler): void {
if (!this.listeners.has(event)) {
this.listeners.set(event, []);
}
this.listeners.get(event)!.push(handler);
}
private emit(event: string): void {
const handlers = this.listeners.get(event);
if (handlers) {
for (const handler of handlers) {
handler();
}
}
}
}
export default GUIController;