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.
Files changed (62) hide show
  1. package/README.md +90 -13
  2. package/dist/engine.d.ts +177 -34
  3. package/dist/engine.d.ts.map +1 -1
  4. package/dist/engine.js +1204 -318
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -1
  8. package/dist/shaders/body.d.ts +2 -0
  9. package/dist/shaders/body.d.ts.map +1 -0
  10. package/dist/shaders/body.js +232 -0
  11. package/dist/shaders/classify.d.ts +4 -0
  12. package/dist/shaders/classify.d.ts.map +1 -0
  13. package/dist/shaders/classify.js +12 -0
  14. package/dist/shaders/cloth_rough.d.ts +2 -0
  15. package/dist/shaders/cloth_rough.d.ts.map +1 -0
  16. package/dist/shaders/cloth_rough.js +190 -0
  17. package/dist/shaders/cloth_smooth.d.ts +2 -0
  18. package/dist/shaders/cloth_smooth.d.ts.map +1 -0
  19. package/dist/shaders/cloth_smooth.js +186 -0
  20. package/dist/shaders/default.d.ts +2 -0
  21. package/dist/shaders/default.d.ts.map +1 -0
  22. package/dist/shaders/default.js +185 -0
  23. package/dist/shaders/dfg_lut.d.ts +3 -0
  24. package/dist/shaders/dfg_lut.d.ts.map +1 -0
  25. package/dist/shaders/dfg_lut.js +129 -0
  26. package/dist/shaders/eye.d.ts +2 -0
  27. package/dist/shaders/eye.d.ts.map +1 -0
  28. package/dist/shaders/eye.js +159 -0
  29. package/dist/shaders/face.d.ts +2 -0
  30. package/dist/shaders/face.d.ts.map +1 -0
  31. package/dist/shaders/face.js +235 -0
  32. package/dist/shaders/hair.d.ts +2 -0
  33. package/dist/shaders/hair.d.ts.map +1 -0
  34. package/dist/shaders/hair.js +196 -0
  35. package/dist/shaders/ltc_mag_lut.d.ts +3 -0
  36. package/dist/shaders/ltc_mag_lut.d.ts.map +1 -0
  37. package/dist/shaders/ltc_mag_lut.js +1033 -0
  38. package/dist/shaders/metal.d.ts +2 -0
  39. package/dist/shaders/metal.d.ts.map +1 -0
  40. package/dist/shaders/metal.js +187 -0
  41. package/dist/shaders/nodes.d.ts +2 -0
  42. package/dist/shaders/nodes.d.ts.map +1 -0
  43. package/dist/shaders/nodes.js +465 -0
  44. package/dist/shaders/stockings.d.ts +2 -0
  45. package/dist/shaders/stockings.d.ts.map +1 -0
  46. package/dist/shaders/stockings.js +244 -0
  47. package/package.json +1 -1
  48. package/src/engine.ts +1412 -385
  49. package/src/index.ts +12 -2
  50. package/src/shaders/body.ts +234 -0
  51. package/src/shaders/classify.ts +25 -0
  52. package/src/shaders/cloth_rough.ts +192 -0
  53. package/src/shaders/cloth_smooth.ts +188 -0
  54. package/src/shaders/default.ts +186 -0
  55. package/src/shaders/dfg_lut.ts +131 -0
  56. package/src/shaders/eye.ts +160 -0
  57. package/src/shaders/face.ts +237 -0
  58. package/src/shaders/hair.ts +198 -0
  59. package/src/shaders/ltc_mag_lut.ts +1035 -0
  60. package/src/shaders/metal.ts +189 -0
  61. package/src/shaders/nodes.ts +466 -0
  62. 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
- - Blinn-Phong shading, alpha blending, rim lighting, outlines, MSAA 4x
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
- ambientColor: new Vec3(0.88, 0.92, 0.99),
29
- cameraDistance: 31.5, // MMD units (1 unit = 8 cm)
30
- cameraTarget: new Vec3(0, 11.5, 0),
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
- ambientColor: Vec3,
165
- directionalLightIntensity: number,
166
- minSpecularIntensity: number,
167
- rimLightIntensity: number,
168
- cameraDistance: number,
169
- cameraTarget: Vec3,
170
- cameraFov: number,
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
- `shadowLightDirection` — direction of the shadow-only light, independent of the visible directional light. Default `(0.12, -1, 0.16)` casts a near-top-down shadow with a slight offset so extended limbs still project visible shadows.
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
- ambientColor?: Vec3;
13
- directionalLightIntensity?: number;
14
- minSpecularIntensity?: number;
15
- rimLightIntensity?: number;
16
- cameraDistance?: number;
17
- cameraTarget?: Vec3;
18
- cameraFov?: number;
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
- ambientColor: Vec3;
25
- directionalLightIntensity: number;
26
- minSpecularIntensity: number;
27
- rimLightIntensity: number;
28
- cameraDistance: number;
29
- cameraTarget: Vec3;
30
- cameraFov: number;
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 cameraDistance;
52
- private cameraTarget;
53
- private cameraFov;
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 ambientColor;
74
- private directionalLightIntensity;
75
- private minSpecularIntensity;
76
- private rimLightIntensity;
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
- private setAmbientColor;
141
- private addLight;
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 drawOpaque;
199
- private drawTransparent;
200
- private bindMainGroups;
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
@@ -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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"}