@franzenzenhofer/asanakit 0.1.0 → 0.2.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.
- package/README.md +78 -46
- package/dist/anatomy/muscles.d.ts +10 -7
- package/dist/anatomy/muscles.d.ts.map +1 -1
- package/dist/anatomy/muscles.js +21 -17
- package/dist/anatomy/muscles.js.map +1 -1
- package/dist/anatomy/validate.d.ts.map +1 -1
- package/dist/anatomy/validate.js +16 -10
- package/dist/anatomy/validate.js.map +1 -1
- package/dist/cli/commands/export.d.ts.map +1 -1
- package/dist/cli/commands/export.js +24 -2
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +3 -1
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/render.d.ts.map +1 -1
- package/dist/cli/commands/render.js +12 -3
- package/dist/cli/commands/render.js.map +1 -1
- package/dist/cli/commands/view.d.ts +3 -0
- package/dist/cli/commands/view.d.ts.map +1 -0
- package/dist/cli/commands/view.js +40 -0
- package/dist/cli/commands/view.js.map +1 -0
- package/dist/cli/index.js +7 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/resolve.d.ts +6 -0
- package/dist/cli/resolve.d.ts.map +1 -1
- package/dist/cli/resolve.js +40 -0
- package/dist/cli/resolve.js.map +1 -1
- package/dist/core/camera.d.ts +56 -0
- package/dist/core/camera.d.ts.map +1 -0
- package/dist/core/camera.js +20 -0
- package/dist/core/camera.js.map +1 -0
- package/dist/core/joints.d.ts +18 -0
- package/dist/core/joints.d.ts.map +1 -0
- package/dist/core/joints.js +27 -0
- package/dist/core/joints.js.map +1 -0
- package/dist/core/quat.d.ts +18 -0
- package/dist/core/quat.d.ts.map +1 -0
- package/dist/core/quat.js +25 -0
- package/dist/core/quat.js.map +1 -0
- package/dist/core/rig.d.ts +1 -6
- package/dist/core/rig.d.ts.map +1 -1
- package/dist/core/rig.js +45 -74
- package/dist/core/rig.js.map +1 -1
- package/dist/core/skeleton.d.ts +4 -13
- package/dist/core/skeleton.d.ts.map +1 -1
- package/dist/core/skeleton.js +39 -69
- package/dist/core/skeleton.js.map +1 -1
- package/dist/core/types.d.ts +62 -55
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/vec3.d.ts +13 -0
- package/dist/core/vec3.d.ts.map +1 -0
- package/dist/core/vec3.js +26 -0
- package/dist/core/vec3.js.map +1 -0
- package/dist/export3d/gltf.d.ts +11 -0
- package/dist/export3d/gltf.d.ts.map +1 -0
- package/dist/export3d/gltf.js +28 -0
- package/dist/export3d/gltf.js.map +1 -0
- package/dist/export3d/index.d.ts +3 -0
- package/dist/export3d/index.d.ts.map +1 -0
- package/dist/export3d/index.js +3 -0
- package/dist/export3d/index.js.map +1 -0
- package/dist/export3d/shims.d.ts +7 -0
- package/dist/export3d/shims.d.ts.map +1 -0
- package/dist/export3d/shims.js +27 -0
- package/dist/export3d/shims.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/library/index.js +4 -4
- package/dist/library/index.js.map +1 -1
- package/dist/model/pose.d.ts +11 -5
- package/dist/model/pose.d.ts.map +1 -1
- package/dist/model/pose.js +30 -16
- package/dist/model/pose.js.map +1 -1
- package/dist/model/schema.d.ts +69 -28
- package/dist/model/schema.d.ts.map +1 -1
- package/dist/model/schema.js +57 -17
- package/dist/model/schema.js.map +1 -1
- package/dist/physics/index.d.ts +3 -0
- package/dist/physics/index.d.ts.map +1 -0
- package/dist/physics/index.js +3 -0
- package/dist/physics/index.js.map +1 -0
- package/dist/physics/rapier-types.d.ts +60 -0
- package/dist/physics/rapier-types.d.ts.map +1 -0
- package/dist/physics/rapier-types.js +12 -0
- package/dist/physics/rapier-types.js.map +1 -0
- package/dist/physics/settle.d.ts +3 -0
- package/dist/physics/settle.d.ts.map +1 -0
- package/dist/physics/settle.js +108 -0
- package/dist/physics/settle.js.map +1 -0
- package/dist/physics/world.d.ts +4 -0
- package/dist/physics/world.d.ts.map +1 -0
- package/dist/physics/world.js +18 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/render/anatomy.js +1 -1
- package/dist/render/anatomy.js.map +1 -1
- package/dist/render/annotations.d.ts +3 -2
- package/dist/render/annotations.d.ts.map +1 -1
- package/dist/render/annotations.js.map +1 -1
- package/dist/render/camera.d.ts +43 -0
- package/dist/render/camera.d.ts.map +1 -0
- package/dist/render/camera.js +57 -0
- package/dist/render/camera.js.map +1 -0
- package/dist/render/context.d.ts +5 -3
- package/dist/render/context.d.ts.map +1 -1
- package/dist/render/figure.d.ts +4 -2
- package/dist/render/figure.d.ts.map +1 -1
- package/dist/render/figure.js +29 -43
- package/dist/render/figure.js.map +1 -1
- package/dist/render/index.d.ts +1 -0
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +1 -0
- package/dist/render/index.js.map +1 -1
- package/dist/render/props.d.ts +4 -3
- package/dist/render/props.d.ts.map +1 -1
- package/dist/render/props.js.map +1 -1
- package/dist/render/scene.d.ts +7 -1
- package/dist/render/scene.d.ts.map +1 -1
- package/dist/render/scene.js +8 -1
- package/dist/render/scene.js.map +1 -1
- package/dist/render/sheet.d.ts +3 -0
- package/dist/render/sheet.d.ts.map +1 -1
- package/dist/render/sheet.js +2 -0
- package/dist/render/sheet.js.map +1 -1
- package/dist/solve.d.ts +14 -0
- package/dist/solve.d.ts.map +1 -0
- package/dist/solve.js +17 -0
- package/dist/solve.js.map +1 -0
- package/dist/standards/keypoints.d.ts +2 -10
- package/dist/standards/keypoints.d.ts.map +1 -1
- package/dist/standards/keypoints.js +33 -14
- package/dist/standards/keypoints.js.map +1 -1
- package/dist/three/index.d.ts +2 -0
- package/dist/three/index.d.ts.map +1 -0
- package/dist/three/index.js +2 -0
- package/dist/three/index.js.map +1 -0
- package/dist/three/scene.d.ts +22 -0
- package/dist/three/scene.d.ts.map +1 -0
- package/dist/three/scene.js +90 -0
- package/dist/three/scene.js.map +1 -0
- package/dist/viewer/html.d.ts +16 -0
- package/dist/viewer/html.d.ts.map +1 -0
- package/dist/viewer/html.js +59 -0
- package/dist/viewer/html.js.map +1 -0
- package/dist/viewer/index.d.ts +2 -0
- package/dist/viewer/index.d.ts.map +1 -0
- package/dist/viewer/index.js +2 -0
- package/dist/viewer/index.js.map +1 -0
- package/dist/viewer/viewer.bundle.js +4119 -0
- package/docs/AUTHORING.md +119 -58
- package/package.json +20 -5
- package/poses/surf/bottom-turn.pose.yaml +24 -24
- package/poses/surf/cutback.pose.yaml +24 -24
- package/poses/surf/duck-dive.pose.yaml +23 -23
- package/poses/surf/noseride.pose.yaml +23 -25
- package/poses/surf/paddling.pose.yaml +24 -24
- package/poses/surf/pop-up.pose.yaml +24 -24
- package/poses/surf/takeoff.pose.yaml +24 -24
- package/poses/surf/tube-stance.pose.yaml +24 -24
- package/poses/yoga/ashtanga/adho-mukha-svanasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/ardha-uttanasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/baddha-konasana.pose.yaml +21 -23
- package/poses/yoga/ashtanga/balasana.pose.yaml +23 -23
- package/poses/yoga/ashtanga/chaturanga-dandasana.pose.yaml +21 -21
- package/poses/yoga/ashtanga/dandasana.pose.yaml +21 -23
- package/poses/yoga/ashtanga/halasana.pose.yaml +23 -23
- package/poses/yoga/ashtanga/janu-sirsasana-a.pose.yaml +22 -22
- package/poses/yoga/ashtanga/karnapidasana.pose.yaml +23 -23
- package/poses/yoga/ashtanga/marichyasana-a.pose.yaml +22 -22
- package/poses/yoga/ashtanga/marichyasana-c.pose.yaml +21 -23
- package/poses/yoga/ashtanga/matsyasana.pose.yaml +23 -23
- package/poses/yoga/ashtanga/navasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/padahastasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/padangusthasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/padmasana.pose.yaml +22 -24
- package/poses/yoga/ashtanga/parsvottanasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/paschimottanasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/prasarita-padottanasana-a.pose.yaml +26 -26
- package/poses/yoga/ashtanga/prasarita-padottanasana-c.pose.yaml +26 -26
- package/poses/yoga/ashtanga/primary.seq.yaml +2 -4
- package/poses/yoga/ashtanga/purvottanasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/salamba-sarvangasana.pose.yaml +23 -23
- package/poses/yoga/ashtanga/samasthiti.pose.yaml +10 -10
- package/poses/yoga/ashtanga/savasana.pose.yaml +21 -21
- package/poses/yoga/ashtanga/setu-bandhasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/sirsasana.pose.yaml +23 -23
- package/poses/yoga/ashtanga/supta-padangusthasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/upavistha-konasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/urdhva-dhanurasana.pose.yaml +23 -23
- package/poses/yoga/ashtanga/urdhva-hastasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/urdhva-mukha-svanasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/utkatasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/uttanasana.pose.yaml +22 -22
- package/poses/yoga/ashtanga/utthita-parsvakonasana.pose.yaml +24 -24
- package/poses/yoga/ashtanga/utthita-trikonasana.pose.yaml +24 -24
- package/poses/yoga/ashtanga/virabhadrasana-a.pose.yaml +22 -22
- package/poses/yoga/ashtanga/virabhadrasana-b.pose.yaml +21 -23
|
@@ -2,13 +2,15 @@ import { mkdir, writeFile } from 'node:fs/promises';
|
|
|
2
2
|
import { dirname, extname } from 'node:path';
|
|
3
3
|
import { expandSequence } from '../../library/index.js';
|
|
4
4
|
import { optimizeSvg, renderPng, renderSheet, renderSvg } from '../../render/index.js';
|
|
5
|
-
import {
|
|
5
|
+
import { solvePose } from '../../solve.js';
|
|
6
|
+
import { library, parseCamera, parseIntOption, parseStyle, resolvePose } from '../resolve.js';
|
|
6
7
|
const renderOptionsFrom = (o) => ({
|
|
7
8
|
style: parseStyle(o.style),
|
|
8
9
|
width: parseIntOption(o.width, 'width'),
|
|
9
10
|
height: parseIntOption(o.height, 'height'),
|
|
10
11
|
title: o.title === true,
|
|
11
12
|
caption: o.caption === true,
|
|
13
|
+
...(o.camera === undefined ? {} : { camera: parseCamera(o.camera) }),
|
|
12
14
|
...(o.muscles === undefined ? {} : { muscles: o.muscles }),
|
|
13
15
|
...(o.background === undefined ? {} : { background: o.background }),
|
|
14
16
|
});
|
|
@@ -28,6 +30,8 @@ const withCommonOptions = (cmd) => cmd
|
|
|
28
30
|
.option('-s, --style <style>', 'stick | anatomy | silhouette | blueprint | ink | poster | minimal', 'stick')
|
|
29
31
|
.option('-w, --width <px>', 'canvas width', '600')
|
|
30
32
|
.option('-h, --height <px>', 'canvas height', '800')
|
|
33
|
+
.option('--camera <view>', 'front | back | left | right | side | three-quarter | top, or "azimuth=30,elevation=15"')
|
|
34
|
+
.option('--settle', 'drop the figure onto the ground with the physics engine before rendering')
|
|
31
35
|
.option('--title', 'draw the pose name above the figure')
|
|
32
36
|
.option('--caption', 'draw the teaching cues below the figure')
|
|
33
37
|
.option('--muscles', 'force the muscle layer on')
|
|
@@ -42,7 +46,8 @@ export const registerRenderCommands = (program) => {
|
|
|
42
46
|
.description('Render one pose (a .pose.yaml file, or a library id) to SVG or PNG')
|
|
43
47
|
.requiredOption('-o, --out <file>', 'output path; the extension picks the format (.svg or .png)')).action(async (ref, options) => {
|
|
44
48
|
const pose = await resolvePose(ref, options.lib);
|
|
45
|
-
await
|
|
49
|
+
const skeleton = await solvePose(pose, options.settle === undefined ? {} : { settle: options.settle });
|
|
50
|
+
await write(options.out, renderSvg(pose, { ...renderOptionsFrom(options), skeleton }), options);
|
|
46
51
|
});
|
|
47
52
|
withCommonOptions(program
|
|
48
53
|
.command('sheet [poses...]')
|
|
@@ -70,8 +75,11 @@ export const registerRenderCommands = (program) => {
|
|
|
70
75
|
}
|
|
71
76
|
if (poses.length === 0)
|
|
72
77
|
throw new Error('Nothing to render: pass pose ids, --all, or --sequence <id>');
|
|
78
|
+
const settle = options.settle === undefined ? {} : { settle: options.settle };
|
|
79
|
+
const skeletons = await Promise.all(poses.map((p) => solvePose(p, settle)));
|
|
73
80
|
const sheetOptions = {
|
|
74
81
|
...renderOptionsFrom(options),
|
|
82
|
+
skeletons,
|
|
75
83
|
columns: parseIntOption(options.columns, 'columns'),
|
|
76
84
|
cellWidth: parseIntOption(options.width, 'width'),
|
|
77
85
|
cellHeight: parseIntOption(options.height, 'height'),
|
|
@@ -96,7 +104,8 @@ export const registerRenderCommands = (program) => {
|
|
|
96
104
|
for (const [i, step] of steps.entries()) {
|
|
97
105
|
const n = String(i + 1).padStart(pad, '0');
|
|
98
106
|
const path = `${options.out}/${n}-${step.pose.id}${step.side === 'right' ? '-right' : ''}.${options.format}`;
|
|
99
|
-
await
|
|
107
|
+
const skeleton = await solvePose(step.pose, options.settle === undefined ? {} : { settle: options.settle });
|
|
108
|
+
await write(path, renderSvg({ ...step.pose, name: step.label }, { ...renderOptionsFrom(options), skeleton }), options);
|
|
100
109
|
}
|
|
101
110
|
});
|
|
102
111
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/cli/commands/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAyC,MAAM,uBAAuB,CAAC;AAC9H,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/cli/commands/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAWzC,eAAO,MAAM,oBAAoB,GAAI,SAAS,OAAO,KAAG,IA4BvD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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 { solvePose } from '../../solve.js';
|
|
6
|
+
import { buildViewerHtml } from '../../viewer/index.js';
|
|
7
|
+
import { parseCamera, resolvePose } from '../resolve.js';
|
|
8
|
+
const openFile = (path) => {
|
|
9
|
+
const cmd = process.platform === 'darwin' ? 'open' : 'xdg-open';
|
|
10
|
+
spawn(cmd, [path], { detached: true, stdio: 'ignore' }).unref();
|
|
11
|
+
};
|
|
12
|
+
export const registerViewCommands = (program) => {
|
|
13
|
+
program
|
|
14
|
+
.command('view <pose>')
|
|
15
|
+
.description('Write a self-contained interactive 3D viewer (orbit, zoom, pan) as one offline HTML file')
|
|
16
|
+
.option('-o, --out <file>', 'output path (defaults to <pose-id>.viewer.html)')
|
|
17
|
+
.option('--camera <view>', 'starting viewpoint: a preset or "azimuth=30,elevation=15"')
|
|
18
|
+
.option('--settle', 'drop the figure onto the ground with the physics engine first')
|
|
19
|
+
.option('--open', 'open the viewer in the default browser')
|
|
20
|
+
.option('--lib <dir>', 'load poses from this directory')
|
|
21
|
+
.action(async (ref, options) => {
|
|
22
|
+
const pose = await resolvePose(ref, options.lib);
|
|
23
|
+
const skeleton = await solvePose(pose, options.settle === undefined ? {} : { settle: options.settle });
|
|
24
|
+
const camera = resolveCamera(options.camera === undefined ? pose.camera : parseCamera(options.camera));
|
|
25
|
+
const html = await buildViewerHtml(skeleton, {
|
|
26
|
+
title: pose.name,
|
|
27
|
+
subtitle: pose.sanskrit,
|
|
28
|
+
camera,
|
|
29
|
+
engaged: pose.muscles.engaged,
|
|
30
|
+
stretched: pose.muscles.stretched,
|
|
31
|
+
});
|
|
32
|
+
const out = options.out ?? `${pose.id}.viewer.html`;
|
|
33
|
+
await mkdir(dirname(out), { recursive: true });
|
|
34
|
+
await writeFile(out, html);
|
|
35
|
+
process.stdout.write(`${out}\n`);
|
|
36
|
+
if (options.open === true)
|
|
37
|
+
openFile(out);
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/cli/commands/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAQ,EAAE;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAChE,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAgB,EAAQ,EAAE;IAC7D,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,0FAA0F,CAAC;SACvG,MAAM,CAAC,kBAAkB,EAAE,iDAAiD,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,2DAA2D,CAAC;SACtF,MAAM,CAAC,UAAU,EAAE,+DAA+D,CAAC;SACnF,MAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC;SAC1D,MAAM,CAAC,aAAa,EAAE,gCAAgC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,OAA0F,EAAE,EAAE;QACxH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvG,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAEvG,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE;YAC3C,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;SAClC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,cAAc,CAAC;QACpD,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
|
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
|
|
11
|
-
.version(
|
|
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`);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/cli/resolve.d.ts
CHANGED
|
@@ -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"}
|
package/dist/cli/resolve.js
CHANGED
|
@@ -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
|
package/dist/cli/resolve.js.map
CHANGED
|
@@ -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"}
|
package/dist/core/rig.d.ts
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
import type { Rig
|
|
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
|
package/dist/core/rig.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rig.d.ts","sourceRoot":"","sources":["../../src/core/rig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,GAAG,EAAE,
|
|
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"}
|