@react-three/p2
Version:
2D physics based hooks for react-three-fiber
246 lines (245 loc) • 10.9 kB
TypeScript
import { Object3D } from 'three';
import type { Quaternion } from 'three';
import type { ContactMaterialOptions } from 'p2-es';
import type { DependencyList, Ref, RefObject } from 'react';
import type { AddRayMessage, AtomicName, CollideBeginEvent, CollideEndEvent, CollideEvent, RayhitEvent, VectorName } from './setup';
export declare type AtomicProps = {
allowSleep: boolean;
angle: number;
angularDamping: number;
collisionFilterGroup: number;
collisionFilterMask: number;
collisionResponse: number;
fixedRotation: boolean;
isTrigger: boolean;
linearDamping: number;
mass: number;
material: ContactMaterialOptions;
sleepSpeedLimit: number;
sleepTimeLimit: number;
userData: {};
};
export declare type Duplet = [x: number, y: number];
export declare type VectorProps = Record<VectorName, Duplet>;
export declare type Quad = [x: number, y: number, z: number, w: number];
export declare 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?: Quad;
angle?: number;
type?: 'Dynamic' | 'Static' | 'Kinematic';
};
export declare type BodyPropsArgsRequired<T extends any[] = unknown[]> = BodyProps<T> & {
args: T;
};
export declare type ShapeType = 'Box' | 'Circle' | 'Capsule' | 'Particle' | 'Plane' | 'Convex' | 'Line' | 'Heightfield';
export declare type BodyShapeType = ShapeType | 'Compound';
export declare type BoxArgs = [width?: number, height?: number];
export declare type CapsuleArgs = [length?: number, radius?: number];
export declare type CircleArgs = [radius?: number];
export declare type ConvexArgs = [vertices: number[][], axes?: number[][]];
export declare type LineArgs = [length?: number];
export declare type HeightfieldArgs = [heights: number[], options?: {
elementWidth?: number;
maxValue?: number;
minValue?: number;
}];
export declare type BoxProps = BodyProps<BoxArgs>;
export declare type CapsuleProps = BodyProps<CapsuleArgs>;
export declare type CircleProps = BodyProps<CircleArgs>;
export declare type ConvexProps = BodyProps<ConvexArgs>;
export declare type LineProps = BodyProps<LineArgs>;
export declare type HeightfieldProps = BodyPropsArgsRequired<HeightfieldArgs>;
export interface CompoundBodyProps extends BodyProps {
shapes: BodyProps & {
type: ShapeType;
}[];
}
export declare type AtomicApi<K extends AtomicName> = {
set: (value: AtomicProps[K]) => void;
subscribe: (callback: (value: AtomicProps[K]) => void) => () => void;
};
export declare type QuaternionApi = {
set: (x: number, y: number, z: number, w: number) => void;
copy: ({ w, x, y, z }: Quaternion) => void;
subscribe: (callback: (value: Quad) => void) => () => void;
};
export declare type AngleApi = {
set: (angle: number) => void;
copy: (angle: number) => void;
subscribe: (callback: (value: number) => void) => () => void;
};
export declare type VectorApi = {
set: (x: number, y: number) => void;
copy: (array: Duplet) => void;
subscribe: (callback: (value: Duplet) => void) => () => void;
};
export declare type WorkerApi = {
[K in AtomicName]: AtomicApi<K>;
} & {
[K in VectorName]: VectorApi;
} & {
applyForce: (force: Duplet, worldPoint: Duplet) => void;
applyImpulse: (impulse: Duplet, worldPoint: Duplet) => void;
applyLocalForce: (force: Duplet, localPoint: Duplet) => void;
applyLocalImpulse: (impulse: Duplet, localPoint: Duplet) => void;
applyTorque: (torque: Duplet) => void;
quaternion: QuaternionApi;
angle: AngleApi;
sleep: () => void;
wakeUp: () => void;
};
export interface PublicApi extends WorkerApi {
at: (index: number) => WorkerApi;
}
export declare type Api = [RefObject<Object3D>, PublicApi];
export declare type ConstraintTypes = 'Distance' | 'Gear' | 'Lock' | 'Prismatic' | 'Revolute';
export interface ConstraintOptns {
collideConnected?: boolean;
}
export interface DistanceConstraintOpts extends ConstraintOptns {
distance?: number;
localAnchorA?: Duplet;
localAnchorB?: Duplet;
maxForce?: number;
}
export interface GearConstraintOpts extends ConstraintOptns {
angle?: number;
ratio?: number;
maxTorque?: number;
}
export interface LockConstraintOpts extends ConstraintOptns {
localOffsetB?: Duplet;
localAngleB?: number;
maxForce?: number;
}
export interface PrismaticConstraintOpts extends ConstraintOptns {
maxForce?: number;
localAnchorA?: Duplet;
localAnchorB?: Duplet;
localAxisA?: Duplet;
disableRotationalLock?: boolean;
upperLimit?: number;
lowerLimit?: number;
}
export interface RevoluteConstraintOpts extends ConstraintOptns {
worldPivot?: Duplet;
localPivotA?: Duplet;
localPivotB?: Duplet;
maxForce?: number;
}
export interface SpringOptns {
restLength?: number;
stiffness?: number;
damping?: number;
worldAnchorA?: Duplet;
worldAnchorB?: Duplet;
localAnchorA?: Duplet;
localAnchorB?: Duplet;
}
declare type GetByIndex<T extends BodyProps> = (index: number) => T;
export declare function useBox(fn: GetByIndex<BoxProps>, fwdRef?: Ref<Object3D>, deps?: DependencyList): Api;
export declare function useCapsule(fn: GetByIndex<CapsuleProps>, fwdRef?: Ref<Object3D>, deps?: DependencyList): Api;
export declare function useCircle(fn: GetByIndex<CircleProps>, fwdRef?: Ref<Object3D>, deps?: DependencyList): Api;
export declare function useConvex(fn: GetByIndex<ConvexProps>, fwdRef?: Ref<Object3D>, deps?: DependencyList): Api;
export declare function useHeightfield(fn: GetByIndex<HeightfieldProps>, fwdRef?: Ref<Object3D>, deps?: DependencyList): Api;
export declare function useLine(fn: GetByIndex<LineProps>, fwdRef?: Ref<Object3D>, deps?: DependencyList): Api;
export declare function useParticle(fn: GetByIndex<BodyProps>, fwdRef?: Ref<Object3D>, deps?: DependencyList): Api;
export declare function usePlane(fn: GetByIndex<BodyProps>, fwdRef?: Ref<Object3D>, deps?: DependencyList): Api;
export declare function useCompoundBody(fn: GetByIndex<CompoundBodyProps>, fwdRef?: Ref<Object3D>, deps?: DependencyList): Api;
declare type ConstraintApi = [
RefObject<Object3D>,
RefObject<Object3D>,
{
enable: () => void;
disable: () => void;
}
];
declare type SpringApi = [
RefObject<Object3D>,
RefObject<Object3D>,
{
setStiffness: (value: number) => void;
setRestLength: (value: number) => void;
setDamping: (value: number) => void;
}
];
export declare function useDistanceConstraint(bodyA: Ref<Object3D<import("three").Event>> | undefined, bodyB: Ref<Object3D<import("three").Event>> | undefined, optns: DistanceConstraintOpts, deps?: DependencyList): ConstraintApi;
export declare function useGearConstraint(bodyA: Ref<Object3D<import("three").Event>> | undefined, bodyB: Ref<Object3D<import("three").Event>> | undefined, optns: GearConstraintOpts, deps?: DependencyList): ConstraintApi;
export declare function useLockConstraint(bodyA: Ref<Object3D<import("three").Event>> | undefined, bodyB: Ref<Object3D<import("three").Event>> | undefined, optns: LockConstraintOpts, deps?: DependencyList): ConstraintApi;
export declare function usePrismaticConstraint(bodyA: Ref<Object3D<import("three").Event>> | undefined, bodyB: Ref<Object3D<import("three").Event>> | undefined, optns: PrismaticConstraintOpts, deps?: DependencyList): ConstraintApi;
export declare function useRevoluteConstraint(bodyA: Ref<Object3D<import("three").Event>> | undefined, bodyB: Ref<Object3D<import("three").Event>> | undefined, optns: RevoluteConstraintOpts, deps?: DependencyList): ConstraintApi;
export declare function useSpring(bodyA: Ref<Object3D<import("three").Event>> | undefined, bodyB: Ref<Object3D<import("three").Event>> | undefined, optns: SpringOptns, deps?: DependencyList): SpringApi;
declare type RayOptions = Omit<AddRayMessage['props'], 'mode'>;
export declare function useRaycastClosest(options: RayOptions, callback: (e: RayhitEvent) => void, deps?: DependencyList): void;
export declare function useRaycastAny(options: RayOptions, callback: (e: RayhitEvent) => void, deps?: DependencyList): void;
export declare function useRaycastAll(options: RayOptions, callback: (e: RayhitEvent) => void, deps?: DependencyList): void;
export interface TopDownVehiclePublicApi {
applyEngineForce: (value: number, wheelIndex: number) => void;
setBrake: (brake: number, wheelIndex: number) => void;
setSteeringValue: (value: number, wheelIndex: number) => void;
}
export interface WheelInfoOptions {
localPosition?: Duplet;
sideFriction?: number;
}
export interface TopDownVehicleProps {
chassisBody: Ref<Object3D>;
wheelInfos: WheelInfoOptions[];
indexForwardAxis?: number;
indexRightAxis?: number;
indexUpAxis?: number;
}
export declare function useTopDownVehicle(fn: () => TopDownVehicleProps, fwdRef?: Ref<Object3D>, deps?: DependencyList): [RefObject<Object3D>, TopDownVehiclePublicApi];
export interface KinematicCharacterControllerPublicApi {
setJump: (isDown: boolean) => void;
setInput: (input: [x: number, y: number]) => void;
collisions: {
subscribe: (callback: (collisions: {}) => void) => void;
};
raysData: {
subscribe: (callback: (raysData: {}) => void) => void;
};
}
export interface KinematicCharacterControllerProps {
body: Ref<Object3D>;
collisionMask: number;
accelerationTimeAirborne?: number;
accelerationTimeGrounded?: number;
moveSpeed?: number;
wallSlideSpeedMax?: number;
wallStickTime?: number;
wallJumpClimb?: Duplet;
wallJumpOff?: Duplet;
wallLeap?: Duplet;
timeToJumpApex?: number;
maxJumpHeight?: number;
minJumpHeight?: number;
velocityXSmoothing?: number;
velocityXMin?: number;
maxClimbAngle?: number;
maxDescendAngle?: number;
skinWidth?: number;
dstBetweenRays?: number;
}
export declare function useKinematicCharacterController(fn: () => KinematicCharacterControllerProps, fwdRef?: Ref<Object3D>, deps?: DependencyList): [RefObject<Object3D>, KinematicCharacterControllerPublicApi];
export interface PlatformControllerPublicApi {
collisions: {
subscribe: (callback: (collisions: {}) => void) => void;
};
raysData: {
subscribe: (callback: (raysData: {}) => void) => void;
};
}
export interface PlatformControllerProps {
body: Ref<Object3D>;
passengerMask: number;
localWaypoints: Duplet[];
speed?: number;
skinWidth?: number;
dstBetweenRays?: number;
}
export declare function usePlatformController(fn: () => PlatformControllerProps, fwdRef?: Ref<Object3D>, deps?: DependencyList): [RefObject<Object3D>, PlatformControllerPublicApi];
export {};