/*! * Ecctrl * https://github.com/pmndrs/ecctrl * * SPDX-FileCopyrightText: 2023-2026 Erdong Chen * SPDX-License-Identifier: MIT */ import * as THREE from "three"; import React, { type ReactNode } from "react"; import { type RapierRigidBody, type RigidBodyProps } from "@react-three/rapier"; import { type CurveData } from "../curves/CurveLUT"; import type { ReadonlyVehicleInput, VehicleInput } from "./types"; import type { WheelInfoType } from "./components/ShapeCastWheel"; import type { PropellerInfoType } from "./components/ThrustPropeller"; type TransmissionMode = "auto" | "manual"; export type WheelsInfoType = ReadonlyMap>>; export type PropellersInfoType = ReadonlyMap>>; type MutableWheelsInfoType = Map>>; type MutablePropellersInfoType = Map>; export declare const VehicleContext: React.Context<{ body: React.RefObject; upAxis: React.RefObject; gravityDir: React.RefObject; gravityMag: React.RefObject; currPos: React.RefObject; currQuat: React.RefObject; currLinvel: React.RefObject; currAngvel: React.RefObject; bodyXAxis: React.RefObject; bodyYAxis: React.RefObject; bodyZAxis: React.RefObject; movementState: React.RefObject; wheelsInfo: React.RefObject; propellersInfo: React.RefObject; regWheel: (info: React.RefObject>) => void; unregWheel: (id: string) => void; regPropeller: (info: React.RefObject) => void; unregPropeller: (id: string) => void; } | null>; declare const _default: React.NamedExoticComponent & React.RefAttributes>; export default _default; export type CarConfigType = { controlMode?: "VELOCITY" | "POSITION"; engineHorsepower?: number; engineMaxRPM?: number; gearRatios?: number[]; finalDriveRatio?: number; transmissionMode?: TransmissionMode; shiftUpRPM?: number; shiftDownRPM?: number; shiftCooldown?: number; steerRate?: number; maxSteerAngle?: number; reverseTorqueScale?: number; reverseRPMScale?: number; engineTorqueCurveData?: CurveData; steerAngleCurveData?: CurveData; }; export type DroneConfigType = { controlMode?: "VELOCITY" | "POSITION"; maxYawRate?: number; maxHorizSpeed?: number; maxVertSpeed?: number; maxTiltAngle?: number; airDragFactor?: number; TILT_P?: number; TILT_D?: number; YAW_POS_P?: number; YAW_VEL_P?: number; VERT_POS_P?: number; VERT_POS_D?: number; HORIZ_POS_P?: number; HORIZ_POS_D?: number; HORIZ_VEL_P?: number; VERT_VEL_P?: number; }; export interface EcctrlVehicleProps extends RigidBodyProps { children?: ReactNode; enable?: boolean; carConfig?: Partial; droneConfig?: Partial; enableCustomGravity?: boolean; gravityDirLerpSpeed?: number; props?: RigidBodyProps; } export interface EcctrlVehicleHandle { body: RapierRigidBody; readonly upAxis: THREE.Vector3; readonly gravityDir: THREE.Vector3; readonly gravityMag: number; readonly currPos: THREE.Vector3; readonly currQuat: THREE.Quaternion; readonly currLinVel: THREE.Vector3; readonly currAngVel: THREE.Vector3; readonly bodyXAxis: THREE.Vector3; readonly bodyYAxis: THREE.Vector3; readonly bodyZAxis: THREE.Vector3; readonly targetPos: THREE.Vector3; readonly targetFwd: THREE.Vector3; readonly input: ReadonlyVehicleInput; readonly wheelsInfo: WheelsInfoType; readonly propellersInfo: PropellersInfoType; readonly gearIndex: number; readonly driveRatio: number; readonly engineRPM: number; setMovement: (state: VehicleInput) => void; setTarget: (pos?: THREE.Vector3, dir?: THREE.Vector3) => void; setGear: (gearIndex: number) => void; }