reze-engine 0.10.2 → 0.11.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 +90 -13
- package/dist/engine.d.ts +177 -34
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1204 -318
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/shaders/body.d.ts +2 -0
- package/dist/shaders/body.d.ts.map +1 -0
- package/dist/shaders/body.js +232 -0
- package/dist/shaders/classify.d.ts +4 -0
- package/dist/shaders/classify.d.ts.map +1 -0
- package/dist/shaders/classify.js +12 -0
- package/dist/shaders/cloth_rough.d.ts +2 -0
- package/dist/shaders/cloth_rough.d.ts.map +1 -0
- package/dist/shaders/cloth_rough.js +190 -0
- package/dist/shaders/cloth_smooth.d.ts +2 -0
- package/dist/shaders/cloth_smooth.d.ts.map +1 -0
- package/dist/shaders/cloth_smooth.js +186 -0
- package/dist/shaders/default.d.ts +2 -0
- package/dist/shaders/default.d.ts.map +1 -0
- package/dist/shaders/default.js +185 -0
- package/dist/shaders/dfg_lut.d.ts +3 -0
- package/dist/shaders/dfg_lut.d.ts.map +1 -0
- package/dist/shaders/dfg_lut.js +129 -0
- package/dist/shaders/eye.d.ts +2 -0
- package/dist/shaders/eye.d.ts.map +1 -0
- package/dist/shaders/eye.js +159 -0
- package/dist/shaders/face.d.ts +2 -0
- package/dist/shaders/face.d.ts.map +1 -0
- package/dist/shaders/face.js +235 -0
- package/dist/shaders/hair.d.ts +2 -0
- package/dist/shaders/hair.d.ts.map +1 -0
- package/dist/shaders/hair.js +196 -0
- package/dist/shaders/ltc_mag_lut.d.ts +3 -0
- package/dist/shaders/ltc_mag_lut.d.ts.map +1 -0
- package/dist/shaders/ltc_mag_lut.js +1033 -0
- package/dist/shaders/metal.d.ts +2 -0
- package/dist/shaders/metal.d.ts.map +1 -0
- package/dist/shaders/metal.js +187 -0
- package/dist/shaders/nodes.d.ts +2 -0
- package/dist/shaders/nodes.d.ts.map +1 -0
- package/dist/shaders/nodes.js +465 -0
- package/dist/shaders/stockings.d.ts +2 -0
- package/dist/shaders/stockings.d.ts.map +1 -0
- package/dist/shaders/stockings.js +244 -0
- package/package.json +1 -1
- package/src/engine.ts +1412 -385
- package/src/index.ts +12 -2
- package/src/shaders/body.ts +234 -0
- package/src/shaders/classify.ts +25 -0
- package/src/shaders/cloth_rough.ts +192 -0
- package/src/shaders/cloth_smooth.ts +188 -0
- package/src/shaders/default.ts +186 -0
- package/src/shaders/dfg_lut.ts +131 -0
- package/src/shaders/eye.ts +160 -0
- package/src/shaders/face.ts +237 -0
- package/src/shaders/hair.ts +198 -0
- package/src/shaders/ltc_mag_lut.ts +1035 -0
- package/src/shaders/metal.ts +189 -0
- package/src/shaders/nodes.ts +466 -0
- package/src/shaders/stockings.ts +246 -0
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ npm install reze-engine
|
|
|
12
12
|
|
|
13
13
|
## Features
|
|
14
14
|
|
|
15
|
-
-
|
|
15
|
+
- Anime/MMD-style hybrid renderer — toon-ramp NPR diffuse mixed with GGX specular (multi-scatter + LTC energy compensation), per-material presets (face / hair / body / eye / stockings / metal / cloth / default), HDR pipeline with bloom and Filmic tone mapping, alpha-hashed transparency, screen-space outlines, MSAA 4x
|
|
16
16
|
- VMD animation with IK solver and Bullet physics
|
|
17
17
|
- Orbit camera with bone-follow mode
|
|
18
18
|
- GPU picking (double-click/tap)
|
|
@@ -25,9 +25,9 @@ npm install reze-engine
|
|
|
25
25
|
import { Engine, Vec3 } from "reze-engine";
|
|
26
26
|
|
|
27
27
|
const engine = new Engine(canvas, {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
world: { color: new Vec3(0.4, 0.49, 0.65), strength: 1.0 },
|
|
29
|
+
sun: { color: new Vec3(1, 1, 1), strength: 2.0, direction: new Vec3(0, -0.5, 1) },
|
|
30
|
+
camera: { distance: 31.5, target: new Vec3(0, 11.5, 0) }, // MMD units (1 unit = 8 cm)
|
|
31
31
|
});
|
|
32
32
|
await engine.init();
|
|
33
33
|
|
|
@@ -55,6 +55,7 @@ engine.getModel(name)
|
|
|
55
55
|
engine.getModelNames()
|
|
56
56
|
engine.removeModel(name)
|
|
57
57
|
|
|
58
|
+
engine.setMaterialPresets(name, presetMap) // assign NPR presets by material name
|
|
58
59
|
engine.setMaterialVisible(name, material, visible)
|
|
59
60
|
engine.toggleMaterialVisible(name, material)
|
|
60
61
|
engine.isMaterialVisible(name, material)
|
|
@@ -159,27 +160,103 @@ Call `model.play(name, options?)` to start or switch motion. `loop: true` makes
|
|
|
159
160
|
|
|
160
161
|
### Engine Options
|
|
161
162
|
|
|
163
|
+
Blender-style scene config — `world` = environment lighting, `sun` = the directional lamp, `camera` = view framing.
|
|
164
|
+
|
|
162
165
|
```javascript
|
|
163
166
|
{
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
167
|
+
world: {
|
|
168
|
+
color: Vec3, // World > Surface > Color (linear scene-referred)
|
|
169
|
+
strength: number, // World > Surface > Strength
|
|
170
|
+
},
|
|
171
|
+
sun: {
|
|
172
|
+
color: Vec3, // Light > Color
|
|
173
|
+
strength: number, // Light > Strength (Blender units)
|
|
174
|
+
direction: Vec3, // direction light travels (points from sun into the scene)
|
|
175
|
+
},
|
|
176
|
+
camera: {
|
|
177
|
+
distance: number,
|
|
178
|
+
target: Vec3,
|
|
179
|
+
fov: number, // radians
|
|
180
|
+
},
|
|
171
181
|
onRaycast: (modelName, material, screenX, screenY) => void,
|
|
172
|
-
shadowLightDirection: Vec3,
|
|
173
182
|
physicsOptions: {
|
|
174
183
|
constraintSolverKeywords: string[],
|
|
175
184
|
},
|
|
176
185
|
}
|
|
177
186
|
```
|
|
178
187
|
|
|
179
|
-
|
|
188
|
+
The shadow map is cast from `sun.direction` — same vector the shader lights with — so the visible shading and cast shadows stay coupled.
|
|
189
|
+
|
|
190
|
+
`engine.setWorld({ color?, strength? })` and `engine.setSun({ color?, strength?, direction? })` update lighting at runtime; changing `sun.direction` refreshes the shadow VP on the next frame.
|
|
180
191
|
|
|
181
192
|
`constraintSolverKeywords` — joints whose name contains any keyword use the Bullet 2.75 constraint solver; all others keep the stable Ammo 2.82+ default. See [babylon-mmd: Fix Constraint Behavior](https://noname0310.github.io/babylon-mmd/docs/reference/runtime/apply-physics-to-mmd-models/#fix-constraint-behavior) for details.
|
|
182
193
|
|
|
194
|
+
## Rendering
|
|
195
|
+
|
|
196
|
+
The renderer pairs stylised toon shading with a physically-based specular core, so anime characters keep their flat illustrated look while highlights and reflections still feel grounded. Each surface runs through a per-material preset that mixes an NPR closure with a Principled-style BSDF.
|
|
197
|
+
|
|
198
|
+
### PBR specular core
|
|
199
|
+
|
|
200
|
+
- GGX microfacet specular with Schlick Fresnel and Walter–Smith G1
|
|
201
|
+
- **Multi-scatter compensation** (Fdez-Agüera 2019, `F_brdf_multi_scatter`) — restores energy at high roughness so metals don't darken
|
|
202
|
+
- **Split-sum DFG LUT** (Karis 2013) baked at `engine.init()` — drives indirect specular and acts as the denominator of the direct-spec energy correction
|
|
203
|
+
- **LTC direct-spec scale** (Heitz 2016 magnitude LUT) — keeps analytic-light specular in the same energy budget as image-based lighting
|
|
204
|
+
- Sheen coarse approximation (`f³·0.077 + f·0.01 + 0.00026`) on cloth and stockings
|
|
205
|
+
|
|
206
|
+
### Stylised diffuse (NPR toolbox)
|
|
207
|
+
|
|
208
|
+
Every preset is built out of the same NPR primitives:
|
|
209
|
+
|
|
210
|
+
- **Toon ramps** — quantised NdotL through constant or anti-aliased step ramps for hard cel-shaded transitions
|
|
211
|
+
- **HSV remaps** — separate hue/sat/value tints for shadow vs lit zones, then layered with mix-overlay against AO masks for warm-shadow / cool-light shifts
|
|
212
|
+
- **Fresnel rim & layer-weight wrap** — Fresnel × layer-weight feeds a MixShader against an emissive backdrop for anime-style back-light
|
|
213
|
+
- **Procedural micro-detail** — fBM noise (PCG hash, three octaves) plus bump-from-height for fabric weave, skin micro-roughness, and metallic Voronoi sparkle in reflection-coord space
|
|
214
|
+
- **Selective emission** — texture-gated emission boosts (eye iris, stockings pattern) that survive into bloom
|
|
215
|
+
|
|
216
|
+
### Material presets
|
|
217
|
+
|
|
218
|
+
Each PMX material is dispatched to one of these shaders:
|
|
219
|
+
|
|
220
|
+
| Preset | Look |
|
|
221
|
+
| -------------- | ---- |
|
|
222
|
+
| `face` | toon ramp + rim + warm subsurface bleed + Principled mix |
|
|
223
|
+
| `hair` | layered hair toon + Fresnel rim + Principled spec mix |
|
|
224
|
+
| `body` | toon ramp + AO modulation + rim + Principled mix |
|
|
225
|
+
| `eye` | iris with emission boost (drives bloom) |
|
|
226
|
+
| `stockings` | NPR-tinted Principled with sheen, alpha-hashed |
|
|
227
|
+
| `metal` | full-metallic Principled + reflection-coord Voronoi sparkle + NPR toon overlay |
|
|
228
|
+
| `cloth_smooth` | Principled cloth with sheen, smoother variant |
|
|
229
|
+
| `cloth_rough` | rougher cloth variant |
|
|
230
|
+
| `default` | plain Principled BSDF (unmapped fallback) |
|
|
231
|
+
|
|
232
|
+
### Shadows, post, output
|
|
233
|
+
|
|
234
|
+
- Directional shadow map (2048², depth32float, 3×3 PCF unrolled, normal + depth bias)
|
|
235
|
+
- HDR (rgba16f) main pass with 4× MSAA, resolved before tonemap
|
|
236
|
+
- Bloom via threshold + downsample/upsample mip pyramid, gated by an MRT mask channel emitted from emissive presets
|
|
237
|
+
- Filmic tone mapping (LUT sampled from the same view-transform curve used by "Filmic / Medium High Contrast"), exposure baked in
|
|
238
|
+
- Screen-space outline pass (inverted-hull) on opaque and transparent materials
|
|
239
|
+
|
|
240
|
+
Assign presets per-model:
|
|
241
|
+
|
|
242
|
+
```javascript
|
|
243
|
+
engine.setMaterialPresets("hero", {
|
|
244
|
+
face: ["顔", "白目", "口の中"],
|
|
245
|
+
hair: ["髪", "前髪"],
|
|
246
|
+
body: ["肌"],
|
|
247
|
+
eye: ["瞳"],
|
|
248
|
+
stockings: ["袜子"],
|
|
249
|
+
cloth_smooth: ["制服", "スカート"],
|
|
250
|
+
metal: ["ボタン"],
|
|
251
|
+
});
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Material names not listed fall through to the `default` Principled BSDF.
|
|
255
|
+
|
|
256
|
+
### Alpha-hashed transparency
|
|
257
|
+
|
|
258
|
+
`stockings` uses the Wyman & McGuire 2017 derivative-aware stochastic discard instead of alpha blend. Self-overlapping transparent meshes (stockings wrap the leg — front and back surfaces share screen pixels) can't be sorted per-fragment in one draw call, so blend produces "cracks". Hashed alpha keeps opaque-style depth writes and resolves cleanly under MSAA.
|
|
259
|
+
|
|
183
260
|
## Projects Using This Engine
|
|
184
261
|
|
|
185
262
|
- **[Reze Studio](https://reze.studio)** - Web-native MMD animation editor
|
package/dist/engine.d.ts
CHANGED
|
@@ -2,37 +2,85 @@ import { Vec3 } from "./math";
|
|
|
2
2
|
import { Model } from "./model";
|
|
3
3
|
import { type PhysicsOptions } from "./physics";
|
|
4
4
|
import { type AssetReader } from "./asset-reader";
|
|
5
|
+
import { type MaterialPresetMap } from "./shaders/classify";
|
|
5
6
|
export type RaycastCallback = (modelName: string, material: string | null, screenX: number, screenY: number) => void;
|
|
6
7
|
/** Select a folder (webkitdirectory) and pass FileList or File[]; pmxFile picks which .pmx when several exist. */
|
|
7
8
|
export type LoadModelFromFilesOptions = {
|
|
8
9
|
files: FileList | File[];
|
|
9
10
|
pmxFile?: File;
|
|
10
11
|
};
|
|
12
|
+
export type WorldOptions = {
|
|
13
|
+
/** Linear scene-referred color of the World Background (Blender: World > Surface > Color). */
|
|
14
|
+
color?: Vec3;
|
|
15
|
+
/** Multiplier on world color (Blender: World > Surface > Strength). */
|
|
16
|
+
strength?: number;
|
|
17
|
+
};
|
|
18
|
+
export type SunOptions = {
|
|
19
|
+
/** Linear color of the sun lamp (Blender: Light > Color). */
|
|
20
|
+
color?: Vec3;
|
|
21
|
+
/** Lamp power in Blender units (Blender: Light > Strength). */
|
|
22
|
+
strength?: number;
|
|
23
|
+
/** Direction sunlight travels (points FROM sun TO scene, Blender: -light.rotation.Z). */
|
|
24
|
+
direction?: Vec3;
|
|
25
|
+
};
|
|
26
|
+
export type CameraOptions = {
|
|
27
|
+
/** Orbit distance from target. */
|
|
28
|
+
distance?: number;
|
|
29
|
+
/** World-space orbit center. */
|
|
30
|
+
target?: Vec3;
|
|
31
|
+
/** Vertical field of view in radians. */
|
|
32
|
+
fov?: number;
|
|
33
|
+
};
|
|
34
|
+
/** EEVEE Bloom panel (3D Viewport > Render > Bloom). Fields map 1:1 to Blender's UI. */
|
|
35
|
+
export type BloomOptions = {
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
threshold: number;
|
|
38
|
+
knee: number;
|
|
39
|
+
radius: number;
|
|
40
|
+
color: Vec3;
|
|
41
|
+
intensity: number;
|
|
42
|
+
clamp: number;
|
|
43
|
+
};
|
|
44
|
+
export declare const DEFAULT_BLOOM_OPTIONS: BloomOptions;
|
|
45
|
+
/** Blender Color Management / View (rendering.txt: Filmic, exposure, gamma). `look` is reserved for future curve tweaks. */
|
|
46
|
+
export type ViewTransformOptions = {
|
|
47
|
+
/** Stops applied before Filmic: `linear *= 2^exposure` (Blender default often ~−0.3). */
|
|
48
|
+
exposure: number;
|
|
49
|
+
/** After Filmic, display gamma (`pow(rgb, 1/gamma)`). */
|
|
50
|
+
gamma: number;
|
|
51
|
+
look: "default" | "medium_high_contrast";
|
|
52
|
+
};
|
|
53
|
+
export declare const DEFAULT_VIEW_TRANSFORM: ViewTransformOptions;
|
|
11
54
|
export type EngineOptions = {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
55
|
+
world?: WorldOptions;
|
|
56
|
+
sun?: SunOptions;
|
|
57
|
+
camera?: CameraOptions;
|
|
58
|
+
/** Initial EEVEE-style bloom; tune at runtime with `setBloomOptions`. */
|
|
59
|
+
bloom?: Partial<BloomOptions>;
|
|
60
|
+
/** View transform (exposure/gamma) applied in composite before/after Filmic. */
|
|
61
|
+
view?: Partial<ViewTransformOptions>;
|
|
19
62
|
onRaycast?: RaycastCallback;
|
|
20
63
|
physicsOptions?: PhysicsOptions;
|
|
21
|
-
shadowLightDirection?: Vec3;
|
|
22
64
|
};
|
|
23
65
|
export declare const DEFAULT_ENGINE_OPTIONS: {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
66
|
+
world: {
|
|
67
|
+
color: Vec3;
|
|
68
|
+
strength: number;
|
|
69
|
+
};
|
|
70
|
+
sun: {
|
|
71
|
+
color: Vec3;
|
|
72
|
+
strength: number;
|
|
73
|
+
direction: Vec3;
|
|
74
|
+
};
|
|
75
|
+
camera: {
|
|
76
|
+
distance: number;
|
|
77
|
+
target: Vec3;
|
|
78
|
+
fov: number;
|
|
79
|
+
};
|
|
31
80
|
onRaycast: undefined;
|
|
32
81
|
physicsOptions: {
|
|
33
82
|
constraintSolverKeywords: string[];
|
|
34
83
|
};
|
|
35
|
-
shadowLightDirection: Vec3;
|
|
36
84
|
};
|
|
37
85
|
export interface EngineStats {
|
|
38
86
|
fps: number;
|
|
@@ -48,15 +96,23 @@ export declare class Engine {
|
|
|
48
96
|
private camera;
|
|
49
97
|
private cameraUniformBuffer;
|
|
50
98
|
private cameraMatrixData;
|
|
51
|
-
private
|
|
52
|
-
private
|
|
53
|
-
private
|
|
99
|
+
private world;
|
|
100
|
+
private sun;
|
|
101
|
+
private cameraConfig;
|
|
54
102
|
private lightUniformBuffer;
|
|
55
103
|
private lightData;
|
|
56
104
|
private lightCount;
|
|
57
105
|
private resizeObserver;
|
|
58
106
|
private depthTexture;
|
|
59
107
|
private modelPipeline;
|
|
108
|
+
private facePipeline;
|
|
109
|
+
private hairPipeline;
|
|
110
|
+
private clothSmoothPipeline;
|
|
111
|
+
private clothRoughPipeline;
|
|
112
|
+
private metalPipeline;
|
|
113
|
+
private bodyPipeline;
|
|
114
|
+
private eyePipeline;
|
|
115
|
+
private stockingsPipeline;
|
|
60
116
|
private groundShadowPipeline;
|
|
61
117
|
private groundShadowBindGroupLayout;
|
|
62
118
|
private outlinePipeline;
|
|
@@ -68,17 +124,53 @@ export declare class Engine {
|
|
|
68
124
|
private perFrameBindGroup;
|
|
69
125
|
private outlinePerFrameBindGroup;
|
|
70
126
|
private multisampleTexture;
|
|
127
|
+
private hdrResolveTexture;
|
|
71
128
|
private static readonly MULTISAMPLE_COUNT;
|
|
129
|
+
private static readonly HDR_FORMAT;
|
|
130
|
+
/** Single-channel mask written alongside HDR color — 1 = model geometry (contributes
|
|
131
|
+
* to bloom), 0 = ground (never blooms). Sampled by the bloom blit pass to gate the
|
|
132
|
+
* prefilter so ground brightness can't halo the scene. */
|
|
133
|
+
private static readonly BLOOM_MASK_FORMAT;
|
|
134
|
+
private multisampleMaskTexture;
|
|
135
|
+
private maskResolveTexture;
|
|
136
|
+
private maskResolveView;
|
|
72
137
|
private renderPassDescriptor;
|
|
73
|
-
private
|
|
74
|
-
private
|
|
75
|
-
private
|
|
76
|
-
private
|
|
138
|
+
private compositePassDescriptor;
|
|
139
|
+
private compositePipeline;
|
|
140
|
+
private compositeBindGroupLayout;
|
|
141
|
+
private compositeBindGroup;
|
|
142
|
+
private compositeUniformBuffer;
|
|
143
|
+
private readonly compositeUniformData;
|
|
144
|
+
private bloomSampler;
|
|
145
|
+
private bloomBlitUniformBuffer;
|
|
146
|
+
private bloomUpsampleUniformBuffer;
|
|
147
|
+
private readonly bloomBlitUniformData;
|
|
148
|
+
private readonly bloomUpsampleUniformData;
|
|
149
|
+
private bloomBlitPipeline;
|
|
150
|
+
private bloomDownsamplePipeline;
|
|
151
|
+
private bloomUpsamplePipeline;
|
|
152
|
+
private bloomBlitBindGroupLayout;
|
|
153
|
+
private bloomDownsampleBindGroupLayout;
|
|
154
|
+
private bloomUpsampleBindGroupLayout;
|
|
155
|
+
private bloomDownTexture;
|
|
156
|
+
private bloomUpTexture;
|
|
157
|
+
private bloomMipCount;
|
|
158
|
+
private bloomDownMipViews;
|
|
159
|
+
private bloomUpMipViews;
|
|
160
|
+
private bloomBlitBindGroup;
|
|
161
|
+
private bloomDownsampleBindGroups;
|
|
162
|
+
private bloomUpsampleBindGroups;
|
|
163
|
+
/** Single-attachment pass; colorAttachments[0].view set per bloom step. */
|
|
164
|
+
private bloomPassDescriptor;
|
|
165
|
+
private static readonly BLOOM_MAX_LEVELS;
|
|
77
166
|
private groundVertexBuffer?;
|
|
78
167
|
private groundIndexBuffer?;
|
|
79
168
|
private hasGround;
|
|
80
|
-
private shadowMapTexture
|
|
81
|
-
private shadowMapDepthView
|
|
169
|
+
private shadowMapTexture;
|
|
170
|
+
private shadowMapDepthView;
|
|
171
|
+
private brdfLutTexture;
|
|
172
|
+
private brdfLutView;
|
|
173
|
+
private static readonly SHADOW_MAP_SIZE;
|
|
82
174
|
private shadowDepthPipeline;
|
|
83
175
|
private shadowLightVPBuffer;
|
|
84
176
|
private shadowLightVPMatrix;
|
|
@@ -88,7 +180,6 @@ export declare class Engine {
|
|
|
88
180
|
private groundDrawCall;
|
|
89
181
|
private onRaycast?;
|
|
90
182
|
private physicsOptions;
|
|
91
|
-
private shadowLightDirection;
|
|
92
183
|
private lastTouchTime;
|
|
93
184
|
private readonly DOUBLE_TAP_DELAY;
|
|
94
185
|
private pickPipeline;
|
|
@@ -103,6 +194,8 @@ export declare class Engine {
|
|
|
103
194
|
private modelInstances;
|
|
104
195
|
private materialSampler;
|
|
105
196
|
private textureCache;
|
|
197
|
+
private mipBlitPipeline;
|
|
198
|
+
private mipBlitSampler;
|
|
106
199
|
private _nextDefaultModelId;
|
|
107
200
|
private ikEnabled;
|
|
108
201
|
private physicsEnabled;
|
|
@@ -117,8 +210,22 @@ export declare class Engine {
|
|
|
117
210
|
private stats;
|
|
118
211
|
private animationFrameId;
|
|
119
212
|
private renderLoopCallback;
|
|
213
|
+
private bloomSettings;
|
|
214
|
+
private viewTransform;
|
|
120
215
|
constructor(canvas: HTMLCanvasElement, options?: EngineOptions);
|
|
216
|
+
/** Merge partial bloom with EEVEE defaults (same as constructor). */
|
|
217
|
+
static mergeBloomDefaults(partial?: Partial<BloomOptions>): BloomOptions;
|
|
218
|
+
static mergeViewTransformDefaults(partial?: Partial<ViewTransformOptions>): ViewTransformOptions;
|
|
219
|
+
/** Current bloom settings (Blender names; tint is a copied `Vec3`). */
|
|
220
|
+
getBloomOptions(): BloomOptions;
|
|
221
|
+
getViewTransformOptions(): ViewTransformOptions;
|
|
222
|
+
setViewTransformOptions(patch: Partial<ViewTransformOptions>): void;
|
|
223
|
+
private writeCompositeViewUniforms;
|
|
224
|
+
/** Patch bloom; GPU uniforms update immediately if `init()` has run. */
|
|
225
|
+
setBloomOptions(patch: Partial<BloomOptions>): void;
|
|
226
|
+
private writeBloomUniforms;
|
|
121
227
|
init(): Promise<void>;
|
|
228
|
+
private bakeBrdfLut;
|
|
122
229
|
private createRenderPipeline;
|
|
123
230
|
private createPipelines;
|
|
124
231
|
private setupResize;
|
|
@@ -137,15 +244,33 @@ export declare class Engine {
|
|
|
137
244
|
getCameraBeta(): number;
|
|
138
245
|
setCameraBeta(b: number): void;
|
|
139
246
|
private setupLighting;
|
|
140
|
-
|
|
141
|
-
|
|
247
|
+
/**
|
|
248
|
+
* Write world ambient. For a uniform-radiance world, hemispherical irradiance
|
|
249
|
+
* is E = π·L and a Lambertian BRDF reflects (albedo/π)·E = albedo·L, so the
|
|
250
|
+
* shader's ambient uniform is just `world.color × world.strength` — no /π.
|
|
251
|
+
*/
|
|
252
|
+
private writeWorld;
|
|
253
|
+
/** Write sun lamp into light slot `index` (0..3). Layout mirrors the WGSL struct. */
|
|
254
|
+
private writeSun;
|
|
255
|
+
/** Update the world environment (Blender: World Background). Ambient recomputes immediately. */
|
|
256
|
+
setWorld(options: WorldOptions): void;
|
|
257
|
+
/** Update the sun lamp (Blender: Light > Sun). Direction change marks shadow VP dirty. */
|
|
258
|
+
setSun(options: SunOptions): void;
|
|
259
|
+
getWorld(): Readonly<{
|
|
260
|
+
color: Vec3;
|
|
261
|
+
strength: number;
|
|
262
|
+
}>;
|
|
263
|
+
getSun(): Readonly<{
|
|
264
|
+
color: Vec3;
|
|
265
|
+
strength: number;
|
|
266
|
+
direction: Vec3;
|
|
267
|
+
}>;
|
|
142
268
|
addGround(options?: {
|
|
143
269
|
width?: number;
|
|
144
270
|
height?: number;
|
|
145
271
|
diffuseColor?: Vec3;
|
|
146
272
|
fadeStart?: number;
|
|
147
273
|
fadeEnd?: number;
|
|
148
|
-
shadowMapSize?: number;
|
|
149
274
|
shadowStrength?: number;
|
|
150
275
|
gridSpacing?: number;
|
|
151
276
|
gridLineWidth?: number;
|
|
@@ -166,6 +291,7 @@ export declare class Engine {
|
|
|
166
291
|
getModelNames(): string[];
|
|
167
292
|
getModel(name: string): Model | null;
|
|
168
293
|
markVertexBufferDirty(modelNameOrModel?: string | Model): void;
|
|
294
|
+
setMaterialPresets(modelName: string, presets: MaterialPresetMap): void;
|
|
169
295
|
setMaterialVisible(modelName: string, materialName: string, visible: boolean): void;
|
|
170
296
|
toggleMaterialVisible(modelName: string, materialName: string): void;
|
|
171
297
|
isMaterialVisible(modelName: string, materialName: string): boolean;
|
|
@@ -186,6 +312,7 @@ export declare class Engine {
|
|
|
186
312
|
private createUniformBuffer;
|
|
187
313
|
private shouldRenderDrawCall;
|
|
188
314
|
private createTextureFromLogicalPath;
|
|
315
|
+
private generateMipmaps;
|
|
189
316
|
private renderGround;
|
|
190
317
|
private handleCanvasDoubleClick;
|
|
191
318
|
private handleCanvasTouch;
|
|
@@ -193,15 +320,31 @@ export declare class Engine {
|
|
|
193
320
|
private renderPickPass;
|
|
194
321
|
private resolvePickResult;
|
|
195
322
|
render(): void;
|
|
196
|
-
private updateRenderTarget;
|
|
197
323
|
private drawInstanceShadow;
|
|
198
|
-
private
|
|
199
|
-
|
|
200
|
-
|
|
324
|
+
private pipelineForPreset;
|
|
325
|
+
/**
|
|
326
|
+
* Draw every material of a given type (`opaque` or `transparent`) using the main
|
|
327
|
+
* pipeline(s). Binds the per-frame and per-instance groups once at the top of the
|
|
328
|
+
* batch, then issues one draw per material. Early-outs if nothing to draw so we
|
|
329
|
+
* don't waste bindings when a model has no transparents, etc.
|
|
330
|
+
*/
|
|
331
|
+
private drawMaterials;
|
|
332
|
+
/**
|
|
333
|
+
* Draw every outline of a given type (`opaque-outline` or `transparent-outline`).
|
|
334
|
+
* Uses its own pipeline layout (group 0 = camera-only, group 2 = edge uniforms), so
|
|
335
|
+
* every batch binds its own groups from scratch — the next drawMaterials call will
|
|
336
|
+
* rebind group 0/1 correctly if needed.
|
|
337
|
+
*/
|
|
338
|
+
private drawOutlines;
|
|
339
|
+
/**
|
|
340
|
+
* Main-pass render sequence for one model instance:
|
|
341
|
+
* 1) opaque bodies → 2) opaque outlines → 3) transparents → 4) transparent outlines.
|
|
342
|
+
* Each batch binds the groups it needs, so switching between main and outline
|
|
343
|
+
* pipelines is self-contained (no cross-batch dependencies).
|
|
344
|
+
*/
|
|
201
345
|
private renderOneModel;
|
|
202
346
|
private updateCameraUniforms;
|
|
203
347
|
private updateSkinMatrices;
|
|
204
|
-
private drawOutlines;
|
|
205
348
|
private updateStats;
|
|
206
349
|
}
|
|
207
350
|
//# sourceMappingURL=engine.d.ts.map
|
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,EAAQ,IAAI,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,EAQL,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|