@franzenzenhofer/asanakit 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.md +84 -46
  2. package/dist/anatomy/muscles.d.ts +10 -7
  3. package/dist/anatomy/muscles.d.ts.map +1 -1
  4. package/dist/anatomy/muscles.js +21 -17
  5. package/dist/anatomy/muscles.js.map +1 -1
  6. package/dist/anatomy/validate.d.ts.map +1 -1
  7. package/dist/anatomy/validate.js +16 -10
  8. package/dist/anatomy/validate.js.map +1 -1
  9. package/dist/cli/commands/export.d.ts.map +1 -1
  10. package/dist/cli/commands/export.js +24 -2
  11. package/dist/cli/commands/export.js.map +1 -1
  12. package/dist/cli/commands/info.d.ts.map +1 -1
  13. package/dist/cli/commands/info.js +3 -1
  14. package/dist/cli/commands/info.js.map +1 -1
  15. package/dist/cli/commands/render.d.ts.map +1 -1
  16. package/dist/cli/commands/render.js +22 -4
  17. package/dist/cli/commands/render.js.map +1 -1
  18. package/dist/cli/commands/view.d.ts +3 -0
  19. package/dist/cli/commands/view.d.ts.map +1 -0
  20. package/dist/cli/commands/view.js +88 -0
  21. package/dist/cli/commands/view.js.map +1 -0
  22. package/dist/cli/index.js +7 -2
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/cli/resolve.d.ts +6 -0
  25. package/dist/cli/resolve.d.ts.map +1 -1
  26. package/dist/cli/resolve.js +40 -0
  27. package/dist/cli/resolve.js.map +1 -1
  28. package/dist/core/camera.d.ts +56 -0
  29. package/dist/core/camera.d.ts.map +1 -0
  30. package/dist/core/camera.js +20 -0
  31. package/dist/core/camera.js.map +1 -0
  32. package/dist/core/joints.d.ts +18 -0
  33. package/dist/core/joints.d.ts.map +1 -0
  34. package/dist/core/joints.js +27 -0
  35. package/dist/core/joints.js.map +1 -0
  36. package/dist/core/quat.d.ts +18 -0
  37. package/dist/core/quat.d.ts.map +1 -0
  38. package/dist/core/quat.js +25 -0
  39. package/dist/core/quat.js.map +1 -0
  40. package/dist/core/rig.d.ts +1 -6
  41. package/dist/core/rig.d.ts.map +1 -1
  42. package/dist/core/rig.js +45 -74
  43. package/dist/core/rig.js.map +1 -1
  44. package/dist/core/skeleton.d.ts +4 -13
  45. package/dist/core/skeleton.d.ts.map +1 -1
  46. package/dist/core/skeleton.js +39 -69
  47. package/dist/core/skeleton.js.map +1 -1
  48. package/dist/core/types.d.ts +62 -55
  49. package/dist/core/types.d.ts.map +1 -1
  50. package/dist/core/types.js.map +1 -1
  51. package/dist/core/vec3.d.ts +13 -0
  52. package/dist/core/vec3.d.ts.map +1 -0
  53. package/dist/core/vec3.js +26 -0
  54. package/dist/core/vec3.js.map +1 -0
  55. package/dist/export3d/gltf.d.ts +11 -0
  56. package/dist/export3d/gltf.d.ts.map +1 -0
  57. package/dist/export3d/gltf.js +28 -0
  58. package/dist/export3d/gltf.js.map +1 -0
  59. package/dist/export3d/index.d.ts +3 -0
  60. package/dist/export3d/index.d.ts.map +1 -0
  61. package/dist/export3d/index.js +3 -0
  62. package/dist/export3d/index.js.map +1 -0
  63. package/dist/export3d/shims.d.ts +7 -0
  64. package/dist/export3d/shims.d.ts.map +1 -0
  65. package/dist/export3d/shims.js +27 -0
  66. package/dist/export3d/shims.js.map +1 -0
  67. package/dist/index.d.ts +9 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +9 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/library/index.js +4 -4
  72. package/dist/library/index.js.map +1 -1
  73. package/dist/model/pose.d.ts +11 -5
  74. package/dist/model/pose.d.ts.map +1 -1
  75. package/dist/model/pose.js +30 -16
  76. package/dist/model/pose.js.map +1 -1
  77. package/dist/model/schema.d.ts +69 -28
  78. package/dist/model/schema.d.ts.map +1 -1
  79. package/dist/model/schema.js +57 -17
  80. package/dist/model/schema.js.map +1 -1
  81. package/dist/physics/index.d.ts +3 -0
  82. package/dist/physics/index.d.ts.map +1 -0
  83. package/dist/physics/index.js +3 -0
  84. package/dist/physics/index.js.map +1 -0
  85. package/dist/physics/rapier-types.d.ts +60 -0
  86. package/dist/physics/rapier-types.d.ts.map +1 -0
  87. package/dist/physics/rapier-types.js +12 -0
  88. package/dist/physics/rapier-types.js.map +1 -0
  89. package/dist/physics/settle.d.ts +3 -0
  90. package/dist/physics/settle.d.ts.map +1 -0
  91. package/dist/physics/settle.js +108 -0
  92. package/dist/physics/settle.js.map +1 -0
  93. package/dist/physics/world.d.ts +4 -0
  94. package/dist/physics/world.d.ts.map +1 -0
  95. package/dist/physics/world.js +18 -0
  96. package/dist/physics/world.js.map +1 -0
  97. package/dist/render/anatomy.js +1 -1
  98. package/dist/render/anatomy.js.map +1 -1
  99. package/dist/render/annotations.d.ts +3 -2
  100. package/dist/render/annotations.d.ts.map +1 -1
  101. package/dist/render/annotations.js.map +1 -1
  102. package/dist/render/camera.d.ts +43 -0
  103. package/dist/render/camera.d.ts.map +1 -0
  104. package/dist/render/camera.js +57 -0
  105. package/dist/render/camera.js.map +1 -0
  106. package/dist/render/context.d.ts +5 -3
  107. package/dist/render/context.d.ts.map +1 -1
  108. package/dist/render/figure.d.ts +4 -2
  109. package/dist/render/figure.d.ts.map +1 -1
  110. package/dist/render/figure.js +29 -43
  111. package/dist/render/figure.js.map +1 -1
  112. package/dist/render/index.d.ts +1 -0
  113. package/dist/render/index.d.ts.map +1 -1
  114. package/dist/render/index.js +1 -0
  115. package/dist/render/index.js.map +1 -1
  116. package/dist/render/props.d.ts +4 -3
  117. package/dist/render/props.d.ts.map +1 -1
  118. package/dist/render/props.js.map +1 -1
  119. package/dist/render/scene.d.ts +7 -1
  120. package/dist/render/scene.d.ts.map +1 -1
  121. package/dist/render/scene.js +8 -1
  122. package/dist/render/scene.js.map +1 -1
  123. package/dist/render/sheet.d.ts +3 -0
  124. package/dist/render/sheet.d.ts.map +1 -1
  125. package/dist/render/sheet.js +2 -0
  126. package/dist/render/sheet.js.map +1 -1
  127. package/dist/solve.d.ts +14 -0
  128. package/dist/solve.d.ts.map +1 -0
  129. package/dist/solve.js +17 -0
  130. package/dist/solve.js.map +1 -0
  131. package/dist/standards/keypoints.d.ts +2 -10
  132. package/dist/standards/keypoints.d.ts.map +1 -1
  133. package/dist/standards/keypoints.js +33 -14
  134. package/dist/standards/keypoints.js.map +1 -1
  135. package/dist/three/index.d.ts +2 -0
  136. package/dist/three/index.d.ts.map +1 -0
  137. package/dist/three/index.js +2 -0
  138. package/dist/three/index.js.map +1 -0
  139. package/dist/three/scene.d.ts +22 -0
  140. package/dist/three/scene.d.ts.map +1 -0
  141. package/dist/three/scene.js +90 -0
  142. package/dist/three/scene.js.map +1 -0
  143. package/dist/viewer/html.d.ts +32 -0
  144. package/dist/viewer/html.d.ts.map +1 -0
  145. package/dist/viewer/html.js +163 -0
  146. package/dist/viewer/html.js.map +1 -0
  147. package/dist/viewer/index.d.ts +2 -0
  148. package/dist/viewer/index.d.ts.map +1 -0
  149. package/dist/viewer/index.js +2 -0
  150. package/dist/viewer/index.js.map +1 -0
  151. package/dist/viewer/viewer.bundle.js +4119 -0
  152. package/docs/AUTHORING.md +119 -58
  153. package/package.json +20 -6
  154. package/poses/surf/bottom-turn.pose.yaml +24 -24
  155. package/poses/surf/cutback.pose.yaml +24 -24
  156. package/poses/surf/duck-dive.pose.yaml +23 -23
  157. package/poses/surf/noseride.pose.yaml +23 -25
  158. package/poses/surf/paddling.pose.yaml +24 -24
  159. package/poses/surf/pop-up.pose.yaml +24 -24
  160. package/poses/surf/takeoff.pose.yaml +24 -24
  161. package/poses/surf/tube-stance.pose.yaml +24 -24
  162. package/poses/yoga/ashtanga/adho-mukha-svanasana.pose.yaml +22 -22
  163. package/poses/yoga/ashtanga/ardha-uttanasana.pose.yaml +22 -22
  164. package/poses/yoga/ashtanga/baddha-konasana.pose.yaml +21 -23
  165. package/poses/yoga/ashtanga/balasana.pose.yaml +23 -23
  166. package/poses/yoga/ashtanga/chaturanga-dandasana.pose.yaml +21 -21
  167. package/poses/yoga/ashtanga/dandasana.pose.yaml +21 -23
  168. package/poses/yoga/ashtanga/halasana.pose.yaml +23 -23
  169. package/poses/yoga/ashtanga/janu-sirsasana-a.pose.yaml +22 -22
  170. package/poses/yoga/ashtanga/karnapidasana.pose.yaml +23 -23
  171. package/poses/yoga/ashtanga/marichyasana-a.pose.yaml +22 -22
  172. package/poses/yoga/ashtanga/marichyasana-c.pose.yaml +21 -23
  173. package/poses/yoga/ashtanga/matsyasana.pose.yaml +23 -23
  174. package/poses/yoga/ashtanga/navasana.pose.yaml +22 -22
  175. package/poses/yoga/ashtanga/padahastasana.pose.yaml +22 -22
  176. package/poses/yoga/ashtanga/padangusthasana.pose.yaml +22 -22
  177. package/poses/yoga/ashtanga/padmasana.pose.yaml +22 -24
  178. package/poses/yoga/ashtanga/parsvottanasana.pose.yaml +22 -22
  179. package/poses/yoga/ashtanga/paschimottanasana.pose.yaml +22 -22
  180. package/poses/yoga/ashtanga/prasarita-padottanasana-a.pose.yaml +26 -26
  181. package/poses/yoga/ashtanga/prasarita-padottanasana-c.pose.yaml +26 -26
  182. package/poses/yoga/ashtanga/primary.seq.yaml +2 -4
  183. package/poses/yoga/ashtanga/purvottanasana.pose.yaml +22 -22
  184. package/poses/yoga/ashtanga/salamba-sarvangasana.pose.yaml +23 -23
  185. package/poses/yoga/ashtanga/samasthiti.pose.yaml +10 -10
  186. package/poses/yoga/ashtanga/savasana.pose.yaml +21 -21
  187. package/poses/yoga/ashtanga/setu-bandhasana.pose.yaml +22 -22
  188. package/poses/yoga/ashtanga/sirsasana.pose.yaml +23 -23
  189. package/poses/yoga/ashtanga/supta-padangusthasana.pose.yaml +22 -22
  190. package/poses/yoga/ashtanga/upavistha-konasana.pose.yaml +22 -22
  191. package/poses/yoga/ashtanga/urdhva-dhanurasana.pose.yaml +23 -23
  192. package/poses/yoga/ashtanga/urdhva-hastasana.pose.yaml +22 -22
  193. package/poses/yoga/ashtanga/urdhva-mukha-svanasana.pose.yaml +22 -22
  194. package/poses/yoga/ashtanga/utkatasana.pose.yaml +22 -22
  195. package/poses/yoga/ashtanga/uttanasana.pose.yaml +22 -22
  196. package/poses/yoga/ashtanga/utthita-parsvakonasana.pose.yaml +24 -24
  197. package/poses/yoga/ashtanga/utthita-trikonasana.pose.yaml +24 -24
  198. package/poses/yoga/ashtanga/virabhadrasana-a.pose.yaml +22 -22
  199. package/poses/yoga/ashtanga/virabhadrasana-b.pose.yaml +21 -23
