diff --git a/packages/maath/src/easing.ts b/packages/maath/src/easing.ts index 8219e6a..497b1a0 100644 --- a/packages/maath/src/easing.ts +++ b/packages/maath/src/easing.ts @@ -1,3 +1,11 @@ +import { + Vector2, + Vector3, + Vector4, + Euler, + Color, + ColorRepresentation, +} from "three"; import { deltaAngle } from "./misc"; /** @@ -79,3 +87,97 @@ export function dampAngle( eps ); } + +let a, b, c; +const v2d = /*@__PURE__*/ new Vector2(); +export function damp2( + current: Vector2, + target: number | [x: number, y: number] | Vector2, + smoothTime: number, + delta: number, + maxSpeed: number, + easing?: (t: number) => number, + eps?: number +) { + if (typeof target === "number") v2d.setScalar(target); + else if (Array.isArray(target)) v2d.set(target[0], target[1]); + else v2d.copy(target); + a = damp(current, "x", v2d.x, smoothTime, delta, maxSpeed, easing, eps); + b = damp(current, "y", v2d.y, smoothTime, delta, maxSpeed, easing, eps); + return a || b; +} + +const v3d = /*@__PURE__*/ new Vector3(); +export function damp3( + current: Vector3, + target: number | [x: number, y: number, z: number] | Vector3, + smoothTime: number, + delta: number, + maxSpeed: number, + easing?: (t: number) => number, + eps?: number +) { + if (typeof target === "number") v3d.setScalar(target); + else if (Array.isArray(target)) v3d.set(target[0], target[1], target[2]); + else v3d.copy(target); + a = damp(current, "x", v3d.x, smoothTime, delta, maxSpeed, easing, eps); + b = damp(current, "y", v3d.y, smoothTime, delta, maxSpeed, easing, eps); + c = damp(current, "z", v3d.z, smoothTime, delta, maxSpeed, easing, eps); + return a || b || c; +} + +const v4d = /*@__PURE__*/ new Vector4(); +export function damp4( + current: Vector4, + target: number | [x: number, y: number, z: number, w: number] | Vector4, + smoothTime: number, + delta: number, + maxSpeed: number, + easing?: (t: number) => number, + eps?: number +) { + if (typeof target === "number") v4d.setScalar(target); + else if (Array.isArray(target)) + v4d.set(target[0], target[1], target[2], target[3]); + else v4d.copy(target); + a = damp(current, "x", v3d.x, smoothTime, delta, maxSpeed, easing, eps); + b = damp(current, "y", v3d.y, smoothTime, delta, maxSpeed, easing, eps); + c = damp(current, "z", v3d.z, smoothTime, delta, maxSpeed, easing, eps); + return a || b || c; +} + +const rot = /*@__PURE__*/ new Euler(); +export function dampE( + current: Euler, + target: [x: number, y: number, z: number, order?: string] | Euler, + smoothTime: number, + delta: number, + maxSpeed: number, + easing?: (t: number) => number, + eps?: number +) { + if (Array.isArray(target)) + rot.set(target[0], target[1], target[2], target[3]); + else rot.copy(target); + a = dampAngle(current, "x", rot.x, smoothTime, delta, maxSpeed, easing, eps); + b = dampAngle(current, "y", rot.y, smoothTime, delta, maxSpeed, easing, eps); + c = dampAngle(current, "z", rot.z, smoothTime, delta, maxSpeed, easing, eps); + return a || b || c; +} + +const col = /*@__PURE__*/ new Color(); +export function dampC( + current: Color, + target: ColorRepresentation, + smoothTime: number, + delta: number, + maxSpeed: number, + easing?: (t: number) => number, + eps?: number +) { + col.set(target); + a = damp(current, "r", col.r, smoothTime, delta, maxSpeed, easing, eps); + b = damp(current, "g", col.g, smoothTime, delta, maxSpeed, easing, eps); + c = damp(current, "b", col.b, smoothTime, delta, maxSpeed, easing, eps); + return a || b || c; +}