@doki-land/live2d 0.0.10 → 0.0.12

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 (47) hide show
  1. package/README.md +3 -0
  2. package/dist/index.d.ts +326 -0
  3. package/dist/index.js +1667 -0
  4. package/dist/reexports/core.d.ts +3 -0
  5. package/dist/reexports/core.js +2 -0
  6. package/dist/reexports/loader.d.ts +1 -0
  7. package/dist/reexports/loader.js +2 -0
  8. package/dist/reexports/renderer.d.ts +1 -0
  9. package/dist/reexports/renderer.js +2 -0
  10. package/package.json +61 -43
  11. package/src/create-live2d.ts +39 -0
  12. package/src/focus.ts +53 -0
  13. package/src/index.ts +78 -187
  14. package/src/load-textures.ts +85 -0
  15. package/src/motion/evaluate-curve.ts +119 -0
  16. package/src/motion/index.ts +20 -0
  17. package/src/motion/motion-player.ts +389 -0
  18. package/src/motion/parse-motion3.ts +164 -0
  19. package/src/motion/types.ts +89 -0
  20. package/src/reexports/core.ts +1 -0
  21. package/src/reexports/loader.ts +1 -0
  22. package/src/reexports/renderer.ts +1 -0
  23. package/src/stage/actor-model-slot.ts +429 -0
  24. package/src/stage/actor.ts +188 -0
  25. package/src/stage/index.ts +18 -0
  26. package/src/stage/single-facade.ts +221 -0
  27. package/src/stage/stage.ts +388 -0
  28. package/src/stage/transform.ts +161 -0
  29. package/dist/l2d.umd.js +0 -1208
  30. package/dist/l2d.umd.js.map +0 -1
  31. package/dist/live2d.css +0 -1
  32. package/lib/cubism2.d.ts +0 -179
  33. package/lib/cubism2.min.js +0 -2
  34. package/lib/cubism5.d.ts +0 -367
  35. package/lib/cubism5.min.js +0 -10
  36. package/lib/index.d.ts +0 -7
  37. package/readme.md +0 -60
  38. package/src/fs/index.ts +0 -93
  39. package/src/helper/index.ts +0 -25
  40. package/src/icons/icons.ts +0 -39
  41. package/src/icons/style.css +0 -44
  42. package/src/icons/switch-character.svg +0 -1
  43. package/src/icons/switch-costume.svg +0 -1
  44. package/src/types/Live2dOptions.ts +0 -56
  45. package/src/types/ModelOptions.ts +0 -40
  46. package/src/types/Resolve.ts +0 -16
  47. package/src/types/index.ts +0 -3
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @doki-land/live2d
2
+
3
+ live2d.ts package 0.0.12.
@@ -0,0 +1,326 @@
1
+ import * as _doki_land_live2d_core from '@doki-land/live2d-core';
2
+ import { LoadProgress, InternalModel, ModelSource, AssetResolver, Live2dActor, CreateActorOptions, ActorTransform, ActorHit, CreateLive2dStageOptions, Live2dStage, PointerTrackingPolicy, StagePointerEvent, Live2DSession } from '@doki-land/live2d-core';
3
+ export { ActorHit, ActorTransform, AssetResolver, CreateActorOptions, CreateLive2dStageOptions, DEFAULT_ACTOR_TRANSFORM, EventEmitter, FrameProfile, FrameSnapshot, InternalModel, Live2DSession, Live2dActor, Live2dStage, LoadProgress, LoadProgressStage, ModelFormat, ModelInstance, ModelProgram, ModelSettings, ModelSource, PointerTrackingMode, PointerTrackingPolicy, SessionPhase, SessionState, StagePointerEvent, StageUpdateMode } from '@doki-land/live2d-core';
4
+ export { DEFAULT_NPM_CDN, resolveModelSourceUrl, resolveNpmSpecifier } from '@doki-land/live2d-loader';
5
+ import { ModelBackend, Renderer, ParameterBinding, DrawableMesh, RendererKind } from '@doki-land/live2d-renderer';
6
+ export { ModelBackend, ParameterBinding, Renderer, RendererKind, createCanvas2DRenderer, createMoc2Backend, createMoc3Backend, createQuadProgram, createRenderer, createWebGl2Renderer, createWebGpuRenderer, decodeMoc3, evaluateFrame, fingerprintSnapshot, parseCpuProgram, serializeCpuProgram } from '@doki-land/live2d-renderer';
7
+
8
+ /** Cubism motion3 segment kinds (spec). */
9
+ type MotionSegmentKind = "linear" | "bezier" | "stepped" | "inverseStepped";
10
+ type MotionCurveTarget = "Parameter" | "PartOpacity" | "Model";
11
+ interface MotionPoint {
12
+ readonly time: number;
13
+ readonly value: number;
14
+ }
15
+ interface MotionSegment {
16
+ readonly kind: MotionSegmentKind;
17
+ /** Segment start (inclusive). */
18
+ readonly p0: MotionPoint;
19
+ /** Bezier controls (bezier only). */
20
+ readonly p1?: MotionPoint;
21
+ readonly p2?: MotionPoint;
22
+ /** Segment end. */
23
+ readonly p3: MotionPoint;
24
+ }
25
+ interface MotionCurve {
26
+ readonly target: MotionCurveTarget;
27
+ readonly id: string;
28
+ readonly fadeInTime?: number;
29
+ readonly fadeOutTime?: number;
30
+ readonly segments: readonly MotionSegment[];
31
+ }
32
+ interface MotionUserData {
33
+ readonly time: number;
34
+ readonly value: string;
35
+ }
36
+ interface Motion3Clip {
37
+ readonly version: number;
38
+ readonly duration: number;
39
+ readonly fps: number;
40
+ readonly loop: boolean;
41
+ readonly areBeziersRestricted: boolean;
42
+ readonly fadeInTime: number;
43
+ readonly fadeOutTime: number;
44
+ readonly curves: readonly MotionCurve[];
45
+ readonly userData: readonly MotionUserData[];
46
+ }
47
+ /** Cubism-style priority: higher wins; equal may replace. */
48
+ declare const MotionPriority: {
49
+ readonly none: 0;
50
+ readonly idle: 1;
51
+ readonly normal: 2;
52
+ readonly force: 3;
53
+ };
54
+ type MotionPriorityLevel = (typeof MotionPriority)[keyof typeof MotionPriority];
55
+ interface PlayMotionOptions {
56
+ /** Default {@link MotionPriority.normal}. */
57
+ priority?: MotionPriorityLevel;
58
+ /**
59
+ * Parallel layer id. Default `priority:{n}` so different priorities
60
+ * can play together; same slot replaces or queues.
61
+ */
62
+ slot?: string;
63
+ /**
64
+ * When the slot is busy, enqueue instead of replacing / rejecting.
65
+ * Default false.
66
+ */
67
+ queue?: boolean;
68
+ /** Override clip Meta.Loop. */
69
+ loop?: boolean;
70
+ /** Override fade-in seconds (clip / definition). */
71
+ fadeInTime?: number;
72
+ /** Override fade-out seconds. */
73
+ fadeOutTime?: number;
74
+ }
75
+ interface MotionApplySample {
76
+ readonly target: MotionCurveTarget;
77
+ readonly id: string;
78
+ readonly value: number;
79
+ /** 0..1 fade weight for this frame. */
80
+ readonly weight: number;
81
+ }
82
+
83
+ /**
84
+ * Sample all curves of a clip at `timeSeconds` (clamped to [0, duration]
85
+ * unless looping — caller should wrap time for loops).
86
+ */
87
+ declare function evaluateMotion3(clip: Motion3Clip, timeSeconds: number): Array<{
88
+ target: MotionCurve["target"];
89
+ id: string;
90
+ value: number;
91
+ }>;
92
+ declare function evaluateCurve(curve: MotionCurve, timeSeconds: number, areBeziersRestricted: boolean): number;
93
+
94
+ interface MotionPlayerHandlers {
95
+ onStart?: (info: {
96
+ group: string;
97
+ index: number;
98
+ slot: string;
99
+ }) => void;
100
+ onFinish?: (info: {
101
+ group: string;
102
+ index: number;
103
+ slot: string;
104
+ }) => void;
105
+ onEvent?: (info: {
106
+ group: string;
107
+ index: number;
108
+ slot: string;
109
+ time: number;
110
+ value: string;
111
+ }) => void;
112
+ }
113
+ /**
114
+ * Multi-slot motion player with per-slot queue.
115
+ *
116
+ * Default slot is `priority:{n}` so idle (1) and normal (2) can run together.
117
+ * Same slot replaces (with fade-out) unless `queue: true`.
118
+ */
119
+ declare class MotionPlayer {
120
+ #private;
121
+ constructor(handlers?: MotionPlayerHandlers);
122
+ get isPlaying(): boolean;
123
+ listPlaying(): ReadonlyArray<{
124
+ slot: string;
125
+ group: string;
126
+ index: number;
127
+ time: number;
128
+ priority: MotionPriorityLevel;
129
+ }>;
130
+ /** @deprecated Prefer {@link listPlaying}; returns highest-priority slot. */
131
+ get current(): {
132
+ group: string;
133
+ index: number;
134
+ time: number;
135
+ priority: MotionPriorityLevel;
136
+ } | null;
137
+ /**
138
+ * Start a clip on a slot. Returns false if rejected by priority
139
+ * (and not queued).
140
+ */
141
+ start(group: string, index: number, clip: Motion3Clip, options?: PlayMotionOptions): boolean;
142
+ /** Fade out (default) or hard-stop; `slot` omits → all slots. */
143
+ stop(fade?: boolean, slot?: string): void;
144
+ clear(): void;
145
+ /**
146
+ * Advance all slots and return blended samples (weight baked in; apply as absolute).
147
+ */
148
+ update(deltaTimeSeconds: number): MotionApplySample[];
149
+ }
150
+ /** Blend layers low→high priority; later layers lerp over earlier by their weight. */
151
+ declare function blendMotionLayers(layers: ReadonlyArray<{
152
+ priority: number;
153
+ samples: readonly MotionApplySample[];
154
+ }>): MotionApplySample[];
155
+
156
+ /**
157
+ * Parse Cubism `motion3.json` (FileFormats/motion3.json.md).
158
+ */
159
+ declare function parseMotion3(json: unknown): Motion3Clip;
160
+
161
+ interface ActorModelSlotOptions {
162
+ backends: readonly ModelBackend[];
163
+ renderer: Renderer;
164
+ onProgress?: (payload: LoadProgress) => void;
165
+ onMotionStart?: (payload: {
166
+ group: string;
167
+ index: number;
168
+ slot: string;
169
+ }) => void;
170
+ onMotionFinish?: (payload: {
171
+ group: string;
172
+ index: number;
173
+ slot: string;
174
+ }) => void;
175
+ }
176
+ /** One loaded model + draw pass owned by an actor (not a renderer). */
177
+ declare class ActorModelSlot {
178
+ #private;
179
+ constructor(options: ActorModelSlotOptions);
180
+ get model(): InternalModel | null;
181
+ get drawPass(): ReturnType<Renderer["createModelDrawPass"]> | null;
182
+ ensureDrawPass(): ReturnType<Renderer["createModelDrawPass"]>;
183
+ load(source: ModelSource, resolver?: AssetResolver): Promise<InternalModel>;
184
+ setParameter(id: string, value: number): void;
185
+ listParameters(): readonly ParameterBinding[];
186
+ listMotionGroups(): Record<string, readonly _doki_land_live2d_core.MotionDefinition[]>;
187
+ playMotion(group: string, index?: number, options?: PlayMotionOptions): Promise<boolean>;
188
+ stopMotion(opts?: {
189
+ fade?: boolean;
190
+ slot?: string;
191
+ }): void;
192
+ listPlayingMotions(): ReadonlyArray<{
193
+ slot: string;
194
+ group: string;
195
+ index: number;
196
+ time: number;
197
+ priority: number;
198
+ }>;
199
+ update(deltaTimeSeconds: number): DrawableMesh[] | null;
200
+ hitTestModelCoords(modelX: number, modelY: number): string | null;
201
+ destroy(): void;
202
+ }
203
+
204
+ interface Live2dActorImplOptions {
205
+ id: string;
206
+ creationIndex: number;
207
+ backends: readonly ModelBackend[];
208
+ renderer: Renderer;
209
+ }
210
+ declare class Live2dActorImpl implements Live2dActor {
211
+ #private;
212
+ readonly id: string;
213
+ readonly creationIndex: number;
214
+ constructor(options: CreateActorOptions | undefined, shared: Live2dActorImplOptions);
215
+ get model(): InternalModel | null;
216
+ get visible(): boolean;
217
+ set visible(value: boolean);
218
+ get opacity(): number;
219
+ set opacity(value: number);
220
+ get layer(): string;
221
+ set layer(value: string);
222
+ get order(): number;
223
+ set order(value: number);
224
+ getTransform(): ActorTransform;
225
+ setTransform(patch: Partial<ActorTransform>): void;
226
+ load(source: Parameters<Live2dActor["load"]>[0], resolver?: Parameters<Live2dActor["load"]>[1]): Promise<InternalModel>;
227
+ setParameter(id: string, value: number): void;
228
+ lookAt(stageX: number, stageY: number): void;
229
+ /** Internal: evaluate motion/physics and cache drawables for render. */
230
+ update(deltaTimeSeconds: number): DrawableMesh[] | null;
231
+ get lastDrawables(): DrawableMesh[] | null;
232
+ get slot(): ActorModelSlot;
233
+ hitTestStage(stageX: number, stageY: number): Omit<ActorHit, "actor"> | null;
234
+ destroy(): void;
235
+ }
236
+
237
+ interface CreateLive2dStageFullOptions extends CreateLive2dStageOptions {
238
+ backends?: ModelBackend[];
239
+ renderer?: Renderer;
240
+ prefer?: RendererKind[];
241
+ }
242
+ type PointerListener = (event: StagePointerEvent) => void;
243
+ declare class Live2dStageImpl implements Live2dStage {
244
+ #private;
245
+ constructor(options?: CreateLive2dStageFullOptions);
246
+ get actors(): readonly Live2dActor[];
247
+ get pointerTracking(): PointerTrackingPolicy;
248
+ set pointerTracking(policy: PointerTrackingPolicy);
249
+ get renderer(): Renderer;
250
+ mount(canvas: HTMLCanvasElement): Promise<void>;
251
+ createActor(options?: CreateActorOptions): Live2dActor;
252
+ removeActor(actorOrId: Live2dActor | string): void;
253
+ defineLayers(layers: readonly string[]): void;
254
+ update(deltaTimeSeconds: number): void;
255
+ render(): void;
256
+ start(): void;
257
+ pause(): void;
258
+ resume(): void;
259
+ stop(): void;
260
+ hitTest(stageX: number, stageY: number): ActorHit | null;
261
+ hitTestAll(stageX: number, stageY: number): readonly ActorHit[];
262
+ addEventListener(type: "pointerdown" | "pointermove" | "pointerup", listener: PointerListener): void;
263
+ removeEventListener(type: "pointerdown" | "pointermove" | "pointerup", listener: PointerListener): void;
264
+ destroy(): void;
265
+ }
266
+ declare function createLive2dStage(options?: CreateLive2dStageFullOptions): Live2dStage;
267
+
268
+ interface CreateLive2DOptions {
269
+ backends?: ModelBackend[];
270
+ renderer?: Renderer;
271
+ prefer?: RendererKind[];
272
+ updateMode?: "auto" | "manual";
273
+ }
274
+ interface Live2DRuntime extends Live2DSession {
275
+ readonly renderer: Renderer;
276
+ readonly backends: readonly ModelBackend[];
277
+ readonly stage: Live2dStageImpl;
278
+ readonly actor: Live2dActorImpl;
279
+ setParameter(id: string, value: number): void;
280
+ listParameters(): readonly ParameterBinding[];
281
+ hitTest(x: number, y: number): string | null;
282
+ listMotionGroups(): Record<string, readonly _doki_land_live2d_core.MotionDefinition[]>;
283
+ playMotion(group: string, index?: number, options?: PlayMotionOptions): Promise<boolean>;
284
+ stopMotion(opts?: {
285
+ fade?: boolean;
286
+ slot?: string;
287
+ }): void;
288
+ listPlayingMotions(): ReadonlyArray<{
289
+ slot: string;
290
+ group: string;
291
+ index: number;
292
+ time: number;
293
+ priority: number;
294
+ }>;
295
+ capturePng(opts?: {
296
+ mimeType?: "image/png";
297
+ quality?: number;
298
+ }): Promise<Blob>;
299
+ }
300
+
301
+ /** Wire moc backends and a renderer into one single-actor session. */
302
+ declare function createLive2D(options?: CreateLive2DOptions): Live2DRuntime;
303
+
304
+ /**
305
+ * Map canvas focus (-1..1, Y-up) onto standard Cubism drag parameters.
306
+ *
307
+ * Matches the Cubism sample / community widget weights:
308
+ * ANGLE_X/Y full range, ANGLE_Z = -dragX*dragY, BODY_ANGLE_X, EYE_BALL_*.
309
+ * Missing ids on a given model are skipped.
310
+ */
311
+ declare function focusParameterUpdates(parameters: readonly ParameterBinding[], dragX: number, dragY: number): Array<{
312
+ id: string;
313
+ value: number;
314
+ }>;
315
+
316
+ /**
317
+ * `@doki-land/live2d` — public facade.
318
+ *
319
+ * ```ts
320
+ * import { createLive2D } from "@doki-land/live2d";
321
+ * ```
322
+ */
323
+
324
+ declare const LIVE2D_VERSION: "0.0.0";
325
+
326
+ export { type CreateLive2DOptions, type CreateLive2dStageFullOptions, LIVE2D_VERSION, type Live2DRuntime, type Motion3Clip, type MotionApplySample, MotionPlayer, MotionPriority, type PlayMotionOptions, blendMotionLayers, createLive2D, createLive2dStage, evaluateCurve, evaluateMotion3, focusParameterUpdates, parseMotion3 };