@@ -1,14 +1,18 @@
1
1
  import { mkdir, writeFile } from 'node:fs/promises';
2
2
  import { dirname, extname } from 'node:path';
3
+ import { resolveCamera } from '../../core/camera.js';
3
4
  import { expandSequence } from '../../library/index.js';
4
5
  import { optimizeSvg, renderPng, renderSheet, renderSvg } from '../../render/index.js';
5
- import { library, parseIntOption, parseStyle, resolvePose } from '../resolve.js';
6
+ import { solvePose } from '../../solve.js';
7
+ import { buildShowcaseHtml } from '../../viewer/index.js';
8
+ import { library, parseCamera, parseIntOption, parseStyle, resolvePose } from '../resolve.js';
6
9
  const renderOptionsFrom = (o) => ({
7
10
  style: parseStyle(o.style),
8
11
  width: parseIntOption(o.width, 'width'),
9
12
  height: parseIntOption(o.height, 'height'),
10
13
  title: o.title === true,
11
14
  caption: o.caption === true,
15
+ ...(o.camera === undefined ? {} : { camera: parseCamera(o.camera) }),
12
16
  ...(o.muscles === undefined ? {} : { muscles: o.muscles }),
13
17
  ...(o.background === undefined ? {} : { background: o.background }),
14
18
  });
