All files / types hand-animation.ts

100% Statements 16/16
100% Branches 4/4
100% Functions 2/2
100% Lines 14/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428                                                        56x   56x   56x   56x   56x   56x   56x   56x                 56x   56x   56x   56x   56x   56x                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
/**
 * Hand animation types for Korean martial arts techniques
 *
 * Defines hand poses, finger positions, and animation states for realistic
 * martial arts hand techniques including strikes, grappling, and precise
 * vital point targeting.
 *
 * @module types/hand-animation
 * @category Type Definitions
 * @korean 손애니메이션타입
 */
 
import * as THREE from "three";
 
/**
 * Martial arts hand pose types
 *
 * Traditional Korean martial arts hand formations:
 * - FIST (주먹): Closed fist for punching
 * - KNIFE_HAND (수도): Extended fingers, rigid hand edge for strikes
 * - SPEAR_HAND (관수): Extended fingers together, pointed thrust
 * - PALM_HEEL (장력): Palm-heel strike position with curled fingers
 * - GRAPPLING (잡기): Fingers curved for grabs and control
 * - OPEN (펴기): Neutral open hand position
 *
 * @public
 * @korean 손자세타입
 */
export enum HandPoseType {
  /** 주먹 - Closed fist for punching */
  FIST = "fist",
  /** 수도 - Knife-hand strike with rigid edge */
  KNIFE_HAND = "knife_hand",
  /** 관수 - Spear-hand thrust with pointed fingers */
  SPEAR_HAND = "spear_hand",
  /** 장력 - Palm-heel strike with curled fingers */
  PALM_HEEL = "palm_heel",
  /** 잡기 - Grappling hand for grabs */
  GRAPPLING = "grappling",
  /** 펴기 - Open hand neutral position */
  OPEN = "open",
  /** 휴식 - Relaxed natural hand position for walking/idle */
  RELAXED = "relaxed",
}
 
/**
 * Finger identification
 *
 * @public
 * @korean 손가락
 */
export enum FingerType {
  /** 엄지 - Thumb */
  THUMB = "thumb",
  /** 검지 - Index finger */
  INDEX = "index",
  /** 중지 - Middle finger */
  MIDDLE = "middle",
  /** 약지 - Ring finger */
  RING = "ring",
  /** 새끼 - Pinky finger */
  PINKY = "pinky",
}
 
/**
 * Finger curl amount (0 = fully extended, 1 = fully curled)
 *
 * Normalized values for finger joint angles:
 * - 0.0: Fully extended (straight)
 * - 0.5: Half curled (slightly bent)
 * - 1.0: Fully curled (tight fist)
 *
 * @public
 * @korean 손가락구부림량
 */
export interface FingerCurl {
  /** Thumb curl amount (0-1) */
  readonly thumb: number;
  /** Index finger curl amount (0-1) */
  readonly index: number;
  /** Middle finger curl amount (0-1) */
  readonly middle: number;
  /** Ring finger curl amount (0-1) */
  readonly ring: number;
  /** Pinky finger curl amount (0-1) */
  readonly pinky: number;
}
 
/**
 * Finger spread amount (0 = together, 1 = spread apart)
 *
 * Controls the lateral spacing between fingers.
 *
 * @public
 * @korean 손가락벌림량
 */
export interface FingerSpread {
  /** Spread between thumb and index (0-1) */
  readonly thumbIndex: number;
  /** Spread between index and middle (0-1) */
  readonly indexMiddle: number;
  /** Spread between middle and ring (0-1) */
  readonly middleRing: number;
  /** Spread between ring and pinky (0-1) */
  readonly ringPinky: number;
}
 
/**
 * Hand pose definition for martial arts techniques
 *
 * Complete hand configuration including finger positions and wrist rotation
 * for authentic Korean martial arts hand techniques.
 *
 * @public
 * @korean 손자세정의
 */
export interface HandPose {
  /**
   * Pose identifier
   * @korean 자세ID
   */
  readonly type: HandPoseType;
 
  /**
   * Korean name for the pose
   * @korean 한글이름
   */
  readonly nameKorean: string;
 
  /**
   * English name for the pose
   * @korean 영어이름
   */
  readonly nameEnglish: string;
 
  /**
   * Romanized Korean name
   * @korean 로마자이름
   */
  readonly romanized: string;
 
  /**
   * Finger curl amounts (0-1 per finger)
   * @korean 손가락구부림
   */
  readonly fingerCurl: FingerCurl;
 
  /**
   * Finger spread amounts (0-1 between fingers)
   * @korean 손가락벌림
   */
  readonly fingerSpread: FingerSpread;
 
  /**
   * Wrist rotation for the technique
   * @korean 손목회전
   */
  readonly wristRotation: THREE.Euler;
 
  /**
   * Description of the technique
   * @korean 설명
   */
  readonly description: {
    readonly korean: string;
    readonly english: string;
  };
 
  /**
   * Which martial art this pose comes from
   * @korean 무술출처
   */
  readonly martialArtOrigin:
    | "taekwondo"
    | "hapkido"
    | "taekyon"
    | "traditional";
 
  /**
   * Primary striking surface
   * @korean 타격면
   */
  readonly strikingSurface:
    | "knuckles"
    | "palm_heel"
    | "knife_edge"
    | "fingertips"
    | "whole_hand";
}
 
