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.
Files changed (65) hide show
  1. package/dist/engine.d.ts +34 -0
  2. package/dist/engine.d.ts.map +1 -1
  3. package/dist/engine.js +258 -15
  4. package/dist/gpu-profile.d.ts +19 -0
  5. package/dist/gpu-profile.d.ts.map +1 -0
  6. package/dist/gpu-profile.js +120 -0
  7. package/dist/graph/compile.d.ts +34 -0
  8. package/dist/graph/compile.d.ts.map +1 -0
  9. package/dist/graph/compile.js +299 -0
  10. package/dist/graph/presets/body.d.ts +3 -0
  11. package/dist/graph/presets/body.d.ts.map +1 -0
  12. package/dist/graph/presets/body.js +100 -0
  13. package/dist/graph/presets/cloth_rough.d.ts +3 -0
  14. package/dist/graph/presets/cloth_rough.d.ts.map +1 -0
  15. package/dist/graph/presets/cloth_rough.js +61 -0
  16. package/dist/graph/presets/cloth_smooth.d.ts +3 -0
  17. package/dist/graph/presets/cloth_smooth.d.ts.map +1 -0
  18. package/dist/graph/presets/cloth_smooth.js +53 -0
  19. package/dist/graph/presets/default.d.ts +3 -0
  20. package/dist/graph/presets/default.d.ts.map +1 -0
  21. package/dist/graph/presets/default.js +20 -0
  22. package/dist/graph/presets/hair.d.ts +3 -0
  23. package/dist/graph/presets/hair.d.ts.map +1 -0
  24. package/dist/graph/presets/hair.js +79 -0
  25. package/dist/graph/presets/metal.d.ts +3 -0
  26. package/dist/graph/presets/metal.d.ts.map +1 -0
  27. package/dist/graph/presets/metal.js +58 -0
  28. package/dist/graph/presets/stockings.d.ts +3 -0
  29. package/dist/graph/presets/stockings.d.ts.map +1 -0
  30. package/dist/graph/presets/stockings.js +54 -0
  31. package/dist/graph/registry.d.ts +28 -0
  32. package/dist/graph/registry.d.ts.map +1 -0
  33. package/dist/graph/registry.js +322 -0
  34. package/dist/graph/schema.d.ts +66 -0
  35. package/dist/graph/schema.d.ts.map +1 -0
  36. package/dist/graph/schema.js +6 -0
  37. package/dist/graph/slots.d.ts +14 -0
  38. package/dist/graph/slots.d.ts.map +1 -0
  39. package/dist/graph/slots.js +123 -0
  40. package/dist/index.d.ts +11 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +9 -0
  43. package/dist/physics/profile.d.ts +18 -0
  44. package/dist/physics/profile.d.ts.map +1 -0
  45. package/dist/physics/profile.js +44 -0
  46. package/package.json +2 -1
  47. package/src/engine.ts +290 -15
  48. package/src/graph/compile.ts +342 -0
  49. package/src/graph/presets/body.ts +103 -0
  50. package/src/graph/presets/cloth_rough.ts +64 -0
  51. package/src/graph/presets/cloth_smooth.ts +56 -0
  52. package/src/graph/presets/default.ts +23 -0
  53. package/src/graph/presets/hair.ts +82 -0
  54. package/src/graph/presets/metal.ts +61 -0
  55. package/src/graph/presets/stockings.ts +57 -0
  56. package/src/graph/registry.ts +351 -0
  57. package/src/graph/schema.ts +60 -0
  58. package/src/graph/slots.ts +145 -0
  59. package/src/index.ts +25 -0
  60. package/dist/physics-debug.d.ts +0 -30
  61. package/dist/physics-debug.d.ts.map +0 -1
  62. package/dist/physics-debug.js +0 -526
  63. package/dist/shaders/passes/physics-debug.d.ts +0 -2
  64. package/dist/shaders/passes/physics-debug.d.ts.map +0 -1
  65. 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
