vertecs
Version:
A typescript entity-component-system framework
65 lines (50 loc) • 1.63 kB
text/typescript
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;
}