reze-engine 0.15.1 → 0.16.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 (65) hide show
  1. package/dist/camera.d.ts +2 -0
  2. package/dist/camera.d.ts.map +1 -1
  3. package/dist/camera.js +8 -3
  4. package/dist/engine.d.ts +19 -4
  5. package/dist/engine.d.ts.map +1 -1
  6. package/dist/engine.js +294 -27
  7. package/dist/ik-solver.d.ts.map +1 -1
  8. package/dist/ik-solver.js +13 -7
  9. package/dist/math.d.ts +2 -0
  10. package/dist/math.d.ts.map +1 -1
  11. package/dist/math.js +65 -46
  12. package/dist/model.d.ts +28 -1
  13. package/dist/model.d.ts.map +1 -1
  14. package/dist/model.js +259 -75
  15. package/dist/physics/physics.d.ts +3 -0
  16. package/dist/physics/physics.d.ts.map +1 -1
  17. package/dist/physics/physics.js +55 -4
  18. package/dist/pmx-loader.d.ts.map +1 -1
  19. package/dist/pmx-loader.js +28 -43
  20. package/dist/shaders/materials/body.d.ts +1 -1
  21. package/dist/shaders/materials/body.d.ts.map +1 -1
  22. package/dist/shaders/materials/body.js +3 -1
  23. package/dist/shaders/materials/cloth_rough.d.ts +1 -1
  24. package/dist/shaders/materials/cloth_rough.d.ts.map +1 -1
  25. package/dist/shaders/materials/cloth_rough.js +3 -1
  26. package/dist/shaders/materials/cloth_smooth.d.ts +1 -1
  27. package/dist/shaders/materials/cloth_smooth.d.ts.map +1 -1
  28. package/dist/shaders/materials/common.d.ts +2 -2
  29. package/dist/shaders/materials/common.d.ts.map +1 -1
  30. package/dist/shaders/materials/common.js +8 -0
  31. package/dist/shaders/materials/default.d.ts +1 -1
  32. package/dist/shaders/materials/default.d.ts.map +1 -1
  33. package/dist/shaders/materials/eye.d.ts +1 -1
  34. package/dist/shaders/materials/eye.d.ts.map +1 -1
  35. package/dist/shaders/materials/face.d.ts +1 -1
  36. package/dist/shaders/materials/face.d.ts.map +1 -1
  37. package/dist/shaders/materials/face.js +4 -1
  38. package/dist/shaders/materials/hair.d.ts +1 -1
  39. package/dist/shaders/materials/hair.d.ts.map +1 -1
  40. package/dist/shaders/materials/metal.d.ts +1 -1
  41. package/dist/shaders/materials/metal.d.ts.map +1 -1
  42. package/dist/shaders/materials/stockings.d.ts +1 -1
  43. package/dist/shaders/materials/stockings.d.ts.map +1 -1
  44. package/dist/shaders/materials/stockings.js +13 -9
  45. package/dist/shaders/passes/composite.d.ts +1 -1
  46. package/dist/shaders/passes/composite.d.ts.map +1 -1
  47. package/dist/shaders/passes/composite.js +18 -12
  48. package/dist/shaders/passes/morph.d.ts +2 -0
  49. package/dist/shaders/passes/morph.d.ts.map +1 -0
  50. package/dist/shaders/passes/morph.js +49 -0
  51. package/package.json +1 -1
  52. package/src/camera.ts +9 -3
  53. package/src/engine.ts +336 -29
  54. package/src/ik-solver.ts +14 -7
  55. package/src/math.ts +41 -51
  56. package/src/model.ts +288 -91
  57. package/src/physics/physics.ts +56 -13
  58. package/src/pmx-loader.ts +26 -47
  59. package/src/shaders/materials/body.ts +3 -1
  60. package/src/shaders/materials/cloth_rough.ts +3 -1
  61. package/src/shaders/materials/common.ts +8 -0
  62. package/src/shaders/materials/face.ts +4 -1
  63. package/src/shaders/materials/stockings.ts +13 -9
  64. package/src/shaders/passes/composite.ts +18 -12
  65. package/src/shaders/passes/morph.ts +50 -0
