@franzenzenhofer/asanakit 0.1.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/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/anatomy/muscles.d.ts +55 -0
- package/dist/anatomy/muscles.d.ts.map +1 -0
- package/dist/anatomy/muscles.js +79 -0
- package/dist/anatomy/muscles.js.map +1 -0
- package/dist/anatomy/validate.d.ts +11 -0
- package/dist/anatomy/validate.d.ts.map +1 -0
- package/dist/anatomy/validate.js +94 -0
- package/dist/anatomy/validate.js.map +1 -0
- package/dist/cli/commands/export.d.ts +3 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +45 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/info.d.ts +3 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js +101 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/render.d.ts +3 -0
- package/dist/cli/commands/render.d.ts.map +1 -0
- package/dist/cli/commands/render.js +103 -0
- package/dist/cli/commands/render.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/resolve.d.ts +12 -0
- package/dist/cli/resolve.d.ts.map +1 -0
- package/dist/cli/resolve.js +46 -0
- package/dist/cli/resolve.js.map +1 -0
- package/dist/core/angles.d.ts +12 -0
- package/dist/core/angles.d.ts.map +1 -0
- package/dist/core/angles.js +27 -0
- package/dist/core/angles.js.map +1 -0
- package/dist/core/rig.d.ts +8 -0
- package/dist/core/rig.d.ts.map +1 -0
- package/dist/core/rig.js +97 -0
- package/dist/core/rig.js.map +1 -0
- package/dist/core/skeleton.d.ts +17 -0
- package/dist/core/skeleton.d.ts.map +1 -0
- package/dist/core/skeleton.js +144 -0
- package/dist/core/skeleton.js.map +1 -0
- package/dist/core/types.d.ts +105 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +47 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/vec2.d.ts +19 -0
- package/dist/core/vec2.d.ts.map +1 -0
- package/dist/core/vec2.js +41 -0
- package/dist/core/vec2.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/library/index.d.ts +27 -0
- package/dist/library/index.d.ts.map +1 -0
- package/dist/library/index.js +75 -0
- package/dist/library/index.js.map +1 -0
- package/dist/model/index.d.ts +4 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +4 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/parse.d.ts +12 -0
- package/dist/model/parse.d.ts.map +1 -0
- package/dist/model/parse.js +43 -0
- package/dist/model/parse.js.map +1 -0
- package/dist/model/pose.d.ts +11 -0
- package/dist/model/pose.d.ts.map +1 -0
- package/dist/model/pose.js +26 -0
- package/dist/model/pose.js.map +1 -0
- package/dist/model/schema.d.ts +1122 -0
- package/dist/model/schema.d.ts.map +1 -0
- package/dist/model/schema.js +178 -0
- package/dist/model/schema.js.map +1 -0
- package/dist/render/anatomy.d.ts +10 -0
- package/dist/render/anatomy.d.ts.map +1 -0
- package/dist/render/anatomy.js +77 -0
- package/dist/render/anatomy.js.map +1 -0
- package/dist/render/annotations.d.ts +9 -0
- package/dist/render/annotations.d.ts.map +1 -0
- package/dist/render/annotations.js +185 -0
- package/dist/render/annotations.js.map +1 -0
- package/dist/render/context.d.ts +16 -0
- package/dist/render/context.d.ts.map +1 -0
- package/dist/render/context.js +2 -0
- package/dist/render/context.js.map +1 -0
- package/dist/render/figure.d.ts +8 -0
- package/dist/render/figure.d.ts.map +1 -0
- package/dist/render/figure.js +138 -0
- package/dist/render/figure.js.map +1 -0
- package/dist/render/index.d.ts +7 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +7 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/project.d.ts +18 -0
- package/dist/render/project.d.ts.map +1 -0
- package/dist/render/project.js +35 -0
- package/dist/render/project.js.map +1 -0
- package/dist/render/props.d.ts +9 -0
- package/dist/render/props.d.ts.map +1 -0
- package/dist/render/props.js +178 -0
- package/dist/render/props.js.map +1 -0
- package/dist/render/raster.d.ts +19 -0
- package/dist/render/raster.d.ts.map +1 -0
- package/dist/render/raster.js +39 -0
- package/dist/render/raster.js.map +1 -0
- package/dist/render/scene.d.ts +26 -0
- package/dist/render/scene.d.ts.map +1 -0
- package/dist/render/scene.js +144 -0
- package/dist/render/scene.js.map +1 -0
- package/dist/render/sheet.d.ts +20 -0
- package/dist/render/sheet.d.ts.map +1 -0
- package/dist/render/sheet.js +74 -0
- package/dist/render/sheet.js.map +1 -0
- package/dist/render/styles.d.ts +77 -0
- package/dist/render/styles.d.ts.map +1 -0
- package/dist/render/styles.js +122 -0
- package/dist/render/styles.js.map +1 -0
- package/dist/render/svg.d.ts +19 -0
- package/dist/render/svg.d.ts.map +1 -0
- package/dist/render/svg.js +40 -0
- package/dist/render/svg.js.map +1 -0
- package/dist/standards/keypoints.d.ts +31 -0
- package/dist/standards/keypoints.d.ts.map +1 -0
- package/dist/standards/keypoints.js +118 -0
- package/dist/standards/keypoints.js.map +1 -0
- package/docs/AUTHORING.md +144 -0
- package/package.json +94 -0
- package/poses/surf/bottom-turn.pose.yaml +47 -0
- package/poses/surf/cutback.pose.yaml +47 -0
- package/poses/surf/duck-dive.pose.yaml +47 -0
- package/poses/surf/noseride.pose.yaml +48 -0
- package/poses/surf/paddling.pose.yaml +48 -0
- package/poses/surf/pop-up.pose.yaml +47 -0
- package/poses/surf/takeoff.pose.yaml +47 -0
- package/poses/surf/tube-stance.pose.yaml +47 -0
- package/poses/yoga/ashtanga/adho-mukha-svanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/ardha-uttanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/baddha-konasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/balasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/chaturanga-dandasana.pose.yaml +41 -0
- package/poses/yoga/ashtanga/dandasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/halasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/janu-sirsasana-a.pose.yaml +42 -0
- package/poses/yoga/ashtanga/karnapidasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/marichyasana-a.pose.yaml +42 -0
- package/poses/yoga/ashtanga/marichyasana-c.pose.yaml +42 -0
- package/poses/yoga/ashtanga/matsyasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/navasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/padahastasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/padangusthasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/padmasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/parsvottanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/paschimottanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/prasarita-padottanasana-a.pose.yaml +46 -0
- package/poses/yoga/ashtanga/prasarita-padottanasana-c.pose.yaml +46 -0
- package/poses/yoga/ashtanga/primary.seq.yaml +74 -0
- package/poses/yoga/ashtanga/purvottanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/salamba-sarvangasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/samasthiti.pose.yaml +29 -0
- package/poses/yoga/ashtanga/savasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/setu-bandhasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/sirsasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/supta-padangusthasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/upavistha-konasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/urdhva-dhanurasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/urdhva-hastasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/urdhva-mukha-svanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/utkatasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/uttanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/utthita-parsvakonasana.pose.yaml +44 -0
- package/poses/yoga/ashtanga/utthita-trikonasana.pose.yaml +44 -0
- package/poses/yoga/ashtanga/virabhadrasana-a.pose.yaml +42 -0
- package/poses/yoga/ashtanga/virabhadrasana-b.pose.yaml +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/model/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { MUSCLE_IDS } from '../anatomy/muscles.js';
|
|
3
|
+
import { BONE_IDS, LANDMARK_IDS } from '../core/types.js';
|
|
4
|
+
/** Current version of the .pose file format. Bumped only on breaking changes. */
|
|
5
|
+
export const POSE_FORMAT_VERSION = 1;
|
|
6
|
+
const MAX_JOINT_DEG = 360;
|
|
7
|
+
const point = z.tuple([z.number(), z.number()]);
|
|
8
|
+
/** Anything an annotation or prop can be pinned to: a named landmark or a raw point. */
|
|
9
|
+
const anchor = z.union([z.enum(LANDMARK_IDS), point]);
|
|
10
|
+
export const jointsSchema = z
|
|
11
|
+
.partialRecord(z.enum(BONE_IDS), z.number().min(-MAX_JOINT_DEG).max(MAX_JOINT_DEG))
|
|
12
|
+
.describe('Joint rotations in degrees, relative to anatomical neutral (standing, arms down).');
|
|
13
|
+
export const figureSchema = z.object({
|
|
14
|
+
view: z.enum(['front', 'back', 'side', 'three-quarter']).default('front'),
|
|
15
|
+
/** Mirror the figure left-to-right, so a side-view figure faces the other way. */
|
|
16
|
+
flip: z.boolean().default(false),
|
|
17
|
+
/** Swap all left and right joint angles: the "other side" of an asymmetric asana. */
|
|
18
|
+
mirror: z.boolean().default(false),
|
|
19
|
+
/** Drop the figure so its lowest point rests on the ground line. */
|
|
20
|
+
grounded: z.boolean().default(true),
|
|
21
|
+
root: z
|
|
22
|
+
.object({
|
|
23
|
+
position: point.default([0, 0]),
|
|
24
|
+
rotation: z.number().default(90).describe('Pelvis angle in degrees; 90 = upright, 0 = lying head-first.'),
|
|
25
|
+
scale: z.number().positive().default(1),
|
|
26
|
+
})
|
|
27
|
+
.prefault({}),
|
|
28
|
+
joints: jointsSchema.default({}),
|
|
29
|
+
world: z
|
|
30
|
+
.partialRecord(z.enum(BONE_IDS), z.number().min(-MAX_JOINT_DEG).max(MAX_JOINT_DEG))
|
|
31
|
+
.default({})
|
|
32
|
+
.describe('Absolute bone directions in degrees (0 = +x, 90 = up). Overrides `joints` for that bone.'),
|
|
33
|
+
});
|
|
34
|
+
const annotationBase = { label: z.string().optional(), color: z.string().optional() };
|
|
35
|
+
export const annotationSchema = z.discriminatedUnion('type', [
|
|
36
|
+
z.object({
|
|
37
|
+
type: z.literal('angle'),
|
|
38
|
+
at: z.enum(LANDMARK_IDS),
|
|
39
|
+
from: z.enum(LANDMARK_IDS),
|
|
40
|
+
to: z.enum(LANDMARK_IDS),
|
|
41
|
+
radius: z.number().positive().default(0.06),
|
|
42
|
+
...annotationBase,
|
|
43
|
+
}),
|
|
44
|
+
z.object({
|
|
45
|
+
type: z.literal('line'),
|
|
46
|
+
from: anchor,
|
|
47
|
+
to: anchor,
|
|
48
|
+
dashed: z.boolean().default(true),
|
|
49
|
+
extend: z.number().min(0).default(0).describe('Extend the line past both ends, in stature units.'),
|
|
50
|
+
...annotationBase,
|
|
51
|
+
}),
|
|
52
|
+
z.object({
|
|
53
|
+
type: z.literal('plumb'),
|
|
54
|
+
at: anchor,
|
|
55
|
+
dashed: z.boolean().default(true),
|
|
56
|
+
...annotationBase,
|
|
57
|
+
}),
|
|
58
|
+
z.object({
|
|
59
|
+
type: z.literal('arrow'),
|
|
60
|
+
from: anchor,
|
|
61
|
+
to: anchor,
|
|
62
|
+
curve: z.number().default(0).describe('Bow the arrow sideways; negative curves the other way.'),
|
|
63
|
+
...annotationBase,
|
|
64
|
+
}),
|
|
65
|
+
z.object({
|
|
66
|
+
type: z.literal('label'),
|
|
67
|
+
at: anchor,
|
|
68
|
+
text: z.string(),
|
|
69
|
+
offset: point.default([0.08, 0.04]),
|
|
70
|
+
...annotationBase,
|
|
71
|
+
}),
|
|
72
|
+
z.object({
|
|
73
|
+
type: z.literal('point'),
|
|
74
|
+
at: anchor,
|
|
75
|
+
...annotationBase,
|
|
76
|
+
}),
|
|
77
|
+
]);
|
|
78
|
+
export const propSchema = z.discriminatedUnion('type', [
|
|
79
|
+
z.object({ type: z.literal('ground'), y: z.number().default(0), width: z.number().positive().default(1.6) }),
|
|
80
|
+
z.object({
|
|
81
|
+
type: z.literal('mat'),
|
|
82
|
+
y: z.number().default(0),
|
|
83
|
+
width: z.number().positive().default(1.35),
|
|
84
|
+
thickness: z.number().positive().default(0.022),
|
|
85
|
+
rolled: z.boolean().default(false),
|
|
86
|
+
}),
|
|
87
|
+
z.object({
|
|
88
|
+
type: z.literal('block'),
|
|
89
|
+
at: anchor,
|
|
90
|
+
rotation: z.number().default(0),
|
|
91
|
+
width: z.number().positive().default(0.22),
|
|
92
|
+
height: z.number().positive().default(0.12),
|
|
93
|
+
}),
|
|
94
|
+
z.object({ type: z.literal('strap'), from: anchor, to: anchor, sag: z.number().default(0.02) }),
|
|
95
|
+
z.object({ type: z.literal('wall'), x: z.number().default(-0.9), facing: z.enum(['left', 'right']).default('left') }),
|
|
96
|
+
z.object({
|
|
97
|
+
type: z.literal('surfboard'),
|
|
98
|
+
/** Position the board under these landmarks (usually both feet), or pin it explicitly. */
|
|
99
|
+
under: z.array(z.enum(LANDMARK_IDS)).default([]),
|
|
100
|
+
at: point.optional(),
|
|
101
|
+
rotation: z.number().default(0),
|
|
102
|
+
length: z.number().positive().default(1.15),
|
|
103
|
+
offset: point.default([0, -0.03]),
|
|
104
|
+
}),
|
|
105
|
+
z.object({
|
|
106
|
+
type: z.literal('wave'),
|
|
107
|
+
amplitude: z.number().positive().default(0.35),
|
|
108
|
+
length: z.number().positive().default(3),
|
|
109
|
+
y: z.number().default(-0.15),
|
|
110
|
+
breaking: z.boolean().default(true),
|
|
111
|
+
facing: z.enum(['left', 'right']).default('right'),
|
|
112
|
+
}),
|
|
113
|
+
]);
|
|
114
|
+
export const poseSchema = z.object({
|
|
115
|
+
asanakit: z.literal(POSE_FORMAT_VERSION, `Unsupported "asanakit" format version (expected ${POSE_FORMAT_VERSION}).`),
|
|
116
|
+
id: z
|
|
117
|
+
.string()
|
|
118
|
+
.regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be a lowercase kebab-case slug')
|
|
119
|
+
.describe('Stable slug, unique within a library.'),
|
|
120
|
+
name: z.string().min(1),
|
|
121
|
+
sanskrit: z.string().optional(),
|
|
122
|
+
english: z.string().optional(),
|
|
123
|
+
discipline: z.enum(['yoga', 'surf', 'other']),
|
|
124
|
+
family: z.string().optional().describe('Grouping inside a discipline, e.g. "standing" or "seated".'),
|
|
125
|
+
difficulty: z.number().int().min(1).max(5).optional(),
|
|
126
|
+
description: z.string().optional(),
|
|
127
|
+
tags: z.array(z.string()).default([]),
|
|
128
|
+
cues: z.array(z.string()).default([]).describe('Teaching cues, rendered as a caption block.'),
|
|
129
|
+
drishti: z.string().optional().describe('Gaze point (Ashtanga).'),
|
|
130
|
+
breath: z.enum(['inhale', 'exhale', 'hold', 'free']).optional(),
|
|
131
|
+
figure: figureSchema.prefault({}),
|
|
132
|
+
contact: z
|
|
133
|
+
.array(z.enum(LANDMARK_IDS))
|
|
134
|
+
.default([])
|
|
135
|
+
.describe('Landmarks that touch the floor in this posture. Validated against the solved figure.'),
|
|
136
|
+
props: z.array(propSchema).default([]),
|
|
137
|
+
annotations: z.array(annotationSchema).default([]),
|
|
138
|
+
muscles: z
|
|
139
|
+
.object({
|
|
140
|
+
engaged: z.array(z.enum(MUSCLE_IDS)).default([]),
|
|
141
|
+
stretched: z.array(z.enum(MUSCLE_IDS)).default([]),
|
|
142
|
+
})
|
|
143
|
+
.prefault({}),
|
|
144
|
+
source: z.string().optional().describe('Where the posture data came from, for attribution.'),
|
|
145
|
+
});
|
|
146
|
+
export const sequenceSchema = z.object({
|
|
147
|
+
asanakit: z.literal(POSE_FORMAT_VERSION),
|
|
148
|
+
id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/),
|
|
149
|
+
name: z.string().min(1),
|
|
150
|
+
tradition: z.string().optional(),
|
|
151
|
+
description: z.string().optional(),
|
|
152
|
+
sections: z
|
|
153
|
+
.array(z.object({
|
|
154
|
+
name: z.string(),
|
|
155
|
+
steps: z.array(z.object({
|
|
156
|
+
pose: z.string().describe('Pose id, resolved against the loaded pose library.'),
|
|
157
|
+
label: z.string().optional(),
|
|
158
|
+
breath: z.enum(['inhale', 'exhale', 'hold', 'free']).optional(),
|
|
159
|
+
count: z.number().int().positive().default(1).describe('Breaths held.'),
|
|
160
|
+
side: z.enum(['left', 'right', 'both', 'none']).default('none'),
|
|
161
|
+
note: z.string().optional(),
|
|
162
|
+
})),
|
|
163
|
+
}))
|
|
164
|
+
.default([]),
|
|
165
|
+
});
|
|
166
|
+
export const poseJsonSchema = () => ({
|
|
167
|
+
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
168
|
+
$id: 'https://asanakit.dev/schema/pose-v1.json',
|
|
169
|
+
title: 'asanakit pose',
|
|
170
|
+
...z.toJSONSchema(poseSchema, { io: 'input' }),
|
|
171
|
+
});
|
|
172
|
+
export const sequenceJsonSchema = () => ({
|
|
173
|
+
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
174
|
+
$id: 'https://asanakit.dev/schema/sequence-v1.json',
|
|
175
|
+
title: 'asanakit sequence',
|
|
176
|
+
...z.toJSONSchema(sequenceSchema, { io: 'input' }),
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/model/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type MuscleId } from '../anatomy/muscles.js';
|
|
2
|
+
import type { RenderContext } from './context.js';
|
|
3
|
+
import { type SvgNode } from './svg.js';
|
|
4
|
+
export type MuscleState = 'engaged' | 'stretched' | 'resting';
|
|
5
|
+
/**
|
|
6
|
+
* Muscle layer for the anatomy styles. Rendered under the bone lines, so the
|
|
7
|
+
* skeleton still reads on top of the shading.
|
|
8
|
+
*/
|
|
9
|
+
export declare const renderMuscles: (ctx: RenderContext, engaged: readonly MuscleId[], stretched: readonly MuscleId[]) => SvgNode | null;
|
|
10
|
+
//# sourceMappingURL=anatomy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anatomy.d.ts","sourceRoot":"","sources":["../../src/render/anatomy.ts"],"names":[],"mappings":"AACA,OAAO,EAAwD,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AA8C9D;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,KAAK,aAAa,EAClB,SAAS,SAAS,QAAQ,EAAE,EAC5B,WAAW,SAAS,QAAQ,EAAE,KAC7B,OAAO,GAAG,IA2BZ,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { path } from 'd3-path';
|
|
2
|
+
import { MUSCLES, MUSCLE_IDS, muscleInstances } from '../anatomy/muscles.js';
|
|
3
|
+
import { along, sub } from '../core/vec2.js';
|
|
4
|
+
import { el, group, num } from './svg.js';
|
|
5
|
+
const BULGE = 0.35;
|
|
6
|
+
const stateOf = (id, engaged, stretched) => {
|
|
7
|
+
if (engaged.includes(id))
|
|
8
|
+
return 'engaged';
|
|
9
|
+
if (stretched.includes(id))
|
|
10
|
+
return 'stretched';
|
|
11
|
+
return 'resting';
|
|
12
|
+
};
|
|
13
|
+
const fillFor = (state, style) => {
|
|
14
|
+
if (state === 'engaged')
|
|
15
|
+
return style.muscles.engaged;
|
|
16
|
+
if (state === 'stretched')
|
|
17
|
+
return style.muscles.stretched;
|
|
18
|
+
return style.muscles.base;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* A muscle belly is an arc that bows away from the bone: two endpoints on the
|
|
22
|
+
* bone's offset line plus a quadratic control point pushed out sideways. Drawn
|
|
23
|
+
* as a thick round-capped stroke, that reads as a muscle without needing traced
|
|
24
|
+
* anatomical artwork.
|
|
25
|
+
*/
|
|
26
|
+
const bellyPath = (bone, muscle, rawOffset, ctx) => {
|
|
27
|
+
const { proj } = ctx;
|
|
28
|
+
const scale = ctx.skeleton.scale;
|
|
29
|
+
const offset = rawOffset * scale;
|
|
30
|
+
// Bow the belly away from the bone, on whichever side of it the muscle sits.
|
|
31
|
+
const bulge = offset === 0 ? 0 : Math.sign(offset) * muscle.width * BULGE * scale;
|
|
32
|
+
const a = along(bone.start, bone.end, muscle.t0, offset);
|
|
33
|
+
const b = along(bone.start, bone.end, muscle.t1, offset);
|
|
34
|
+
const mid = along(bone.start, bone.end, (muscle.t0 + muscle.t1) / 2, offset + bulge);
|
|
35
|
+
const [ax, ay] = proj.p(a);
|
|
36
|
+
const [bx, by] = proj.p(b);
|
|
37
|
+
const [mx, my] = proj.p(mid);
|
|
38
|
+
const p = path();
|
|
39
|
+
p.moveTo(num(ax), num(ay));
|
|
40
|
+
p.quadraticCurveTo(num(mx), num(my), num(bx), num(by));
|
|
41
|
+
return p.toString();
|
|
42
|
+
};
|
|
43
|
+
const isDegenerate = (bone) => {
|
|
44
|
+
const d = sub(bone.end, bone.start);
|
|
45
|
+
return Math.hypot(d[0], d[1]) < 1e-6;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Muscle layer for the anatomy styles. Rendered under the bone lines, so the
|
|
49
|
+
* skeleton still reads on top of the shading.
|
|
50
|
+
*/
|
|
51
|
+
export const renderMuscles = (ctx, engaged, stretched) => {
|
|
52
|
+
const { skeleton, proj, style } = ctx;
|
|
53
|
+
if (!style.muscles.show)
|
|
54
|
+
return null;
|
|
55
|
+
const shapes = [];
|
|
56
|
+
for (const id of MUSCLE_IDS) {
|
|
57
|
+
const muscle = MUSCLES[id];
|
|
58
|
+
const state = stateOf(id, engaged, stretched);
|
|
59
|
+
for (const { bone: boneId, offset } of muscleInstances(muscle, skeleton.view)) {
|
|
60
|
+
const bone = skeleton.bones[boneId];
|
|
61
|
+
if (isDegenerate(bone))
|
|
62
|
+
continue;
|
|
63
|
+
shapes.push(el('path', {
|
|
64
|
+
'data-muscle': id,
|
|
65
|
+
'data-muscle-state': state,
|
|
66
|
+
d: bellyPath(bone, muscle, offset, ctx),
|
|
67
|
+
fill: 'none',
|
|
68
|
+
stroke: fillFor(state, style),
|
|
69
|
+
'stroke-width': muscle.width * proj.s * skeleton.scale,
|
|
70
|
+
'stroke-linecap': 'round',
|
|
71
|
+
opacity: style.muscles.opacity,
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return group({ 'data-layer': 'muscles' }, shapes);
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=anatomy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anatomy.js","sourceRoot":"","sources":["../../src/render/anatomy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Bounds, Skeleton } from '../core/types.js';
|
|
2
|
+
import type { Annotation } from '../model/schema.js';
|
|
3
|
+
import type { RenderContext } from './context.js';
|
|
4
|
+
import { type SvgNode } from './svg.js';
|
|
5
|
+
export declare const ARROW_MARKER_ID = "asanakit-arrow";
|
|
6
|
+
export declare const arrowMarker: (color: string) => SvgNode;
|
|
7
|
+
export declare const annotationsBounds: (annotations: readonly Annotation[], skeleton: Skeleton) => Bounds | null;
|
|
8
|
+
export declare const renderAnnotations: (ctx: RenderContext, annotations: readonly Annotation[]) => SvgNode | null;
|
|
9
|
+
//# sourceMappingURL=annotations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/render/annotations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAA0B,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAEhE,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAEhD,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,OAgBxC,CAAC;AAuKL,eAAO,MAAM,iBAAiB,GAAI,aAAa,SAAS,UAAU,EAAE,EAAE,UAAU,QAAQ,KAAG,MAAM,GAAG,IAGnG,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,KAAK,aAAa,EAAE,aAAa,SAAS,UAAU,EAAE,KAAG,OAAO,GAAG,IAqBpG,CAAC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { path } from 'd3-path';
|
|
2
|
+
import { interiorAngle } from '../core/angles.js';
|
|
3
|
+
import { add, angleOf, dist, fromPolar, lerp, normalLeft, scale as scaleVec, sub } from '../core/vec2.js';
|
|
4
|
+
import { boundsOfPoints } from './project.js';
|
|
5
|
+
import { resolveAnchor } from './props.js';
|
|
6
|
+
import { el, group, num, textEl } from './svg.js';
|
|
7
|
+
export const ARROW_MARKER_ID = 'asanakit-arrow';
|
|
8
|
+
export const arrowMarker = (color) => el('defs', {}, [
|
|
9
|
+
el('marker', {
|
|
10
|
+
id: ARROW_MARKER_ID,
|
|
11
|
+
viewBox: '0 0 10 10',
|
|
12
|
+
refX: 8,
|
|
13
|
+
refY: 5,
|
|
14
|
+
markerWidth: 5,
|
|
15
|
+
markerHeight: 5,
|
|
16
|
+
orient: 'auto-start-reverse',
|
|
17
|
+
markerUnits: 'strokeWidth',
|
|
18
|
+
}, [el('path', { d: 'M 0 0 L 10 5 L 0 10 z', fill: color })]),
|
|
19
|
+
]);
|
|
20
|
+
const label = (text, at, ctx, color) => {
|
|
21
|
+
const { proj, style } = ctx;
|
|
22
|
+
const [x, y] = proj.p(at);
|
|
23
|
+
return textEl('text', {
|
|
24
|
+
x,
|
|
25
|
+
y,
|
|
26
|
+
fill: color ?? style.annotation.color,
|
|
27
|
+
'font-family': style.annotation.fontFamily,
|
|
28
|
+
'font-size': style.annotation.fontSize * proj.s,
|
|
29
|
+
'dominant-baseline': 'middle',
|
|
30
|
+
}, text);
|
|
31
|
+
};
|
|
32
|
+
const strokeAttrs = ({ proj, style }, dashed, color) => ({
|
|
33
|
+
stroke: color ?? style.annotation.stroke,
|
|
34
|
+
'stroke-width': style.annotation.strokeWidth * proj.s,
|
|
35
|
+
'stroke-dasharray': dashed
|
|
36
|
+
? style.annotation.dash
|
|
37
|
+
.split(' ')
|
|
38
|
+
.map((v) => num(Number(v) * proj.s))
|
|
39
|
+
.join(' ')
|
|
40
|
+
: undefined,
|
|
41
|
+
fill: 'none',
|
|
42
|
+
});
|
|
43
|
+
const angleArc = (a, ctx) => {
|
|
44
|
+
const { skeleton, proj } = ctx;
|
|
45
|
+
const centre = skeleton.landmarks[a.at];
|
|
46
|
+
const from = skeleton.landmarks[a.from];
|
|
47
|
+
const to = skeleton.landmarks[a.to];
|
|
48
|
+
const measured = interiorAngle(from, centre, to);
|
|
49
|
+
const a0 = angleOf(sub(from, centre));
|
|
50
|
+
const a1 = angleOf(sub(to, centre));
|
|
51
|
+
const r = a.radius * skeleton.scale;
|
|
52
|
+
const p = path();
|
|
53
|
+
const steps = 24;
|
|
54
|
+
for (let i = 0; i <= steps; i++) {
|
|
55
|
+
// Sweep the short way round, which is the way a joint angle is read.
|
|
56
|
+
const sweep = ((((a1 - a0) % 360) + 540) % 360) - 180;
|
|
57
|
+
const [px, py] = proj.p(add(centre, fromPolar(a0 + (sweep * i) / steps, r)));
|
|
58
|
+
if (i === 0)
|
|
59
|
+
p.moveTo(num(px), num(py));
|
|
60
|
+
else
|
|
61
|
+
p.lineTo(num(px), num(py));
|
|
62
|
+
}
|
|
63
|
+
const bisector = lerp(add(centre, fromPolar(a0, r)), add(centre, fromPolar(a1, r)), 0.5);
|
|
64
|
+
const labelAt = add(centre, scaleVec(sub(bisector, centre), 1.9));
|
|
65
|
+
const text = a.label ?? `${Math.round(measured)}°`;
|
|
66
|
+
return group({ 'data-annotation': 'angle', 'data-joint': a.at }, [
|
|
67
|
+
el('path', { d: p.toString(), ...strokeAttrs(ctx, false, a.color) }),
|
|
68
|
+
label(text, labelAt, ctx, a.color),
|
|
69
|
+
]);
|
|
70
|
+
};
|
|
71
|
+
const alignmentLine = (a, ctx) => {
|
|
72
|
+
const { skeleton, proj } = ctx;
|
|
73
|
+
const from = resolveAnchor(a.from, skeleton);
|
|
74
|
+
const to = resolveAnchor(a.to, skeleton);
|
|
75
|
+
const d = sub(to, from);
|
|
76
|
+
const l = Math.max(dist(from, to), 1e-6);
|
|
77
|
+
const ext = scaleVec(d, a.extend / l);
|
|
78
|
+
const [x1, y1] = proj.p(sub(from, ext));
|
|
79
|
+
const [x2, y2] = proj.p(add(to, ext));
|
|
80
|
+
return group({ 'data-annotation': 'line' }, [
|
|
81
|
+
el('line', { x1, y1, x2, y2, ...strokeAttrs(ctx, a.dashed, a.color) }),
|
|
82
|
+
...(a.label === undefined ? [] : [label(a.label, add(lerp(from, to, 0.5), scaleVec(normalLeft(from, to), 0.05)), ctx, a.color)]),
|
|
83
|
+
]);
|
|
84
|
+
};
|
|
85
|
+
const plumbLine = (a, ctx) => {
|
|
86
|
+
const { skeleton, proj, content } = ctx;
|
|
87
|
+
const at = resolveAnchor(a.at, skeleton);
|
|
88
|
+
const [x1, y1] = proj.p([at[0], content.minY]);
|
|
89
|
+
const [x2, y2] = proj.p([at[0], content.maxY]);
|
|
90
|
+
return group({ 'data-annotation': 'plumb' }, [
|
|
91
|
+
el('line', { x1, y1, x2, y2, ...strokeAttrs(ctx, a.dashed, a.color) }),
|
|
92
|
+
...(a.label === undefined ? [] : [label(a.label, [at[0] + 0.03, content.maxY], ctx, a.color)]),
|
|
93
|
+
]);
|
|
94
|
+
};
|
|
95
|
+
const arrow = (a, ctx) => {
|
|
96
|
+
const { skeleton, proj } = ctx;
|
|
97
|
+
const from = resolveAnchor(a.from, skeleton);
|
|
98
|
+
const to = resolveAnchor(a.to, skeleton);
|
|
99
|
+
const mid = add(lerp(from, to, 0.5), scaleVec(normalLeft(from, to), a.curve));
|
|
100
|
+
const [x1, y1] = proj.p(from);
|
|
101
|
+
const [mx, my] = proj.p(mid);
|
|
102
|
+
const [x2, y2] = proj.p(to);
|
|
103
|
+
const p = path();
|
|
104
|
+
p.moveTo(num(x1), num(y1));
|
|
105
|
+
p.quadraticCurveTo(num(mx), num(my), num(x2), num(y2));
|
|
106
|
+
return group({ 'data-annotation': 'arrow' }, [
|
|
107
|
+
el('path', {
|
|
108
|
+
d: p.toString(),
|
|
109
|
+
...strokeAttrs(ctx, false, a.color),
|
|
110
|
+
'marker-end': `url(#${ARROW_MARKER_ID})`,
|
|
111
|
+
}),
|
|
112
|
+
...(a.label === undefined ? [] : [label(a.label, mid, ctx, a.color)]),
|
|
113
|
+
]);
|
|
114
|
+
};
|
|
115
|
+
const leaderLabel = (a, ctx) => {
|
|
116
|
+
const { skeleton, proj, style } = ctx;
|
|
117
|
+
const at = resolveAnchor(a.at, skeleton);
|
|
118
|
+
const target = add(at, a.offset);
|
|
119
|
+
const [x1, y1] = proj.p(at);
|
|
120
|
+
const [x2, y2] = proj.p(target);
|
|
121
|
+
const textAnchor = a.offset[0] < 0 ? 'end' : 'start';
|
|
122
|
+
const [tx, ty] = proj.p(add(target, [a.offset[0] < 0 ? -0.012 : 0.012, 0]));
|
|
123
|
+
return group({ 'data-annotation': 'label' }, [
|
|
124
|
+
el('line', { x1, y1, x2, y2, ...strokeAttrs(ctx, false, a.color) }),
|
|
125
|
+
el('circle', { cx: x1, cy: y1, r: 0.008 * proj.s, fill: a.color ?? style.annotation.accent }),
|
|
126
|
+
textEl('text', {
|
|
127
|
+
x: tx,
|
|
128
|
+
y: ty,
|
|
129
|
+
fill: a.color ?? style.annotation.color,
|
|
130
|
+
'font-family': style.annotation.fontFamily,
|
|
131
|
+
'font-size': style.annotation.fontSize * proj.s,
|
|
132
|
+
'dominant-baseline': 'middle',
|
|
133
|
+
'text-anchor': textAnchor,
|
|
134
|
+
}, a.text),
|
|
135
|
+
]);
|
|
136
|
+
};
|
|
137
|
+
const dot = (a, ctx) => {
|
|
138
|
+
const { skeleton, proj, style } = ctx;
|
|
139
|
+
const at = resolveAnchor(a.at, skeleton);
|
|
140
|
+
const [cx, cy] = proj.p(at);
|
|
141
|
+
return group({ 'data-annotation': 'point' }, [
|
|
142
|
+
el('circle', { cx, cy, r: 0.012 * proj.s, fill: a.color ?? style.annotation.accent }),
|
|
143
|
+
...(a.label === undefined ? [] : [label(a.label, add(at, [0.03, 0.02]), ctx, a.color)]),
|
|
144
|
+
]);
|
|
145
|
+
};
|
|
146
|
+
const annotationPoints = (a, skeleton) => {
|
|
147
|
+
switch (a.type) {
|
|
148
|
+
case 'angle':
|
|
149
|
+
return [skeleton.landmarks[a.at]];
|
|
150
|
+
case 'line':
|
|
151
|
+
case 'arrow':
|
|
152
|
+
return [resolveAnchor(a.from, skeleton), resolveAnchor(a.to, skeleton)];
|
|
153
|
+
case 'plumb':
|
|
154
|
+
case 'point':
|
|
155
|
+
return [resolveAnchor(a.at, skeleton)];
|
|
156
|
+
case 'label':
|
|
157
|
+
return [resolveAnchor(a.at, skeleton), add(resolveAnchor(a.at, skeleton), a.offset)];
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
export const annotationsBounds = (annotations, skeleton) => {
|
|
161
|
+
const pts = annotations.flatMap((a) => annotationPoints(a, skeleton));
|
|
162
|
+
return pts.length === 0 ? null : boundsOfPoints(pts);
|
|
163
|
+
};
|
|
164
|
+
export const renderAnnotations = (ctx, annotations) => {
|
|
165
|
+
if (annotations.length === 0)
|
|
166
|
+
return null;
|
|
167
|
+
const nodes = annotations.map((a) => {
|
|
168
|
+
switch (a.type) {
|
|
169
|
+
case 'angle':
|
|
170
|
+
return angleArc(a, ctx);
|
|
171
|
+
case 'line':
|
|
172
|
+
return alignmentLine(a, ctx);
|
|
173
|
+
case 'plumb':
|
|
174
|
+
return plumbLine(a, ctx);
|
|
175
|
+
case 'arrow':
|
|
176
|
+
return arrow(a, ctx);
|
|
177
|
+
case 'label':
|
|
178
|
+
return leaderLabel(a, ctx);
|
|
179
|
+
case 'point':
|
|
180
|
+
return dot(a, ctx);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
return group({ 'data-layer': 'annotations' }, nodes);
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=annotations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/render/annotations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Bounds, Skeleton } from '../core/types.js';
|
|
2
|
+
import type { Projection } from './project.js';
|
|
3
|
+
import type { Style } from './styles.js';
|
|
4
|
+
/**
|
|
5
|
+
* Everything a draw function needs to put a shape on the canvas. Passing one
|
|
6
|
+
* context beats threading four arguments through every layer, and it keeps the
|
|
7
|
+
* layers honest: they read the scene, they never reach back into the pose.
|
|
8
|
+
*/
|
|
9
|
+
export interface RenderContext {
|
|
10
|
+
readonly skeleton: Skeleton;
|
|
11
|
+
readonly proj: Projection;
|
|
12
|
+
readonly style: Style;
|
|
13
|
+
/** The full visible extent, used by annotations that span the whole frame. */
|
|
14
|
+
readonly content: Bounds;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/render/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/render/context.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RenderContext } from './context.js';
|
|
2
|
+
import { type SvgNode } from './svg.js';
|
|
3
|
+
/**
|
|
4
|
+
* Draw the figure back-to-front: far limbs, trunk, head, near limbs. That single
|
|
5
|
+
* ordering is what makes a profile pose read as a body rather than a tangle.
|
|
6
|
+
*/
|
|
7
|
+
export declare const renderFigure: (ctx: RenderContext) => SvgNode;
|
|
8
|
+
//# sourceMappingURL=figure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figure.d.ts","sourceRoot":"","sources":["../../src/render/figure.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAmInD;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,aAAa,KAAG,OAejD,CAAC"}
|