@pmndrs/cannon-worker-api
Version:
An API to use cannon-es in a web worker
80 lines (71 loc) • 2.44 kB
text/typescript
import type { MaterialOptions } from 'cannon-es'
import type { Vector3 } from 'three'
import type { CollideBeginEvent, CollideEndEvent, CollideEvent, Quad, Triplet, VectorName } from './types'
export type AtomicProps = {
allowSleep: boolean
angularDamping: number
collisionFilterGroup: number
collisionFilterMask: number
collisionResponse: boolean
fixedRotation: boolean
isTrigger: boolean
linearDamping: number
mass: number
material: MaterialOptions
sleepSpeedLimit: number
sleepTimeLimit: number
userData: Record<PropertyKey, any>
}
export type VectorProps = Record<VectorName, Triplet>
type VectorTypes = Vector3 | Triplet
export type BodyProps<T extends any[] = unknown[]> = Partial<AtomicProps> &
Partial<VectorProps> & {
args?: T
onCollide?: (e: CollideEvent) => void
onCollideBegin?: (e: CollideBeginEvent) => void
onCollideEnd?: (e: CollideEndEvent) => void
/**
* Quaternion is preferred over rotation if both are provided
*/
quaternion?: Quad
rotation?: Triplet
type?: 'Dynamic' | 'Static' | 'Kinematic'
}
export type BodyPropsArgsRequired<T extends any[] = unknown[]> = BodyProps<T> & {
args: T
}
export type ShapeType =
| 'Box'
| 'ConvexPolyhedron'
| 'Cylinder'
| 'Heightfield'
| 'Particle'
| 'Plane'
| 'Sphere'
| 'Trimesh'
export type BodyShapeType = ShapeType | 'Compound'
export type CylinderArgs = [radiusTop?: number, radiusBottom?: number, height?: number, numSegments?: number]
export type SphereArgs = [radius: number]
export type TrimeshArgs = [vertices: ArrayLike<number>, indices: ArrayLike<number>]
export type HeightfieldArgs = [
data: number[][],
options: { elementSize?: number; maxValue?: number; minValue?: number },
]
export type ConvexPolyhedronArgs<V extends VectorTypes = VectorTypes> = [
vertices?: V[],
faces?: number[][],
normals?: V[],
axes?: V[],
boundingSphereRadius?: number,
]
export type PlaneProps = BodyProps
export type BoxProps = BodyProps<Triplet>
export type CylinderProps = BodyProps<CylinderArgs>
export type ParticleProps = BodyProps
export type SphereProps = BodyProps<SphereArgs>
export type TrimeshProps = BodyPropsArgsRequired<TrimeshArgs>
export type HeightfieldProps = BodyPropsArgsRequired<HeightfieldArgs>
export type ConvexPolyhedronProps = BodyProps<ConvexPolyhedronArgs>
export interface CompoundBodyProps extends BodyProps {
shapes: BodyProps & { type: ShapeType }[]
}