import { VecN } from '@holotope/core'; import { XpbdParticleHyperplaneConstraintN, XpbdParticleHyperplaneFamilyN, type XpbdParticleHyperplaneFamilyContactN, type XpbdParticleHyperplaneFamilyVertexContextN } from './xpbd-hyperplane-contact.js'; import { XpbdParticleN, XpbdWorldN, type XpbdVelocityResponseContextN, type XpbdVelocityResponseEvaluationN, type XpbdVelocityResponseN } from './xpbd-world.js'; export type XpbdParticleHyperplaneFrictionStateN = 'disabled' | 'inactive' | 'sticking' | 'sliding'; export interface XpbdParticleHyperplaneFrictionNOptions { readonly id: string; readonly contact: XpbdParticleHyperplaneConstraintN; /** Isotropic Coulomb coefficient for the complete RN tangent ball. */ readonly friction: number; } export interface XpbdParticleHyperplaneFrictionEvaluationN extends XpbdVelocityResponseEvaluationN { readonly state: XpbdParticleHyperplaneFrictionStateN; readonly contactConstraintId: string; readonly particleId: string; readonly frictionCoefficient: number; /** Position multiplier divided by the substep duration. */ readonly normalImpulse: number; readonly normalSpeedBefore: number; readonly normalSpeedAfter: number; readonly tangentSpeedBefore: number; readonly tangentSpeedAfter: number; readonly tangentImpulse: VecN; /** `frictionCoefficient * normalImpulse`. */ readonly frictionLimit: number; readonly kineticEnergyBefore: number; readonly kineticEnergyAfter: number; readonly kineticEnergyChange: number; } /** * Post-projection Coulomb response for one RN particle against one immovable * hyperplane. The tangent impulse is projected as one ambient vector; no * coordinate tangent basis or per-axis friction pyramid is introduced. */ export declare class XpbdParticleHyperplaneFrictionN implements XpbdVelocityResponseN { readonly id: string; readonly dimension: number; readonly particles: readonly [XpbdParticleN]; readonly contact: XpbdParticleHyperplaneConstraintN; readonly frictionCoefficient: number; constructor(options: XpbdParticleHyperplaneFrictionNOptions); apply(context: XpbdVelocityResponseContextN): XpbdParticleHyperplaneFrictionEvaluationN; } export type XpbdParticleHyperplaneFrictionFamilyVertexScalarN = number | ((vertex: XpbdParticleHyperplaneFamilyVertexContextN) => number); export interface CompileXpbdParticleHyperplaneFrictionFamilyNOptions { readonly id: string; readonly contacts: XpbdParticleHyperplaneFamilyN; /** Uniform or source-vertex Coulomb coefficient. Default zero. */ readonly friction?: XpbdParticleHyperplaneFrictionFamilyVertexScalarN; } export interface XpbdParticleHyperplaneFrictionFamilyContactN { readonly sourceVertexIndex: number; readonly particle: XpbdParticleN; readonly normalContact: XpbdParticleHyperplaneFamilyContactN; readonly frictionCoefficient: number; } export interface XpbdParticleHyperplaneFrictionFamilyContactEvaluationN extends XpbdParticleHyperplaneFrictionEvaluationN { readonly sourceVertexIndex: number; } export interface XpbdParticleHyperplaneFrictionFamilyEvaluationN extends XpbdVelocityResponseEvaluationN { readonly contacts: readonly XpbdParticleHyperplaneFrictionFamilyContactEvaluationN[]; readonly activeContactCount: number; readonly stickingContactCount: number; readonly slidingContactCount: number; readonly totalTangentImpulse: number; readonly maximumTangentSpeedAfter: number; readonly kineticEnergyChange: number; } /** Source-vertex-indexed Coulomb responses over an existing normal family. */ export declare class XpbdParticleHyperplaneFrictionFamilyN implements XpbdVelocityResponseN { readonly id: string; readonly dimension: number; readonly normalFamily: XpbdParticleHyperplaneFamilyN; readonly particles: readonly XpbdParticleN[]; readonly contacts: readonly XpbdParticleHyperplaneFrictionFamilyContactN[]; private attachedWorld; private constructor(); static compile(options: CompileXpbdParticleHyperplaneFrictionFamilyNOptions): XpbdParticleHyperplaneFrictionFamilyN; apply(context: XpbdVelocityResponseContextN): XpbdParticleHyperplaneFrictionFamilyEvaluationN; /** Adds only the velocity response; normal constraints must already exist. */ addToWorld(world: XpbdWorldN): XpbdWorldN; } export declare function compileXpbdParticleHyperplaneFrictionFamilyN(options: CompileXpbdParticleHyperplaneFrictionFamilyNOptions): XpbdParticleHyperplaneFrictionFamilyN; //# sourceMappingURL=xpbd-hyperplane-friction.d.ts.map