1604 lines
71 KiB
TypeScript
1604 lines
71 KiB
TypeScript
declare module "utils/EventTarget" {
|
|
export class EventTarget {
|
|
private _listeners;
|
|
addEventListener(type: string, listener: Function): EventTarget;
|
|
hasEventListener(type: string, listener: Function): boolean;
|
|
hasAnyEventListener(type: string): boolean;
|
|
removeEventListener(type: string, listener: Function): EventTarget;
|
|
dispatchEvent(event: any): EventTarget;
|
|
}
|
|
}
|
|
declare module "math/Quaternion" {
|
|
import { Vec3 } from "math/Vec3";
|
|
export class Quaternion {
|
|
x: number;
|
|
y: number;
|
|
z: number;
|
|
w: number;
|
|
constructor(x?: number, y?: number, z?: number, w?: number);
|
|
set(x: number, y: number, z: number, w: number): Quaternion;
|
|
toString(): string;
|
|
toArray(): [number, number, number, number];
|
|
setFromAxisAngle(vector: Vec3, angle: number): Quaternion;
|
|
toAxisAngle(targetAxis?: Vec3): [Vec3, number];
|
|
setFromVectors(u: Vec3, v: Vec3): Quaternion;
|
|
mult(quat: Quaternion, target?: Quaternion): Quaternion;
|
|
inverse(target?: Quaternion): Quaternion;
|
|
conjugate(target?: Quaternion): Quaternion;
|
|
normalize(): Quaternion;
|
|
normalizeFast(): Quaternion;
|
|
vmult(v: Vec3, target?: Vec3): Vec3;
|
|
copy(quat: Quaternion): Quaternion;
|
|
toEuler(target: Vec3, order?: string): void;
|
|
setFromEuler(x: number, y: number, z: number, order?: string): Quaternion;
|
|
clone(): Quaternion;
|
|
slerp(toQuat: Quaternion, t: number, target?: Quaternion): Quaternion;
|
|
integrate(angularVelocity: Vec3, dt: number, angularFactor: Vec3, target?: Quaternion): Quaternion;
|
|
}
|
|
}
|
|
declare module "math/Mat3" {
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Quaternion } from "math/Quaternion";
|
|
export class Mat3 {
|
|
elements: number[];
|
|
constructor(elements?: number[]);
|
|
identity(): void;
|
|
setZero(): void;
|
|
setTrace(vector: Vec3): void;
|
|
getTrace(target?: Vec3): Vec3;
|
|
vmult(v: Vec3, target?: Vec3): Vec3;
|
|
smult(s: number): void;
|
|
mmult(matrix: Mat3, target?: Mat3): Mat3;
|
|
scale(vector: Vec3, target?: Mat3): Mat3;
|
|
solve(b: Vec3, target?: Vec3): Vec3;
|
|
e(row: number, column: number): number;
|
|
e(row: number, column: number, value: number): void;
|
|
copy(matrix: Mat3): Mat3;
|
|
toString(): string;
|
|
reverse(target?: Mat3): Mat3;
|
|
setRotationFromQuaternion(q: Quaternion): Mat3;
|
|
transpose(target?: Mat3): Mat3;
|
|
}
|
|
}
|
|
declare module "math/Vec3" {
|
|
import { Mat3 } from "math/Mat3";
|
|
export class Vec3 {
|
|
x: number;
|
|
y: number;
|
|
z: number;
|
|
static ZERO: Vec3;
|
|
static UNIT_X: Vec3;
|
|
static UNIT_Y: Vec3;
|
|
static UNIT_Z: Vec3;
|
|
constructor(x?: number, y?: number, z?: number);
|
|
cross(vector: Vec3, target?: Vec3): Vec3;
|
|
set(x: number, y: number, z: number): Vec3;
|
|
setZero(): void;
|
|
vadd(vector: Vec3): Vec3;
|
|
vadd(vector: Vec3, target: Vec3): void;
|
|
vsub(vector: Vec3): Vec3;
|
|
vsub(vector: Vec3, target: Vec3): void;
|
|
crossmat(): Mat3;
|
|
normalize(): number;
|
|
unit(target?: Vec3): Vec3;
|
|
length(): number;
|
|
lengthSquared(): number;
|
|
distanceTo(p: Vec3): number;
|
|
distanceSquared(p: Vec3): number;
|
|
scale(scalar: number, target?: Vec3): Vec3;
|
|
vmul(vector: Vec3, target?: Vec3): Vec3;
|
|
addScaledVector(scalar: number, vector: Vec3, target?: Vec3): Vec3;
|
|
dot(vector: Vec3): number;
|
|
isZero(): boolean;
|
|
negate(target?: Vec3): Vec3;
|
|
tangents(t1: Vec3, t2: Vec3): void;
|
|
toString(): string;
|
|
toArray(): [number, number, number];
|
|
copy(vector: Vec3): Vec3;
|
|
lerp(vector: Vec3, t: number, target: Vec3): void;
|
|
almostEquals(vector: Vec3, precision?: number): boolean;
|
|
almostZero(precision?: number): boolean;
|
|
isAntiparallelTo(vector: Vec3, precision?: number): boolean;
|
|
clone(): Vec3;
|
|
}
|
|
}
|
|
declare module "math/Transform" {
|
|
import { Vec3 } from "math/Vec3";
|
|
import { Quaternion } from "math/Quaternion";
|
|
export type TransformOptions = ConstructorParameters<typeof Transform>[0];
|
|
export class Transform {
|
|
position: Vec3;
|
|
quaternion: Quaternion;
|
|
constructor(options?: {
|
|
position?: Vec3;
|
|
quaternion?: Quaternion;
|
|
});
|
|
pointToLocal(worldPoint: Vec3, result?: Vec3): Vec3;
|
|
pointToWorld(localPoint: Vec3, result?: Vec3): Vec3;
|
|
vectorToWorldFrame(localVector: Vec3, result?: Vec3): Vec3;
|
|
static pointToLocalFrame(position: Vec3, quaternion: Quaternion, worldPoint: Vec3, result?: Vec3): Vec3;
|
|
static pointToWorldFrame(position: Vec3, quaternion: Quaternion, localPoint: Vec3, result?: Vec3): Vec3;
|
|
static vectorToWorldFrame(quaternion: Quaternion, localVector: Vec3, result?: Vec3): Vec3;
|
|
static vectorToLocalFrame(position: Vec3, quaternion: Quaternion, worldVector: Vec3, result?: Vec3): Vec3;
|
|
}
|
|
}
|
|
declare module "material/Material" {
|
|
export type MaterialOptions = ConstructorParameters<typeof Material>[0];
|
|
export class Material {
|
|
name: string;
|
|
id: number;
|
|
friction: number;
|
|
restitution: number;
|
|
static idCounter: number;
|
|
constructor(options?: {
|
|
friction?: number;
|
|
restitution?: number;
|
|
} | string);
|
|
}
|
|
}
|
|
declare module "shapes/Shape" {
|
|
import type { Vec3 } from "math/Vec3";
|
|
import type { Quaternion } from "math/Quaternion";
|
|
import type { Body } from "objects/Body";
|
|
import type { Material } from "material/Material";
|
|
export const SHAPE_TYPES: {
|
|
readonly SPHERE: 1;
|
|
readonly PLANE: 2;
|
|
readonly BOX: 4;
|
|
readonly COMPOUND: 8;
|
|
readonly CONVEXPOLYHEDRON: 16;
|
|
readonly HEIGHTFIELD: 32;
|
|
readonly PARTICLE: 64;
|
|
readonly CYLINDER: 128;
|
|
readonly TRIMESH: 256;
|
|
};
|
|
export type ShapeType = typeof SHAPE_TYPES[keyof typeof SHAPE_TYPES];
|
|
export type ShapeOptions = ConstructorParameters<typeof Shape>[0];
|
|
export class Shape {
|
|
id: number;
|
|
type: ShapeType | 0;
|
|
boundingSphereRadius: number;
|
|
collisionResponse: boolean;
|
|
collisionFilterGroup: number;
|
|
collisionFilterMask: number;
|
|
material: Material | null;
|
|
body: Body | null;
|
|
static idCounter: number;
|
|
static types: {
|
|
readonly SPHERE: 1;
|
|
readonly PLANE: 2;
|
|
readonly BOX: 4;
|
|
readonly COMPOUND: 8;
|
|
readonly CONVEXPOLYHEDRON: 16;
|
|
readonly HEIGHTFIELD: 32;
|
|
readonly PARTICLE: 64;
|
|
readonly CYLINDER: 128;
|
|
readonly TRIMESH: 256;
|
|
};
|
|
constructor(options?: {
|
|
type?: ShapeType;
|
|
collisionResponse?: boolean;
|
|
collisionFilterGroup?: number;
|
|
collisionFilterMask?: number;
|
|
material?: Material;
|
|
});
|
|
updateBoundingSphereRadius(): void;
|
|
volume(): number;
|
|
calculateLocalInertia(mass: number, target: Vec3): void;
|
|
calculateWorldAABB(pos: Vec3, quat: Quaternion, min: Vec3, max: Vec3): void;
|
|
}
|
|
}
|
|
declare module "collision/RaycastResult" {
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
import type { Shape } from "shapes/Shape";
|
|
export class RaycastResult {
|
|
rayFromWorld: Vec3;
|
|
rayToWorld: Vec3;
|
|
hitNormalWorld: Vec3;
|
|
hitPointWorld: Vec3;
|
|
hasHit: boolean;
|
|
shape: Shape | null;
|
|
body: Body | null;
|
|
hitFaceIndex: number;
|
|
distance: number;
|
|
shouldStop: boolean;
|
|
constructor();
|
|
reset(): void;
|
|
abort(): void;
|
|
set(rayFromWorld: Vec3, rayToWorld: Vec3, hitNormalWorld: Vec3, hitPointWorld: Vec3, shape: Shape, body: Body, distance: number): void;
|
|
}
|
|
}
|
|
declare module "shapes/Sphere" {
|
|
import { Shape } from "shapes/Shape";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Quaternion } from "math/Quaternion";
|
|
export class Sphere extends Shape {
|
|
radius: number;
|
|
constructor(radius: number);
|
|
calculateLocalInertia(mass: number, target?: Vec3): Vec3;
|
|
volume(): number;
|
|
updateBoundingSphereRadius(): void;
|
|
calculateWorldAABB(pos: Vec3, quat: Quaternion, min: Vec3, max: Vec3): void;
|
|
}
|
|
}
|
|
declare module "shapes/ConvexPolyhedron" {
|
|
import { Shape } from "shapes/Shape";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Quaternion } from "math/Quaternion";
|
|
export type ConvexPolyhedronContactPoint = {
|
|
point: Vec3;
|
|
normal: Vec3;
|
|
depth: number;
|
|
};
|
|
export class ConvexPolyhedron extends Shape {
|
|
vertices: Vec3[];
|
|
faces: number[][];
|
|
faceNormals: Vec3[];
|
|
worldVertices: Vec3[];
|
|
worldVerticesNeedsUpdate: boolean;
|
|
worldFaceNormals: Vec3[];
|
|
worldFaceNormalsNeedsUpdate: boolean;
|
|
uniqueAxes: Vec3[] | null;
|
|
uniqueEdges: Vec3[];
|
|
constructor(props?: {
|
|
vertices?: Vec3[];
|
|
faces?: number[][];
|
|
normals?: Vec3[];
|
|
axes?: Vec3[];
|
|
boundingSphereRadius?: number;
|
|
});
|
|
computeEdges(): void;
|
|
computeNormals(): void;
|
|
getFaceNormal(i: number, target: Vec3): void;
|
|
static computeNormal(va: Vec3, vb: Vec3, vc: Vec3, target: Vec3): void;
|
|
clipAgainstHull(posA: Vec3, quatA: Quaternion, hullB: ConvexPolyhedron, posB: Vec3, quatB: Quaternion, separatingNormal: Vec3, minDist: number, maxDist: number, result: ConvexPolyhedronContactPoint[]): void;
|
|
findSeparatingAxis(hullB: ConvexPolyhedron, posA: Vec3, quatA: Quaternion, posB: Vec3, quatB: Quaternion, target: Vec3, faceListA?: number[] | null, faceListB?: number[] | null): boolean;
|
|
testSepAxis(axis: Vec3, hullB: ConvexPolyhedron, posA: Vec3, quatA: Quaternion, posB: Vec3, quatB: Quaternion): number | false;
|
|
calculateLocalInertia(mass: number, target: Vec3): void;
|
|
getPlaneConstantOfFace(face_i: number): number;
|
|
clipFaceAgainstHull(separatingNormal: Vec3, posA: Vec3, quatA: Quaternion, worldVertsB1: Vec3[], minDist: number, maxDist: number, result: ConvexPolyhedronContactPoint[]): void;
|
|
clipFaceAgainstPlane(inVertices: Vec3[], outVertices: Vec3[], planeNormal: Vec3, planeConstant: number): Vec3[];
|
|
computeWorldVertices(position: Vec3, quat: Quaternion): void;
|
|
computeLocalAABB(aabbmin: Vec3, aabbmax: Vec3): void;
|
|
computeWorldFaceNormals(quat: Quaternion): void;
|
|
updateBoundingSphereRadius(): void;
|
|
calculateWorldAABB(pos: Vec3, quat: Quaternion, min: Vec3, max: Vec3): void;
|
|
volume(): number;
|
|
getAveragePointLocal(target?: Vec3): Vec3;
|
|
transformAllPoints(offset: Vec3, quat: Quaternion): void;
|
|
pointIsInside(p: Vec3): 1 | -1 | false;
|
|
static project(shape: ConvexPolyhedron, axis: Vec3, pos: Vec3, quat: Quaternion, result: number[]): void;
|
|
}
|
|
}
|
|
declare module "shapes/Box" {
|
|
import { Shape } from "shapes/Shape";
|
|
import { Vec3 } from "math/Vec3";
|
|
import { ConvexPolyhedron } from "shapes/ConvexPolyhedron";
|
|
import type { Quaternion } from "math/Quaternion";
|
|
export class Box extends Shape {
|
|
halfExtents: Vec3;
|
|
convexPolyhedronRepresentation: ConvexPolyhedron;
|
|
constructor(halfExtents: Vec3);
|
|
updateConvexPolyhedronRepresentation(): void;
|
|
calculateLocalInertia(mass: number, target?: Vec3): Vec3;
|
|
static calculateInertia(halfExtents: Vec3, mass: number, target: Vec3): void;
|
|
getSideNormals(sixTargetVectors: Vec3[], quat: Quaternion): Vec3[];
|
|
volume(): number;
|
|
updateBoundingSphereRadius(): void;
|
|
forEachWorldCorner(pos: Vec3, quat: Quaternion, callback: (x: number, y: number, z: number) => void): void;
|
|
calculateWorldAABB(pos: Vec3, quat: Quaternion, min: Vec3, max: Vec3): void;
|
|
}
|
|
}
|
|
declare module "shapes/Plane" {
|
|
import { Shape } from "shapes/Shape";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Quaternion } from "math/Quaternion";
|
|
export class Plane extends Shape {
|
|
worldNormal: Vec3;
|
|
worldNormalNeedsUpdate: boolean;
|
|
boundingSphereRadius: number;
|
|
constructor();
|
|
computeWorldNormal(quat: Quaternion): void;
|
|
calculateLocalInertia(mass: number, target?: Vec3): Vec3;
|
|
volume(): number;
|
|
calculateWorldAABB(pos: Vec3, quat: Quaternion, min: Vec3, max: Vec3): void;
|
|
updateBoundingSphereRadius(): void;
|
|
}
|
|
}
|
|
declare module "utils/Utils" {
|
|
export class Utils {
|
|
static defaults(options: Record<string, any> | undefined, defaults: Record<string, any>): Record<string, any>;
|
|
}
|
|
}
|
|
declare module "shapes/Heightfield" {
|
|
import { Shape } from "shapes/Shape";
|
|
import { ConvexPolyhedron } from "shapes/ConvexPolyhedron";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { AABB } from "collision/AABB";
|
|
import type { Quaternion } from "math/Quaternion";
|
|
export type HeightfieldOptions = ConstructorParameters<typeof Heightfield>[1];
|
|
type HeightfieldPillar = {
|
|
convex: any;
|
|
offset: any;
|
|
};
|
|
export class Heightfield extends Shape {
|
|
data: number[][];
|
|
maxValue: number | null;
|
|
minValue: number | null;
|
|
elementSize: number;
|
|
cacheEnabled: boolean;
|
|
pillarConvex: ConvexPolyhedron;
|
|
pillarOffset: Vec3;
|
|
private _cachedPillars;
|
|
constructor(data: number[][], options?: {
|
|
maxValue?: number | null;
|
|
minValue?: number | null;
|
|
elementSize?: number;
|
|
});
|
|
update(): void;
|
|
updateMinValue(): void;
|
|
updateMaxValue(): void;
|
|
setHeightValueAtIndex(xi: number, yi: number, value: number): void;
|
|
getRectMinMax(iMinX: number, iMinY: number, iMaxX: number, iMaxY: number, result?: number[]): void;
|
|
getIndexOfPosition(x: number, y: number, result: number[], clamp: boolean): boolean;
|
|
getTriangleAt(x: number, y: number, edgeClamp: boolean, a: Vec3, b: Vec3, c: Vec3): boolean;
|
|
getNormalAt(x: number, y: number, edgeClamp: boolean, result: Vec3): void;
|
|
getAabbAtIndex(xi: number, yi: number, { lowerBound, upperBound }: AABB): void;
|
|
getHeightAt(x: number, y: number, edgeClamp: boolean): number;
|
|
getCacheConvexTrianglePillarKey(xi: number, yi: number, getUpperTriangle: boolean): string;
|
|
getCachedConvexTrianglePillar(xi: number, yi: number, getUpperTriangle: boolean): HeightfieldPillar;
|
|
setCachedConvexTrianglePillar(xi: number, yi: number, getUpperTriangle: boolean, convex: ConvexPolyhedron, offset: Vec3): void;
|
|
clearCachedConvexTrianglePillar(xi: number, yi: number, getUpperTriangle: boolean): void;
|
|
getTriangle(xi: number, yi: number, upper: boolean, a: Vec3, b: Vec3, c: Vec3): void;
|
|
getConvexTrianglePillar(xi: number, yi: number, getUpperTriangle: boolean): void;
|
|
calculateLocalInertia(mass: number, target?: Vec3): Vec3;
|
|
volume(): number;
|
|
calculateWorldAABB(pos: Vec3, quat: Quaternion, min: Vec3, max: Vec3): void;
|
|
updateBoundingSphereRadius(): void;
|
|
setHeightsFromImage(image: HTMLImageElement, scale: Vec3): void;
|
|
}
|
|
}
|
|
declare module "utils/Octree" {
|
|
import { AABB } from "collision/AABB";
|
|
import type { Transform } from "math/Transform";
|
|
import type { Ray } from "collision/Ray";
|
|
class OctreeNode {
|
|
root: OctreeNode | null;
|
|
aabb: AABB;
|
|
data: number[];
|
|
children: OctreeNode[];
|
|
constructor(options?: {
|
|
root?: Octree | null;
|
|
aabb?: AABB;
|
|
});
|
|
reset(): void;
|
|
insert(aabb: AABB, elementData: number, level?: number): boolean;
|
|
subdivide(): void;
|
|
aabbQuery(aabb: AABB, result: number[]): number[];
|
|
rayQuery(ray: Ray, treeTransform: Transform, result: number[]): number[];
|
|
removeEmptyNodes(): void;
|
|
}
|
|
export class Octree extends OctreeNode {
|
|
maxDepth: number;
|
|
constructor(aabb?: AABB, options?: {
|
|
maxDepth?: number;
|
|
});
|
|
}
|
|
}
|
|
declare module "shapes/Trimesh" {
|
|
import { Shape } from "shapes/Shape";
|
|
import { Vec3 } from "math/Vec3";
|
|
import { AABB } from "collision/AABB";
|
|
import { Octree } from "utils/Octree";
|
|
import type { Quaternion } from "math/Quaternion";
|
|
export class Trimesh extends Shape {
|
|
vertices: Float32Array;
|
|
indices: Int16Array;
|
|
normals: Float32Array;
|
|
aabb: AABB;
|
|
edges: Int16Array | null;
|
|
scale: Vec3;
|
|
tree: Octree;
|
|
constructor(vertices: number[], indices: number[]);
|
|
updateTree(): void;
|
|
getTrianglesInAABB(aabb: AABB, result: number[]): number[];
|
|
setScale(scale: Vec3): void;
|
|
updateNormals(): void;
|
|
updateEdges(): void;
|
|
getEdgeVertex(edgeIndex: number, firstOrSecond: number, vertexStore: Vec3): void;
|
|
getEdgeVector(edgeIndex: number, vectorStore: Vec3): void;
|
|
static computeNormal(va: Vec3, vb: Vec3, vc: Vec3, target: Vec3): void;
|
|
getVertex(i: number, out: Vec3): Vec3;
|
|
private _getUnscaledVertex;
|
|
getWorldVertex(i: number, pos: Vec3, quat: Quaternion, out: Vec3): Vec3;
|
|
getTriangleVertices(i: number, a: Vec3, b: Vec3, c: Vec3): void;
|
|
getNormal(i: number, target: Vec3): Vec3;
|
|
calculateLocalInertia(mass: number, target: Vec3): Vec3;
|
|
computeLocalAABB(aabb: AABB): void;
|
|
updateAABB(): void;
|
|
updateBoundingSphereRadius(): void;
|
|
calculateWorldAABB(pos: Vec3, quat: Quaternion, min: Vec3, max: Vec3): void;
|
|
volume(): number;
|
|
static createTorus(radius?: number, tube?: number, radialSegments?: number, tubularSegments?: number, arc?: number): Trimesh;
|
|
}
|
|
}
|
|
declare module "math/JacobianElement" {
|
|
import { Vec3 } from "math/Vec3";
|
|
export class JacobianElement {
|
|
spatial: Vec3;
|
|
rotational: Vec3;
|
|
constructor();
|
|
multiplyElement(element: JacobianElement): number;
|
|
multiplyVectors(spatial: Vec3, rotational: Vec3): number;
|
|
}
|
|
}
|
|
declare module "equations/Equation" {
|
|
import { JacobianElement } from "math/JacobianElement";
|
|
import type { Body } from "objects/Body";
|
|
import type { Shape } from "shapes/Shape";
|
|
export class Equation {
|
|
id: number;
|
|
minForce: number;
|
|
maxForce: number;
|
|
bi: Body;
|
|
bj: Body;
|
|
si: Shape;
|
|
sj: Shape;
|
|
a: number;
|
|
b: number;
|
|
eps: number;
|
|
jacobianElementA: JacobianElement;
|
|
jacobianElementB: JacobianElement;
|
|
enabled: boolean;
|
|
multiplier: number;
|
|
static idCounter: number;
|
|
constructor(bi: Body, bj: Body, minForce?: number, maxForce?: number);
|
|
setSpookParams(stiffness: number, relaxation: number, timeStep: number): void;
|
|
computeB(a: number, b: number, h: number): number;
|
|
computeGq(): number;
|
|
computeGW(): number;
|
|
computeGWlambda(): number;
|
|
computeGiMf(): number;
|
|
computeGiMGt(): number;
|
|
addToWlambda(deltalambda: number): void;
|
|
computeC(): number;
|
|
}
|
|
}
|
|
declare module "solver/Solver" {
|
|
import type { Equation } from "equations/Equation";
|
|
import type { World } from "world/World";
|
|
export class Solver {
|
|
equations: Equation[];
|
|
constructor();
|
|
solve(dt: number, world: World): number;
|
|
addEquation(eq: Equation): void;
|
|
removeEquation(eq: Equation): void;
|
|
removeAllEquations(): void;
|
|
}
|
|
}
|
|
declare module "solver/GSSolver" {
|
|
import { Solver } from "solver/Solver";
|
|
import type { World } from "world/World";
|
|
export class GSSolver extends Solver {
|
|
iterations: number;
|
|
tolerance: number;
|
|
constructor();
|
|
solve(dt: number, world: World): number;
|
|
}
|
|
}
|
|
declare module "collision/Broadphase" {
|
|
import { Body } from "objects/Body";
|
|
import type { AABB } from "collision/AABB";
|
|
import type { World } from "world/World";
|
|
export class Broadphase {
|
|
world: World | null;
|
|
useBoundingBoxes: boolean;
|
|
dirty: boolean;
|
|
constructor();
|
|
collisionPairs(world: World, p1: Body[], p2: Body[]): void;
|
|
needBroadphaseCollision(bodyA: Body, bodyB: Body): boolean;
|
|
intersectionTest(bodyA: Body, bodyB: Body, pairs1: Body[], pairs2: Body[]): void;
|
|
doBoundingSphereBroadphase(bodyA: Body, bodyB: Body, pairs1: Body[], pairs2: Body[]): void;
|
|
doBoundingBoxBroadphase(bodyA: Body, bodyB: Body, pairs1: Body[], pairs2: Body[]): void;
|
|
makePairsUnique(pairs1: Body[], pairs2: Body[]): void;
|
|
setWorld(world: World): void;
|
|
static boundingSphereCheck(bodyA: Body, bodyB: Body): boolean;
|
|
aabbQuery(world: World, aabb: AABB, result: Body[]): Body[];
|
|
}
|
|
}
|
|
declare module "collision/NaiveBroadphase" {
|
|
import { Broadphase } from "collision/Broadphase";
|
|
import type { AABB } from "collision/AABB";
|
|
import type { Body } from "objects/Body";
|
|
import type { World } from "world/World";
|
|
export class NaiveBroadphase extends Broadphase {
|
|
constructor();
|
|
collisionPairs(world: World, pairs1: Body[], pairs2: Body[]): void;
|
|
aabbQuery(world: World, aabb: AABB, result?: Body[]): Body[];
|
|
}
|
|
}
|
|
declare module "utils/Pool" {
|
|
export class Pool {
|
|
objects: any[];
|
|
type: any;
|
|
release(...args: any[]): Pool;
|
|
get(): any;
|
|
constructObject(): void;
|
|
resize(size: number): Pool;
|
|
}
|
|
}
|
|
declare module "utils/Vec3Pool" {
|
|
import { Pool } from "utils/Pool";
|
|
import { Vec3 } from "math/Vec3";
|
|
export class Vec3Pool extends Pool {
|
|
type: typeof Vec3;
|
|
constructObject(): Vec3;
|
|
}
|
|
}
|
|
declare module "equations/ContactEquation" {
|
|
import { Equation } from "equations/Equation";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
export class ContactEquation extends Equation {
|
|
restitution: number;
|
|
ri: Vec3;
|
|
rj: Vec3;
|
|
ni: Vec3;
|
|
constructor(bodyA: Body, bodyB: Body, maxForce?: number);
|
|
computeB(h: number): number;
|
|
getImpactVelocityAlongNormal(): number;
|
|
}
|
|
}
|
|
declare module "equations/FrictionEquation" {
|
|
import { Equation } from "equations/Equation";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
export class FrictionEquation extends Equation {
|
|
ri: Vec3;
|
|
rj: Vec3;
|
|
t: Vec3;
|
|
constructor(bodyA: Body, bodyB: Body, slipForce: number);
|
|
computeB(h: number): number;
|
|
}
|
|
}
|
|
declare module "shapes/Particle" {
|
|
import { Shape } from "shapes/Shape";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Quaternion } from "math/Quaternion";
|
|
export class Particle extends Shape {
|
|
constructor();
|
|
calculateLocalInertia(mass: number, target?: Vec3): Vec3;
|
|
volume(): number;
|
|
updateBoundingSphereRadius(): void;
|
|
calculateWorldAABB(pos: Vec3, quat: Quaternion, min: Vec3, max: Vec3): void;
|
|
}
|
|
}
|
|
declare module "shapes/Cylinder" {
|
|
import { ConvexPolyhedron } from "shapes/ConvexPolyhedron";
|
|
export class Cylinder extends ConvexPolyhedron {
|
|
radiusTop: number;
|
|
radiusBottom: number;
|
|
height: number;
|
|
numSegments: number;
|
|
constructor(radiusTop?: number, radiusBottom?: number, height?: number, numSegments?: number);
|
|
}
|
|
}
|
|
declare module "material/ContactMaterial" {
|
|
import type { Material } from "material/Material";
|
|
export type ContactMaterialOptions = ConstructorParameters<typeof ContactMaterial>[2];
|
|
export class ContactMaterial {
|
|
id: number;
|
|
materials: [Material, Material];
|
|
friction: number;
|
|
restitution: number;
|
|
contactEquationStiffness: number;
|
|
contactEquationRelaxation: number;
|
|
frictionEquationStiffness: number;
|
|
frictionEquationRelaxation: number;
|
|
static idCounter: number;
|
|
constructor(m1: Material, m2: Material, options: {
|
|
friction?: number;
|
|
restitution?: number;
|
|
contactEquationStiffness?: number;
|
|
contactEquationRelaxation?: number;
|
|
frictionEquationStiffness?: number;
|
|
frictionEquationRelaxation?: number;
|
|
});
|
|
}
|
|
}
|
|
declare module "world/Narrowphase" {
|
|
import { Shape } from "shapes/Shape";
|
|
import { Vec3 } from "math/Vec3";
|
|
import { Quaternion } from "math/Quaternion";
|
|
import { Body } from "objects/Body";
|
|
import { Vec3Pool } from "utils/Vec3Pool";
|
|
import { ContactEquation } from "equations/ContactEquation";
|
|
import { FrictionEquation } from "equations/FrictionEquation";
|
|
import type { Box } from "shapes/Box";
|
|
import type { Sphere } from "shapes/Sphere";
|
|
import type { ConvexPolyhedron } from "shapes/ConvexPolyhedron";
|
|
import type { Particle } from "shapes/Particle";
|
|
import type { Plane } from "shapes/Plane";
|
|
import type { Trimesh } from "shapes/Trimesh";
|
|
import type { Heightfield } from "shapes/Heightfield";
|
|
import { Cylinder } from "shapes/Cylinder";
|
|
import type { ContactMaterial } from "material/ContactMaterial";
|
|
import type { World } from "world/World";
|
|
export const COLLISION_TYPES: {
|
|
sphereSphere: 1;
|
|
spherePlane: 3;
|
|
boxBox: 4;
|
|
sphereBox: 5;
|
|
planeBox: 6;
|
|
convexConvex: 16;
|
|
sphereConvex: 17;
|
|
planeConvex: 18;
|
|
boxConvex: 20;
|
|
sphereHeightfield: 33;
|
|
boxHeightfield: 36;
|
|
convexHeightfield: 48;
|
|
sphereParticle: 65;
|
|
planeParticle: 66;
|
|
boxParticle: 68;
|
|
convexParticle: 80;
|
|
cylinderCylinder: 128;
|
|
sphereCylinder: 129;
|
|
planeCylinder: 130;
|
|
boxCylinder: 132;
|
|
convexCylinder: 144;
|
|
heightfieldCylinder: 160;
|
|
particleCylinder: 192;
|
|
sphereTrimesh: 257;
|
|
planeTrimesh: 258;
|
|
};
|
|
export type CollisionType = typeof COLLISION_TYPES[keyof typeof COLLISION_TYPES];
|
|
export class Narrowphase {
|
|
contactPointPool: ContactEquation[];
|
|
frictionEquationPool: FrictionEquation[];
|
|
result: ContactEquation[];
|
|
frictionResult: FrictionEquation[];
|
|
v3pool: Vec3Pool;
|
|
world: World;
|
|
currentContactMaterial: ContactMaterial;
|
|
enableFrictionReduction: boolean;
|
|
get [COLLISION_TYPES.sphereSphere](): (si: Sphere, sj: Sphere, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => boolean | void;
|
|
get [COLLISION_TYPES.spherePlane](): (si: Sphere, sj: Plane, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.boxBox](): (si: Box, sj: Box, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.sphereBox](): (si: Sphere, sj: Box, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.planeBox](): (si: Plane, sj: Box, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.convexConvex](): (si: ConvexPolyhedron, sj: ConvexPolyhedron, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined, faceListA?: number[] | null | undefined, faceListB?: number[] | null | undefined) => true | void;
|
|
get [COLLISION_TYPES.sphereConvex](): (si: Sphere, sj: ConvexPolyhedron, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.planeConvex](): (planeShape: Plane, convexShape: ConvexPolyhedron, planePosition: Vec3, convexPosition: Vec3, planeQuat: Quaternion, convexQuat: Quaternion, planeBody: Body, convexBody: Body, si?: Shape | undefined, sj?: Shape | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.boxConvex](): (si: Box, sj: ConvexPolyhedron, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.sphereHeightfield](): (sphereShape: Sphere, hfShape: Heightfield, spherePos: Vec3, hfPos: Vec3, sphereQuat: Quaternion, hfQuat: Quaternion, sphereBody: Body, hfBody: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.boxHeightfield](): (si: Box, sj: Heightfield, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.convexHeightfield](): (convexShape: ConvexPolyhedron, hfShape: Heightfield, convexPos: Vec3, hfPos: Vec3, convexQuat: Quaternion, hfQuat: Quaternion, convexBody: Body, hfBody: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.sphereParticle](): (sj: Sphere, si: Particle, xj: Vec3, xi: Vec3, qj: Quaternion, qi: Quaternion, bj: Body, bi: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.planeParticle](): (sj: Plane, si: Particle, xj: Vec3, xi: Vec3, qj: Quaternion, qi: Quaternion, bj: Body, bi: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.boxParticle](): (si: Box, sj: Particle, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.convexParticle](): (sj: ConvexPolyhedron, si: Particle, xj: Vec3, xi: Vec3, qj: Quaternion, qi: Quaternion, bj: Body, bi: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.cylinderCylinder](): (si: ConvexPolyhedron, sj: ConvexPolyhedron, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined, faceListA?: number[] | null | undefined, faceListB?: number[] | null | undefined) => true | void;
|
|
get [COLLISION_TYPES.sphereCylinder](): (si: Sphere, sj: ConvexPolyhedron, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.planeCylinder](): (planeShape: Plane, convexShape: ConvexPolyhedron, planePosition: Vec3, convexPosition: Vec3, planeQuat: Quaternion, convexQuat: Quaternion, planeBody: Body, convexBody: Body, si?: Shape | undefined, sj?: Shape | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.boxCylinder](): (si: Box, sj: ConvexPolyhedron, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.convexCylinder](): (si: ConvexPolyhedron, sj: ConvexPolyhedron, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined, faceListA?: number[] | null | undefined, faceListB?: number[] | null | undefined) => true | void;
|
|
get [COLLISION_TYPES.heightfieldCylinder](): (hfShape: Heightfield, convexShape: Cylinder, hfPos: Vec3, convexPos: Vec3, hfQuat: Quaternion, convexQuat: Quaternion, hfBody: Body, convexBody: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.particleCylinder](): (si: Particle, sj: Cylinder, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.sphereTrimesh](): (sphereShape: Sphere, trimeshShape: Trimesh, spherePos: Vec3, trimeshPos: Vec3, sphereQuat: Quaternion, trimeshQuat: Quaternion, sphereBody: Body, trimeshBody: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
get [COLLISION_TYPES.planeTrimesh](): (planeShape: Plane, trimeshShape: Trimesh, planePos: Vec3, trimeshPos: Vec3, planeQuat: Quaternion, trimeshQuat: Quaternion, planeBody: Body, trimeshBody: Body, rsi?: Shape | null | undefined, rsj?: Shape | null | undefined, justTest?: boolean | undefined) => true | void;
|
|
constructor(world: World);
|
|
createContactEquation(bi: Body, bj: Body, si: Shape, sj: Shape, overrideShapeA?: Shape | null, overrideShapeB?: Shape | null): ContactEquation;
|
|
createFrictionEquationsFromContact(contactEquation: ContactEquation, outArray: FrictionEquation[]): boolean;
|
|
createFrictionFromAverage(numContacts: number): void;
|
|
getContacts(p1: Body[], p2: Body[], world: World, result: ContactEquation[], oldcontacts: ContactEquation[], frictionResult: FrictionEquation[], frictionPool: FrictionEquation[]): void;
|
|
sphereSphere(si: Sphere, sj: Sphere, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): boolean | void;
|
|
spherePlane(si: Sphere, sj: Plane, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
boxBox(si: Box, sj: Box, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
sphereBox(si: Sphere, sj: Box, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
planeBox(si: Plane, sj: Box, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
convexConvex(si: ConvexPolyhedron, sj: ConvexPolyhedron, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean, faceListA?: number[] | null, faceListB?: number[] | null): true | void;
|
|
sphereConvex(si: Sphere, sj: ConvexPolyhedron, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
planeConvex(planeShape: Plane, convexShape: ConvexPolyhedron, planePosition: Vec3, convexPosition: Vec3, planeQuat: Quaternion, convexQuat: Quaternion, planeBody: Body, convexBody: Body, si?: Shape, sj?: Shape, justTest?: boolean): true | void;
|
|
boxConvex(si: Box, sj: ConvexPolyhedron, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
sphereHeightfield(sphereShape: Sphere, hfShape: Heightfield, spherePos: Vec3, hfPos: Vec3, sphereQuat: Quaternion, hfQuat: Quaternion, sphereBody: Body, hfBody: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
boxHeightfield(si: Box, sj: Heightfield, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
convexHeightfield(convexShape: ConvexPolyhedron, hfShape: Heightfield, convexPos: Vec3, hfPos: Vec3, convexQuat: Quaternion, hfQuat: Quaternion, convexBody: Body, hfBody: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
sphereParticle(sj: Sphere, si: Particle, xj: Vec3, xi: Vec3, qj: Quaternion, qi: Quaternion, bj: Body, bi: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
planeParticle(sj: Plane, si: Particle, xj: Vec3, xi: Vec3, qj: Quaternion, qi: Quaternion, bj: Body, bi: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
boxParticle(si: Box, sj: Particle, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
convexParticle(sj: ConvexPolyhedron, si: Particle, xj: Vec3, xi: Vec3, qj: Quaternion, qi: Quaternion, bj: Body, bi: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
heightfieldCylinder(hfShape: Heightfield, convexShape: Cylinder, hfPos: Vec3, convexPos: Vec3, hfQuat: Quaternion, convexQuat: Quaternion, hfBody: Body, convexBody: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
particleCylinder(si: Particle, sj: Cylinder, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
sphereTrimesh(sphereShape: Sphere, trimeshShape: Trimesh, spherePos: Vec3, trimeshPos: Vec3, sphereQuat: Quaternion, trimeshQuat: Quaternion, sphereBody: Body, trimeshBody: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
planeTrimesh(planeShape: Plane, trimeshShape: Trimesh, planePos: Vec3, trimeshPos: Vec3, planeQuat: Quaternion, trimeshQuat: Quaternion, planeBody: Body, trimeshBody: Body, rsi?: Shape | null, rsj?: Shape | null, justTest?: boolean): true | void;
|
|
}
|
|
}
|
|
declare module "collision/ArrayCollisionMatrix" {
|
|
import type { Body } from "objects/Body";
|
|
export class ArrayCollisionMatrix {
|
|
matrix: number[];
|
|
constructor();
|
|
get(bi: Body, bj: Body): number;
|
|
set(bi: Body, bj: Body, value: boolean): void;
|
|
reset(): void;
|
|
setNumObjects(n: number): void;
|
|
}
|
|
}
|
|
declare module "collision/OverlapKeeper" {
|
|
export class OverlapKeeper {
|
|
current: number[];
|
|
previous: number[];
|
|
constructor();
|
|
getKey(i: number, j: number): number;
|
|
set(i: number, j: number): void;
|
|
tick(): void;
|
|
getDiff(additions: number[], removals: number[]): void;
|
|
}
|
|
}
|
|
declare module "utils/TupleDictionary" {
|
|
export class TupleDictionary {
|
|
data: {
|
|
[id: string]: any;
|
|
keys: string[];
|
|
};
|
|
get(i: number, j: number): any;
|
|
set(i: number, j: number, value: any): void;
|
|
delete(i: number, j: number): void;
|
|
reset(): void;
|
|
}
|
|
}
|
|
declare module "constraints/Constraint" {
|
|
import type { Body } from "objects/Body";
|
|
import type { Equation } from "equations/Equation";
|
|
export type ConstraintOptions = ConstructorParameters<typeof Constraint>[2];
|
|
export class Constraint {
|
|
equations: Equation[];
|
|
bodyA: Body;
|
|
bodyB: Body;
|
|
id: number;
|
|
collideConnected: boolean;
|
|
static idCounter: number;
|
|
constructor(bodyA: Body, bodyB: Body, options?: {
|
|
collideConnected?: boolean;
|
|
wakeUpBodies?: boolean;
|
|
});
|
|
update(): void;
|
|
enable(): void;
|
|
disable(): void;
|
|
}
|
|
}
|
|
declare module "world/World" {
|
|
import { EventTarget } from "utils/EventTarget";
|
|
import { Narrowphase } from "world/Narrowphase";
|
|
import { Vec3 } from "math/Vec3";
|
|
import { Material } from "material/Material";
|
|
import { ContactMaterial } from "material/ContactMaterial";
|
|
import { ArrayCollisionMatrix } from "collision/ArrayCollisionMatrix";
|
|
import { OverlapKeeper } from "collision/OverlapKeeper";
|
|
import { TupleDictionary } from "utils/TupleDictionary";
|
|
import { RaycastResult } from "collision/RaycastResult";
|
|
import { Body } from "objects/Body";
|
|
import type { Broadphase } from "collision/Broadphase";
|
|
import type { Solver } from "solver/Solver";
|
|
import type { ContactEquation } from "equations/ContactEquation";
|
|
import type { FrictionEquation } from "equations/FrictionEquation";
|
|
import type { RayOptions, RaycastCallback } from "collision/Ray";
|
|
import type { Constraint } from "constraints/Constraint";
|
|
import type { Shape } from "shapes/Shape";
|
|
export type WorldOptions = ConstructorParameters<typeof World>[0];
|
|
export class World extends EventTarget {
|
|
dt: number;
|
|
allowSleep: boolean;
|
|
contacts: ContactEquation[];
|
|
frictionEquations: FrictionEquation[];
|
|
quatNormalizeSkip: number;
|
|
quatNormalizeFast: boolean;
|
|
time: number;
|
|
stepnumber: number;
|
|
default_dt: number;
|
|
nextId: number;
|
|
gravity: Vec3;
|
|
frictionGravity?: Vec3;
|
|
broadphase: Broadphase;
|
|
bodies: Body[];
|
|
hasActiveBodies: boolean;
|
|
solver: Solver;
|
|
constraints: Constraint[];
|
|
narrowphase: Narrowphase;
|
|
collisionMatrix: ArrayCollisionMatrix;
|
|
collisionMatrixPrevious: ArrayCollisionMatrix;
|
|
bodyOverlapKeeper: OverlapKeeper;
|
|
shapeOverlapKeeper: OverlapKeeper;
|
|
contactmaterials: ContactMaterial[];
|
|
contactMaterialTable: TupleDictionary;
|
|
defaultMaterial: Material;
|
|
defaultContactMaterial: ContactMaterial;
|
|
doProfiling: boolean;
|
|
profile: {
|
|
solve: number;
|
|
makeContactConstraints: number;
|
|
broadphase: number;
|
|
integrate: number;
|
|
narrowphase: number;
|
|
};
|
|
accumulator: number;
|
|
subsystems: any[];
|
|
addBodyEvent: {
|
|
type: 'addBody';
|
|
body: Body | null;
|
|
};
|
|
removeBodyEvent: {
|
|
type: 'removeBody';
|
|
body: Body | null;
|
|
};
|
|
idToBodyMap: {
|
|
[id: number]: Body;
|
|
};
|
|
lastCallTime?: number;
|
|
constructor(options?: {
|
|
gravity?: Vec3;
|
|
frictionGravity?: Vec3;
|
|
allowSleep?: boolean;
|
|
broadphase?: Broadphase;
|
|
solver?: Solver;
|
|
quatNormalizeFast?: boolean;
|
|
quatNormalizeSkip?: number;
|
|
});
|
|
getContactMaterial(m1: Material, m2: Material): ContactMaterial;
|
|
collisionMatrixTick(): void;
|
|
addConstraint(c: Constraint): void;
|
|
removeConstraint(c: Constraint): void;
|
|
rayTest(from: Vec3, to: Vec3, result: RaycastResult | RaycastCallback): void;
|
|
raycastAll(from?: Vec3, to?: Vec3, options?: RayOptions, callback?: RaycastCallback): boolean;
|
|
raycastAny(from?: Vec3, to?: Vec3, options?: RayOptions, result?: RaycastResult): boolean;
|
|
raycastClosest(from?: Vec3, to?: Vec3, options?: RayOptions, result?: RaycastResult): boolean;
|
|
addBody(body: Body): void;
|
|
removeBody(body: Body): void;
|
|
getBodyById(id: number): Body;
|
|
getShapeById(id: number): Shape | null;
|
|
addContactMaterial(cmat: ContactMaterial): void;
|
|
removeContactMaterial(cmat: ContactMaterial): void;
|
|
fixedStep(dt?: number, maxSubSteps?: number): void;
|
|
step(dt: number, timeSinceLastCalled?: number, maxSubSteps?: number): void;
|
|
internalStep(dt: number): void;
|
|
emitContactEvents(): void;
|
|
clearForces(): void;
|
|
}
|
|
}
|
|
declare module "collision/Ray" {
|
|
import { Vec3 } from "math/Vec3";
|
|
import { Quaternion } from "math/Quaternion";
|
|
import { RaycastResult } from "collision/RaycastResult";
|
|
import { Shape } from "shapes/Shape";
|
|
import { AABB } from "collision/AABB";
|
|
import type { Body } from "objects/Body";
|
|
import type { Sphere } from "shapes/Sphere";
|
|
import type { Box } from "shapes/Box";
|
|
import type { Plane } from "shapes/Plane";
|
|
import type { Heightfield } from "shapes/Heightfield";
|
|
import type { ConvexPolyhedron } from "shapes/ConvexPolyhedron";
|
|
import type { Trimesh } from "shapes/Trimesh";
|
|
import type { World } from "world/World";
|
|
export const RAY_MODES: {
|
|
readonly CLOSEST: 1;
|
|
readonly ANY: 2;
|
|
readonly ALL: 4;
|
|
};
|
|
export type RayMode = typeof RAY_MODES[keyof typeof RAY_MODES];
|
|
export type RayOptions = {
|
|
from?: Vec3;
|
|
to?: Vec3;
|
|
mode?: RayMode;
|
|
result?: RaycastResult;
|
|
skipBackfaces?: boolean;
|
|
collisionFilterMask?: number;
|
|
collisionFilterGroup?: number;
|
|
checkCollisionResponse?: boolean;
|
|
callback?: RaycastCallback;
|
|
};
|
|
export type RaycastCallback = (result: RaycastResult) => void;
|
|
export class Ray {
|
|
from: Vec3;
|
|
to: Vec3;
|
|
direction: Vec3;
|
|
precision: number;
|
|
checkCollisionResponse: boolean;
|
|
skipBackfaces: boolean;
|
|
collisionFilterMask: number;
|
|
collisionFilterGroup: number;
|
|
mode: number;
|
|
result: RaycastResult;
|
|
hasHit: boolean;
|
|
callback: RaycastCallback;
|
|
static CLOSEST: 1;
|
|
static ANY: 2;
|
|
static ALL: 4;
|
|
get [Shape.types.SPHERE](): (sphere: Sphere, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape) => void;
|
|
get [Shape.types.PLANE](): (shape: Plane, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape) => void;
|
|
get [Shape.types.BOX](): (box: Box, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape) => void;
|
|
get [Shape.types.CYLINDER](): (shape: ConvexPolyhedron, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape, options?: {
|
|
faceList: number[];
|
|
} | undefined) => void;
|
|
get [Shape.types.CONVEXPOLYHEDRON](): (shape: ConvexPolyhedron, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape, options?: {
|
|
faceList: number[];
|
|
} | undefined) => void;
|
|
get [Shape.types.HEIGHTFIELD](): (shape: Heightfield, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape) => void;
|
|
get [Shape.types.TRIMESH](): (mesh: Trimesh, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape, options?: {
|
|
faceList?: any[] | undefined;
|
|
} | undefined) => void;
|
|
constructor(from?: Vec3, to?: Vec3);
|
|
intersectWorld(world: World, options: RayOptions): boolean;
|
|
intersectBody(body: Body, result?: RaycastResult): void;
|
|
intersectBodies(bodies: Body[], result?: RaycastResult): void;
|
|
private updateDirection;
|
|
private intersectShape;
|
|
_intersectBox(box: Box, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape): void;
|
|
_intersectPlane(shape: Plane, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape): void;
|
|
getAABB(aabb: AABB): void;
|
|
_intersectHeightfield(shape: Heightfield, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape): void;
|
|
_intersectSphere(sphere: Sphere, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape): void;
|
|
_intersectConvex(shape: ConvexPolyhedron, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape, options?: {
|
|
faceList: number[];
|
|
}): void;
|
|
_intersectTrimesh(mesh: Trimesh, quat: Quaternion, position: Vec3, body: Body, reportedShape: Shape, options?: {
|
|
faceList?: any[];
|
|
}): void;
|
|
private reportIntersection;
|
|
static pointInTriangle(p: Vec3, a: Vec3, b: Vec3, c: Vec3): boolean;
|
|
}
|
|
}
|
|
declare module "collision/AABB" {
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Ray } from "collision/Ray";
|
|
import type { Transform } from "math/Transform";
|
|
import type { Quaternion } from "math/Quaternion";
|
|
export class AABB {
|
|
lowerBound: Vec3;
|
|
upperBound: Vec3;
|
|
constructor(options?: {
|
|
upperBound?: Vec3;
|
|
lowerBound?: Vec3;
|
|
});
|
|
setFromPoints(points: Vec3[], position?: Vec3, quaternion?: Quaternion, skinSize?: number): AABB;
|
|
copy(aabb: AABB): AABB;
|
|
clone(): AABB;
|
|
extend(aabb: AABB): void;
|
|
overlaps(aabb: AABB): boolean;
|
|
volume(): number;
|
|
contains(aabb: AABB): boolean;
|
|
getCorners(a: Vec3, b: Vec3, c: Vec3, d: Vec3, e: Vec3, f: Vec3, g: Vec3, h: Vec3): void;
|
|
toLocalFrame(frame: Transform, target: AABB): AABB;
|
|
toWorldFrame(frame: Transform, target: AABB): AABB;
|
|
overlapsRay(ray: Ray): boolean;
|
|
}
|
|
}
|
|
declare module "objects/Body" {
|
|
import { EventTarget } from "utils/EventTarget";
|
|
import { Vec3 } from "math/Vec3";
|
|
import { Mat3 } from "math/Mat3";
|
|
import { Quaternion } from "math/Quaternion";
|
|
import { AABB } from "collision/AABB";
|
|
import type { Shape } from "shapes/Shape";
|
|
import type { Material } from "material/Material";
|
|
import type { World } from "world/World";
|
|
export const BODY_TYPES: {
|
|
readonly DYNAMIC: 1;
|
|
readonly STATIC: 2;
|
|
readonly KINEMATIC: 4;
|
|
};
|
|
export type BodyType = typeof BODY_TYPES[keyof typeof BODY_TYPES];
|
|
export const BODY_SLEEP_STATES: {
|
|
readonly AWAKE: 0;
|
|
readonly SLEEPY: 1;
|
|
readonly SLEEPING: 2;
|
|
};
|
|
export type BodySleepState = typeof BODY_SLEEP_STATES[keyof typeof BODY_SLEEP_STATES];
|
|
export type BodyOptions = ConstructorParameters<typeof Body>[0];
|
|
export class Body extends EventTarget {
|
|
static idCounter: number;
|
|
static COLLIDE_EVENT_NAME: string;
|
|
static DYNAMIC: 1;
|
|
static STATIC: 2;
|
|
static KINEMATIC: 4;
|
|
static AWAKE: 0;
|
|
static SLEEPY: 1;
|
|
static SLEEPING: 2;
|
|
static wakeupEvent: {
|
|
type: string;
|
|
};
|
|
static sleepyEvent: {
|
|
type: string;
|
|
};
|
|
static sleepEvent: {
|
|
type: string;
|
|
};
|
|
id: number;
|
|
index: number;
|
|
world: World | null;
|
|
vlambda: Vec3;
|
|
collisionFilterGroup: number;
|
|
collisionFilterMask: number;
|
|
collisionResponse: boolean;
|
|
position: Vec3;
|
|
previousPosition: Vec3;
|
|
interpolatedPosition: Vec3;
|
|
initPosition: Vec3;
|
|
velocity: Vec3;
|
|
initVelocity: Vec3;
|
|
force: Vec3;
|
|
mass: number;
|
|
invMass: number;
|
|
material: Material | null;
|
|
linearDamping: number;
|
|
type: BodyType;
|
|
allowSleep: boolean;
|
|
sleepState: BodySleepState;
|
|
sleepSpeedLimit: number;
|
|
sleepTimeLimit: number;
|
|
timeLastSleepy: number;
|
|
wakeUpAfterNarrowphase: boolean;
|
|
torque: Vec3;
|
|
quaternion: Quaternion;
|
|
initQuaternion: Quaternion;
|
|
previousQuaternion: Quaternion;
|
|
interpolatedQuaternion: Quaternion;
|
|
angularVelocity: Vec3;
|
|
initAngularVelocity: Vec3;
|
|
shapes: Shape[];
|
|
shapeOffsets: Vec3[];
|
|
shapeOrientations: Quaternion[];
|
|
inertia: Vec3;
|
|
invInertia: Vec3;
|
|
invInertiaWorld: Mat3;
|
|
invMassSolve: number;
|
|
invInertiaSolve: Vec3;
|
|
invInertiaWorldSolve: Mat3;
|
|
fixedRotation: boolean;
|
|
angularDamping: number;
|
|
linearFactor: Vec3;
|
|
angularFactor: Vec3;
|
|
aabb: AABB;
|
|
aabbNeedsUpdate: boolean;
|
|
boundingRadius: number;
|
|
wlambda: Vec3;
|
|
isTrigger: boolean;
|
|
constructor(options?: {
|
|
collisionFilterGroup?: number;
|
|
collisionFilterMask?: number;
|
|
collisionResponse?: boolean;
|
|
position?: Vec3;
|
|
velocity?: Vec3;
|
|
mass?: number;
|
|
material?: Material;
|
|
linearDamping?: number;
|
|
type?: BodyType;
|
|
allowSleep?: boolean;
|
|
sleepSpeedLimit?: number;
|
|
sleepTimeLimit?: number;
|
|
quaternion?: Quaternion;
|
|
angularVelocity?: Vec3;
|
|
fixedRotation?: boolean;
|
|
angularDamping?: number;
|
|
linearFactor?: Vec3;
|
|
angularFactor?: Vec3;
|
|
shape?: Shape;
|
|
isTrigger?: boolean;
|
|
});
|
|
wakeUp(): void;
|
|
sleep(): void;
|
|
sleepTick(time: number): void;
|
|
updateSolveMassProperties(): void;
|
|
pointToLocalFrame(worldPoint: Vec3, result?: Vec3): Vec3;
|
|
vectorToLocalFrame(worldVector: Vec3, result?: Vec3): Vec3;
|
|
pointToWorldFrame(localPoint: Vec3, result?: Vec3): Vec3;
|
|
vectorToWorldFrame(localVector: Vec3, result?: Vec3): Vec3;
|
|
addShape(shape: Shape, _offset?: Vec3, _orientation?: Quaternion): Body;
|
|
removeShape(shape: Shape): Body;
|
|
updateBoundingRadius(): void;
|
|
updateAABB(): void;
|
|
updateInertiaWorld(force?: boolean): void;
|
|
applyForce(force: Vec3, relativePoint?: Vec3): void;
|
|
applyLocalForce(localForce: Vec3, localPoint?: Vec3): void;
|
|
applyTorque(torque: Vec3): void;
|
|
applyImpulse(impulse: Vec3, relativePoint?: Vec3): void;
|
|
applyLocalImpulse(localImpulse: Vec3, localPoint?: Vec3): void;
|
|
updateMassProperties(): void;
|
|
getVelocityAtWorldPoint(worldPoint: Vec3, result: Vec3): Vec3;
|
|
integrate(dt: number, quatNormalize: boolean, quatNormalizeFast: boolean): void;
|
|
}
|
|
}
|
|
declare module "collision/ObjectCollisionMatrix" {
|
|
import type { Body } from "objects/Body";
|
|
export class ObjectCollisionMatrix {
|
|
matrix: Record<string, boolean>;
|
|
constructor();
|
|
get(bi: Body, bj: Body): boolean;
|
|
set(bi: Body, bj: Body, value: boolean): void;
|
|
reset(): void;
|
|
setNumObjects(n: number): void;
|
|
}
|
|
}
|
|
declare module "collision/GridBroadphase" {
|
|
import { Broadphase } from "collision/Broadphase";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
import type { World } from "world/World";
|
|
export class GridBroadphase extends Broadphase {
|
|
nx: number;
|
|
ny: number;
|
|
nz: number;
|
|
aabbMin: Vec3;
|
|
aabbMax: Vec3;
|
|
bins: Body[][];
|
|
binLengths: number[];
|
|
constructor(aabbMin?: Vec3, aabbMax?: Vec3, nx?: number, ny?: number, nz?: number);
|
|
collisionPairs(world: World, pairs1: Body[], pairs2: Body[]): void;
|
|
}
|
|
}
|
|
declare module "collision/SAPBroadphase" {
|
|
import { Broadphase } from "collision/Broadphase";
|
|
import type { AABB } from "collision/AABB";
|
|
import type { Body } from "objects/Body";
|
|
import type { World } from "world/World";
|
|
export class SAPBroadphase extends Broadphase {
|
|
axisList: Body[];
|
|
world: World | null;
|
|
axisIndex: 0 | 1 | 2;
|
|
private _addBodyHandler;
|
|
private _removeBodyHandler;
|
|
static checkBounds(bi: Body, bj: Body, axisIndex: 0 | 1 | 2): boolean;
|
|
static insertionSortX(a: Body[]): Body[];
|
|
static insertionSortY(a: Body[]): Body[];
|
|
static insertionSortZ(a: Body[]): Body[];
|
|
constructor(world: World);
|
|
setWorld(world: World): void;
|
|
collisionPairs(world: World, p1: Body[], p2: Body[]): void;
|
|
sortList(): void;
|
|
autoDetectAxis(): void;
|
|
aabbQuery(world: World, aabb: AABB, result?: Body[]): Body[];
|
|
}
|
|
}
|
|
declare module "constraints/PointToPointConstraint" {
|
|
import { Constraint } from "constraints/Constraint";
|
|
import { ContactEquation } from "equations/ContactEquation";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
export class PointToPointConstraint extends Constraint {
|
|
pivotA: Vec3;
|
|
pivotB: Vec3;
|
|
equationX: ContactEquation;
|
|
equationY: ContactEquation;
|
|
equationZ: ContactEquation;
|
|
constructor(bodyA: Body, pivotA: Vec3 | undefined, bodyB: Body, pivotB?: Vec3, maxForce?: number);
|
|
update(): void;
|
|
}
|
|
}
|
|
declare module "equations/ConeEquation" {
|
|
import { Vec3 } from "math/Vec3";
|
|
import { Equation } from "equations/Equation";
|
|
import type { Body } from "objects/Body";
|
|
export type ConeEquationOptions = ConstructorParameters<typeof ConeEquation>[2];
|
|
export class ConeEquation extends Equation {
|
|
axisA: Vec3;
|
|
axisB: Vec3;
|
|
angle: number;
|
|
constructor(bodyA: Body, bodyB: Body, options?: {
|
|
maxForce?: number;
|
|
axisA?: Vec3;
|
|
axisB?: Vec3;
|
|
angle?: number;
|
|
});
|
|
computeB(h: number): number;
|
|
}
|
|
}
|
|
declare module "equations/RotationalEquation" {
|
|
import { Equation } from "equations/Equation";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
export type RotationalEquationOptions = ConstructorParameters<typeof RotationalEquation>[2];
|
|
export class RotationalEquation extends Equation {
|
|
axisA: Vec3;
|
|
axisB: Vec3;
|
|
maxAngle: number;
|
|
constructor(bodyA: Body, bodyB: Body, options?: {
|
|
axisA?: Vec3;
|
|
axisB?: Vec3;
|
|
maxAngle?: number;
|
|
maxForce?: number;
|
|
});
|
|
computeB(h: number): number;
|
|
}
|
|
}
|
|
declare module "constraints/ConeTwistConstraint" {
|
|
import { PointToPointConstraint } from "constraints/PointToPointConstraint";
|
|
import { ConeEquation } from "equations/ConeEquation";
|
|
import { RotationalEquation } from "equations/RotationalEquation";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
export type ConeTwistConstraintOptions = ConstructorParameters<typeof ConeTwistConstraint>[2];
|
|
export class ConeTwistConstraint extends PointToPointConstraint {
|
|
axisA: Vec3;
|
|
axisB: Vec3;
|
|
angle: number;
|
|
twistAngle: number;
|
|
coneEquation: ConeEquation;
|
|
twistEquation: RotationalEquation;
|
|
constructor(bodyA: Body, bodyB: Body, options?: {
|
|
pivotA?: Vec3;
|
|
pivotB?: Vec3;
|
|
axisA?: Vec3;
|
|
axisB?: Vec3;
|
|
angle?: number;
|
|
twistAngle?: number;
|
|
maxForce?: number;
|
|
collideConnected?: boolean;
|
|
});
|
|
update(): void;
|
|
}
|
|
}
|
|
declare module "constraints/DistanceConstraint" {
|
|
import { Constraint } from "constraints/Constraint";
|
|
import { ContactEquation } from "equations/ContactEquation";
|
|
import type { Body } from "objects/Body";
|
|
export class DistanceConstraint extends Constraint {
|
|
distance: number;
|
|
distanceEquation: ContactEquation;
|
|
constructor(bodyA: Body, bodyB: Body, distance?: number, maxForce?: number);
|
|
update(): void;
|
|
}
|
|
}
|
|
declare module "equations/RotationalMotorEquation" {
|
|
import { Equation } from "equations/Equation";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
export class RotationalMotorEquation extends Equation {
|
|
axisA: Vec3;
|
|
axisB: Vec3;
|
|
targetVelocity: number;
|
|
constructor(bodyA: Body, bodyB: Body, maxForce?: number);
|
|
computeB(h: number): number;
|
|
}
|
|
}
|
|
declare module "constraints/LockConstraint" {
|
|
import { PointToPointConstraint } from "constraints/PointToPointConstraint";
|
|
import { RotationalEquation } from "equations/RotationalEquation";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
import type { RotationalMotorEquation } from "equations/RotationalMotorEquation";
|
|
export type LockConstraintOptions = ConstructorParameters<typeof LockConstraint>[2];
|
|
export class LockConstraint extends PointToPointConstraint {
|
|
xA: Vec3;
|
|
xB: Vec3;
|
|
yA: Vec3;
|
|
yB: Vec3;
|
|
zA: Vec3;
|
|
zB: Vec3;
|
|
rotationalEquation1: RotationalEquation;
|
|
rotationalEquation2: RotationalEquation;
|
|
rotationalEquation3: RotationalEquation;
|
|
motorEquation?: RotationalMotorEquation;
|
|
constructor(bodyA: Body, bodyB: Body, options?: {
|
|
maxForce?: number;
|
|
});
|
|
update(): void;
|
|
}
|
|
}
|
|
declare module "constraints/HingeConstraint" {
|
|
import { PointToPointConstraint } from "constraints/PointToPointConstraint";
|
|
import { RotationalEquation } from "equations/RotationalEquation";
|
|
import { RotationalMotorEquation } from "equations/RotationalMotorEquation";
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
export type HingeConstraintOptions = ConstructorParameters<typeof HingeConstraint>[2];
|
|
export class HingeConstraint extends PointToPointConstraint {
|
|
axisA: Vec3;
|
|
axisB: Vec3;
|
|
rotationalEquation1: RotationalEquation;
|
|
rotationalEquation2: RotationalEquation;
|
|
motorEquation: RotationalMotorEquation;
|
|
constructor(bodyA: Body, bodyB: Body, options?: {
|
|
pivotA?: Vec3;
|
|
pivotB?: Vec3;
|
|
axisA?: Vec3;
|
|
axisB?: Vec3;
|
|
collideConnected?: boolean;
|
|
maxForce?: number;
|
|
});
|
|
enableMotor(): void;
|
|
disableMotor(): void;
|
|
setMotorSpeed(speed: number): void;
|
|
setMotorMaxForce(maxForce: number): void;
|
|
update(): void;
|
|
}
|
|
}
|
|
declare module "objects/Spring" {
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
export type SpringOptions = ConstructorParameters<typeof Spring>[2];
|
|
export class Spring {
|
|
restLength: number;
|
|
stiffness: number;
|
|
damping: number;
|
|
bodyA: Body;
|
|
bodyB: Body;
|
|
localAnchorA: Vec3;
|
|
localAnchorB: Vec3;
|
|
constructor(bodyA: Body, bodyB: Body, options?: {
|
|
restLength?: number;
|
|
stiffness?: number;
|
|
damping?: number;
|
|
localAnchorA?: Vec3;
|
|
localAnchorB?: Vec3;
|
|
worldAnchorA?: Vec3;
|
|
worldAnchorB?: Vec3;
|
|
});
|
|
setWorldAnchorA(worldAnchorA: Vec3): void;
|
|
setWorldAnchorB(worldAnchorB: Vec3): void;
|
|
getWorldAnchorA(result: Vec3): void;
|
|
getWorldAnchorB(result: Vec3): void;
|
|
applyForce(): void;
|
|
}
|
|
}
|
|
declare module "objects/WheelInfo" {
|
|
import { Vec3 } from "math/Vec3";
|
|
import { Transform } from "math/Transform";
|
|
import { RaycastResult } from "collision/RaycastResult";
|
|
import type { Body } from "objects/Body";
|
|
export type WheelInfoOptions = ConstructorParameters<typeof WheelInfo>[0];
|
|
export type WheelRaycastResult = RaycastResult & Partial<{
|
|
suspensionLength: number;
|
|
directionWorld: Vec3;
|
|
groundObject: number;
|
|
}>;
|
|
export class WheelInfo {
|
|
maxSuspensionTravel: number;
|
|
customSlidingRotationalSpeed: number;
|
|
useCustomSlidingRotationalSpeed: boolean;
|
|
sliding: boolean;
|
|
chassisConnectionPointLocal: Vec3;
|
|
chassisConnectionPointWorld: Vec3;
|
|
directionLocal: Vec3;
|
|
directionWorld: Vec3;
|
|
axleLocal: Vec3;
|
|
axleWorld: Vec3;
|
|
suspensionRestLength: number;
|
|
suspensionMaxLength: number;
|
|
radius: number;
|
|
suspensionStiffness: number;
|
|
dampingCompression: number;
|
|
dampingRelaxation: number;
|
|
frictionSlip: number;
|
|
forwardAcceleration: number;
|
|
sideAcceleration: number;
|
|
steering: number;
|
|
rotation: number;
|
|
deltaRotation: number;
|
|
rollInfluence: number;
|
|
maxSuspensionForce: number;
|
|
engineForce: number;
|
|
brake: number;
|
|
isFrontWheel: boolean;
|
|
clippedInvContactDotSuspension: number;
|
|
suspensionRelativeVelocity: number;
|
|
suspensionForce: number;
|
|
slipInfo: number;
|
|
skidInfo: number;
|
|
suspensionLength: number;
|
|
sideImpulse: number;
|
|
forwardImpulse: number;
|
|
raycastResult: WheelRaycastResult;
|
|
worldTransform: Transform;
|
|
isInContact: boolean;
|
|
constructor(options?: {
|
|
chassisConnectionPointLocal?: Vec3;
|
|
chassisConnectionPointWorld?: Vec3;
|
|
directionLocal?: Vec3;
|
|
directionWorld?: Vec3;
|
|
axleLocal?: Vec3;
|
|
axleWorld?: Vec3;
|
|
suspensionRestLength?: number;
|
|
suspensionMaxLength?: number;
|
|
radius?: number;
|
|
suspensionStiffness?: number;
|
|
dampingCompression?: number;
|
|
dampingRelaxation?: number;
|
|
frictionSlip?: number;
|
|
forwardAcceleration?: number;
|
|
sideAcceleration?: number;
|
|
steering?: number;
|
|
rotation?: number;
|
|
deltaRotation?: number;
|
|
rollInfluence?: number;
|
|
maxSuspensionForce?: number;
|
|
isFrontWheel?: boolean;
|
|
clippedInvContactDotSuspension?: number;
|
|
suspensionRelativeVelocity?: number;
|
|
suspensionForce?: number;
|
|
slipInfo?: number;
|
|
skidInfo?: number;
|
|
suspensionLength?: number;
|
|
maxSuspensionTravel?: number;
|
|
useCustomSlidingRotationalSpeed?: boolean;
|
|
customSlidingRotationalSpeed?: number;
|
|
});
|
|
updateWheel(chassis: Body): void;
|
|
}
|
|
}
|
|
declare module "objects/RaycastVehicle" {
|
|
import type { Body } from "objects/Body";
|
|
import { WheelInfo } from "objects/WheelInfo";
|
|
import type { WheelInfoOptions } from "objects/WheelInfo";
|
|
import type { Transform } from "math/Transform";
|
|
import type { Constraint } from "constraints/Constraint";
|
|
import type { World } from "world/World";
|
|
export type RaycastVehicleOptions = ConstructorParameters<typeof RaycastVehicle>[0];
|
|
export class RaycastVehicle {
|
|
chassisBody: Body;
|
|
wheelInfos: WheelInfo[];
|
|
sliding: boolean;
|
|
world: World | null;
|
|
indexRightAxis: number;
|
|
indexForwardAxis: number;
|
|
indexUpAxis: number;
|
|
constraints: Constraint[];
|
|
preStepCallback: () => void;
|
|
currentVehicleSpeedKmHour: number;
|
|
numWheelsOnGround: number;
|
|
constructor(options: {
|
|
chassisBody: Body;
|
|
indexRightAxis?: number;
|
|
indexForwardAxis?: number;
|
|
indexUpAxis?: number;
|
|
});
|
|
addWheel(options?: WheelInfoOptions): number;
|
|
setSteeringValue(value: number, wheelIndex: number): void;
|
|
applyEngineForce(value: number, wheelIndex: number): void;
|
|
setBrake(brake: number, wheelIndex: number): void;
|
|
addToWorld(world: World): void;
|
|
private getVehicleAxisWorld;
|
|
updateVehicle(timeStep: number): void;
|
|
updateSuspension(deltaTime: number): void;
|
|
removeFromWorld(world: World): void;
|
|
castRay(wheel: WheelInfo): number;
|
|
updateWheelTransformWorld(wheel: WheelInfo): void;
|
|
updateWheelTransform(wheelIndex: number): void;
|
|
getWheelTransformWorld(wheelIndex: number): Transform;
|
|
updateFriction(timeStep: number): void;
|
|
}
|
|
}
|
|
declare module "objects/RigidVehicle" {
|
|
import { Vec3 } from "math/Vec3";
|
|
import { Body } from "objects/Body";
|
|
import { HingeConstraint } from "constraints/HingeConstraint";
|
|
import type { World } from "world/World";
|
|
export type RigidVehicleOptions = ConstructorParameters<typeof RigidVehicle>[0];
|
|
export class RigidVehicle {
|
|
wheelBodies: Body[];
|
|
coordinateSystem: Vec3;
|
|
chassisBody: Body;
|
|
constraints: (HingeConstraint & {
|
|
motorTargetVelocity?: number;
|
|
})[];
|
|
wheelAxes: Vec3[];
|
|
wheelForces: number[];
|
|
constructor(options?: {
|
|
coordinateSystem?: Vec3;
|
|
chassisBody?: Body;
|
|
});
|
|
addWheel(options?: {
|
|
body?: Body;
|
|
position?: Vec3;
|
|
axis?: Vec3;
|
|
direction?: Vec3;
|
|
}): number;
|
|
setSteeringValue(value: number, wheelIndex: number): void;
|
|
setMotorSpeed(value: number, wheelIndex: number): void;
|
|
disableMotor(wheelIndex: number): void;
|
|
setWheelForce(value: number, wheelIndex: number): void;
|
|
applyWheelForce(value: number, wheelIndex: number): void;
|
|
addToWorld(world: World): void;
|
|
private _update;
|
|
removeFromWorld(world: World): void;
|
|
getWheelSpeed(wheelIndex: number): number;
|
|
}
|
|
}
|
|
declare module "objects/SPHSystem" {
|
|
import { Vec3 } from "math/Vec3";
|
|
import type { Body } from "objects/Body";
|
|
export class SPHSystem {
|
|
particles: Body[];
|
|
density: number;
|
|
smoothingRadius: number;
|
|
speedOfSound: number;
|
|
viscosity: number;
|
|
eps: number;
|
|
pressures: number[];
|
|
densities: number[];
|
|
neighbors: Body[][];
|
|
constructor();
|
|
add(particle: Body): void;
|
|
remove(particle: Body): void;
|
|
getNeighbors(particle: Body, neighbors: Body[]): void;
|
|
update(): void;
|
|
w(r: number): number;
|
|
gradw(rVec: Vec3, resultVec: Vec3): void;
|
|
nablaw(r: number): number;
|
|
}
|
|
}
|
|
declare module "solver/SplitSolver" {
|
|
import { Solver } from "solver/Solver";
|
|
import { Body } from "objects/Body";
|
|
import type { Equation } from "equations/Equation";
|
|
import type { World } from "world/World";
|
|
import { GSSolver } from "solver/GSSolver";
|
|
type SplitSolverNode = {
|
|
body: Body | null;
|
|
children: SplitSolverNode[];
|
|
eqs: Equation[];
|
|
visited: boolean;
|
|
};
|
|
export class SplitSolver extends Solver {
|
|
iterations: number;
|
|
tolerance: number;
|
|
subsolver: GSSolver;
|
|
nodes: SplitSolverNode[];
|
|
nodePool: SplitSolverNode[];
|
|
constructor(subsolver: GSSolver);
|
|
createNode(): SplitSolverNode;
|
|
solve(dt: number, world: World): number;
|
|
}
|
|
}
|
|
declare module "cannon-es" {
|
|
export * from "collision/ObjectCollisionMatrix";
|
|
export * from "collision/AABB";
|
|
export * from "collision/ArrayCollisionMatrix";
|
|
export * from "collision/Broadphase";
|
|
export * from "collision/GridBroadphase";
|
|
export * from "collision/NaiveBroadphase";
|
|
export * from "collision/Ray";
|
|
export * from "collision/RaycastResult";
|
|
export * from "collision/SAPBroadphase";
|
|
export * from "constraints/ConeTwistConstraint";
|
|
export * from "constraints/Constraint";
|
|
export * from "constraints/DistanceConstraint";
|
|
export * from "constraints/LockConstraint";
|
|
export * from "constraints/PointToPointConstraint";
|
|
export * from "constraints/HingeConstraint";
|
|
export * from "equations/ContactEquation";
|
|
export * from "equations/Equation";
|
|
export * from "equations/FrictionEquation";
|
|
export * from "equations/RotationalEquation";
|
|
export * from "equations/RotationalMotorEquation";
|
|
export * from "material/ContactMaterial";
|
|
export * from "material/Material";
|
|
export * from "math/Quaternion";
|
|
export * from "math/Mat3";
|
|
export * from "math/Transform";
|
|
export * from "math/Vec3";
|
|
export * from "math/JacobianElement";
|
|
export * from "objects/Body";
|
|
export * from "objects/Spring";
|
|
export * from "objects/RaycastVehicle";
|
|
export * from "objects/WheelInfo";
|
|
export * from "objects/RigidVehicle";
|
|
export * from "objects/SPHSystem";
|
|
export * from "shapes/Box";
|
|
export * from "shapes/ConvexPolyhedron";
|
|
export * from "shapes/Cylinder";
|
|
export * from "shapes/Particle";
|
|
export * from "shapes/Plane";
|
|
export * from "shapes/Shape";
|
|
export * from "shapes/Sphere";
|
|
export * from "shapes/Heightfield";
|
|
export * from "shapes/Trimesh";
|
|
export * from "solver/GSSolver";
|
|
export * from "solver/Solver";
|
|
export * from "solver/SplitSolver";
|
|
export * from "utils/Pool";
|
|
export * from "utils/EventTarget";
|
|
export * from "utils/Vec3Pool";
|
|
export * from "world/Narrowphase";
|
|
export * from "world/World";
|
|
}
|