reze-engine 0.8.1 → 0.8.3
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 +15 -92
- package/dist/animation.d.ts +57 -0
- package/dist/animation.d.ts.map +1 -1
- package/dist/animation.js +142 -3
- package/dist/engine.d.ts +0 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/model.d.ts +16 -10
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +70 -79
- package/package.json +1 -1
- package/src/animation.ts +183 -3
- package/src/engine.ts +1 -2
- package/src/index.ts +6 -0
- package/src/model.ts +89 -91
package/README.md
CHANGED
|
@@ -2,110 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
A lightweight engine built with WebGPU and TypeScript for real-time 3D anime character MMD model rendering.
|
|
4
4
|
|
|
5
|
-

|
|
6
|
-
|
|
7
5
|
## Features
|
|
8
6
|
|
|
9
|
-
- Blinn-Phong lighting
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
- Outlines
|
|
14
|
-
- MSAA 4x anti-aliasing
|
|
15
|
-
- Bone and morph API
|
|
16
|
-
- VMD animation
|
|
17
|
-
- IK solver
|
|
18
|
-
- Ammo/Bullet physics
|
|
7
|
+
- Blinn-Phong lighting, alpha blending, rim lighting, outlines, MSAA 4x
|
|
8
|
+
- Post alpha eye rendering (see-through eyes)
|
|
9
|
+
- Bone and morph API, VMD animation (multiple named, non-interruptible), IK solver, Ammo/Bullet physics
|
|
10
|
+
- Multi-model (per-model materials, IK, physics)
|
|
19
11
|
|
|
20
12
|
## Usage
|
|
21
13
|
|
|
22
14
|
```javascript
|
|
23
15
|
import { Engine, Model } from "reze-engine"
|
|
24
16
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (canvasRef.current) {
|
|
31
|
-
try {
|
|
32
|
-
const engine = new Engine(canvasRef.current, {})
|
|
33
|
-
engineRef.current = engine
|
|
34
|
-
await engine.init()
|
|
35
|
-
await Model.loadPmx("/models/reze/reze.pmx")
|
|
36
|
-
|
|
37
|
-
engine.runRenderLoop(() => {})
|
|
38
|
-
} catch (error) {
|
|
39
|
-
console.error(error)
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}, [])
|
|
43
|
-
|
|
44
|
-
useEffect(() => {
|
|
45
|
-
void (async () => {
|
|
46
|
-
initEngine()
|
|
47
|
-
})()
|
|
48
|
-
|
|
49
|
-
return () => {
|
|
50
|
-
if (engineRef.current) {
|
|
51
|
-
engineRef.current.dispose()
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}, [initEngine])
|
|
55
|
-
|
|
56
|
-
return <canvas ref={canvasRef} className="w-full h-full" />
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Engine options
|
|
61
|
-
|
|
62
|
-
```javascript
|
|
63
|
-
const DEFAULT_ENGINE_OPTIONS: RequiredEngineOptions = {
|
|
64
|
-
ambientColor: new Vec3(0.82, 0.82, 0.82),
|
|
65
|
-
directionalLightIntensity: 0.2,
|
|
66
|
-
minSpecularIntensity: 0.3,
|
|
67
|
-
rimLightIntensity: 0.4,
|
|
68
|
-
cameraDistance: 26.6,
|
|
69
|
-
cameraTarget: new Vec3(0, 12.5, 0),
|
|
70
|
-
cameraFov: Math.PI / 4,
|
|
71
|
-
onRaycast: undefined,
|
|
72
|
-
}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## API
|
|
76
|
-
|
|
77
|
-
Use **`Model.loadPmx(path)`** after **`await engine.init()`**—the model is registered on the engine automatically.
|
|
78
|
-
|
|
79
|
-
### Animation (model instance)
|
|
80
|
-
|
|
81
|
-
```javascript
|
|
82
|
-
const model = await Model.loadPmx("/models/char.pmx")
|
|
83
|
-
await model.loadVmd("/animations/dance.vmd")
|
|
17
|
+
const engine = new Engine(canvas, {})
|
|
18
|
+
await engine.init()
|
|
19
|
+
const model = await Model.loadFrom("/models/reze/reze.pmx")
|
|
20
|
+
await model.loadAnimation("default", "/animations/dance.vmd")
|
|
21
|
+
model.show("default")
|
|
84
22
|
model.playAnimation()
|
|
85
|
-
|
|
86
|
-
model.stopAnimation()
|
|
87
|
-
model.seekAnimation(2.5)
|
|
88
|
-
|
|
89
|
-
const { current, duration, percentage } = model.getAnimationProgress()
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Bones / morphs (model)
|
|
93
|
-
|
|
94
|
-
```javascript
|
|
95
|
-
model.rotateBones({ 首: neckQuat, 頭: headQuat }, 300)
|
|
96
|
-
model.moveBones({ センター: centerVec }, 300)
|
|
97
|
-
model.setMorphWeight("まばたき", 1.0, 300)
|
|
98
|
-
model.resetAllBones()
|
|
99
|
-
model.resetAllMorphs()
|
|
23
|
+
engine.runRenderLoop(() => {})
|
|
100
24
|
```
|
|
101
25
|
|
|
102
|
-
|
|
26
|
+
## API (summary)
|
|
103
27
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
```
|
|
28
|
+
- **Multi-model:** `engine.addModel(model, pmxPath, name?)`, `getModel(name)`, `getModelNames()`, `removeModel(name)`, `setMaterialVisible(modelName, materialName, visible)`, `setModelIKEnabled(modelName, enabled)`, `setModelPhysicsEnabled(modelName, enabled)`, `resetPhysics()`, `markVertexBufferDirty(modelName?)`
|
|
29
|
+
- **Animation:** `model.loadAnimation(name, vmdUrl)`; `model.show(name)`; `model.play()` / `model.play(name)`; `model.pause()`; `model.stop()`; `model.seek(t)`; `model.getAnimationProgress()`. Animations are non-interruptible (next is queued).
|
|
30
|
+
- **Bones / morphs:** `model.rotateBones()`, `model.moveBones()`, `model.setMorphWeight()`, `model.resetAllBones()`, `model.resetAllMorphs()`
|
|
31
|
+
- **Engine:** `runRenderLoop()`, `addGround({ mode: "reflection" | "shadow", ... })`, `onRaycast: (modelName, material, screenX, screenY) => {}`
|
|
109
32
|
|
|
110
33
|
## Projects Using This Engine
|
|
111
34
|
|
package/dist/animation.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Quat, Vec3 } from "./math";
|
|
1
2
|
export interface ControlPoint {
|
|
2
3
|
x: number;
|
|
3
4
|
y: number;
|
|
@@ -8,6 +9,62 @@ export interface BoneInterpolation {
|
|
|
8
9
|
translationY: ControlPoint[];
|
|
9
10
|
translationZ: ControlPoint[];
|
|
10
11
|
}
|
|
12
|
+
export interface BoneKeyframe {
|
|
13
|
+
boneName: string;
|
|
14
|
+
frame: number;
|
|
15
|
+
rotation: Quat;
|
|
16
|
+
translation: Vec3;
|
|
17
|
+
interpolation: BoneInterpolation;
|
|
18
|
+
time: number;
|
|
19
|
+
}
|
|
20
|
+
export interface MorphKeyframe {
|
|
21
|
+
morphName: string;
|
|
22
|
+
frame: number;
|
|
23
|
+
weight: number;
|
|
24
|
+
time: number;
|
|
25
|
+
}
|
|
26
|
+
export interface AnimationClip {
|
|
27
|
+
boneTracks: Map<string, BoneKeyframe[]>;
|
|
28
|
+
morphTracks: Map<string, MorphKeyframe[]>;
|
|
29
|
+
duration: number;
|
|
30
|
+
loop?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare class AnimationState {
|
|
33
|
+
private animations;
|
|
34
|
+
private currentAnimationName;
|
|
35
|
+
private currentTime;
|
|
36
|
+
private isPlaying;
|
|
37
|
+
private isPaused;
|
|
38
|
+
private nextAnimationName;
|
|
39
|
+
private onEnd;
|
|
40
|
+
loadAnimation(name: string, clip: AnimationClip): void;
|
|
41
|
+
removeAnimation(name: string): void;
|
|
42
|
+
play(name: string): boolean;
|
|
43
|
+
play(): void;
|
|
44
|
+
update(deltaTime: number): {
|
|
45
|
+
ended: boolean;
|
|
46
|
+
animationName: string | null;
|
|
47
|
+
};
|
|
48
|
+
pause(): void;
|
|
49
|
+
stop(): void;
|
|
50
|
+
seek(time: number): void;
|
|
51
|
+
getCurrentClip(): AnimationClip | null;
|
|
52
|
+
getCurrentAnimation(): string | null;
|
|
53
|
+
getCurrentTime(): number;
|
|
54
|
+
getDuration(): number;
|
|
55
|
+
getProgress(): {
|
|
56
|
+
animationName: string | null;
|
|
57
|
+
current: number;
|
|
58
|
+
duration: number;
|
|
59
|
+
percentage: number;
|
|
60
|
+
};
|
|
61
|
+
getAnimationNames(): string[];
|
|
62
|
+
hasAnimation(name: string): boolean;
|
|
63
|
+
show(name: string): void;
|
|
64
|
+
setOnEnd(callback: ((animationName: string) => void) | null): void;
|
|
65
|
+
getPlaying(): boolean;
|
|
66
|
+
getPaused(): boolean;
|
|
67
|
+
}
|
|
11
68
|
export declare function bezierInterpolate(x1: number, x2: number, y1: number, y2: number, t: number): number;
|
|
12
69
|
export declare function rawInterpolationToBoneInterpolation(raw: Uint8Array): BoneInterpolation;
|
|
13
70
|
export declare function interpolateControlPoints(cp: ControlPoint[], t: number): number;
|
package/dist/animation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,YAAY,EAAE,YAAY,EAAE,CAAA;IAC5B,YAAY,EAAE,YAAY,EAAE,CAAA;IAC5B,YAAY,EAAE,YAAY,EAAE,CAAA;CAC7B;AAGD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BnG;
|
|
1
|
+
{"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAEnC,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,YAAY,EAAE,YAAY,EAAE,CAAA;IAC5B,YAAY,EAAE,YAAY,EAAE,CAAA;IAC5B,YAAY,EAAE,YAAY,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,IAAI,CAAA;IACd,WAAW,EAAE,IAAI,CAAA;IACjB,aAAa,EAAE,iBAAiB,CAAA;IAChC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAA;IACvC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAA;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAGD,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,KAAK,CAAiD;IAE9D,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAItD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAYnC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAC3B,IAAI,IAAI,IAAI;IAsBZ,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAiC3E,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAOZ,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMxB,cAAc,IAAI,aAAa,GAAG,IAAI;IAItC,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAIpC,cAAc,IAAI,MAAM;IAIxB,WAAW,IAAI,MAAM;IAKrB,WAAW,IAAI;QAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAYtG,iBAAiB,IAAI,MAAM,EAAE;IAI7B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAInC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASxB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAIlE,UAAU,IAAI,OAAO;IAIrB,SAAS,IAAI,OAAO;CAGrB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BnG;AAID,wBAAgB,mCAAmC,CAAC,GAAG,EAAE,UAAU,GAAG,iBAAiB,CAmBtF;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ9E"}
|
package/dist/animation.js
CHANGED
|
@@ -1,4 +1,145 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Non-interruptible playback; play(name) while playing queues one next.
|
|
2
|
+
export class AnimationState {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.animations = new Map();
|
|
5
|
+
this.currentAnimationName = null;
|
|
6
|
+
this.currentTime = 0;
|
|
7
|
+
this.isPlaying = false;
|
|
8
|
+
this.isPaused = false;
|
|
9
|
+
this.nextAnimationName = null;
|
|
10
|
+
this.onEnd = null;
|
|
11
|
+
}
|
|
12
|
+
loadAnimation(name, clip) {
|
|
13
|
+
this.animations.set(name, clip);
|
|
14
|
+
}
|
|
15
|
+
removeAnimation(name) {
|
|
16
|
+
this.animations.delete(name);
|
|
17
|
+
if (this.currentAnimationName === name) {
|
|
18
|
+
this.currentAnimationName = null;
|
|
19
|
+
this.currentTime = 0;
|
|
20
|
+
this.isPlaying = false;
|
|
21
|
+
this.nextAnimationName = this.nextAnimationName === name ? null : this.nextAnimationName;
|
|
22
|
+
}
|
|
23
|
+
else if (this.nextAnimationName === name) {
|
|
24
|
+
this.nextAnimationName = null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
play(name) {
|
|
28
|
+
if (name === undefined) {
|
|
29
|
+
if (this.currentAnimationName && this.animations.has(this.currentAnimationName)) {
|
|
30
|
+
this.isPaused = false;
|
|
31
|
+
this.isPlaying = true;
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (!this.animations.has(name))
|
|
36
|
+
return false;
|
|
37
|
+
if (this.isPlaying && !this.isPaused) {
|
|
38
|
+
this.nextAnimationName = name;
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
this.currentAnimationName = name;
|
|
42
|
+
this.currentTime = 0;
|
|
43
|
+
this.isPlaying = true;
|
|
44
|
+
this.isPaused = false;
|
|
45
|
+
this.nextAnimationName = null;
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
update(deltaTime) {
|
|
49
|
+
if (!this.isPlaying || this.isPaused || this.currentAnimationName === null) {
|
|
50
|
+
return { ended: false, animationName: this.currentAnimationName };
|
|
51
|
+
}
|
|
52
|
+
const clip = this.animations.get(this.currentAnimationName);
|
|
53
|
+
if (!clip)
|
|
54
|
+
return { ended: false, animationName: this.currentAnimationName };
|
|
55
|
+
this.currentTime += deltaTime;
|
|
56
|
+
const duration = clip.duration;
|
|
57
|
+
if (this.currentTime >= duration) {
|
|
58
|
+
this.currentTime = duration;
|
|
59
|
+
if (clip.loop) {
|
|
60
|
+
this.currentTime = 0;
|
|
61
|
+
return { ended: false, animationName: this.currentAnimationName };
|
|
62
|
+
}
|
|
63
|
+
const finishedName = this.currentAnimationName;
|
|
64
|
+
this.onEnd?.(finishedName);
|
|
65
|
+
if (this.nextAnimationName !== null) {
|
|
66
|
+
const next = this.nextAnimationName;
|
|
67
|
+
this.nextAnimationName = null;
|
|
68
|
+
this.currentAnimationName = next;
|
|
69
|
+
this.currentTime = 0;
|
|
70
|
+
this.isPlaying = true;
|
|
71
|
+
this.isPaused = false;
|
|
72
|
+
return { ended: true, animationName: finishedName };
|
|
73
|
+
}
|
|
74
|
+
this.isPlaying = false;
|
|
75
|
+
return { ended: true, animationName: finishedName };
|
|
76
|
+
}
|
|
77
|
+
return { ended: false, animationName: this.currentAnimationName };
|
|
78
|
+
}
|
|
79
|
+
pause() {
|
|
80
|
+
this.isPaused = true;
|
|
81
|
+
}
|
|
82
|
+
stop() {
|
|
83
|
+
this.isPlaying = false;
|
|
84
|
+
this.isPaused = false;
|
|
85
|
+
this.currentTime = 0;
|
|
86
|
+
this.nextAnimationName = null;
|
|
87
|
+
}
|
|
88
|
+
seek(time) {
|
|
89
|
+
const clip = this.getCurrentClip();
|
|
90
|
+
if (!clip)
|
|
91
|
+
return;
|
|
92
|
+
this.currentTime = Math.max(0, Math.min(time, clip.duration));
|
|
93
|
+
}
|
|
94
|
+
getCurrentClip() {
|
|
95
|
+
return this.currentAnimationName !== null ? this.animations.get(this.currentAnimationName) ?? null : null;
|
|
96
|
+
}
|
|
97
|
+
getCurrentAnimation() {
|
|
98
|
+
return this.currentAnimationName;
|
|
99
|
+
}
|
|
100
|
+
getCurrentTime() {
|
|
101
|
+
return this.currentTime;
|
|
102
|
+
}
|
|
103
|
+
getDuration() {
|
|
104
|
+
const clip = this.getCurrentClip();
|
|
105
|
+
return clip ? clip.duration : 0;
|
|
106
|
+
}
|
|
107
|
+
getProgress() {
|
|
108
|
+
const clip = this.getCurrentClip();
|
|
109
|
+
const duration = clip ? clip.duration : 0;
|
|
110
|
+
const percentage = duration > 0 ? (this.currentTime / duration) * 100 : 0;
|
|
111
|
+
return {
|
|
112
|
+
animationName: this.currentAnimationName,
|
|
113
|
+
current: this.currentTime,
|
|
114
|
+
duration,
|
|
115
|
+
percentage,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
getAnimationNames() {
|
|
119
|
+
return Array.from(this.animations.keys());
|
|
120
|
+
}
|
|
121
|
+
hasAnimation(name) {
|
|
122
|
+
return this.animations.has(name);
|
|
123
|
+
}
|
|
124
|
+
show(name) {
|
|
125
|
+
if (!this.animations.has(name))
|
|
126
|
+
return;
|
|
127
|
+
this.currentAnimationName = name;
|
|
128
|
+
this.currentTime = 0;
|
|
129
|
+
this.isPlaying = false;
|
|
130
|
+
this.isPaused = false;
|
|
131
|
+
this.nextAnimationName = null;
|
|
132
|
+
}
|
|
133
|
+
setOnEnd(callback) {
|
|
134
|
+
this.onEnd = callback;
|
|
135
|
+
}
|
|
136
|
+
getPlaying() {
|
|
137
|
+
return this.isPlaying;
|
|
138
|
+
}
|
|
139
|
+
getPaused() {
|
|
140
|
+
return this.isPaused;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
2
143
|
export function bezierInterpolate(x1, x2, y1, y2, t) {
|
|
3
144
|
t = Math.max(0, Math.min(1, t));
|
|
4
145
|
let start = 0;
|
|
@@ -21,7 +162,6 @@ export function bezierInterpolate(x1, x2, y1, y2, t) {
|
|
|
21
162
|
return y;
|
|
22
163
|
}
|
|
23
164
|
const INV_127 = 1 / 127;
|
|
24
|
-
// VMD 64-byte interpolation blob → BoneInterpolation
|
|
25
165
|
export function rawInterpolationToBoneInterpolation(raw) {
|
|
26
166
|
return {
|
|
27
167
|
rotation: [
|
|
@@ -42,7 +182,6 @@ export function rawInterpolationToBoneInterpolation(raw) {
|
|
|
42
182
|
],
|
|
43
183
|
};
|
|
44
184
|
}
|
|
45
|
-
// Control points are 0–127 VMD bytes
|
|
46
185
|
export function interpolateControlPoints(cp, t) {
|
|
47
186
|
return bezierInterpolate(cp[0].x * INV_127, cp[1].x * INV_127, cp[0].y * INV_127, cp[1].y * INV_127, t);
|
|
48
187
|
}
|
package/dist/engine.d.ts
CHANGED
|
@@ -85,7 +85,6 @@ export declare class Engine {
|
|
|
85
85
|
private modelInstances;
|
|
86
86
|
private materialSampler;
|
|
87
87
|
private textureCache;
|
|
88
|
-
/** Reusable buffer for raycast skinning to avoid per-instance allocations (Three.js/Babylon.js style). */
|
|
89
88
|
private raycastVertexBuffer;
|
|
90
89
|
private lastFpsUpdate;
|
|
91
90
|
private framesSinceLastUpdate;
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.js
CHANGED
|
@@ -15,7 +15,7 @@ export const DEFAULT_ENGINE_OPTIONS = {
|
|
|
15
15
|
export class Engine {
|
|
16
16
|
static getInstance() {
|
|
17
17
|
if (!Engine.instance) {
|
|
18
|
-
throw new Error("Engine not ready: create Engine, await init(), then load models via Model.
|
|
18
|
+
throw new Error("Engine not ready: create Engine, await init(), then load models via Model.loadFrom().");
|
|
19
19
|
}
|
|
20
20
|
return Engine.instance;
|
|
21
21
|
}
|
|
@@ -39,7 +39,6 @@ export class Engine {
|
|
|
39
39
|
this.DOUBLE_TAP_DELAY = 300; // ms
|
|
40
40
|
this.modelInstances = new Map();
|
|
41
41
|
this.textureCache = new Map();
|
|
42
|
-
/** Reusable buffer for raycast skinning to avoid per-instance allocations (Three.js/Babylon.js style). */
|
|
43
42
|
this.raycastVertexBuffer = null;
|
|
44
43
|
this.lastFpsUpdate = performance.now();
|
|
45
44
|
this.framesSinceLastUpdate = 0;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { Engine, type EngineStats } from "./engine";
|
|
2
2
|
export { Model } from "./model";
|
|
3
3
|
export { Vec3, Quat, Mat4 } from "./math";
|
|
4
|
+
export { AnimationState, type AnimationClip, type BoneKeyframe, type MorphKeyframe, } from "./animation";
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/model.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Mat4, Quat, Vec3 } from "./math";
|
|
2
2
|
import { Rigidbody, Joint } from "./physics";
|
|
3
|
+
import { AnimationState } from "./animation";
|
|
3
4
|
export interface Texture {
|
|
4
5
|
path: string;
|
|
5
6
|
name: string;
|
|
@@ -96,7 +97,8 @@ export interface MorphRuntime {
|
|
|
96
97
|
export declare class Model {
|
|
97
98
|
private static _nextId;
|
|
98
99
|
private static nextDefaultName;
|
|
99
|
-
static
|
|
100
|
+
static loadFrom(path: string): Promise<Model>;
|
|
101
|
+
static loadFrom(name: string, path: string): Promise<Model>;
|
|
100
102
|
private _name;
|
|
101
103
|
get name(): string;
|
|
102
104
|
setName(value: string): void;
|
|
@@ -119,15 +121,10 @@ export declare class Model {
|
|
|
119
121
|
private skinMatricesArray?;
|
|
120
122
|
private tweenState;
|
|
121
123
|
private tweenTimeMs;
|
|
122
|
-
private
|
|
123
|
-
private boneTracks;
|
|
124
|
-
private morphTracks;
|
|
125
|
-
private animationDuration;
|
|
126
|
-
private isPlaying;
|
|
127
|
-
private isPaused;
|
|
128
|
-
private animationTime;
|
|
124
|
+
private readonly animationState;
|
|
129
125
|
private boneTrackIndices;
|
|
130
126
|
private morphTrackIndices;
|
|
127
|
+
private lastAppliedClip;
|
|
131
128
|
private ikEnabled;
|
|
132
129
|
private physicsEnabled;
|
|
133
130
|
constructor(vertexData: Float32Array<ArrayBuffer>, indexData: Uint32Array<ArrayBuffer>, textures: Texture[], materials: Material[], skeleton: Skeleton, skinning: Skinning, morphing: Morphing, rigidbodies?: Rigidbody[], joints?: Joint[]);
|
|
@@ -156,24 +153,33 @@ export declare class Model {
|
|
|
156
153
|
getSkinMatrices(): Float32Array;
|
|
157
154
|
setMorphWeight(name: string, weight: number, durationMs?: number): void;
|
|
158
155
|
private applyMorphs;
|
|
159
|
-
|
|
156
|
+
private buildClipFromVmdKeyFrames;
|
|
157
|
+
loadAnimation(animationName: string, vmdUrl: string): Promise<void>;
|
|
160
158
|
resetAllBones(): void;
|
|
161
159
|
resetAllMorphs(): void;
|
|
162
160
|
setIKEnabled(enabled: boolean): void;
|
|
163
161
|
setPhysicsEnabled(enabled: boolean): void;
|
|
164
162
|
getPhysicsEnabled(): boolean;
|
|
163
|
+
getAnimationState(): AnimationState;
|
|
164
|
+
play(): void;
|
|
165
|
+
play(name: string): boolean;
|
|
166
|
+
show(name: string): void;
|
|
165
167
|
playAnimation(): void;
|
|
168
|
+
pause(): void;
|
|
166
169
|
pauseAnimation(): void;
|
|
170
|
+
stop(): void;
|
|
167
171
|
stopAnimation(): void;
|
|
172
|
+
seek(time: number): void;
|
|
168
173
|
seekAnimation(time: number): void;
|
|
169
174
|
getAnimationProgress(): {
|
|
170
175
|
current: number;
|
|
171
176
|
duration: number;
|
|
172
177
|
percentage: number;
|
|
178
|
+
animationName: string | null;
|
|
173
179
|
};
|
|
174
180
|
private static upperBound;
|
|
175
181
|
private findKeyframeIndex;
|
|
176
|
-
private
|
|
182
|
+
private applyPoseFromClip;
|
|
177
183
|
update(deltaTime: number): boolean;
|
|
178
184
|
private solveIKChains;
|
|
179
185
|
private ikComputedSet;
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAGzC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|