reze-engine 0.8.4 → 0.9.1
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 +91 -21
- package/dist/camera.d.ts +2 -0
- package/dist/camera.d.ts.map +1 -1
- package/dist/camera.js +14 -7
- package/dist/engine.d.ts +30 -15
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +319 -422
- package/dist/model.d.ts +0 -3
- package/dist/model.d.ts.map +1 -1
- package/dist/pmx-loader.d.ts.map +1 -1
- package/dist/pmx-loader.js +2 -19
- package/package.json +2 -2
- package/src/camera.ts +15 -7
- package/src/engine.ts +365 -463
- package/src/model.ts +0 -3
- package/src/pmx-loader.ts +2 -23
package/README.md
CHANGED
|
@@ -1,44 +1,114 @@
|
|
|
1
1
|
# Reze Engine
|
|
2
2
|
|
|
3
|
-
A lightweight
|
|
3
|
+
A lightweight WebGPU engine for real-time 3D MMD/PMX model rendering, built with TypeScript.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install reze-engine
|
|
9
|
+
```
|
|
4
10
|
|
|
5
11
|
## Features
|
|
6
12
|
|
|
7
13
|
- Blinn-Phong lighting, alpha blending, rim lighting, outlines, MSAA 4x
|
|
8
|
-
-
|
|
9
|
-
-
|
|
14
|
+
- VMD animation (multiple named, non-interruptible), IK solver, Ammo/Bullet physics
|
|
15
|
+
- GPU picking (double-click/tap returns model + material name)
|
|
16
|
+
- Souls-style follow cam (orbit center bound to model bone)
|
|
17
|
+
- Optimized bind groups (per-frame / per-instance / per-material)
|
|
18
|
+
- Ground shadow mapping with PCF
|
|
10
19
|
- Multi-model (per-model materials, IK, physics)
|
|
11
20
|
|
|
12
|
-
##
|
|
21
|
+
## Quick Start
|
|
13
22
|
|
|
14
23
|
```javascript
|
|
15
|
-
import { Engine,
|
|
24
|
+
import { Engine, Vec3 } from "reze-engine"
|
|
16
25
|
|
|
17
|
-
const engine = new Engine(canvas, {
|
|
26
|
+
const engine = new Engine(canvas, {
|
|
27
|
+
ambientColor: new Vec3(0.88, 0.92, 0.99),
|
|
28
|
+
cameraDistance: 31.5,
|
|
29
|
+
})
|
|
18
30
|
await engine.init()
|
|
19
|
-
|
|
20
|
-
await
|
|
21
|
-
model.
|
|
31
|
+
|
|
32
|
+
const model = await engine.loadModel("hero", "/models/hero/hero.pmx")
|
|
33
|
+
await model.loadAnimation("idle", "/animations/idle.vmd")
|
|
34
|
+
model.show("idle")
|
|
22
35
|
model.play()
|
|
23
|
-
|
|
36
|
+
|
|
37
|
+
engine.setCameraFollow(model, "センター", new Vec3(0, 3.5, 0))
|
|
38
|
+
engine.addGround({ width: 160, height: 160 })
|
|
39
|
+
engine.runRenderLoop()
|
|
24
40
|
```
|
|
25
41
|
|
|
26
|
-
## API
|
|
42
|
+
## API
|
|
43
|
+
|
|
44
|
+
### Engine
|
|
45
|
+
|
|
46
|
+
| Method | Description |
|
|
47
|
+
|--------|-------------|
|
|
48
|
+
| `new Engine(canvas, options?)` | Create engine with optional config |
|
|
49
|
+
| `engine.init()` | Initialize WebGPU device and context |
|
|
50
|
+
| `engine.loadModel(path)` | Load PMX model (auto-named) |
|
|
51
|
+
| `engine.loadModel(name, path)` | Load PMX model with name |
|
|
52
|
+
| `engine.getModel(name)` | Get model by name |
|
|
53
|
+
| `engine.getModelNames()` | List all model names |
|
|
54
|
+
| `engine.removeModel(name)` | Remove model |
|
|
55
|
+
| `engine.setMaterialVisible(model, mat, visible)` | Show/hide material |
|
|
56
|
+
| `engine.toggleMaterialVisible(model, mat)` | Toggle material visibility |
|
|
57
|
+
| `engine.setIKEnabled(enabled)` | Enable/disable IK globally |
|
|
58
|
+
| `engine.setPhysicsEnabled(enabled)` | Enable/disable physics globally |
|
|
59
|
+
| `engine.resetPhysics()` | Reset physics to current pose |
|
|
60
|
+
| `engine.setCameraFollow(model, bone?, offset?)` | Follow cam bound to bone |
|
|
61
|
+
| `engine.setCameraTarget(vec3)` | Static camera target |
|
|
62
|
+
| `engine.setCameraDistance(d)` | Set orbit radius |
|
|
63
|
+
| `engine.setCameraAlpha(a)` | Set horizontal orbit angle |
|
|
64
|
+
| `engine.setCameraBeta(b)` | Set vertical orbit angle |
|
|
65
|
+
| `engine.addGround(options?)` | Add ground plane with shadows |
|
|
66
|
+
| `engine.runRenderLoop(callback?)` | Start render loop |
|
|
67
|
+
| `engine.stopRenderLoop()` | Stop render loop |
|
|
68
|
+
| `engine.getStats()` | Returns `{ fps, frameTime }` |
|
|
69
|
+
| `engine.dispose()` | Clean up all resources |
|
|
27
70
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
71
|
+
### Model
|
|
72
|
+
|
|
73
|
+
| Method | Description |
|
|
74
|
+
|--------|-------------|
|
|
75
|
+
| `model.loadAnimation(name, url)` | Load VMD animation |
|
|
76
|
+
| `model.show(name)` | Set pose at time 0 |
|
|
77
|
+
| `model.play(name?)` | Play animation (queued if busy) |
|
|
78
|
+
| `model.pause()` | Pause playback |
|
|
79
|
+
| `model.stop()` | Stop playback |
|
|
80
|
+
| `model.seek(time)` | Seek to time |
|
|
81
|
+
| `model.getAnimationProgress()` | `{ current, duration, percentage, animationName }` |
|
|
82
|
+
| `model.getAnimationState()` | Access animation controller |
|
|
83
|
+
| `model.rotateBones(rotations, ms?)` | Tween bone rotations |
|
|
84
|
+
| `model.moveBones(translations, ms?)` | Tween bone translations |
|
|
85
|
+
| `model.setMorphWeight(name, weight, ms?)` | Tween morph weight |
|
|
86
|
+
| `model.resetAllBones()` | Reset to bind pose |
|
|
87
|
+
| `model.resetAllMorphs()` | Reset all morph weights |
|
|
88
|
+
| `model.getBoneWorldPosition(name)` | World position of bone |
|
|
89
|
+
|
|
90
|
+
### Engine Options
|
|
91
|
+
|
|
92
|
+
```javascript
|
|
93
|
+
{
|
|
94
|
+
ambientColor: Vec3,
|
|
95
|
+
directionalLightIntensity: number,
|
|
96
|
+
minSpecularIntensity: number,
|
|
97
|
+
rimLightIntensity: number,
|
|
98
|
+
cameraDistance: number,
|
|
99
|
+
cameraTarget: Vec3,
|
|
100
|
+
cameraFov: number,
|
|
101
|
+
onRaycast: (modelName, material, screenX, screenY) => void,
|
|
102
|
+
}
|
|
103
|
+
```
|
|
32
104
|
|
|
33
105
|
## Projects Using This Engine
|
|
34
106
|
|
|
35
|
-
- **[MiKaPo](https://mikapo.vercel.app)** -
|
|
36
|
-
- **[Popo](https://popo.love)** -
|
|
37
|
-
- **[MPL](https://mmd-mpl.vercel.app)** -
|
|
38
|
-
- **[Mixamo-MMD](https://mixamo-mmd.vercel.app)** - Retarget Mixamo FBX
|
|
107
|
+
- **[MiKaPo](https://mikapo.vercel.app)** - Real-time motion capture for MMD
|
|
108
|
+
- **[Popo](https://popo.love)** - LLM-generated MMD poses
|
|
109
|
+
- **[MPL](https://mmd-mpl.vercel.app)** - Motion programming language for MMD
|
|
110
|
+
- **[Mixamo-MMD](https://mixamo-mmd.vercel.app)** - Retarget Mixamo FBX to VMD
|
|
39
111
|
|
|
40
112
|
## Tutorial
|
|
41
113
|
|
|
42
|
-
Learn WebGPU from scratch by building an anime character renderer in incremental steps. The tutorial covers the complete rendering pipeline from a simple triangle to fully textured, skeletal-animated characters.
|
|
43
|
-
|
|
44
114
|
[How to Render an Anime Character with WebGPU](https://reze.one/tutorial)
|
package/dist/camera.d.ts
CHANGED
|
@@ -31,6 +31,8 @@ export declare class Camera {
|
|
|
31
31
|
getViewMatrix(): Mat4;
|
|
32
32
|
private getCameraVectors;
|
|
33
33
|
private panCamera;
|
|
34
|
+
/** Far plane grows with zoom-out so big floors / distant geometry stay visible */
|
|
35
|
+
private updateFarFromRadius;
|
|
34
36
|
getProjectionMatrix(): Mat4;
|
|
35
37
|
attachControl(canvas: HTMLCanvasElement): void;
|
|
36
38
|
detachControl(): void;
|
package/dist/camera.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAMnC,qBAAa,MAAM;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,IAAI,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAI;IAClB,IAAI,EAAE,MAAM,CAAO;IACnB,GAAG,EAAE,MAAM,CAAU;IAGrB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,oBAAoB,CAAY;IAGxC,kBAAkB,EAAE,MAAM,CAAQ;IAClC,cAAc,EAAE,MAAM,CAAS;IAC/B,cAAc,EAAE,MAAM,CAAO;IAC7B,cAAc,EAAE,MAAM,CAAO;IAC7B,IAAI,EAAE,MAAM,CAAO;IACnB,IAAI,EAAE,MAAM,CAAU;IACtB,cAAc,EAAE,MAAM,CAAQ;IAC9B,cAAc,EAAE,MAAM,CAAkB;gBAE5B,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAE,MAAoB;IAmBhG,WAAW,IAAI,IAAI;IAQnB,aAAa,IAAI,IAAI;IAQrB,OAAO,CAAC,gBAAgB;IA0CxB,OAAO,CAAC,SAAS;IAiBjB,kFAAkF;IAClF,OAAO,CAAC,mBAAmB;IAK3B,mBAAmB,IAAI,IAAI;IAK3B,aAAa,CAAC,MAAM,EAAE,iBAAiB;IAiBvC,aAAa;IAkBb,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,WAAW;IAgFnB,OAAO,CAAC,UAAU;CA+BnB"}
|
package/dist/camera.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Mat4, Vec3 } from "./math";
|
|
2
|
-
|
|
2
|
+
/** Far cap / zoom limit; large enough for wide shots without clipping distant ground */
|
|
3
|
+
const FAR_CAP = 8000;
|
|
4
|
+
const FAR_MIN = 200;
|
|
3
5
|
export class Camera {
|
|
4
6
|
constructor(alpha, beta, radius, target, fov = Math.PI / 4) {
|
|
5
7
|
this.aspect = 1;
|
|
6
8
|
this.near = 0.05;
|
|
7
|
-
this.far =
|
|
9
|
+
this.far = FAR_CAP;
|
|
8
10
|
// Input state
|
|
9
11
|
this.canvas = null;
|
|
10
12
|
this.isDragging = false;
|
|
@@ -22,7 +24,7 @@ export class Camera {
|
|
|
22
24
|
this.wheelPrecision = 0.01;
|
|
23
25
|
this.pinchPrecision = 0.05;
|
|
24
26
|
this.minZ = 0.05;
|
|
25
|
-
this.maxZ =
|
|
27
|
+
this.maxZ = FAR_CAP;
|
|
26
28
|
this.lowerBetaLimit = 0.001;
|
|
27
29
|
this.upperBetaLimit = Math.PI - 0.001;
|
|
28
30
|
this.alpha = alpha;
|
|
@@ -30,6 +32,7 @@ export class Camera {
|
|
|
30
32
|
this.radius = radius;
|
|
31
33
|
this.target = target;
|
|
32
34
|
this.fov = fov;
|
|
35
|
+
this.updateFarFromRadius();
|
|
33
36
|
// Bind event handlers
|
|
34
37
|
this.onMouseDown = this.onMouseDown.bind(this);
|
|
35
38
|
this.onMouseMove = this.onMouseMove.bind(this);
|
|
@@ -103,7 +106,13 @@ export class Camera {
|
|
|
103
106
|
// Update target position smoothly
|
|
104
107
|
this.target = this.target.add(panRight).add(panUp);
|
|
105
108
|
}
|
|
109
|
+
/** Far plane grows with zoom-out so big floors / distant geometry stay visible */
|
|
110
|
+
updateFarFromRadius() {
|
|
111
|
+
const margin = 600;
|
|
112
|
+
this.far = Math.min(FAR_CAP, Math.max(FAR_MIN, this.radius * 12 + margin));
|
|
113
|
+
}
|
|
106
114
|
getProjectionMatrix() {
|
|
115
|
+
this.updateFarFromRadius();
|
|
107
116
|
return Mat4.perspective(this.fov, this.aspect, this.near, this.far);
|
|
108
117
|
}
|
|
109
118
|
attachControl(canvas) {
|
|
@@ -168,8 +177,7 @@ export class Camera {
|
|
|
168
177
|
this.radius += e.deltaY * this.wheelPrecision;
|
|
169
178
|
// Clamp radius to reasonable bounds
|
|
170
179
|
this.radius = Math.max(this.minZ, Math.min(this.maxZ, this.radius));
|
|
171
|
-
|
|
172
|
-
this.far = Math.max(FAR, this.radius * 4);
|
|
180
|
+
this.updateFarFromRadius();
|
|
173
181
|
}
|
|
174
182
|
onContextMenu(e) {
|
|
175
183
|
e.preventDefault();
|
|
@@ -235,8 +243,7 @@ export class Camera {
|
|
|
235
243
|
this.radius += delta * this.pinchPrecision;
|
|
236
244
|
// Clamp radius to reasonable bounds
|
|
237
245
|
this.radius = Math.max(this.minZ, Math.min(this.maxZ, this.radius));
|
|
238
|
-
|
|
239
|
-
this.far = Math.max(FAR, this.radius * 4);
|
|
246
|
+
this.updateFarFromRadius();
|
|
240
247
|
}
|
|
241
248
|
if (isPanGesture) {
|
|
242
249
|
// Primary gesture is pan (two-finger drag)
|
package/dist/engine.d.ts
CHANGED
|
@@ -36,20 +36,19 @@ export declare class Engine {
|
|
|
36
36
|
private resizeObserver;
|
|
37
37
|
private depthTexture;
|
|
38
38
|
private modelPipeline;
|
|
39
|
-
private eyePipeline;
|
|
40
|
-
private hairPipelineOverEyes;
|
|
41
|
-
private hairPipelineOverNonEyes;
|
|
42
|
-
private hairDepthPipeline;
|
|
43
39
|
private groundShadowPipeline;
|
|
44
40
|
private groundShadowBindGroupLayout;
|
|
45
41
|
private outlinePipeline;
|
|
46
|
-
private
|
|
47
|
-
private
|
|
48
|
-
private
|
|
42
|
+
private mainPerFrameBindGroupLayout;
|
|
43
|
+
private mainPerInstanceBindGroupLayout;
|
|
44
|
+
private mainPerMaterialBindGroupLayout;
|
|
45
|
+
private outlinePerFrameBindGroupLayout;
|
|
46
|
+
private outlinePerMaterialBindGroupLayout;
|
|
47
|
+
private perFrameBindGroup;
|
|
48
|
+
private outlinePerFrameBindGroup;
|
|
49
49
|
private multisampleTexture;
|
|
50
50
|
private static readonly MULTISAMPLE_COUNT;
|
|
51
51
|
private renderPassDescriptor;
|
|
52
|
-
private readonly STENCIL_EYE_VALUE;
|
|
53
52
|
private ambientColor;
|
|
54
53
|
private directionalLightIntensity;
|
|
55
54
|
private minSpecularIntensity;
|
|
@@ -72,6 +71,15 @@ export declare class Engine {
|
|
|
72
71
|
private onRaycast?;
|
|
73
72
|
private lastTouchTime;
|
|
74
73
|
private readonly DOUBLE_TAP_DELAY;
|
|
74
|
+
private pickPipeline;
|
|
75
|
+
private pickPerFrameBindGroupLayout;
|
|
76
|
+
private pickPerInstanceBindGroupLayout;
|
|
77
|
+
private pickPerMaterialBindGroupLayout;
|
|
78
|
+
private pickPerFrameBindGroup;
|
|
79
|
+
private pickTexture;
|
|
80
|
+
private pickDepthTexture;
|
|
81
|
+
private pickReadbackBuffer;
|
|
82
|
+
private pendingPick;
|
|
75
83
|
private modelInstances;
|
|
76
84
|
private materialSampler;
|
|
77
85
|
private textureCache;
|
|
@@ -96,10 +104,18 @@ export declare class Engine {
|
|
|
96
104
|
private setupResize;
|
|
97
105
|
private handleResize;
|
|
98
106
|
private setupCamera;
|
|
99
|
-
/** Set camera look-at
|
|
107
|
+
/** Set static camera look-at / orbit center. Clears any model follow binding. */
|
|
100
108
|
setCameraTarget(v: Vec3): void;
|
|
101
|
-
/** Bind camera
|
|
109
|
+
/** Bind camera orbit center to a model's bone (Souls-style follow cam). Pass null to unbind. */
|
|
102
110
|
setCameraTarget(model: Model | null, boneName: string, offset?: Vec3): void;
|
|
111
|
+
/** Souls-style follow cam: orbit center tracks a model bone each frame. Shorthand for setCameraTarget(model, boneName, offset). */
|
|
112
|
+
setCameraFollow(model: Model | null, boneName?: string, offset?: Vec3): void;
|
|
113
|
+
getCameraDistance(): number;
|
|
114
|
+
setCameraDistance(d: number): void;
|
|
115
|
+
getCameraAlpha(): number;
|
|
116
|
+
setCameraAlpha(a: number): void;
|
|
117
|
+
getCameraBeta(): number;
|
|
118
|
+
setCameraBeta(b: number): void;
|
|
103
119
|
private setupLighting;
|
|
104
120
|
private setAmbientColor;
|
|
105
121
|
clearLights(): void;
|
|
@@ -121,7 +137,6 @@ export declare class Engine {
|
|
|
121
137
|
loadModel(path: string): Promise<Model>;
|
|
122
138
|
loadModel(name: string, path: string): Promise<Model>;
|
|
123
139
|
addModel(model: Model, pmxPath: string, name?: string): Promise<string>;
|
|
124
|
-
registerModel(model: Model, pmxPath: string): Promise<string>;
|
|
125
140
|
removeModel(name: string): void;
|
|
126
141
|
getModelNames(): string[];
|
|
127
142
|
getModel(name: string): Model | null;
|
|
@@ -134,7 +149,6 @@ export declare class Engine {
|
|
|
134
149
|
setPhysicsEnabled(enabled: boolean): void;
|
|
135
150
|
getPhysicsEnabled(): boolean;
|
|
136
151
|
resetPhysics(): void;
|
|
137
|
-
private instances;
|
|
138
152
|
private forEachInstance;
|
|
139
153
|
private updateInstances;
|
|
140
154
|
private updateVertexBuffer;
|
|
@@ -147,19 +161,20 @@ export declare class Engine {
|
|
|
147
161
|
private createUniformBuffer;
|
|
148
162
|
private shouldRenderDrawCall;
|
|
149
163
|
private createTextureFromPath;
|
|
150
|
-
private renderEyes;
|
|
151
164
|
private renderGround;
|
|
152
|
-
private renderHair;
|
|
153
165
|
private handleCanvasDoubleClick;
|
|
154
166
|
private handleCanvasTouch;
|
|
155
167
|
private performRaycast;
|
|
168
|
+
private renderPickPass;
|
|
169
|
+
private resolvePickResult;
|
|
156
170
|
render(): void;
|
|
171
|
+
private updateRenderTarget;
|
|
157
172
|
private drawInstanceShadow;
|
|
158
173
|
private drawOpaque;
|
|
159
174
|
private drawTransparent;
|
|
175
|
+
private bindMainGroups;
|
|
160
176
|
private renderOneModel;
|
|
161
177
|
private updateCameraUniforms;
|
|
162
|
-
private updateRenderTarget;
|
|
163
178
|
private updateSkinMatrices;
|
|
164
179
|
private drawOutlines;
|
|
165
180
|
private updateStats;
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|