UNPKG

@dimforge/rapier2d-compat

Version:

2-dimensional physics engine in Rust - official JS bindings. Compatibility package with inlined webassembly as base64.

462 lines (461 loc) 15.9 kB
import { Vector, Rotation } from "../math"; import { RawColliderSet, RawShape } from "../raw"; import { ShapeContact } from "./contact"; import { PointProjection } from "./point"; import { Ray, RayIntersection } from "./ray"; import { ShapeCastHit } from "./toi"; import { ColliderHandle } from "./collider"; export declare abstract class Shape { abstract intoRaw(): RawShape; /** * The concrete type of this shape. */ abstract get type(): ShapeType; /** * instant mode without cache */ static fromRaw(rawSet: RawColliderSet, handle: ColliderHandle): Shape; /** * Computes the time of impact between two moving shapes. * @param shapePos1 - The initial position of this sahpe. * @param shapeRot1 - The rotation of this shape. * @param shapeVel1 - The velocity of this shape. * @param shape2 - The second moving shape. * @param shapePos2 - The initial position of the second shape. * @param shapeRot2 - The rotation of the second shape. * @param shapeVel2 - The velocity of the second shape. * @param targetDistance − If the shape moves closer to this distance from a collider, a hit * will be returned. * @param maxToi - The maximum time when the impact can happen. * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if * the shape is penetrating another shape at its starting point **and** its trajectory is such * that it’s on a path to exit that penetration state. * @returns If the two moving shapes collider at some point along their trajectories, this returns the * time at which the two shape collider as well as the contact information during the impact. Returns * `null`if the two shapes never collide along their paths. */ castShape(shapePos1: Vector, shapeRot1: Rotation, shapeVel1: Vector, shape2: Shape, shapePos2: Vector, shapeRot2: Rotation, shapeVel2: Vector, targetDistance: number, maxToi: number, stopAtPenetration: boolean): ShapeCastHit | null; /** * Tests if this shape intersects another shape. * * @param shapePos1 - The position of this shape. * @param shapeRot1 - The rotation of this shape. * @param shape2 - The second shape to test. * @param shapePos2 - The position of the second shape. * @param shapeRot2 - The rotation of the second shape. * @returns `true` if the two shapes intersect, `false` if they don’t. */ intersectsShape(shapePos1: Vector, shapeRot1: Rotation, shape2: Shape, shapePos2: Vector, shapeRot2: Rotation): boolean; /** * Computes one pair of contact points between two shapes. * * @param shapePos1 - The initial position of this sahpe. * @param shapeRot1 - The rotation of this shape. * @param shape2 - The second shape. * @param shapePos2 - The initial position of the second shape. * @param shapeRot2 - The rotation of the second shape. * @param prediction - The prediction value, if the shapes are separated by a distance greater than this value, test will fail. * @returns `null` if the shapes are separated by a distance greater than prediction, otherwise contact details. The result is given in world-space. */ contactShape(shapePos1: Vector, shapeRot1: Rotation, shape2: Shape, shapePos2: Vector, shapeRot2: Rotation, prediction: number): ShapeContact | null; containsPoint(shapePos: Vector, shapeRot: Rotation, point: Vector): boolean; projectPoint(shapePos: Vector, shapeRot: Rotation, point: Vector, solid: boolean): PointProjection; intersectsRay(ray: Ray, shapePos: Vector, shapeRot: Rotation, maxToi: number): boolean; castRay(ray: Ray, shapePos: Vector, shapeRot: Rotation, maxToi: number, solid: boolean): number; castRayAndGetNormal(ray: Ray, shapePos: Vector, shapeRot: Rotation, maxToi: number, solid: boolean): RayIntersection; } /** * An enumeration representing the type of a shape. */ export declare enum ShapeType { Ball = 0, Cuboid = 1, Capsule = 2, Segment = 3, Polyline = 4, Triangle = 5, TriMesh = 6, HeightField = 7, ConvexPolygon = 9, RoundCuboid = 10, RoundTriangle = 11, RoundConvexPolygon = 12, HalfSpace = 13, Voxels = 14 } /** * Flags controlling the behavior of the triangle mesh creation and of some * operations involving triangle meshes. */ export declare enum TriMeshFlags { /** * If set, any triangle that results in a failing half-hedge topology computation will be deleted. */ DELETE_BAD_TOPOLOGY_TRIANGLES = 4, /** * If set, the trimesh will be assumed to be oriented (with outward normals). * * The pseudo-normals of its vertices and edges will be computed. */ ORIENTED = 8, /** * If set, the duplicate vertices of the trimesh will be merged. * * Two vertices with the exact same coordinates will share the same entry on the * vertex buffer and the index buffer is adjusted accordingly. */ MERGE_DUPLICATE_VERTICES = 16, /** * If set, the triangles sharing two vertices with identical index values will be removed. * * Because of the way it is currently implemented, this methods implies that duplicate * vertices will be merged. It will no longer be the case in the future once we decouple * the computations. */ DELETE_DEGENERATE_TRIANGLES = 32, /** * If set, two triangles sharing three vertices with identical index values (in any order) * will be removed. * * Because of the way it is currently implemented, this methods implies that duplicate * vertices will be merged. It will no longer be the case in the future once we decouple * the computations. */ DELETE_DUPLICATE_TRIANGLES = 64, /** * If set, a special treatment will be applied to contact manifold calculation to eliminate * or fix contacts normals that could lead to incorrect bumps in physics simulation * (especially on flat surfaces). * * This is achieved by taking into account adjacent triangle normals when computing contact * points for a given triangle. * * /!\ NOT SUPPORTED IN THE 2D VERSION OF RAPIER. */ FIX_INTERNAL_EDGES = 144 } /** * A shape that is a sphere in 3D and a circle in 2D. */ export declare class Ball extends Shape { readonly type = ShapeType.Ball; /** * The balls radius. */ radius: number; /** * Creates a new ball with the given radius. * @param radius - The balls radius. */ constructor(radius: number); intoRaw(): RawShape; } export declare class HalfSpace extends Shape { readonly type = ShapeType.HalfSpace; /** * The outward normal of the half-space. */ normal: Vector; /** * Creates a new halfspace delimited by an infinite plane. * * @param normal - The outward normal of the plane. */ constructor(normal: Vector); intoRaw(): RawShape; } /** * A shape that is a box in 3D and a rectangle in 2D. */ export declare class Cuboid extends Shape { readonly type = ShapeType.Cuboid; /** * The half extent of the cuboid along each coordinate axis. */ halfExtents: Vector; /** * Creates a new 2D rectangle. * @param hx - The half width of the rectangle. * @param hy - The helf height of the rectangle. */ constructor(hx: number, hy: number); intoRaw(): RawShape; } /** * A shape that is a box in 3D and a rectangle in 2D, with round corners. */ export declare class RoundCuboid extends Shape { readonly type = ShapeType.RoundCuboid; /** * The half extent of the cuboid along each coordinate axis. */ halfExtents: Vector; /** * The radius of the cuboid's round border. */ borderRadius: number; /** * Creates a new 2D rectangle. * @param hx - The half width of the rectangle. * @param hy - The helf height of the rectangle. * @param borderRadius - The radius of the borders of this cuboid. This will * effectively increase the half-extents of the cuboid by this radius. */ constructor(hx: number, hy: number, borderRadius: number); intoRaw(): RawShape; } /** * A shape that is a capsule. */ export declare class Capsule extends Shape { readonly type = ShapeType.Capsule; /** * The radius of the capsule's basis. */ radius: number; /** * The capsule's half height, along the `y` axis. */ halfHeight: number; /** * Creates a new capsule with the given radius and half-height. * @param halfHeight - The balls half-height along the `y` axis. * @param radius - The balls radius. */ constructor(halfHeight: number, radius: number); intoRaw(): RawShape; } /** * A shape that is a segment. */ export declare class Segment extends Shape { readonly type = ShapeType.Segment; /** * The first point of the segment. */ a: Vector; /** * The second point of the segment. */ b: Vector; /** * Creates a new segment shape. * @param a - The first point of the segment. * @param b - The second point of the segment. */ constructor(a: Vector, b: Vector); intoRaw(): RawShape; } /** * A shape that is a segment. */ export declare class Triangle extends Shape { readonly type = ShapeType.Triangle; /** * The first point of the triangle. */ a: Vector; /** * The second point of the triangle. */ b: Vector; /** * The second point of the triangle. */ c: Vector; /** * Creates a new triangle shape. * * @param a - The first point of the triangle. * @param b - The second point of the triangle. * @param c - The third point of the triangle. */ constructor(a: Vector, b: Vector, c: Vector); intoRaw(): RawShape; } /** * A shape that is a triangle with round borders and a non-zero thickness. */ export declare class RoundTriangle extends Shape { readonly type = ShapeType.RoundTriangle; /** * The first point of the triangle. */ a: Vector; /** * The second point of the triangle. */ b: Vector; /** * The second point of the triangle. */ c: Vector; /** * The radius of the triangles's rounded edges and vertices. * In 3D, this is also equal to half the thickness of the round triangle. */ borderRadius: number; /** * Creates a new triangle shape with round corners. * * @param a - The first point of the triangle. * @param b - The second point of the triangle. * @param c - The third point of the triangle. * @param borderRadius - The radius of the borders of this triangle. In 3D, * this is also equal to half the thickness of the triangle. */ constructor(a: Vector, b: Vector, c: Vector, borderRadius: number); intoRaw(): RawShape; } /** * A shape that is a triangle mesh. */ export declare class Polyline extends Shape { readonly type = ShapeType.Polyline; /** * The vertices of the polyline. */ vertices: Float32Array; /** * The indices of the segments. */ indices: Uint32Array; /** * Creates a new polyline shape. * * @param vertices - The coordinates of the polyline's vertices. * @param indices - The indices of the polyline's segments. If this is `null` or not provided, then * the vertices are assumed to form a line strip. */ constructor(vertices: Float32Array, indices?: Uint32Array); intoRaw(): RawShape; } /** * A shape made of voxels. */ export declare class Voxels extends Shape { readonly type = ShapeType.Voxels; /** * The points or grid coordinates used to initialize the voxels. */ data: Float32Array | Int32Array; /** * The dimensions of each voxel. */ voxelSize: Vector; /** * Creates a new shape made of voxels. * * @param data - Defines the set of voxels. If this is a `Int32Array` then * each voxel is defined from its (signed) grid coordinates, * with 3 (resp 2) contiguous integers per voxel in 3D (resp 2D). * If this is a `Float32Array`, each voxel will be such that * they contain at least one point from this array (where each * point is defined from 3 (resp 2) contiguous numbers per point * in 3D (resp 2D). * @param voxelSize - The size of each voxel. */ constructor(data: Float32Array | Int32Array, voxelSize: Vector); intoRaw(): RawShape; } /** * A shape that is a triangle mesh. */ export declare class TriMesh extends Shape { readonly type = ShapeType.TriMesh; /** * The vertices of the triangle mesh. */ vertices: Float32Array; /** * The indices of the triangles. */ indices: Uint32Array; /** * The triangle mesh flags. */ flags: TriMeshFlags; /** * Creates a new triangle mesh shape. * * @param vertices - The coordinates of the triangle mesh's vertices. * @param indices - The indices of the triangle mesh's triangles. */ constructor(vertices: Float32Array, indices: Uint32Array, flags?: TriMeshFlags); intoRaw(): RawShape; } /** * A shape that is a convex polygon. */ export declare class ConvexPolygon extends Shape { readonly type = ShapeType.ConvexPolygon; /** * The vertices of the convex polygon. */ vertices: Float32Array; /** * Do we want to assume the vertices already form a convex hull? */ skipConvexHullComputation: boolean; /** * Creates a new convex polygon shape. * * @param vertices - The coordinates of the convex polygon's vertices. * @param skipConvexHullComputation - If set to `true`, the input points will * be assumed to form a convex polyline and no convex-hull computation will * be done automatically. */ constructor(vertices: Float32Array, skipConvexHullComputation: boolean); intoRaw(): RawShape; } /** * A shape that is a convex polygon. */ export declare class RoundConvexPolygon extends Shape { readonly type = ShapeType.RoundConvexPolygon; /** * The vertices of the convex polygon. */ vertices: Float32Array; /** * Do we want to assume the vertices already form a convex hull? */ skipConvexHullComputation: boolean; /** * The radius of the convex polygon's rounded edges and vertices. */ borderRadius: number; /** * Creates a new convex polygon shape. * * @param vertices - The coordinates of the convex polygon's vertices. * @param borderRadius - The radius of the borders of this convex polygon. * @param skipConvexHullComputation - If set to `true`, the input points will * be assumed to form a convex polyline and no convex-hull computation will * be done automatically. */ constructor(vertices: Float32Array, borderRadius: number, skipConvexHullComputation: boolean); intoRaw(): RawShape; } /** * A shape that is a heightfield. */ export declare class Heightfield extends Shape { readonly type = ShapeType.HeightField; /** * The heights of the heightfield, along its local `y` axis. */ heights: Float32Array; /** * The heightfield's length along its local `x` axis. */ scale: Vector; /** * Creates a new heightfield shape. * * @param heights - The heights of the heightfield, along its local `y` axis. * @param scale - The scale factor applied to the heightfield. */ constructor(heights: Float32Array, scale: Vector); intoRaw(): RawShape; }