UNPKG

planck-js

Version:

2D JavaScript/TypeScript physics engine for cross-platform HTML5 game development

202 lines (173 loc) 4.31 kB
/* * Planck.js * * Copyright (c) Erin Catto, Ali Shakiba * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /** @internal */ const _ASSERT = typeof ASSERT === "undefined" ? false : ASSERT; /** @internal */ const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === "undefined" ? false : CONSTRUCTOR_FACTORY; /** 3D vector */ export interface Vec3Value { x: number; y: number; z: number; } declare module "./Vec3" { /** @hidden @deprecated Use new keyword. */ // @ts-expect-error function Vec3(x: number, y: number, z: number): Vec3; /** @hidden @deprecated Use new keyword. */ // @ts-expect-error function Vec3(obj: Vec3Value): Vec3; /** @hidden @deprecated Use new keyword. */ // @ts-expect-error function Vec3(): Vec3; } /** 3D vector */ // @ts-expect-error export class Vec3 { x: number; y: number; z: number; constructor(x: number, y: number, z: number); constructor(obj: Vec3Value); constructor(); constructor(x?, y?, z?) { if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec3)) { return new Vec3(x, y, z); } if (typeof x === "undefined") { this.x = 0; this.y = 0; this.z = 0; } else if (typeof x === "object") { this.x = x.x; this.y = x.y; this.z = x.z; } else { this.x = x; this.y = y; this.z = z; } if (_ASSERT) Vec3.assert(this); } /** @internal */ _serialize(): object { return { x: this.x, y: this.y, z: this.z }; } /** @internal */ static _deserialize(data: any): Vec3 { const obj = Object.create(Vec3.prototype); obj.x = data.x; obj.y = data.y; obj.z = data.z; return obj; } /** @hidden */ static neo(x: number, y: number, z: number): Vec3 { const obj = Object.create(Vec3.prototype); obj.x = x; obj.y = y; obj.z = z; return obj; } static zero(): Vec3 { const obj = Object.create(Vec3.prototype); obj.x = 0; obj.y = 0; obj.z = 0; return obj; } static clone(v: Vec3Value): Vec3 { if (_ASSERT) Vec3.assert(v); return Vec3.neo(v.x, v.y, v.z); } /** @hidden */ toString(): string { return JSON.stringify(this); } /** Does this vector contain finite coordinates? */ static isValid(obj: any): boolean { if (obj === null || typeof obj === "undefined") { return false; } return Number.isFinite(obj.x) && Number.isFinite(obj.y) && Number.isFinite(obj.z); } static assert(o: any): void { if (_ASSERT) console.assert(!Vec3.isValid(o), "Invalid Vec3!", o); } setZero(): Vec3 { this.x = 0.0; this.y = 0.0; this.z = 0.0; return this; } set(x: number, y: number, z: number): Vec3 { this.x = x; this.y = y; this.z = z; return this; } add(w: Vec3Value): Vec3 { this.x += w.x; this.y += w.y; this.z += w.z; return this; } sub(w: Vec3Value): Vec3 { this.x -= w.x; this.y -= w.y; this.z -= w.z; return this; } mul(m: number): Vec3 { this.x *= m; this.y *= m; this.z *= m; return this; } static areEqual(v: Vec3Value, w: Vec3Value): boolean { if (_ASSERT) Vec3.assert(v); if (_ASSERT) Vec3.assert(w); return v === w || typeof v === "object" && v !== null && typeof w === "object" && w !== null && v.x === w.x && v.y === w.y && v.z === w.z; } /** Dot product on two vectors */ static dot(v: Vec3Value, w: Vec3Value): number { return v.x * w.x + v.y * w.y + v.z * w.z; } /** Cross product on two vectors */ static cross(v: Vec3Value, w: Vec3Value): Vec3 { return new Vec3( v.y * w.z - v.z * w.y, v.z * w.x - v.x * w.z, v.x * w.y - v.y * w.x ); } static add(v: Vec3Value, w: Vec3Value): Vec3 { return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z); } static sub(v: Vec3Value, w: Vec3Value): Vec3 { return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z); } static mul(v: Vec3Value, m: number): Vec3 { return new Vec3(m * v.x, m * v.y, m * v.z); } neg(): Vec3 { this.x = -this.x; this.y = -this.y; this.z = -this.z; return this; } static neg(v: Vec3Value): Vec3 { return new Vec3(-v.x, -v.y, -v.z); } }