46 lines
1.3 KiB
JavaScript
46 lines
1.3 KiB
JavaScript
|
import Matter, { World, Composite, Runner, Common, Body, Bodies, Events } from 'matter-js'
|
||
|
|
||
|
import $jit from '../patched/JIT'
|
||
|
|
||
|
import DataModel from './DataModel'
|
||
|
import Visualize from './Visualize'
|
||
|
|
||
|
const Engine = {
|
||
|
init: () => {
|
||
|
Engine.engine = Matter.Engine.create()
|
||
|
Events.on(Engine.engine, 'afterUpdate', Engine.callUpdate)
|
||
|
Engine.engine.world.gravity.scale = 0
|
||
|
},
|
||
|
run: init => {
|
||
|
if (init) DataModel.Mappings.each(Engine.addTopic)
|
||
|
Engine.runner = Matter.Runner.run(Engine.engine)
|
||
|
},
|
||
|
endActiveMap: () => {
|
||
|
Runner.stop(Engine.runner)
|
||
|
Matter.Engine.clear(Engine.engine)
|
||
|
},
|
||
|
setTopicPos: (id, x, y) => {
|
||
|
const body = Composite.get(Engine.engine.world, id, 'body')
|
||
|
Body.setPosition(body, { x, y })
|
||
|
},
|
||
|
addTopic: mapping => {
|
||
|
let body = Bodies.circle(mapping.get('xloc'), mapping.get('yloc'), 25)
|
||
|
body.topic_id = mapping.get('mappable_id')
|
||
|
DataModel.Topics.get(body.topic_id).get('node').setData('body_id', body.id)
|
||
|
World.addBody(Engine.engine.world, body)
|
||
|
},
|
||
|
removeTopic: mapping => {
|
||
|
|
||
|
},
|
||
|
callUpdate: () => {
|
||
|
Engine.engine.world.bodies.forEach(b => {
|
||
|
const node = DataModel.Topics.get(b.topic_id).get('node')
|
||
|
const newPos = new $jit.Complex(b.position.x, b.position.y)
|
||
|
node.setPos(newPos, 'current')
|
||
|
})
|
||
|
Visualize.mGraph.plot()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default Engine
|