@@ -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":"AACA,OAAO,EAAQ,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,KAAK,EAAiB,MAAM,SAAS,CAAA;AAI9C,OAAO,EAQL,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAA;AA0BvB,OAAO,EAAgB,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACnF,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAI5D,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,MAAM,GACN,MAAM,GACN,MAAM,GACN,KAAK,GACL,WAAW,GACX,OAAO,GACP,cAAc,GACd,aAAa,CAAA;AAOjB,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,aAAa,CAAA;AAEnE,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;AAmFzE,yFAAyF;AACzF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAA;IACX,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,OAAO,EAAE,SAAS,EAAE,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,KACZ,IAAI,CAAA;AAET,kHAAkH;AAClH,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,CAAA;IACxB,OAAO,CAAC,EAAE,IAAI,CAAA;CACf,CAAA;AAID,MAAM,MAAM,YAAY,GAAG;IACzB,8FAA8F;IAC9F,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yFAAyF;IACzF,SAAS,CAAC,EAAE,IAAI,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,wFAAwF;AACxF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,IAAI,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,YAQnC,CAAA;AAED,4HAA4H;AAC5H,MAAM,MAAM,oBAAoB,GAAG;IACjC,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;IAChB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,SAAS,GAAG,sBAAsB,CAAA;CACzC,CAAA;AAID,eAAO,MAAM,sBAAsB,EAAE,oBAIpC,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAA;AAElD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,aAAa,CAAA;IACnB,kGAAkG;IAClG,aAAa,EAAE,IAAI,CAAA;IACnB,gBAAgB,EAAE,IAAI,CAAA;IACtB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;CACxB;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;AAE/D,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAC7B,gFAAgF;IAChF,IAAI,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACpC,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B,qCAAqC;IACrC,WAAW,CAAC,EAAE,iBAAiB,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;CAKlC,CAAA;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf;AAwDD,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAE7C,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,kBAAkB,CAAmB;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,mBAAmB,CAAY;IACvC,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,GAAG,CAAqD;IAChE,OAAO,CAAC,YAAY,CAAkD;IACtE,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,oBAAoB,CAAoB;IAChD,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,kBAAkB,CAAoB;IAK9C,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,eAAe,CAAY;IAEnC,OAAO,CAAC,cAAc,CAA2C;IAGjE,OAAO,CAAC,gBAAgB,CAAoC;IAE5D,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,uBAAuB,CAA0B;IAGzD,OAAO,CAAC,sBAAsB,CAAa;IAC3C,OAAO,CAAC,oBAAoB,CAAoB;IAChD,OAAO,CAAC,2BAA2B,CAAqB;IACxD,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,gBAAgB,CAA2D;IACnF,OAAO,CAAC,oBAAoB,CAAC,CAAY;IACzC,OAAO,CAAC,iBAAiB,CAAC,CAAgB;IAC1C,OAAO,CAAC,qBAAqB,CAAoB;IACjD,OAAO,CAAC,2BAA2B,CAA0B;IAC7D,OAAO,CAAC,qBAAqB,CAAoB;IACjD,OAAO,CAAC,4BAA4B,CAAqB;IACzD,OAAO,CAAC,sBAAsB,CAAC,CAAc;IAC7C,OAAO,CAAC,0BAA0B,CAAY;IAC9C,OAAO,CAAC,2BAA2B,CAA0B;IAC7D,OAAO,CAAC,gBAAgB,CAAa;IAGrC,OAAO,CAAC,YAAY,CAA0E;IAC9F,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,mBAAmB,CAA0B;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAM;IAG/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAO;IAIhD,OAAO,CAAC,UAAU,CAAoD;IACtE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAO;IACjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAO;IAOtD,OAAO,CAAC,SAAS,CAcF;IACf,OAAO,CAAC,2BAA2B,CAAqB;IACxD,OAAO,CAAC,8BAA8B,CAAqB;IAC3D,OAAO,CAAC,8BAA8B,CAAqB;IAC3D,OAAO,CAAC,8BAA8B,CAAqB;IAC3D,OAAO,CAAC,iCAAiC,CAAqB;IAC9D,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,wBAAwB,CAAe;IAC/C,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAI;IAiB7C,OAAO,CAAC,SAAS,CAAkC;IACnD;0FACsF;IACtF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAI;IAC7C;;;;;;;gGAO4F;IAC5F,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;IACxE,OAAO,CAAC,sBAAsB,CAAa;IAC3C,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,oBAAoB,CAA0B;IACtD,OAAO,CAAC,uBAAuB,CAA0B;IAIzD,OAAO,CAAC,yBAAyB,CAAoB;IACrD,OAAO,CAAC,sBAAsB,CAAoB;IAClD,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,2BAA2B,CAAqB;IACxD,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,kBAAkB,CAAe;IACzC,OAAO,CAAC,sBAAsB,CAAY;IAE1C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsB;IAQ3D,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,sBAAsB,CAAY;IAC1C,OAAO,CAAC,0BAA0B,CAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsB;IAC3D,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAsB;IAC/D,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,uBAAuB,CAAoB;IACnD,OAAO,CAAC,qBAAqB,CAAoB;IACjD,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,8BAA8B,CAAqB;IAC3D,OAAO,CAAC,4BAA4B,CAAqB;IACzD,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,kBAAkB,CAAe;IACzC,OAAO,CAAC,yBAAyB,CAAqB;IACtD,OAAO,CAAC,uBAAuB,CAAqB;IACpD,2EAA2E;IAC3E,OAAO,CAAC,mBAAmB,CAA0B;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAI;IAG5C,OAAO,CAAC,kBAAkB,CAAC,CAAW;IACtC,OAAO,CAAC,iBAAiB,CAAC,CAAW;IACrC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,kBAAkB,CAAiB;IAC3C,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,aAAa,CAAiB;IAEtC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAO;IAC9C,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,mBAAmB,CAAY;IACvC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,qBAAqB,CAAC,CAAc;IAC5C,OAAO,CAAC,uBAAuB,CAAa;IAC5C,OAAO,CAAC,0BAA0B,CAAC,CAAW;IAC9C,OAAO,CAAC,cAAc,CAAwB;IAE9C,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAC,CAAmB;IACvC,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAEvC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,2BAA2B,CAAqB;IACxD,OAAO,CAAC,8BAA8B,CAAqB;IAC3D,OAAO,CAAC,8BAA8B,CAAqB;IAC3D,OAAO,CAAC,qBAAqB,CAAe;IAC5C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,WAAW,CAAwC;IAE3D,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,uBAAuB,CAAa;IAC5C,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,eAAe,CAAiC;IACxD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,mBAAmB,CAAI;IAG/B,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,cAAc,CAAO;IAE7B,OAAO,CAAC,YAAY,CAAO;IAG3B,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,kBAAkB,CAA0B;IAEpD,OAAO,CAAC,aAAa,CAAoB;IAGzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAM;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAC9C,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,kBAAkB,CAAI;IAC9B,OAAO,CAAC,mBAAmB,CAAI;IAC/B,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,KAAK,CAMZ;IACD,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,aAAa,CAAuB;gBAEhC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,aAAa;IAuB9D,qEAAqE;IACrE,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY;IAcxE,MAAM,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,oBAAoB;IAShG,uEAAuE;IACvE,eAAe,IAAI,YAAY;IAa/B,uBAAuB,IAAI,oBAAoB;IAK/C,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAUnE,OAAO,CAAC,0BAA0B;IAmBlC,wEAAwE;IACxE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAoBnD,OAAO,CAAC,kBAAkB;IAsBpB,IAAI;IAyCV,OAAO,CAAC,WAAW;IAiFnB,OAAO,CAAC,aAAa;IA+ErB,OAAO,CAAC,oBAAoB;IAiC5B,OAAO,CAAC,eAAe;IAs4BvB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,YAAY;IAmQpB,OAAO,CAAC,UAAU;IAgKlB,OAAO,CAAC,WAAW;IAmBnB,iFAAiF;IACjF,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI;IAC9B,gGAAgG;IAChG,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI;IAoB3E,mIAAmI;IACnI,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI;IAY5E,iBAAiB,IAAI,MAAM;IAG3B,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAGlC,cAAc,IAAI,MAAM;IAGxB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAG/B,aAAa,IAAI,MAAM;IAGvB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAK9B,OAAO,CAAC,aAAa;IAYrB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IASlB,qFAAqF;IACrF,OAAO,CAAC,QAAQ;IAgBhB,gGAAgG;IAChG,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAMrC,0FAA0F;IAC1F,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAUjC,QAAQ,IAAI,QAAQ,CAAC;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAGvD,MAAM,IAAI,QAAQ,CAAC;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,CAAC;IAItE,SAAS,CAAC,OAAO,CAAC,EAAE;QAClB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,IAAI,CAAA;QACnB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,eAAe,CAAC,EAAE,MAAM,CAAA;QACxB,aAAa,CAAC,EAAE,IAAI,CAAA;QACpB,aAAa,CAAC,EAAE,MAAM,CAAA;KACvB,GAAG,IAAI;IA4BR,OAAO,CAAC,iBAAiB;IAIzB,QAAQ,IAAI,WAAW;IAIvB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI;IAgBnC,cAAc;IAQd,OAAO;IA8BD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IACvC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IACrD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,KAAK,CAAC;IAyB3E,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAcxG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiB/B,aAAa,IAAI,MAAM,EAAE;IAIzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAIpC,qBAAqB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAe9D,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIhF,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAcxE,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAcvE,OAAO,CAAC,uBAAuB;IAa/B,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAOnF,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAOpE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAKnE,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKpC,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI3C,YAAY,IAAI,OAAO;IAIvB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIzC,iBAAiB,IAAI,OAAO;IAI5B,YAAY,IAAI,IAAI;IAWpB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,oBAAoB;YAgBd,kBAAkB;IAwHhC,OAAO,CAAC,cAAc;IAoEtB,OAAO,CAAC,oBAAoB;IAwE5B,OAAO,CAAC,2BAA2B;IA4DnC,OAAO,CAAC,kBAAkB,CAAO;IACjC,OAAO,CAAC,mBAAmB;YAeb,yBAAyB;IAiJvC,OAAO,CAAC,2BAA2B;IAyBnC,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,oBAAoB;YAId,4BAA4B;IAuC1C,OAAO,CAAC,eAAe;IA6CvB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,uBAAuB,CAI9B;IAED,OAAO,CAAC,iBAAiB,CA0BxB;IAED,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,qBAAqB;IAsC7B,OAAO,CAAC,eAAe;IA8DvB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,YAAY;IAqDpB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,oBAAoB,CAoG3B;IAED,OAAO,CAAC,oBAAoB,CA+C3B;IAED,OAAO,CAAC,kBAAkB,CAsBzB;IAED,OAAO,CAAC,cAAc;YA+CR,iBAAiB;IAkD/B,MAAM;IAiIN,OAAO,CAAC,kBAAkB;IAgB1B;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgD1F,qFAAqF;IACrF,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO;IAgBvG,sFAAsF;IACtF,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAK1C,OAAO,CAAC,kBAAkB;IAe1B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAqD1B,OAAO,CAAC,iBAAiB;IAiBzB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAoBrB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAepB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAiBtB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,WAAW;CA0CpB"}
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(() => this.handleResize());
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
- dc.preset = resolvePreset(dc.materialName, presets);
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 bindGroup = this.device.createBindGroup({
2673
- label: `${prefix}material: ${mat.name}`,
2674
- layout: this.mainPerMaterialBindGroupLayout,
2675
- entries: [
2676
- { binding: 0, resource: textureView },
2677
- { binding: 1, resource: { buffer: materialUniformBuffer } },
2678
- { binding: 2, resource: (toonTexture ?? this.fallbackMaterialTexture).createView() },
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
+ }