reze-engine 0.17.1 → 0.18.0
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/dist/engine.d.ts +34 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +258 -15
- package/dist/gpu-profile.d.ts +19 -0
- package/dist/gpu-profile.d.ts.map +1 -0
- package/dist/gpu-profile.js +120 -0
- package/dist/graph/compile.d.ts +34 -0
- package/dist/graph/compile.d.ts.map +1 -0
- package/dist/graph/compile.js +299 -0
- package/dist/graph/presets/body.d.ts +3 -0
- package/dist/graph/presets/body.d.ts.map +1 -0
- package/dist/graph/presets/body.js +100 -0
- package/dist/graph/presets/cloth_rough.d.ts +3 -0
- package/dist/graph/presets/cloth_rough.d.ts.map +1 -0
- package/dist/graph/presets/cloth_rough.js +61 -0
- package/dist/graph/presets/cloth_smooth.d.ts +3 -0
- package/dist/graph/presets/cloth_smooth.d.ts.map +1 -0
- package/dist/graph/presets/cloth_smooth.js +53 -0
- package/dist/graph/presets/default.d.ts +3 -0
- package/dist/graph/presets/default.d.ts.map +1 -0
- package/dist/graph/presets/default.js +20 -0
- package/dist/graph/presets/hair.d.ts +3 -0
- package/dist/graph/presets/hair.d.ts.map +1 -0
- package/dist/graph/presets/hair.js +79 -0
- package/dist/graph/presets/metal.d.ts +3 -0
- package/dist/graph/presets/metal.d.ts.map +1 -0
- package/dist/graph/presets/metal.js +58 -0
- package/dist/graph/presets/stockings.d.ts +3 -0
- package/dist/graph/presets/stockings.d.ts.map +1 -0
- package/dist/graph/presets/stockings.js +54 -0
- package/dist/graph/registry.d.ts +28 -0
- package/dist/graph/registry.d.ts.map +1 -0
- package/dist/graph/registry.js +322 -0
- package/dist/graph/schema.d.ts +66 -0
- package/dist/graph/schema.d.ts.map +1 -0
- package/dist/graph/schema.js +6 -0
- package/dist/graph/slots.d.ts +14 -0
- package/dist/graph/slots.d.ts.map +1 -0
- package/dist/graph/slots.js +123 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/physics/profile.d.ts +18 -0
- package/dist/physics/profile.d.ts.map +1 -0
- package/dist/physics/profile.js +44 -0
- package/package.json +2 -1
- package/src/engine.ts +290 -15
- package/src/graph/compile.ts +342 -0
- package/src/graph/presets/body.ts +103 -0
- package/src/graph/presets/cloth_rough.ts +64 -0
- package/src/graph/presets/cloth_smooth.ts +56 -0
- package/src/graph/presets/default.ts +23 -0
- package/src/graph/presets/hair.ts +82 -0
- package/src/graph/presets/metal.ts +61 -0
- package/src/graph/presets/stockings.ts +57 -0
- package/src/graph/registry.ts +351 -0
- package/src/graph/schema.ts +60 -0
- package/src/graph/slots.ts +145 -0
- package/src/index.ts +25 -0
- package/dist/physics-debug.d.ts +0 -30
- package/dist/physics-debug.d.ts.map +0 -1
- package/dist/physics-debug.js +0 -526
- package/dist/shaders/passes/physics-debug.d.ts +0 -2
- package/dist/shaders/passes/physics-debug.d.ts.map +0 -1
- package/dist/shaders/passes/physics-debug.js +0 -69
package/dist/engine.d.ts
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import { Quat, Vec3 } from "./math";
|
|
2
2
|
import { Model } from "./model";
|
|
3
3
|
import { type AssetReader } from "./asset-reader";
|
|
4
|
+
import { type CompileOptions, type StyleSlot } from "./graph/compile";
|
|
5
|
+
import type { Diagnostic, StyleGraph } from "./graph/schema";
|
|
4
6
|
export type MaterialPreset = "default" | "face" | "hair" | "body" | "eye" | "stockings" | "metal" | "cloth_smooth" | "cloth_rough";
|
|
5
7
|
export type ResolvedMaterialPreset = MaterialPreset | "mmd_classic";
|
|
6
8
|
export type MaterialPresetMap = Partial<Record<MaterialPreset, string[]>>;
|
|
9
|
+
/** Result of Engine.applyStyleGraph — compile/pipeline diagnostics + slider slot map. */
|
|
10
|
+
export type ApplyStyleResult = {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
diagnostics: Diagnostic[];
|
|
13
|
+
slotMap: StyleSlot[];
|
|
14
|
+
};
|
|
7
15
|
export type RaycastCallback = (modelName: string, material: string | null, bone: string | null, screenX: number, screenY: number) => void;
|
|
8
16
|
/** Select a folder (webkitdirectory) and pass FileList or File[]; pmxFile picks which .pmx when several exist. */
|
|
9
17
|
export type LoadModelFromFilesOptions = {
|
|
@@ -129,6 +137,7 @@ export declare class Engine {
|
|
|
129
137
|
private lightData;
|
|
130
138
|
private lightCount;
|
|
131
139
|
private resizeObserver;
|
|
140
|
+
private resizePending;
|
|
132
141
|
private depthTexture;
|
|
133
142
|
private modelPipeline;
|
|
134
143
|
private facePipeline;
|
|
@@ -141,6 +150,13 @@ export declare class Engine {
|
|
|
141
150
|
private hairOverEyesPipeline;
|
|
142
151
|
private stockingsPipeline;
|
|
143
152
|
private mmdClassicPipeline;
|
|
153
|
+
private styleBuffers;
|
|
154
|
+
private zeroStyleBuffer;
|
|
155
|
+
private styleOverrides;
|
|
156
|
+
private styleGenerations;
|
|
157
|
+
private mainPipelineLayout;
|
|
158
|
+
private sceneTargets;
|
|
159
|
+
private fullVertexBufferLayouts;
|
|
144
160
|
private defaultToonRampTexture;
|
|
145
161
|
private groundShadowPipeline;
|
|
146
162
|
private groundShadowBindGroupLayout;
|
|
@@ -369,6 +385,7 @@ export declare class Engine {
|
|
|
369
385
|
setSelectedMaterial(modelName: string | null, materialName: string | null): void;
|
|
370
386
|
setSelectedBone(modelName: string | null, boneName: string | null): void;
|
|
371
387
|
setMaterialPresets(modelName: string, presets: MaterialPresetMap): void;
|
|
388
|
+
private createMaterialBindGroup;
|
|
372
389
|
setMaterialVisible(modelName: string, materialName: string, visible: boolean): void;
|
|
373
390
|
toggleMaterialVisible(modelName: string, materialName: string): void;
|
|
374
391
|
isMaterialVisible(modelName: string, materialName: string): boolean;
|
|
@@ -415,6 +432,23 @@ export declare class Engine {
|
|
|
415
432
|
private resolvePickResult;
|
|
416
433
|
render(): void;
|
|
417
434
|
private drawInstanceShadow;
|
|
435
|
+
/**
|
|
436
|
+
* Compile a style graph and swap it onto its preset slot. Fallback-on-error: the
|
|
437
|
+
* slot's current pipeline keeps rendering unless compilation fully succeeds.
|
|
438
|
+
* Slider defaults are written to the slot's StyleUniforms buffer on success.
|
|
439
|
+
*/
|
|
440
|
+
applyStyleGraph(graph: StyleGraph, opts?: CompileOptions): Promise<ApplyStyleResult>;
|
|
441
|
+
/** Instant adjust-tier write: set one exposed slider on the slot's applied graph. */
|
|
442
|
+
setStyleParam(slot: MaterialPreset, paramId: string, value: number | [number, number, number]): boolean;
|
|
443
|
+
/** Remove an applied style graph — the slot returns to its built-in preset shader. */
|
|
444
|
+
resetStyleSlot(slot: MaterialPreset): void;
|
|
445
|
+
private writeStyleDefaults;
|
|
446
|
+
/**
|
|
447
|
+
* Slot pipeline states mirror createPipelines exactly — a compiled graph swaps the
|
|
448
|
+
* fragment shading of a slot, never its pass integration (stencil interplay, depth
|
|
449
|
+
* bias, cull mode stay slot-owned; see docs/graph-compiler-spec.md §6).
|
|
450
|
+
*/
|
|
451
|
+
private createSlotPipeline;
|
|
418
452
|
private pipelineForPreset;
|
|
419
453
|
/**
|
|
420
454
|
* Draw every material of a given type (`opaque` or `transparent`) using the main
|
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
|
@@ -25,6 +25,7 @@ import { BLOOM_BLIT_SHADER_WGSL, BLOOM_DOWNSAMPLE_SHADER_WGSL, BLOOM_UPSAMPLE_SH
|
|
|
25
25
|
import { COMPOSITE_SHADER_WGSL } from "./shaders/passes/composite";
|
|
26
26
|
import { PICK_SHADER_WGSL } from "./shaders/passes/pick";
|
|
27
27
|
import { MIPMAP_BLIT_SHADER_WGSL } from "./shaders/passes/mipmap";
|
|
28
|
+
import { compileGraph } from "./graph/compile";
|
|
28
29
|
// Substring hints mapping common PMX material names (JP/CN/EN) to presets,
|
|
29
30
|
// tried when a material isn't in the model's explicit MaterialPresetMap.
|
|
30
31
|
// Ordered: more specific families first (靴下 must hit stockings before 靴
|
|
@@ -86,6 +87,17 @@ function resolvePreset(materialName, map) {
|
|
|
86
87
|
}
|
|
87
88
|
return "mmd_classic";
|
|
88
89
|
}
|
|
90
|
+
// Map a WGSL compile-error line back to the graph node whose `let` produced it —
|
|
91
|
+
// the compiler tags every generated line with a trailing `// @node:<id>` marker.
|
|
92
|
+
function nodeIdForWgslLine(wgsl, lineNum) {
|
|
93
|
+
const lines = wgsl.split("\n");
|
|
94
|
+
for (let i = Math.min(lineNum - 1, lines.length - 1); i >= 0; i--) {
|
|
95
|
+
const m = lines[i].match(/\/\/ @node:([a-z0-9_]+)/);
|
|
96
|
+
if (m)
|
|
97
|
+
return m[1];
|
|
98
|
+
}
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
89
101
|
export const DEFAULT_BLOOM_OPTIONS = {
|
|
90
102
|
enabled: true,
|
|
91
103
|
threshold: 0.5,
|
|
@@ -120,6 +132,17 @@ export class Engine {
|
|
|
120
132
|
this.lightData = new Float32Array(64);
|
|
121
133
|
this.lightCount = 0;
|
|
122
134
|
this.resizeObserver = null;
|
|
135
|
+
this.resizePending = false;
|
|
136
|
+
// ── Style graph runtime (graph/ compiler output applied to preset slots) ──
|
|
137
|
+
// Per-slot 256 B StyleUniforms buffers (group(2) binding(4)). Created eagerly so
|
|
138
|
+
// material bind groups can reference them at model-load time regardless of whether
|
|
139
|
+
// a graph is ever applied; mmd_classic materials bind the shared zero buffer.
|
|
140
|
+
this.styleBuffers = new Map();
|
|
141
|
+
// Applied graphs: slot → swapped pipeline(s) + the slider→UBO map for setStyleParam.
|
|
142
|
+
this.styleOverrides = new Map();
|
|
143
|
+
// Per-slot generation counter — an async compile that finishes after a newer
|
|
144
|
+
// applyStyleGraph/resetStyleSlot call on the same slot is discarded (stale guard).
|
|
145
|
+
this.styleGenerations = new Map();
|
|
123
146
|
this.selectedMaterial = null;
|
|
124
147
|
// ─── Transform gizmo ───────────────────────────────────────────────
|
|
125
148
|
this.selectedBone = null;
|
|
@@ -835,6 +858,8 @@ export class Engine {
|
|
|
835
858
|
},
|
|
836
859
|
};
|
|
837
860
|
const sceneTargets = [standardBlend, maskBlend];
|
|
861
|
+
this.sceneTargets = sceneTargets;
|
|
862
|
+
this.fullVertexBufferLayouts = fullVertexBuffers;
|
|
838
863
|
const shaderModule = this.device.createShaderModule({
|
|
839
864
|
label: "default model shader",
|
|
840
865
|
code: DEFAULT_SHADER_WGSL,
|
|
@@ -910,8 +935,35 @@ export class Engine {
|
|
|
910
935
|
{ binding: 1, visibility: GPUShaderStage.FRAGMENT, buffer: { type: "uniform" } },
|
|
911
936
|
{ binding: 2, visibility: GPUShaderStage.FRAGMENT, texture: {} },
|
|
912
937
|
{ binding: 3, visibility: GPUShaderStage.FRAGMENT, texture: {} },
|
|
938
|
+
// StyleUniforms for compiled graph shaders (adjust-tier sliders). Hand-written
|
|
939
|
+
// presets simply don't declare it — a layout may carry bindings a shader ignores.
|
|
940
|
+
{ binding: 4, visibility: GPUShaderStage.FRAGMENT, buffer: { type: "uniform" } },
|
|
913
941
|
],
|
|
914
942
|
});
|
|
943
|
+
// Per-slot style buffers + shared zero buffer (mmd_classic / never-styled slots).
|
|
944
|
+
this.zeroStyleBuffer = this.device.createBuffer({
|
|
945
|
+
label: "style uniforms (zero)",
|
|
946
|
+
size: 256,
|
|
947
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
948
|
+
});
|
|
949
|
+
const ALL_PRESETS = [
|
|
950
|
+
"default",
|
|
951
|
+
"face",
|
|
952
|
+
"hair",
|
|
953
|
+
"body",
|
|
954
|
+
"eye",
|
|
955
|
+
"stockings",
|
|
956
|
+
"metal",
|
|
957
|
+
"cloth_smooth",
|
|
958
|
+
"cloth_rough",
|
|
959
|
+
];
|
|
960
|
+
for (const preset of ALL_PRESETS) {
|
|
961
|
+
this.styleBuffers.set(preset, this.device.createBuffer({
|
|
962
|
+
label: `style uniforms (${preset})`,
|
|
963
|
+
size: 256,
|
|
964
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
965
|
+
}));
|
|
966
|
+
}
|
|
915
967
|
const mainPipelineLayout = this.device.createPipelineLayout({
|
|
916
968
|
label: "main pipeline layout",
|
|
917
969
|
bindGroupLayouts: [
|
|
@@ -920,6 +972,7 @@ export class Engine {
|
|
|
920
972
|
this.mainPerMaterialBindGroupLayout,
|
|
921
973
|
],
|
|
922
974
|
});
|
|
975
|
+
this.mainPipelineLayout = mainPipelineLayout;
|
|
923
976
|
// perFrameBindGroup is created after shadow resources below
|
|
924
977
|
this.modelPipeline = this.createRenderPipeline({
|
|
925
978
|
label: "model pipeline",
|
|
@@ -1524,9 +1577,16 @@ export class Engine {
|
|
|
1524
1577
|
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
|
|
1525
1578
|
});
|
|
1526
1579
|
}
|
|
1527
|
-
// Step 3: Setup canvas resize handling
|
|
1580
|
+
// Step 3: Setup canvas resize handling.
|
|
1581
|
+
// The observer only flags the resize; render() applies it at the top of the next
|
|
1582
|
+
// frame. Resizing inside the RO callback (post-layout) clears the canvas buffer
|
|
1583
|
+
// after the frame's rAF draw already ran, so during continuous drags (resizable
|
|
1584
|
+
// panels) every paint showed a stale-aspect or cleared buffer — one frame behind,
|
|
1585
|
+
// reading as laggy/stretchy. Flag-and-apply keeps resize + redraw in one frame.
|
|
1528
1586
|
setupResize() {
|
|
1529
|
-
this.resizeObserver = new ResizeObserver(() =>
|
|
1587
|
+
this.resizeObserver = new ResizeObserver(() => {
|
|
1588
|
+
this.resizePending = true;
|
|
1589
|
+
});
|
|
1530
1590
|
this.resizeObserver.observe(this.canvas);
|
|
1531
1591
|
this.handleResize();
|
|
1532
1592
|
// Setup raycasting double-click handler for desktop
|
|
@@ -2129,6 +2189,13 @@ export class Engine {
|
|
|
2129
2189
|
this.resizeObserver.disconnect();
|
|
2130
2190
|
this.resizeObserver = null;
|
|
2131
2191
|
}
|
|
2192
|
+
// Style graph runtime: per-slot uniform buffers + swapped pipelines (pipelines
|
|
2193
|
+
// are GC'd; buffers need explicit destroy).
|
|
2194
|
+
this.styleOverrides.clear();
|
|
2195
|
+
for (const buf of this.styleBuffers.values())
|
|
2196
|
+
buf.destroy();
|
|
2197
|
+
this.styleBuffers.clear();
|
|
2198
|
+
this.zeroStyleBuffer?.destroy();
|
|
2132
2199
|
}
|
|
2133
2200
|
async loadModel(nameOrPath, pathOrOptions) {
|
|
2134
2201
|
if (pathOrOptions !== undefined && typeof pathOrOptions === "object" && "files" in pathOrOptions) {
|
|
@@ -2225,9 +2292,23 @@ export class Engine {
|
|
|
2225
2292
|
return;
|
|
2226
2293
|
inst.materialPresets = presets;
|
|
2227
2294
|
for (const dc of inst.drawCalls) {
|
|
2228
|
-
|
|
2295
|
+
const preset = resolvePreset(dc.materialName, presets);
|
|
2296
|
+
if (preset === dc.preset)
|
|
2297
|
+
continue;
|
|
2298
|
+
dc.preset = preset;
|
|
2299
|
+
// Rebind so binding(4) follows the new slot's style buffer.
|
|
2300
|
+
if (dc.baseBindGroupEntries)
|
|
2301
|
+
dc.bindGroup = this.createMaterialBindGroup(`material: ${dc.materialName}`, dc.baseBindGroupEntries, preset);
|
|
2229
2302
|
}
|
|
2230
2303
|
}
|
|
2304
|
+
createMaterialBindGroup(label, baseEntries, preset) {
|
|
2305
|
+
const styleBuffer = preset === "mmd_classic" ? this.zeroStyleBuffer : this.styleBuffers.get(preset);
|
|
2306
|
+
return this.device.createBindGroup({
|
|
2307
|
+
label,
|
|
2308
|
+
layout: this.mainPerMaterialBindGroupLayout,
|
|
2309
|
+
entries: [...baseEntries, { binding: 4, resource: { buffer: styleBuffer } }],
|
|
2310
|
+
});
|
|
2311
|
+
}
|
|
2231
2312
|
setMaterialVisible(modelName, materialName, visible) {
|
|
2232
2313
|
const inst = this.modelInstances.get(modelName);
|
|
2233
2314
|
if (!inst)
|
|
@@ -2668,19 +2749,16 @@ export class Engine {
|
|
|
2668
2749
|
}
|
|
2669
2750
|
const materialUniformBuffer = this.createMaterialUniformBuffer(prefix + mat.name, mat, sphereMode, headBoneIndex);
|
|
2670
2751
|
inst.gpuBuffers.push(materialUniformBuffer);
|
|
2752
|
+
const preset = resolvePreset(mat.name, inst.materialPresets);
|
|
2671
2753
|
const textureView = diffuseTexture.createView();
|
|
2672
|
-
const
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
{ binding: 3, resource: (sphereTexture ?? this.fallbackMaterialTexture).createView() },
|
|
2680
|
-
],
|
|
2681
|
-
});
|
|
2754
|
+
const baseBindGroupEntries = [
|
|
2755
|
+
{ binding: 0, resource: textureView },
|
|
2756
|
+
{ binding: 1, resource: { buffer: materialUniformBuffer } },
|
|
2757
|
+
{ binding: 2, resource: (toonTexture ?? this.fallbackMaterialTexture).createView() },
|
|
2758
|
+
{ binding: 3, resource: (sphereTexture ?? this.fallbackMaterialTexture).createView() },
|
|
2759
|
+
];
|
|
2760
|
+
const bindGroup = this.createMaterialBindGroup(`${prefix}material: ${mat.name}`, baseBindGroupEntries, preset);
|
|
2682
2761
|
const type = isTransparent ? "transparent" : "opaque";
|
|
2683
|
-
const preset = resolvePreset(mat.name, inst.materialPresets);
|
|
2684
2762
|
inst.drawCalls.push({
|
|
2685
2763
|
type,
|
|
2686
2764
|
count: indexCount,
|
|
@@ -2688,6 +2766,7 @@ export class Engine {
|
|
|
2688
2766
|
bindGroup,
|
|
2689
2767
|
materialName: mat.name,
|
|
2690
2768
|
preset,
|
|
2769
|
+
baseBindGroupEntries,
|
|
2691
2770
|
});
|
|
2692
2771
|
if ((mat.edgeFlag & 0x10) !== 0 && mat.edgeSize > 0) {
|
|
2693
2772
|
const materialUniformData = new Float32Array([
|
|
@@ -3198,6 +3277,10 @@ export class Engine {
|
|
|
3198
3277
|
render() {
|
|
3199
3278
|
if (!this.multisampleTexture || !this.camera || !this.device)
|
|
3200
3279
|
return;
|
|
3280
|
+
if (this.resizePending) {
|
|
3281
|
+
this.resizePending = false;
|
|
3282
|
+
this.handleResize();
|
|
3283
|
+
}
|
|
3201
3284
|
const currentTime = performance.now();
|
|
3202
3285
|
const deltaTime = this.lastFrameTime > 0 ? (currentTime - this.lastFrameTime) / 1000 : 0.016;
|
|
3203
3286
|
this.lastFrameTime = currentTime;
|
|
@@ -3318,7 +3401,167 @@ export class Engine {
|
|
|
3318
3401
|
sp.drawIndexed(draw.count, 1, draw.firstIndex, 0, 0);
|
|
3319
3402
|
}
|
|
3320
3403
|
}
|
|
3404
|
+
// ─── Style graph API ──────────────────────────────────────────────
|
|
3405
|
+
// Two-tier edit model: applyStyleGraph = topology tier (async compile + pipeline
|
|
3406
|
+
// swap, previous look keeps rendering until the new pipeline is ready or on any
|
|
3407
|
+
// error); setStyleParam = adjust tier (uniform write, instant, no pipeline touch).
|
|
3408
|
+
/**
|
|
3409
|
+
* Compile a style graph and swap it onto its preset slot. Fallback-on-error: the
|
|
3410
|
+
* slot's current pipeline keeps rendering unless compilation fully succeeds.
|
|
3411
|
+
* Slider defaults are written to the slot's StyleUniforms buffer on success.
|
|
3412
|
+
*/
|
|
3413
|
+
async applyStyleGraph(graph, opts) {
|
|
3414
|
+
const result = compileGraph(graph, opts);
|
|
3415
|
+
if (!result.ok)
|
|
3416
|
+
return { ok: false, diagnostics: result.diagnostics, slotMap: result.slotMap };
|
|
3417
|
+
const slot = graph.slot;
|
|
3418
|
+
const generation = (this.styleGenerations.get(slot) ?? 0) + 1;
|
|
3419
|
+
this.styleGenerations.set(slot, generation);
|
|
3420
|
+
this.device.pushErrorScope("validation");
|
|
3421
|
+
const module = this.device.createShaderModule({ label: `style graph: ${graph.name} (${slot})`, code: result.wgsl });
|
|
3422
|
+
const info = await module.getCompilationInfo();
|
|
3423
|
+
const scopeError = await this.device.popErrorScope();
|
|
3424
|
+
const diagnostics = [...result.diagnostics];
|
|
3425
|
+
for (const msg of info.messages) {
|
|
3426
|
+
if (msg.type !== "error")
|
|
3427
|
+
continue;
|
|
3428
|
+
diagnostics.push({
|
|
3429
|
+
severity: "error",
|
|
3430
|
+
nodeId: nodeIdForWgslLine(result.wgsl, msg.lineNum),
|
|
3431
|
+
message: `WGSL: ${msg.message}`,
|
|
3432
|
+
});
|
|
3433
|
+
}
|
|
3434
|
+
if (diagnostics.some((d) => d.severity === "error") || scopeError) {
|
|
3435
|
+
if (scopeError && !diagnostics.some((d) => d.severity === "error"))
|
|
3436
|
+
diagnostics.push({ severity: "error", message: `WGSL: ${scopeError.message}` });
|
|
3437
|
+
return { ok: false, diagnostics, slotMap: result.slotMap };
|
|
3438
|
+
}
|
|
3439
|
+
let pipeline;
|
|
3440
|
+
let overEyesPipeline;
|
|
3441
|
+
try {
|
|
3442
|
+
pipeline = await this.createSlotPipeline(slot, module, false);
|
|
3443
|
+
if (slot === "hair")
|
|
3444
|
+
overEyesPipeline = await this.createSlotPipeline(slot, module, true);
|
|
3445
|
+
}
|
|
3446
|
+
catch (e) {
|
|
3447
|
+
diagnostics.push({ severity: "error", message: `pipeline creation failed: ${e.message}` });
|
|
3448
|
+
return { ok: false, diagnostics, slotMap: result.slotMap };
|
|
3449
|
+
}
|
|
3450
|
+
// A newer apply/reset on this slot finished (or started) while we compiled.
|
|
3451
|
+
if (this.styleGenerations.get(slot) !== generation) {
|
|
3452
|
+
diagnostics.push({ severity: "warning", message: "superseded by a newer edit — result discarded" });
|
|
3453
|
+
return { ok: false, diagnostics, slotMap: result.slotMap };
|
|
3454
|
+
}
|
|
3455
|
+
this.styleOverrides.set(slot, { pipeline, overEyesPipeline, slotMap: result.slotMap });
|
|
3456
|
+
this.writeStyleDefaults(slot, graph, result.slotMap);
|
|
3457
|
+
return { ok: true, diagnostics, slotMap: result.slotMap };
|
|
3458
|
+
}
|
|
3459
|
+
/** Instant adjust-tier write: set one exposed slider on the slot's applied graph. */
|
|
3460
|
+
setStyleParam(slot, paramId, value) {
|
|
3461
|
+
const override = this.styleOverrides.get(slot);
|
|
3462
|
+
const styleSlot = override?.slotMap.find((s) => s.id === paramId);
|
|
3463
|
+
const buffer = this.styleBuffers.get(slot);
|
|
3464
|
+
if (!styleSlot || !buffer)
|
|
3465
|
+
return false;
|
|
3466
|
+
if (styleSlot.kind === "float") {
|
|
3467
|
+
if (typeof value !== "number")
|
|
3468
|
+
return false;
|
|
3469
|
+
const offset = styleSlot.vec4Index * 16 + ["x", "y", "z", "w"].indexOf(styleSlot.component) * 4;
|
|
3470
|
+
this.device.queue.writeBuffer(buffer, offset, new Float32Array([value]));
|
|
3471
|
+
}
|
|
3472
|
+
else {
|
|
3473
|
+
if (typeof value === "number")
|
|
3474
|
+
return false;
|
|
3475
|
+
this.device.queue.writeBuffer(buffer, styleSlot.vec4Index * 16, new Float32Array(value));
|
|
3476
|
+
}
|
|
3477
|
+
return true;
|
|
3478
|
+
}
|
|
3479
|
+
/** Remove an applied style graph — the slot returns to its built-in preset shader. */
|
|
3480
|
+
resetStyleSlot(slot) {
|
|
3481
|
+
this.styleGenerations.set(slot, (this.styleGenerations.get(slot) ?? 0) + 1);
|
|
3482
|
+
this.styleOverrides.delete(slot);
|
|
3483
|
+
}
|
|
3484
|
+
writeStyleDefaults(slot, graph, slotMap) {
|
|
3485
|
+
const data = new Float32Array(64); // 16 vec4f
|
|
3486
|
+
for (const styleSlot of slotMap) {
|
|
3487
|
+
const param = graph.params?.find((p) => p.id === styleSlot.id);
|
|
3488
|
+
if (!param)
|
|
3489
|
+
continue;
|
|
3490
|
+
const base = styleSlot.vec4Index * 4;
|
|
3491
|
+
if (styleSlot.kind === "float" && typeof param.default === "number") {
|
|
3492
|
+
data[base + ["x", "y", "z", "w"].indexOf(styleSlot.component)] = param.default;
|
|
3493
|
+
}
|
|
3494
|
+
else if (styleSlot.kind === "color" && typeof param.default !== "number") {
|
|
3495
|
+
data.set(param.default.slice(0, 3), base);
|
|
3496
|
+
}
|
|
3497
|
+
}
|
|
3498
|
+
this.device.queue.writeBuffer(this.styleBuffers.get(slot), 0, data);
|
|
3499
|
+
}
|
|
3500
|
+
/**
|
|
3501
|
+
* Slot pipeline states mirror createPipelines exactly — a compiled graph swaps the
|
|
3502
|
+
* fragment shading of a slot, never its pass integration (stencil interplay, depth
|
|
3503
|
+
* bias, cull mode stay slot-owned; see docs/graph-compiler-spec.md §6).
|
|
3504
|
+
*/
|
|
3505
|
+
createSlotPipeline(slot, module, overEyes) {
|
|
3506
|
+
const base = {
|
|
3507
|
+
label: `style ${slot}${overEyes ? " (over eyes)" : ""}`,
|
|
3508
|
+
layout: this.mainPipelineLayout,
|
|
3509
|
+
vertex: { module, buffers: this.fullVertexBufferLayouts },
|
|
3510
|
+
primitive: { cullMode: (slot === "eye" ? "front" : "none") },
|
|
3511
|
+
multisample: { count: Engine.MULTISAMPLE_COUNT },
|
|
3512
|
+
};
|
|
3513
|
+
const plainDepth = {
|
|
3514
|
+
format: "depth24plus-stencil8",
|
|
3515
|
+
depthWriteEnabled: true,
|
|
3516
|
+
depthCompare: "less-equal",
|
|
3517
|
+
};
|
|
3518
|
+
let depthStencil = plainDepth;
|
|
3519
|
+
let constants;
|
|
3520
|
+
if (slot === "hair" && !overEyes) {
|
|
3521
|
+
depthStencil = {
|
|
3522
|
+
...plainDepth,
|
|
3523
|
+
stencilFront: { compare: "not-equal", failOp: "keep", depthFailOp: "keep", passOp: "keep" },
|
|
3524
|
+
stencilBack: { compare: "not-equal", failOp: "keep", depthFailOp: "keep", passOp: "keep" },
|
|
3525
|
+
stencilReadMask: 0xff,
|
|
3526
|
+
stencilWriteMask: 0,
|
|
3527
|
+
};
|
|
3528
|
+
}
|
|
3529
|
+
else if (slot === "hair" && overEyes) {
|
|
3530
|
+
constants = { IS_OVER_EYES: 1 };
|
|
3531
|
+
depthStencil = {
|
|
3532
|
+
format: "depth24plus-stencil8",
|
|
3533
|
+
depthWriteEnabled: false,
|
|
3534
|
+
depthCompare: "less-equal",
|
|
3535
|
+
stencilFront: { compare: "equal", failOp: "keep", depthFailOp: "keep", passOp: "keep" },
|
|
3536
|
+
stencilBack: { compare: "equal", failOp: "keep", depthFailOp: "keep", passOp: "keep" },
|
|
3537
|
+
stencilReadMask: 0xff,
|
|
3538
|
+
stencilWriteMask: 0,
|
|
3539
|
+
};
|
|
3540
|
+
}
|
|
3541
|
+
else if (slot === "eye") {
|
|
3542
|
+
depthStencil = {
|
|
3543
|
+
...plainDepth,
|
|
3544
|
+
depthBias: -0.00005,
|
|
3545
|
+
depthBiasSlopeScale: 0.0,
|
|
3546
|
+
depthBiasClamp: 0.0,
|
|
3547
|
+
stencilFront: { compare: "always", failOp: "keep", depthFailOp: "keep", passOp: "replace" },
|
|
3548
|
+
stencilBack: { compare: "always", failOp: "keep", depthFailOp: "keep", passOp: "replace" },
|
|
3549
|
+
stencilReadMask: 0xff,
|
|
3550
|
+
stencilWriteMask: 0xff,
|
|
3551
|
+
};
|
|
3552
|
+
}
|
|
3553
|
+
return this.device.createRenderPipelineAsync({
|
|
3554
|
+
...base,
|
|
3555
|
+
fragment: { module, constants, targets: this.sceneTargets },
|
|
3556
|
+
depthStencil,
|
|
3557
|
+
});
|
|
3558
|
+
}
|
|
3321
3559
|
pipelineForPreset(preset) {
|
|
3560
|
+
// Applied style graph wins over the built-in preset shader (mmd_classic is never
|
|
3561
|
+
// in the override map — it's not a stylable slot).
|
|
3562
|
+
const override = this.styleOverrides.get(preset);
|
|
3563
|
+
if (override)
|
|
3564
|
+
return override.pipeline;
|
|
3322
3565
|
if (preset === "face")
|
|
3323
3566
|
return this.facePipeline;
|
|
3324
3567
|
if (preset === "hair")
|
|
@@ -3418,7 +3661,7 @@ export class Engine {
|
|
|
3418
3661
|
if (draw.type !== "opaque" || draw.preset !== "hair" || !this.shouldRenderDrawCall(inst, draw))
|
|
3419
3662
|
continue;
|
|
3420
3663
|
if (!bound) {
|
|
3421
|
-
pass.setPipeline(this.hairOverEyesPipeline);
|
|
3664
|
+
pass.setPipeline(this.styleOverrides.get("hair")?.overEyesPipeline ?? this.hairOverEyesPipeline);
|
|
3422
3665
|
pass.setBindGroup(0, this.perFrameBindGroup);
|
|
3423
3666
|
pass.setBindGroup(1, inst.mainPerInstanceBindGroup);
|
|
3424
3667
|
bound = true;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare class GpuTimestamp {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
readonly supported: boolean;
|
|
4
|
+
private device;
|
|
5
|
+
private querySet;
|
|
6
|
+
private resolveBuffer;
|
|
7
|
+
private readbackBuffer;
|
|
8
|
+
private nextSlot;
|
|
9
|
+
private frameLabels;
|
|
10
|
+
private inFlight;
|
|
11
|
+
private pendingLabels;
|
|
12
|
+
constructor(device: GPUDevice);
|
|
13
|
+
private ensureCreated;
|
|
14
|
+
beginFrame(): void;
|
|
15
|
+
wrap(desc: GPURenderPassDescriptor, label: string): GPURenderPassDescriptor;
|
|
16
|
+
endFrame(encoder: GPUCommandEncoder): void;
|
|
17
|
+
afterSubmit(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=gpu-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpu-profile.d.ts","sourceRoot":"","sources":["../src/gpu-profile.ts"],"names":[],"mappings":"AAoBA,qBAAa,YAAY;IACvB,OAAO,UAAQ;IACf,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAQ;IAKxB,OAAO,CAAC,aAAa,CAAwB;gBAEjC,MAAM,EAAE,SAAS;IAK7B,OAAO,CAAC,aAAa;IAiBrB,UAAU,IAAI,IAAI;IAWlB,IAAI,CAAC,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,MAAM,GAAG,uBAAuB;IAqB3E,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAW1C,WAAW,IAAI,IAAI;CAwBpB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// WebGPU timestamp-query profiling. Records pass durations into the same
|
|
2
|
+
// profiler module as CPU phases (so the snapshot table mixes both with a
|
|
3
|
+
// "gpu." prefix). Read-only — no effect on rendering output.
|
|
4
|
+
//
|
|
5
|
+
// Pattern (per spec):
|
|
6
|
+
// 1. Each render pass declares timestampWrites { begin, end } slot indices.
|
|
7
|
+
// 2. After all passes, encoder.resolveQuerySet writes uint64 ns timestamps
|
|
8
|
+
// into a QUERY_RESOLVE buffer.
|
|
9
|
+
// 3. We copy the resolve buffer into a MAP_READ readback buffer.
|
|
10
|
+
// 4. Submit. After the GPU finishes, mapAsync resolves; we read durations
|
|
11
|
+
// and record them.
|
|
12
|
+
//
|
|
13
|
+
// One readback buffer with an in-flight gate: if mapAsync hasn't resolved
|
|
14
|
+
// from a previous frame, we skip the copy this frame (no contention, just
|
|
15
|
+
// one frame of dropped sampling).
|
|
16
|
+
import { profiler } from "./physics/profile";
|
|
17
|
+
const MAX_PASSES_PER_FRAME = 64;
|
|
18
|
+
export class GpuTimestamp {
|
|
19
|
+
constructor(device) {
|
|
20
|
+
this.enabled = false;
|
|
21
|
+
this.querySet = null;
|
|
22
|
+
this.resolveBuffer = null;
|
|
23
|
+
this.readbackBuffer = null;
|
|
24
|
+
this.nextSlot = 0;
|
|
25
|
+
this.frameLabels = [];
|
|
26
|
+
this.inFlight = false;
|
|
27
|
+
// Set inside endFrame() when a copy was queued this frame; consumed by
|
|
28
|
+
// afterSubmit() to kick mapAsync. mapAsync must run AFTER queue.submit —
|
|
29
|
+
// calling it before submit puts the buffer into "mapping pending" state,
|
|
30
|
+
// which makes the copy in the encoder illegal.
|
|
31
|
+
this.pendingLabels = null;
|
|
32
|
+
this.device = device;
|
|
33
|
+
this.supported = device.features.has("timestamp-query");
|
|
34
|
+
}
|
|
35
|
+
ensureCreated() {
|
|
36
|
+
if (this.querySet || !this.supported)
|
|
37
|
+
return;
|
|
38
|
+
const slots = MAX_PASSES_PER_FRAME * 2;
|
|
39
|
+
this.querySet = this.device.createQuerySet({ type: "timestamp", count: slots });
|
|
40
|
+
this.resolveBuffer = this.device.createBuffer({
|
|
41
|
+
label: "gpu-timestamp-resolve",
|
|
42
|
+
size: slots * 8,
|
|
43
|
+
usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC,
|
|
44
|
+
});
|
|
45
|
+
this.readbackBuffer = this.device.createBuffer({
|
|
46
|
+
label: "gpu-timestamp-readback",
|
|
47
|
+
size: slots * 8,
|
|
48
|
+
usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// Called once at the top of each render() before any pass wrap.
|
|
52
|
+
beginFrame() {
|
|
53
|
+
if (!this.enabled || !this.supported)
|
|
54
|
+
return;
|
|
55
|
+
this.ensureCreated();
|
|
56
|
+
this.nextSlot = 0;
|
|
57
|
+
this.frameLabels = [];
|
|
58
|
+
}
|
|
59
|
+
// Wrap a render-pass descriptor with timestampWrites for `label`. If
|
|
60
|
+
// profiling is off / unsupported / out of slots, returns desc unchanged.
|
|
61
|
+
// The same label called multiple times (e.g. each bloom mip) is fine —
|
|
62
|
+
// the profiler accumulates by label.
|
|
63
|
+
wrap(desc, label) {
|
|
64
|
+
if (!this.enabled || !this.querySet)
|
|
65
|
+
return desc;
|
|
66
|
+
if (this.nextSlot + 2 > MAX_PASSES_PER_FRAME * 2)
|
|
67
|
+
return desc;
|
|
68
|
+
const begin = this.nextSlot;
|
|
69
|
+
const end = this.nextSlot + 1;
|
|
70
|
+
this.nextSlot += 2;
|
|
71
|
+
this.frameLabels.push(label);
|
|
72
|
+
return {
|
|
73
|
+
...desc,
|
|
74
|
+
timestampWrites: {
|
|
75
|
+
querySet: this.querySet,
|
|
76
|
+
beginningOfPassWriteIndex: begin,
|
|
77
|
+
endOfPassWriteIndex: end,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Call on the encoder after all passes, BEFORE encoder.finish(). Adds
|
|
82
|
+
// resolveQuerySet + copyBufferToBuffer commands. mapAsync is deferred to
|
|
83
|
+
// afterSubmit() — calling it before submit transitions the readback buffer
|
|
84
|
+
// into "mapping pending" state, which makes the queued copy illegal.
|
|
85
|
+
endFrame(encoder) {
|
|
86
|
+
if (!this.enabled || !this.querySet || this.frameLabels.length === 0)
|
|
87
|
+
return;
|
|
88
|
+
const count = this.frameLabels.length * 2;
|
|
89
|
+
encoder.resolveQuerySet(this.querySet, 0, count, this.resolveBuffer, 0);
|
|
90
|
+
if (this.inFlight)
|
|
91
|
+
return;
|
|
92
|
+
encoder.copyBufferToBuffer(this.resolveBuffer, 0, this.readbackBuffer, 0, count * 8);
|
|
93
|
+
this.pendingLabels = this.frameLabels.slice();
|
|
94
|
+
}
|
|
95
|
+
// Call AFTER device.queue.submit(). Kicks mapAsync if a copy was queued
|
|
96
|
+
// this frame; the .then() reads durations and unmaps.
|
|
97
|
+
afterSubmit() {
|
|
98
|
+
const labels = this.pendingLabels;
|
|
99
|
+
if (!labels)
|
|
100
|
+
return;
|
|
101
|
+
this.pendingLabels = null;
|
|
102
|
+
this.inFlight = true;
|
|
103
|
+
const readback = this.readbackBuffer;
|
|
104
|
+
void readback.mapAsync(GPUMapMode.READ).then(() => {
|
|
105
|
+
const arr = new BigInt64Array(readback.getMappedRange());
|
|
106
|
+
for (let i = 0; i < labels.length; i++) {
|
|
107
|
+
const start = arr[i * 2];
|
|
108
|
+
const end = arr[i * 2 + 1];
|
|
109
|
+
// Per spec, timestamps are nanoseconds.
|
|
110
|
+
const ms = Number(end - start) / 1e6;
|
|
111
|
+
if (ms >= 0 && ms < 1000)
|
|
112
|
+
profiler.record("gpu." + labels[i], ms);
|
|
113
|
+
}
|
|
114
|
+
readback.unmap();
|
|
115
|
+
this.inFlight = false;
|
|
116
|
+
}, () => {
|
|
117
|
+
this.inFlight = false;
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|