import * as I from 'immutable'; import {compose, virtualize} from '@avocado/core'; import {Rectangle, Vector} from '@avocado/math'; import {EventEmitter} from '@avocado/mixins'; import {AbstractBody} from '../abstract/body'; const decorate = compose( EventEmitter, Vector.Mixin('position', 'x', 'y', { default: [0, 0], track: true, }), ); export class Body extends decorate(AbstractBody) { constructor(shape) { super(shape); this.force = [0, 0]; this.impulse = [0, 0]; this.contacts = I.Set(); } get aabb() { return Rectangle.translated(this.shape.aabb, this.position); } applyForce(vector) { this.force = Vector.add(this.force, vector); } applyImpulse(vector, elapsed) { this.impulse = Vector.add( this.impulse, Vector.scale(vector, elapsed) ); } }