@@ -28,6 +32,8 @@ const withCommonOptions = (cmd) => cmd
28
32
  .option('-s, --style <style>', 'stick | anatomy | silhouette | blueprint | ink | poster | minimal', 'stick')
29
33
  .option('-w, --width <px>', 'canvas width', '600')
30
34
  .option('-h, --height <px>', 'canvas height', '800')
35
+ .option('--camera <view>', 'front | back | left | right | side | three-quarter | top, or "azimuth=30,elevation=15"')
36
+ .option('--settle', 'drop the figure onto the ground with the physics engine before rendering')
31
37
  .option('--title', 'draw the pose name above the figure')
32
38
  .option('--caption', 'draw the teaching cues below the figure')
33
39
  .option('--muscles', 'force the muscle layer on')
@@ -40,9 +46,17 @@ export const registerRenderCommands = (program) => {
40
46
  withCommonOptions(program
41
47
  .command('render <pose>')
42
48
  .description('Render one pose (a .pose.yaml file, or a library id) to SVG or PNG')
43
- .requiredOption('-o, --out <file>', 'output path; the extension picks the format (.svg or .png)')).action(async (ref, options) => {
49
+ .requiredOption('-o, --out <file>', 'output path; the extension picks the format (.svg, .png, or .html showcase with embedded 3D viewer)')).action(async (ref, options) => {
44
50
  const pose = await resolvePose(ref, options.lib);
45
- await write(options.out, renderSvg(pose, renderOptionsFrom(options)), options);
51
+ const skeleton = await solvePose(pose, options.settle === undefined ? {} : { settle: options.settle });
52
+ if (extname(options.out).toLowerCase() === '.html') {
53
+ const camera = options.camera === undefined ? undefined : { camera: resolveCamera(parseCamera(options.camera)) };
54
+ await mkdir(dirname(options.out), { recursive: true });
55
+ await writeFile(options.out, await buildShowcaseHtml([{ pose, skeleton }], camera ?? {}));
56
+ process.stdout.write(`${options.out}\n`);
57
+ return;
58
+ }
59
+ await write(options.out, renderSvg(pose, { ...renderOptionsFrom(options), skeleton }), options);
46
60
  });
47
61
  withCommonOptions(program
48
62
  .command('sheet [poses...]')
@@ -70,8 +84,11 @@ export const registerRenderCommands = (program) => {
70
84
  }
71
85
  if (poses.length === 0)
72
86
  throw new Error('Nothing to render: pass pose ids, --all, or --sequence <id>');
87
+ const settle = options.settle === undefined ? {} : { settle: options.settle };
88
+ const skeletons = await Promise.all(poses.map((p) => solvePose(p, settle)));
73
89
  const sheetOptions = {
74
90
  ...renderOptionsFrom(options),
91
+ skeletons,
75
92
  columns: parseIntOption(options.columns, 'columns'),
76
93
  cellWidth: parseIntOption(options.width, 'width'),
77
94
  cellHeight: parseIntOption(options.height, 'height'),
@@ -96,7 +113,8 @@ export const registerRenderCommands = (program) => {
96
113
  for (const [i, step] of steps.entries()) {
97
114
  const n = String(i + 1).padStart(pad, '0');
98
115
  const path = `${options.out}/${n}-${step.pose.id}${step.side === 'right' ? '-right' : ''}.${options.format}`;
99
- await write(path, renderSvg({ ...step.pose, name: step.label }, renderOptionsFrom(options)), options);
116
+ const skeleton = await solvePose(step.pose, options.settle === undefined ? {} : { settle: options.settle });
117
+ await write(path, renderSvg({ ...step.pose, name: step.label }, { ...renderOptionsFrom(options), skeleton }), options);
100
118
  }
101
119
  });
102
120
  };
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/cli/commands/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/cli/commands/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare const registerViewCommands: (program: Command) => void;
3
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/view.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CzC,eAAO,MAAM,oBAAoB,GAAI,SAAS,OAAO,KAAG,IAsDvD,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { dirname } from 'node:path';
4
+ import { resolveCamera } from '../../core/camera.js';
5
+ import { expandSequence } from '../../library/index.js';
6
+ import { solvePose } from '../../solve.js';
7
+ import { buildShowcaseHtml, buildViewerHtml } from '../../viewer/index.js';
8
+ import { library, parseCamera, resolvePose } from '../resolve.js';
9
+ const openFile = (path) => {
10
+ const cmd = process.platform === 'darwin' ? 'open' : 'xdg-open';
11
+ spawn(cmd, [path], { detached: true, stdio: 'ignore' }).unref();
12
+ };
13
+ const posesFor = async (refs, options) => {
14
+ const lib = await library(options.lib);
15
+ if (options.sequence !== undefined) {
16
+ const sequence = lib.sequences.get(options.sequence);
17
+ if (sequence === undefined) {
18
+ throw new Error(`Unknown sequence "${options.sequence}". Known: ${[...lib.sequences.keys()].join(', ')}`);
19
+ }
20
+ // A practice repeats poses; a gallery wants each variant once. Mirrored
21
+ // "second side" steps keep their own entry under a distinct id.
22
+ const seen = new Set();
23
+ const unique = [];
24
+ for (const step of expandSequence(sequence, lib)) {
25
+ const id = step.side === 'right' ? `${step.pose.id}-right` : step.pose.id;
26
+ if (seen.has(id))
27
+ continue;
28
+ seen.add(id);
29
+ unique.push({ ...step.pose, id, name: step.label });
30
+ }
31
+ return unique;
32
+ }
33
+ if (options.all === true)
34
+ return [...lib.poses.values()];
35
+ return Promise.all(refs.map((ref) => resolvePose(ref, options.lib)));
36
+ };
37
+ export const registerViewCommands = (program) => {
38
+ program
39
+ .command('view <pose>')
40
+ .description('Write a self-contained interactive 3D viewer (orbit, zoom, pan) as one offline HTML file')
41
+ .option('-o, --out <file>', 'output path (defaults to <pose-id>.viewer.html)')
42
+ .option('--camera <view>', 'starting viewpoint: a preset or "azimuth=30,elevation=15"')
43
+ .option('--settle', 'drop the figure onto the ground with the physics engine first')
44
+ .option('--open', 'open the viewer in the default browser')
45
+ .option('--lib <dir>', 'load poses from this directory')
46
+ .action(async (ref, options) => {
47
+ const pose = await resolvePose(ref, options.lib);
48
+ const skeleton = await solvePose(pose, options.settle === undefined ? {} : { settle: options.settle });
49
+ const camera = resolveCamera(options.camera === undefined ? pose.camera : parseCamera(options.camera));
50
+ const html = await buildViewerHtml(skeleton, {
51
+ title: pose.name,
52
+ subtitle: pose.sanskrit,
53
+ camera,
54
+ engaged: pose.muscles.engaged,
55
+ stretched: pose.muscles.stretched,
56
+ });
57
+ const out = options.out ?? `${pose.id}.viewer.html`;
58
+ await mkdir(dirname(out), { recursive: true });
59
+ await writeFile(out, html);
60
+ process.stdout.write(`${out}\n`);
61
+ if (options.open === true)
62
+ openFile(out);
63
+ });
64
+ program
65
+ .command('html [poses...]')
66
+ .description('Write ONE self-contained HTML: interactive 3D viewer with pose picker plus an SVG gallery')
67
+ .requiredOption('-o, --out <file>', 'output path (.html)')
68
+ .option('--all', 'every pose in the library')
69
+ .option('--sequence <id>', 'every distinct pose of a sequence, in practice order')
70
+ .option('--title <text>', 'page title')
71
+ .option('--settle', 'drop each figure onto the ground with the physics engine first')
72
+ .option('--open', 'open the page in the default browser')
73
+ .option('--lib <dir>', 'load poses from this directory')
74
+ .action(async (refs, options) => {
75
+ const poses = await posesFor(refs, options);
76
+ if (poses.length === 0)
77
+ throw new Error('Nothing to show: pass pose ids, --all, or --sequence <id>');
78
+ const settle = options.settle === undefined ? {} : { settle: options.settle };
79
+ const entries = await Promise.all(poses.map(async (pose) => ({ pose, skeleton: await solvePose(pose, settle) })));
80
+ const html = await buildShowcaseHtml(entries, options.title === undefined ? {} : { title: options.title });
81
+ await mkdir(dirname(options.out), { recursive: true });
82
+ await writeFile(options.out, html);
83
+ process.stdout.write(`${options.out}\n`);
84
+ if (options.open === true)
85
+ openFile(options.out);
86
+ });
87
+ };
88
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/cli/commands/view.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -1,18 +1,23 @@
1
1
  #!/usr/bin/env node
2
+ import { readFile } from 'node:fs/promises';
2
3
  import { Command } from 'commander';
3
4
  import { PoseParseError } from '../model/index.js';
4
5
  import { registerExportCommands } from './commands/export.js';
5
6
  import { registerInfoCommands } from './commands/info.js';
6
7
  import { registerRenderCommands } from './commands/render.js';
8
+ import { registerViewCommands } from './commands/view.js';
9
+ // Both dist/cli/index.js and src/cli/index.ts sit two levels below the root.
10
+ const pkg = JSON.parse(await readFile(new URL('../../package.json', import.meta.url), 'utf8'));
7
11
  const program = new Command();
8
12
  program
9
13
  .name('asanakit')
10
- .description('Programmatic stick-figure and anatomical infographics for yoga and surf postures.')
11
- .version('0.1.0')
14
+ .description('Programmatic stick-figure and body-posture visualization for yoga and surf, in 2D and 3D.')
15
+ .version(pkg.version)
12
16
  .showHelpAfterError();
13
17
  registerRenderCommands(program);
14
18
  registerInfoCommands(program);
15
19
  registerExportCommands(program);
20
+ registerViewCommands(program);
16
21
  const fail = (error) => {
17
22
  if (error instanceof PoseParseError) {
18
23
  process.stderr.write(`${error.message}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,mFAAmF,CAAC;KAChG,OAAO,CAAC,OAAO,CAAC;KAChB,kBAAkB,EAAE,CAAC;AAExB,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,MAAM,IAAI,GAAG,CAAC,KAAc,EAAS,EAAE;IACrC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,IAAI,CAAC;IACH,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,IAAI,CAAC,KAAK,CAAC,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,6EAA6E;AAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAE5F,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,2FAA2F,CAAC;KACxG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,kBAAkB,EAAE,CAAC;AAExB,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE9B,MAAM,IAAI,GAAG,CAAC,KAAc,EAAS,EAAE;IACrC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,IAAI,CAAC;IACH,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,IAAI,CAAC,KAAK,CAAC,CAAC;AACd,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type CameraInput } from '../core/camera.js';
1
2
  import { type Library } from '../library/index.js';
2
3
  import { type PoseSpec } from '../model/index.js';
3
4
  import { type StyleId } from '../render/index.js';
@@ -9,4 +10,9 @@ export declare const library: (root?: string) => Promise<Library>;
9
10
  export declare const resolvePose: (ref: string, libRoot?: string) => Promise<PoseSpec>;
10
11
  export declare const parseStyle: (value: string) => StyleId;
11
12
  export declare const parseIntOption: (value: string, name: string) => number;
13
+ /**
14
+ * A camera flag is either a preset name or comma-separated orbit angles:
15
+ * `--camera back`, `--camera "azimuth=30,elevation=15"`, `--camera 30,15`.
16
+ */
17
+ export declare const parseCamera: (value: string) => CameraInput;
12
18
  //# sourceMappingURL=resolve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/cli/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIxE,eAAO,MAAM,OAAO,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,OAAO,CAI5D,CAAC;AAUF;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAU,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,OAAO,CAAC,QAAQ,CAUjF,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,OAG1C,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,KAAG,MAI5D,CAAC"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/cli/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAAuC,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIxE,eAAO,MAAM,OAAO,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,OAAO,CAI5D,CAAC;AAUF;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAU,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,OAAO,CAAC,QAAQ,CAUjF,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,OAG1C,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,KAAG,MAI5D,CAAC;AAeF;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,WAkB3C,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { stat } from 'node:fs/promises';
2
+ import { CAMERA_PRESET_IDS, isCameraPresetId } from '../core/camera.js';
2
3
  import { loadLibrary } from '../library/index.js';
3
4
  import { loadPoseFile } from '../model/index.js';
4
5
  import { isStyleId, STYLE_IDS } from '../render/index.js';
@@ -43,4 +44,43 @@ export const parseIntOption = (value, name) => {
43
44
  throw new Error(`--${name} must be a positive number, got "${value}"`);
44
45
  return n;
45
46
  };
47
+ const parseCameraPart = (part, named, bare) => {
48
+ const [key, raw] = part.includes('=') ? part.split('=', 2) : [undefined, part];
49
+ const n = Number(raw);
50
+ if (!Number.isFinite(n))
51
+ throw new Error(`--camera: "${part}" is not a number`);
52
+ if (key === undefined) {
53
+ bare.push(n);
54
+ }
55
+ else if (key === 'azimuth' || key === 'elevation' || key === 'roll') {
56
+ named[key] = n;
57
+ }
58
+ else {
59
+ throw new Error(`--camera: unknown key "${key}" (use azimuth, elevation, roll)`);
60
+ }
61
+ };
62
+ /**
63
+ * A camera flag is either a preset name or comma-separated orbit angles:
64
+ * `--camera back`, `--camera "azimuth=30,elevation=15"`, `--camera 30,15`.
65
+ */
66
+ export const parseCamera = (value) => {
67
+ if (isCameraPresetId(value))
68
+ return value;
69
+ const named = {};
70
+ const bare = [];
71
+ const parts = value.split(',').map((p) => p.trim()).filter((p) => p.length > 0);
72
+ for (const part of parts)
73
+ parseCameraPart(part, named, bare);
74
+ if (bare.length > 3)
75
+ throw new Error('--camera takes at most three angles: azimuth,elevation,roll');
76
+ if (bare.length === 0 && Object.keys(named).length === 0) {
77
+ throw new Error(`--camera: "${value}" is neither a preset (${CAMERA_PRESET_IDS.join(', ')}) nor angles`);
78
+ }
79
+ const [azimuth, elevation, roll] = bare;
80
+ return {
81
+ azimuth: named.azimuth ?? azimuth ?? 0,
82
+ elevation: named.elevation ?? elevation ?? 0,
83
+ roll: named.roll ?? roll ?? 0,
84
+ };
85
+ };
46
86
  //# sourceMappingURL=resolve.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/cli/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAiB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAgB,MAAM,oBAAoB,CAAC;AAExE,IAAI,MAAM,GAAmB,IAAI,CAAC;AAElC,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,IAAa,EAAoB,EAAE;IAC/D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,KAAK,MAAM,WAAW,EAAE,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,KAAK,EAAE,IAAY,EAAoB,EAAE;IACtD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,GAAW,EAAE,OAAgB,EAAqB,EAAE;IACpF,IAAI,MAAM,MAAM,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAEhD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,WAAW,KAAK,2BAA2B,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAW,EAAE;IACnD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,iBAAiB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvG,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,IAAY,EAAU,EAAE;IACpE,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,oCAAoC,KAAK,GAAG,CAAC,CAAC;IAC1G,OAAO,CAAC,CAAC;AACX,CAAC,CAAC"}
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/cli/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAoB,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAiB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAgB,MAAM,oBAAoB,CAAC;AAExE,IAAI,MAAM,GAAmB,IAAI,CAAC;AAElC,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,IAAa,EAAoB,EAAE;IAC/D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,KAAK,MAAM,WAAW,EAAE,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,KAAK,EAAE,IAAY,EAAoB,EAAE;IACtD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,GAAW,EAAE,OAAgB,EAAqB,EAAE;IACpF,IAAI,MAAM,MAAM,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAEhD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,WAAW,KAAK,2BAA2B,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAW,EAAE;IACnD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,iBAAiB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvG,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,IAAY,EAAU,EAAE;IACpE,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,oCAAoC,KAAK,GAAG,CAAC,CAAC;IAC1G,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,KAA6B,EAAE,IAAc,EAAQ,EAAE;IAC5F,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/E,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,mBAAmB,CAAC,CAAC;IAChF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACtE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,kCAAkC,CAAC,CAAC;IACnF,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAe,EAAE;IACxD,IAAI,gBAAgB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1C,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChF,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE7D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACpG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,0BAA0B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;IACxC,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC;QACtC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS,IAAI,CAAC;QAC5C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC;KAC9B,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * A camera is an orbit around the figure: azimuth walks around it, elevation
3
+ * climbs above it, roll tilts the picture. Azimuth 0 looks at the figure's
4
+ * front, positive azimuth walks toward the figure's LEFT (so `left` shows the
5
+ * figure's left side); elevation 90 looks straight down.
6
+ */
7
+ export interface CameraAngles {
8
+ readonly azimuth: number;
9
+ readonly elevation: number;
10
+ readonly roll: number;
11
+ }
12
+ export declare const CAMERA_PRESETS: {
13
+ readonly front: {
14
+ readonly azimuth: 0;
15
+ readonly elevation: 0;
16
+ readonly roll: 0;
17
+ };
18
+ readonly back: {
19
+ readonly azimuth: 180;
20
+ readonly elevation: 0;
21
+ readonly roll: 0;
22
+ };
23
+ readonly left: {
24
+ readonly azimuth: 90;
25
+ readonly elevation: 0;
26
+ readonly roll: 0;
27
+ };
28
+ readonly right: {
29
+ readonly azimuth: -90;
30
+ readonly elevation: 0;
31
+ readonly roll: 0;
32
+ };
33
+ /** The classic profile of a yoga diagram: the figure faces picture-right. */
34
+ readonly side: {
35
+ readonly azimuth: -90;
36
+ readonly elevation: 0;
37
+ readonly roll: 0;
38
+ };
39
+ readonly 'three-quarter': {
40
+ readonly azimuth: -45;
41
+ readonly elevation: 10;
42
+ readonly roll: 0;
43
+ };
44
+ readonly top: {
45
+ readonly azimuth: 0;
46
+ readonly elevation: 90;
47
+ readonly roll: 0;
48
+ };
49
+ };
50
+ export type CameraPresetId = keyof typeof CAMERA_PRESETS;
51
+ export declare const CAMERA_PRESET_IDS: readonly CameraPresetId[];
52
+ /** What a pose file or a CLI flag may say about the camera. */
53
+ export type CameraInput = CameraPresetId | Partial<CameraAngles>;
54
+ export declare const isCameraPresetId: (value: string) => value is CameraPresetId;
55
+ export declare const resolveCamera: (input?: CameraInput) => CameraAngles;
56
+ //# sourceMappingURL=camera.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../src/core/camera.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;IAKzB,6EAA6E;;;;;;;;;;;;;;;;CAI9B,CAAC;AAElD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,cAAc,CAAC;AAEzD,eAAO,MAAM,iBAAiB,EAAkC,SAAS,cAAc,EAAE,CAAC;AAE1F,+DAA+D;AAC/D,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAEjE,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,KAAK,IAAI,cAAyC,CAAC;AAEpG,eAAO,MAAM,aAAa,GAAI,QAAQ,WAAW,KAAG,YAInD,CAAC"}
@@ -0,0 +1,20 @@
1
+ export const CAMERA_PRESETS = {
2
+ front: { azimuth: 0, elevation: 0, roll: 0 },
3
+ back: { azimuth: 180, elevation: 0, roll: 0 },
4
+ left: { azimuth: 90, elevation: 0, roll: 0 },
5
+ right: { azimuth: -90, elevation: 0, roll: 0 },
6
+ /** The classic profile of a yoga diagram: the figure faces picture-right. */
7
+ side: { azimuth: -90, elevation: 0, roll: 0 },
8
+ 'three-quarter': { azimuth: -45, elevation: 10, roll: 0 },
9
+ top: { azimuth: 0, elevation: 90, roll: 0 },
10
+ };
11
+ export const CAMERA_PRESET_IDS = Object.keys(CAMERA_PRESETS);
12
+ export const isCameraPresetId = (value) => value in CAMERA_PRESETS;
13
+ export const resolveCamera = (input) => {
14
+ if (input === undefined)
15
+ return CAMERA_PRESETS.front;
16
+ if (typeof input === 'string')
17
+ return CAMERA_PRESETS[input];
18
+ return { azimuth: input.azimuth ?? 0, elevation: input.elevation ?? 0, roll: input.roll ?? 0 };
19
+ };
20
+ //# sourceMappingURL=camera.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../src/core/camera.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;IAC5C,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;IAC7C,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;IAC5C,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;IAC9C,6EAA6E;IAC7E,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;IAC7C,eAAe,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IACzD,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;CACI,CAAC;AAIlD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAA8B,CAAC;AAK1F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAA2B,EAAE,CAAC,KAAK,IAAI,cAAc,CAAC;AAEpG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAmB,EAAgB,EAAE;IACjE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,KAAK,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;AACjG,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type Quat } from './quat.js';
2
+ import type { BoneDef, JointRotation, JointValue, WorldDirection } from './types.js';
3
+ import type { Vec3 } from './vec3.js';
4
+ /** A scalar joint value is pure flexion; an object fills in what it names. */
5
+ export declare const normalizeJoint: (value: JointValue) => JointRotation;
6
+ /**
7
+ * The rotation a joint value applies to its bone, about the bone's anatomical
8
+ * axes in the rest frame: twist first (along the bone), then abduction, then
9
+ * flexion.
10
+ */
11
+ export declare const jointQuat: (bone: BoneDef, value: JointValue) => Quat;
12
+ /**
13
+ * The unit direction a `world` override names: azimuth turns from +z (the
14
+ * figure's facing direction) toward +x (the figure's left), elevation rises
15
+ * from horizontal.
16
+ */
17
+ export declare const sphereDir: (world: WorldDirection) => Vec3;
18
+ //# sourceMappingURL=joints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joints.d.ts","sourceRoot":"","sources":["../../src/core/joints.ts"],"names":[],"mappings":"AACA,OAAO,EAAwC,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAItC,8EAA8E;AAC9E,eAAO,MAAM,cAAc,GAAI,OAAO,UAAU,KAAG,aACiC,CAAC;AAErF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,OAAO,EAAE,OAAO,UAAU,KAAG,IAO5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,KAAG,IAIjD,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { degToRad } from './angles.js';
2
+ import { axisAngleDeg, mulQuat, QUAT_IDENTITY } from './quat.js';
3
+ const NEUTRAL = { flex: 0, abduct: 0, twist: 0 };
4
+ /** A scalar joint value is pure flexion; an object fills in what it names. */
5
+ export const normalizeJoint = (value) => typeof value === 'number' ? { ...NEUTRAL, flex: value } : { ...NEUTRAL, ...value };
6
+ /**
7
+ * The rotation a joint value applies to its bone, about the bone's anatomical
8
+ * axes in the rest frame: twist first (along the bone), then abduction, then
9
+ * flexion.
10
+ */
11
+ export const jointQuat = (bone, value) => {
12
+ const j = normalizeJoint(value);
13
+ if (j.flex === 0 && j.abduct === 0 && j.twist === 0)
14
+ return QUAT_IDENTITY;
15
+ return mulQuat(axisAngleDeg(bone.flexAxis, j.flex), mulQuat(axisAngleDeg(bone.abductAxis, j.abduct), axisAngleDeg(bone.twistAxis, j.twist)));
16
+ };
17
+ /**
18
+ * The unit direction a `world` override names: azimuth turns from +z (the
19
+ * figure's facing direction) toward +x (the figure's left), elevation rises
20
+ * from horizontal.
21
+ */
22
+ export const sphereDir = (world) => {
23
+ const az = degToRad(world.azimuth);
24
+ const el = degToRad(world.elevation);
25
+ return [Math.sin(az) * Math.cos(el), Math.sin(el), Math.cos(az) * Math.cos(el)];
26
+ };
27
+ //# sourceMappingURL=joints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joints.js","sourceRoot":"","sources":["../../src/core/joints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAa,MAAM,WAAW,CAAC;AAI5E,MAAM,OAAO,GAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAEhE,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAiB,EAAiB,EAAE,CACjE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;AAErF;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAa,EAAE,KAAiB,EAAQ,EAAE;IAClE,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IAC1E,OAAO,OAAO,CACZ,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EACnC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CACxF,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAqB,EAAQ,EAAE;IACvD,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAClF,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type Vec3 } from './vec3.js';
2
+ export type Quat = readonly [number, number, number, number];
3
+ export declare const QUAT_IDENTITY: Quat;
4
+ /** Rotation of `deg` degrees about `axis` (right-hand rule; axis need not be unit). */
5
+ export declare const axisAngleDeg: (axis: Vec3, deg: number) => Quat;
6
+ /** `a` after `b`: the combined rotation applies `b` first, then `a`. */
7
+ export declare const mulQuat: (a: Quat, b: Quat) => Quat;
8
+ export declare const rotateVec3: (q: Quat, v: Vec3) => Vec3;
9
+ /** Shortest-arc rotation taking unit vector `from` onto unit vector `to`. */
10
+ export declare const rotationTo: (from: Vec3, to: Vec3) => Quat;
11
+ /**
12
+ * Root orientation from yaw/pitch/roll in degrees, applied roll first, then
13
+ * pitch, then yaw: yaw turns about +y (positive faces the figure toward its
14
+ * left), pitch tips forward about +x (positive leans toward +z), roll
15
+ * cartwheels about +z (positive drops the figure toward its left).
16
+ */
17
+ export declare const yawPitchRollDeg: (yaw: number, pitch: number, roll: number) => Quat;
18
+ //# sourceMappingURL=quat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quat.d.ts","sourceRoot":"","sources":["../../src/core/quat.ts"],"names":[],"mappings":"AAOA,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE7D,eAAO,MAAM,aAAa,EAAE,IAAmB,CAAC;AAIhD,uFAAuF;AACvF,eAAO,MAAM,YAAY,GAAI,MAAM,IAAI,EAAE,KAAK,MAAM,KAAG,IACsC,CAAC;AAE9F,wEAAwE;AACxE,eAAO,MAAM,OAAO,GAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAG,IAAoE,CAAC;AAEhH,eAAO,MAAM,UAAU,GAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAG,IACkB,CAAC;AAEjE,6EAA6E;AAC7E,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,EAAE,IAAI,IAAI,KAAG,IAC0C,CAAC;AAE7F;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,MAAM,KAAG,IACoC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Quaternion helpers on top of gl-matrix (MIT). Quaternions never appear in
3
+ * pose files - YAML speaks degrees about anatomical axes - but every rotation
4
+ * inside the solver is one of these.
5
+ */
6
+ import { quat as gl, vec3 as glv } from 'gl-matrix';
7
+ import { degToRad } from './angles.js';
8
+ import { normalize3 } from './vec3.js';
9
+ export const QUAT_IDENTITY = [0, 0, 0, 1];
10
+ const out = () => [0, 0, 0, 1];
11
+ /** Rotation of `deg` degrees about `axis` (right-hand rule; axis need not be unit). */
12
+ export const axisAngleDeg = (axis, deg) => gl.setAxisAngle(out(), normalize3(axis), degToRad(deg));
13
+ /** `a` after `b`: the combined rotation applies `b` first, then `a`. */
14
+ export const mulQuat = (a, b) => gl.multiply(out(), a, b);
15
+ export const rotateVec3 = (q, v) => glv.transformQuat([0, 0, 0], v, q);
16
+ /** Shortest-arc rotation taking unit vector `from` onto unit vector `to`. */
17
+ export const rotationTo = (from, to) => gl.rotationTo(out(), normalize3(from), normalize3(to));
18
+ /**
19
+ * Root orientation from yaw/pitch/roll in degrees, applied roll first, then
20
+ * pitch, then yaw: yaw turns about +y (positive faces the figure toward its
21
+ * left), pitch tips forward about +x (positive leans toward +z), roll
22
+ * cartwheels about +z (positive drops the figure toward its left).
23
+ */
24
+ export const yawPitchRollDeg = (yaw, pitch, roll) => mulQuat(axisAngleDeg([0, 1, 0], yaw), mulQuat(axisAngleDeg([1, 0, 0], pitch), axisAngleDeg([0, 0, 1], roll)));
25
+ //# sourceMappingURL=quat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quat.js","sourceRoot":"","sources":["../../src/core/quat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAa,MAAM,WAAW,CAAC;AAIlD,MAAM,CAAC,MAAM,aAAa,GAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEhD,MAAM,GAAG,GAAG,GAAqC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjE,uFAAuF;AACvF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAU,EAAE,GAAW,EAAQ,EAAE,CAC5D,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAqC,CAAC;AAE9F,wEAAwE;AACxE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAO,EAAE,CAAO,EAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAqC,CAAC;AAEhH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAO,EAAE,CAAO,EAAQ,EAAE,CACnD,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAA6B,CAAC;AAEjE,6EAA6E;AAC7E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAQ,EAAQ,EAAE,CACvD,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,CAAqC,CAAC;AAE7F;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,IAAY,EAAQ,EAAE,CAChF,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC"}
@@ -1,8 +1,3 @@
1
- import type { Rig, ViewConfig, ViewId } from './types.js';
1
+ import type { Rig } from './types.js';
2
2
  export declare const DEFAULT_RIG: Rig;
3
- /**
4
- * Views are 2D projections of a 3D body, so they only need two foreshortening
5
- * factors plus a rule for which way the feet point.
6
- */
7
- export declare const VIEWS: Record<ViewId, ViewConfig>;
8
3
  //# sourceMappingURL=rig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rig.d.ts","sourceRoot":"","sources":["../../src/core/rig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAwFnE,eAAO,MAAM,WAAW,EAAE,GAIzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAK5C,CAAC"}
1
+ {"version":3,"file":"rig.d.ts","sourceRoot":"","sources":["../../src/core/rig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,GAAG,EAAE,MAAM,YAAY,CAAC;AA0E/C,eAAO,MAAM,WAAW,EAAE,GAIzB,CAAC"}