@doki-land/live2d 0.0.9 → 0.0.11

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 ADDED
@@ -0,0 +1,3 @@
1
+ # @doki-land/live2d
2
+
3
+ live2d.ts package 0.0.11.
@@ -0,0 +1,231 @@
1
+ import { Live2DSession, MotionDefinition } from '@doki-land/live2d-core';
2
+ export { AssetResolver, EventEmitter, FrameProfile, FrameSnapshot, InternalModel, Live2DSession, LoadProgress, LoadProgressStage, ModelFormat, ModelInstance, ModelProgram, ModelSettings, ModelSource, SessionPhase, SessionState } from '@doki-land/live2d-core';
3
+ export { DEFAULT_NPM_CDN, resolveModelSourceUrl, resolveNpmSpecifier } from '@doki-land/live2d-loader';
4
+ import { ModelBackend, Renderer, RendererKind, ParameterBinding } from '@doki-land/live2d-renderer';
5
+ export { ModelBackend, ParameterBinding, Renderer, RendererKind, createCanvas2DRenderer, createMoc2Backend, createMoc3Backend, createQuadProgram, createRenderer, createWebGl2Renderer, createWebGpuRenderer, decodeMoc3, evaluateFrame, fingerprintSnapshot, parseCpuProgram, serializeCpuProgram } from '@doki-land/live2d-renderer';
6
+
7
+ /** Cubism motion3 segment kinds (spec). */
8
+ type MotionSegmentKind = "linear" | "bezier" | "stepped" | "inverseStepped";
9
+ type MotionCurveTarget = "Parameter" | "PartOpacity" | "Model";
10
+ interface MotionPoint {
11
+ readonly time: number;
12
+ readonly value: number;
13
+ }
14
+ interface MotionSegment {
15
+ readonly kind: MotionSegmentKind;
16
+ /** Segment start (inclusive). */
17
+ readonly p0: MotionPoint;
18
+ /** Bezier controls (bezier only). */
19
+ readonly p1?: MotionPoint;
20
+ readonly p2?: MotionPoint;
21
+ /** Segment end. */
22
+ readonly p3: MotionPoint;
23
+ }
24
+ interface MotionCurve {
25
+ readonly target: MotionCurveTarget;
26
+ readonly id: string;
27
+ readonly fadeInTime?: number;
28
+ readonly fadeOutTime?: number;
29
+ readonly segments: readonly MotionSegment[];
30
+ }
31
+ interface MotionUserData {
32
+ readonly time: number;
33
+ readonly value: string;
34
+ }
35
+ interface Motion3Clip {
36
+ readonly version: number;
37
+ readonly duration: number;
38
+ readonly fps: number;
39
+ readonly loop: boolean;
40
+ readonly areBeziersRestricted: boolean;
41
+ readonly fadeInTime: number;
42
+ readonly fadeOutTime: number;
43
+ readonly curves: readonly MotionCurve[];
44
+ readonly userData: readonly MotionUserData[];
45
+ }
46
+ /** Cubism-style priority: higher wins; equal may replace. */
47
+ declare const MotionPriority: {
48
+ readonly none: 0;
49
+ readonly idle: 1;
50
+ readonly normal: 2;
51
+ readonly force: 3;
52
+ };
53
+ type MotionPriorityLevel = (typeof MotionPriority)[keyof typeof MotionPriority];
54
+ interface PlayMotionOptions {
55
+ /** Default {@link MotionPriority.normal}. */
56
+ priority?: MotionPriorityLevel;
57
+ /**
58
+ * Parallel layer id. Default `priority:{n}` so different priorities
59
+ * can play together; same slot replaces or queues.
60
+ */
61
+ slot?: string;
62
+ /**
63
+ * When the slot is busy, enqueue instead of replacing / rejecting.
64
+ * Default false.
65
+ */
66
+ queue?: boolean;
67
+ /** Override clip Meta.Loop. */
68
+ loop?: boolean;
69
+ /** Override fade-in seconds (clip / definition). */
70
+ fadeInTime?: number;
71
+ /** Override fade-out seconds. */
72
+ fadeOutTime?: number;
73
+ }
74
+ interface MotionApplySample {
75
+ readonly target: MotionCurveTarget;
76
+ readonly id: string;
77
+ readonly value: number;
78
+ /** 0..1 fade weight for this frame. */
79
+ readonly weight: number;
80
+ }
81
+
82
+ /**
83
+ * Sample all curves of a clip at `timeSeconds` (clamped to [0, duration]
84
+ * unless looping — caller should wrap time for loops).
85
+ */
86
+ declare function evaluateMotion3(clip: Motion3Clip, timeSeconds: number): Array<{
87
+ target: MotionCurve["target"];
88
+ id: string;
89
+ value: number;
90
+ }>;
91
+ declare function evaluateCurve(curve: MotionCurve, timeSeconds: number, areBeziersRestricted: boolean): number;
92
+
93
+ interface MotionPlayerHandlers {
94
+ onStart?: (info: {
95
+ group: string;
96
+ index: number;
97
+ slot: string;
98
+ }) => void;
99
+ onFinish?: (info: {
100
+ group: string;
101
+ index: number;
102
+ slot: string;
103
+ }) => void;
104
+ onEvent?: (info: {
105
+ group: string;
106
+ index: number;
107
+ slot: string;
108
+ time: number;
109
+ value: string;
110
+ }) => void;
111
+ }
112
+ /**
113
+ * Multi-slot motion player with per-slot queue.
114
+ *
115
+ * Default slot is `priority:{n}` so idle (1) and normal (2) can run together.
116
+ * Same slot replaces (with fade-out) unless `queue: true`.
117
+ */
118
+ declare class MotionPlayer {
119
+ #private;
120
+ constructor(handlers?: MotionPlayerHandlers);
121
+ get isPlaying(): boolean;
122
+ listPlaying(): ReadonlyArray<{
123
+ slot: string;
124
+ group: string;
125
+ index: number;
126
+ time: number;
127
+ priority: MotionPriorityLevel;
128
+ }>;
129
+ /** @deprecated Prefer {@link listPlaying}; returns highest-priority slot. */
130
+ get current(): {
131
+ group: string;
132
+ index: number;
133
+ time: number;
134
+ priority: MotionPriorityLevel;
135
+ } | null;
136
+ /**
137
+ * Start a clip on a slot. Returns false if rejected by priority
138
+ * (and not queued).
139
+ */
140
+ start(group: string, index: number, clip: Motion3Clip, options?: PlayMotionOptions): boolean;
141
+ /** Fade out (default) or hard-stop; `slot` omits → all slots. */
142
+ stop(fade?: boolean, slot?: string): void;
143
+ clear(): void;
144
+ /**
145
+ * Advance all slots and return blended samples (weight baked in; apply as absolute).
146
+ */
147
+ update(deltaTimeSeconds: number): MotionApplySample[];
148
+ }
149
+ /** Blend layers low→high priority; later layers lerp over earlier by their weight. */
150
+ declare function blendMotionLayers(layers: ReadonlyArray<{
151
+ priority: number;
152
+ samples: readonly MotionApplySample[];
153
+ }>): MotionApplySample[];
154
+
155
+ /**
156
+ * Parse Cubism `motion3.json` (FileFormats/motion3.json.md).
157
+ */
158
+ declare function parseMotion3(json: unknown): Motion3Clip;
159
+
160
+ interface CreateLive2DOptions {
161
+ backends?: ModelBackend[];
162
+ /** Defaults to `createRenderer({ prefer })` (async fallback on initialize). */
163
+ renderer?: Renderer;
164
+ /**
165
+ * Renderer try order when `renderer` is omitted.
166
+ * Default: `["webgpu", "webgl2", "canvas2d"]`.
167
+ */
168
+ prefer?: RendererKind[];
169
+ }
170
+ interface Live2DRuntime extends Live2DSession {
171
+ readonly renderer: Renderer;
172
+ readonly backends: readonly ModelBackend[];
173
+ setParameter(id: string, value: number): void;
174
+ listParameters(): readonly ParameterBinding[];
175
+ /** Hit-test the current model in normalized canvas coordinates (-1..1). */
176
+ hitTest(x: number, y: number): string | null;
177
+ /** Motion groups from the loaded model settings. */
178
+ listMotionGroups(): Record<string, readonly MotionDefinition[]>;
179
+ /**
180
+ * Load and play a motion from `settings.motionGroups[group][index]`.
181
+ * Returns false if priority rejects or the entry is missing.
182
+ */
183
+ playMotion(group: string, index?: number, options?: PlayMotionOptions): Promise<boolean>;
184
+ /** Fade out (default) or hard-stop. Optional slot; omit = all slots. */
185
+ stopMotion(opts?: {
186
+ fade?: boolean;
187
+ slot?: string;
188
+ }): void;
189
+ /** Active motion slots (idle + tap can both appear). */
190
+ listPlayingMotions(): ReadonlyArray<{
191
+ slot: string;
192
+ group: string;
193
+ index: number;
194
+ time: number;
195
+ priority: number;
196
+ }>;
197
+ /**
198
+ * Draw one frame and encode the canvas as PNG.
199
+ * Works for Canvas2D and WebGL2 (`preserveDrawingBuffer`).
200
+ */
201
+ capturePng(opts?: {
202
+ mimeType?: "image/png";
203
+ quality?: number;
204
+ }): Promise<Blob>;
205
+ }
206
+ /** Wire moc backends and a renderer into one session. */
207
+ declare function createLive2D(options?: CreateLive2DOptions): Live2DRuntime;
208
+
209
+ /**
210
+ * Map canvas focus (-1..1, Y-up) onto standard Cubism drag parameters.
211
+ *
212
+ * Matches the Cubism sample / community widget weights:
213
+ * ANGLE_X/Y full range, ANGLE_Z = -dragX*dragY, BODY_ANGLE_X, EYE_BALL_*.
214
+ * Missing ids on a given model are skipped.
215
+ */
216
+ declare function focusParameterUpdates(parameters: readonly ParameterBinding[], dragX: number, dragY: number): Array<{
217
+ id: string;
218
+ value: number;
219
+ }>;
220
+
221
+ /**
222
+ * `@doki-land/live2d` — public facade.
223
+ *
224
+ * ```ts
225
+ * import { createLive2D } from "@doki-land/live2d";
226
+ * ```
227
+ */
228
+
229
+ declare const LIVE2D_VERSION: "0.0.0";
230
+
231
+ export { type CreateLive2DOptions, LIVE2D_VERSION, type Live2DRuntime, type Motion3Clip, type MotionApplySample, MotionPlayer, MotionPriority, type PlayMotionOptions, blendMotionLayers, createLive2D, evaluateCurve, evaluateMotion3, focusParameterUpdates, parseMotion3 };