@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
92 lines (62 loc) • 2.57 kB
JavaScript
import { MetricCollection } from "../../development/performance/MetricCollection.js";
import {
MetricCollectionConsoleMonitor
} from "../../development/performance/monitor/MetricCollectionConsoleMonitor.js";
import Entity from "../../ecs/Entity.js";
import GUIElement from "../../ecs/gui/GUIElement.js";
import GUIElementSystem from "../../ecs/gui/GUIElementSystem.js";
import { EngineHarness } from "../../EngineHarness.js";
import { BehaviorComponent } from "../../intelligence/behavior/ecs/BehaviorComponent.js";
import { BehaviorSystem } from "../../intelligence/behavior/ecs/BehaviorSystem.js";
import { FluidField } from "./FluidField.js";
import { FluidSimulator } from "./FluidSimulator.js";
import { SliceVisualiser } from "./SliceVisualiser.js";
const harness = new EngineHarness();
const metrics = new MetricCollection();
metrics.create({ name: 'sim' })
/**
*
* @param {Engine} engine
*/
function main(engine) {
const ecd = engine.entityManager.dataset;
const field = new FluidField();
field.addAttribute('x');
field.addAttribute('y');
field.addAttribute('z');
field.resolution = [32, 32, 64];
field.build();
field.setAttributeAt(0, 15, 16, 0, -100);
field.setAttributeAt(0, 17, 16, 0, 100);
field.setAttributeAt(1, 16, 15, 0, -100);
field.setAttributeAt(1, 16, 17, 0, 100);
field.setAttributeAt(2, 15, 16, 0, 100);
field.setAttributeAt(2, 17, 16, 0, 100);
field.setAttributeAt(2, 16, 15, 0, 100);
field.setAttributeAt(2, 16, 17, 0, 100);
const sim = new FluidSimulator();
const slice_view = new SliceVisualiser();
slice_view.size.set(432, 1000);
slice_view.scale.setScalar(2);
slice_view.transformOrigin.set(0, 0);
slice_view.setData(field.buffer, field.resolution);
new Entity()
.add(BehaviorComponent.loop(time_delta => {
const t0 = performance.now();
sim.step(field, 0.015);
metrics.get('sim').record(performance.now() - t0);
slice_view.setData(field.buffer, field.resolution);
slice_view.draw();
}))
.build(ecd);
MetricCollectionConsoleMonitor.from(metrics).start()
new Entity()
.add(GUIElement.fromView(slice_view))
.build(ecd);
}
harness.initialize({
configuration(config, engine) {
config.addSystem(new GUIElementSystem(engine.gameView, engine))
config.addSystem(new BehaviorSystem(engine))
}
}).then(main)