65 lines
1.5 KiB
TypeScript
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;
|