/**
 * Hand animation state
 *
 * Current state of hand animation including pose transition progress.
 *
 * @public
 * @korean 손애니메이션상태
 */
export interface HandAnimationState {
  /**
   * Current hand pose
   * @korean 현재자세
   */
  readonly currentPose: HandPoseType;
 
  /**
   * Target hand pose (during transition)
   * @korean 목표자세
   */
  readonly targetPose: HandPoseType | null;
 
  /**
   * Transition progress (0-1)
   * @korean 전환진행률
   */
  readonly transitionProgress: number;
 
  /**
   * Current finger curl values (interpolated)
   * @korean 현재손가락구부림
   */
  readonly currentFingerCurl: FingerCurl;
 
  /**
   * Current finger spread values (interpolated)
   * @korean 현재손가락벌림
   */
  readonly currentFingerSpread: FingerSpread;
 
  /**
   * Current wrist rotation (interpolated)
   * @korean 현재손목회전
   */
  readonly currentWristRotation: THREE.Euler;
 
  /**
   * Whether hand is highlighted for vital point targeting
   * @korean 급소표시여부
   */
  readonly isHighlighted: boolean;
 
  /**
   * Highlight mode for different striking surfaces
   * @korean 표시모드
   */
  readonly highlightMode:
    | "none"
    | "knuckles"
    | "palm"
    | "knife_edge"
    | "fingertips"
    | null;
}
 
/**
 * Hand side identification
 *
 * @public
 * @korean 손쪽
 */
export type HandSide = "left" | "right";
 
/**
 * Hand pose configuration for attack techniques
 *
 * Maps attack technique names to appropriate hand poses.
 *
 * @public
 * @korean 공격기술손자세
 */
export interface TechniqueHandPose {
  /**
   * Technique name (e.g., "jab", "cross", "knife_hand_strike")
   * @korean 기술이름
   */
  readonly techniqueName: string;
 
  /**
   * Hand pose for left hand
   * @korean 왼손자세
   */
  readonly leftHandPose: HandPoseType;
 
  /**
   * Hand pose for right hand
   * @korean 오른손자세
   */
  readonly rightHandPose: HandPoseType;
 
  /**
   * Transition duration in seconds
   * @korean 전환시간
   */
  readonly transitionDuration: number;
}
 
/**
 * Hand level of detail (LOD) settings
 *
 * Performance optimization by adjusting hand detail based on camera distance.
 *
 * @public
 * @korean 손상세도설정
 */
export interface HandLODConfig {
  /**
   * Detail level
   * - high: Full finger geometry (4 bones per finger)
   * - medium: Simplified fingers (3 bones per finger)
   * - low: No finger detail (hand as single unit)
   * @korean 상세도
   */
  readonly detailLevel: "high" | "medium" | "low";
 
  /**
   * Distance thresholds for LOD switching
   * @korean 거리기준
   */
  readonly distanceThresholds: {
    readonly high: number; // Camera distance for high detail (< 5 units)
    readonly medium: number; // Camera distance for medium detail (< 15 units)
    readonly low: number; // Camera distance for low detail (>= 15 units)
  };
 
  /**
   * Whether to render individual fingers
   * @korean 손가락렌더링여부
   */
  readonly renderFingers: boolean;
 
  /**
   * Number of segments per finger
   * @korean 손가락세그먼트수
   */
  readonly fingerSegments: number;
}
 
/**
 * Finger bone segments
 *
 * Anatomically correct finger bone structure:
 * - Metacarpal: Knuckle base (hand to finger connection)
 * - Proximal: First joint (knuckle joint)
 * - Intermediate: Middle joint
 * - Distal: Fingertip
 *
 * Note: Thumb has no intermediate phalanx (2 bones instead of 3)
 *
 * @public
 * @korean 손가락뼈세그먼트
 */
export interface FingerSegments {
  /**
   * Metacarpal bone (knuckle base)
   * @korean 중수골
   */
  readonly metacarpal: THREE.Vector3;
 
  /**
   * Proximal phalanx (first joint)
   * @korean 근위지골
   */
  readonly proximal: THREE.Vector3;
 
  /**
   * Intermediate phalanx (middle joint)
   * Note: Thumb does not have this bone
   * @korean 중위지골
   */
  readonly intermediate: THREE.Vector3 | null;
 
  /**
   * Distal phalanx (fingertip)
   * @korean 원위지골
   */
  readonly distal: THREE.Vector3;
}
 
/**
 * Complete hand structure with all finger bones
 *
 * @public
 * @korean 손뼈구조
 */
export interface HandStructure {
  /**
   * Palm base position
   * @korean 손바닥위치
   */
  readonly palm: THREE.Vector3;
 
  /**
   * Wrist position
   * @korean 손목위치
   */
  readonly wrist: THREE.Vector3;
 
  /**
   * Thumb segments (2 bones: no intermediate)
   * @korean 엄지뼈
   */
  readonly thumb: FingerSegments;
 
  /**
   * Index finger segments (3 bones)
   * @korean 검지뼈
   */
  readonly index: FingerSegments;
 
  /**
   * Middle finger segments (3 bones)
   * @korean 중지뼈
   */
  readonly middle: FingerSegments;
 
  /**
   * Ring finger segments (3 bones)
   * @korean 약지뼈
   */
  readonly ring: FingerSegments;
 
  /**
   * Pinky finger segments (3 bones)
   * @korean 새끼뼈
   */
  readonly pinky: FingerSegments;
}