UNPKG

vertecs

Version:

A typescript entity-component-system framework

65 lines (50 loc) 1.63 kB
import { vec3 } from "ts-gl-matrix"; import { Component } from "../../core"; import { SerializableComponent } from "../../io"; import AxisAlignedBoundingBox from "../AxisAlignedBoundingBox"; export type PhysicsData = { movable: boolean; [key: string]: any; }; export type BodyOptions = { movable?: boolean; mass?: number; }; export default abstract class Body extends SerializableComponent<PhysicsData> { protected $movable: boolean; protected $boundingBox: AxisAlignedBoundingBox; protected $mass: number; protected constructor(bodyOptions?: BodyOptions) { super(); this.$movable = bodyOptions?.movable ?? true; this.$boundingBox = new AxisAlignedBoundingBox( vec3.create(), vec3.create() ); this.$mass = bodyOptions?.mass ?? 0; } public abstract getBoundingBox(): AxisAlignedBoundingBox; public abstract read(data: PhysicsData): void; public abstract write(): PhysicsData; public hasMoved(): boolean { const boundingBox = this.getBoundingBox(); if ( !vec3.equals(this.$boundingBox.minimum, boundingBox.minimum) || !vec3.equals(this.$boundingBox.maximum, boundingBox.maximum) ) { this.$boundingBox = boundingBox; return true; } return false; } public get mass(): number { return this.$mass; } public get movable(): boolean { return this.$movable; } public set movable(movable: boolean) { this.$movable = movable; } public abstract clone(): Component; }