package/dist/camera.d.ts CHANGED
@@ -27,6 +27,8 @@ export declare class Camera {
27
27
  maxZ: number;
28
28
  lowerBetaLimit: number;
29
29
  upperBetaLimit: number;
30
+ private _viewMat;
31
+ private _projMat;
30
32
  constructor(alpha: number, beta: number, radius: number, target: Vec3, fov?: number);
31
33
  getPosition(): Vec3;
32
34
  getViewMatrix(): Mat4;
@@ -1 +1 @@
1
- {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAMnC,qBAAa,MAAM;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,IAAI,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAI;IAClB,IAAI,EAAE,MAAM,CAAO;IACnB,GAAG,EAAE,MAAM,CAAU;IAGrB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,oBAAoB,CAAY;IAGxC,kBAAkB,EAAE,MAAM,CAAQ;IAClC,cAAc,EAAE,MAAM,CAAS;IAC/B,cAAc,EAAE,MAAM,CAAO;IAC7B,cAAc,EAAE,MAAM,CAAO;IAC7B,IAAI,EAAE,MAAM,CAAO;IACnB,IAAI,EAAE,MAAM,CAAU;IACtB,cAAc,EAAE,MAAM,CAAQ;IAC9B,cAAc,EAAE,MAAM,CAAkB;gBAE5B,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAE,MAAoB;IAmBhG,WAAW,IAAI,IAAI;IAQnB,aAAa,IAAI,IAAI;IAQrB,OAAO,CAAC,gBAAgB;IA0CxB,OAAO,CAAC,SAAS;IAiBjB,kFAAkF;IAClF,OAAO,CAAC,mBAAmB;IAK3B,mBAAmB,IAAI,IAAI;IAK3B,aAAa,CAAC,MAAM,EAAE,iBAAiB;IAiBvC,aAAa;IAkBb,cAAc,CAAC,MAAM,EAAE,OAAO;IAS9B,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IA8BpB,OAAO,CAAC,WAAW;IAiFnB,OAAO,CAAC,UAAU;CA+BnB"}
1
+ {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAMnC,qBAAa,MAAM;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,IAAI,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAI;IAClB,IAAI,EAAE,MAAM,CAAO;IACnB,GAAG,EAAE,MAAM,CAAU;IAGrB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,oBAAoB,CAAY;IAGxC,kBAAkB,EAAE,MAAM,CAAQ;IAClC,cAAc,EAAE,MAAM,CAAS;IAC/B,cAAc,EAAE,MAAM,CAAO;IAC7B,cAAc,EAAE,MAAM,CAAO;IAC7B,IAAI,EAAE,MAAM,CAAO;IACnB,IAAI,EAAE,MAAM,CAAU;IACtB,cAAc,EAAE,MAAM,CAAQ;IAC9B,cAAc,EAAE,MAAM,CAAkB;IAGxC,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,QAAQ,CAAiC;gBAErC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAE,MAAoB;IAmBhG,WAAW,IAAI,IAAI;IAQnB,aAAa,IAAI,IAAI;IASrB,OAAO,CAAC,gBAAgB;IA0CxB,OAAO,CAAC,SAAS;IAiBjB,kFAAkF;IAClF,OAAO,CAAC,mBAAmB;IAK3B,mBAAmB,IAAI,IAAI;IAM3B,aAAa,CAAC,MAAM,EAAE,iBAAiB;IAiBvC,aAAa;IAkBb,cAAc,CAAC,MAAM,EAAE,OAAO;IAS9B,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IA8BpB,OAAO,CAAC,WAAW;IAiFnB,OAAO,CAAC,UAAU;CA+BnB"}
package/dist/camera.js CHANGED
@@ -28,6 +28,9 @@ export class Camera {
28
28
  this.maxZ = FAR_CAP;
29
29
  this.lowerBetaLimit = 0.001;
30
30
  this.upperBetaLimit = Math.PI - 0.001;
31
+ // Reused each frame so getViewMatrix/getProjectionMatrix don't allocate a Mat4 per call.
32
+ this._viewMat = new Mat4(new Float32Array(16));
33
+ this._projMat = new Mat4(new Float32Array(16));
31
34
  this.alpha = alpha;
32
35
  this.beta = beta;
33
36
  this.radius = radius;
@@ -53,8 +56,9 @@ export class Camera {
53
56
  }
54
57
  getViewMatrix() {
55
58
  const eye = this.getPosition();
56
- const up = new Vec3(0, 1, 0);
57
- return Mat4.lookAt(eye, this.target, up);
59
+ const t = this.target;
60
+ Mat4.lookAtInto(this._viewMat.values, eye.x, eye.y, eye.z, t.x, t.y, t.z, 0, 1, 0);
61
+ return this._viewMat;
58
62
  }
59
63
  // Get camera's right and up vectors for panning
60
64
  // Uses a more robust calculation similar to BabylonJS
@@ -114,7 +118,8 @@ export class Camera {
114
118
  }
115
119
  getProjectionMatrix() {
116
120
  this.updateFarFromRadius();
117
- return Mat4.perspective(this.fov, this.aspect, this.near, this.far);
121
+ Mat4.perspectiveInto(this._projMat.values, this.fov, this.aspect, this.near, this.far);
122
+ return this._projMat;
118
123
  }
119
124
  attachControl(canvas) {
120
125
  this.canvas = canvas;
package/dist/engine.d.ts CHANGED
@@ -107,6 +107,9 @@ export declare const DEFAULT_ENGINE_OPTIONS: {
107
107
  export interface EngineStats {
108
108
  fps: number;
109
109
  frameTime: number;
110
+ frameTimeMax: number;
111
+ fps1PercentLow: number;
112
+ jitter: number;
110
113
  }
111
114
  export declare class Engine {
112
115
  private static instance;
@@ -195,6 +198,8 @@ export declare class Engine {
195
198
  private compositePassDescriptor;
196
199
  private compositePipelineIdentity;
197
200
  private compositePipelineGamma;
201
+ private morphComputePipeline;
202
+ private morphComputeBindGroupLayout;
198
203
  private compositeBindGroupLayout;
199
204
  private compositeBindGroup;
200
205
  private compositeUniformBuffer;
@@ -228,6 +233,9 @@ export declare class Engine {
228
233
  private shadowMapDepthView;
229
234
  private brdfLutTexture;
230
235
  private brdfLutView;
236
+ private filmicLutTexture;
237
+ private filmicLutView;
238
+ private static readonly FILMIC_LUT_WIDTH;
231
239
  private static readonly SHADOW_MAP_SIZE;
232
240
  private shadowDepthPipeline;
233
241
  private shadowLightVPBuffer;
@@ -258,14 +266,17 @@ export declare class Engine {
258
266
  private _nextDefaultModelId;
259
267
  private ikEnabled;
260
268
  private physicsEnabled;
269
+ private useGpuMorphs;
261
270
  private cameraTargetModel;
262
271
  private cameraTargetBoneName;
263
272
  private cameraTargetOffset;
264
- private lastFpsUpdate;
265
- private framesSinceLastUpdate;
266
273
  private lastFrameTime;
267
- private frameTimeSum;
268
- private frameTimeCount;
274
+ private static readonly STATS_WINDOW;
275
+ private static readonly STATS_REFRESH_MS;
276
+ private frameIntervals;
277
+ private frameIntervalWrite;
278
+ private frameIntervalFilled;
279
+ private lastStatsCompute;
269
280
  private stats;
270
281
  private animationFrameId;
271
282
  private renderLoopCallback;
@@ -285,6 +296,7 @@ export declare class Engine {
285
296
  private writeBloomUniforms;
286
297
  init(): Promise<void>;
287
298
  private bakeBrdfLut;
299
+ private bakeFilmicLut;
288
300
  private createRenderPipeline;
289
301
  private createPipelines;
290
302
  private setupResize;
@@ -358,6 +370,7 @@ export declare class Engine {
358
370
  toggleMaterialVisible(modelName: string, materialName: string): void;
359
371
  isMaterialVisible(modelName: string, materialName: string): boolean;
360
372
  setIKEnabled(enabled: boolean): void;
373
+ setGpuMorphsEnabled(enabled: boolean): void;
361
374
  getIKEnabled(): boolean;
362
375
  setPhysicsEnabled(enabled: boolean): void;
363
376
  getPhysicsEnabled(): boolean;
@@ -365,7 +378,9 @@ export declare class Engine {
365
378
  private forEachInstance;
366
379
  private updateInstances;
367
380
  private updateVertexBuffer;
381
+ private dispatchMorphCompute;
368
382
  private setupModelInstance;
383
+ private createGpuMorph;
369
384
  private createGroundGeometry;
370
385
  private createShadowGroundResources;
371
386
  private shadowLightVPDirty;
@@ -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
@@ -1,5 +1,6 @@
1
1
  import { Camera } from "./camera";
2
2
  import { Mat4, Quat, Vec3 } from "./math";
3
+ import { MORPH_COMPUTE_WGSL } from "./shaders/passes/morph";
3
4
  import { PmxLoader } from "./pmx-loader";
4
5
  import { RezePhysics } from "./physics";
5
6
  import { createFetchAssetReader, createFileMapAssetReader, deriveBasePathFromPmxPath, fileListToMap, findFirstPmxFileInList, joinAssetPath, normalizeAssetPath, } from "./asset-reader";
@@ -116,18 +117,23 @@ export class Engine {
116
117
  // IK and physics enabled at engine level (same for all models)
117
118
  this.ikEnabled = true;
118
119
  this.physicsEnabled = true;
120
+ // GPU vertex-morph path. Set false BEFORE loadModel to fall back to the CPU path (A/B).
121
+ this.useGpuMorphs = true;
119
122
  // Camera target binding (Babylon/Three style: camera follows model)
120
123
  this.cameraTargetModel = null;
121
124
  this.cameraTargetBoneName = "全ての親";
122
125
  this.cameraTargetOffset = new Vec3(0, 0, 0);
123
- this.lastFpsUpdate = performance.now();
124
- this.framesSinceLastUpdate = 0;
125
126
  this.lastFrameTime = performance.now();
126
- this.frameTimeSum = 0;
127
- this.frameTimeCount = 0;
127
+ this.frameIntervals = new Float32Array(Engine.STATS_WINDOW);
128
+ this.frameIntervalWrite = 0;
129
+ this.frameIntervalFilled = 0;
130
+ this.lastStatsCompute = performance.now();
128
131
  this.stats = {
129
132
  fps: 0,
130
133
  frameTime: 0,
134
+ frameTimeMax: 0,
135
+ fps1PercentLow: 0,
136
+ jitter: 0,
131
137
  };
132
138
  this.animationFrameId = null;
133
139
  this.renderLoopCallback = null;
@@ -571,6 +577,87 @@ export class Engine {
571
577
  this.device.queue.submit([enc.finish()]);
572
578
  ltcTemp.destroy();
573
579
  }
580
+ // Bake the Blender 3.6 Filmic MHC tone curve into a WIDTH×1 r16float LUT sampled by the
581
+ // composite pass. The 14 anchors are the same as the old inline array; we fit a monotone
582
+ // cubic (Fritsch–Carlson) through them so the curve is C1-continuous (no Mach banding in
583
+ // smooth gradients) while still passing through every anchor (look preserved) and staying
584
+ // monotone (no tonemap overshoot/ringing). Domain is uniform in log2 space: anchor k sits
585
+ // at t=k, k=0..13 (t = log2(linear)+10). See composite.ts::filmic for the sampling map.
586
+ bakeFilmicLut() {
587
+ const anchors = [
588
+ 0.0028, 0.0068, 0.0151, 0.0313, 0.061, 0.112, 0.192, 0.306, 0.459, 0.631, 0.82, 0.907, 0.962, 0.989,
589
+ ];
590
+ const n = anchors.length;
591
+ // Secant slopes (unit spacing, so d_k = y_{k+1} - y_k).
592
+ const d = new Array(n - 1);
593
+ for (let k = 0; k < n - 1; k++)
594
+ d[k] = anchors[k + 1] - anchors[k];
595
+ // Endpoint + interior tangents.
596
+ const m = new Array(n);
597
+ m[0] = d[0];
598
+ m[n - 1] = d[n - 2];
599
+ for (let k = 1; k < n - 1; k++)
600
+ m[k] = (d[k - 1] + d[k]) * 0.5;
601
+ // Fritsch–Carlson monotonicity clamp.
602
+ for (let k = 0; k < n - 1; k++) {
603
+ if (d[k] === 0) {
604
+ m[k] = 0;
605
+ m[k + 1] = 0;
606
+ continue;
607
+ }
608
+ const a = m[k] / d[k];
609
+ const b = m[k + 1] / d[k];
610
+ const s = a * a + b * b;
611
+ if (s > 9) {
612
+ const tau = 3 / Math.sqrt(s);
613
+ m[k] = tau * a * d[k];
614
+ m[k + 1] = tau * b * d[k];
615
+ }
616
+ }
617
+ const W = Engine.FILMIC_LUT_WIDTH;
618
+ const values = new Float32Array(W);
619
+ for (let j = 0; j < W; j++) {
620
+ const t = ((n - 1) * j) / (W - 1); // t ∈ [0, n-1]
621
+ const k = Math.min(Math.floor(t), n - 2);
622
+ const s = t - k; // local param in [0,1], unit-spaced segment
623
+ const s2 = s * s;
624
+ const s3 = s2 * s;
625
+ // Hermite basis (h=1).
626
+ const h00 = 2 * s3 - 3 * s2 + 1;
627
+ const h10 = s3 - 2 * s2 + s;
628
+ const h01 = -2 * s3 + 3 * s2;
629
+ const h11 = s3 - s2;
630
+ values[j] = h00 * anchors[k] + h10 * m[k] + h01 * anchors[k + 1] + h11 * m[k + 1];
631
+ }
632
+ // f32 → f16 bits (same conversion as bakeBrdfLut).
633
+ const half = new Uint16Array(W);
634
+ const f32 = new Float32Array(1);
635
+ const u32 = new Uint32Array(f32.buffer);
636
+ for (let j = 0; j < W; j++) {
637
+ f32[0] = values[j];
638
+ const x = u32[0];
639
+ const sign = (x >>> 16) & 0x8000;
640
+ const exp = ((x >>> 23) & 0xff) - 127 + 15;
641
+ const mant = x & 0x7fffff;
642
+ if (exp <= 0) {
643
+ half[j] = sign;
644
+ }
645
+ else if (exp >= 31) {
646
+ half[j] = sign | 0x7c00;
647
+ }
648
+ else {
649
+ half[j] = sign | (exp << 10) | (mant >>> 13);
650
+ }
651
+ }
652
+ this.filmicLutTexture = this.device.createTexture({
653
+ label: "Filmic tone LUT",
654
+ size: [W, 1],
655
+ format: "r16float",
656
+ usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
657
+ });
658
+ this.filmicLutView = this.filmicLutTexture.createView();
659
+ this.device.queue.writeTexture({ texture: this.filmicLutTexture }, half, { bytesPerRow: W * 2, rowsPerImage: 1 }, { width: W, height: 1, depthOrArrayLayers: 1 });
660
+ }
574
661
  createRenderPipeline(config) {
575
662
  const targets = config.fragmentTargets ?? (config.fragmentTarget ? [config.fragmentTarget] : undefined);
576
663
  return this.device.createRenderPipeline({
@@ -953,6 +1040,7 @@ export class Engine {
953
1040
  this.shadowMapDepthView = this.shadowMapTexture.createView();
954
1041
  // One-shot bake of Blender EEVEE's combined BRDF LUT (DFG + LTC packed rgba8unorm).
955
1042
  this.bakeBrdfLut();
1043
+ this.bakeFilmicLut();
956
1044
  // Now that shadow resources exist, create the main per-frame bind group
957
1045
  this.perFrameBindGroup = this.device.createBindGroup({
958
1046
  label: "main per-frame bind group",
@@ -1217,6 +1305,8 @@ export class Engine {
1217
1305
  // Aux mask/alpha texture — composite reads .g to reconstruct the alpha that
1218
1306
  // used to live in the HDR target before the rg11b10ufloat switch.
1219
1307
  { binding: 4, visibility: GPUShaderStage.FRAGMENT, texture: {} },
1308
+ // Filmic tone LUT (r16float, filterable) — sampled with the binding-2 sampler.
1309
+ { binding: 5, visibility: GPUShaderStage.FRAGMENT, texture: {} },
1220
1310
  ],
1221
1311
  });
1222
1312
  const compositeShader = this.device.createShaderModule({
@@ -1240,6 +1330,30 @@ export class Engine {
1240
1330
  });
1241
1331
  this.compositePipelineIdentity = makeCompositePipeline(false, "composite pipeline (gamma=1)");
1242
1332
  this.compositePipelineGamma = makeCompositePipeline(true, "composite pipeline (gamma!=1)");
1333
+ // GPU vertex-morph compute pipeline (shared by all models; per-model bind groups).
1334
+ // Bindings: 0-4 read-only storage (base pos, CSR rowStart/colMorph/colOffset, weights),
1335
+ // 5 read-write storage (vertex buffer), 6 uniform (params).
1336
+ const roStorage = { type: "read-only-storage" };
1337
+ this.morphComputeBindGroupLayout = this.device.createBindGroupLayout({
1338
+ label: "morph compute bind group layout",
1339
+ entries: [
1340
+ { binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: roStorage },
1341
+ { binding: 1, visibility: GPUShaderStage.COMPUTE, buffer: roStorage },
1342
+ { binding: 2, visibility: GPUShaderStage.COMPUTE, buffer: roStorage },
1343
+ { binding: 3, visibility: GPUShaderStage.COMPUTE, buffer: roStorage },
1344
+ { binding: 4, visibility: GPUShaderStage.COMPUTE, buffer: roStorage },
1345
+ { binding: 5, visibility: GPUShaderStage.COMPUTE, buffer: { type: "storage" } },
1346
+ { binding: 6, visibility: GPUShaderStage.COMPUTE, buffer: { type: "uniform" } },
1347
+ ],
1348
+ });
1349
+ this.morphComputePipeline = this.device.createComputePipeline({
1350
+ label: "morph compute pipeline",
1351
+ layout: this.device.createPipelineLayout({ bindGroupLayouts: [this.morphComputeBindGroupLayout] }),
1352
+ compute: {
1353
+ module: this.device.createShaderModule({ label: "morph compute shader", code: MORPH_COMPUTE_WGSL }),
1354
+ entryPoint: "cs",
1355
+ },
1356
+ });
1243
1357
  this.bloomPassDescriptor = {
1244
1358
  label: "bloom pass",
1245
1359
  colorAttachments: [
@@ -1529,6 +1643,7 @@ export class Engine {
1529
1643
  { binding: 2, resource: this.bloomSampler },
1530
1644
  { binding: 3, resource: { buffer: this.compositeUniformBuffer } },
1531
1645
  { binding: 4, resource: this.maskResolveView },
1646
+ { binding: 5, resource: this.filmicLutView },
1532
1647
  ],
1533
1648
  });
1534
1649
  }
@@ -2029,6 +2144,10 @@ export class Engine {
2029
2144
  setIKEnabled(enabled) {
2030
2145
  this.ikEnabled = enabled;
2031
2146
  }
2147
+ // Toggle the GPU vertex-morph path. Only affects models loaded afterwards.
2148
+ setGpuMorphsEnabled(enabled) {
2149
+ this.useGpuMorphs = enabled;
2150
+ }
2032
2151
  getIKEnabled() {
2033
2152
  return this.ikEnabled;
2034
2153
  }
@@ -2056,8 +2175,24 @@ export class Engine {
2056
2175
  updateInstances(deltaTime) {
2057
2176
  this.forEachInstance((inst) => {
2058
2177
  const verticesChanged = inst.model.update(deltaTime, this.ikEnabled);
2059
- if (verticesChanged)
2178
+ if (inst.gpuMorph) {
2179
+ // GPU path: on a weight change, upload effective weights (thresholding tiny values
2180
+ // to 0 to match the CPU skip) and flag the compute dispatch for this frame.
2181
+ if (inst.model.consumeMorphWeightsDirty()) {
2182
+ const eff = inst.model.getEffectiveMorphWeights();
2183
+ const wd = inst.gpuMorph.weightsData;
2184
+ const n = Math.min(wd.length, eff.length);
2185
+ for (let i = 0; i < n; i++) {
2186
+ const w = eff[i];
2187
+ wd[i] = w < 0.0001 ? 0 : w;
2188
+ }
2189
+ this.device.queue.writeBuffer(inst.gpuMorph.weightsBuffer, 0, wd);
2190
+ inst.gpuMorph.dispatchNeeded = true;
2191
+ }
2192
+ }
2193
+ else if (verticesChanged) {
2060
2194
  inst.vertexBufferNeedsUpdate = true;
2195
+ }
2061
2196
  if (inst.physics && this.physicsEnabled) {
2062
2197
  inst.physics.step(deltaTime, inst.model.getWorldMatrices(), inst.model.getBoneInverseBindMatrices());
2063
2198
  }
@@ -2066,12 +2201,48 @@ export class Engine {
2066
2201
  });
2067
2202
  }
2068
2203
  updateVertexBuffer(inst) {
2204
+ // GPU-morph models never CPU-upload the vertex buffer after load — the compute pass
2205
+ // owns the position slots. Ignore any stray dirty flag (e.g. from markVertexBufferDirty).
2206
+ if (inst.gpuMorph) {
2207
+ inst.vertexBufferNeedsUpdate = false;
2208
+ return;
2209
+ }
2069
2210
  const vertices = inst.model.getVertices();
2070
2211
  if (!vertices?.length)
2071
2212
  return;
2072
- this.device.queue.writeBuffer(inst.vertexBuffer, 0, vertices);
2213
+ // Vertex morphs touch only a subset of verts (typically the face), so upload just the
2214
+ // changed [minVert, maxVert] slice when the model can report one; null = full upload.
2215
+ const range = inst.model.consumeVertexUploadRange();
2216
+ if (range) {
2217
+ const STRIDE = 8; // floats per vertex (pos3 + normal3 + uv2)
2218
+ const firstFloat = range.minVert * STRIDE;
2219
+ const floatLen = (range.maxVert - range.minVert + 1) * STRIDE;
2220
+ const byteOffset = firstFloat * 4;
2221
+ this.device.queue.writeBuffer(inst.vertexBuffer, byteOffset, vertices.buffer, vertices.byteOffset + byteOffset, floatLen * 4);
2222
+ }
2223
+ else {
2224
+ this.device.queue.writeBuffer(inst.vertexBuffer, 0, vertices);
2225
+ }
2073
2226
  inst.vertexBufferNeedsUpdate = false;
2074
2227
  }
2228
+ // One compute pass covering every model whose morph weights changed this frame.
2229
+ dispatchMorphCompute(encoder) {
2230
+ let pass = null;
2231
+ for (const inst of this.modelInstances.values()) {
2232
+ const gm = inst.gpuMorph;
2233
+ if (!gm || !gm.dispatchNeeded)
2234
+ continue;
2235
+ if (!pass) {
2236
+ pass = encoder.beginComputePass({ label: "morph compute" });
2237
+ pass.setPipeline(this.morphComputePipeline);
2238
+ }
2239
+ pass.setBindGroup(0, gm.bindGroup);
2240
+ pass.dispatchWorkgroups(gm.workgroups);
2241
+ gm.dispatchNeeded = false;
2242
+ }
2243
+ if (pass)
2244
+ pass.end();
2245
+ }
2075
2246
  async setupModelInstance(name, model, basePath, assetReader) {
2076
2247
  const vertices = model.getVertices();
2077
2248
  const skinning = model.getSkinning();
@@ -2081,7 +2252,8 @@ export class Engine {
2081
2252
  const vertexBuffer = this.device.createBuffer({
2082
2253
  label: `${name}: vertex buffer`,
2083
2254
  size: vertices.byteLength,
2084
- usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
2255
+ // STORAGE so the morph compute pass can write morphed positions in place.
2256
+ usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE,
2085
2257
  });
2086
2258
  this.device.queue.writeBuffer(vertexBuffer, 0, vertices);
2087
2259
  const jointsBuffer = this.device.createBuffer({
@@ -2131,6 +2303,7 @@ export class Engine {
2131
2303
  entries: [{ binding: 0, resource: { buffer: skinMatrixBuffer } }],
2132
2304
  });
2133
2305
  const gpuBuffers = [vertexBuffer, indexBuffer, jointsBuffer, weightsBuffer, skinMatrixBuffer];
2306
+ const gpuMorph = this.createGpuMorph(name, model, vertexBuffer, gpuBuffers);
2134
2307
  const inst = {
2135
2308
  name,
2136
2309
  model,
@@ -2153,10 +2326,71 @@ export class Engine {
2153
2326
  materialPresets: undefined,
2154
2327
  physics,
2155
2328
  vertexBufferNeedsUpdate: false,
2329
+ gpuMorph,
2156
2330
  };
2157
2331
  await this.setupMaterialsForInstance(inst);
2158
2332
  this.modelInstances.set(name, inst);
2159
2333
  }
2334
+ // Build the per-model GPU vertex-morph state. Returns null (and leaves the model on the
2335
+ // CPU morph path) when the model has no vertex morphs. Created buffers are pushed into
2336
+ // gpuBuffers so they're released with the instance.
2337
+ createGpuMorph(name, model, vertexBuffer, gpuBuffers) {
2338
+ if (!this.useGpuMorphs)
2339
+ return null;
2340
+ const data = model.buildMorphComputeData();
2341
+ if (!data)
2342
+ return null;
2343
+ const RO = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST;
2344
+ const mkStorage = (label, arr) => {
2345
+ const buf = this.device.createBuffer({
2346
+ label: `${name}: morph ${label}`,
2347
+ size: Math.max(arr.byteLength, 4),
2348
+ usage: RO,
2349
+ });
2350
+ this.device.queue.writeBuffer(buf, 0, arr);
2351
+ gpuBuffers.push(buf);
2352
+ return buf;
2353
+ };
2354
+ const baseBuf = mkStorage("basePositions", data.basePositions);
2355
+ const rowBuf = mkStorage("rowStart", data.rowStart);
2356
+ const colMorphBuf = mkStorage("colMorph", data.colMorph);
2357
+ const colOffsetBuf = mkStorage("colOffset", data.colOffset);
2358
+ // Weights are zero-initialized by WebGPU; the first weight change uploads real values.
2359
+ const weightsBuffer = this.device.createBuffer({
2360
+ label: `${name}: morph weights`,
2361
+ size: Math.max(data.morphCount * 4, 4),
2362
+ usage: RO,
2363
+ });
2364
+ gpuBuffers.push(weightsBuffer);
2365
+ const paramsBuffer = this.device.createBuffer({
2366
+ label: `${name}: morph params`,
2367
+ size: 16,
2368
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
2369
+ });
2370
+ this.device.queue.writeBuffer(paramsBuffer, 0, new Uint32Array([data.vertexCount, 0, 0, 0]));
2371
+ gpuBuffers.push(paramsBuffer);
2372
+ const bindGroup = this.device.createBindGroup({
2373
+ label: `${name}: morph compute bind group`,
2374
+ layout: this.morphComputeBindGroupLayout,
2375
+ entries: [
2376
+ { binding: 0, resource: { buffer: baseBuf } },
2377
+ { binding: 1, resource: { buffer: rowBuf } },
2378
+ { binding: 2, resource: { buffer: colMorphBuf } },
2379
+ { binding: 3, resource: { buffer: colOffsetBuf } },
2380
+ { binding: 4, resource: { buffer: weightsBuffer } },
2381
+ { binding: 5, resource: { buffer: vertexBuffer } },
2382
+ { binding: 6, resource: { buffer: paramsBuffer } },
2383
+ ],
2384
+ });
2385
+ model.enableGpuMorphs();
2386
+ return {
2387
+ bindGroup,
2388
+ weightsBuffer,
2389
+ weightsData: new Float32Array(data.morphCount),
2390
+ workgroups: Math.ceil(data.vertexCount / 64),
2391
+ dispatchNeeded: false, // vertex buffer already holds base; dispatch on first weight change
2392
+ };
2393
+ }
2160
2394
  createGroundGeometry(width = 100, height = 100) {
2161
2395
  const halfWidth = width / 2;
2162
2396
  const halfHeight = height / 2;
@@ -2848,6 +3082,10 @@ export class Engine {
2848
3082
  this.updateCameraUniforms();
2849
3083
  this.updateShadowLightVP();
2850
3084
  const encoder = this.device.createCommandEncoder();
3085
+ // GPU vertex morphs: write morphed positions into vertex buffers before any pass reads
3086
+ // them. WebGPU inserts the storage→vertex barrier between this pass and the render passes.
3087
+ if (hasModels)
3088
+ this.dispatchMorphCompute(encoder);
2851
3089
  if (hasModels) {
2852
3090
  const sp = encoder.beginRenderPass({
2853
3091
  colorAttachments: [],
@@ -2928,7 +3166,9 @@ export class Engine {
2928
3166
  const dpr = window.devicePixelRatio || 1;
2929
3167
  this.resolvePickResult(pick.x / dpr, pick.y / dpr);
2930
3168
  }
2931
- this.updateStats(performance.now() - currentTime);
3169
+ // Feed the true vsync-to-vsync interval (deltaTime, computed at frame start), not the
3170
+ // CPU time spent in render() — that's what actually reflects perceived smoothness.
3171
+ this.updateStats(deltaTime * 1000);
2932
3172
  }
2933
3173
  drawInstanceShadow(sp, inst) {
2934
3174
  sp.setBindGroup(0, inst.shadowBindGroup);
@@ -3065,27 +3305,48 @@ export class Engine {
3065
3305
  this.device.queue.writeBuffer(inst.skinMatrixBuffer, 0, skinMatrices.buffer, skinMatrices.byteOffset, skinMatrices.byteLength);
3066
3306
  });
3067
3307
  }
3068
- updateStats(frameTime) {
3069
- // Simplified frame time tracking - rolling average with fixed window
3070
- const maxSamples = 60;
3071
- this.frameTimeSum += frameTime;
3072
- this.frameTimeCount++;
3073
- if (this.frameTimeCount > maxSamples) {
3074
- // Maintain rolling window by subtracting oldest sample estimate
3075
- const avg = this.frameTimeSum / maxSamples;
3076
- this.frameTimeSum -= avg;
3077
- this.frameTimeCount = maxSamples;
3078
- }
3079
- this.stats.frameTime = Math.round((this.frameTimeSum / this.frameTimeCount) * 100) / 100;
3080
- // FPS tracking
3308
+ // frameIntervalMs is the true vsync-to-vsync frame interval (render dt), NOT the CPU
3309
+ // time spent in render() the latter misses GPU cost and pacing, so it can read fast
3310
+ // while the scene stutters. Metrics are derived from a ring buffer of these intervals.
3311
+ updateStats(frameIntervalMs) {
3312
+ const w = Engine.STATS_WINDOW;
3313
+ this.frameIntervals[this.frameIntervalWrite] = frameIntervalMs;
3314
+ this.frameIntervalWrite = (this.frameIntervalWrite + 1) % w;
3315
+ if (this.frameIntervalFilled < w)
3316
+ this.frameIntervalFilled++;
3081
3317
  const now = performance.now();
3082
- this.framesSinceLastUpdate++;
3083
- const elapsed = now - this.lastFpsUpdate;
3084
- if (elapsed >= 1000) {
3085
- this.stats.fps = Math.round((this.framesSinceLastUpdate / elapsed) * 1000);
3086
- this.framesSinceLastUpdate = 0;
3087
- this.lastFpsUpdate = now;
3318
+ if (now - this.lastStatsCompute < Engine.STATS_REFRESH_MS)
3319
+ return;
3320
+ this.lastStatsCompute = now;
3321
+ const n = this.frameIntervalFilled;
3322
+ if (n === 0)
3323
+ return;
3324
+ let sum = 0;
3325
+ let max = 0;
3326
+ for (let i = 0; i < n; i++) {
3327
+ const v = this.frameIntervals[i];
3328
+ sum += v;
3329
+ if (v > max)
3330
+ max = v;
3331
+ }
3332
+ const mean = sum / n;
3333
+ let varSum = 0;
3334
+ for (let i = 0; i < n; i++) {
3335
+ const d = this.frameIntervals[i] - mean;
3336
+ varSum += d * d;
3088
3337
  }
3338
+ const stddev = Math.sqrt(varSum / n);
3339
+ // 99th-percentile frame interval → "1% low" fps. TypedArray.sort is numeric.
3340
+ const sorted = this.frameIntervals.slice(0, n).sort();
3341
+ const p99 = sorted[Math.min(n - 1, Math.floor(n * 0.99))];
3342
+ // fps from the MEAN interval is inherently bounded by the real refresh (a vsync-locked
3343
+ // interval can't average below the refresh period), so this never reads above the
3344
+ // monitor rate — fixing the old frame-count/window off-by-one (61 on 60Hz, 241 on 240Hz).
3345
+ this.stats.fps = mean > 0 ? Math.round(1000 / mean) : 0;
3346
+ this.stats.frameTime = Math.round(mean * 100) / 100;
3347
+ this.stats.frameTimeMax = Math.round(max * 100) / 100;
3348
+ this.stats.fps1PercentLow = p99 > 0 ? Math.round(1000 / p99) : 0;
3349
+ this.stats.jitter = Math.round(stddev * 100) / 100;
3089
3350
  }
3090
3351
  }
3091
3352
  Engine.instance = null;
@@ -3111,4 +3372,10 @@ Engine.STENCIL_EYE_VALUE = 1;
3111
3372
  * rg8unorm at 4× MSAA is 8 bytes/texel — still fits Apple TBDR tile memory comfortably. */
3112
3373
  Engine.BLOOM_MASK_FORMAT = "rg8unorm";
3113
3374
  Engine.BLOOM_MAX_LEVELS = 5;
3375
+ // Width of the baked Filmic tone LUT (composite.ts FILMIC_LUT_W must match).
3376
+ Engine.FILMIC_LUT_WIDTH = 256;
3114
3377
  Engine.SHADOW_MAP_SIZE = 2048;
3378
+ // Smoothness metrics are computed over a ring buffer of true frame intervals
3379
+ // (vsync-to-vsync), recomputed at STATS_REFRESH_MS so the readout doesn't flicker.
3380
+ Engine.STATS_WINDOW = 120;
3381
+ Engine.STATS_REFRESH_MS = 500;
@@ -1 +1 @@
1
- {"version":3,"file":"ik-solver.d.ts","sourceRoot":"","sources":["../src/ik-solver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,IAAI,EAAU,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAG7D,MAAM,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;AAkF/E,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAS;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAExD,MAAM,CAAC,KAAK,CACV,SAAS,EAAE,QAAQ,EAAE,EACrB,KAAK,EAAE,IAAI,EAAE,EACb,cAAc,EAAE,IAAI,EAAE,EACtB,iBAAiB,EAAE,IAAI,EAAE,EACzB,aAAa,EAAE,IAAI,EAAE,EACrB,WAAW,EAAE,WAAW,EAAE,EAC1B,iBAAiB,CAAC,EAAE,mBAAmB,GACtC,IAAI;IAMP,OAAO,CAAC,MAAM,CAAC,OAAO;IAoFtB,OAAO,CAAC,MAAM,CAAC,UAAU;IA4HzB,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAOjC;IAED,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAsCrC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAMnC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAyB3C,OAAO,CAAC,MAAM,CAAC,gCAAgC;IAkB/C,OAAO,CAAC,MAAM,CAAC,iBAAiB;CA2CjC"}
1
+ {"version":3,"file":"ik-solver.d.ts","sourceRoot":"","sources":["../src/ik-solver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,IAAI,EAAU,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAG7D,MAAM,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;AAwF/E,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAS;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAExD,MAAM,CAAC,KAAK,CACV,SAAS,EAAE,QAAQ,EAAE,EACrB,KAAK,EAAE,IAAI,EAAE,EACb,cAAc,EAAE,IAAI,EAAE,EACtB,iBAAiB,EAAE,IAAI,EAAE,EACzB,aAAa,EAAE,IAAI,EAAE,EACrB,WAAW,EAAE,WAAW,EAAE,EAC1B,iBAAiB,CAAC,EAAE,mBAAmB,GACtC,IAAI;IAMP,OAAO,CAAC,MAAM,CAAC,OAAO;IAqFtB,OAAO,CAAC,MAAM,CAAC,UAAU;IA4HzB,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAOjC;IAED,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAsCrC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAMnC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAyB3C,OAAO,CAAC,MAAM,CAAC,gCAAgC;IAkB/C,OAAO,CAAC,MAAM,CAAC,iBAAiB;CA2CjC"}